@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.
- package/.env.sample +5 -0
- package/.turbo/turbo-build.log +93 -0
- package/.turbo/turbo-test.log +33 -0
- package/.turbo/turbo-typecheck.log +5 -0
- package/README.md +81 -0
- package/components.json +21 -0
- package/eslint.config.mjs +14 -0
- package/next.config.ts +23 -0
- package/package.json +93 -0
- package/postcss.config.mjs +5 -0
- package/public/assets/logo-outline.svg +4 -0
- package/public/assets/logo.svg +10 -0
- package/public/assets/provider-icons/1password.svg +6 -0
- package/public/assets/provider-icons/accelo.svg +1 -0
- package/public/assets/provider-icons/active-campaign.svg +1 -0
- package/public/assets/provider-icons/acuity-scheduling.svg +1 -0
- package/public/assets/provider-icons/adobe.svg +1 -0
- package/public/assets/provider-icons/adp.svg +1 -0
- package/public/assets/provider-icons/adyen.svg +1 -0
- package/public/assets/provider-icons/affinity.svg +1 -0
- package/public/assets/provider-icons/aircall.svg +1 -0
- package/public/assets/provider-icons/airtable.svg +1 -0
- package/public/assets/provider-icons/algolia.svg +1 -0
- package/public/assets/provider-icons/amazon.svg +1 -0
- package/public/assets/provider-icons/amplitude.svg +1 -0
- package/public/assets/provider-icons/anrok.svg +1 -0
- package/public/assets/provider-icons/anthropic.svg +1 -0
- package/public/assets/provider-icons/apaleo.svg +1 -0
- package/public/assets/provider-icons/apollo.svg +1 -0
- package/public/assets/provider-icons/apple-app-store.svg +1 -0
- package/public/assets/provider-icons/appstle-subscriptions.svg +1 -0
- package/public/assets/provider-icons/asana.svg +1 -0
- package/public/assets/provider-icons/ashby.svg +1 -0
- package/public/assets/provider-icons/atlas-so.svg +4 -0
- package/public/assets/provider-icons/atlassian.svg +1 -0
- package/public/assets/provider-icons/attio.svg +1 -0
- package/public/assets/provider-icons/auth0.svg +1 -0
- package/public/assets/provider-icons/autodesk.svg +1 -0
- package/public/assets/provider-icons/avalara.svg +1 -0
- package/public/assets/provider-icons/aws.svg +1 -0
- package/public/assets/provider-icons/azure-blob-storage.svg +1 -0
- package/public/assets/provider-icons/azure-devops.svg +6 -0
- package/public/assets/provider-icons/bamboohr.svg +1 -0
- package/public/assets/provider-icons/basecamp.svg +1 -0
- package/public/assets/provider-icons/battlenet.svg +1 -0
- package/public/assets/provider-icons/beehiiv.svg +1 -0
- package/public/assets/provider-icons/bigcommerce.svg +1 -0
- package/public/assets/provider-icons/bill-sandbox.svg +1 -0
- package/public/assets/provider-icons/bitbucket.svg +1 -0
- package/public/assets/provider-icons/bitdefender.svg +1 -0
- package/public/assets/provider-icons/bitly.svg +1 -0
- package/public/assets/provider-icons/blackbaud.svg +1 -0
- package/public/assets/provider-icons/blandai.svg +9 -0
- package/public/assets/provider-icons/boldsign.svg +1 -0
- package/public/assets/provider-icons/booking-com.svg +1 -0
- package/public/assets/provider-icons/box.svg +1 -0
- package/public/assets/provider-icons/braintree.svg +1 -0
- package/public/assets/provider-icons/braze.svg +1 -0
- package/public/assets/provider-icons/brevo-api-key.svg +3 -0
- package/public/assets/provider-icons/brex.svg +1 -0
- package/public/assets/provider-icons/brightcrowd.svg +1 -0
- package/public/assets/provider-icons/builder-io-public.svg +1 -0
- package/public/assets/provider-icons/buildium.svg +1 -0
- package/public/assets/provider-icons/builtwith.svg +1 -0
- package/public/assets/provider-icons/cal-com-v1.svg +4 -0
- package/public/assets/provider-icons/calendly.svg +1 -0
- package/public/assets/provider-icons/callrail.svg +1 -0
- package/public/assets/provider-icons/canny.svg +1 -0
- package/public/assets/provider-icons/canva-scim.svg +1 -0
- package/public/assets/provider-icons/certn.svg +5 -0
- package/public/assets/provider-icons/chargebee.svg +1 -0
- package/public/assets/provider-icons/chattermill.svg +1 -0
- package/public/assets/provider-icons/checkhq.svg +10 -0
- package/public/assets/provider-icons/checkout-com.svg +1 -0
- package/public/assets/provider-icons/checkr-partner.svg +1 -0
- package/public/assets/provider-icons/chorus.svg +1 -0
- package/public/assets/provider-icons/circle-so.svg +1 -0
- package/public/assets/provider-icons/clari-copilot.svg +1 -0
- package/public/assets/provider-icons/clicksend.svg +11 -0
- package/public/assets/provider-icons/clickup.svg +1 -0
- package/public/assets/provider-icons/close.svg +1 -0
- package/public/assets/provider-icons/cloudentity.svg +1 -0
- package/public/assets/provider-icons/coda.svg +1 -0
- package/public/assets/provider-icons/codeclimate.svg +1 -0
- package/public/assets/provider-icons/codegen.svg +1 -0
- package/public/assets/provider-icons/commercetools.svg +8 -0
- package/public/assets/provider-icons/companycam.svg +1 -0
- package/public/assets/provider-icons/confluence.svg +1 -0
- package/public/assets/provider-icons/connectwise-psa.svg +1 -0
- package/public/assets/provider-icons/contentful.svg +1 -0
- package/public/assets/provider-icons/contentstack.svg +1 -0
- package/public/assets/provider-icons/copper.svg +13 -0
- package/public/assets/provider-icons/coros.svg +20 -0
- package/public/assets/provider-icons/coupa-compass.svg +1 -0
- package/public/assets/provider-icons/cyberimpact.svg +1 -0
- package/public/assets/provider-icons/databricks-account.svg +1 -0
- package/public/assets/provider-icons/datadog.svg +1 -0
- package/public/assets/provider-icons/datev.svg +1 -0
- package/public/assets/provider-icons/deel.svg +1 -0
- package/public/assets/provider-icons/devin.svg +1 -0
- package/public/assets/provider-icons/dialpad.svg +1 -0
- package/public/assets/provider-icons/digitalocean.svg +1 -0
- package/public/assets/provider-icons/discord.svg +1 -0
- package/public/assets/provider-icons/discourse.svg +1 -0
- package/public/assets/provider-icons/dixa.svg +1 -0
- package/public/assets/provider-icons/document360.svg +6 -0
- package/public/assets/provider-icons/docusign.svg +1 -0
- package/public/assets/provider-icons/docuware.svg +1 -0
- package/public/assets/provider-icons/dropbox-sign.svg +6 -0
- package/public/assets/provider-icons/dropbox.svg +1 -0
- package/public/assets/provider-icons/drupal.svg +1 -0
- package/public/assets/provider-icons/e-conomic.svg +1 -0
- package/public/assets/provider-icons/ebay.svg +29 -0
- package/public/assets/provider-icons/egnyte.svg +1 -0
- package/public/assets/provider-icons/elevenlabs.svg +1 -0
- package/public/assets/provider-icons/elevio.svg +1 -0
- package/public/assets/provider-icons/emarsys.svg +1 -0
- package/public/assets/provider-icons/employment-hero.svg +1 -0
- package/public/assets/provider-icons/entrata.svg +1 -0
- package/public/assets/provider-icons/envoy.svg +1 -0
- package/public/assets/provider-icons/epic-games.svg +1 -0
- package/public/assets/provider-icons/evaluagent.svg +1 -0
- package/public/assets/provider-icons/eventbrite.svg +1 -0
- package/public/assets/provider-icons/exa.svg +1 -0
- package/public/assets/provider-icons/exact-online.svg +1 -0
- package/public/assets/provider-icons/exist.svg +1 -0
- package/public/assets/provider-icons/expensify.svg +1 -0
- package/public/assets/provider-icons/facebook.svg +1 -0
- package/public/assets/provider-icons/factorial.svg +1 -0
- package/public/assets/provider-icons/falai.svg +1 -0
- package/public/assets/provider-icons/fathom.svg +1 -0
- package/public/assets/provider-icons/figma.svg +1 -0
- package/public/assets/provider-icons/findymail.svg +1 -0
- package/public/assets/provider-icons/firefish.svg +1 -0
- package/public/assets/provider-icons/fireflies.svg +1 -0
- package/public/assets/provider-icons/fiserv.svg +1 -0
- package/public/assets/provider-icons/fitbit.svg +1 -0
- package/public/assets/provider-icons/fortnox.svg +1 -0
- package/public/assets/provider-icons/freshbooks.svg +1 -0
- package/public/assets/provider-icons/freshdesk.svg +1 -0
- package/public/assets/provider-icons/freshsales.svg +1 -0
- package/public/assets/provider-icons/freshservice.svg +1 -0
- package/public/assets/provider-icons/freshteam.svg +1 -0
- package/public/assets/provider-icons/front.svg +1 -0
- package/public/assets/provider-icons/gainsight-cc.svg +1 -0
- package/public/assets/provider-icons/garmin.svg +1 -0
- package/public/assets/provider-icons/gebruder-weiss.svg +6 -0
- package/public/assets/provider-icons/gem.svg +1 -0
- package/public/assets/provider-icons/gerrit.svg +1 -0
- package/public/assets/provider-icons/ghost-admin.svg +1 -0
- package/public/assets/provider-icons/github.svg +1 -0
- package/public/assets/provider-icons/gitlab.svg +1 -0
- package/public/assets/provider-icons/gong.svg +1 -0
- package/public/assets/provider-icons/google-ads.svg +1 -0
- package/public/assets/provider-icons/google-analytics.svg +1 -0
- package/public/assets/provider-icons/google-calendar.svg +1 -0
- package/public/assets/provider-icons/google-chat.svg +1 -0
- package/public/assets/provider-icons/google-cloud-storage.svg +1 -0
- package/public/assets/provider-icons/google-docs.svg +1 -0
- package/public/assets/provider-icons/google-drive.svg +1 -0
- package/public/assets/provider-icons/google-gemini.svg +1 -0
- package/public/assets/provider-icons/google-mail.svg +1 -0
- package/public/assets/provider-icons/google-play.svg +1 -0
- package/public/assets/provider-icons/google-sheet.svg +1 -0
- package/public/assets/provider-icons/google-slides.svg +97 -0
- package/public/assets/provider-icons/google.svg +1 -0
- package/public/assets/provider-icons/gorgias.svg +1 -0
- package/public/assets/provider-icons/grafana.svg +1 -0
- package/public/assets/provider-icons/grain.svg +1 -0
- package/public/assets/provider-icons/grammarly.svg +1 -0
- package/public/assets/provider-icons/greenhouse.svg +1 -0
- package/public/assets/provider-icons/gumroad.svg +1 -0
- package/public/assets/provider-icons/guru.svg +1 -0
- package/public/assets/provider-icons/gusto.svg +1 -0
- package/public/assets/provider-icons/hackerrank-work.svg +1 -0
- package/public/assets/provider-icons/harvest.svg +1 -0
- package/public/assets/provider-icons/health-gorilla.svg +1 -0
- package/public/assets/provider-icons/helpscout-mailbox.svg +1 -0
- package/public/assets/provider-icons/hibob-service-user.svg +1 -0
- package/public/assets/provider-icons/highlevel.svg +1 -0
- package/public/assets/provider-icons/holded.svg +1 -0
- package/public/assets/provider-icons/hubspot.svg +1 -0
- package/public/assets/provider-icons/incident-io.svg +1 -0
- package/public/assets/provider-icons/insightly.svg +3 -0
- package/public/assets/provider-icons/instagram.svg +1 -0
- package/public/assets/provider-icons/instantly.svg +1 -0
- package/public/assets/provider-icons/intercom.svg +1 -0
- package/public/assets/provider-icons/intuit.svg +1 -0
- package/public/assets/provider-icons/jamf.svg +1 -0
- package/public/assets/provider-icons/jazzhr.svg +9 -0
- package/public/assets/provider-icons/jira.svg +1 -0
- package/public/assets/provider-icons/jobadder.svg +3 -0
- package/public/assets/provider-icons/jobvite.svg +1 -0
- package/public/assets/provider-icons/jotform.svg +1 -0
- package/public/assets/provider-icons/kandji.svg +1 -0
- package/public/assets/provider-icons/keap.svg +1 -0
- package/public/assets/provider-icons/keeper-scim.svg +1 -0
- package/public/assets/provider-icons/klaviyo.svg +1 -0
- package/public/assets/provider-icons/klipfolio.svg +1 -0
- package/public/assets/provider-icons/knowbe4.svg +1 -0
- package/public/assets/provider-icons/kustomer.svg +1 -0
- package/public/assets/provider-icons/lagrowthmachine.svg +1 -0
- package/public/assets/provider-icons/lastpass.svg +1 -0
- package/public/assets/provider-icons/lattice.svg +245 -0
- package/public/assets/provider-icons/lemlist.svg +1 -0
- package/public/assets/provider-icons/lessonly.svg +1 -0
- package/public/assets/provider-icons/lever.svg +1 -0
- package/public/assets/provider-icons/linear.svg +1 -0
- package/public/assets/provider-icons/linkedin.svg +12 -0
- package/public/assets/provider-icons/linkhut.svg +1 -0
- package/public/assets/provider-icons/listmonk.svg +1 -0
- package/public/assets/provider-icons/loom.svg +6 -0
- package/public/assets/provider-icons/loops-so.svg +1 -0
- package/public/assets/provider-icons/lucid.svg +1 -0
- package/public/assets/provider-icons/luma.svg +1 -0
- package/public/assets/provider-icons/mailchimp.svg +1 -0
- package/public/assets/provider-icons/mailgun.svg +1 -0
- package/public/assets/provider-icons/make.svg +1 -0
- package/public/assets/provider-icons/malwarebytes.svg +1 -0
- package/public/assets/provider-icons/manatal.svg +1 -0
- package/public/assets/provider-icons/marketo.svg +1 -0
- package/public/assets/provider-icons/medallia.svg +1 -0
- package/public/assets/provider-icons/metabase.svg +1 -0
- package/public/assets/provider-icons/microsoft-ads.svg +1 -0
- package/public/assets/provider-icons/microsoft-business-central.svg +1 -0
- package/public/assets/provider-icons/microsoft-entra-id.svg +1 -0
- package/public/assets/provider-icons/microsoft-power-bi.svg +1 -0
- package/public/assets/provider-icons/microsoft-teams.svg +1 -0
- package/public/assets/provider-icons/microsoft-tenant-specific.svg +1 -0
- package/public/assets/provider-icons/microsoft.svg +1 -0
- package/public/assets/provider-icons/mindbody.svg +1 -0
- package/public/assets/provider-icons/minimax.svg +12 -0
- package/public/assets/provider-icons/mip-cloud.svg +30 -0
- package/public/assets/provider-icons/mip.svg +30 -0
- package/public/assets/provider-icons/miro.svg +1 -0
- package/public/assets/provider-icons/missive.svg +7 -0
- package/public/assets/provider-icons/mixpanel.svg +1 -0
- package/public/assets/provider-icons/monday.svg +1 -0
- package/public/assets/provider-icons/mural.svg +1 -0
- package/public/assets/provider-icons/namely-pat.svg +1 -0
- package/public/assets/provider-icons/nationbuilder.svg +1 -0
- package/public/assets/provider-icons/netsuite.svg +1 -0
- package/public/assets/provider-icons/next-cloud-ocs.svg +9 -0
- package/public/assets/provider-icons/notion.svg +1 -0
- package/public/assets/provider-icons/odoo.svg +1 -0
- package/public/assets/provider-icons/okta.svg +1 -0
- package/public/assets/provider-icons/one-drive.svg +1 -0
- package/public/assets/provider-icons/one-note.svg +1 -0
- package/public/assets/provider-icons/open-hands.svg +9 -0
- package/public/assets/provider-icons/openai.svg +1 -0
- package/public/assets/provider-icons/oracle-hcm.svg +1 -0
- package/public/assets/provider-icons/ory.svg +1 -0
- package/public/assets/provider-icons/osu.svg +1 -0
- package/public/assets/provider-icons/oura.svg +1 -0
- package/public/assets/provider-icons/outlook.svg +1 -0
- package/public/assets/provider-icons/outreach.svg +1 -0
- package/public/assets/provider-icons/pagerduty.svg +1 -0
- package/public/assets/provider-icons/pandadoc.svg +1 -0
- package/public/assets/provider-icons/paychex.svg +1 -0
- package/public/assets/provider-icons/paycom.svg +1 -0
- package/public/assets/provider-icons/payfit.svg +1 -0
- package/public/assets/provider-icons/paylocity.svg +17 -0
- package/public/assets/provider-icons/paypal.svg +1 -0
- package/public/assets/provider-icons/pendo.svg +1 -0
- package/public/assets/provider-icons/pennylane.svg +1 -0
- package/public/assets/provider-icons/peopledatalabs.svg +1 -0
- package/public/assets/provider-icons/perimeter81.svg +1 -0
- package/public/assets/provider-icons/perplexity.svg +1 -0
- package/public/assets/provider-icons/personio.svg +1 -0
- package/public/assets/provider-icons/pingboard.svg +1 -0
- package/public/assets/provider-icons/pinterest.svg +1 -0
- package/public/assets/provider-icons/pipedrive.svg +1 -0
- package/public/assets/provider-icons/pivotaltracker.svg +1 -0
- package/public/assets/provider-icons/plain.svg +63 -0
- package/public/assets/provider-icons/podium.svg +1 -0
- package/public/assets/provider-icons/posthog.svg +1 -0
- package/public/assets/provider-icons/precisefp.svg +13 -0
- package/public/assets/provider-icons/prive.svg +1 -0
- package/public/assets/provider-icons/productboard.svg +1 -0
- package/public/assets/provider-icons/qualtrics.svg +1 -0
- package/public/assets/provider-icons/quickbase.svg +26 -0
- package/public/assets/provider-icons/quickbooks.svg +1 -0
- package/public/assets/provider-icons/ragieai.svg +1 -0
- package/public/assets/provider-icons/ramp.svg +1 -0
- package/public/assets/provider-icons/rapidapi.svg +1 -0
- package/public/assets/provider-icons/razorpay.svg +1 -0
- package/public/assets/provider-icons/readwise.svg +1 -0
- package/public/assets/provider-icons/recharge.svg +1 -0
- package/public/assets/provider-icons/recruitcrm.svg +1 -0
- package/public/assets/provider-icons/recruiterflow.svg +9 -0
- package/public/assets/provider-icons/reddit.svg +1 -0
- package/public/assets/provider-icons/redtail-crm-sandbox.svg +1 -0
- package/public/assets/provider-icons/refiner.svg +1 -0
- package/public/assets/provider-icons/replicate.svg +1 -0
- package/public/assets/provider-icons/retell-ai.svg +7 -0
- package/public/assets/provider-icons/ring-central.svg +1 -0
- package/public/assets/provider-icons/rippling.svg +1 -0
- package/public/assets/provider-icons/roam-scim.svg +12 -0
- package/public/assets/provider-icons/rock-gym-pro.svg +33 -0
- package/public/assets/provider-icons/rootly.svg +1 -0
- package/public/assets/provider-icons/sage-hr.svg +1 -0
- package/public/assets/provider-icons/sage.svg +1 -0
- package/public/assets/provider-icons/salesforce.svg +1 -0
- package/public/assets/provider-icons/salesloft.svg +1 -0
- package/public/assets/provider-icons/sap-concur.svg +8 -0
- package/public/assets/provider-icons/sap-success-factors.svg +1 -0
- package/public/assets/provider-icons/scrapedo.svg +14 -0
- package/public/assets/provider-icons/sedna.svg +1 -0
- package/public/assets/provider-icons/segment.svg +1 -0
- package/public/assets/provider-icons/sendgrid.svg +1 -0
- package/public/assets/provider-icons/sentry.svg +1 -0
- package/public/assets/provider-icons/servicem8.svg +1 -0
- package/public/assets/provider-icons/servicenow.svg +1 -0
- package/public/assets/provider-icons/setmore.svg +1 -0
- package/public/assets/provider-icons/sharepoint-online.svg +1 -0
- package/public/assets/provider-icons/shipstation.svg +1 -0
- package/public/assets/provider-icons/shopify.svg +1 -0
- package/public/assets/provider-icons/shortcut.svg +1 -0
- package/public/assets/provider-icons/signnow.svg +1 -0
- package/public/assets/provider-icons/slack.svg +1 -0
- package/public/assets/provider-icons/smartlead-ai.svg +1 -0
- package/public/assets/provider-icons/smartrecruiters-api-key.svg +1 -0
- package/public/assets/provider-icons/smartsheet.svg +1 -0
- package/public/assets/provider-icons/smugmug.svg +1 -0
- package/public/assets/provider-icons/snowflake.svg +1 -0
- package/public/assets/provider-icons/splitwise.svg +1 -0
- package/public/assets/provider-icons/spotify.svg +1 -0
- package/public/assets/provider-icons/squarespace.svg +1 -0
- package/public/assets/provider-icons/squareup.svg +1 -0
- package/public/assets/provider-icons/stackexchange.svg +1 -0
- package/public/assets/provider-icons/strava.svg +1 -0
- package/public/assets/provider-icons/stripe-express.svg +1 -0
- package/public/assets/provider-icons/stripe.svg +1 -0
- package/public/assets/provider-icons/supabase.svg +15 -0
- package/public/assets/provider-icons/survey-monkey.svg +1 -0
- package/public/assets/provider-icons/tableau.svg +1 -0
- package/public/assets/provider-icons/tapclicks.svg +1 -0
- package/public/assets/provider-icons/teamtailor.svg +1 -0
- package/public/assets/provider-icons/teamwork.svg +1 -0
- package/public/assets/provider-icons/terraform.svg +1 -0
- package/public/assets/provider-icons/thrivecart-api-key.svg +1 -0
- package/public/assets/provider-icons/thrivecart-oauth.svg +1 -0
- package/public/assets/provider-icons/ticktick.svg +1 -0
- package/public/assets/provider-icons/tiktok-ads.svg +1 -0
- package/public/assets/provider-icons/timely.svg +1 -0
- package/public/assets/provider-icons/tldv.svg +1 -0
- package/public/assets/provider-icons/todoist.svg +1 -0
- package/public/assets/provider-icons/trafft.svg +35 -0
- package/public/assets/provider-icons/trakstar-hire.svg +2 -0
- package/public/assets/provider-icons/trello.svg +1 -0
- package/public/assets/provider-icons/tremendous-sandbox.svg +1 -0
- package/public/assets/provider-icons/tsheetsteam.svg +1 -0
- package/public/assets/provider-icons/tumblr.svg +1 -0
- package/public/assets/provider-icons/twenty-crm.svg +1 -0
- package/public/assets/provider-icons/twilio.svg +1 -0
- package/public/assets/provider-icons/twinfield.svg +1 -0
- package/public/assets/provider-icons/twitch.svg +1 -0
- package/public/assets/provider-icons/twitter.svg +1 -0
- package/public/assets/provider-icons/typeform.svg +1 -0
- package/public/assets/provider-icons/typefully.svg +1 -0
- package/public/assets/provider-icons/uber.svg +1 -0
- package/public/assets/provider-icons/ukg-pro-wfm.svg +2 -0
- package/public/assets/provider-icons/ukg-pro.svg +2 -0
- package/public/assets/provider-icons/ukg-ready.svg +2 -0
- package/public/assets/provider-icons/unanet.svg +1 -0
- package/public/assets/provider-icons/unauthenticated.svg +6 -0
- package/public/assets/provider-icons/unipile.svg +9 -0
- package/public/assets/provider-icons/vercel.svg +1 -0
- package/public/assets/provider-icons/vimeo.svg +1 -0
- package/public/assets/provider-icons/wakatime.svg +1 -0
- package/public/assets/provider-icons/wave-accounting.svg +1 -0
- package/public/assets/provider-icons/wealthbox.svg +1 -0
- package/public/assets/provider-icons/webflow.svg +1 -0
- package/public/assets/provider-icons/whatsapp-business.svg +1 -0
- package/public/assets/provider-icons/whoop.svg +1 -0
- package/public/assets/provider-icons/wildix-pbx.svg +1 -0
- package/public/assets/provider-icons/woocommerce.svg +1 -0
- package/public/assets/provider-icons/wordpress.svg +1 -0
- package/public/assets/provider-icons/workable.svg +1 -0
- package/public/assets/provider-icons/workday.svg +1 -0
- package/public/assets/provider-icons/wrike.svg +1 -0
- package/public/assets/provider-icons/xai.svg +1 -0
- package/public/assets/provider-icons/xero.svg +1 -0
- package/public/assets/provider-icons/yahoo.svg +1 -0
- package/public/assets/provider-icons/yandex.svg +1 -0
- package/public/assets/provider-icons/youtube.svg +1 -0
- package/public/assets/provider-icons/zapier-nla.svg +1 -0
- package/public/assets/provider-icons/zendesk.svg +1 -0
- package/public/assets/provider-icons/zenefits.svg +1 -0
- package/public/assets/provider-icons/zoho-bigin.svg +1 -0
- package/public/assets/provider-icons/zoho-books.svg +1 -0
- package/public/assets/provider-icons/zoho-crm.svg +1 -0
- package/public/assets/provider-icons/zoho-desk.svg +1 -0
- package/public/assets/provider-icons/zoho-inventory.svg +1 -0
- package/public/assets/provider-icons/zoho-invoice.svg +1 -0
- package/public/assets/provider-icons/zoho-mail.svg +1 -0
- package/public/assets/provider-icons/zoho-people.svg +1 -0
- package/public/assets/provider-icons/zoho.svg +1 -0
- package/public/assets/provider-icons/zoom.svg +1 -0
- package/public/assets/provider-icons/zoominfo.svg +1 -0
- package/public/assets/provider-icons/zuora.svg +1 -0
- package/src/app/[tenantId]/page.tsx +8 -0
- package/src/app/[tenantId]/projects/[projectId]/api-keys/error.tsx +7 -0
- package/src/app/[tenantId]/projects/[projectId]/api-keys/page.tsx +62 -0
- package/src/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/error.tsx +18 -0
- package/src/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.tsx +44 -0
- package/src/app/[tenantId]/projects/[projectId]/artifact-components/error.tsx +7 -0
- package/src/app/[tenantId]/projects/[projectId]/artifact-components/loading.tsx +20 -0
- package/src/app/[tenantId]/projects/[projectId]/artifact-components/new/page.tsx +30 -0
- package/src/app/[tenantId]/projects/[projectId]/artifact-components/page.tsx +69 -0
- package/src/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.tsx +64 -0
- package/src/app/[tenantId]/projects/[projectId]/credentials/error.tsx +7 -0
- package/src/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.tsx +28 -0
- package/src/app/[tenantId]/projects/[projectId]/credentials/new/page.tsx +78 -0
- package/src/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.tsx +192 -0
- package/src/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.tsx +60 -0
- package/src/app/[tenantId]/projects/[projectId]/credentials/page.tsx +67 -0
- package/src/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/error.tsx +18 -0
- package/src/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.tsx +40 -0
- package/src/app/[tenantId]/projects/[projectId]/data-components/error.tsx +7 -0
- package/src/app/[tenantId]/projects/[projectId]/data-components/loading.tsx +20 -0
- package/src/app/[tenantId]/projects/[projectId]/data-components/new/page.tsx +27 -0
- package/src/app/[tenantId]/projects/[projectId]/data-components/page.tsx +66 -0
- package/src/app/[tenantId]/projects/[projectId]/graphs/[graphId]/error.tsx +21 -0
- package/src/app/[tenantId]/projects/[projectId]/graphs/[graphId]/loading.tsx +29 -0
- package/src/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.tsx +52 -0
- package/src/app/[tenantId]/projects/[projectId]/graphs/error.tsx +7 -0
- package/src/app/[tenantId]/projects/[projectId]/graphs/loading.tsx +20 -0
- package/src/app/[tenantId]/projects/[projectId]/graphs/new/page.tsx +45 -0
- package/src/app/[tenantId]/projects/[projectId]/graphs/page.tsx +50 -0
- package/src/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.tsx +91 -0
- package/src/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.tsx +38 -0
- package/src/app/[tenantId]/projects/[projectId]/mcp-servers/new/layout.tsx +22 -0
- package/src/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.tsx +24 -0
- package/src/app/[tenantId]/projects/[projectId]/mcp-servers/page.tsx +61 -0
- package/src/app/[tenantId]/projects/[projectId]/page.tsx +12 -0
- package/src/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.tsx +40 -0
- package/src/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.tsx +32 -0
- package/src/app/[tenantId]/projects/[projectId]/traces/page.tsx +20 -0
- package/src/app/[tenantId]/projects/error.tsx +7 -0
- package/src/app/[tenantId]/projects/loading.tsx +20 -0
- package/src/app/[tenantId]/projects/page.tsx +61 -0
- package/src/app/api/signoz/conversations/[conversationId]/route.ts +863 -0
- package/src/app/api/signoz/route.ts +115 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +261 -0
- package/src/app/icon.svg +5 -0
- package/src/app/layout.tsx +59 -0
- package/src/app/page.tsx +13 -0
- package/src/app/utils/__tests__/format-date.test.ts +133 -0
- package/src/app/utils/active-tools.ts +24 -0
- package/src/app/utils/format-date.ts +95 -0
- package/src/components/api-keys/api-key-display.tsx +57 -0
- package/src/components/api-keys/api-key-item-menu.tsx +54 -0
- package/src/components/api-keys/api-keys-table.tsx +77 -0
- package/src/components/api-keys/delete-api-key-confirmation.tsx +45 -0
- package/src/components/api-keys/expiration-indicator.tsx +86 -0
- package/src/components/api-keys/form/api-key-form.tsx +120 -0
- package/src/components/api-keys/form/form-configuration.tsx +7 -0
- package/src/components/api-keys/form/validation.ts +20 -0
- package/src/components/api-keys/new-api-key-dialog.tsx +84 -0
- package/src/components/artifact-components/artifact-component-item-menu.tsx +61 -0
- package/src/components/artifact-components/artifact-component-item.tsx +42 -0
- package/src/components/artifact-components/artifact-component-list.tsx +27 -0
- package/src/components/artifact-components/delete-artifact-component-confirmation.tsx +45 -0
- package/src/components/artifact-components/form/artifact-component-form.tsx +127 -0
- package/src/components/artifact-components/form/form-configuration.tsx +9 -0
- package/src/components/artifact-components/form/validation.ts +42 -0
- package/src/components/credentials/credential-item.tsx +124 -0
- package/src/components/credentials/credential-tools-list.tsx +111 -0
- package/src/components/credentials/credentials-list.tsx +36 -0
- package/src/components/credentials/views/auth-form-config.ts +202 -0
- package/src/components/credentials/views/credential-form-validation.ts +14 -0
- package/src/components/credentials/views/credential-form.tsx +203 -0
- package/src/components/credentials/views/edit-credential-form.tsx +177 -0
- package/src/components/credentials/views/generic-auth-form.tsx +194 -0
- package/src/components/credentials/views/nango-providers-grid.tsx +136 -0
- package/src/components/credentials/views/new-credential-form.tsx +60 -0
- package/src/components/data-components/data-component-item-menu.tsx +61 -0
- package/src/components/data-components/data-component-item.tsx +42 -0
- package/src/components/data-components/data-components-list.tsx +27 -0
- package/src/components/data-components/delete-data-component-confirmation.tsx +45 -0
- package/src/components/data-components/form/data-component-form.tsx +113 -0
- package/src/components/data-components/form/form-configuration.ts +8 -0
- package/src/components/data-components/form/validation.ts +38 -0
- package/src/components/errors/full-page-error.tsx +37 -0
- package/src/components/form/expandable-field.tsx +72 -0
- package/src/components/form/expandable-json-editor.tsx +139 -0
- package/src/components/form/form-field-wrapper.tsx +47 -0
- package/src/components/form/generic-combo-box.tsx +94 -0
- package/src/components/form/generic-input.tsx +51 -0
- package/src/components/form/generic-key-value-input.tsx +146 -0
- package/src/components/form/generic-select.tsx +56 -0
- package/src/components/form/generic-textarea.tsx +39 -0
- package/src/components/form/json-editor.tsx +47 -0
- package/src/components/form/json-schema-input.tsx +39 -0
- package/src/components/form/standalone-json-editor.tsx +71 -0
- package/src/components/graph/configuration/edge-types.tsx +42 -0
- package/src/components/graph/configuration/graph-types.tsx +51 -0
- package/src/components/graph/configuration/model-options.tsx +39 -0
- package/src/components/graph/configuration/node-types.tsx +95 -0
- package/src/components/graph/edges/agent-to-agent-edge.tsx +146 -0
- package/src/components/graph/edges/default-edge.tsx +38 -0
- package/src/components/graph/error-display/error-indicator.tsx +50 -0
- package/src/components/graph/error-display/graph-error-summary.tsx +181 -0
- package/src/components/graph/graph.tsx +540 -0
- package/src/components/graph/markers/default-marker.tsx +28 -0
- package/src/components/graph/markers/selected-marker.tsx +28 -0
- package/src/components/graph/node-library/node-item.tsx +39 -0
- package/src/components/graph/node-library/node-library.tsx +20 -0
- package/src/components/graph/nodes/agent-node.tsx +125 -0
- package/src/components/graph/nodes/base-node.tsx +88 -0
- package/src/components/graph/nodes/external-agent-node.tsx +55 -0
- package/src/components/graph/nodes/handle.tsx +14 -0
- package/src/components/graph/nodes/mcp-node.tsx +37 -0
- package/src/components/graph/nodes/mcp-placeholder-node.tsx +23 -0
- package/src/components/graph/nodes/node-tab.tsx +21 -0
- package/src/components/graph/playground/chat-widget.tsx +202 -0
- package/src/components/graph/playground/ikp-message.tsx +575 -0
- package/src/components/graph/playground/playground.tsx +66 -0
- package/src/components/graph/sidepane/edges/edge-editor.tsx +135 -0
- package/src/components/graph/sidepane/heading.tsx +17 -0
- package/src/components/graph/sidepane/metadata/context-config.tsx +82 -0
- package/src/components/graph/sidepane/metadata/metadata-editor.tsx +644 -0
- package/src/components/graph/sidepane/nodes/agent-node-editor.tsx +196 -0
- package/src/components/graph/sidepane/nodes/component-selector/component-dropdown.tsx +100 -0
- package/src/components/graph/sidepane/nodes/component-selector/component-header.tsx +18 -0
- package/src/components/graph/sidepane/nodes/component-selector/component-selector.tsx +62 -0
- package/src/components/graph/sidepane/nodes/component-selector/selected-components.tsx +44 -0
- package/src/components/graph/sidepane/nodes/empty-state.tsx +29 -0
- package/src/components/graph/sidepane/nodes/expandable-text-area.tsx +30 -0
- package/src/components/graph/sidepane/nodes/external-agent-node-editor.tsx +76 -0
- package/src/components/graph/sidepane/nodes/form-fields.tsx +117 -0
- package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +140 -0
- package/src/components/graph/sidepane/nodes/mcp-selector/loading.tsx +20 -0
- package/src/components/graph/sidepane/nodes/mcp-selector/mcp-selector.tsx +93 -0
- package/src/components/graph/sidepane/nodes/mcp-selector/mcp-server-item.tsx +57 -0
- package/src/components/graph/sidepane/nodes/model-section.tsx +202 -0
- package/src/components/graph/sidepane/nodes/model-selector.tsx +157 -0
- package/src/components/graph/sidepane/sidepane.tsx +156 -0
- package/src/components/graph/toolbar/toolbar.tsx +61 -0
- package/src/components/graphs/delete-graph-confirmation.tsx +46 -0
- package/src/components/graphs/graph-item-menu.tsx +54 -0
- package/src/components/graphs/graph-item.tsx +47 -0
- package/src/components/graphs/graph-list.tsx +20 -0
- package/src/components/graphs/new-graph-item.tsx +23 -0
- package/src/components/icons/anthropic.tsx +21 -0
- package/src/components/icons/dashed-spline.tsx +31 -0
- package/src/components/icons/empty-state/conversations.tsx +24 -0
- package/src/components/icons/empty-state/credentials.tsx +85 -0
- package/src/components/icons/empty-state/default.tsx +57 -0
- package/src/components/icons/empty-state/graphs.tsx +58 -0
- package/src/components/icons/mcp-icon.tsx +24 -0
- package/src/components/icons/openai.tsx +14 -0
- package/src/components/icons/provider-icon.tsx +91 -0
- package/src/components/layout/body-template.tsx +19 -0
- package/src/components/layout/empty-state.tsx +56 -0
- package/src/components/layout/main-content.tsx +14 -0
- package/src/components/layout/page-header.tsx +77 -0
- package/src/components/layout/sidepane.tsx +81 -0
- package/src/components/layout/site-content.tsx +7 -0
- package/src/components/layout/site-header.tsx +24 -0
- package/src/components/logo.tsx +48 -0
- package/src/components/mcp-servers/available-tools-card.tsx +122 -0
- package/src/components/mcp-servers/form/active-tools-selector.tsx +256 -0
- package/src/components/mcp-servers/form/mcp-server-form.tsx +161 -0
- package/src/components/mcp-servers/form/validation.ts +32 -0
- package/src/components/mcp-servers/mcp-tool-image.tsx +78 -0
- package/src/components/mcp-servers/mcp-tool-item.tsx +205 -0
- package/src/components/mcp-servers/mcp-tools-list.tsx +21 -0
- package/src/components/mcp-servers/view-mcp-server-details.tsx +261 -0
- package/src/components/projects/delete-project-confirmation.tsx +51 -0
- package/src/components/projects/edit-project-dialog.tsx +51 -0
- package/src/components/projects/form/form-configuration.ts +16 -0
- package/src/components/projects/form/project-form.tsx +122 -0
- package/src/components/projects/form/project-models-section.tsx +175 -0
- package/src/components/projects/form/project-stopwhen-section.tsx +89 -0
- package/src/components/projects/form/validation.ts +39 -0
- package/src/components/projects/new-project-dialog.tsx +68 -0
- package/src/components/projects/project-item-menu.tsx +73 -0
- package/src/components/projects/project-item.tsx +53 -0
- package/src/components/projects/project-list.tsx +17 -0
- package/src/components/sidebar-nav/nav-group.tsx +22 -0
- package/src/components/sidebar-nav/nav-item.tsx +32 -0
- package/src/components/sidebar-nav/project-selector.tsx +113 -0
- package/src/components/sidebar-nav/project-switcher.tsx +73 -0
- package/src/components/sidebar-nav/sidebar-nav.tsx +126 -0
- package/src/components/theme-provider.tsx +8 -0
- package/src/components/theme-toggle.tsx +62 -0
- package/src/components/traces/ai-calls-breakdown.tsx +462 -0
- package/src/components/traces/charts/area-chart-card.tsx +41 -0
- package/src/components/traces/charts/area-chart.tsx +98 -0
- package/src/components/traces/charts/chart-card.tsx +98 -0
- package/src/components/traces/charts/chart-error.tsx +7 -0
- package/src/components/traces/charts/chart-no-results.tsx +7 -0
- package/src/components/traces/charts/stat-card.tsx +45 -0
- package/src/components/traces/charts/stat.tsx +36 -0
- package/src/components/traces/conversation-detail.tsx +275 -0
- package/src/components/traces/conversation-errors.tsx +312 -0
- package/src/components/traces/conversation-stats/conversation-list-item.tsx +91 -0
- package/src/components/traces/conversation-stats/conversation-stats-card.tsx +242 -0
- package/src/components/traces/conversation-stats/loading-skeleton.tsx +31 -0
- package/src/components/traces/filters/date-picker.tsx +173 -0
- package/src/components/traces/filters/filter-trigger.tsx +92 -0
- package/src/components/traces/filters/graph-filter.tsx +71 -0
- package/src/components/traces/signoz-link.tsx +152 -0
- package/src/components/traces/timeline/activity-details-sidepane.tsx +34 -0
- package/src/components/traces/timeline/activity-timeline.tsx +31 -0
- package/src/components/traces/timeline/blocks.tsx +66 -0
- package/src/components/traces/timeline/bubble.tsx +44 -0
- package/src/components/traces/timeline/flow.tsx +16 -0
- package/src/components/traces/timeline/render-panel-content.tsx +362 -0
- package/src/components/traces/timeline/tag-row.tsx +14 -0
- package/src/components/traces/timeline/timeline-item.tsx +394 -0
- package/src/components/traces/timeline/timeline-wrapper.tsx +293 -0
- package/src/components/traces/timeline/types.ts +154 -0
- package/src/components/traces/traces-overview.tsx +730 -0
- package/src/components/ui/alert-dialog.tsx +134 -0
- package/src/components/ui/badge.tsx +46 -0
- package/src/components/ui/breadcrumbs.tsx +35 -0
- package/src/components/ui/button.tsx +66 -0
- package/src/components/ui/calendar.tsx +177 -0
- package/src/components/ui/card-grid.tsx +68 -0
- package/src/components/ui/card.tsx +75 -0
- package/src/components/ui/chart.tsx +322 -0
- package/src/components/ui/checkbox.tsx +29 -0
- package/src/components/ui/clickable-card.tsx +65 -0
- package/src/components/ui/collapsible.tsx +21 -0
- package/src/components/ui/combobox.tsx +145 -0
- package/src/components/ui/command.tsx +163 -0
- package/src/components/ui/copy-button.tsx +43 -0
- package/src/components/ui/copyable-single-line-code.tsx +14 -0
- package/src/components/ui/delete-confirmation.tsx +53 -0
- package/src/components/ui/dialog.tsx +131 -0
- package/src/components/ui/dropdown-menu.tsx +228 -0
- package/src/components/ui/external-link.tsx +22 -0
- package/src/components/ui/form.tsx +151 -0
- package/src/components/ui/inheritance-indicator.tsx +264 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/item-card-grid.tsx +101 -0
- package/src/components/ui/item-card.tsx +112 -0
- package/src/components/ui/label.tsx +21 -0
- package/src/components/ui/popover.tsx +51 -0
- package/src/components/ui/resizable.tsx +56 -0
- package/src/components/ui/scroll-area.tsx +56 -0
- package/src/components/ui/select.tsx +170 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +130 -0
- package/src/components/ui/sidebar.tsx +695 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/sonner.tsx +25 -0
- package/src/components/ui/svg-icon.tsx +49 -0
- package/src/components/ui/switch.tsx +26 -0
- package/src/components/ui/table.tsx +100 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/tooltip.tsx +57 -0
- package/src/constants/page-descriptions.tsx +53 -0
- package/src/constants/signoz.ts +280 -0
- package/src/features/graph/commands/command-manager.ts +67 -0
- package/src/features/graph/commands/commands.ts +123 -0
- package/src/features/graph/domain/__tests__/roundtrip.test.ts +75 -0
- package/src/features/graph/domain/__tests__/serialize.test.ts +196 -0
- package/src/features/graph/domain/deserialize.ts +266 -0
- package/src/features/graph/domain/index.ts +2 -0
- package/src/features/graph/domain/serialize.ts +314 -0
- package/src/features/graph/state/use-graph-store.ts +208 -0
- package/src/features/graph/ui/use-graph-shortcuts.ts +41 -0
- package/src/hooks/use-ai-calls-query-state.ts +55 -0
- package/src/hooks/use-chat-activities-polling.ts +145 -0
- package/src/hooks/use-copy-to-clipboard.tsx +31 -0
- package/src/hooks/use-cursor-to-end.ts +48 -0
- package/src/hooks/use-disclosure.ts +15 -0
- package/src/hooks/use-graph-errors.ts +98 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/hooks/use-nango-connect.ts +42 -0
- package/src/hooks/use-nango-providers.ts +32 -0
- package/src/hooks/use-node-editor.ts +141 -0
- package/src/hooks/use-project-data.ts +47 -0
- package/src/hooks/use-side-pane.ts +20 -0
- package/src/hooks/use-traces-query-state.ts +88 -0
- package/src/hooks/use-traces.ts +240 -0
- package/src/lib/README.md +145 -0
- package/src/lib/actions/api-keys.ts +99 -0
- package/src/lib/actions/artifact-components.ts +143 -0
- package/src/lib/actions/credentials.ts +42 -0
- package/src/lib/actions/data-components.ts +143 -0
- package/src/lib/actions/graph-full.ts +221 -0
- package/src/lib/actions/projects.ts +168 -0
- package/src/lib/actions/tools.ts +42 -0
- package/src/lib/actions/types.ts +7 -0
- package/src/lib/api/api-config.ts +104 -0
- package/src/lib/api/api-keys.ts +117 -0
- package/src/lib/api/artifact-components.ts +146 -0
- package/src/lib/api/credentials.ts +127 -0
- package/src/lib/api/data-components.ts +141 -0
- package/src/lib/api/graph-full-client.ts +109 -0
- package/src/lib/api/projects.ts +104 -0
- package/src/lib/api/resource-validation.ts +109 -0
- package/src/lib/api/signoz-sql.ts +175 -0
- package/src/lib/api/signoz-stats.ts +1018 -0
- package/src/lib/api/tools.ts +221 -0
- package/src/lib/events.ts +34 -0
- package/src/lib/index.ts +48 -0
- package/src/lib/json-schema-validation.ts +363 -0
- package/src/lib/logger.ts +45 -0
- package/src/lib/mcp-tools/nango-types.ts +19 -0
- package/src/lib/mcp-tools/nango.ts +459 -0
- package/src/lib/services/save-graph.ts +14 -0
- package/src/lib/types/errors.ts +18 -0
- package/src/lib/types/graph-full.ts +65 -0
- package/src/lib/types/project.ts +26 -0
- package/src/lib/types/response.ts +13 -0
- package/src/lib/utils/credentials-utils.ts +31 -0
- package/src/lib/utils/graph-error-parser.ts +262 -0
- package/src/lib/utils/mcp-schema-parser.ts +202 -0
- package/src/lib/utils/mcp-urls.ts +63 -0
- package/src/lib/utils/mcp-utils.ts +18 -0
- package/src/lib/utils/project-redirect.ts +39 -0
- package/src/lib/utils.ts +46 -0
- package/src/lib/validation.ts +14 -0
- package/tsconfig.json +27 -0
- 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,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
|
+
}
|