@lovelybunch/api 1.0.76-alpha.1 → 1.0.76-alpha.11

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 (543) hide show
  1. package/dist/lib/auth/auth-manager.js +1 -1
  2. package/dist/lib/git.d.ts +3 -0
  3. package/dist/lib/git.js +35 -0
  4. package/dist/lib/mcp-client.d.ts +39 -0
  5. package/dist/lib/mcp-client.js +131 -0
  6. package/dist/lib/terminal/terminal-manager.js +31 -0
  7. package/dist/routes/api/v1/ai/route.js +136 -1
  8. package/dist/routes/api/v1/ai/tools.js +49 -232
  9. package/dist/routes/api/v1/config/route.js +13 -9
  10. package/dist/routes/api/v1/context/agents/route.d.ts +3 -0
  11. package/dist/routes/api/v1/context/agents/route.js +159 -0
  12. package/dist/routes/api/v1/context/index.js +6 -0
  13. package/dist/routes/api/v1/context/memory/route.d.ts +3 -0
  14. package/dist/routes/api/v1/context/memory/route.js +163 -0
  15. package/dist/routes/api/v1/context/team/route.d.ts +3 -0
  16. package/dist/routes/api/v1/context/team/route.js +159 -0
  17. package/dist/routes/api/v1/git/index.js +27 -1
  18. package/dist/routes/api/v1/knowledge/route.js +26 -32
  19. package/dist/routes/api/v1/mail/route.d.ts +3 -3
  20. package/dist/routes/api/v1/mcp/index.js +170 -4
  21. package/dist/routes/api/v1/proposals/[id]/route.d.ts +10 -24
  22. package/dist/routes/api/v1/proposals/[id]/route.js +10 -1
  23. package/dist/routes/api/v1/proposals/route.d.ts +2 -16
  24. package/dist/routes/api/v1/proposals/route.js +11 -8
  25. package/dist/routes/api/v1/resources/generate/route.js +10 -3
  26. package/dist/routes/api/v1/tasks/route.d.ts +18 -38
  27. package/dist/routes/api/v1/tasks/route.js +94 -16
  28. package/dist/routes/api/v1/terminal/[proposalId]/create/route.js +2 -2
  29. package/dist/routes/api/v1/terminal/code/index.d.ts +3 -0
  30. package/dist/routes/api/v1/terminal/code/index.js +5 -0
  31. package/dist/routes/api/v1/terminal/code/route.d.ts +14 -0
  32. package/dist/routes/api/v1/terminal/code/route.js +159 -0
  33. package/dist/server-with-static.js +2 -0
  34. package/dist/server.js +2 -0
  35. package/package.json +6 -7
  36. package/static/assets/ActivityPage-CUPUsmhW.js +1 -0
  37. package/static/assets/ActivityPage-DGW0f70r.js +1 -0
  38. package/static/assets/AgentsContextEditPage-CBZaG033.js +9 -0
  39. package/static/assets/AgentsContextEditPage-CJbx9qwA.js +9 -0
  40. package/static/assets/AgentsContextPage-BWzSvM5V.js +1 -0
  41. package/static/assets/AgentsContextPage-C1wcPVUs.js +1 -0
  42. package/static/assets/{ApiKeysSettingsPage-DbXgxh7i.js → ApiKeysSettingsPage-CauZEPsx.js} +2 -2
  43. package/static/assets/ApiKeysSettingsPage-Ceww_YUR.js +2 -0
  44. package/static/assets/ArchitectureEditPage-DZhYQihz.js +15 -0
  45. package/static/assets/ArchitectureEditPage-Dk8NNc4k.js +15 -0
  46. package/static/assets/ArchitecturePage-Cvj4j0Mo.js +1 -0
  47. package/static/assets/ArchitecturePage-D0gLaPg5.js +1 -0
  48. package/static/assets/{AuthSettingsPage-nIgM05Yw.js → AuthSettingsPage-22eaC7la.js} +2 -2
  49. package/static/assets/AuthSettingsPage-BHPV0uSB.js +11 -0
  50. package/static/assets/{CallbackPage-NNbLun2S.js → CallbackPage-DCf0WTl0.js} +1 -1
  51. package/static/assets/CallbackPage-buKCnkYC.js +1 -0
  52. package/static/assets/CodePage-CuyF2xDA.js +2 -0
  53. package/static/assets/CodePage-x32C4yuN.js +2 -0
  54. package/static/assets/{CollapsibleSection-DbKW4cyU.js → CollapsibleSection-CUHXgJIe.js} +1 -1
  55. package/static/assets/CollapsibleSection-DMf0wWjc.js +1 -0
  56. package/static/assets/DashboardPage-DIU-4dPO.js +41 -0
  57. package/static/assets/DashboardPage-Dr4S3wVm.js +41 -0
  58. package/static/assets/{GitPage-Hi0mdDOi.js → GitPage-BGHRNljT.js} +4 -4
  59. package/static/assets/GitPage-DpCcZosR.js +16 -0
  60. package/static/assets/{GitSettingsPage-2vuCM-U-.js → GitSettingsPage-A4ty6ftB.js} +2 -2
  61. package/static/assets/GitSettingsPage-BRuP4Ihk.js +6 -0
  62. package/static/assets/{IdentityPage-2BzLc2EI.js → IdentityPage-4xn0DPW8.js} +2 -2
  63. package/static/assets/IdentityPage-Bps9Zjk3.js +6 -0
  64. package/static/assets/{ImplementationStepsEditor-BlmI5YuN.js → ImplementationStepsEditor-CaMsbJPb.js} +2 -2
  65. package/static/assets/ImplementationStepsEditor-KJkRc2Jn.js +6 -0
  66. package/static/assets/IntegrationsSettingsPage-B1sX003q.js +1 -0
  67. package/static/assets/IntegrationsSettingsPage-CpTuAA-H.js +1 -0
  68. package/static/assets/{JobDetailPage-CLEY1Z5e.js → JobDetailPage-BdYlGn4G.js} +1 -1
  69. package/static/assets/JobDetailPage-C5N3IyX3.js +1 -0
  70. package/static/assets/KnowledgeDetailPage-Dvk-QAJJ.js +1 -0
  71. package/static/assets/KnowledgeDetailPage-Dy0M4FgC.js +1 -0
  72. package/static/assets/KnowledgeEditPage-CN0wPWMV.js +1 -0
  73. package/static/assets/KnowledgeEditPage-DEP0bweP.js +1 -0
  74. package/static/assets/KnowledgePage-BLe2lXja.js +3 -0
  75. package/static/assets/{KnowledgePage-D-ahboFK.js → KnowledgePage-_bvnWXPU.js} +2 -2
  76. package/static/assets/{LoginPage-DQ2rJliF.js → LoginPage-BkZt_pMw.js} +1 -1
  77. package/static/assets/LoginPage-VfOnXGad.js +1 -0
  78. package/static/assets/{MailInboxPage-Bfh0_pBU.js → MailInboxPage-DklkHMyO.js} +1 -1
  79. package/static/assets/MailInboxPage-UF82OTOE.js +1 -0
  80. package/static/assets/{MailProcessingModal-NF9kjdgr.js → MailProcessingModal-BHFYVTQc.js} +2 -2
  81. package/static/assets/MailProcessingModal-rKHRB-wC.js +6 -0
  82. package/static/assets/{MailReadPage-C0QhDa1x.js → MailReadPage-B-vLDq-6.js} +1 -1
  83. package/static/assets/MailReadPage-mg3Wqvqh.js +1 -0
  84. package/static/assets/{MailSentPage-Ctgcp1RB.js → MailSentPage-DIJJ8I5v.js} +1 -1
  85. package/static/assets/MailSentPage-OJeb1vU9.js +1 -0
  86. package/static/assets/{McpSettingsPage-CFgpw5_r.js → McpSettingsPage-CgOnXuHZ.js} +1 -1
  87. package/static/assets/McpSettingsPage-Mi2-nB-i.js +1 -0
  88. package/static/assets/MemoryEditPage-CR6SmDXU.js +13 -0
  89. package/static/assets/MemoryEditPage-D8i7XQ5l.js +13 -0
  90. package/static/assets/MemoryPage-BcWVGuiS.js +1 -0
  91. package/static/assets/MemoryPage-vbCtMG4L.js +1 -0
  92. package/static/assets/NewKnowledgePage-BE4X0pSc.js +1 -0
  93. package/static/assets/NewKnowledgePage-CL3dpMwb.js +1 -0
  94. package/static/assets/{NewSkillPage-CvBSXZFE.js → NewSkillPage-B3prwJ_n.js} +1 -1
  95. package/static/assets/NewSkillPage-BCJ68pFK.js +1 -0
  96. package/static/assets/{NewTaskPage-DRL-pyjV.js → NewTaskPage-DszXfHrv.js} +2 -2
  97. package/static/assets/NewTaskPage-vj0LvAb_.js +91 -0
  98. package/static/assets/{NotFoundPage-DW0gfvNA.js → NotFoundPage-D3K7UoeF.js} +1 -1
  99. package/static/assets/NotFoundPage-DqwQiMc8.js +6 -0
  100. package/static/assets/NotificationsSettingsPage-BSuXKPiG.js +1 -0
  101. package/static/assets/NotificationsSettingsPage-C4Gthita.js +1 -0
  102. package/static/assets/ProjectEditPage-DTdhZKQg.js +11 -0
  103. package/static/assets/ProjectEditPage-ia6zDqUf.js +11 -0
  104. package/static/assets/{ProjectPage-78a-iVFG.js → ProjectPage-BIk487-h.js} +1 -1
  105. package/static/assets/ProjectPage-DJ5wGekX.js +1 -0
  106. package/static/assets/PromptsSettingsPage-4iJoggN0.js +1 -0
  107. package/static/assets/PromptsSettingsPage-COjiXPsT.js +1 -0
  108. package/static/assets/{ResourceDetailPage-CLcuo4yw.js → ResourceDetailPage-DJN3Rax4.js} +1 -1
  109. package/static/assets/ResourceDetailPage-DKs83OyV.js +1 -0
  110. package/static/assets/ResourcesPage-CO45MzEx.js +41 -0
  111. package/static/assets/ResourcesPage-DF8x1i_a.js +41 -0
  112. package/static/assets/RoleEditPage-B0pm5rVn.js +13 -0
  113. package/static/assets/RoleEditPage-CBl-M2s3.js +13 -0
  114. package/static/assets/{RolePage-haUf186q.js → RolePage-B7JswOZC.js} +1 -1
  115. package/static/assets/RolePage-IVBtcgCf.js +1 -0
  116. package/static/assets/{RulesSettingsPage-Cc8rvAvm.js → RulesSettingsPage-CB6YdyhI.js} +2 -2
  117. package/static/assets/RulesSettingsPage-CKUt1JkO.js +16 -0
  118. package/static/assets/SchedulePage-TCeGDlnw.js +4 -0
  119. package/static/assets/SchedulePage-_NAbasKs.js +4 -0
  120. package/static/assets/{SkillDetailPage-BqhoNNkM.js → SkillDetailPage-7EzSwjPh.js} +1 -1
  121. package/static/assets/SkillDetailPage-jTeSohec.js +1 -0
  122. package/static/assets/{SkillEditPage-cpSdv9D4.js → SkillEditPage-CpouyjFV.js} +1 -1
  123. package/static/assets/SkillEditPage-D_e69AQk.js +1 -0
  124. package/static/assets/{SkillsPage-Cxkm5ymf.js → SkillsPage-DP8zSnPo.js} +2 -2
  125. package/static/assets/SkillsPage-xfv43oJ4.js +8 -0
  126. package/static/assets/{SkillsSettingsPage-DrmRher8.js → SkillsSettingsPage-CktzJBa7.js} +1 -1
  127. package/static/assets/SkillsSettingsPage-jhNVgVSA.js +1 -0
  128. package/static/assets/{SourceInput-C0WkiXS6.js → SourceInput-CQnyDxzl.js} +1 -1
  129. package/static/assets/SourceInput-KeAQ1PMl.js +1 -0
  130. package/static/assets/{TagInput-raThOrbG.js → TagInput-DoO2Dwj6.js} +1 -1
  131. package/static/assets/TagInput-ZyP8Rq8B.js +1 -0
  132. package/static/assets/{TaskDetailPage-BMzce3uJ.js → TaskDetailPage-C6xKC_IM.js} +2 -2
  133. package/static/assets/TaskDetailPage-z557zwfE.js +16 -0
  134. package/static/assets/TaskEditPage-DPLOeh7K.js +1 -0
  135. package/static/assets/TaskEditPage-XuWzVm-k.js +1 -0
  136. package/static/assets/{TasksPage-CxKJQJ1_.js → TasksPage-C-toKZIZ.js} +3 -3
  137. package/static/assets/TasksPage-CwfLwTAV.js +17 -0
  138. package/static/assets/TeamEditPage-B8qk6fWu.js +9 -0
  139. package/static/assets/TeamEditPage-Dk7Yxh1i.js +9 -0
  140. package/static/assets/TeamPage-CQ4EE1rP.js +1 -0
  141. package/static/assets/TeamPage-Dmrjf_RA.js +1 -0
  142. package/static/assets/{TerminalPage-BWdNoEM5.js → TerminalPage-C0CSp8st.js} +1 -1
  143. package/static/assets/TerminalPage-Y59DZGfZ.js +1 -0
  144. package/static/assets/TerminalSessionPage-BQOMLYPX.js +3 -0
  145. package/static/assets/TerminalSessionPage-HvnYJEpU.js +3 -0
  146. package/static/assets/UserPreferencesPage-1l5T8TaE.js +1 -0
  147. package/static/assets/UserPreferencesPage-BSIvW5UI.js +1 -0
  148. package/static/assets/{UserSettingsPage-CqooRxDi.js → UserSettingsPage-CS7BrEZJ.js} +1 -1
  149. package/static/assets/UserSettingsPage-o4ikmR9k.js +1 -0
  150. package/static/assets/UtilitiesPage-D1YCA1eC.js +1 -0
  151. package/static/assets/UtilitiesPage-O5kjW0V2.js +1 -0
  152. package/static/assets/{alert-BGFBZOrZ.js → alert-DOfUEE4H.js} +1 -1
  153. package/static/assets/alert-u79hLEuY.js +1 -0
  154. package/static/assets/apl-B4CMkyY2.js +1 -0
  155. package/static/assets/{arrow-down-DXhs3vvo.js → arrow-down-DumN-Nal.js} +1 -1
  156. package/static/assets/arrow-down-Y539lEoZ.js +6 -0
  157. package/static/assets/{arrow-left-PEX5RePT.js → arrow-left-B_QwfLPP.js} +1 -1
  158. package/static/assets/arrow-left-DmNgC0xD.js +6 -0
  159. package/static/assets/{arrow-up-D7z0QZsQ.js → arrow-up-B3Oj7MxZ.js} +1 -1
  160. package/static/assets/arrow-up-BbDrY9nh.js +6 -0
  161. package/static/assets/{arrow-up-down-OTrzDHIL.js → arrow-up-down-D8T0kR2Q.js} +1 -1
  162. package/static/assets/arrow-up-down-DDTTwJEF.js +6 -0
  163. package/static/assets/asciiarmor-Df11BRmG.js +1 -0
  164. package/static/assets/asn1-EdZsLKOL.js +1 -0
  165. package/static/assets/asterisk-B-8jnY81.js +1 -0
  166. package/static/assets/{badge-rki-Xf0E.js → badge-BmHXIBBB.js} +1 -1
  167. package/static/assets/badge-BzEwwrAP.js +1 -0
  168. package/static/assets/brainfuck-C4LP7Hcl.js +1 -0
  169. package/static/assets/{browser-modal-BKnqJnf5.js → browser-modal-4AfJ98X7.js} +2 -2
  170. package/static/assets/browser-modal-CY4F-Mm8.js +6 -0
  171. package/static/assets/{card-_Grh-Otl.js → card-BpqK1BMM.js} +1 -1
  172. package/static/assets/card-Btt3HmXT.js +1 -0
  173. package/static/assets/{chevron-left-LQtIDk73.js → chevron-left-CSCdB-iz.js} +1 -1
  174. package/static/assets/chevron-left-DztJMlwc.js +6 -0
  175. package/static/assets/{chevron-up-BM1GKhAV.js → chevron-up-DaWWwb87.js} +1 -1
  176. package/static/assets/chevron-up-gnoSEbf_.js +6 -0
  177. package/static/assets/{chevrons-up-Ccej0FyZ.js → chevrons-up-B2GdB4F7.js} +1 -1
  178. package/static/assets/chevrons-up-D7gsSI9g.js +11 -0
  179. package/static/assets/{circle-alert-C5k9mZfC.js → circle-alert-CQ-Ir4mS.js} +1 -1
  180. package/static/assets/circle-alert-Coa2ulVd.js +6 -0
  181. package/static/assets/{circle-check-fwIZxHsK.js → circle-check-01UufaGN.js} +1 -1
  182. package/static/assets/circle-check-C9wy7OAO.js +6 -0
  183. package/static/assets/{circle-check-big-BaFefwt0.js → circle-check-big-CVbQ_zpj.js} +1 -1
  184. package/static/assets/circle-check-big-DqKKs8fZ.js +6 -0
  185. package/static/assets/{circle-play-C1R46Kry.js → circle-play-COMPwZ00.js} +1 -1
  186. package/static/assets/circle-play-DoomwgYb.js +6 -0
  187. package/static/assets/{circle-x-CKuM1691.js → circle-x-Cs5S3HID.js} +1 -1
  188. package/static/assets/circle-x-Du7Cp5MD.js +6 -0
  189. package/static/assets/clike-B9uivgTg.js +1 -0
  190. package/static/assets/{clipboard-DWJnnRi8.js → clipboard-C-VV2jbC.js} +1 -1
  191. package/static/assets/clipboard-CqRqQoij.js +11 -0
  192. package/static/assets/{clock-Diqm3Csm.js → clock-BKOkXNLP.js} +1 -1
  193. package/static/assets/clock-ehUSUqcI.js +6 -0
  194. package/static/assets/clojure-BMjYHr_A.js +1 -0
  195. package/static/assets/cmake-BQqOBYOt.js +1 -0
  196. package/static/assets/cobol-CWcv1MsR.js +1 -0
  197. package/static/assets/{code-Ao0cA5nW.js → code-CmFlYUo3.js} +1 -1
  198. package/static/assets/code-kQPD6ttp.js +6 -0
  199. package/static/assets/coffeescript-S37ZYGWr.js +1 -0
  200. package/static/assets/commonlisp-DBKNyK5s.js +1 -0
  201. package/static/assets/crystal-SjHAIU92.js +1 -0
  202. package/static/assets/css-BnMrqG3P.js +1 -0
  203. package/static/assets/cypher-C_CwsFkJ.js +1 -0
  204. package/static/assets/d-pRatUO7H.js +1 -0
  205. package/static/assets/diff-DbItnlRl.js +1 -0
  206. package/static/assets/dockerfile-BKs6k2Af.js +1 -0
  207. package/static/assets/{download-5iQDQeY0.js → download-Cg0a1Yh4.js} +1 -1
  208. package/static/assets/download-D8TKj0Hc.js +6 -0
  209. package/static/assets/dtd-DF_7sFjM.js +1 -0
  210. package/static/assets/dylan-DwRh75JA.js +1 -0
  211. package/static/assets/ebnf-CDyGwa7X.js +1 -0
  212. package/static/assets/ecl-Cabwm37j.js +1 -0
  213. package/static/assets/eiffel-CnydiIhH.js +1 -0
  214. package/static/assets/elm-vLlmbW-K.js +1 -0
  215. package/static/assets/erlang-BNw1qcRV.js +1 -0
  216. package/static/assets/{external-link-B6dkiWgP.js → external-link-BSAlwNHq.js} +1 -1
  217. package/static/assets/external-link-BVrPPG_7.js +6 -0
  218. package/static/assets/{eye-DQUzAWBY.js → eye-AP4j25wH.js} +1 -1
  219. package/static/assets/eye-DWC_Vybx.js +6 -0
  220. package/static/assets/factor-kuTfRLto.js +1 -0
  221. package/static/assets/fcl-Kvtd6kyn.js +1 -0
  222. package/static/assets/{folder-git-2-CQUj8P5W.js → folder-git-2-CMtTePKY.js} +1 -1
  223. package/static/assets/folder-git-2-Ds9p-D0Q.js +6 -0
  224. package/static/assets/forth-Ffai-XNe.js +1 -0
  225. package/static/assets/fortran-DYz_wnZ1.js +1 -0
  226. package/static/assets/gas-Bneqetm1.js +1 -0
  227. package/static/assets/gherkin-heZmZLOM.js +1 -0
  228. package/static/assets/globe-CJrZCIc6.js +6 -0
  229. package/static/assets/globe-DwQuaM7_.js +6 -0
  230. package/static/assets/groovy-D9Dt4D0W.js +1 -0
  231. package/static/assets/haskell-Cw1EW3IL.js +1 -0
  232. package/static/assets/haxe-H-WmDvRZ.js +1 -0
  233. package/static/assets/http-DBlCnlav.js +1 -0
  234. package/static/assets/idl-BEugSyMb.js +1 -0
  235. package/static/assets/index-0sq0wwbr.js +1 -0
  236. package/static/assets/index-B0Cea36W.js +1 -0
  237. package/static/assets/index-B0g-CMWG.js +1 -0
  238. package/static/assets/index-BFEMYO_w.js +1 -0
  239. package/static/assets/index-BFevJCwl.js +1 -0
  240. package/static/assets/index-BK1-hIKa.js +1 -0
  241. package/static/assets/index-BMie63_b.js +1 -0
  242. package/static/assets/index-BZvWD4ai.js +1 -0
  243. package/static/assets/index-BlyysfDZ.js +7 -0
  244. package/static/assets/index-BpQ9T8mu.js +3 -0
  245. package/static/assets/index-Bpm_mSd3.js +2 -0
  246. package/static/assets/index-Brkkhgwq.js +1 -0
  247. package/static/assets/index-Bvj_HZmE.js +1 -0
  248. package/static/assets/index-CE8kBKLn.js +1 -0
  249. package/static/assets/index-CL_XsRD7.js +1 -0
  250. package/static/assets/{index-CIFIEidO.js → index-C_KCaLlP.js} +117 -102
  251. package/static/assets/index-CfcUrE_I.js +1 -0
  252. package/static/assets/index-CisT9m8F.js +3 -0
  253. package/static/assets/index-CiyjdZHh.js +1 -0
  254. package/static/assets/index-CtnO1D9D.js +1 -0
  255. package/static/assets/index-D3hMbDtK.js +1 -0
  256. package/static/assets/index-DBS4Ya9k.js +1 -0
  257. package/static/assets/index-DEmcF6vO.js +1 -0
  258. package/static/assets/index-DYBGl9Zy.js +1 -0
  259. package/static/assets/index-DgeHIphZ.js +1 -0
  260. package/static/assets/index-Digxc7bT.js +1 -0
  261. package/static/assets/index-Dih0CGHs.js +1 -0
  262. package/static/assets/index-DoDazQp9.js +1 -0
  263. package/static/assets/index-DvviZzdo.js +1 -0
  264. package/static/assets/index-Dz52SxOy.js +2 -0
  265. package/static/assets/index-J8MrpD0P.js +1 -0
  266. package/static/assets/index-NgkIT4SV.js +1 -0
  267. package/static/assets/index-PBkZiuRI.js +1 -0
  268. package/static/assets/index-ZJ8xZq44.js +1 -0
  269. package/static/assets/index-oKV7MVo_.js +1 -0
  270. package/static/assets/index-oRAlpULD.css +1 -0
  271. package/static/assets/index-opozMhku.js +502 -0
  272. package/static/assets/index-vk3KOxHi.js +7 -0
  273. package/static/assets/index-wmWBSeOM.js +1 -0
  274. package/static/assets/{info-BvzdeJ30.js → info-D-7cQBbP.js} +1 -1
  275. package/static/assets/info-NEnL4zqX.js +6 -0
  276. package/static/assets/javascript-iXu5QeM3.js +1 -0
  277. package/static/assets/julia-DuME0IfC.js +1 -0
  278. package/static/assets/{label-B1lgxULu.js → label-bMzKAcdZ.js} +1 -1
  279. package/static/assets/label-wtSCiOqT.js +1 -0
  280. package/static/assets/livescript-BwQOo05w.js +1 -0
  281. package/static/assets/lua-BgMRiT3U.js +1 -0
  282. package/static/assets/markdown-editor-B3gIcmI2.js +111 -0
  283. package/static/assets/markdown-editor-B6HEtSkH.css +1 -0
  284. package/static/assets/markdown-editor-D_er7zWv.js +111 -0
  285. package/static/assets/mathematica-DTrFuWx2.js +1 -0
  286. package/static/assets/mbox-CNhZ1qSd.js +1 -0
  287. package/static/assets/{message-square-LKqx0LRr.js → message-square-Ca07XC8m.js} +1 -1
  288. package/static/assets/message-square-CvZFZAL0.js +6 -0
  289. package/static/assets/mirc-CjQqDB4T.js +1 -0
  290. package/static/assets/mllike-CXdrOF99.js +1 -0
  291. package/static/assets/modelica-Dc1JOy9r.js +1 -0
  292. package/static/assets/mscgen-BA5vi2Kp.js +1 -0
  293. package/static/assets/mumps-BT43cFF4.js +1 -0
  294. package/static/assets/nginx-DdIZxoE0.js +1 -0
  295. package/static/assets/nsis-LdVXkNf5.js +1 -0
  296. package/static/assets/ntriples-BfvgReVJ.js +1 -0
  297. package/static/assets/octave-Ck1zUtKM.js +1 -0
  298. package/static/assets/oz-BzwKVEFT.js +1 -0
  299. package/static/assets/{paperclip-Cvcr3t6l.js → paperclip-BICwD8BW.js} +1 -1
  300. package/static/assets/paperclip-D9bkHCO9.js +6 -0
  301. package/static/assets/pascal--L3eBynH.js +1 -0
  302. package/static/assets/{pause-TaMz44vG.js → pause-CZwBxJjx.js} +1 -1
  303. package/static/assets/pause-DrtOMeDr.js +6 -0
  304. package/static/assets/perl-CdXCOZ3F.js +1 -0
  305. package/static/assets/pig-CevX1Tat.js +1 -0
  306. package/static/assets/pipeline-builders-Bkf0wt_O.js +17 -0
  307. package/static/assets/{play-C4YxfQOO.js → play-BjDbhEcg.js} +1 -1
  308. package/static/assets/play-CQk31OJN.js +6 -0
  309. package/static/assets/powershell-CFHJl5sT.js +1 -0
  310. package/static/assets/properties-C78fOPTZ.js +1 -0
  311. package/static/assets/protobuf-ChK-085T.js +1 -0
  312. package/static/assets/pug-DeIclll2.js +1 -0
  313. package/static/assets/puppet-DMA9R1ak.js +1 -0
  314. package/static/assets/python-BuPzkPfP.js +1 -0
  315. package/static/assets/q-pXgVlZs6.js +1 -0
  316. package/static/assets/r-B6wPVr8A.js +1 -0
  317. package/static/assets/{radio-group-D7Rt-k1F.js → radio-group-BpmJzTM1.js} +1 -1
  318. package/static/assets/radio-group-DqCmfTij.js +1 -0
  319. package/static/assets/{refresh-cw-C9ZWZi2c.js → refresh-cw-CZLHY6zD.js} +1 -1
  320. package/static/assets/refresh-cw-yMcSYdEF.js +6 -0
  321. package/static/assets/rpm-CTu-6PCP.js +1 -0
  322. package/static/assets/ruby-B2Rjki9n.js +1 -0
  323. package/static/assets/sas-B4kiWyti.js +1 -0
  324. package/static/assets/scheme-C41bIUwD.js +1 -0
  325. package/static/assets/{search-C1RuN2pO.js → search-Cz2_2BkO.js} +1 -1
  326. package/static/assets/search-_5ueAoCg.js +6 -0
  327. package/static/assets/select-9YyUa5YH.js +1 -0
  328. package/static/assets/select-BKdFrV6O.js +1 -0
  329. package/static/assets/shell-CjFT_Tl9.js +1 -0
  330. package/static/assets/sieve-C3Gn_uJK.js +1 -0
  331. package/static/assets/simple-mode-GW_nhZxv.js +1 -0
  332. package/static/assets/smalltalk-CnHTOXQT.js +1 -0
  333. package/static/assets/solr-DehyRSwq.js +1 -0
  334. package/static/assets/sparql-DkYu6x3z.js +1 -0
  335. package/static/assets/spreadsheet-BCZA_wO0.js +1 -0
  336. package/static/assets/sql-D0XecflT.js +1 -0
  337. package/static/assets/stex-C3f8Ysf7.js +1 -0
  338. package/static/assets/stylus-B533Al4x.js +1 -0
  339. package/static/assets/swift-BzpIVaGY.js +1 -0
  340. package/static/assets/{switch-LSkE6hx8.js → switch-Bhm5em7I.js} +1 -1
  341. package/static/assets/switch-D7e1drXt.js +1 -0
  342. package/static/assets/tabs-oeAz0IIg.js +1 -0
  343. package/static/assets/tabs-qMSIjEoX.js +1 -0
  344. package/static/assets/{tag-B2iP7vv_.js → tag-D5LBbacJ.js} +1 -1
  345. package/static/assets/tag-dBrNwRvH.js +6 -0
  346. package/static/assets/tcl-DVfN8rqt.js +1 -0
  347. package/static/assets/{terminal-preview-PyMHLXJ3.js → terminal-preview-BZXyNaM9.js} +1 -1
  348. package/static/assets/terminal-preview-C3WCC5tV.js +1 -0
  349. package/static/assets/textile-CnDTJFAw.js +1 -0
  350. package/static/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  351. package/static/assets/tiki-DGYXhP31.js +1 -0
  352. package/static/assets/toml-Bm5Em-hy.js +1 -0
  353. package/static/assets/troff-wAsdV37c.js +1 -0
  354. package/static/assets/ttcn-CfJYG6tj.js +1 -0
  355. package/static/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  356. package/static/assets/turtle-B1tBg_DP.js +1 -0
  357. package/static/assets/{use-terminal-Blvh8GLp.js → use-terminal-CSttRkql.js} +1 -1
  358. package/static/assets/use-terminal-FzuSKCnc.js +1 -0
  359. package/static/assets/vb-CmGdzxic.js +1 -0
  360. package/static/assets/vbscript-BuJXcnF6.js +1 -0
  361. package/static/assets/velocity-D8B20fx6.js +1 -0
  362. package/static/assets/verilog-C6RDOZhf.js +1 -0
  363. package/static/assets/vhdl-lSbBsy5d.js +1 -0
  364. package/static/assets/{video-A2wzYKal.js → video-D7SzAtAp.js} +1 -1
  365. package/static/assets/video-DKqt_ev6.js +36 -0
  366. package/static/assets/webidl-ZXfAyPTL.js +1 -0
  367. package/static/assets/xquery-DzFWVndE.js +1 -0
  368. package/static/assets/yacas-BJ4BC0dw.js +1 -0
  369. package/static/assets/z80-Hz9HOZM7.js +1 -0
  370. package/static/index.html +2 -2
  371. package/dist/lib/auth/auth-manager.d.ts.map +0 -1
  372. package/dist/lib/auth/auth-manager.js.map +0 -1
  373. package/dist/lib/gait-path.d.ts.map +0 -1
  374. package/dist/lib/gait-path.js.map +0 -1
  375. package/dist/lib/git-settings.d.ts.map +0 -1
  376. package/dist/lib/git-settings.js.map +0 -1
  377. package/dist/lib/git.d.ts.map +0 -1
  378. package/dist/lib/git.js.map +0 -1
  379. package/dist/lib/jobs/global-job-scheduler.d.ts.map +0 -1
  380. package/dist/lib/jobs/global-job-scheduler.js.map +0 -1
  381. package/dist/lib/jobs/job-runner.d.ts.map +0 -1
  382. package/dist/lib/jobs/job-runner.js.map +0 -1
  383. package/dist/lib/jobs/job-scheduler.d.ts.map +0 -1
  384. package/dist/lib/jobs/job-scheduler.js.map +0 -1
  385. package/dist/lib/jobs/job-store.d.ts.map +0 -1
  386. package/dist/lib/jobs/job-store.js.map +0 -1
  387. package/dist/lib/project-paths.d.ts.map +0 -1
  388. package/dist/lib/project-paths.js.map +0 -1
  389. package/dist/lib/storage/file-storage.d.ts.map +0 -1
  390. package/dist/lib/storage/file-storage.js.map +0 -1
  391. package/dist/lib/symlinks/symlink-manager.d.ts.map +0 -1
  392. package/dist/lib/symlinks/symlink-manager.js.map +0 -1
  393. package/dist/lib/symlinks/types.d.ts.map +0 -1
  394. package/dist/lib/symlinks/types.js.map +0 -1
  395. package/dist/lib/terminal/context-helper.d.ts.map +0 -1
  396. package/dist/lib/terminal/context-helper.js.map +0 -1
  397. package/dist/lib/terminal/global-manager.d.ts.map +0 -1
  398. package/dist/lib/terminal/global-manager.js.map +0 -1
  399. package/dist/lib/terminal/shell-utils.d.ts.map +0 -1
  400. package/dist/lib/terminal/shell-utils.js.map +0 -1
  401. package/dist/lib/terminal/terminal-manager.d.ts.map +0 -1
  402. package/dist/lib/terminal/terminal-manager.js.map +0 -1
  403. package/dist/lib/user-preferences.d.ts.map +0 -1
  404. package/dist/lib/user-preferences.js.map +0 -1
  405. package/dist/middleware/auth.d.ts.map +0 -1
  406. package/dist/middleware/auth.js.map +0 -1
  407. package/dist/routes/api/v1/agents/[id]/index.d.ts.map +0 -1
  408. package/dist/routes/api/v1/agents/[id]/index.js.map +0 -1
  409. package/dist/routes/api/v1/agents/[id]/route.d.ts.map +0 -1
  410. package/dist/routes/api/v1/agents/[id]/route.js.map +0 -1
  411. package/dist/routes/api/v1/agents/index.d.ts.map +0 -1
  412. package/dist/routes/api/v1/agents/index.js.map +0 -1
  413. package/dist/routes/api/v1/agents/route.d.ts.map +0 -1
  414. package/dist/routes/api/v1/agents/route.js.map +0 -1
  415. package/dist/routes/api/v1/ai/index.d.ts.map +0 -1
  416. package/dist/routes/api/v1/ai/index.js.map +0 -1
  417. package/dist/routes/api/v1/ai/route.d.ts.map +0 -1
  418. package/dist/routes/api/v1/ai/route.js.map +0 -1
  419. package/dist/routes/api/v1/api-keys/index.d.ts.map +0 -1
  420. package/dist/routes/api/v1/api-keys/index.js.map +0 -1
  421. package/dist/routes/api/v1/api-keys/route.d.ts.map +0 -1
  422. package/dist/routes/api/v1/api-keys/route.js.map +0 -1
  423. package/dist/routes/api/v1/auth/index.d.ts.map +0 -1
  424. package/dist/routes/api/v1/auth/index.js.map +0 -1
  425. package/dist/routes/api/v1/auth/route.d.ts.map +0 -1
  426. package/dist/routes/api/v1/auth/route.js.map +0 -1
  427. package/dist/routes/api/v1/auth-settings/index.d.ts.map +0 -1
  428. package/dist/routes/api/v1/auth-settings/index.js.map +0 -1
  429. package/dist/routes/api/v1/auth-settings/route.d.ts.map +0 -1
  430. package/dist/routes/api/v1/auth-settings/route.js.map +0 -1
  431. package/dist/routes/api/v1/chats/[id]/index.d.ts.map +0 -1
  432. package/dist/routes/api/v1/chats/[id]/index.js.map +0 -1
  433. package/dist/routes/api/v1/chats/[id]/route.d.ts.map +0 -1
  434. package/dist/routes/api/v1/chats/[id]/route.js.map +0 -1
  435. package/dist/routes/api/v1/chats/index.d.ts.map +0 -1
  436. package/dist/routes/api/v1/chats/index.js.map +0 -1
  437. package/dist/routes/api/v1/chats/route.d.ts.map +0 -1
  438. package/dist/routes/api/v1/chats/route.js.map +0 -1
  439. package/dist/routes/api/v1/config/index.d.ts.map +0 -1
  440. package/dist/routes/api/v1/config/index.js.map +0 -1
  441. package/dist/routes/api/v1/config/route.d.ts.map +0 -1
  442. package/dist/routes/api/v1/config/route.js.map +0 -1
  443. package/dist/routes/api/v1/context/architecture/route.d.ts.map +0 -1
  444. package/dist/routes/api/v1/context/architecture/route.js.map +0 -1
  445. package/dist/routes/api/v1/context/index.d.ts.map +0 -1
  446. package/dist/routes/api/v1/context/index.js.map +0 -1
  447. package/dist/routes/api/v1/context/knowledge/[filename]/index.d.ts.map +0 -1
  448. package/dist/routes/api/v1/context/knowledge/[filename]/index.js.map +0 -1
  449. package/dist/routes/api/v1/context/knowledge/[filename]/route.d.ts.map +0 -1
  450. package/dist/routes/api/v1/context/knowledge/[filename]/route.js.map +0 -1
  451. package/dist/routes/api/v1/context/knowledge/index.d.ts.map +0 -1
  452. package/dist/routes/api/v1/context/knowledge/index.js.map +0 -1
  453. package/dist/routes/api/v1/context/knowledge/route.d.ts.map +0 -1
  454. package/dist/routes/api/v1/context/knowledge/route.js.map +0 -1
  455. package/dist/routes/api/v1/context/project/route.d.ts.map +0 -1
  456. package/dist/routes/api/v1/context/project/route.js.map +0 -1
  457. package/dist/routes/api/v1/git/index.d.ts.map +0 -1
  458. package/dist/routes/api/v1/git/index.js.map +0 -1
  459. package/dist/routes/api/v1/jobs/[id]/route.d.ts.map +0 -1
  460. package/dist/routes/api/v1/jobs/[id]/route.js.map +0 -1
  461. package/dist/routes/api/v1/jobs/[id]/run/route.d.ts.map +0 -1
  462. package/dist/routes/api/v1/jobs/[id]/run/route.js.map +0 -1
  463. package/dist/routes/api/v1/jobs/index.d.ts.map +0 -1
  464. package/dist/routes/api/v1/jobs/index.js.map +0 -1
  465. package/dist/routes/api/v1/jobs/route.d.ts.map +0 -1
  466. package/dist/routes/api/v1/jobs/route.js.map +0 -1
  467. package/dist/routes/api/v1/jobs/status/route.d.ts.map +0 -1
  468. package/dist/routes/api/v1/jobs/status/route.js.map +0 -1
  469. package/dist/routes/api/v1/mcp/index.d.ts.map +0 -1
  470. package/dist/routes/api/v1/mcp/index.js.map +0 -1
  471. package/dist/routes/api/v1/mcp/route.d.ts.map +0 -1
  472. package/dist/routes/api/v1/mcp/route.js.map +0 -1
  473. package/dist/routes/api/v1/proposals/[id]/route.d.ts.map +0 -1
  474. package/dist/routes/api/v1/proposals/[id]/route.js.map +0 -1
  475. package/dist/routes/api/v1/proposals/index.d.ts.map +0 -1
  476. package/dist/routes/api/v1/proposals/index.js.map +0 -1
  477. package/dist/routes/api/v1/proposals/route.d.ts.map +0 -1
  478. package/dist/routes/api/v1/proposals/route.js.map +0 -1
  479. package/dist/routes/api/v1/resources/[id]/index.d.ts.map +0 -1
  480. package/dist/routes/api/v1/resources/[id]/index.js.map +0 -1
  481. package/dist/routes/api/v1/resources/[id]/route.js.map +0 -1
  482. package/dist/routes/api/v1/resources/[id]/thumbnail/index.d.ts.map +0 -1
  483. package/dist/routes/api/v1/resources/[id]/thumbnail/index.js.map +0 -1
  484. package/dist/routes/api/v1/resources/[id]/thumbnail/route.js.map +0 -1
  485. package/dist/routes/api/v1/resources/index.d.ts.map +0 -1
  486. package/dist/routes/api/v1/resources/index.js.map +0 -1
  487. package/dist/routes/api/v1/resources/route.d.ts.map +0 -1
  488. package/dist/routes/api/v1/resources/route.js.map +0 -1
  489. package/dist/routes/api/v1/symlinks/index.d.ts.map +0 -1
  490. package/dist/routes/api/v1/symlinks/index.js.map +0 -1
  491. package/dist/routes/api/v1/symlinks/route.d.ts.map +0 -1
  492. package/dist/routes/api/v1/symlinks/route.js.map +0 -1
  493. package/dist/routes/api/v1/terminal/[proposalId]/create/index.d.ts.map +0 -1
  494. package/dist/routes/api/v1/terminal/[proposalId]/create/index.js.map +0 -1
  495. package/dist/routes/api/v1/terminal/[proposalId]/create/route.d.ts.map +0 -1
  496. package/dist/routes/api/v1/terminal/[proposalId]/create/route.js.map +0 -1
  497. package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.d.ts.map +0 -1
  498. package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.js.map +0 -1
  499. package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.d.ts.map +0 -1
  500. package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.js.map +0 -1
  501. package/dist/routes/api/v1/terminal/[proposalId]/resize/index.d.ts.map +0 -1
  502. package/dist/routes/api/v1/terminal/[proposalId]/resize/index.js.map +0 -1
  503. package/dist/routes/api/v1/terminal/[proposalId]/resize/route.d.ts.map +0 -1
  504. package/dist/routes/api/v1/terminal/[proposalId]/resize/route.js.map +0 -1
  505. package/dist/routes/api/v1/terminal/sessions/index.d.ts.map +0 -1
  506. package/dist/routes/api/v1/terminal/sessions/index.js.map +0 -1
  507. package/dist/routes/api/v1/terminal/sessions/route.d.ts.map +0 -1
  508. package/dist/routes/api/v1/terminal/sessions/route.js.map +0 -1
  509. package/dist/routes/api/v1/user/index.d.ts.map +0 -1
  510. package/dist/routes/api/v1/user/index.js.map +0 -1
  511. package/dist/routes/api/v1/user/settings/index.d.ts.map +0 -1
  512. package/dist/routes/api/v1/user/settings/index.js.map +0 -1
  513. package/dist/routes/api/v1/user/settings/route.d.ts.map +0 -1
  514. package/dist/routes/api/v1/user/settings/route.js.map +0 -1
  515. package/dist/server-with-static.d.ts.map +0 -1
  516. package/dist/server-with-static.js.map +0 -1
  517. package/dist/server.d.ts.map +0 -1
  518. package/dist/server.js.map +0 -1
  519. package/static/assets/ActivityPage-DC2t-Kyv.js +0 -1
  520. package/static/assets/ArchitectureEditPage-B5dNFxvL.js +0 -21
  521. package/static/assets/ArchitecturePage-D796d-Je.js +0 -1
  522. package/static/assets/CodePage-xbYipiBR.js +0 -2
  523. package/static/assets/DashboardPage-Aw1xWH4M.js +0 -51
  524. package/static/assets/IntegrationsSettingsPage-Ds16sLG2.js +0 -1
  525. package/static/assets/KnowledgeDetailPage-D94ukozt.js +0 -1
  526. package/static/assets/KnowledgeEditPage-DpjdauND.js +0 -1
  527. package/static/assets/NewKnowledgePage-EqWKQ4lU.js +0 -9
  528. package/static/assets/NotificationsSettingsPage-BzVS1D5M.js +0 -1
  529. package/static/assets/ProjectEditPage-BlQk50Xs.js +0 -11
  530. package/static/assets/PromptsSettingsPage-DWEKgvMD.js +0 -1
  531. package/static/assets/ResourcesPage-C0TGRawd.js +0 -41
  532. package/static/assets/RoleEditPage-m6lOchyA.js +0 -13
  533. package/static/assets/SchedulePage-DUSxe93C.js +0 -4
  534. package/static/assets/TaskEditPage-Dpsi2Rcp.js +0 -1
  535. package/static/assets/TerminalSessionPage-B6_ssmNM.js +0 -8
  536. package/static/assets/UserPreferencesPage-CY_0CoMe.js +0 -1
  537. package/static/assets/UtilitiesPage-e4IaR2YV.js +0 -1
  538. package/static/assets/index-CHdBxVyk.css +0 -2
  539. package/static/assets/kiro-CGoI3Dqh.js +0 -17
  540. package/static/assets/markdown-editor-C-DC0mFI.js +0 -62
  541. package/static/assets/markdown-editor-DUEthZ0y.css +0 -1
  542. package/static/assets/select-Dp3J_OE9.js +0 -1
  543. 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';
