cognova 0.2.8 → 0.2.10

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 (199) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{CH_jROT9.js → 0NJ3PaRM.js} +1 -1
  3. package/.output/public/_nuxt/{C075hYlX.js → 0yk-pS3R.js} +2 -2
  4. package/.output/public/_nuxt/{CVYcsqmL.js → 10_wwHSz.js} +1 -1
  5. package/.output/public/_nuxt/{BUC36BHp.js → 1zUTf4AP.js} +1 -1
  6. package/.output/public/_nuxt/{njnzCNrH.js → 2dNDtTiv.js} +3 -3
  7. package/.output/public/_nuxt/{B8TQvzYX.js → 2nOqGUPr.js} +1 -1
  8. package/.output/public/_nuxt/{ijmD2cEW.js → 3jQMk_5H.js} +1 -1
  9. package/.output/public/_nuxt/{D4X6ONPF.js → 4K03TkGA.js} +1 -1
  10. package/.output/public/_nuxt/{C3tximD1.js → 6boMs_nF.js} +1 -1
  11. package/.output/public/_nuxt/{Drxf7nJz.js → 7oCGSglN.js} +1 -1
  12. package/.output/public/_nuxt/{Dt5mOzXj.js → 8q5NepGW.js} +1 -1
  13. package/.output/public/_nuxt/{GYf-vnR6.js → B93pdGAW.js} +1 -1
  14. package/.output/public/_nuxt/{BZBNJD7U.js → BA_pRWwX.js} +1 -1
  15. package/.output/public/_nuxt/{eE8TtXgC.js → BDyn4ApB.js} +3 -3
  16. package/.output/public/_nuxt/{0dqQoCHY.js → BGgwYWjH.js} +1 -1
  17. package/.output/public/_nuxt/{BrOKokPO.js → BH0QDWEm.js} +1 -1
  18. package/.output/public/_nuxt/{B5SnZL2l.js → BHtY0l0l.js} +1 -1
  19. package/.output/public/_nuxt/{ImPsUDiH.js → BIXrSYwR.js} +1 -1
  20. package/.output/public/_nuxt/BK8S2ony.js +1 -0
  21. package/.output/public/_nuxt/{Bkc1Hpcf.js → BKXg-alD.js} +1 -1
  22. package/.output/public/_nuxt/{BahXyh-A.js → BLnYhy_t.js} +1 -1
  23. package/.output/public/_nuxt/{Bhhg7oSf.js → BR8bKz8h.js} +1 -1
  24. package/.output/public/_nuxt/{D2kQkOaG.js → BS2ZNXI1.js} +1 -1
  25. package/.output/public/_nuxt/{BLm0UviR.js → BUghTae1.js} +1 -1
  26. package/.output/public/_nuxt/{D4_89MZm.js → BXuWCWsJ.js} +1 -1
  27. package/.output/public/_nuxt/{LQNRVThr.js → BYHCP8x7.js} +1 -1
  28. package/.output/public/_nuxt/{BYtVdUIW.js → BZrSPX0S.js} +1 -1
  29. package/.output/public/_nuxt/{U3f6dy8i.js → B_wilgcd.js} +1 -1
  30. package/.output/public/_nuxt/BaZwjF8o.js +1 -0
  31. package/.output/public/_nuxt/{BefOhWHD.js → Bciqk4dX.js} +1 -1
  32. package/.output/public/_nuxt/{CewcVxDS.js → Beom-INj.js} +1 -1
  33. package/.output/public/_nuxt/{BlsIfvSf.js → BfcLZ_fC.js} +1 -1
  34. package/.output/public/_nuxt/{dB7G4iIC.js → Bk6JUtIo.js} +1 -1
  35. package/.output/public/_nuxt/BkfI94R8.js +1 -0
  36. package/.output/public/_nuxt/{DqzomZoo.js → BmOtR1wX.js} +1 -1
  37. package/.output/public/_nuxt/{4XnyUc7C.js → BmVLxnDU.js} +1 -1
  38. package/.output/public/_nuxt/{DtJnWtpL.js → BtHQ1T0f.js} +1 -1
  39. package/.output/public/_nuxt/{DcbbfwCe.js → ByYh0uRg.js} +1 -1
  40. package/.output/public/_nuxt/{CbvNJVrk.js → C27WoGNZ.js} +1 -1
  41. package/.output/public/_nuxt/{CY7f553E.js → C2FxZbO_.js} +1 -1
  42. package/.output/public/_nuxt/{zO9MgHj2.js → C2vq6Te8.js} +1 -1
  43. package/.output/public/_nuxt/{BXtZVbmx.js → C39dQ88F.js} +1 -1
  44. package/.output/public/_nuxt/{DmDPSvxi.js → C3NST0BU.js} +1 -1
  45. package/.output/public/_nuxt/{nHSiDk8N.js → C4mwL7SE.js} +1 -1
  46. package/.output/public/_nuxt/{BBDxhFYY.js → C5R5QaCA.js} +1 -1
  47. package/.output/public/_nuxt/{D79lbuWG.js → C6qKcgOY.js} +1 -1
  48. package/.output/public/_nuxt/{C-HCArYP.js → C71_a1IX.js} +1 -1
  49. package/.output/public/_nuxt/{CSjOaBKu.js → C9WIgRRL.js} +1 -1
  50. package/.output/public/_nuxt/{DmOS3vFH.js → CBTkrk2M.js} +1 -1
  51. package/.output/public/_nuxt/CEnSeCqn.js +1 -0
  52. package/.output/public/_nuxt/{CAfyXyeo.js → CKxSHyww.js} +1 -1
  53. package/.output/public/_nuxt/{D4Cizi4y.js → CLfF6dSn.js} +1 -1
  54. package/.output/public/_nuxt/{C7qhmmZh.js → CPutXj8l.js} +1 -1
  55. package/.output/public/_nuxt/{BCCYopTB.js → CQqCBrXj.js} +1 -1
  56. package/.output/public/_nuxt/{D-Ge96eV.js → CSKJ-Ahh.js} +1 -1
  57. package/.output/public/_nuxt/{B2Xfh7am.js → CTCcEJU3.js} +1 -1
  58. package/.output/public/_nuxt/{BnJ-6YDw.js → CVFwOzbl.js} +1 -1
  59. package/.output/public/_nuxt/{C21BjagS.js → CVdCqaby.js} +1 -1
  60. package/.output/public/_nuxt/{2QHXgMyi.js → CVqlefTY.js} +1 -1
  61. package/.output/public/_nuxt/CWyMCJQH.js +1 -0
  62. package/.output/public/_nuxt/{B6-U3KqJ.js → CY-QVcA5.js} +2 -2
  63. package/.output/public/_nuxt/{Cr0NfhPB.js → CY-cjAwJ.js} +1 -1
  64. package/.output/public/_nuxt/{Bwn-CRYH.js → CYPO5o_C.js} +1 -1
  65. package/.output/public/_nuxt/{B-AlyT2D.js → CZRnNmU8.js} +1 -1
  66. package/.output/public/_nuxt/{DwIYtFfA.js → CZVzFlpI.js} +1 -1
  67. package/.output/public/_nuxt/{BkO884Ds.js → CZoEPC_Q.js} +3 -3
  68. package/.output/public/_nuxt/{BJUff9Ku.js → Cc-2ziaZ.js} +1 -1
  69. package/.output/public/_nuxt/{BLwctszt.js → ChcO9s3o.js} +1 -1
  70. package/.output/public/_nuxt/{DX_9SfFb.js → Cl-LOSDV.js} +1 -1
  71. package/.output/public/_nuxt/{CSHcfejh.js → CobqYwkp.js} +1 -1
  72. package/.output/public/_nuxt/{B0xuHXvN.js → CqNwHCpo.js} +1 -1
  73. package/.output/public/_nuxt/{DMb_1D81.js → CuxrHsu-.js} +1 -1
  74. package/.output/public/_nuxt/{GGcn5KPW.js → CwPdIZ9J.js} +1 -1
  75. package/.output/public/_nuxt/{D7pKT3IW.js → D0ifH682.js} +1 -1
  76. package/.output/public/_nuxt/{KEeoKtq_.js → D3AZaldL.js} +1 -1
  77. package/.output/public/_nuxt/{BdxP21ep.js → D4UJwDQJ.js} +1 -1
  78. package/.output/public/_nuxt/{C-Ygk9x5.js → D5jZq8b3.js} +1 -1
  79. package/.output/public/_nuxt/{B6G3NLfW.js → D5q8SnqE.js} +1 -1
  80. package/.output/public/_nuxt/{CDkyQ1eQ.js → D8M722pn.js} +1 -1
  81. package/.output/public/_nuxt/{BjnQ1pI1.js → D8lwrAYS.js} +1 -1
  82. package/.output/public/_nuxt/{C13FKhqK.js → D9nmzBAw.js} +1 -1
  83. package/.output/public/_nuxt/{ClGn48iq.js → DC4idAGt.js} +1 -1
  84. package/.output/public/_nuxt/{vES4kgx7.js → DEd2xVbS.js} +1 -1
  85. package/.output/public/_nuxt/{CClsKJ9A.js → DH4YkDAi.js} +1 -1
  86. package/.output/public/_nuxt/{D-5A6cMB.js → DJTCT0bl.js} +1 -1
  87. package/.output/public/_nuxt/{D_O7SlHm.js → DNP5E1bC.js} +1 -1
  88. package/.output/public/_nuxt/{BF3tVKtX.js → DO9SFIh1.js} +1 -1
  89. package/.output/public/_nuxt/DPklr_tJ.js +2 -0
  90. package/.output/public/_nuxt/{mfAEx0Kz.js → DQM4eBdt.js} +1 -1
  91. package/.output/public/_nuxt/{cPPThz84.js → DQh6I9z9.js} +1 -1
  92. package/.output/public/_nuxt/{CXTrUfQ5.js → DS2wStH1.js} +1 -1
  93. package/.output/public/_nuxt/{CYQP4zpi.js → DTAStixR.js} +1 -1
  94. package/.output/public/_nuxt/{CEz288t8.js → DTGenhcA.js} +1 -1
  95. package/.output/public/_nuxt/{B9zgEO8N.js → DUAAXJ6Q.js} +1 -1
  96. package/.output/public/_nuxt/{CzAZpALW.js → DUVzIl3o.js} +1 -1
  97. package/.output/public/_nuxt/{DJt7Rogf.js → DXdwpJ-I.js} +1 -1
  98. package/.output/public/_nuxt/{MWUW1sIF.js → DY3uK7wM.js} +1 -1
  99. package/.output/public/_nuxt/{CfY_bsV0.js → DYbZBZet.js} +1 -1
  100. package/.output/public/_nuxt/{DZEuR9ms.js → D_4LPm1U.js} +1 -1
  101. package/.output/public/_nuxt/{CrmE-JGu.js → Db4KMnt8.js} +1 -1
  102. package/.output/public/_nuxt/{BwC62XRN.js → DcJbYLTp.js} +1 -1
  103. package/.output/public/_nuxt/{C6sX7TYf.js → DfF81NlA.js} +1 -1
  104. package/.output/public/_nuxt/{BHn8tRjg.js → DhI5cA_n.js} +1 -1
  105. package/.output/public/_nuxt/{CQ3tAemj.js → DhuOKJda.js} +1 -1
  106. package/.output/public/_nuxt/{D887s9k9.js → Di-Nc75e.js} +1 -1
  107. package/.output/public/_nuxt/{D_obX2Hj.js → Djs0Tlpa.js} +1 -1
  108. package/.output/public/_nuxt/DmmdPt_5.js +1 -0
  109. package/.output/public/_nuxt/{DKKY8zWm.js → Dn5a-guE.js} +1 -1
  110. package/.output/public/_nuxt/{BvstjGHC.js → DtjjnHnt.js} +1 -1
  111. package/.output/public/_nuxt/{Dbfwn2zk.js → DuvzM-P1.js} +1 -1
  112. package/.output/public/_nuxt/{BxShcW0K.js → DwY7rCd_.js} +1 -1
  113. package/.output/public/_nuxt/{BmaHzvZM.js → Dya5oK8u.js} +1 -1
  114. package/.output/public/_nuxt/{CO3hceDE.js → DzA58_Lm.js} +1 -1
  115. package/.output/public/_nuxt/{CF33v_m5.js → DzGy77Vr.js} +1 -1
  116. package/.output/public/_nuxt/{DmlZSBjF.js → E3rXPwU8.js} +1 -1
  117. package/.output/public/_nuxt/{CEDw8osP.js → EgKnQnf-.js} +1 -1
  118. package/.output/public/_nuxt/{it8syoZI.js → GtEM7xVU.js} +1 -1
  119. package/.output/public/_nuxt/{DLUvsixu.js → H6JbrRBU.js} +1 -1
  120. package/.output/public/_nuxt/{BE1CVWts.js → ILEvizzp.js} +1 -1
  121. package/.output/public/_nuxt/{BSA-U0so.js → JX1oqJI9.js} +1 -1
  122. package/.output/public/_nuxt/{yJ9vRvHj.js → JbHa4oXq.js} +1 -1
  123. package/.output/public/_nuxt/{zXvvpsZj.js → Kw0zy3FG.js} +1 -1
  124. package/.output/public/_nuxt/{C6FFW_cO.js → N5XtbYVD.js} +1 -1
  125. package/.output/public/_nuxt/{D04CyXmf.js → PP_4ebzl.js} +1 -1
  126. package/.output/public/_nuxt/{6QDVg5TO.js → SrncdpaW.js} +1 -1
  127. package/.output/public/_nuxt/{36ZHqDPo.js → U1MWjQMi.js} +1 -1
  128. package/.output/public/_nuxt/{mT7Mt2d7.js → Um1vPiAz.js} +1 -1
  129. package/.output/public/_nuxt/{CqFcWBkW.js → XCjS70z4.js} +1 -1
  130. package/.output/public/_nuxt/{C24so3m7.js → YX8avsvq.js} +2 -2
  131. package/.output/public/_nuxt/{DaBSQDif.js → _cy8R3nk.js} +1 -1
  132. package/.output/public/_nuxt/{D9aYkNhQ.js → apYB9dr5.js} +1 -1
  133. package/.output/public/_nuxt/builds/latest.json +1 -1
  134. package/.output/public/_nuxt/builds/meta/def74b99-d70c-4f30-aa29-70248cbeac7d.json +1 -0
  135. package/.output/public/_nuxt/entry.NKPfH2kE.css +1 -0
  136. package/.output/public/_nuxt/{BqTdsCnW.js → fbyIeNkc.js} +1 -1
  137. package/.output/public/_nuxt/{-2AbaFNH.js → g5MjDvm5.js} +1 -1
  138. package/.output/public/_nuxt/{C1tCdK-M.js → gTrVszwd.js} +1 -1
  139. package/.output/public/_nuxt/{BVEFmI4I.js → ixlNW2So.js} +1 -1
  140. package/.output/public/_nuxt/{DtyyytRx.js → nnQqD5pb.js} +1 -1
  141. package/.output/public/_nuxt/{pHCJ6lhw.js → rfGRTJJW.js} +1 -1
  142. package/.output/public/_nuxt/{Buf1PAiO.js → t8aDAkZ5.js} +1 -1
  143. package/.output/public/_nuxt/{BmdlymIW.js → vIOxcXKR.js} +1 -1
  144. package/.output/public/_nuxt/{Cve4psva.js → vScW1Zgm.js} +1 -1
  145. package/.output/public/_nuxt/{SfaNtyKS.js → wO6z2ugJ.js} +1 -1
  146. package/.output/public/_nuxt/{BhYoxmLV.js → x6FRJ5ac.js} +1 -1
  147. package/.output/public/_nuxt/{Pn7VD6uQ.js → zq-a1TeT.js} +1 -1
  148. package/.output/server/chunks/build/{chat-CZMiB68R.mjs → chat-CR3JIVEq.mjs} +65 -11
  149. package/.output/server/chunks/build/chat-CR3JIVEq.mjs.map +1 -0
  150. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  151. package/.output/server/chunks/build/server.mjs +3 -3
  152. package/.output/server/chunks/build/{settings-ByUXa46k.mjs → settings-B2KXoGcz.mjs} +213 -26
  153. package/.output/server/chunks/build/settings-B2KXoGcz.mjs.map +1 -0
  154. package/.output/server/chunks/build/styles.mjs +2 -2
  155. package/.output/server/chunks/build/{usage-CSrBh4Or.mjs → usage-BHdQZbfI.mjs} +9 -5
  156. package/.output/server/chunks/build/{usage-CSrBh4Or.mjs.map → usage-BHdQZbfI.mjs.map} +1 -1
  157. package/.output/server/chunks/nitro/nitro.mjs +1161 -891
  158. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  159. package/.output/server/chunks/routes/_ws/chat.mjs +2 -1
  160. package/.output/server/chunks/routes/_ws/chat.mjs.map +1 -1
  161. package/.output/server/chunks/routes/api/conversations/_id_.delete.mjs +4 -1
  162. package/.output/server/chunks/routes/api/conversations/_id_.delete.mjs.map +1 -1
  163. package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
  164. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
  165. package/.output/server/chunks/routes/api/usage/stats.get.mjs +2 -0
  166. package/.output/server/chunks/routes/api/usage/stats.get.mjs.map +1 -1
  167. package/.output/server/package.json +1 -1
  168. package/app/components/chat/ConversationList.vue +7 -1
  169. package/app/components/chat/MessageBubble.vue +45 -1
  170. package/app/components/usage/UsageRecordsTable.vue +4 -2
  171. package/app/components/usage/UsageSourceDonut.client.vue +4 -2
  172. package/app/components/usage/UsageTopConsumers.vue +4 -2
  173. package/app/composables/useChat.ts +3 -0
  174. package/app/pages/settings.vue +148 -9
  175. package/package.json +1 -1
  176. package/server/api/conversations/[id].delete.ts +9 -0
  177. package/server/api/conversations/index.get.ts +2 -1
  178. package/server/api/usage/stats.get.ts +2 -0
  179. package/server/bridge/adapters/telegram.ts +83 -8
  180. package/server/bridge/responder.ts +248 -0
  181. package/server/bridge/router.ts +6 -4
  182. package/server/db/schema.ts +3 -1
  183. package/server/drizzle/migrations/0015_great_mephistopheles.sql +2 -0
  184. package/server/drizzle/migrations/meta/0015_snapshot.json +1972 -0
  185. package/server/drizzle/migrations/meta/_journal.json +7 -0
  186. package/server/routes/_ws/chat.ts +2 -1
  187. package/server/utils/log-token-usage.ts +1 -1
  188. package/shared/types/index.ts +6 -0
  189. package/.output/public/_nuxt/BIo-9u_O.js +0 -1
  190. package/.output/public/_nuxt/BMs0mHEp.js +0 -1
  191. package/.output/public/_nuxt/BwyXWqBY.js +0 -1
  192. package/.output/public/_nuxt/CE9_ECxx.js +0 -1
  193. package/.output/public/_nuxt/DmcMCO8x.js +0 -1
  194. package/.output/public/_nuxt/JReYPlwF.js +0 -2
  195. package/.output/public/_nuxt/builds/meta/410e449d-9fe8-43a0-ae07-80797693b9b8.json +0 -1
  196. package/.output/public/_nuxt/entry._7ZkP07A.css +0 -1
  197. package/.output/public/_nuxt/iBaivqi8.js +0 -1
  198. package/.output/server/chunks/build/chat-CZMiB68R.mjs.map +0 -1
  199. package/.output/server/chunks/build/settings-ByUXa46k.mjs.map +0 -1
