@inkeep/agents-manage-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (722) hide show
  1. package/.env.sample +5 -0
  2. package/.turbo/turbo-build.log +93 -0
  3. package/.turbo/turbo-test.log +33 -0
  4. package/.turbo/turbo-typecheck.log +5 -0
  5. package/README.md +81 -0
  6. package/components.json +21 -0
  7. package/eslint.config.mjs +14 -0
  8. package/next.config.ts +23 -0
  9. package/package.json +93 -0
  10. package/postcss.config.mjs +5 -0
  11. package/public/assets/logo-outline.svg +4 -0
  12. package/public/assets/logo.svg +10 -0
  13. package/public/assets/provider-icons/1password.svg +6 -0
  14. package/public/assets/provider-icons/accelo.svg +1 -0
  15. package/public/assets/provider-icons/active-campaign.svg +1 -0
  16. package/public/assets/provider-icons/acuity-scheduling.svg +1 -0
  17. package/public/assets/provider-icons/adobe.svg +1 -0
  18. package/public/assets/provider-icons/adp.svg +1 -0
  19. package/public/assets/provider-icons/adyen.svg +1 -0
  20. package/public/assets/provider-icons/affinity.svg +1 -0
  21. package/public/assets/provider-icons/aircall.svg +1 -0
  22. package/public/assets/provider-icons/airtable.svg +1 -0
  23. package/public/assets/provider-icons/algolia.svg +1 -0
  24. package/public/assets/provider-icons/amazon.svg +1 -0
  25. package/public/assets/provider-icons/amplitude.svg +1 -0
  26. package/public/assets/provider-icons/anrok.svg +1 -0
  27. package/public/assets/provider-icons/anthropic.svg +1 -0
  28. package/public/assets/provider-icons/apaleo.svg +1 -0
  29. package/public/assets/provider-icons/apollo.svg +1 -0
  30. package/public/assets/provider-icons/apple-app-store.svg +1 -0
  31. package/public/assets/provider-icons/appstle-subscriptions.svg +1 -0
  32. package/public/assets/provider-icons/asana.svg +1 -0
  33. package/public/assets/provider-icons/ashby.svg +1 -0
  34. package/public/assets/provider-icons/atlas-so.svg +4 -0
  35. package/public/assets/provider-icons/atlassian.svg +1 -0
  36. package/public/assets/provider-icons/attio.svg +1 -0
  37. package/public/assets/provider-icons/auth0.svg +1 -0
  38. package/public/assets/provider-icons/autodesk.svg +1 -0
  39. package/public/assets/provider-icons/avalara.svg +1 -0
  40. package/public/assets/provider-icons/aws.svg +1 -0
  41. package/public/assets/provider-icons/azure-blob-storage.svg +1 -0
  42. package/public/assets/provider-icons/azure-devops.svg +6 -0
  43. package/public/assets/provider-icons/bamboohr.svg +1 -0
  44. package/public/assets/provider-icons/basecamp.svg +1 -0
  45. package/public/assets/provider-icons/battlenet.svg +1 -0
  46. package/public/assets/provider-icons/beehiiv.svg +1 -0
  47. package/public/assets/provider-icons/bigcommerce.svg +1 -0
  48. package/public/assets/provider-icons/bill-sandbox.svg +1 -0
  49. package/public/assets/provider-icons/bitbucket.svg +1 -0
  50. package/public/assets/provider-icons/bitdefender.svg +1 -0
  51. package/public/assets/provider-icons/bitly.svg +1 -0
  52. package/public/assets/provider-icons/blackbaud.svg +1 -0
  53. package/public/assets/provider-icons/blandai.svg +9 -0
  54. package/public/assets/provider-icons/boldsign.svg +1 -0
  55. package/public/assets/provider-icons/booking-com.svg +1 -0
  56. package/public/assets/provider-icons/box.svg +1 -0
  57. package/public/assets/provider-icons/braintree.svg +1 -0
  58. package/public/assets/provider-icons/braze.svg +1 -0
  59. package/public/assets/provider-icons/brevo-api-key.svg +3 -0
  60. package/public/assets/provider-icons/brex.svg +1 -0
  61. package/public/assets/provider-icons/brightcrowd.svg +1 -0
  62. package/public/assets/provider-icons/builder-io-public.svg +1 -0
  63. package/public/assets/provider-icons/buildium.svg +1 -0
  64. package/public/assets/provider-icons/builtwith.svg +1 -0
  65. package/public/assets/provider-icons/cal-com-v1.svg +4 -0
  66. package/public/assets/provider-icons/calendly.svg +1 -0
  67. package/public/assets/provider-icons/callrail.svg +1 -0
  68. package/public/assets/provider-icons/canny.svg +1 -0
  69. package/public/assets/provider-icons/canva-scim.svg +1 -0
  70. package/public/assets/provider-icons/certn.svg +5 -0
  71. package/public/assets/provider-icons/chargebee.svg +1 -0
  72. package/public/assets/provider-icons/chattermill.svg +1 -0
  73. package/public/assets/provider-icons/checkhq.svg +10 -0
  74. package/public/assets/provider-icons/checkout-com.svg +1 -0
  75. package/public/assets/provider-icons/checkr-partner.svg +1 -0
  76. package/public/assets/provider-icons/chorus.svg +1 -0
  77. package/public/assets/provider-icons/circle-so.svg +1 -0
  78. package/public/assets/provider-icons/clari-copilot.svg +1 -0
  79. package/public/assets/provider-icons/clicksend.svg +11 -0
  80. package/public/assets/provider-icons/clickup.svg +1 -0
  81. package/public/assets/provider-icons/close.svg +1 -0
  82. package/public/assets/provider-icons/cloudentity.svg +1 -0
  83. package/public/assets/provider-icons/coda.svg +1 -0
  84. package/public/assets/provider-icons/codeclimate.svg +1 -0
  85. package/public/assets/provider-icons/codegen.svg +1 -0
  86. package/public/assets/provider-icons/commercetools.svg +8 -0
  87. package/public/assets/provider-icons/companycam.svg +1 -0
  88. package/public/assets/provider-icons/confluence.svg +1 -0
  89. package/public/assets/provider-icons/connectwise-psa.svg +1 -0
  90. package/public/assets/provider-icons/contentful.svg +1 -0
  91. package/public/assets/provider-icons/contentstack.svg +1 -0
  92. package/public/assets/provider-icons/copper.svg +13 -0
  93. package/public/assets/provider-icons/coros.svg +20 -0
  94. package/public/assets/provider-icons/coupa-compass.svg +1 -0
  95. package/public/assets/provider-icons/cyberimpact.svg +1 -0
  96. package/public/assets/provider-icons/databricks-account.svg +1 -0
  97. package/public/assets/provider-icons/datadog.svg +1 -0
  98. package/public/assets/provider-icons/datev.svg +1 -0
  99. package/public/assets/provider-icons/deel.svg +1 -0
  100. package/public/assets/provider-icons/devin.svg +1 -0
  101. package/public/assets/provider-icons/dialpad.svg +1 -0
  102. package/public/assets/provider-icons/digitalocean.svg +1 -0
  103. package/public/assets/provider-icons/discord.svg +1 -0
  104. package/public/assets/provider-icons/discourse.svg +1 -0
  105. package/public/assets/provider-icons/dixa.svg +1 -0
  106. package/public/assets/provider-icons/document360.svg +6 -0
  107. package/public/assets/provider-icons/docusign.svg +1 -0
  108. package/public/assets/provider-icons/docuware.svg +1 -0
  109. package/public/assets/provider-icons/dropbox-sign.svg +6 -0
  110. package/public/assets/provider-icons/dropbox.svg +1 -0
  111. package/public/assets/provider-icons/drupal.svg +1 -0
  112. package/public/assets/provider-icons/e-conomic.svg +1 -0
  113. package/public/assets/provider-icons/ebay.svg +29 -0
  114. package/public/assets/provider-icons/egnyte.svg +1 -0
  115. package/public/assets/provider-icons/elevenlabs.svg +1 -0
  116. package/public/assets/provider-icons/elevio.svg +1 -0
  117. package/public/assets/provider-icons/emarsys.svg +1 -0
  118. package/public/assets/provider-icons/employment-hero.svg +1 -0
  119. package/public/assets/provider-icons/entrata.svg +1 -0
  120. package/public/assets/provider-icons/envoy.svg +1 -0
  121. package/public/assets/provider-icons/epic-games.svg +1 -0
  122. package/public/assets/provider-icons/evaluagent.svg +1 -0
  123. package/public/assets/provider-icons/eventbrite.svg +1 -0
  124. package/public/assets/provider-icons/exa.svg +1 -0
  125. package/public/assets/provider-icons/exact-online.svg +1 -0
  126. package/public/assets/provider-icons/exist.svg +1 -0
  127. package/public/assets/provider-icons/expensify.svg +1 -0
  128. package/public/assets/provider-icons/facebook.svg +1 -0
  129. package/public/assets/provider-icons/factorial.svg +1 -0
  130. package/public/assets/provider-icons/falai.svg +1 -0
  131. package/public/assets/provider-icons/fathom.svg +1 -0
  132. package/public/assets/provider-icons/figma.svg +1 -0
  133. package/public/assets/provider-icons/findymail.svg +1 -0
  134. package/public/assets/provider-icons/firefish.svg +1 -0
  135. package/public/assets/provider-icons/fireflies.svg +1 -0
  136. package/public/assets/provider-icons/fiserv.svg +1 -0
  137. package/public/assets/provider-icons/fitbit.svg +1 -0
  138. package/public/assets/provider-icons/fortnox.svg +1 -0
  139. package/public/assets/provider-icons/freshbooks.svg +1 -0
  140. package/public/assets/provider-icons/freshdesk.svg +1 -0
  141. package/public/assets/provider-icons/freshsales.svg +1 -0
  142. package/public/assets/provider-icons/freshservice.svg +1 -0
  143. package/public/assets/provider-icons/freshteam.svg +1 -0
  144. package/public/assets/provider-icons/front.svg +1 -0
  145. package/public/assets/provider-icons/gainsight-cc.svg +1 -0
  146. package/public/assets/provider-icons/garmin.svg +1 -0
  147. package/public/assets/provider-icons/gebruder-weiss.svg +6 -0
  148. package/public/assets/provider-icons/gem.svg +1 -0
  149. package/public/assets/provider-icons/gerrit.svg +1 -0
  150. package/public/assets/provider-icons/ghost-admin.svg +1 -0
  151. package/public/assets/provider-icons/github.svg +1 -0
  152. package/public/assets/provider-icons/gitlab.svg +1 -0
  153. package/public/assets/provider-icons/gong.svg +1 -0
  154. package/public/assets/provider-icons/google-ads.svg +1 -0
  155. package/public/assets/provider-icons/google-analytics.svg +1 -0
  156. package/public/assets/provider-icons/google-calendar.svg +1 -0
  157. package/public/assets/provider-icons/google-chat.svg +1 -0
  158. package/public/assets/provider-icons/google-cloud-storage.svg +1 -0
  159. package/public/assets/provider-icons/google-docs.svg +1 -0
  160. package/public/assets/provider-icons/google-drive.svg +1 -0
  161. package/public/assets/provider-icons/google-gemini.svg +1 -0
  162. package/public/assets/provider-icons/google-mail.svg +1 -0
  163. package/public/assets/provider-icons/google-play.svg +1 -0
  164. package/public/assets/provider-icons/google-sheet.svg +1 -0
  165. package/public/assets/provider-icons/google-slides.svg +97 -0
  166. package/public/assets/provider-icons/google.svg +1 -0
  167. package/public/assets/provider-icons/gorgias.svg +1 -0
  168. package/public/assets/provider-icons/grafana.svg +1 -0
  169. package/public/assets/provider-icons/grain.svg +1 -0
  170. package/public/assets/provider-icons/grammarly.svg +1 -0
  171. package/public/assets/provider-icons/greenhouse.svg +1 -0
  172. package/public/assets/provider-icons/gumroad.svg +1 -0
  173. package/public/assets/provider-icons/guru.svg +1 -0
  174. package/public/assets/provider-icons/gusto.svg +1 -0
  175. package/public/assets/provider-icons/hackerrank-work.svg +1 -0
  176. package/public/assets/provider-icons/harvest.svg +1 -0
  177. package/public/assets/provider-icons/health-gorilla.svg +1 -0
  178. package/public/assets/provider-icons/helpscout-mailbox.svg +1 -0
  179. package/public/assets/provider-icons/hibob-service-user.svg +1 -0
  180. package/public/assets/provider-icons/highlevel.svg +1 -0
  181. package/public/assets/provider-icons/holded.svg +1 -0
  182. package/public/assets/provider-icons/hubspot.svg +1 -0
  183. package/public/assets/provider-icons/incident-io.svg +1 -0
  184. package/public/assets/provider-icons/insightly.svg +3 -0
  185. package/public/assets/provider-icons/instagram.svg +1 -0
  186. package/public/assets/provider-icons/instantly.svg +1 -0
  187. package/public/assets/provider-icons/intercom.svg +1 -0
  188. package/public/assets/provider-icons/intuit.svg +1 -0
  189. package/public/assets/provider-icons/jamf.svg +1 -0
  190. package/public/assets/provider-icons/jazzhr.svg +9 -0
  191. package/public/assets/provider-icons/jira.svg +1 -0
  192. package/public/assets/provider-icons/jobadder.svg +3 -0
  193. package/public/assets/provider-icons/jobvite.svg +1 -0
  194. package/public/assets/provider-icons/jotform.svg +1 -0
  195. package/public/assets/provider-icons/kandji.svg +1 -0
  196. package/public/assets/provider-icons/keap.svg +1 -0
  197. package/public/assets/provider-icons/keeper-scim.svg +1 -0
  198. package/public/assets/provider-icons/klaviyo.svg +1 -0
  199. package/public/assets/provider-icons/klipfolio.svg +1 -0
  200. package/public/assets/provider-icons/knowbe4.svg +1 -0
  201. package/public/assets/provider-icons/kustomer.svg +1 -0
  202. package/public/assets/provider-icons/lagrowthmachine.svg +1 -0
  203. package/public/assets/provider-icons/lastpass.svg +1 -0
  204. package/public/assets/provider-icons/lattice.svg +245 -0
  205. package/public/assets/provider-icons/lemlist.svg +1 -0
  206. package/public/assets/provider-icons/lessonly.svg +1 -0
  207. package/public/assets/provider-icons/lever.svg +1 -0
  208. package/public/assets/provider-icons/linear.svg +1 -0
  209. package/public/assets/provider-icons/linkedin.svg +12 -0
  210. package/public/assets/provider-icons/linkhut.svg +1 -0
  211. package/public/assets/provider-icons/listmonk.svg +1 -0
  212. package/public/assets/provider-icons/loom.svg +6 -0
  213. package/public/assets/provider-icons/loops-so.svg +1 -0
  214. package/public/assets/provider-icons/lucid.svg +1 -0
  215. package/public/assets/provider-icons/luma.svg +1 -0
  216. package/public/assets/provider-icons/mailchimp.svg +1 -0
  217. package/public/assets/provider-icons/mailgun.svg +1 -0
  218. package/public/assets/provider-icons/make.svg +1 -0
  219. package/public/assets/provider-icons/malwarebytes.svg +1 -0
  220. package/public/assets/provider-icons/manatal.svg +1 -0
  221. package/public/assets/provider-icons/marketo.svg +1 -0
  222. package/public/assets/provider-icons/medallia.svg +1 -0
  223. package/public/assets/provider-icons/metabase.svg +1 -0
  224. package/public/assets/provider-icons/microsoft-ads.svg +1 -0
  225. package/public/assets/provider-icons/microsoft-business-central.svg +1 -0
  226. package/public/assets/provider-icons/microsoft-entra-id.svg +1 -0
  227. package/public/assets/provider-icons/microsoft-power-bi.svg +1 -0
  228. package/public/assets/provider-icons/microsoft-teams.svg +1 -0
  229. package/public/assets/provider-icons/microsoft-tenant-specific.svg +1 -0
  230. package/public/assets/provider-icons/microsoft.svg +1 -0
  231. package/public/assets/provider-icons/mindbody.svg +1 -0
  232. package/public/assets/provider-icons/minimax.svg +12 -0
  233. package/public/assets/provider-icons/mip-cloud.svg +30 -0
  234. package/public/assets/provider-icons/mip.svg +30 -0
  235. package/public/assets/provider-icons/miro.svg +1 -0
  236. package/public/assets/provider-icons/missive.svg +7 -0
  237. package/public/assets/provider-icons/mixpanel.svg +1 -0
  238. package/public/assets/provider-icons/monday.svg +1 -0
  239. package/public/assets/provider-icons/mural.svg +1 -0
  240. package/public/assets/provider-icons/namely-pat.svg +1 -0
  241. package/public/assets/provider-icons/nationbuilder.svg +1 -0
  242. package/public/assets/provider-icons/netsuite.svg +1 -0
  243. package/public/assets/provider-icons/next-cloud-ocs.svg +9 -0
  244. package/public/assets/provider-icons/notion.svg +1 -0
  245. package/public/assets/provider-icons/odoo.svg +1 -0
  246. package/public/assets/provider-icons/okta.svg +1 -0
  247. package/public/assets/provider-icons/one-drive.svg +1 -0
  248. package/public/assets/provider-icons/one-note.svg +1 -0
  249. package/public/assets/provider-icons/open-hands.svg +9 -0
  250. package/public/assets/provider-icons/openai.svg +1 -0
  251. package/public/assets/provider-icons/oracle-hcm.svg +1 -0
  252. package/public/assets/provider-icons/ory.svg +1 -0
  253. package/public/assets/provider-icons/osu.svg +1 -0
  254. package/public/assets/provider-icons/oura.svg +1 -0
  255. package/public/assets/provider-icons/outlook.svg +1 -0
  256. package/public/assets/provider-icons/outreach.svg +1 -0
  257. package/public/assets/provider-icons/pagerduty.svg +1 -0
  258. package/public/assets/provider-icons/pandadoc.svg +1 -0
  259. package/public/assets/provider-icons/paychex.svg +1 -0
  260. package/public/assets/provider-icons/paycom.svg +1 -0
  261. package/public/assets/provider-icons/payfit.svg +1 -0
  262. package/public/assets/provider-icons/paylocity.svg +17 -0
  263. package/public/assets/provider-icons/paypal.svg +1 -0
  264. package/public/assets/provider-icons/pendo.svg +1 -0
  265. package/public/assets/provider-icons/pennylane.svg +1 -0
  266. package/public/assets/provider-icons/peopledatalabs.svg +1 -0
  267. package/public/assets/provider-icons/perimeter81.svg +1 -0
  268. package/public/assets/provider-icons/perplexity.svg +1 -0
  269. package/public/assets/provider-icons/personio.svg +1 -0
  270. package/public/assets/provider-icons/pingboard.svg +1 -0
  271. package/public/assets/provider-icons/pinterest.svg +1 -0
  272. package/public/assets/provider-icons/pipedrive.svg +1 -0
  273. package/public/assets/provider-icons/pivotaltracker.svg +1 -0
  274. package/public/assets/provider-icons/plain.svg +63 -0
  275. package/public/assets/provider-icons/podium.svg +1 -0
  276. package/public/assets/provider-icons/posthog.svg +1 -0
  277. package/public/assets/provider-icons/precisefp.svg +13 -0
  278. package/public/assets/provider-icons/prive.svg +1 -0
  279. package/public/assets/provider-icons/productboard.svg +1 -0
  280. package/public/assets/provider-icons/qualtrics.svg +1 -0
  281. package/public/assets/provider-icons/quickbase.svg +26 -0
  282. package/public/assets/provider-icons/quickbooks.svg +1 -0
  283. package/public/assets/provider-icons/ragieai.svg +1 -0
  284. package/public/assets/provider-icons/ramp.svg +1 -0
  285. package/public/assets/provider-icons/rapidapi.svg +1 -0
  286. package/public/assets/provider-icons/razorpay.svg +1 -0
  287. package/public/assets/provider-icons/readwise.svg +1 -0
  288. package/public/assets/provider-icons/recharge.svg +1 -0
  289. package/public/assets/provider-icons/recruitcrm.svg +1 -0
  290. package/public/assets/provider-icons/recruiterflow.svg +9 -0
  291. package/public/assets/provider-icons/reddit.svg +1 -0
  292. package/public/assets/provider-icons/redtail-crm-sandbox.svg +1 -0
  293. package/public/assets/provider-icons/refiner.svg +1 -0
  294. package/public/assets/provider-icons/replicate.svg +1 -0
  295. package/public/assets/provider-icons/retell-ai.svg +7 -0
  296. package/public/assets/provider-icons/ring-central.svg +1 -0
  297. package/public/assets/provider-icons/rippling.svg +1 -0
  298. package/public/assets/provider-icons/roam-scim.svg +12 -0
  299. package/public/assets/provider-icons/rock-gym-pro.svg +33 -0
  300. package/public/assets/provider-icons/rootly.svg +1 -0
  301. package/public/assets/provider-icons/sage-hr.svg +1 -0
  302. package/public/assets/provider-icons/sage.svg +1 -0
  303. package/public/assets/provider-icons/salesforce.svg +1 -0
  304. package/public/assets/provider-icons/salesloft.svg +1 -0
  305. package/public/assets/provider-icons/sap-concur.svg +8 -0
  306. package/public/assets/provider-icons/sap-success-factors.svg +1 -0
  307. package/public/assets/provider-icons/scrapedo.svg +14 -0
  308. package/public/assets/provider-icons/sedna.svg +1 -0
  309. package/public/assets/provider-icons/segment.svg +1 -0
  310. package/public/assets/provider-icons/sendgrid.svg +1 -0
  311. package/public/assets/provider-icons/sentry.svg +1 -0
  312. package/public/assets/provider-icons/servicem8.svg +1 -0
  313. package/public/assets/provider-icons/servicenow.svg +1 -0
  314. package/public/assets/provider-icons/setmore.svg +1 -0
  315. package/public/assets/provider-icons/sharepoint-online.svg +1 -0
  316. package/public/assets/provider-icons/shipstation.svg +1 -0
  317. package/public/assets/provider-icons/shopify.svg +1 -0
  318. package/public/assets/provider-icons/shortcut.svg +1 -0
  319. package/public/assets/provider-icons/signnow.svg +1 -0
  320. package/public/assets/provider-icons/slack.svg +1 -0
  321. package/public/assets/provider-icons/smartlead-ai.svg +1 -0
  322. package/public/assets/provider-icons/smartrecruiters-api-key.svg +1 -0
  323. package/public/assets/provider-icons/smartsheet.svg +1 -0
  324. package/public/assets/provider-icons/smugmug.svg +1 -0
  325. package/public/assets/provider-icons/snowflake.svg +1 -0
  326. package/public/assets/provider-icons/splitwise.svg +1 -0
  327. package/public/assets/provider-icons/spotify.svg +1 -0
  328. package/public/assets/provider-icons/squarespace.svg +1 -0
  329. package/public/assets/provider-icons/squareup.svg +1 -0
  330. package/public/assets/provider-icons/stackexchange.svg +1 -0
  331. package/public/assets/provider-icons/strava.svg +1 -0
  332. package/public/assets/provider-icons/stripe-express.svg +1 -0
  333. package/public/assets/provider-icons/stripe.svg +1 -0
  334. package/public/assets/provider-icons/supabase.svg +15 -0
  335. package/public/assets/provider-icons/survey-monkey.svg +1 -0
  336. package/public/assets/provider-icons/tableau.svg +1 -0
  337. package/public/assets/provider-icons/tapclicks.svg +1 -0
  338. package/public/assets/provider-icons/teamtailor.svg +1 -0
  339. package/public/assets/provider-icons/teamwork.svg +1 -0
  340. package/public/assets/provider-icons/terraform.svg +1 -0
  341. package/public/assets/provider-icons/thrivecart-api-key.svg +1 -0
  342. package/public/assets/provider-icons/thrivecart-oauth.svg +1 -0
  343. package/public/assets/provider-icons/ticktick.svg +1 -0
  344. package/public/assets/provider-icons/tiktok-ads.svg +1 -0
  345. package/public/assets/provider-icons/timely.svg +1 -0
  346. package/public/assets/provider-icons/tldv.svg +1 -0
  347. package/public/assets/provider-icons/todoist.svg +1 -0
  348. package/public/assets/provider-icons/trafft.svg +35 -0
  349. package/public/assets/provider-icons/trakstar-hire.svg +2 -0
  350. package/public/assets/provider-icons/trello.svg +1 -0
  351. package/public/assets/provider-icons/tremendous-sandbox.svg +1 -0
  352. package/public/assets/provider-icons/tsheetsteam.svg +1 -0
  353. package/public/assets/provider-icons/tumblr.svg +1 -0
  354. package/public/assets/provider-icons/twenty-crm.svg +1 -0
  355. package/public/assets/provider-icons/twilio.svg +1 -0
  356. package/public/assets/provider-icons/twinfield.svg +1 -0
  357. package/public/assets/provider-icons/twitch.svg +1 -0
  358. package/public/assets/provider-icons/twitter.svg +1 -0
  359. package/public/assets/provider-icons/typeform.svg +1 -0
  360. package/public/assets/provider-icons/typefully.svg +1 -0
  361. package/public/assets/provider-icons/uber.svg +1 -0
  362. package/public/assets/provider-icons/ukg-pro-wfm.svg +2 -0
  363. package/public/assets/provider-icons/ukg-pro.svg +2 -0
  364. package/public/assets/provider-icons/ukg-ready.svg +2 -0
  365. package/public/assets/provider-icons/unanet.svg +1 -0
  366. package/public/assets/provider-icons/unauthenticated.svg +6 -0
  367. package/public/assets/provider-icons/unipile.svg +9 -0
  368. package/public/assets/provider-icons/vercel.svg +1 -0
  369. package/public/assets/provider-icons/vimeo.svg +1 -0
  370. package/public/assets/provider-icons/wakatime.svg +1 -0
  371. package/public/assets/provider-icons/wave-accounting.svg +1 -0
  372. package/public/assets/provider-icons/wealthbox.svg +1 -0
  373. package/public/assets/provider-icons/webflow.svg +1 -0
  374. package/public/assets/provider-icons/whatsapp-business.svg +1 -0
  375. package/public/assets/provider-icons/whoop.svg +1 -0
  376. package/public/assets/provider-icons/wildix-pbx.svg +1 -0
  377. package/public/assets/provider-icons/woocommerce.svg +1 -0
  378. package/public/assets/provider-icons/wordpress.svg +1 -0
  379. package/public/assets/provider-icons/workable.svg +1 -0
  380. package/public/assets/provider-icons/workday.svg +1 -0
  381. package/public/assets/provider-icons/wrike.svg +1 -0
  382. package/public/assets/provider-icons/xai.svg +1 -0
  383. package/public/assets/provider-icons/xero.svg +1 -0
  384. package/public/assets/provider-icons/yahoo.svg +1 -0
  385. package/public/assets/provider-icons/yandex.svg +1 -0
  386. package/public/assets/provider-icons/youtube.svg +1 -0
  387. package/public/assets/provider-icons/zapier-nla.svg +1 -0
  388. package/public/assets/provider-icons/zendesk.svg +1 -0
  389. package/public/assets/provider-icons/zenefits.svg +1 -0
  390. package/public/assets/provider-icons/zoho-bigin.svg +1 -0
  391. package/public/assets/provider-icons/zoho-books.svg +1 -0
  392. package/public/assets/provider-icons/zoho-crm.svg +1 -0
  393. package/public/assets/provider-icons/zoho-desk.svg +1 -0
  394. package/public/assets/provider-icons/zoho-inventory.svg +1 -0
  395. package/public/assets/provider-icons/zoho-invoice.svg +1 -0
  396. package/public/assets/provider-icons/zoho-mail.svg +1 -0
  397. package/public/assets/provider-icons/zoho-people.svg +1 -0
  398. package/public/assets/provider-icons/zoho.svg +1 -0
  399. package/public/assets/provider-icons/zoom.svg +1 -0
  400. package/public/assets/provider-icons/zoominfo.svg +1 -0
  401. package/public/assets/provider-icons/zuora.svg +1 -0
  402. package/src/app/[tenantId]/page.tsx +8 -0
  403. package/src/app/[tenantId]/projects/[projectId]/api-keys/error.tsx +7 -0
  404. package/src/app/[tenantId]/projects/[projectId]/api-keys/page.tsx +62 -0
  405. package/src/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/error.tsx +18 -0
  406. package/src/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.tsx +44 -0
  407. package/src/app/[tenantId]/projects/[projectId]/artifact-components/error.tsx +7 -0
  408. package/src/app/[tenantId]/projects/[projectId]/artifact-components/loading.tsx +20 -0
  409. package/src/app/[tenantId]/projects/[projectId]/artifact-components/new/page.tsx +30 -0
  410. package/src/app/[tenantId]/projects/[projectId]/artifact-components/page.tsx +69 -0
  411. package/src/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.tsx +64 -0
  412. package/src/app/[tenantId]/projects/[projectId]/credentials/error.tsx +7 -0
  413. package/src/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.tsx +28 -0
  414. package/src/app/[tenantId]/projects/[projectId]/credentials/new/page.tsx +78 -0
  415. package/src/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.tsx +192 -0
  416. package/src/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.tsx +60 -0
  417. package/src/app/[tenantId]/projects/[projectId]/credentials/page.tsx +67 -0
  418. package/src/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/error.tsx +18 -0
  419. package/src/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.tsx +40 -0
  420. package/src/app/[tenantId]/projects/[projectId]/data-components/error.tsx +7 -0
  421. package/src/app/[tenantId]/projects/[projectId]/data-components/loading.tsx +20 -0
  422. package/src/app/[tenantId]/projects/[projectId]/data-components/new/page.tsx +27 -0
  423. package/src/app/[tenantId]/projects/[projectId]/data-components/page.tsx +66 -0
  424. package/src/app/[tenantId]/projects/[projectId]/graphs/[graphId]/error.tsx +21 -0
  425. package/src/app/[tenantId]/projects/[projectId]/graphs/[graphId]/loading.tsx +29 -0
  426. package/src/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.tsx +52 -0
  427. package/src/app/[tenantId]/projects/[projectId]/graphs/error.tsx +7 -0
  428. package/src/app/[tenantId]/projects/[projectId]/graphs/loading.tsx +20 -0
  429. package/src/app/[tenantId]/projects/[projectId]/graphs/new/page.tsx +45 -0
  430. package/src/app/[tenantId]/projects/[projectId]/graphs/page.tsx +50 -0
  431. package/src/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.tsx +91 -0
  432. package/src/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.tsx +38 -0
  433. package/src/app/[tenantId]/projects/[projectId]/mcp-servers/new/layout.tsx +22 -0
  434. package/src/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.tsx +24 -0
  435. package/src/app/[tenantId]/projects/[projectId]/mcp-servers/page.tsx +61 -0
  436. package/src/app/[tenantId]/projects/[projectId]/page.tsx +12 -0
  437. package/src/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.tsx +40 -0
  438. package/src/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.tsx +32 -0
  439. package/src/app/[tenantId]/projects/[projectId]/traces/page.tsx +20 -0
  440. package/src/app/[tenantId]/projects/error.tsx +7 -0
  441. package/src/app/[tenantId]/projects/loading.tsx +20 -0
  442. package/src/app/[tenantId]/projects/page.tsx +61 -0
  443. package/src/app/api/signoz/conversations/[conversationId]/route.ts +863 -0
  444. package/src/app/api/signoz/route.ts +115 -0
  445. package/src/app/favicon.ico +0 -0
  446. package/src/app/globals.css +261 -0
  447. package/src/app/icon.svg +5 -0
  448. package/src/app/layout.tsx +59 -0
  449. package/src/app/page.tsx +13 -0
  450. package/src/app/utils/__tests__/format-date.test.ts +133 -0
  451. package/src/app/utils/active-tools.ts +24 -0
  452. package/src/app/utils/format-date.ts +95 -0
  453. package/src/components/api-keys/api-key-display.tsx +57 -0
  454. package/src/components/api-keys/api-key-item-menu.tsx +54 -0
  455. package/src/components/api-keys/api-keys-table.tsx +77 -0
  456. package/src/components/api-keys/delete-api-key-confirmation.tsx +45 -0
  457. package/src/components/api-keys/expiration-indicator.tsx +86 -0
  458. package/src/components/api-keys/form/api-key-form.tsx +120 -0
  459. package/src/components/api-keys/form/form-configuration.tsx +7 -0
  460. package/src/components/api-keys/form/validation.ts +20 -0
  461. package/src/components/api-keys/new-api-key-dialog.tsx +84 -0
  462. package/src/components/artifact-components/artifact-component-item-menu.tsx +61 -0
  463. package/src/components/artifact-components/artifact-component-item.tsx +42 -0
  464. package/src/components/artifact-components/artifact-component-list.tsx +27 -0
  465. package/src/components/artifact-components/delete-artifact-component-confirmation.tsx +45 -0
  466. package/src/components/artifact-components/form/artifact-component-form.tsx +127 -0
  467. package/src/components/artifact-components/form/form-configuration.tsx +9 -0
  468. package/src/components/artifact-components/form/validation.ts +42 -0
  469. package/src/components/credentials/credential-item.tsx +124 -0
  470. package/src/components/credentials/credential-tools-list.tsx +111 -0
  471. package/src/components/credentials/credentials-list.tsx +36 -0
  472. package/src/components/credentials/views/auth-form-config.ts +202 -0
  473. package/src/components/credentials/views/credential-form-validation.ts +14 -0
  474. package/src/components/credentials/views/credential-form.tsx +203 -0
  475. package/src/components/credentials/views/edit-credential-form.tsx +177 -0
  476. package/src/components/credentials/views/generic-auth-form.tsx +194 -0
  477. package/src/components/credentials/views/nango-providers-grid.tsx +136 -0
  478. package/src/components/credentials/views/new-credential-form.tsx +60 -0
  479. package/src/components/data-components/data-component-item-menu.tsx +61 -0
  480. package/src/components/data-components/data-component-item.tsx +42 -0
  481. package/src/components/data-components/data-components-list.tsx +27 -0
  482. package/src/components/data-components/delete-data-component-confirmation.tsx +45 -0
  483. package/src/components/data-components/form/data-component-form.tsx +113 -0
  484. package/src/components/data-components/form/form-configuration.ts +8 -0
  485. package/src/components/data-components/form/validation.ts +38 -0
  486. package/src/components/errors/full-page-error.tsx +37 -0
  487. package/src/components/form/expandable-field.tsx +72 -0
  488. package/src/components/form/expandable-json-editor.tsx +139 -0
  489. package/src/components/form/form-field-wrapper.tsx +47 -0
  490. package/src/components/form/generic-combo-box.tsx +94 -0
  491. package/src/components/form/generic-input.tsx +51 -0
  492. package/src/components/form/generic-key-value-input.tsx +146 -0
  493. package/src/components/form/generic-select.tsx +56 -0
  494. package/src/components/form/generic-textarea.tsx +39 -0
  495. package/src/components/form/json-editor.tsx +47 -0
  496. package/src/components/form/json-schema-input.tsx +39 -0
  497. package/src/components/form/standalone-json-editor.tsx +71 -0
  498. package/src/components/graph/configuration/edge-types.tsx +42 -0
  499. package/src/components/graph/configuration/graph-types.tsx +51 -0
  500. package/src/components/graph/configuration/model-options.tsx +39 -0
  501. package/src/components/graph/configuration/node-types.tsx +95 -0
  502. package/src/components/graph/edges/agent-to-agent-edge.tsx +146 -0
  503. package/src/components/graph/edges/default-edge.tsx +38 -0
  504. package/src/components/graph/error-display/error-indicator.tsx +50 -0
  505. package/src/components/graph/error-display/graph-error-summary.tsx +181 -0
  506. package/src/components/graph/graph.tsx +540 -0
  507. package/src/components/graph/markers/default-marker.tsx +28 -0
  508. package/src/components/graph/markers/selected-marker.tsx +28 -0
  509. package/src/components/graph/node-library/node-item.tsx +39 -0
  510. package/src/components/graph/node-library/node-library.tsx +20 -0
  511. package/src/components/graph/nodes/agent-node.tsx +125 -0
  512. package/src/components/graph/nodes/base-node.tsx +88 -0
  513. package/src/components/graph/nodes/external-agent-node.tsx +55 -0
  514. package/src/components/graph/nodes/handle.tsx +14 -0
  515. package/src/components/graph/nodes/mcp-node.tsx +37 -0
  516. package/src/components/graph/nodes/mcp-placeholder-node.tsx +23 -0
  517. package/src/components/graph/nodes/node-tab.tsx +21 -0
  518. package/src/components/graph/playground/chat-widget.tsx +202 -0
  519. package/src/components/graph/playground/ikp-message.tsx +575 -0
  520. package/src/components/graph/playground/playground.tsx +66 -0
  521. package/src/components/graph/sidepane/edges/edge-editor.tsx +135 -0
  522. package/src/components/graph/sidepane/heading.tsx +17 -0
  523. package/src/components/graph/sidepane/metadata/context-config.tsx +82 -0
  524. package/src/components/graph/sidepane/metadata/metadata-editor.tsx +644 -0
  525. package/src/components/graph/sidepane/nodes/agent-node-editor.tsx +196 -0
  526. package/src/components/graph/sidepane/nodes/component-selector/component-dropdown.tsx +100 -0
  527. package/src/components/graph/sidepane/nodes/component-selector/component-header.tsx +18 -0
  528. package/src/components/graph/sidepane/nodes/component-selector/component-selector.tsx +62 -0
  529. package/src/components/graph/sidepane/nodes/component-selector/selected-components.tsx +44 -0
  530. package/src/components/graph/sidepane/nodes/empty-state.tsx +29 -0
  531. package/src/components/graph/sidepane/nodes/expandable-text-area.tsx +30 -0
  532. package/src/components/graph/sidepane/nodes/external-agent-node-editor.tsx +76 -0
  533. package/src/components/graph/sidepane/nodes/form-fields.tsx +117 -0
  534. package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +140 -0
  535. package/src/components/graph/sidepane/nodes/mcp-selector/loading.tsx +20 -0
  536. package/src/components/graph/sidepane/nodes/mcp-selector/mcp-selector.tsx +93 -0
  537. package/src/components/graph/sidepane/nodes/mcp-selector/mcp-server-item.tsx +57 -0
  538. package/src/components/graph/sidepane/nodes/model-section.tsx +202 -0
  539. package/src/components/graph/sidepane/nodes/model-selector.tsx +157 -0
  540. package/src/components/graph/sidepane/sidepane.tsx +156 -0
  541. package/src/components/graph/toolbar/toolbar.tsx +61 -0
  542. package/src/components/graphs/delete-graph-confirmation.tsx +46 -0
  543. package/src/components/graphs/graph-item-menu.tsx +54 -0
  544. package/src/components/graphs/graph-item.tsx +47 -0
  545. package/src/components/graphs/graph-list.tsx +20 -0
  546. package/src/components/graphs/new-graph-item.tsx +23 -0
  547. package/src/components/icons/anthropic.tsx +21 -0
  548. package/src/components/icons/dashed-spline.tsx +31 -0
  549. package/src/components/icons/empty-state/conversations.tsx +24 -0
  550. package/src/components/icons/empty-state/credentials.tsx +85 -0
  551. package/src/components/icons/empty-state/default.tsx +57 -0
  552. package/src/components/icons/empty-state/graphs.tsx +58 -0
  553. package/src/components/icons/mcp-icon.tsx +24 -0
  554. package/src/components/icons/openai.tsx +14 -0
  555. package/src/components/icons/provider-icon.tsx +91 -0
  556. package/src/components/layout/body-template.tsx +19 -0
  557. package/src/components/layout/empty-state.tsx +56 -0
  558. package/src/components/layout/main-content.tsx +14 -0
  559. package/src/components/layout/page-header.tsx +77 -0
  560. package/src/components/layout/sidepane.tsx +81 -0
  561. package/src/components/layout/site-content.tsx +7 -0
  562. package/src/components/layout/site-header.tsx +24 -0
  563. package/src/components/logo.tsx +48 -0
  564. package/src/components/mcp-servers/available-tools-card.tsx +122 -0
  565. package/src/components/mcp-servers/form/active-tools-selector.tsx +256 -0
  566. package/src/components/mcp-servers/form/mcp-server-form.tsx +161 -0
  567. package/src/components/mcp-servers/form/validation.ts +32 -0
  568. package/src/components/mcp-servers/mcp-tool-image.tsx +78 -0
  569. package/src/components/mcp-servers/mcp-tool-item.tsx +205 -0
  570. package/src/components/mcp-servers/mcp-tools-list.tsx +21 -0
  571. package/src/components/mcp-servers/view-mcp-server-details.tsx +261 -0
  572. package/src/components/projects/delete-project-confirmation.tsx +51 -0
  573. package/src/components/projects/edit-project-dialog.tsx +51 -0
  574. package/src/components/projects/form/form-configuration.ts +16 -0
  575. package/src/components/projects/form/project-form.tsx +122 -0
  576. package/src/components/projects/form/project-models-section.tsx +175 -0
  577. package/src/components/projects/form/project-stopwhen-section.tsx +89 -0
  578. package/src/components/projects/form/validation.ts +39 -0
  579. package/src/components/projects/new-project-dialog.tsx +68 -0
  580. package/src/components/projects/project-item-menu.tsx +73 -0
  581. package/src/components/projects/project-item.tsx +53 -0
  582. package/src/components/projects/project-list.tsx +17 -0
  583. package/src/components/sidebar-nav/nav-group.tsx +22 -0
  584. package/src/components/sidebar-nav/nav-item.tsx +32 -0
  585. package/src/components/sidebar-nav/project-selector.tsx +113 -0
  586. package/src/components/sidebar-nav/project-switcher.tsx +73 -0
  587. package/src/components/sidebar-nav/sidebar-nav.tsx +126 -0
  588. package/src/components/theme-provider.tsx +8 -0
  589. package/src/components/theme-toggle.tsx +62 -0
  590. package/src/components/traces/ai-calls-breakdown.tsx +462 -0
  591. package/src/components/traces/charts/area-chart-card.tsx +41 -0
  592. package/src/components/traces/charts/area-chart.tsx +98 -0
  593. package/src/components/traces/charts/chart-card.tsx +98 -0
  594. package/src/components/traces/charts/chart-error.tsx +7 -0
  595. package/src/components/traces/charts/chart-no-results.tsx +7 -0
  596. package/src/components/traces/charts/stat-card.tsx +45 -0
  597. package/src/components/traces/charts/stat.tsx +36 -0
  598. package/src/components/traces/conversation-detail.tsx +275 -0
  599. package/src/components/traces/conversation-errors.tsx +312 -0
  600. package/src/components/traces/conversation-stats/conversation-list-item.tsx +91 -0
  601. package/src/components/traces/conversation-stats/conversation-stats-card.tsx +242 -0
  602. package/src/components/traces/conversation-stats/loading-skeleton.tsx +31 -0
  603. package/src/components/traces/filters/date-picker.tsx +173 -0
  604. package/src/components/traces/filters/filter-trigger.tsx +92 -0
  605. package/src/components/traces/filters/graph-filter.tsx +71 -0
  606. package/src/components/traces/signoz-link.tsx +152 -0
  607. package/src/components/traces/timeline/activity-details-sidepane.tsx +34 -0
  608. package/src/components/traces/timeline/activity-timeline.tsx +31 -0
  609. package/src/components/traces/timeline/blocks.tsx +66 -0
  610. package/src/components/traces/timeline/bubble.tsx +44 -0
  611. package/src/components/traces/timeline/flow.tsx +16 -0
  612. package/src/components/traces/timeline/render-panel-content.tsx +362 -0
  613. package/src/components/traces/timeline/tag-row.tsx +14 -0
  614. package/src/components/traces/timeline/timeline-item.tsx +394 -0
  615. package/src/components/traces/timeline/timeline-wrapper.tsx +293 -0
  616. package/src/components/traces/timeline/types.ts +154 -0
  617. package/src/components/traces/traces-overview.tsx +730 -0
  618. package/src/components/ui/alert-dialog.tsx +134 -0
  619. package/src/components/ui/badge.tsx +46 -0
  620. package/src/components/ui/breadcrumbs.tsx +35 -0
  621. package/src/components/ui/button.tsx +66 -0
  622. package/src/components/ui/calendar.tsx +177 -0
  623. package/src/components/ui/card-grid.tsx +68 -0
  624. package/src/components/ui/card.tsx +75 -0
  625. package/src/components/ui/chart.tsx +322 -0
  626. package/src/components/ui/checkbox.tsx +29 -0
  627. package/src/components/ui/clickable-card.tsx +65 -0
  628. package/src/components/ui/collapsible.tsx +21 -0
  629. package/src/components/ui/combobox.tsx +145 -0
  630. package/src/components/ui/command.tsx +163 -0
  631. package/src/components/ui/copy-button.tsx +43 -0
  632. package/src/components/ui/copyable-single-line-code.tsx +14 -0
  633. package/src/components/ui/delete-confirmation.tsx +53 -0
  634. package/src/components/ui/dialog.tsx +131 -0
  635. package/src/components/ui/dropdown-menu.tsx +228 -0
  636. package/src/components/ui/external-link.tsx +22 -0
  637. package/src/components/ui/form.tsx +151 -0
  638. package/src/components/ui/inheritance-indicator.tsx +264 -0
  639. package/src/components/ui/input.tsx +21 -0
  640. package/src/components/ui/item-card-grid.tsx +101 -0
  641. package/src/components/ui/item-card.tsx +112 -0
  642. package/src/components/ui/label.tsx +21 -0
  643. package/src/components/ui/popover.tsx +51 -0
  644. package/src/components/ui/resizable.tsx +56 -0
  645. package/src/components/ui/scroll-area.tsx +56 -0
  646. package/src/components/ui/select.tsx +170 -0
  647. package/src/components/ui/separator.tsx +28 -0
  648. package/src/components/ui/sheet.tsx +130 -0
  649. package/src/components/ui/sidebar.tsx +695 -0
  650. package/src/components/ui/skeleton.tsx +13 -0
  651. package/src/components/ui/sonner.tsx +25 -0
  652. package/src/components/ui/svg-icon.tsx +49 -0
  653. package/src/components/ui/switch.tsx +26 -0
  654. package/src/components/ui/table.tsx +100 -0
  655. package/src/components/ui/textarea.tsx +18 -0
  656. package/src/components/ui/tooltip.tsx +57 -0
  657. package/src/constants/page-descriptions.tsx +53 -0
  658. package/src/constants/signoz.ts +280 -0
  659. package/src/features/graph/commands/command-manager.ts +67 -0
  660. package/src/features/graph/commands/commands.ts +123 -0
  661. package/src/features/graph/domain/__tests__/roundtrip.test.ts +75 -0
  662. package/src/features/graph/domain/__tests__/serialize.test.ts +196 -0
  663. package/src/features/graph/domain/deserialize.ts +266 -0
  664. package/src/features/graph/domain/index.ts +2 -0
  665. package/src/features/graph/domain/serialize.ts +314 -0
  666. package/src/features/graph/state/use-graph-store.ts +208 -0
  667. package/src/features/graph/ui/use-graph-shortcuts.ts +41 -0
  668. package/src/hooks/use-ai-calls-query-state.ts +55 -0
  669. package/src/hooks/use-chat-activities-polling.ts +145 -0
  670. package/src/hooks/use-copy-to-clipboard.tsx +31 -0
  671. package/src/hooks/use-cursor-to-end.ts +48 -0
  672. package/src/hooks/use-disclosure.ts +15 -0
  673. package/src/hooks/use-graph-errors.ts +98 -0
  674. package/src/hooks/use-mobile.ts +19 -0
  675. package/src/hooks/use-nango-connect.ts +42 -0
  676. package/src/hooks/use-nango-providers.ts +32 -0
  677. package/src/hooks/use-node-editor.ts +141 -0
  678. package/src/hooks/use-project-data.ts +47 -0
  679. package/src/hooks/use-side-pane.ts +20 -0
  680. package/src/hooks/use-traces-query-state.ts +88 -0
  681. package/src/hooks/use-traces.ts +240 -0
  682. package/src/lib/README.md +145 -0
  683. package/src/lib/actions/api-keys.ts +99 -0
  684. package/src/lib/actions/artifact-components.ts +143 -0
  685. package/src/lib/actions/credentials.ts +42 -0
  686. package/src/lib/actions/data-components.ts +143 -0
  687. package/src/lib/actions/graph-full.ts +221 -0
  688. package/src/lib/actions/projects.ts +168 -0
  689. package/src/lib/actions/tools.ts +42 -0
  690. package/src/lib/actions/types.ts +7 -0
  691. package/src/lib/api/api-config.ts +104 -0
  692. package/src/lib/api/api-keys.ts +117 -0
  693. package/src/lib/api/artifact-components.ts +146 -0
  694. package/src/lib/api/credentials.ts +127 -0
  695. package/src/lib/api/data-components.ts +141 -0
  696. package/src/lib/api/graph-full-client.ts +109 -0
  697. package/src/lib/api/projects.ts +104 -0
  698. package/src/lib/api/resource-validation.ts +109 -0
  699. package/src/lib/api/signoz-sql.ts +175 -0
  700. package/src/lib/api/signoz-stats.ts +1018 -0
  701. package/src/lib/api/tools.ts +221 -0
  702. package/src/lib/events.ts +34 -0
  703. package/src/lib/index.ts +48 -0
  704. package/src/lib/json-schema-validation.ts +363 -0
  705. package/src/lib/logger.ts +45 -0
  706. package/src/lib/mcp-tools/nango-types.ts +19 -0
  707. package/src/lib/mcp-tools/nango.ts +459 -0
  708. package/src/lib/services/save-graph.ts +14 -0
  709. package/src/lib/types/errors.ts +18 -0
  710. package/src/lib/types/graph-full.ts +65 -0
  711. package/src/lib/types/project.ts +26 -0
  712. package/src/lib/types/response.ts +13 -0
  713. package/src/lib/utils/credentials-utils.ts +31 -0
  714. package/src/lib/utils/graph-error-parser.ts +262 -0
  715. package/src/lib/utils/mcp-schema-parser.ts +202 -0
  716. package/src/lib/utils/mcp-urls.ts +63 -0
  717. package/src/lib/utils/mcp-utils.ts +18 -0
  718. package/src/lib/utils/project-redirect.ts +39 -0
  719. package/src/lib/utils.ts +46 -0
  720. package/src/lib/validation.ts +14 -0
  721. package/tsconfig.json +27 -0
  722. package/vitest.config.ts +43 -0
