@lovelybunch/api 1.0.76-alpha.1 → 1.0.76-alpha.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 (421) hide show
  1. package/dist/lib/auth/auth-manager.js +1 -1
  2. package/dist/lib/mcp-client.d.ts +39 -0
  3. package/dist/lib/mcp-client.js +131 -0
  4. package/dist/lib/terminal/terminal-manager.js +31 -0
  5. package/dist/routes/api/v1/ai/route.js +136 -1
  6. package/dist/routes/api/v1/ai/tools.js +49 -232
  7. package/dist/routes/api/v1/config/route.js +13 -9
  8. package/dist/routes/api/v1/context/agents/route.d.ts +3 -0
  9. package/dist/routes/api/v1/context/agents/route.js +159 -0
  10. package/dist/routes/api/v1/context/index.js +6 -0
  11. package/dist/routes/api/v1/context/memory/route.d.ts +3 -0
  12. package/dist/routes/api/v1/context/memory/route.js +163 -0
  13. package/dist/routes/api/v1/context/team/route.d.ts +3 -0
  14. package/dist/routes/api/v1/context/team/route.js +159 -0
  15. package/dist/routes/api/v1/knowledge/route.js +26 -32
  16. package/dist/routes/api/v1/mail/route.d.ts +3 -3
  17. package/dist/routes/api/v1/mcp/index.js +170 -4
  18. package/dist/routes/api/v1/proposals/[id]/route.d.ts +10 -24
  19. package/dist/routes/api/v1/proposals/[id]/route.js +10 -1
  20. package/dist/routes/api/v1/proposals/route.d.ts +2 -16
  21. package/dist/routes/api/v1/proposals/route.js +11 -8
  22. package/dist/routes/api/v1/slack/route.d.ts +6 -6
  23. package/dist/routes/api/v1/tasks/route.d.ts +18 -38
  24. package/dist/routes/api/v1/tasks/route.js +94 -16
  25. package/dist/routes/api/v1/terminal/[proposalId]/create/route.js +2 -2
  26. package/dist/routes/api/v1/terminal/code/index.d.ts +3 -0
  27. package/dist/routes/api/v1/terminal/code/index.js +5 -0
  28. package/dist/routes/api/v1/terminal/code/route.d.ts +14 -0
  29. package/dist/routes/api/v1/terminal/code/route.js +159 -0
  30. package/dist/server-with-static.js +2 -0
  31. package/dist/server.js +2 -0
  32. package/package.json +6 -7
  33. package/static/assets/ActivityPage-B3rsYt_4.js +1 -0
  34. package/static/assets/AgentsContextEditPage-4D7qO4S-.js +9 -0
  35. package/static/assets/AgentsContextPage-NmvLRo0k.js +1 -0
  36. package/static/assets/{ApiKeysSettingsPage-DbXgxh7i.js → ApiKeysSettingsPage-BGj5p9zw.js} +2 -2
  37. package/static/assets/ArchitectureEditPage-DI2jNmc9.js +15 -0
  38. package/static/assets/ArchitecturePage-DiIuThUM.js +1 -0
  39. package/static/assets/{AuthSettingsPage-nIgM05Yw.js → AuthSettingsPage-DWuwxAS0.js} +2 -2
  40. package/static/assets/{CallbackPage-NNbLun2S.js → CallbackPage-BCmkYhEr.js} +1 -1
  41. package/static/assets/CodePage-BZhIkymg.js +2 -0
  42. package/static/assets/{CollapsibleSection-DbKW4cyU.js → CollapsibleSection-BJzLVd-x.js} +1 -1
  43. package/static/assets/DashboardPage-DtwE553F.js +41 -0
  44. package/static/assets/{GitPage-Hi0mdDOi.js → GitPage-qG7VYL9b.js} +4 -4
  45. package/static/assets/{GitSettingsPage-2vuCM-U-.js → GitSettingsPage-C8Bgpj-X.js} +2 -2
  46. package/static/assets/{IdentityPage-2BzLc2EI.js → IdentityPage-Cf8Ruu-g.js} +2 -2
  47. package/static/assets/{ImplementationStepsEditor-BlmI5YuN.js → ImplementationStepsEditor-BXIRT7o1.js} +2 -2
  48. package/static/assets/IntegrationsSettingsPage-th56kUgi.js +1 -0
  49. package/static/assets/{JobDetailPage-CLEY1Z5e.js → JobDetailPage-ZyEcbPAe.js} +1 -1
  50. package/static/assets/KnowledgeDetailPage-BklEOfs0.js +1 -0
  51. package/static/assets/KnowledgeEditPage-BGqzVqHi.js +1 -0
  52. package/static/assets/{KnowledgePage-D-ahboFK.js → KnowledgePage-Dmm7vzAj.js} +2 -2
  53. package/static/assets/{LoginPage-DQ2rJliF.js → LoginPage-PDafaEnq.js} +1 -1
  54. package/static/assets/{MailInboxPage-Bfh0_pBU.js → MailInboxPage-M5_2gGkB.js} +1 -1
  55. package/static/assets/{MailProcessingModal-NF9kjdgr.js → MailProcessingModal-C4PotIFc.js} +2 -2
  56. package/static/assets/{MailReadPage-C0QhDa1x.js → MailReadPage-D32FUx5o.js} +1 -1
  57. package/static/assets/{MailSentPage-Ctgcp1RB.js → MailSentPage-CjBrbezf.js} +1 -1
  58. package/static/assets/{McpSettingsPage-CFgpw5_r.js → McpSettingsPage-DxE-4YPc.js} +1 -1
  59. package/static/assets/MemoryEditPage-BlQ5EN1w.js +13 -0
  60. package/static/assets/MemoryPage-B8fsgW7z.js +1 -0
  61. package/static/assets/NewKnowledgePage-CuH201xQ.js +1 -0
  62. package/static/assets/{NewSkillPage-CvBSXZFE.js → NewSkillPage-BdX7eNoi.js} +1 -1
  63. package/static/assets/{NewTaskPage-DRL-pyjV.js → NewTaskPage-D9W2Yi0r.js} +2 -2
  64. package/static/assets/{NotFoundPage-DW0gfvNA.js → NotFoundPage-D9tmTVho.js} +1 -1
  65. package/static/assets/NotificationsSettingsPage-B4lBxS8D.js +1 -0
  66. package/static/assets/ProjectEditPage-DdqUI91K.js +11 -0
  67. package/static/assets/{ProjectPage-78a-iVFG.js → ProjectPage-DB7ugw8l.js} +1 -1
  68. package/static/assets/PromptsSettingsPage-DFXoKUjj.js +1 -0
  69. package/static/assets/{ResourceDetailPage-CLcuo4yw.js → ResourceDetailPage-CWc4YIMc.js} +1 -1
  70. package/static/assets/{ResourcesPage-C0TGRawd.js → ResourcesPage-BK-EXoIA.js} +2 -2
  71. package/static/assets/RoleEditPage-B20UAC2r.js +13 -0
  72. package/static/assets/{RolePage-haUf186q.js → RolePage-C5Jf7wxY.js} +1 -1
  73. package/static/assets/{RulesSettingsPage-Cc8rvAvm.js → RulesSettingsPage-91WP1FQf.js} +2 -2
  74. package/static/assets/SchedulePage-BijprHGn.js +4 -0
  75. package/static/assets/{SkillDetailPage-BqhoNNkM.js → SkillDetailPage-Cpxz_wmk.js} +1 -1
  76. package/static/assets/{SkillEditPage-cpSdv9D4.js → SkillEditPage-Cz7VRg0r.js} +1 -1
  77. package/static/assets/{SkillsPage-Cxkm5ymf.js → SkillsPage-Bxmsi6Xd.js} +2 -2
  78. package/static/assets/{SkillsSettingsPage-DrmRher8.js → SkillsSettingsPage-Cysx53Au.js} +1 -1
  79. package/static/assets/{SourceInput-C0WkiXS6.js → SourceInput-D59F7hff.js} +1 -1
  80. package/static/assets/{TagInput-raThOrbG.js → TagInput-BH6wDXWJ.js} +1 -1
  81. package/static/assets/{TaskDetailPage-BMzce3uJ.js → TaskDetailPage-5ktdWaTr.js} +2 -2
  82. package/static/assets/TaskEditPage-CIZWp_s4.js +1 -0
  83. package/static/assets/{TasksPage-CxKJQJ1_.js → TasksPage-BNXDm-Er.js} +3 -3
  84. package/static/assets/TeamEditPage-C10siqme.js +9 -0
  85. package/static/assets/TeamPage-CXpZVAfy.js +1 -0
  86. package/static/assets/{TerminalPage-BWdNoEM5.js → TerminalPage-DJ-Tu_hG.js} +1 -1
  87. package/static/assets/TerminalSessionPage-BLryJlkL.js +3 -0
  88. package/static/assets/UserPreferencesPage-BvAcv5tt.js +1 -0
  89. package/static/assets/{UserSettingsPage-CqooRxDi.js → UserSettingsPage-NQfoOvHf.js} +1 -1
  90. package/static/assets/UtilitiesPage-NnBCWVn8.js +1 -0
  91. package/static/assets/{alert-BGFBZOrZ.js → alert-CMfexl-V.js} +1 -1
  92. package/static/assets/apl-B4CMkyY2.js +1 -0
  93. package/static/assets/{arrow-down-DXhs3vvo.js → arrow-down-7VoAlw8h.js} +1 -1
  94. package/static/assets/{arrow-left-PEX5RePT.js → arrow-left-CkQCXG-O.js} +1 -1
  95. package/static/assets/{arrow-up-D7z0QZsQ.js → arrow-up-Bozm6eto.js} +1 -1
  96. package/static/assets/{arrow-up-down-OTrzDHIL.js → arrow-up-down-BgZelEPF.js} +1 -1
  97. package/static/assets/asciiarmor-Df11BRmG.js +1 -0
  98. package/static/assets/asn1-EdZsLKOL.js +1 -0
  99. package/static/assets/asterisk-B-8jnY81.js +1 -0
  100. package/static/assets/{badge-rki-Xf0E.js → badge-CKqDVhJv.js} +1 -1
  101. package/static/assets/brainfuck-C4LP7Hcl.js +1 -0
  102. package/static/assets/{browser-modal-BKnqJnf5.js → browser-modal-CIOZi1Jw.js} +2 -2
  103. package/static/assets/{card-_Grh-Otl.js → card-jBf8qQSy.js} +1 -1
  104. package/static/assets/{chevron-left-LQtIDk73.js → chevron-left-D1qHCYRd.js} +1 -1
  105. package/static/assets/{chevron-up-BM1GKhAV.js → chevron-up-CcwaoTsZ.js} +1 -1
  106. package/static/assets/{chevrons-up-Ccej0FyZ.js → chevrons-up-BtlNQbrw.js} +1 -1
  107. package/static/assets/{circle-alert-C5k9mZfC.js → circle-alert-DqK0nUqF.js} +1 -1
  108. package/static/assets/{circle-check-big-BaFefwt0.js → circle-check-big-DDQIqE0G.js} +1 -1
  109. package/static/assets/{circle-check-fwIZxHsK.js → circle-check-qo4cPVA1.js} +1 -1
  110. package/static/assets/{circle-play-C1R46Kry.js → circle-play-CQ-UItmT.js} +1 -1
  111. package/static/assets/{circle-x-CKuM1691.js → circle-x-Bd57ohC5.js} +1 -1
  112. package/static/assets/clike-B9uivgTg.js +1 -0
  113. package/static/assets/{clipboard-DWJnnRi8.js → clipboard-JQLlAwqS.js} +1 -1
  114. package/static/assets/{clock-Diqm3Csm.js → clock-DTp411N-.js} +1 -1
  115. package/static/assets/clojure-BMjYHr_A.js +1 -0
  116. package/static/assets/cmake-BQqOBYOt.js +1 -0
  117. package/static/assets/cobol-CWcv1MsR.js +1 -0
  118. package/static/assets/{code-Ao0cA5nW.js → code-Bi-U-NxE.js} +1 -1
  119. package/static/assets/coffeescript-S37ZYGWr.js +1 -0
  120. package/static/assets/commonlisp-DBKNyK5s.js +1 -0
  121. package/static/assets/crystal-SjHAIU92.js +1 -0
  122. package/static/assets/css-BnMrqG3P.js +1 -0
  123. package/static/assets/cypher-C_CwsFkJ.js +1 -0
  124. package/static/assets/d-pRatUO7H.js +1 -0
  125. package/static/assets/diff-DbItnlRl.js +1 -0
  126. package/static/assets/dockerfile-BKs6k2Af.js +1 -0
  127. package/static/assets/{download-5iQDQeY0.js → download-DNaE6rtO.js} +1 -1
  128. package/static/assets/dtd-DF_7sFjM.js +1 -0
  129. package/static/assets/dylan-DwRh75JA.js +1 -0
  130. package/static/assets/ebnf-CDyGwa7X.js +1 -0
  131. package/static/assets/ecl-Cabwm37j.js +1 -0
  132. package/static/assets/eiffel-CnydiIhH.js +1 -0
  133. package/static/assets/elm-vLlmbW-K.js +1 -0
  134. package/static/assets/erlang-BNw1qcRV.js +1 -0
  135. package/static/assets/{external-link-B6dkiWgP.js → external-link-DRsIhdWR.js} +1 -1
  136. package/static/assets/{eye-DQUzAWBY.js → eye-jqpFU8Rl.js} +1 -1
  137. package/static/assets/factor-kuTfRLto.js +1 -0
  138. package/static/assets/fcl-Kvtd6kyn.js +1 -0
  139. package/static/assets/{folder-git-2-CQUj8P5W.js → folder-git-2-ixHmuqNj.js} +1 -1
  140. package/static/assets/forth-Ffai-XNe.js +1 -0
  141. package/static/assets/fortran-DYz_wnZ1.js +1 -0
  142. package/static/assets/gas-Bneqetm1.js +1 -0
  143. package/static/assets/gherkin-heZmZLOM.js +1 -0
  144. package/static/assets/globe-BZEWER4V.js +6 -0
  145. package/static/assets/groovy-D9Dt4D0W.js +1 -0
  146. package/static/assets/haskell-Cw1EW3IL.js +1 -0
  147. package/static/assets/haxe-H-WmDvRZ.js +1 -0
  148. package/static/assets/http-DBlCnlav.js +1 -0
  149. package/static/assets/idl-BEugSyMb.js +1 -0
  150. package/static/assets/index-2_Tb936f.js +1 -0
  151. package/static/assets/index-B8B_4B2l.js +1 -0
  152. package/static/assets/index-BD47WGC6.js +1 -0
  153. package/static/assets/index-BGKQ2Csq.js +3 -0
  154. package/static/assets/index-BLjvGp1F.js +1 -0
  155. package/static/assets/{index-CIFIEidO.js → index-BWhM9fZn.js} +117 -102
  156. package/static/assets/index-Bft1WzL9.js +1 -0
  157. package/static/assets/index-C3ao8yMv.js +7 -0
  158. package/static/assets/index-CK5AHHmM.js +1 -0
  159. package/static/assets/index-CdmUQF6-.js +1 -0
  160. package/static/assets/index-CiS46Fde.js +1 -0
  161. package/static/assets/index-CoeRBZRl.js +2 -0
  162. package/static/assets/index-CtWTFIFI.js +1 -0
  163. package/static/assets/index-D-5sddKG.js +1 -0
  164. package/static/assets/index-DHAvHhw0.js +1 -0
  165. package/static/assets/index-DffngCzC.js +1 -0
  166. package/static/assets/index-M-XcYp88.js +1 -0
  167. package/static/assets/index-UDlexUv4.js +1 -0
  168. package/static/assets/index-htJaaOEZ.js +1 -0
  169. package/static/assets/index-oRAlpULD.css +1 -0
  170. package/static/assets/{info-BvzdeJ30.js → info-Na9GqbtC.js} +1 -1
  171. package/static/assets/javascript-iXu5QeM3.js +1 -0
  172. package/static/assets/julia-DuME0IfC.js +1 -0
  173. package/static/assets/{label-B1lgxULu.js → label-CHVVHrlr.js} +1 -1
  174. package/static/assets/livescript-BwQOo05w.js +1 -0
  175. package/static/assets/lua-BgMRiT3U.js +1 -0
  176. package/static/assets/markdown-editor-B6HEtSkH.css +1 -0
  177. package/static/assets/markdown-editor-CT9CPLw5.js +111 -0
  178. package/static/assets/mathematica-DTrFuWx2.js +1 -0
  179. package/static/assets/mbox-CNhZ1qSd.js +1 -0
  180. package/static/assets/{message-square-LKqx0LRr.js → message-square-B5NR6hzj.js} +1 -1
  181. package/static/assets/mirc-CjQqDB4T.js +1 -0
  182. package/static/assets/mllike-CXdrOF99.js +1 -0
  183. package/static/assets/modelica-Dc1JOy9r.js +1 -0
  184. package/static/assets/mscgen-BA5vi2Kp.js +1 -0
  185. package/static/assets/mumps-BT43cFF4.js +1 -0
  186. package/static/assets/nginx-DdIZxoE0.js +1 -0
  187. package/static/assets/nsis-LdVXkNf5.js +1 -0
  188. package/static/assets/ntriples-BfvgReVJ.js +1 -0
  189. package/static/assets/octave-Ck1zUtKM.js +1 -0
  190. package/static/assets/oz-BzwKVEFT.js +1 -0
  191. package/static/assets/{paperclip-Cvcr3t6l.js → paperclip-SI0kWfGf.js} +1 -1
  192. package/static/assets/pascal--L3eBynH.js +1 -0
  193. package/static/assets/{pause-TaMz44vG.js → pause-DKI9nsrI.js} +1 -1
  194. package/static/assets/perl-CdXCOZ3F.js +1 -0
  195. package/static/assets/pig-CevX1Tat.js +1 -0
  196. package/static/assets/pipeline-builders-Bkf0wt_O.js +17 -0
  197. package/static/assets/{play-C4YxfQOO.js → play-BTA0gBuh.js} +1 -1
  198. package/static/assets/powershell-CFHJl5sT.js +1 -0
  199. package/static/assets/properties-C78fOPTZ.js +1 -0
  200. package/static/assets/protobuf-ChK-085T.js +1 -0
  201. package/static/assets/pug-DeIclll2.js +1 -0
  202. package/static/assets/puppet-DMA9R1ak.js +1 -0
  203. package/static/assets/python-BuPzkPfP.js +1 -0
  204. package/static/assets/q-pXgVlZs6.js +1 -0
  205. package/static/assets/r-B6wPVr8A.js +1 -0
  206. package/static/assets/{radio-group-D7Rt-k1F.js → radio-group-BO2__pxZ.js} +1 -1
  207. package/static/assets/{refresh-cw-C9ZWZi2c.js → refresh-cw-DLJpfa8_.js} +1 -1
  208. package/static/assets/rpm-CTu-6PCP.js +1 -0
  209. package/static/assets/ruby-B2Rjki9n.js +1 -0
  210. package/static/assets/sas-B4kiWyti.js +1 -0
  211. package/static/assets/scheme-C41bIUwD.js +1 -0
  212. package/static/assets/{search-C1RuN2pO.js → search-SRuczbr5.js} +1 -1
  213. package/static/assets/select-D8HyxWyg.js +1 -0
  214. package/static/assets/shell-CjFT_Tl9.js +1 -0
  215. package/static/assets/sieve-C3Gn_uJK.js +1 -0
  216. package/static/assets/simple-mode-GW_nhZxv.js +1 -0
  217. package/static/assets/smalltalk-CnHTOXQT.js +1 -0
  218. package/static/assets/solr-DehyRSwq.js +1 -0
  219. package/static/assets/sparql-DkYu6x3z.js +1 -0
  220. package/static/assets/spreadsheet-BCZA_wO0.js +1 -0
  221. package/static/assets/sql-D0XecflT.js +1 -0
  222. package/static/assets/stex-C3f8Ysf7.js +1 -0
  223. package/static/assets/stylus-B533Al4x.js +1 -0
  224. package/static/assets/swift-BzpIVaGY.js +1 -0
  225. package/static/assets/{switch-LSkE6hx8.js → switch-Ck0OeSLk.js} +1 -1
  226. package/static/assets/tabs-CmFe8eVW.js +1 -0
  227. package/static/assets/{tag-B2iP7vv_.js → tag-BTjGQC_2.js} +1 -1
  228. package/static/assets/tcl-DVfN8rqt.js +1 -0
  229. package/static/assets/{terminal-preview-PyMHLXJ3.js → terminal-preview-BkQIuk__.js} +1 -1
  230. package/static/assets/textile-CnDTJFAw.js +1 -0
  231. package/static/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  232. package/static/assets/tiki-DGYXhP31.js +1 -0
  233. package/static/assets/toml-Bm5Em-hy.js +1 -0
  234. package/static/assets/troff-wAsdV37c.js +1 -0
  235. package/static/assets/ttcn-CfJYG6tj.js +1 -0
  236. package/static/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  237. package/static/assets/turtle-B1tBg_DP.js +1 -0
  238. package/static/assets/{use-terminal-Blvh8GLp.js → use-terminal-CrqBojgD.js} +1 -1
  239. package/static/assets/vb-CmGdzxic.js +1 -0
  240. package/static/assets/vbscript-BuJXcnF6.js +1 -0
  241. package/static/assets/velocity-D8B20fx6.js +1 -0
  242. package/static/assets/verilog-C6RDOZhf.js +1 -0
  243. package/static/assets/vhdl-lSbBsy5d.js +1 -0
  244. package/static/assets/{video-A2wzYKal.js → video-BlwRNgSo.js} +1 -1
  245. package/static/assets/webidl-ZXfAyPTL.js +1 -0
  246. package/static/assets/xquery-DzFWVndE.js +1 -0
  247. package/static/assets/yacas-BJ4BC0dw.js +1 -0
  248. package/static/assets/z80-Hz9HOZM7.js +1 -0
  249. package/static/index.html +2 -2
  250. package/dist/lib/auth/auth-manager.d.ts.map +0 -1
  251. package/dist/lib/auth/auth-manager.js.map +0 -1
  252. package/dist/lib/gait-path.d.ts.map +0 -1
  253. package/dist/lib/gait-path.js.map +0 -1
  254. package/dist/lib/git-settings.d.ts.map +0 -1
  255. package/dist/lib/git-settings.js.map +0 -1
  256. package/dist/lib/git.d.ts.map +0 -1
  257. package/dist/lib/git.js.map +0 -1
  258. package/dist/lib/jobs/global-job-scheduler.d.ts.map +0 -1
  259. package/dist/lib/jobs/global-job-scheduler.js.map +0 -1
  260. package/dist/lib/jobs/job-runner.d.ts.map +0 -1
  261. package/dist/lib/jobs/job-runner.js.map +0 -1
  262. package/dist/lib/jobs/job-scheduler.d.ts.map +0 -1
  263. package/dist/lib/jobs/job-scheduler.js.map +0 -1
  264. package/dist/lib/jobs/job-store.d.ts.map +0 -1
  265. package/dist/lib/jobs/job-store.js.map +0 -1
  266. package/dist/lib/project-paths.d.ts.map +0 -1
  267. package/dist/lib/project-paths.js.map +0 -1
  268. package/dist/lib/storage/file-storage.d.ts.map +0 -1
  269. package/dist/lib/storage/file-storage.js.map +0 -1
  270. package/dist/lib/symlinks/symlink-manager.d.ts.map +0 -1
  271. package/dist/lib/symlinks/symlink-manager.js.map +0 -1
  272. package/dist/lib/symlinks/types.d.ts.map +0 -1
  273. package/dist/lib/symlinks/types.js.map +0 -1
  274. package/dist/lib/terminal/context-helper.d.ts.map +0 -1
  275. package/dist/lib/terminal/context-helper.js.map +0 -1
  276. package/dist/lib/terminal/global-manager.d.ts.map +0 -1
  277. package/dist/lib/terminal/global-manager.js.map +0 -1
  278. package/dist/lib/terminal/shell-utils.d.ts.map +0 -1
  279. package/dist/lib/terminal/shell-utils.js.map +0 -1
  280. package/dist/lib/terminal/terminal-manager.d.ts.map +0 -1
  281. package/dist/lib/terminal/terminal-manager.js.map +0 -1
  282. package/dist/lib/user-preferences.d.ts.map +0 -1
  283. package/dist/lib/user-preferences.js.map +0 -1
  284. package/dist/middleware/auth.d.ts.map +0 -1
  285. package/dist/middleware/auth.js.map +0 -1
  286. package/dist/routes/api/v1/agents/[id]/index.d.ts.map +0 -1
  287. package/dist/routes/api/v1/agents/[id]/index.js.map +0 -1
  288. package/dist/routes/api/v1/agents/[id]/route.d.ts.map +0 -1
  289. package/dist/routes/api/v1/agents/[id]/route.js.map +0 -1
  290. package/dist/routes/api/v1/agents/index.d.ts.map +0 -1
  291. package/dist/routes/api/v1/agents/index.js.map +0 -1
  292. package/dist/routes/api/v1/agents/route.d.ts.map +0 -1
  293. package/dist/routes/api/v1/agents/route.js.map +0 -1
  294. package/dist/routes/api/v1/ai/index.d.ts.map +0 -1
  295. package/dist/routes/api/v1/ai/index.js.map +0 -1
  296. package/dist/routes/api/v1/ai/route.d.ts.map +0 -1
  297. package/dist/routes/api/v1/ai/route.js.map +0 -1
  298. package/dist/routes/api/v1/api-keys/index.d.ts.map +0 -1
  299. package/dist/routes/api/v1/api-keys/index.js.map +0 -1
  300. package/dist/routes/api/v1/api-keys/route.d.ts.map +0 -1
  301. package/dist/routes/api/v1/api-keys/route.js.map +0 -1
  302. package/dist/routes/api/v1/auth/index.d.ts.map +0 -1
  303. package/dist/routes/api/v1/auth/index.js.map +0 -1
  304. package/dist/routes/api/v1/auth/route.d.ts.map +0 -1
  305. package/dist/routes/api/v1/auth/route.js.map +0 -1
  306. package/dist/routes/api/v1/auth-settings/index.d.ts.map +0 -1
  307. package/dist/routes/api/v1/auth-settings/index.js.map +0 -1
  308. package/dist/routes/api/v1/auth-settings/route.d.ts.map +0 -1
  309. package/dist/routes/api/v1/auth-settings/route.js.map +0 -1
  310. package/dist/routes/api/v1/chats/[id]/index.d.ts.map +0 -1
  311. package/dist/routes/api/v1/chats/[id]/index.js.map +0 -1
  312. package/dist/routes/api/v1/chats/[id]/route.d.ts.map +0 -1
  313. package/dist/routes/api/v1/chats/[id]/route.js.map +0 -1
  314. package/dist/routes/api/v1/chats/index.d.ts.map +0 -1
  315. package/dist/routes/api/v1/chats/index.js.map +0 -1
  316. package/dist/routes/api/v1/chats/route.d.ts.map +0 -1
  317. package/dist/routes/api/v1/chats/route.js.map +0 -1
  318. package/dist/routes/api/v1/config/index.d.ts.map +0 -1
  319. package/dist/routes/api/v1/config/index.js.map +0 -1
  320. package/dist/routes/api/v1/config/route.d.ts.map +0 -1
  321. package/dist/routes/api/v1/config/route.js.map +0 -1
  322. package/dist/routes/api/v1/context/architecture/route.d.ts.map +0 -1
  323. package/dist/routes/api/v1/context/architecture/route.js.map +0 -1
  324. package/dist/routes/api/v1/context/index.d.ts.map +0 -1
  325. package/dist/routes/api/v1/context/index.js.map +0 -1
  326. package/dist/routes/api/v1/context/knowledge/[filename]/index.d.ts.map +0 -1
  327. package/dist/routes/api/v1/context/knowledge/[filename]/index.js.map +0 -1
  328. package/dist/routes/api/v1/context/knowledge/[filename]/route.d.ts.map +0 -1
  329. package/dist/routes/api/v1/context/knowledge/[filename]/route.js.map +0 -1
  330. package/dist/routes/api/v1/context/knowledge/index.d.ts.map +0 -1
  331. package/dist/routes/api/v1/context/knowledge/index.js.map +0 -1
  332. package/dist/routes/api/v1/context/knowledge/route.d.ts.map +0 -1
  333. package/dist/routes/api/v1/context/knowledge/route.js.map +0 -1
  334. package/dist/routes/api/v1/context/project/route.d.ts.map +0 -1
  335. package/dist/routes/api/v1/context/project/route.js.map +0 -1
  336. package/dist/routes/api/v1/git/index.d.ts.map +0 -1
  337. package/dist/routes/api/v1/git/index.js.map +0 -1
  338. package/dist/routes/api/v1/jobs/[id]/route.d.ts.map +0 -1
  339. package/dist/routes/api/v1/jobs/[id]/route.js.map +0 -1
  340. package/dist/routes/api/v1/jobs/[id]/run/route.d.ts.map +0 -1
  341. package/dist/routes/api/v1/jobs/[id]/run/route.js.map +0 -1
  342. package/dist/routes/api/v1/jobs/index.d.ts.map +0 -1
  343. package/dist/routes/api/v1/jobs/index.js.map +0 -1
  344. package/dist/routes/api/v1/jobs/route.d.ts.map +0 -1
  345. package/dist/routes/api/v1/jobs/route.js.map +0 -1
  346. package/dist/routes/api/v1/jobs/status/route.d.ts.map +0 -1
  347. package/dist/routes/api/v1/jobs/status/route.js.map +0 -1
  348. package/dist/routes/api/v1/mcp/index.d.ts.map +0 -1
  349. package/dist/routes/api/v1/mcp/index.js.map +0 -1
  350. package/dist/routes/api/v1/mcp/route.d.ts.map +0 -1
  351. package/dist/routes/api/v1/mcp/route.js.map +0 -1
  352. package/dist/routes/api/v1/proposals/[id]/route.d.ts.map +0 -1
  353. package/dist/routes/api/v1/proposals/[id]/route.js.map +0 -1
  354. package/dist/routes/api/v1/proposals/index.d.ts.map +0 -1
  355. package/dist/routes/api/v1/proposals/index.js.map +0 -1
  356. package/dist/routes/api/v1/proposals/route.d.ts.map +0 -1
  357. package/dist/routes/api/v1/proposals/route.js.map +0 -1
  358. package/dist/routes/api/v1/resources/[id]/index.d.ts.map +0 -1
  359. package/dist/routes/api/v1/resources/[id]/index.js.map +0 -1
  360. package/dist/routes/api/v1/resources/[id]/route.js.map +0 -1
  361. package/dist/routes/api/v1/resources/[id]/thumbnail/index.d.ts.map +0 -1
  362. package/dist/routes/api/v1/resources/[id]/thumbnail/index.js.map +0 -1
  363. package/dist/routes/api/v1/resources/[id]/thumbnail/route.js.map +0 -1
  364. package/dist/routes/api/v1/resources/index.d.ts.map +0 -1
  365. package/dist/routes/api/v1/resources/index.js.map +0 -1
  366. package/dist/routes/api/v1/resources/route.d.ts.map +0 -1
  367. package/dist/routes/api/v1/resources/route.js.map +0 -1
  368. package/dist/routes/api/v1/symlinks/index.d.ts.map +0 -1
  369. package/dist/routes/api/v1/symlinks/index.js.map +0 -1
  370. package/dist/routes/api/v1/symlinks/route.d.ts.map +0 -1
  371. package/dist/routes/api/v1/symlinks/route.js.map +0 -1
  372. package/dist/routes/api/v1/terminal/[proposalId]/create/index.d.ts.map +0 -1
  373. package/dist/routes/api/v1/terminal/[proposalId]/create/index.js.map +0 -1
  374. package/dist/routes/api/v1/terminal/[proposalId]/create/route.d.ts.map +0 -1
  375. package/dist/routes/api/v1/terminal/[proposalId]/create/route.js.map +0 -1
  376. package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.d.ts.map +0 -1
  377. package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.js.map +0 -1
  378. package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.d.ts.map +0 -1
  379. package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.js.map +0 -1
  380. package/dist/routes/api/v1/terminal/[proposalId]/resize/index.d.ts.map +0 -1
  381. package/dist/routes/api/v1/terminal/[proposalId]/resize/index.js.map +0 -1
  382. package/dist/routes/api/v1/terminal/[proposalId]/resize/route.d.ts.map +0 -1
  383. package/dist/routes/api/v1/terminal/[proposalId]/resize/route.js.map +0 -1
  384. package/dist/routes/api/v1/terminal/sessions/index.d.ts.map +0 -1
  385. package/dist/routes/api/v1/terminal/sessions/index.js.map +0 -1
  386. package/dist/routes/api/v1/terminal/sessions/route.d.ts.map +0 -1
  387. package/dist/routes/api/v1/terminal/sessions/route.js.map +0 -1
  388. package/dist/routes/api/v1/user/index.d.ts.map +0 -1
  389. package/dist/routes/api/v1/user/index.js.map +0 -1
  390. package/dist/routes/api/v1/user/settings/index.d.ts.map +0 -1
  391. package/dist/routes/api/v1/user/settings/index.js.map +0 -1
  392. package/dist/routes/api/v1/user/settings/route.d.ts.map +0 -1
  393. package/dist/routes/api/v1/user/settings/route.js.map +0 -1
  394. package/dist/server-with-static.d.ts.map +0 -1
  395. package/dist/server-with-static.js.map +0 -1
  396. package/dist/server.d.ts.map +0 -1
  397. package/dist/server.js.map +0 -1
  398. package/static/assets/ActivityPage-DC2t-Kyv.js +0 -1
  399. package/static/assets/ArchitectureEditPage-B5dNFxvL.js +0 -21
  400. package/static/assets/ArchitecturePage-D796d-Je.js +0 -1
  401. package/static/assets/CodePage-xbYipiBR.js +0 -2
  402. package/static/assets/DashboardPage-Aw1xWH4M.js +0 -51
  403. package/static/assets/IntegrationsSettingsPage-Ds16sLG2.js +0 -1
  404. package/static/assets/KnowledgeDetailPage-D94ukozt.js +0 -1
  405. package/static/assets/KnowledgeEditPage-DpjdauND.js +0 -1
  406. package/static/assets/NewKnowledgePage-EqWKQ4lU.js +0 -9
  407. package/static/assets/NotificationsSettingsPage-BzVS1D5M.js +0 -1
  408. package/static/assets/ProjectEditPage-BlQk50Xs.js +0 -11
  409. package/static/assets/PromptsSettingsPage-DWEKgvMD.js +0 -1
  410. package/static/assets/RoleEditPage-m6lOchyA.js +0 -13
  411. package/static/assets/SchedulePage-DUSxe93C.js +0 -4
  412. package/static/assets/TaskEditPage-Dpsi2Rcp.js +0 -1
  413. package/static/assets/TerminalSessionPage-B6_ssmNM.js +0 -8
  414. package/static/assets/UserPreferencesPage-CY_0CoMe.js +0 -1
  415. package/static/assets/UtilitiesPage-e4IaR2YV.js +0 -1
  416. package/static/assets/index-CHdBxVyk.css +0 -2
  417. package/static/assets/kiro-CGoI3Dqh.js +0 -17
  418. package/static/assets/markdown-editor-C-DC0mFI.js +0 -62
  419. package/static/assets/markdown-editor-DUEthZ0y.css +0 -1
  420. package/static/assets/select-Dp3J_OE9.js +0 -1
  421. package/static/assets/tabs-etlvrbtm.js +0 -1
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs/promises';
2
2
  import path from 'path';