@@ -563,7 +563,7 @@ const _routes = [
563
563
  name: "chat",
564
564
  path: "/chat",
565
565
  meta: { ...__nuxt_page_meta$f || {}, ...{ "middleware": "auth" } },
566
- component: () => import('./chat-CZMiB68R.mjs')
566
+ component: () => import('./chat-CR3JIVEq.mjs')
567
567
  },
568
568
  {
569
569
  name: "docs",
@@ -599,7 +599,7 @@ const _routes = [
599
599
  name: "usage",
600
600
  path: "/usage",
601
601
  meta: { ...__nuxt_page_meta$9 || {}, ...{ "middleware": "auth" } },
602
- component: () => import('./usage-CSrBh4Or.mjs')
602
+ component: () => import('./usage-BHdQZbfI.mjs')
603
603
  },
604
604
  {
605
605
  name: "memories",
@@ -611,7 +611,7 @@ const _routes = [
611
611
  name: "settings",
612
612
  path: "/settings",
613
613
  meta: { ...__nuxt_page_meta$7 || {}, ...{ "middleware": "auth" } },
614
- component: () => import('./settings-ByUXa46k.mjs')
614
+ component: () => import('./settings-B2KXoGcz.mjs')
615
615
  },
616
616
  {
617
617
  name: "dashboard",
@@ -5,13 +5,13 @@ import { _ as _sfc_main$a } from './Tabs-B6vgKDY9.mjs';
5
5
  import { _ as _sfc_main$6 } from './Form-X6hlUv6q.mjs';
6
6
  import { _ as _sfc_main$7 } from './FormField-Caux_FCv.mjs';
7
7
  import { _ as _sfc_main$8 } from './Input-CV2hlBHo.mjs';
8
- import { _ as _sfc_main$e } from './Separator-CYbxFNTe.mjs';
9
- import { _ as _sfc_main$c } from './Table-DCwTlhCj.mjs';
8
+ import { _ as _sfc_main$b } from './Separator-CYbxFNTe.mjs';
9
+ import { _ as _sfc_main$e } from './Table-DCwTlhCj.mjs';
10
10
  import { _ as _sfc_main$4 } from './Skeleton-DZqsQzFi.mjs';
11
- import { _ as _sfc_main$b } from './Switch-GWdksmY6.mjs';
11
+ import { _ as _sfc_main$c } from './Switch-GWdksmY6.mjs';
12
12
  import { _ as _sfc_main$5 } from './Modal-Z_SoWhh-.mjs';
13
13
  import { _ as _sfc_main$9 } from './Select-BB1oLrCD.mjs';
14
- import { defineComponent, reactive, ref, watch, mergeProps, withCtx, createVNode, unref, isRef, createTextVNode, toDisplayString, createBlock, openBlock, Fragment, renderList, createCommentVNode, withModifiers, useSSRContext } from 'vue';
14
+ import { defineComponent, reactive, ref, watch, mergeProps, withCtx, createVNode, unref, isRef, createTextVNode, toDisplayString, createBlock, createCommentVNode, openBlock, Fragment, renderList, withModifiers, useSSRContext } from 'vue';
15
15
  import { ssrRenderComponent, ssrInterpolate, ssrRenderList, ssrIncludeBooleanAttr } from 'vue/server-renderer';
16
16
  import { T as defaultNotificationPreferences } from '../nitro/nitro.mjs';
17
17
  import { u as useAuth } from './useAuth-rW9toE_m.mjs';
@@ -234,6 +234,36 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
234
234
  year: "numeric"
235
235
  });
236
236
  }