@@ -0,0 +1,19 @@
1
+ // Error classes for better error handling
2
+ export class NangoError extends Error {
3
+ constructor(
4
+ message: string,
5
+ public readonly operation?: string,
6
+ public readonly cause?: unknown
7
+ ) {
8
+ super(message);
9
+ this.name = 'NangoError';
10
+ }
11
+ }
12
+
13
+ // Helper to wrap errors, preserving existing NangoErrors
14
+ export function wrapNangoError(error: unknown, message: string, operation?: string): never {
15
+ if (error instanceof NangoError) {
16
+ throw error;
17
+ }
18
+ throw new NangoError(message, operation, error);
19
+ }
@@ -0,0 +1,459 @@
1
+ 'use server';
2
+
3
+ /**
4
+ * Nango Integration Utilities
5
+ *
6
+ * This file contains server-side functions for interacting with the Nango API.
7
+ *
8
+ * IMPORTANT: All patterns here involve external API calls to Nango, which has
9
+ * atomic constraints enforced at their database level. Patterns that might look
10
+ * like race conditions (optimistic creation + fallback fetch) are actually safe
11
+ * and recommended for external APIs with uniqueness constraints.
12
+ */
13
+
14
+ import { generateIdFromName } from '@inkeep/agents-core/client-exports';
15
+ import { Nango } from '@nangohq/node';
16
+ import type {
17
+ ApiKeyCredentials,
18
+ ApiProvider,
19
+ ApiPublicConnection,
20
+ ApiPublicIntegration,
21
+ ApiPublicIntegrationCredentials,
22
+ } from '@nangohq/types';
23
+ import { NangoError, wrapNangoError } from './nango-types';
24
+
25
+ // Initialize Nango client with environment variables
26
+ const getNangoClient = () => {
27
+ const secretKey = process.env.NANGO_SECRET_KEY;
28
+ if (!secretKey) {
29
+ throw new NangoError('NANGO_SECRET_KEY environment variable is required for Nango integration');
30
+ }
31
+
32
+ try {
33
+ return new Nango({
34
+ secretKey,
35
+ host: process.env.NEXT_PUBLIC_NANGO_HOST || undefined, // defaults to Nango Cloud
36
+ });
37
+ } catch (error) {
38
+ throw new NangoError('Failed to initialize Nango client', 'new Nango', error);
39
+ }
40
+ };
41
+
42
+ /**
43
+ * Fetch all available Nango providers
44
+ */
45
+ export async function fetchNangoProviders(): Promise<ApiProvider[]> {
46
+ try {
47
+ const nango = getNangoClient();
48
+ const response = await nango.listProviders({});
49
+ return response.data;
50
+ } catch (error) {
51
+ console.error('Failed to fetch providers:', error);
52
+ wrapNangoError(error, 'Unable to retrieve available providers from Nango', 'listProviders');
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Get details for a specific Nango provider
58
+ */
59
+ export async function fetchNangoProvider(providerName: string): Promise<ApiProvider> {
60
+ try {
61
+ const nango = getNangoClient();
62
+ const response = await nango.getProvider({ provider: providerName });
63
+ return response.data;
64
+ } catch (error) {
65
+ console.error(`Failed to fetch provider ${providerName}:`, error);
66
+ wrapNangoError(error, `Provider '${providerName}' not found or inaccessible`, 'getProvider');
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Fetch user's existing Nango integrations
72
+ */
73
+ export async function fetchNangoIntegrations(): Promise<ApiPublicIntegration[]> {
74
+ try {
75
+ const nango = getNangoClient();
76
+ const response = await nango.listIntegrations();
77
+ return response.configs;
78
+ } catch (error) {
79
+ console.error('Failed to fetch integrations:', error);
80
+ wrapNangoError(error, 'Unable to retrieve existing integrations', 'listIntegrations');
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Fetch a specific Nango integration
86
+ */
87
+ export async function fetchNangoIntegration(
88
+ uniqueKey: string
89
+ ): Promise<(ApiPublicIntegration & { areCredentialsSet: boolean }) | null> {
90
+ try {
91
+ const nango = getNangoClient();
92
+
93
+ const response = await nango.getIntegration({ uniqueKey }, { include: ['credentials'] });
94
+ const integration = response.data;
95
+
96
+ // Determine if credentials are set (server-side only)
97
+ let areCredentialsSet = false;
98
+
99
+ if (
100
+ integration.credentials?.type === 'OAUTH2' ||
101
+ integration.credentials?.type === 'OAUTH1' ||
102
+ integration.credentials?.type === 'TBA'
103
+ ) {
104
+ areCredentialsSet = !!(
105
+ integration.credentials?.client_id && integration.credentials?.client_secret
106
+ );
107
+ } else if (integration.credentials?.type === 'APP') {
108
+ areCredentialsSet = !!(integration.credentials?.app_id && integration.credentials?.app_link);
109
+ } else {
110
+ areCredentialsSet = true;
111
+ }
112
+
113
+ // Strip credentials before returning to frontend
114
+ const { credentials: _credentials, ...integrationWithoutCredentials } = integration;
115
+
116
+ return {
117
+ ...integrationWithoutCredentials,
118
+ areCredentialsSet,
119
+ };
120
+ } catch (error) {
121
+ // Check if this is a 404 (integration not found) - return null for this case
122
+ if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
123
+ return null;
124
+ }
125
+
126
+ console.error(`Failed to fetch integration ${uniqueKey}:`, error);
127
+ wrapNangoError(error, `Unable to fetch integration with key '${uniqueKey}'`, 'getIntegration');
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Create a new Nango integration
133
+ */
134
+ export async function createNangoIntegration(params: {
135
+ provider: string;
136
+ uniqueKey: string;
137
+ displayName?: string;
138
+ credentials?: ApiPublicIntegrationCredentials;
139
+ }): Promise<ApiPublicIntegration> {
140
+ try {
141
+ const nango = getNangoClient();
142
+ const response = await nango.createIntegration({
143
+ provider: params.provider,
144
+ unique_key: params.uniqueKey,
145
+ display_name: params.displayName,
146
+ credentials: params.credentials,
147
+ });
148
+ return response.data;
149
+ } catch (error) {
150
+ console.error('Failed to create integration:', error);
151
+ wrapNangoError(
152
+ error,
153
+ `Failed to create integration '${params.uniqueKey}' for provider '${params.provider}'`,
154
+ 'createIntegration'
155
+ );
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Get connections for a specific integration
161
+ */
162
+ export async function fetchNangoConnections(
163
+ integrationKey?: string
164
+ ): Promise<ApiPublicConnection[]> {
165
+ try {
166
+ const nango = getNangoClient();
167
+ const response = await nango.listConnections();
168
+ return response.connections;
169
+ } catch (error) {
170
+ const context = integrationKey ? ` for integration '${integrationKey}'` : '';
171
+ console.error(`Failed to fetch connections${context}:`, error);
172
+ wrapNangoError(error, `Unable to retrieve connections${context}`, 'listConnections');
173
+ }
174
+ }
175
+
176
+ async function createNangoConnectSession({
177
+ endUserId = 'test-tenant',
178
+ endUserEmail = 'test@test-tenant.com',
179
+ endUserDisplayName = 'Test User',
180
+ organizationId = process.env.NEXT_PUBLIC_TENANT_ID || 'inkeep',
181
+ organizationDisplayName = 'Test Organization',
182
+ integrationId,
183
+ }: {
184
+ endUserId?: string;
185
+ endUserEmail?: string;
186
+ endUserDisplayName?: string;
187
+ organizationId?: string;
188
+ organizationDisplayName?: string;
189
+ integrationId: string;
190
+ }): Promise<{
191
+ token: string;
192
+ expires_at: string;
193
+ }> {
194
+ try {
195
+ const nango = getNangoClient();
196
+ const { data } = await nango.createConnectSession({
197
+ end_user: {
198
+ id: endUserId,
199
+ email: endUserEmail,
200
+ display_name: endUserDisplayName,
201
+ },
202
+ organization: {
203
+ id: organizationId,
204
+ display_name: organizationDisplayName,
205
+ },
206
+ allowed_integrations: [integrationId],
207
+ });
208
+ return data;
209
+ } catch (error) {
210
+ console.error('Failed to create connect session:', error);
211
+ wrapNangoError(
212
+ error,
213
+ `Unable to create connect session for integration '${integrationId}'`,
214
+ 'createConnectSession'
215
+ );
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Create an API key credential by setting up Nango integration and importing the connection
221
+ */
222
+ export async function createNangoApiKeyConnection({
223
+ name,
224
+ apiKeyToSet,
225
+ metadata,
226
+ }: {
227
+ name: string;
228
+ apiKeyToSet: string;
229
+ metadata: Record<string, string>;
230
+ }): Promise<{ integration: ApiPublicIntegration }> {
231
+ const provider = 'private-api-bearer';
232
+ const idFromName = generateIdFromName(name);
233
+
234
+ try {
235
+ // Step 1: Ensure Nango integration exists
236
+ let integration: ApiPublicIntegration;
237
+
238
+ /*
239
+ * SAFE PATTERN: Optimistic creation for external API with atomic constraints
240
+ *
241
+ * This is NOT a race condition because:
242
+ * 1. Nango API enforces uniqueKey constraints atomically in their database
243
+ * 2. Multiple concurrent requests will get deterministic results:
244
+ * - One request succeeds (creates the integration)
245
+ * - All others get 400 duplicate error (safe to handle)
246
+ * 3. The fetchNangoIntegration fallback is idempotent
247
+ *
248
+ * This pattern is recommended for external APIs vs local database operations
249
+ * where true race conditions could occur.
250
+ */
251
+ try {
252
+ // Optimistic creation - assume integration doesn't exist
253
+ integration = await createNangoIntegration({
254
+ provider,
255
+ uniqueKey: idFromName,
256
+ displayName: name,
257
+ });
258
+ } catch (error: any) {
259
+ // Handle Nango's atomic duplicate key rejection (400 status)
260
+ if (
261
+ error instanceof NangoError &&
262
+ error.cause &&
263
+ typeof error.cause === 'object' &&
264
+ 'status' in error.cause &&
265
+ error.cause.status === 400
266
+ ) {
267
+ // Safe fallback: fetch the existing integration (idempotent operation)
268
+ const existingIntegration = await fetchNangoIntegration(idFromName);
269
+ if (existingIntegration) {
270
+ integration = existingIntegration;
271
+ } else {
272
+ // Edge case: 400 error wasn't about duplicate key
273
+ wrapNangoError(error, `Integration creation failed for unexpected reasons`, 'create');
274
+ }
275
+ } else {
276
+ // Non-duplicate error (network, auth, etc.)
277
+ wrapNangoError(error, `Failed to create or retrieve integration '${idFromName}'`, 'create');
278
+ }
279
+ }
280
+
281
+ // Step 2: Import the connection to Nango
282
+ try {
283
+ const importConnectionUrl = `${process.env.NEXT_PUBLIC_NANGO_HOST || 'https://api.nango.dev'}/connections`;
284
+
285
+ const credentials: ApiKeyCredentials = {
286
+ type: 'API_KEY',
287
+ apiKey: apiKeyToSet,
288
+ };
289
+
290
+ const body = {
291
+ provider_config_key: integration.unique_key,
292
+ connection_id: idFromName,
293
+ metadata,
294
+ credentials,
295
+ };
296
+
297
+ const response = await fetch(importConnectionUrl, {
298
+ method: 'POST',
299
+ headers: {
300
+ Authorization: `Bearer ${process.env.NANGO_SECRET_KEY}`,
301
+ 'Content-Type': 'application/json',
302
+ },
303
+ body: JSON.stringify(body),
304
+ });
305
+
306
+ if (!response.ok) {
307
+ throw new NangoError(
308
+ `Failed to import connection: HTTP ${response.status} - ${response.statusText}`,
309
+ 'importConnection'
310
+ );
311
+ }
312
+ } catch (error) {
313
+ wrapNangoError(error, `Failed to import API key connection to Nango`, 'importConnection');
314
+ }
315
+
316
+ // Step 3: Set metadata (Nango workaround)
317
+ try {
318
+ await setNangoConnectionMetadata({
319
+ providerConfigKey: integration.unique_key,
320
+ connectionId: idFromName,
321
+ metadata,
322
+ });
323
+ } catch (error) {
324
+ // Non-critical error - log but don't fail
325
+ console.warn(`Failed to set metadata for connection ${idFromName}:`, error);
326
+ }
327
+ return { integration };
328
+ } catch (error) {
329
+ console.error('Unexpected error creating API key credential:', error);
330
+ wrapNangoError(
331
+ error,
332
+ `Unexpected error creating API key credential '${name}'`,
333
+ 'createNangoApiKeyConnection'
334
+ );
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Create a connect session for a Nango provider (sets up integration if needed)
340
+ */
341
+ export async function createProviderConnectSession({
342
+ providerName,
343
+ credentials,
344
+ }: {
345
+ providerName: string;
346
+ credentials?: ApiPublicIntegrationCredentials;
347
+ }): Promise<string> {
348
+ try {
349
+ // Step 1: Check for existing integration
350
+ let integration: ApiPublicIntegration;
351
+ let existingIntegration: (ApiPublicIntegration & { areCredentialsSet: boolean }) | null = null;
352
+
353
+ try {
354
+ existingIntegration = await fetchNangoIntegration(providerName);
355
+ } catch (error) {
356
+ if (error instanceof NangoError) {
357
+ throw error;
358
+ }
359
+ // Log but continue - integration might not exist yet
360
+ console.debug(`Integration '${providerName}' not found, will create new one`);
361
+ }
362
+
363
+ // Step 2: Use existing or create new integration
364
+ if (existingIntegration?.areCredentialsSet) {
365
+ integration = existingIntegration;
366
+ } else {
367
+ try {
368
+ integration = await createNangoIntegration({
369
+ provider: providerName,
370
+ uniqueKey: providerName,
371
+ displayName: providerName,
372
+ credentials,
373
+ });
374
+ } catch (error) {
375
+ wrapNangoError(
376
+ error,
377
+ `Failed to create integration for provider '${providerName}'`,
378
+ 'create'
379
+ );
380
+ }
381
+ }
382
+
383
+ // Step 3: Create connect session
384
+ try {
385
+ const connectSession = await createNangoConnectSession({
386
+ integrationId: integration.unique_key,
387
+ });
388
+
389
+ return connectSession.token;
390
+ } catch (error) {
391
+ wrapNangoError(
392
+ error,
393
+ `Failed to create connect session for integration '${integration.unique_key}'`,
394
+ 'createConnectSession'
395
+ );
396
+ }
397
+ } catch (error) {
398
+ console.error('Unexpected error creating provider connect session:', error);
399
+ wrapNangoError(
400
+ error,
401
+ `Unexpected error creating connect session for provider '${providerName}'`,
402
+ 'createProviderConnectSession'
403
+ );
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Get metadata for a Nango connection
409
+ */
410
+ export async function getNangoConnectionMetadata({
411
+ providerConfigKey,
412
+ connectionId,
413
+ }: {
414
+ providerConfigKey: string;
415
+ connectionId: string;
416
+ }): Promise<Record<string, string> | null> {
417
+ try {
418
+ const nango = getNangoClient();
419
+ const metadata = await nango.getMetadata(providerConfigKey, connectionId);
420
+ return metadata as Record<string, string>;
421
+ } catch (error) {
422
+ // Check if this is a 404 (connection not found) - return null for this case
423
+ if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
424
+ return null;
425
+ }
426
+
427
+ console.error('Failed to get connection metadata:', error);
428
+ wrapNangoError(
429
+ error,
430
+ `Unable to retrieve metadata for connection '${connectionId}'`,
431
+ 'getMetadata'
432
+ );
433
+ }
434
+ }
435
+
436
+ /**
437
+ * Set metadata for a Nango connection
438
+ */
439
+ export async function setNangoConnectionMetadata({
440
+ providerConfigKey,
441
+ connectionId,
442
+ metadata,
443
+ }: {
444
+ providerConfigKey: string;
445
+ connectionId: string;
446
+ metadata: Record<string, string>;
447
+ }): Promise<void> {
448
+ try {
449
+ const nango = getNangoClient();
450
+ await nango.setMetadata(providerConfigKey, connectionId, metadata);
451
+ } catch (error) {
452
+ console.error('Failed to set connection metadata:', error);
453
+ wrapNangoError(
454
+ error,
455
+ `Unable to update metadata for connection '${connectionId}'`,
456
+ 'setMetadata'
457
+ );
458
+ }
459
+ }
@@ -0,0 +1,14 @@
1
+ import { createFullGraphAction, updateFullGraphAction } from '@/lib/actions/graph-full';
2
+ import type { FullGraphDefinition } from '@/lib/types/graph-full';
3
+
4
+ export async function saveGraph(
5
+ tenantId: string,
6
+ projectId: string,
7
+ graph: FullGraphDefinition,
8
+ graphId?: string
9
+ ) {
10
+ if (graphId) {
11
+ return updateFullGraphAction(tenantId, projectId, graphId, graph);
12
+ }
13
+ return createFullGraphAction(tenantId, projectId, graph);
14
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Generic API error interface and class for handling API errors consistently across the application
3
+ */
4
+
5
+ export interface ApiErrorData {
6
+ code: string;
7
+ message: string;
8
+ }
9
+
10
+ export class ApiError extends Error {
11
+ constructor(
12
+ public error: ApiErrorData,
13
+ public status: number
14
+ ) {
15
+ super(error.message);
16
+ this.name = 'ApiError';
17
+ }
18
+ }
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Graph Full API Types and Schemas
5
+ *
6
+ * This module imports the original schemas from @inkeep/agents-core and re-exports
7
+ * them with agent-builder specific utilities and types.
8
+ */
9
+
10
+ // Import and re-export client-safe schemas from @inkeep/agents-core client exports
11
+ export {
12
+ // Types
13
+ type AgentApiInsert as AgentApi,
14
+ AgentApiInsertSchema as AgentApiSchema,
15
+ AgentGraphApiInsertSchema as AgentGraphApiSchema,
16
+ type AgentGraphInsert as AgentGraphApi,
17
+ ErrorResponseSchema,
18
+ type FullGraphDefinition,
19
+ // Core schemas
20
+ FullGraphDefinitionSchema,
21
+ ListResponseSchema,
22
+ // Response schemas
23
+ SingleResponseSchema,
24
+ // Parameter schemas
25
+ TenantParamsSchema,
26
+ ToolApiInsertSchema as ToolApiSchema,
27
+ type ToolInsert as ToolApi,
28
+ } from '@inkeep/agents-core/client-exports';
29
+
30
+ import { type FullGraphDefinition, TenantParamsSchema } from '@inkeep/agents-core/client-exports';
31
+ import type { SingleResponse } from './response';
32
+
33
+ // Agent-builder specific parameter schema
34
+ export const GraphIdParamsSchema = TenantParamsSchema.extend({
35
+ graphId: z.string(),
36
+ });
37
+
38
+ // Inferred Types
39
+ export type TenantParams = z.infer<typeof TenantParamsSchema>;
40
+ export type GraphIdParams = z.infer<typeof GraphIdParamsSchema>;
41
+
42
+ export type ErrorResponse = {
43
+ error: string;
44
+ message?: string;
45
+ details?: unknown;
46
+ };
47
+
48
+ export interface Graph {
49
+ id: string;
50
+ name: string;
51
+ description?: string | null;
52
+ createdAt: string;
53
+ updatedAt: string;
54
+ }
55
+
56
+ // API Response Types
57
+ export type CreateGraphResponse = SingleResponse<FullGraphDefinition>;
58
+ export type GetGraphResponse = SingleResponse<FullGraphDefinition>;
59
+ export type UpdateGraphResponse = SingleResponse<FullGraphDefinition>;
60
+
61
+ // API Error Types
62
+ export type GraphApiError = {
63
+ code: 'not_found' | 'bad_request' | 'internal_server_error' | 'conflict';
64
+ message: string;
65
+ };
@@ -0,0 +1,26 @@
1
+ export interface ModelSettings {
2
+ model: string;
3
+ providerOptions?: Record<string, any>;
4
+ }
5
+
6
+ export interface ProjectModels {
7
+ base?: ModelSettings;
8
+ structuredOutput?: ModelSettings;
9
+ summarizer?: ModelSettings;
10
+ }
11
+
12
+ export interface ProjectStopWhen {
13
+ transferCountIs?: number;
14
+ stepCountIs?: number;
15
+ }
16
+
17
+ export interface Project {
18
+ id?: string; // Backend field
19
+ projectId: string; // Frontend field (mapped from id)
20
+ name: string;
21
+ description: string;
22
+ models?: ProjectModels;
23
+ stopWhen?: ProjectStopWhen;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ }
@@ -0,0 +1,13 @@
1
+ export type SingleResponse<T> = {
2
+ data: T;
3
+ };
4
+
5
+ export interface ListResponse<T> {
6
+ data: T[];
7
+ pagination: {
8
+ page: number;
9
+ pageSize: number;
10
+ total: number;
11
+ totalPages: number;
12
+ };
13
+ }
@@ -0,0 +1,31 @@
1
+ 'use server';
2
+
3
+ import type { CredentialReferenceApiInsert } from '@inkeep/agents-core/client-exports';
4
+ import { createCredential, fetchCredential } from '@/lib/api/credentials';
5
+
6
+ /**
7
+ * Find existing credential or create a new one (idempotent operation)
8
+ */
9
+ export async function findOrCreateCredential(
10
+ tenantId: string,
11
+ projectId: string,
12
+ credentialData: CredentialReferenceApiInsert
13
+ ) {
14
+ try {
15
+ // Try to find existing credential first
16
+ const existingCredential = await fetchCredential(tenantId, projectId, credentialData.id);
17
+ if (existingCredential) {
18
+ return existingCredential;
19
+ }
20
+ } catch {
21
+ // Credential not found, continue with creation
22
+ }
23
+
24
+ // Create new credential
25
+ try {
26
+ return await createCredential(tenantId, projectId, credentialData);
27
+ } catch (error) {
28
+ console.error('Failed to save credential to database:', error);
29
+ throw new Error(`Failed to save credential '${credentialData.id}' to database`);
30
+ }
31
+ }