package/dist/lib/git.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { InstructionFileKind, InstructionFiles } from '@lovelybunch/types';
1
2
  export declare function getRepoRoot(): Promise<string>;
2
3
  export declare function getWorktreesBase(): Promise<string>;
3
4
  export declare function sanitizeBranchName(name: string): string;
@@ -9,6 +10,8 @@ export declare function runGit(args: string[], opts?: {
9
10
  stdout: string;
10
11
  stderr: string;
11
12
  }>;
13
+ export declare function lsTree(ref?: string): Promise<string[]>;
14
+ export declare function getInstructionFiles(filter?: InstructionFileKind | 'all'): Promise<InstructionFiles>;
12
15
  export declare function getRepoStatus(): Promise<{
13
16
  branch: string;
14
17
  ahead: number;
package/dist/lib/git.js CHANGED
@@ -5,6 +5,7 @@ import { promises as fs } from 'fs';
5
5
  import { readGithubToken, isGithubTokenValid } from './github-token.js';
6
6
  import { findGaitDirectory } from './gait-path.js';
7
7
  import { loadGitSettings } from './git-settings.js';
8
+ import { INSTRUCTION_FILE_KINDS } from '@lovelybunch/types';
8
9
  const execFile = promisify(_execFile);
9
10
  // Base directory for worktrees under the repository root
10
11
  export async function getRepoRoot() {
@@ -52,6 +53,40 @@ export async function runGit(args, opts) {
52
53
  };
53
54
  return execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024, timeout, env });
54
55
  }