237
+ const appUrl = ref("");
238
+ const appUrlSaving = ref(false);
239
+ async function saveAppUrl() {
240
+ appUrlSaving.value = true;
241
+ try {
242
+ if (appUrl.value) {
243
+ const exists = secretsData.value.some((s) => s.key === "APP_URL");
244
+ if (exists) {
245
+ await $fetch("/api/secrets/APP_URL", {
246
+ method: "PUT",
247
+ body: { value: appUrl.value, description: "Public URL for webhooks and auth callbacks" }
248
+ });
249
+ } else {
250
+ await $fetch("/api/secrets", {
251
+ method: "POST",
252
+ body: { key: "APP_URL", value: appUrl.value, description: "Public URL for webhooks and auth callbacks" }
253
+ });
254
+ }
255
+ } else {
256
+ const exists = secretsData.value.some((s) => s.key === "APP_URL");
257
+ if (exists)
258
+ await $fetch("/api/secrets/APP_URL", { method: "DELETE" });
259
+ }
260
+ toast.add({ title: "Public URL saved", description: "Restart running integrations for changes to take effect.", color: "success" });
261
+ await fetchSecrets();
262
+ } catch {
263
+ toast.add({ title: "Failed to save URL", color: "error" });
264
+ }
265
+ appUrlSaving.value = false;
266
+ }
237
267
  const notifPrefs = ref({ ...defaultNotificationPreferences });