3
- import bcrypt from 'bcrypt';
3
+ import bcrypt from 'bcryptjs';
4
4
  import jwt from 'jsonwebtoken';
5
5
  import crypto from 'crypto';
6
6
  import { getAuthConfigPath } from '@lovelybunch/core';
@@ -0,0 +1,39 @@
1
+ /**
2
+ * MCP Client helper for connecting to HTTP/SSE MCP servers
3
+ * Provides tool discovery and execution proxying
4
+ */
5
+ export interface McpServerConfig {
6
+ name?: string;
7
+ type?: 'http' | 'sse' | 'stdio';
8
+ url?: string;
9
+ enabled?: boolean;
10
+ env?: Record<string, string>;
11
+ }
12
+ export interface DiscoveredTool {
13
+ name: string;
14
+ description?: string;
15
+ inputSchema?: object;
16
+ serverName: string;
17
+ serverUrl: string;
18
+ }
19
+ export interface ToolCallResult {
20
+ content: Array<{
21
+ type: string;
22
+ text?: string;
23
+ [key: string]: unknown;
24
+ }>;
25
+ isError?: boolean;
26
+ structuredContent?: unknown;
27
+ }
28
+ /**
29
+ * Connect to an HTTP/SSE MCP server and discover its available tools
30
+ */
31
+ export declare function discoverToolsFromServer(serverName: string, config: McpServerConfig): Promise<DiscoveredTool[]>;
32
+ /**
33
+ * Execute a tool on an HTTP/SSE MCP server
34
+ */
35
+ export declare function executeToolOnServer(serverName: string, config: McpServerConfig, toolName: string, args: Record<string, unknown>): Promise<ToolCallResult>;
36
+ /**
37
+ * Close all cached client connections (for cleanup)
38
+ */
39
+ export declare function closeAllConnections(): void;
@@ -0,0 +1,131 @@
1
+ /**
2
+ * MCP Client helper for connecting to HTTP/SSE MCP servers
3
+ * Provides tool discovery and execution proxying
4
+ */
5
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
6
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
7
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
8
+ // Cache for active client connections
9
+ const clientCache = new Map();
10
+ // Clean up stale connections after 5 minutes
11
+ const CONNECTION_TTL_MS = 5 * 60 * 1000;
12
+ /**
13
+ * Get or create a client connection to an MCP server
14
+ */
15
+ async function getOrCreateClient(serverName, config) {
16
+ const cacheKey = `${serverName}:${config.url}`;
17
+ const cached = clientCache.get(cacheKey);
18
+ if (cached) {
19
+ cached.lastUsed = Date.now();
20
+ return cached.client;
21
+ }
22
+ const client = new Client({
23
+ name: 'coconut-api',
24
+ version: '1.0.0'
25
+ });
26
+ const url = new URL(config.url);
27
+ // Try StreamableHTTP first (newer), fall back to SSE (legacy)
28
+ let transport;
29
+ if (config.type === 'sse') {
30
+ // Explicitly SSE
31
+ transport = new SSEClientTransport(url);
32
+ }
33
+ else {
34
+ // Default to StreamableHTTP for 'http' type or unspecified
35
+ transport = new StreamableHTTPClientTransport(url);
36
+ }
37
+ await client.connect(transport);
38
+ clientCache.set(cacheKey, { client, lastUsed: Date.now() });
39
+ // Schedule cleanup
40
+ scheduleCleanup();
41
+ return client;
42
+ }
43
+ let cleanupScheduled = false;
44
+ function scheduleCleanup() {
45
+ if (cleanupScheduled)
46
+ return;
47
+ cleanupScheduled = true;
48
+ setTimeout(() => {
49
+ cleanupScheduled = false;
50
+ const now = Date.now();
51
+ for (const [key, entry] of clientCache.entries()) {
52
+ if (now - entry.lastUsed > CONNECTION_TTL_MS) {
53
+ try {
54
+ entry.client.close();
55
+ }
56
+ catch (e) {
57
+ // Ignore close errors
58
+ }
59
+ clientCache.delete(key);
60
+ }
61
+ }
62
+ // Reschedule if there are still cached connections
63
+ if (clientCache.size > 0) {
64
+ scheduleCleanup();
65
+ }
66
+ }, CONNECTION_TTL_MS);
67
+ }
68
+ /**
69
+ * Connect to an HTTP/SSE MCP server and discover its available tools
70
+ */
71
+ export async function discoverToolsFromServer(serverName, config) {
72
+ if (!config.url) {
73
+ throw new Error(`Server ${serverName} has no URL configured`);
74
+ }
75
+ if (config.enabled === false) {
76
+ return [];
77
+ }
78
+ try {
79
+ const client = await getOrCreateClient(serverName, config);
80
+ const toolsResult = await client.listTools();
81
+ return toolsResult.tools.map(tool => ({
82
+ name: tool.name,
83
+ description: tool.description,
84
+ inputSchema: tool.inputSchema,
85
+ serverName,
86
+ serverUrl: config.url
87
+ }));
88
+ }
89
+ catch (error) {
90
+ console.error(`Failed to discover tools from ${serverName}:`, error);
91
+ throw error;
92
+ }
93
+ }
94
+ /**
95
+ * Execute a tool on an HTTP/SSE MCP server
96
+ */
97
+ export async function executeToolOnServer(serverName, config, toolName, args) {
98
+ if (!config.url) {
99
+ throw new Error(`Server ${serverName} has no URL configured`);
100
+ }
101
+ try {
102
+ const client = await getOrCreateClient(serverName, config);
103
+ const result = await client.callTool({
104
+ name: toolName,
105
+ arguments: args
106
+ });
107
+ return {
108
+ content: result.content,
109
+ isError: result.isError,
110
+ structuredContent: result.structuredContent
111
+ };
112
+ }
113
+ catch (error) {
114
+ console.error(`Failed to execute tool ${toolName} on ${serverName}:`, error);
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * Close all cached client connections (for cleanup)
120
+ */
121
+ export function closeAllConnections() {
122
+ for (const [key, entry] of clientCache.entries()) {
123
+ try {
124
+ entry.client.close();
125
+ }
126
+ catch (e) {
127
+ // Ignore close errors
128
+ }
129
+ clientCache.delete(key);
130
+ }
131
+ }
@@ -2,10 +2,37 @@ import * as pty from 'node-pty';
2
2
  import { WebSocket } from 'ws';
3
3
  import path from 'path';
4
4
  import fs from 'fs';
5
+ import { fileURLToPath } from 'url';
5
6
  import { createInitScript } from './context-helper.js';
6
7
  import { getShellPath, getShellArgs, prepareShellInit } from './shell-utils.js';
7
8
  import { getLogger, AgentKinds } from '@lovelybunch/core/logging';
8
9
  import { getInjectedEnv } from '../env-injection.js';
10
+ /**
11
+ * Workaround for node-pty#850: macOS prebuilds (v1.1.0+) ship spawn-helper
12
+ * without the execute bit, causing posix_spawnp to fail.
13
+ * https://github.com/microsoft/node-pty/issues/850
14
+ */
15
+ function ensureSpawnHelperPermissions() {
16
+ if (process.platform !== 'darwin')
17
+ return;
18
+ try {
19
+ const nodePtyEntry = import.meta.resolve('node-pty');
20
+ const nodePtyDir = path.resolve(fileURLToPath(nodePtyEntry), '..', '..');
21
+ for (const arch of ['darwin-arm64', 'darwin-x64']) {
22
+ const helperPath = path.join(nodePtyDir, 'prebuilds', arch, 'spawn-helper');
23
+ if (fs.existsSync(helperPath)) {
24
+ const stats = fs.statSync(helperPath);
25
+ if (!(stats.mode & 0o111)) {
26
+ fs.chmodSync(helperPath, 0o755);
27
+ }
28
+ }
29
+ }
30
+ }
31
+ catch {
32
+ // Best-effort; node-pty 1.0.0 has no prebuilds dir and this is a no-op
33
+ }
34
+ }
35
+ let spawnHelperFixed = false;
9
36
  export class TerminalManager {
10
37
  sessions = new Map();
11
38
  cleanupInterval;
@@ -17,6 +44,10 @@ export class TerminalManager {
17
44
  }, 5 * 60 * 1000);
18
45
  }
19
46
  async createSession(taskId, shellPreference = 'bash', startupCommand) {
47
+ if (!spawnHelperFixed) {
48
+ ensureSpawnHelperPermissions();
49
+ spawnHelperFixed = true;
50
+ }
20
51
  const sessionId = `${taskId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
21
52
  // Get the project root directory
22
53
  let projectRoot;
@@ -7,7 +7,7 @@ import { ZodError } from 'zod';
7
7
  import { streamText, tool, jsonSchema, stepCountIs } from 'ai';
8
8
  import { createAnthropic } from '@ai-sdk/anthropic';
9
9
  import { getLogsDir, listTasks, getTask, createTask, updateTask, deleteTask, } from '@lovelybunch/core';
10
- import { tasksFullTool, knowledgeTool, normalizeKnowledgeMetadata, eventsTool, projectContextTool, architectureContextTool, roleContextTool, resourcesTool } from '@lovelybunch/mcp';
10
+ import { tasksFullTool, knowledgeTool, normalizeKnowledgeMetadata, eventsTool, projectContextTool, architectureContextTool, roleContextTool, resourcesTool, listConnectorsTool, connectorRequestTool, resolveConnectorUrl } from '@lovelybunch/mcp';
11
11
  import matter from 'gray-matter';
12
12
  import Fuse from 'fuse.js';
13
13
  import { FileStorageAdapter } from '../../../../lib/storage/file-storage.js';
@@ -152,6 +152,22 @@ export async function POST(c) {
152
152
  return JSON.stringify(result);
153
153
  },
154
154
  }),
155
+ list_connectors: tool({
156
+ description: listConnectorsTool.description,
157
+ inputSchema: jsonSchema(listConnectorsTool.parameters),
158
+ execute: async () => {
159
+ const result = await executeListConnectorsToolDirect();
160
+ return JSON.stringify(result);
161
+ },
162
+ }),
163
+ connector_request: tool({
164
+ description: connectorRequestTool.description,
165
+ inputSchema: jsonSchema(connectorRequestTool.parameters),
166
+ execute: async (args) => {
167
+ const result = await executeConnectorRequestToolDirect(args);
168
+ return JSON.stringify(result);
169
+ },
170
+ }),
155
171
  };
156
172
  // Debug logging
157
173
  console.log('AI Request Debug:', {
@@ -1362,3 +1378,122 @@ function getSystemPrompt() {
1362
1378
  }
1363
1379
  return basePrompt;
1364
1380
  }
1381
+ const COCONUT_HOST = 'https://app.coconut.dev';
1382
+ async function executeListConnectorsToolDirect() {
1383
+ const token = getGlobalApiKey('callbackToken');
1384
+ if (!token) {
1385
+ return {
1386
+ success: false,
1387
+ error: 'Callback token not configured. Set it via Settings > API Keys or PUT /api/v1/config?type=global with { "apiKeys": { "callbackToken": "cpt_xxx" } }'
1388
+ };
1389
+ }
1390
+ try {
1391
+ const res = await fetch(`${COCONUT_HOST}/api/connectors/accounts`, {
1392
+ headers: { 'X-Callback-Token': token }
1393
+ });
1394
+ if (!res.ok) {
1395
+ const body = await res.text().catch(() => '');
1396
+ return { success: false, error: `Control plane returned ${res.status}: ${body || res.statusText}` };
1397
+ }
1398
+ const data = await res.json();
1399
+ const accounts = Array.isArray(data) ? data : (data.accounts ?? data.data ?? []);
1400
+ return {
1401
+ success: true,
1402
+ data: accounts,
1403
+ count: accounts.length,
1404
+ message: `Found ${accounts.length} connected service${accounts.length === 1 ? '' : 's'}`
1405
+ };
1406
+ }
1407
+ catch (error) {
1408
+ return { success: false, error: error.message || 'Failed to list connectors' };
1409
+ }
1410
+ }
1411
+ async function executeConnectorRequestToolDirect(args) {
1412
+ const { app: appSlug, method, path: apiPath, body, headers: extraHeaders } = args;
1413
+ if (!appSlug || !method || !apiPath) {
1414
+ return { success: false, error: 'app, method, and path are required' };
1415
+ }
1416
+ const token = getGlobalApiKey('callbackToken');
1417
+ if (!token) {
1418
+ return {
1419
+ success: false,
1420
+ error: 'Callback token not configured. Set it via Settings > API Keys or PUT /api/v1/config?type=global with { "apiKeys": { "callbackToken": "cpt_xxx" } }'
1421
+ };
1422
+ }
1423
+ try {
1424
+ const accountsRes = await fetch(`${COCONUT_HOST}/api/connectors/accounts`, {
1425
+ headers: { 'X-Callback-Token': token }
1426
+ });
1427
+ if (!accountsRes.ok) {
1428
+ const errBody = await accountsRes.text().catch(() => '');
1429
+ return { success: false, error: `Failed to fetch accounts (${accountsRes.status}): ${errBody || accountsRes.statusText}` };
1430
+ }
1431
+ const accountsData = await accountsRes.json();
1432
+ const accounts = Array.isArray(accountsData) ? accountsData : (accountsData.accounts ?? accountsData.data ?? []);
1433
+ const account = accounts.find((a) => a.appSlug === appSlug || a.appName?.toLowerCase() === appSlug.toLowerCase());
1434
+ if (!account) {
1435
+ return {
1436
+ success: false,
1437
+ error: `No connected account found for "${appSlug}"`,
1438
+ available: accounts.map((a) => a.appSlug || a.appName)
1439
+ };
1440
+ }
1441
+ const url = resolveConnectorUrl(appSlug, apiPath);
1442
+ if (!url) {
1443
+ return {
1444
+ success: false,
1445
+ error: `Unknown app "${appSlug}" and path is not a full URL. Use a full URL (https://...) or a known app slug.`
1446
+ };
1447
+ }
1448
+ let parsedBody = undefined;
1449
+ if (body) {
1450
+ try {
1451
+ parsedBody = typeof body === 'string' ? JSON.parse(body) : body;
1452
+ }
1453
+ catch {
1454
+ return { success: false, error: 'Invalid JSON in body parameter' };
1455
+ }
1456
+ }
1457
+ let parsedHeaders = {};
1458
+ if (extraHeaders) {
1459
+ try {
1460
+ parsedHeaders = typeof extraHeaders === 'string' ? JSON.parse(extraHeaders) : extraHeaders;
1461
+ }
1462
+ catch {
1463
+ return { success: false, error: 'Invalid JSON in headers parameter' };
1464
+ }
1465
+ }
1466
+ const proxyPayload = {
1467
+ accountId: account.accountId,
1468
+ url,
1469
+ method: method.toUpperCase()
1470
+ };
1471
+ if (parsedBody !== undefined)
1472
+ proxyPayload.body = parsedBody;
1473
+ if (Object.keys(parsedHeaders).length > 0)
1474
+ proxyPayload.headers = parsedHeaders;
1475
+ const proxyRes = await fetch(`${COCONUT_HOST}/api/connectors/proxy`, {
1476
+ method: 'POST',
1477
+ headers: {
1478
+ 'Content-Type': 'application/json',
1479
+ 'X-Callback-Token': token
1480
+ },
1481
+ body: JSON.stringify(proxyPayload)
1482
+ });
1483
+ if (!proxyRes.ok) {
1484
+ const errBody = await proxyRes.text().catch(() => '');
1485
+ return { success: false, error: `Proxy request failed (${proxyRes.status}): ${errBody || proxyRes.statusText}` };
1486
+ }
1487
+ const responseData = await proxyRes.json().catch(async () => {
1488
+ return await proxyRes.text().catch(() => null);
1489
+ });
1490
+ return {
1491
+ success: true,
1492
+ data: responseData,
1493
+ message: `${method.toUpperCase()} ${apiPath} via ${appSlug}`
1494
+ };
1495
+ }
1496
+ catch (error) {
1497
+ return { success: false, error: error.message || 'Connector request failed' };
1498
+ }
1499
+ }