56
+ // --- ls-tree ---
57
+ export async function lsTree(ref = 'HEAD') {
58
+ const { stdout } = await runGit(['ls-tree', '-r', '--name-only', ref]);
59
+ return stdout.trim().split('\n').filter(l => l && !l.startsWith('.nut/'));
60
+ }
61
+ // --- Instruction files ---
62
+ const FILENAME_TO_KIND = new Map(INSTRUCTION_FILE_KINDS.map(k => [`${k}.md`, k]));
63
+ const KIND_TO_FILENAME = new Map(INSTRUCTION_FILE_KINDS.map(k => [k, `${k}.md`]));
64
+ export async function getInstructionFiles(filter) {
65
+ const filterFilename = filter && filter !== 'all' ? KIND_TO_FILENAME.get(filter) : undefined;
66
+ const allPaths = await lsTree();
67
+ const wanted = allPaths.filter(p => {
68
+ const name = path.basename(p);
69
+ if (!FILENAME_TO_KIND.has(name))
70
+ return false;
71
+ if (filterFilename)
72
+ return name === filterFilename;
73
+ return true;
74
+ });
75
+ const entries = await Promise.all(wanted.map(async (filePath) => {
76
+ const { stdout } = await runGit(['show', `HEAD:${filePath}`]);
77
+ return { filePath, content: stdout };
78
+ }));
79
+ const result = {};
80
+ for (const { filePath, content } of entries) {
81
+ const dir = path.dirname(filePath);
82
+ const key = dir === '.' ? '.' : dir;
83
+ const kind = FILENAME_TO_KIND.get(path.basename(filePath));
84
+ if (!result[key])
85
+ result[key] = {};
86
+ result[key][kind] = content;
87
+ }
88
+ return result;
89
+ }
55
90
  // --- Status ---
56
91
  export async function getRepoStatus() {
57
92
  const { stdout } = await runGit(['status', '--porcelain=v1', '-b']);
@@ -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
+ }