238
268
  const notifLoading = ref(false);
239
269
  const notifSaving = ref(false);
@@ -339,12 +369,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
339
369
  google: "Google Suite",
340
370
  email: "Work Email"
341
371
  };
342
- const platformSecretHints = {
343
- telegram: "TELEGRAM_BOT_TOKEN",
344
- discord: "DISCORD_BOT_TOKEN",
345
- imessage: null,
346
- google: null,
347
- email: null
372
+ const platformRequiredSecrets = {
373
+ telegram: ["TELEGRAM_BOT_TOKEN"],
374
+ discord: ["DISCORD_BOT_TOKEN"],
375
+ imessage: [],
376
+ google: [],
377
+ email: []
348
378
  };
349
379
  const platformOptions = [
350
380
  { value: "telegram", label: "Telegram", icon: "i-lucide-send" },
@@ -353,6 +383,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
353
383
  { value: "google", label: "Google Suite", icon: "i-lucide-mail" },
354
384
  { value: "email", label: "Email (IMAP)", icon: "i-lucide-at-sign" }
355
385
  ];
386
+ function getMissingSecrets(platform) {
387
+ const required = platformRequiredSecrets[platform];
388
+ if (!required.length) return [];
389
+ const existing = new Set(secretsData.value.map((s) => s.key));
390
+ return required.filter((k) => !existing.has(k));
391
+ }
356
392
  const healthColors = {
357
393
  connected: "text-success",
358
394
  disconnected: "text-dimmed",
@@ -475,6 +511,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
475
511
  toast.add({ title: "Name is required", color: "error" });
476
512
  return;
477
513
  }
514
+ const missing = getMissingSecrets(bridgeForm.platform);
515
+ if (missing.length) {
516
+ toast.add({
517
+ title: "Missing required secrets",
518
+ description: `Add ${missing.join(", ")} in the Secrets tab first.`,
519
+ color: "error"
520
+ });
521
+ return;
522
+ }
478
523
  bridgeSaving.value = true;
479
524
  try {
480
525
  await $fetch("/api/bridges", {
@@ -613,11 +658,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
613
658
  const _component_UFormField = _sfc_main$7;
614
659
  const _component_UInput = _sfc_main$8;
615
660
  const _component_UButton = _sfc_main$8$1;
616
- const _component_USeparator = _sfc_main$e;
617
- const _component_UTable = _sfc_main$c;
661
+ const _component_USeparator = _sfc_main$b;
662
+ const _component_UTable = _sfc_main$e;
618
663
  const _component_UIcon = _sfc_main$d;
619
664
  const _component_USkeleton = _sfc_main$4;
620
- const _component_USwitch = _sfc_main$b;
665
+ const _component_USwitch = _sfc_main$c;
621
666
  const _component_UModal = _sfc_main$5;
622
667
  const _component_USelect = _sfc_main$9;
623
668
  _push(ssrRenderComponent(_component_UDashboardPanel, mergeProps({
@@ -1077,6 +1122,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1077
1122
  }),
1078
1123
  _: 1
1079
1124
  }, _parent3, _scopeId2));
1125
+ if (getMissingSecrets(unref(bridgeForm).platform).length) {
1126
+ _push3(`<div class="flex items-start gap-2 rounded-lg bg-error/10 border border-error/20 p-3 text-sm"${_scopeId2}>`);
1127
+ _push3(ssrRenderComponent(_component_UIcon, {
1128
+ name: "i-lucide-alert-triangle",
1129
+ class: "size-4 mt-0.5 text-error shrink-0"
1130
+ }, null, _parent3, _scopeId2));
1131
+ _push3(`<div${_scopeId2}><p class="font-medium text-error"${_scopeId2}> Missing required secrets </p><p class="text-dimmed mt-1"${_scopeId2}> Add the following in Settings → Secrets before creating: </p><ul class="mt-1 space-y-0.5"${_scopeId2}><!--[-->`);
1132
+ ssrRenderList(getMissingSecrets(unref(bridgeForm).platform), (key) => {
1133
+ _push3(`<li${_scopeId2}><code class="text-xs bg-elevated px-1.5 py-0.5 rounded"${_scopeId2}>${ssrInterpolate(key)}</code></li>`);
1134
+ });
1135
+ _push3(`<!--]--></ul></div></div>`);
1136
+ } else {
1137
+ _push3(`<!---->`);
1138
+ }
1080
1139
  _push3(ssrRenderComponent(_component_UFormField, {
1081
1140
  label: "Name",
1082
1141
  name: "name"
@@ -1120,6 +1179,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1120
1179
  }, _parent3, _scopeId2));
1121
1180
  _push3(ssrRenderComponent(_component_UButton, {
1122
1181
  loading: unref(bridgeSaving),
1182
+ disabled: getMissingSecrets(unref(bridgeForm).platform).length > 0,
1123
1183
  onClick: handleBridgeCreate
1124
1184
  }, {
1125
1185
  default: withCtx((_3, _push4, _parent4, _scopeId3) => {
@@ -1152,6 +1212,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1152
1212
  ]),
1153
1213
  _: 1
1154
1214
  }),
1215
+ getMissingSecrets(unref(bridgeForm).platform).length ? (openBlock(), createBlock("div", {
1216
+ key: 0,
1217
+ class: "flex items-start gap-2 rounded-lg bg-error/10 border border-error/20 p-3 text-sm"
1218
+ }, [
1219
+ createVNode(_component_UIcon, {
1220
+ name: "i-lucide-alert-triangle",
1221
+ class: "size-4 mt-0.5 text-error shrink-0"
1222
+ }),
1223
+ createVNode("div", null, [
1224
+ createVNode("p", { class: "font-medium text-error" }, " Missing required secrets "),
1225
+ createVNode("p", { class: "text-dimmed mt-1" }, " Add the following in Settings → Secrets before creating: "),
1226
+ createVNode("ul", { class: "mt-1 space-y-0.5" }, [
1227
+ (openBlock(true), createBlock(Fragment, null, renderList(getMissingSecrets(unref(bridgeForm).platform), (key) => {
1228
+ return openBlock(), createBlock("li", { key }, [
1229
+ createVNode("code", { class: "text-xs bg-elevated px-1.5 py-0.5 rounded" }, toDisplayString(key), 1)
1230
+ ]);
1231
+ }), 128))
1232
+ ])
1233
+ ])
1234
+ ])) : createCommentVNode("", true),
1155
1235
  createVNode(_component_UFormField, {
1156
1236
  label: "Name",
1157
1237
  name: "name"
@@ -1178,13 +1258,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1178
1258
  }, 8, ["onClick"]),
1179
1259
  createVNode(_component_UButton, {
1180
1260
  loading: unref(bridgeSaving),
1261
+ disabled: getMissingSecrets(unref(bridgeForm).platform).length > 0,
1181
1262
  onClick: handleBridgeCreate
1182
1263
  }, {
1183
1264
  default: withCtx(() => [
1184
1265
  createTextVNode(" Create ")
1185
1266
  ]),
1186
1267
  _: 1
1187
- }, 8, ["loading"])
1268
+ }, 8, ["loading", "disabled"])
1188
1269
  ])
1189
1270
  ])
1190
1271
  ];
@@ -1299,13 +1380,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1299
1380
  body: withCtx((_2, _push3, _parent3, _scopeId2) => {
1300
1381
  if (_push3) {
1301
1382
  _push3(`<div class="space-y-4"${_scopeId2}>`);
1302
- if (unref(editingBridge) && platformSecretHints[unref(editingBridge).platform]) {
1383
+ if (unref(editingBridge) && platformRequiredSecrets[unref(editingBridge).platform].length) {
1303
1384
  _push3(`<div class="flex items-start gap-2 rounded-lg bg-elevated p-3 text-sm"${_scopeId2}>`);
1304
1385
  _push3(ssrRenderComponent(_component_UIcon, {
1305
1386
  name: "i-lucide-info",
1306
1387
  class: "size-4 mt-0.5 text-dimmed shrink-0"
1307
1388
  }, null, _parent3, _scopeId2));
1308
- _push3(`<span class="text-dimmed"${_scopeId2}> Requires secret <code class="bg-elevated px-1 py-0.5 rounded text-xs"${_scopeId2}>${ssrInterpolate(platformSecretHints[unref(editingBridge).platform])}</code> in the Secrets tab. </span></div>`);
1389
+ _push3(`<span class="text-dimmed"${_scopeId2}> Requires <!--[-->`);
1390
+ ssrRenderList(platformRequiredSecrets[unref(editingBridge).platform], (key, i) => {
1391
+ _push3(`<!--[--><code class="bg-elevated px-1 py-0.5 rounded text-xs"${_scopeId2}>${ssrInterpolate(key)}</code>`);
1392
+ if (i < platformRequiredSecrets[unref(editingBridge).platform].length - 1) {
1393
+ _push3(`<!--[-->, <!--]-->`);
1394
+ } else {
1395
+ _push3(`<!---->`);
1396
+ }
1397
+ _push3(`<!--]-->`);
1398
+ });
1399
+ _push3(`<!--]--> in the Secrets tab. </span></div>`);
1309
1400
  } else {
1310
1401
  _push3(`<!---->`);
1311
1402
  }
@@ -1506,6 +1597,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1506
1597
  }),
1507
1598
  _: 1
1508
1599
  }, _parent3, _scopeId2));
1600
+ if (unref(bridgeConfigForm).strategy === "bluebubbles" && !unref(secretsData).some((s) => s.key === "BLUEBUBBLES_PASSWORD")) {
1601
+ _push3(`<div class="flex items-start gap-2 rounded-lg bg-error/10 border border-error/20 p-3 text-sm"${_scopeId2}>`);
1602
+ _push3(ssrRenderComponent(_component_UIcon, {
1603
+ name: "i-lucide-alert-triangle",
1604
+ class: "size-4 mt-0.5 text-error shrink-0"
1605
+ }, null, _parent3, _scopeId2));
1606
+ _push3(`<span class="text-dimmed"${_scopeId2}> BlueBubbles requires secret <code class="text-xs bg-elevated px-1.5 py-0.5 rounded"${_scopeId2}>BLUEBUBBLES_PASSWORD</code> in the Secrets tab. </span></div>`);
1607
+ } else {
1608
+ _push3(`<!---->`);
1609
+ }
1509
1610
  if (unref(bridgeConfigForm).strategy === "bluebubbles") {
1510
1611
  _push3(ssrRenderComponent(_component_UFormField, {
1511
1612
  label: "BlueBubbles URL",
@@ -1799,7 +1900,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1799
1900
  } else {
1800
1901
  return [
1801
1902
  createVNode("div", { class: "space-y-4" }, [
1802
- unref(editingBridge) && platformSecretHints[unref(editingBridge).platform] ? (openBlock(), createBlock("div", {
1903
+ unref(editingBridge) && platformRequiredSecrets[unref(editingBridge).platform].length ? (openBlock(), createBlock("div", {
1803
1904
  key: 0,
1804
1905
  class: "flex items-start gap-2 rounded-lg bg-elevated p-3 text-sm"
1805
1906
  }, [
@@ -1808,8 +1909,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1808
1909
  class: "size-4 mt-0.5 text-dimmed shrink-0"
1809
1910
  }),
1810
1911
  createVNode("span", { class: "text-dimmed" }, [
1811
- createTextVNode(" Requires secret "),
1812
- createVNode("code", { class: "bg-elevated px-1 py-0.5 rounded text-xs" }, toDisplayString(platformSecretHints[unref(editingBridge).platform]), 1),
1912
+ createTextVNode(" Requires "),
1913
+ (openBlock(true), createBlock(Fragment, null, renderList(platformRequiredSecrets[unref(editingBridge).platform], (key, i) => {
1914
+ return openBlock(), createBlock(Fragment, { key }, [
1915
+ createVNode("code", { class: "bg-elevated px-1 py-0.5 rounded text-xs" }, toDisplayString(key), 1),
1916
+ i < platformRequiredSecrets[unref(editingBridge).platform].length - 1 ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1917
+ createTextVNode(", ")
1918
+ ], 64)) : createCommentVNode("", true)
1919
+ ], 64);
1920
+ }), 128)),
1813
1921
  createTextVNode(" in the Secrets tab. ")
1814
1922
  ])
1815
1923
  ])) : createCommentVNode("", true),
@@ -1922,8 +2030,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1922
2030
  ]),
1923
2031
  _: 1
1924
2032
  }),
1925
- unref(bridgeConfigForm).strategy === "bluebubbles" ? (openBlock(), createBlock(_component_UFormField, {
2033
+ unref(bridgeConfigForm).strategy === "bluebubbles" && !unref(secretsData).some((s) => s.key === "BLUEBUBBLES_PASSWORD") ? (openBlock(), createBlock("div", {
1926
2034
  key: 0,
2035
+ class: "flex items-start gap-2 rounded-lg bg-error/10 border border-error/20 p-3 text-sm"
2036
+ }, [
2037
+ createVNode(_component_UIcon, {
2038
+ name: "i-lucide-alert-triangle",
2039
+ class: "size-4 mt-0.5 text-error shrink-0"
2040
+ }),
2041
+ createVNode("span", { class: "text-dimmed" }, [
2042
+ createTextVNode(" BlueBubbles requires secret "),
2043
+ createVNode("code", { class: "text-xs bg-elevated px-1.5 py-0.5 rounded" }, "BLUEBUBBLES_PASSWORD"),
2044
+ createTextVNode(" in the Secrets tab. ")
2045
+ ])
2046
+ ])) : createCommentVNode("", true),
2047
+ unref(bridgeConfigForm).strategy === "bluebubbles" ? (openBlock(), createBlock(_component_UFormField, {
2048
+ key: 1,
1927
2049
  label: "BlueBubbles URL",
1928
2050
  name: "blueBubblesUrl"
1929
2051
  }, {
@@ -2412,6 +2534,29 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
2412
2534
  ]),
2413
2535
  app: withCtx(() => [
2414
2536
  createVNode("div", { class: "max-w-2xl mx-auto py-6" }, [
2537
+ createVNode("div", { class: "mb-8" }, [
2538
+ createVNode("h3", { class: "text-lg font-semibold mb-1" }, " Public URL "),
2539
+ createVNode("p", { class: "text-sm text-dimmed mb-4" }, " The publicly accessible URL for this instance. Used for Telegram webhooks, auth callbacks, and other integrations that need to reach your server. "),
2540
+ createVNode("div", { class: "flex gap-2" }, [
2541
+ createVNode(_component_UInput, {
2542
+ modelValue: unref(appUrl),
2543
+ "onUpdate:modelValue": ($event) => isRef(appUrl) ? appUrl.value = $event : null,
2544
+ placeholder: "https://example.com",
2545
+ class: "flex-1"
2546
+ }, null, 8, ["modelValue", "onUpdate:modelValue"]),
2547
+ createVNode(_component_UButton, {
2548
+ loading: unref(appUrlSaving),
2549
+ onClick: saveAppUrl
2550
+ }, {
2551
+ default: withCtx(() => [
2552
+ createTextVNode(" Save ")
2553
+ ]),
2554
+ _: 1
2555
+ }, 8, ["loading"])
2556
+ ]),
2557
+ createVNode("p", { class: "text-xs text-dimmed mt-2" }, " Leave empty to use long-polling for Telegram instead of webhooks. Changes require restarting running integrations. ")
2558
+ ]),
2559
+ createVNode(_component_USeparator, { class: "mb-8" }),
2415
2560
  createVNode("div", { class: "mb-6" }, [
2416
2561
  createVNode("h3", { class: "text-lg font-semibold mb-1" }, " Notification Preferences "),
2417
2562
  createVNode("p", { class: "text-sm text-dimmed" }, " Choose which resource changes show toast notifications. ")
@@ -2641,6 +2786,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
2641
2786
  ]),
2642
2787
  _: 1
2643
2788
  }),
2789
+ getMissingSecrets(unref(bridgeForm).platform).length ? (openBlock(), createBlock("div", {
2790
+ key: 0,
2791
+ class: "flex items-start gap-2 rounded-lg bg-error/10 border border-error/20 p-3 text-sm"
2792
+ }, [
2793
+ createVNode(_component_UIcon, {
2794
+ name: "i-lucide-alert-triangle",
2795
+ class: "size-4 mt-0.5 text-error shrink-0"
2796
+ }),
2797
+ createVNode("div", null, [
2798
+ createVNode("p", { class: "font-medium text-error" }, " Missing required secrets "),
2799
+ createVNode("p", { class: "text-dimmed mt-1" }, " Add the following in Settings → Secrets before creating: "),
2800
+ createVNode("ul", { class: "mt-1 space-y-0.5" }, [
2801
+ (openBlock(true), createBlock(Fragment, null, renderList(getMissingSecrets(unref(bridgeForm).platform), (key) => {
2802
+ return openBlock(), createBlock("li", { key }, [
2803
+ createVNode("code", { class: "text-xs bg-elevated px-1.5 py-0.5 rounded" }, toDisplayString(key), 1)
2804
+ ]);
2805
+ }), 128))
2806
+ ])
2807
+ ])
2808
+ ])) : createCommentVNode("", true),
2644
2809
  createVNode(_component_UFormField, {
2645
2810
  label: "Name",
2646
2811
  name: "name"
@@ -2667,13 +2832,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
2667
2832
  }, 8, ["onClick"]),
2668
2833
  createVNode(_component_UButton, {
2669
2834
  loading: unref(bridgeSaving),
2835
+ disabled: getMissingSecrets(unref(bridgeForm).platform).length > 0,
2670
2836
  onClick: handleBridgeCreate
2671
2837
  }, {
2672
2838
  default: withCtx(() => [
2673
2839
  createTextVNode(" Create ")
2674
2840
  ]),
2675
2841
  _: 1
2676
- }, 8, ["loading"])
2842
+ }, 8, ["loading", "disabled"])
2677
2843
  ])
2678
2844
  ])
2679
2845
  ]),
@@ -2731,7 +2897,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
2731
2897
  ]),
2732
2898
  body: withCtx(() => [
2733
2899
  createVNode("div", { class: "space-y-4" }, [
2734
- unref(editingBridge) && platformSecretHints[unref(editingBridge).platform] ? (openBlock(), createBlock("div", {
2900
+ unref(editingBridge) && platformRequiredSecrets[unref(editingBridge).platform].length ? (openBlock(), createBlock("div", {
2735
2901
  key: 0,
2736
2902
  class: "flex items-start gap-2 rounded-lg bg-elevated p-3 text-sm"
2737
2903
  }, [
@@ -2740,8 +2906,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
2740
2906
  class: "size-4 mt-0.5 text-dimmed shrink-0"
2741
2907
  }),
2742
2908
  createVNode("span", { class: "text-dimmed" }, [
2743
- createTextVNode(" Requires secret "),
2744
- createVNode("code", { class: "bg-elevated px-1 py-0.5 rounded text-xs" }, toDisplayString(platformSecretHints[unref(editingBridge).platform]), 1),
2909
+ createTextVNode(" Requires "),
2910
+ (openBlock(true), createBlock(Fragment, null, renderList(platformRequiredSecrets[unref(editingBridge).platform], (key, i) => {
2911
+ return openBlock(), createBlock(Fragment, { key }, [
2912
+ createVNode("code", { class: "bg-elevated px-1 py-0.5 rounded text-xs" }, toDisplayString(key), 1),
2913
+ i < platformRequiredSecrets[unref(editingBridge).platform].length - 1 ? (openBlock(), createBlock(Fragment, { key: 0 }, [
2914
+ createTextVNode(", ")
2915
+ ], 64)) : createCommentVNode("", true)
2916
+ ], 64);
2917
+ }), 128)),
2745
2918
  createTextVNode(" in the Secrets tab. ")
2746
2919
  ])
2747
2920
  ])) : createCommentVNode("", true),
@@ -2854,8 +3027,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
2854
3027
  ]),
2855
3028
  _: 1
2856
3029
  }),
2857
- unref(bridgeConfigForm).strategy === "bluebubbles" ? (openBlock(), createBlock(_component_UFormField, {
3030
+ unref(bridgeConfigForm).strategy === "bluebubbles" && !unref(secretsData).some((s) => s.key === "BLUEBUBBLES_PASSWORD") ? (openBlock(), createBlock("div", {
2858
3031
  key: 0,
3032
+ class: "flex items-start gap-2 rounded-lg bg-error/10 border border-error/20 p-3 text-sm"
3033
+ }, [
3034
+ createVNode(_component_UIcon, {
3035
+ name: "i-lucide-alert-triangle",
3036
+ class: "size-4 mt-0.5 text-error shrink-0"
3037
+ }),
3038
+ createVNode("span", { class: "text-dimmed" }, [
3039
+ createTextVNode(" BlueBubbles requires secret "),
3040
+ createVNode("code", { class: "text-xs bg-elevated px-1.5 py-0.5 rounded" }, "BLUEBUBBLES_PASSWORD"),
3041
+ createTextVNode(" in the Secrets tab. ")
3042
+ ])
3043
+ ])) : createCommentVNode("", true),
3044
+ unref(bridgeConfigForm).strategy === "bluebubbles" ? (openBlock(), createBlock(_component_UFormField, {
3045
+ key: 1,
2859
3046
  label: "BlueBubbles URL",
2860
3047
  name: "blueBubblesUrl"
2861
3048
  }, {
@@ -3042,4 +3229,4 @@ _sfc_main.setup = (props, ctx) => {
3042
3229
  };
3043
3230
 
3044
3231
  export { _sfc_main as default };
3045
- //# sourceMappingURL=settings-ByUXa46k.mjs.map
3232
+ //# sourceMappingURL=settings-B2KXoGcz.mjs.map