@apteva/integrations 0.3.62 → 0.15.3
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/dist/aws-sigv4.d.ts +32 -0
- package/dist/aws-sigv4.d.ts.map +1 -0
- package/dist/aws-sigv4.js +126 -0
- package/dist/aws-sigv4.js.map +1 -0
- package/dist/explorer/main.js +21617 -0
- package/dist/explorer/main.js.map +90 -0
- package/dist/explorer/style.css +2 -0
- package/dist/http-executor.d.ts.map +1 -1
- package/dist/http-executor.js +145 -12
- package/dist/http-executor.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-generator.d.ts +7 -2
- package/dist/mcp-generator.d.ts.map +1 -1
- package/dist/mcp-generator.js +46 -5
- package/dist/mcp-generator.js.map +1 -1
- package/dist/oauth.js +1 -1
- package/dist/oauth.js.map +1 -1
- package/dist/types.d.ts +251 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/github/ActivityFeed.d.ts +24 -0
- package/dist/ui/github/ActivityFeed.d.ts.map +1 -0
- package/dist/ui/github/ActivityFeed.js +106 -0
- package/dist/ui/github/ActivityFeed.js.map +1 -0
- package/dist/ui/github/ActivityFeed.mjs +3 -0
- package/dist/ui/github/ActivityFeed.mjs.map +29 -0
- package/dist/ui/github/CommitCard.d.ts +24 -0
- package/dist/ui/github/CommitCard.d.ts.map +1 -0
- package/dist/ui/github/CommitCard.js +102 -0
- package/dist/ui/github/CommitCard.js.map +1 -0
- package/dist/ui/github/CommitCard.mjs +5 -0
- package/dist/ui/github/CommitCard.mjs.map +11 -0
- package/dist/ui/github/IssueCard.d.ts +33 -0
- package/dist/ui/github/IssueCard.d.ts.map +1 -0
- package/dist/ui/github/IssueCard.js +131 -0
- package/dist/ui/github/IssueCard.js.map +1 -0
- package/dist/ui/github/IssueCard.mjs +3 -0
- package/dist/ui/github/IssueCard.mjs.map +21 -0
- package/dist/ui/github/PullRequestCard.d.ts +36 -0
- package/dist/ui/github/PullRequestCard.d.ts.map +1 -0
- package/dist/ui/github/PullRequestCard.js +158 -0
- package/dist/ui/github/PullRequestCard.js.map +1 -0
- package/dist/ui/github/PullRequestCard.mjs +3 -0
- package/dist/ui/github/PullRequestCard.mjs.map +22 -0
- package/dist/ui/github/WorkflowRunCard.d.ts +30 -0
- package/dist/ui/github/WorkflowRunCard.d.ts.map +1 -0
- package/dist/ui/github/WorkflowRunCard.js +124 -0
- package/dist/ui/github/WorkflowRunCard.js.map +1 -0
- package/dist/ui/github/WorkflowRunCard.mjs +3 -0
- package/dist/ui/github/WorkflowRunCard.mjs.map +11 -0
- package/dist/ui/github/lib/github.d.ts +43 -0
- package/dist/ui/github/lib/github.d.ts.map +1 -0
- package/dist/ui/github/lib/github.js +151 -0
- package/dist/ui/github/lib/github.js.map +1 -0
- package/dist/ui/hubspot/ActivityFeed.d.ts +22 -0
- package/dist/ui/hubspot/ActivityFeed.d.ts.map +1 -0
- package/dist/ui/hubspot/ActivityFeed.js +52 -0
- package/dist/ui/hubspot/ActivityFeed.js.map +1 -0
- package/dist/ui/hubspot/ActivityFeed.mjs +3 -0
- package/dist/ui/hubspot/ActivityFeed.mjs.map +26 -0
- package/dist/ui/hubspot/CompanyCard.d.ts +22 -0
- package/dist/ui/hubspot/CompanyCard.d.ts.map +1 -0
- package/dist/ui/hubspot/CompanyCard.js +63 -0
- package/dist/ui/hubspot/CompanyCard.js.map +1 -0
- package/dist/ui/hubspot/CompanyCard.mjs +3 -0
- package/dist/ui/hubspot/CompanyCard.mjs.map +11 -0
- package/dist/ui/hubspot/ContactCard.d.ts +22 -0
- package/dist/ui/hubspot/ContactCard.d.ts.map +1 -0
- package/dist/ui/hubspot/ContactCard.js +62 -0
- package/dist/ui/hubspot/ContactCard.js.map +1 -0
- package/dist/ui/hubspot/ContactCard.mjs +3 -0
- package/dist/ui/hubspot/ContactCard.mjs.map +11 -0
- package/dist/ui/hubspot/ContactList.d.ts +21 -0
- package/dist/ui/hubspot/ContactList.d.ts.map +1 -0
- package/dist/ui/hubspot/ContactList.js +31 -0
- package/dist/ui/hubspot/ContactList.js.map +1 -0
- package/dist/ui/hubspot/ContactList.mjs +3 -0
- package/dist/ui/hubspot/ContactList.mjs.map +11 -0
- package/dist/ui/hubspot/DealCard.d.ts +23 -0
- package/dist/ui/hubspot/DealCard.d.ts.map +1 -0
- package/dist/ui/hubspot/DealCard.js +63 -0
- package/dist/ui/hubspot/DealCard.js.map +1 -0
- package/dist/ui/hubspot/DealCard.mjs +3 -0
- package/dist/ui/hubspot/DealCard.mjs.map +11 -0
- package/dist/ui/hubspot/DealList.d.ts +24 -0
- package/dist/ui/hubspot/DealList.d.ts.map +1 -0
- package/dist/ui/hubspot/DealList.js +35 -0
- package/dist/ui/hubspot/DealList.js.map +1 -0
- package/dist/ui/hubspot/DealList.mjs +3 -0
- package/dist/ui/hubspot/DealList.mjs.map +11 -0
- package/dist/ui/hubspot/EmailCard.d.ts +25 -0
- package/dist/ui/hubspot/EmailCard.d.ts.map +1 -0
- package/dist/ui/hubspot/EmailCard.js +62 -0
- package/dist/ui/hubspot/EmailCard.js.map +1 -0
- package/dist/ui/hubspot/EmailCard.mjs +5 -0
- package/dist/ui/hubspot/EmailCard.mjs.map +11 -0
- package/dist/ui/hubspot/InboxStrip.d.ts +23 -0
- package/dist/ui/hubspot/InboxStrip.d.ts.map +1 -0
- package/dist/ui/hubspot/InboxStrip.js +36 -0
- package/dist/ui/hubspot/InboxStrip.js.map +1 -0
- package/dist/ui/hubspot/InboxStrip.mjs +3 -0
- package/dist/ui/hubspot/InboxStrip.mjs.map +11 -0
- package/dist/ui/hubspot/PipelineStrip.d.ts +22 -0
- package/dist/ui/hubspot/PipelineStrip.d.ts.map +1 -0
- package/dist/ui/hubspot/PipelineStrip.js +54 -0
- package/dist/ui/hubspot/PipelineStrip.js.map +1 -0
- package/dist/ui/hubspot/PipelineStrip.mjs +3 -0
- package/dist/ui/hubspot/PipelineStrip.mjs.map +11 -0
- package/dist/ui/hubspot/TicketCard.d.ts +25 -0
- package/dist/ui/hubspot/TicketCard.d.ts.map +1 -0
- package/dist/ui/hubspot/TicketCard.js +53 -0
- package/dist/ui/hubspot/TicketCard.js.map +1 -0
- package/dist/ui/hubspot/TicketCard.mjs +3 -0
- package/dist/ui/hubspot/TicketCard.mjs.map +21 -0
- package/dist/ui/hubspot/TicketList.d.ts +21 -0
- package/dist/ui/hubspot/TicketList.d.ts.map +1 -0
- package/dist/ui/hubspot/TicketList.js +33 -0
- package/dist/ui/hubspot/TicketList.js.map +1 -0
- package/dist/ui/hubspot/TicketList.mjs +3 -0
- package/dist/ui/hubspot/TicketList.mjs.map +11 -0
- package/dist/ui/hubspot/lib/hubspot.d.ts +24 -0
- package/dist/ui/hubspot/lib/hubspot.d.ts.map +1 -0
- package/dist/ui/hubspot/lib/hubspot.js +176 -0
- package/dist/ui/hubspot/lib/hubspot.js.map +1 -0
- package/dist/ui/notion/DatabaseCard.d.ts +24 -0
- package/dist/ui/notion/DatabaseCard.d.ts.map +1 -0
- package/dist/ui/notion/DatabaseCard.js +86 -0
- package/dist/ui/notion/DatabaseCard.js.map +1 -0
- package/dist/ui/notion/DatabaseCard.mjs +3 -0
- package/dist/ui/notion/DatabaseCard.mjs.map +11 -0
- package/dist/ui/notion/DatabaseRowList.d.ts +36 -0
- package/dist/ui/notion/DatabaseRowList.d.ts.map +1 -0
- package/dist/ui/notion/DatabaseRowList.js +87 -0
- package/dist/ui/notion/DatabaseRowList.js.map +1 -0
- package/dist/ui/notion/DatabaseRowList.mjs +3 -0
- package/dist/ui/notion/DatabaseRowList.mjs.map +11 -0
- package/dist/ui/notion/PageCard.d.ts +27 -0
- package/dist/ui/notion/PageCard.d.ts.map +1 -0
- package/dist/ui/notion/PageCard.js +80 -0
- package/dist/ui/notion/PageCard.js.map +1 -0
- package/dist/ui/notion/PageCard.mjs +3 -0
- package/dist/ui/notion/PageCard.mjs.map +11 -0
- package/dist/ui/notion/PageList.d.ts +24 -0
- package/dist/ui/notion/PageList.d.ts.map +1 -0
- package/dist/ui/notion/PageList.js +51 -0
- package/dist/ui/notion/PageList.js.map +1 -0
- package/dist/ui/notion/PageList.mjs +3 -0
- package/dist/ui/notion/PageList.mjs.map +11 -0
- package/dist/ui/notion/lib/notion.d.ts +35 -0
- package/dist/ui/notion/lib/notion.d.ts.map +1 -0
- package/dist/ui/notion/lib/notion.js +119 -0
- package/dist/ui/notion/lib/notion.js.map +1 -0
- package/dist/xml-to-json.d.ts +20 -0
- package/dist/xml-to-json.d.ts.map +1 -0
- package/dist/xml-to-json.js +256 -0
- package/dist/xml-to-json.js.map +1 -0
- package/package.json +12 -1
- package/src/apps/adroll.json +254 -0
- package/src/apps/ahrefs.json +156 -0
- package/src/apps/airtable.json +4 -13
- package/src/apps/algolia.json +115 -0
- package/src/apps/alibaba-cloud.json +211 -0
- package/src/apps/aliexpress.json +369 -0
- package/src/apps/alpaca-market-data.json +699 -0
- package/src/apps/alpaca-trading.json +214 -989
- package/src/apps/amazon-ads.json +249 -0
- package/src/apps/amazon-associates.json +102 -0
- package/src/apps/amplitude.json +86 -0
- package/src/apps/anchor-browser.json +173 -0
- package/src/apps/anthropic-api.json +9 -4
- package/src/apps/api-sports.json +180 -0
- package/src/apps/apple-search-ads.json +266 -0
- package/src/apps/auth0.json +126 -0
- package/src/apps/awin.json +111 -0
- package/src/apps/aws-codebuild.json +139 -0
- package/src/apps/aws-mediaconvert.json +196 -0
- package/src/apps/aws-s3.json +108 -192
- package/src/apps/aws-ses.json +666 -303
- package/src/apps/aws-sns.json +128 -106
- package/src/apps/azure-container-apps.json +116 -0
- package/src/apps/backblaze-b2.json +175 -0
- package/src/apps/bamboohr.json +303 -0
- package/src/apps/basiq.json +308 -0
- package/src/apps/bigcommerce.json +366 -0
- package/src/apps/bigquery.json +121 -0
- package/src/apps/binance-trading.json +7 -4
- package/src/apps/bing-webmaster-tools.json +158 -0
- package/src/apps/bitbucket.json +163 -0
- package/src/apps/blacksmith.json +81 -0
- package/src/apps/bls.json +104 -0
- package/src/apps/bluesky.json +74 -0
- package/src/apps/braze.json +103 -0
- package/src/apps/brevo.json +4 -1
- package/src/apps/brightdata.json +94 -0
- package/src/apps/browserbase.json +237 -0
- package/src/apps/bscscan.json +150 -0
- package/src/apps/buffer.json +121 -0
- package/src/apps/buildjet.json +80 -0
- package/src/apps/builtwith.json +101 -0
- package/src/apps/bunny-cdn.json +104 -0
- package/src/apps/bunny-stream.json +205 -3
- package/src/apps/byrd.json +585 -0
- package/src/apps/calendly.json +10 -7
- package/src/apps/campaign-manager-360.json +264 -0
- package/src/apps/capturekit.json +51 -0
- package/src/apps/circleci.json +212 -0
- package/src/apps/cirrus-runners.json +75 -0
- package/src/apps/cj-affiliate.json +101 -0
- package/src/apps/cjdropshipping.json +278 -0
- package/src/apps/clerk.json +153 -0
- package/src/apps/cloudflare-containers.json +98 -0
- package/src/apps/cloudflare-r2.json +180 -0
- package/src/apps/cloudflare.json +474 -157
- package/src/apps/cloudinary.json +119 -97
- package/src/apps/coconut.json +94 -0
- package/src/apps/contentful.json +157 -0
- package/src/apps/criteo.json +222 -0
- package/src/apps/crunchbase.json +104 -0
- package/src/apps/customer-io.json +106 -0
- package/src/apps/databricks.json +94 -0
- package/src/apps/deepgram.json +3 -0
- package/src/apps/deepl.json +113 -0
- package/src/apps/deepseek.json +5 -2
- package/src/apps/depot.json +102 -0
- package/src/apps/digitalocean-spaces.json +121 -0
- package/src/apps/digitalocean.json +115 -0
- package/src/apps/discord.json +90 -1
- package/src/apps/docker-build-cloud.json +68 -0
- package/src/apps/duffel.json +193 -77
- package/src/apps/dux-soup.json +4 -1
- package/src/apps/dv360.json +287 -0
- package/src/apps/earthly-cloud.json +84 -0
- package/src/apps/eia.json +121 -0
- package/src/apps/elasticsearch.json +282 -0
- package/src/apps/elevenlabs.json +336 -192
- package/src/apps/etherscan.json +162 -0
- package/src/apps/etsy.json +484 -0
- package/src/apps/eventbrite-events.json +5 -2
- package/src/apps/exa.json +101 -0
- package/src/apps/facebook-ads.json +3 -3
- package/src/apps/facebook-api.json +1484 -37
- package/src/apps/finnhub.json +232 -0
- package/src/apps/flightapi.json +248 -0
- package/src/apps/fly-io.json +134 -0
- package/src/apps/fred.json +156 -0
- package/src/apps/gdelt.json +96 -0
- package/src/apps/gelato.json +123 -0
- package/src/apps/gemini.json +143 -49
- package/src/apps/getscreenshot.json +52 -0
- package/src/apps/github.json +355 -39
- package/src/apps/gmail.json +151 -2
- package/src/apps/gnews.json +71 -0
- package/src/apps/google-analytics.json +311 -0
- package/src/apps/google-cloud-storage.json +484 -0
- package/src/apps/google-docs.json +2 -2
- package/src/apps/google-drive.json +2 -2
- package/src/apps/google-places.json +127 -0
- package/src/apps/google-search-console.json +126 -0
- package/src/apps/google-sheets.json +2 -2
- package/src/apps/grafana-cloud.json +98 -0
- package/src/apps/groq.json +119 -0
- package/src/apps/hetzner-object-storage.json +177 -0
- package/src/apps/hetzner.json +255 -367
- package/src/apps/heygen.json +828 -141
- package/src/apps/hive-fulfillment.json +559 -0
- package/src/apps/hotjar.json +91 -0
- package/src/apps/huawei-cloud.json +189 -0
- package/src/apps/huboo.json +286 -0
- package/src/apps/hubspot.json +253 -637
- package/src/apps/huggingface.json +5 -2
- package/src/apps/hunter.json +5 -2
- package/src/apps/hyperbrowser.json +205 -0
- package/src/apps/idrive-e2.json +128 -0
- package/src/apps/impact.json +106 -0
- package/src/apps/instagram-api.json +185 -11
- package/src/apps/instantly.json +169 -0
- package/src/apps/ionos.json +250 -0
- package/src/apps/{learning-platform.json → kalio.json} +162 -3
- package/src/apps/kalshi.json +144 -0
- package/src/apps/keywords-everywhere.json +86 -0
- package/src/apps/kickbox.json +71 -0
- package/src/apps/launchdarkly.json +111 -0
- package/src/apps/leadbyte.json +600 -0
- package/src/apps/leadfeeder.json +89 -0
- package/src/apps/lemlist.json +109 -0
- package/src/apps/linkedin-ads.json +279 -0
- package/src/apps/linkedin.json +96 -2
- package/src/apps/linode-object-storage.json +183 -0
- package/src/apps/linode.json +160 -0
- package/src/apps/lnk-bio.json +5 -2
- package/src/apps/loom.json +5 -2
- package/src/apps/lusha.json +104 -0
- package/src/apps/magalu-cloud.json +187 -0
- package/src/apps/majestic.json +117 -0
- package/src/apps/manifold-markets.json +144 -0
- package/src/apps/mapbox.json +118 -0
- package/src/apps/microsoft-ads.json +246 -0
- package/src/apps/microsoft-onedrive.json +380 -0
- package/src/apps/microsoft-teams.json +315 -96
- package/src/apps/millionverifier.json +85 -0
- package/src/apps/mindee.json +246 -0
- package/src/apps/miro.json +138 -0
- package/src/apps/mistral.json +129 -0
- package/src/apps/mixpanel.json +95 -0
- package/src/apps/moz.json +127 -0
- package/src/apps/mux.json +201 -0
- package/src/apps/namecheap.json +321 -123
- package/src/apps/namespace-cloud.json +84 -0
- package/src/apps/naver-cloud.json +184 -0
- package/src/apps/neon.json +122 -0
- package/src/apps/netlify.json +124 -0
- package/src/apps/neverbounce.json +92 -0
- package/src/apps/newrelic.json +80 -0
- package/src/apps/newsapi.json +86 -0
- package/src/apps/ngrok.json +29 -0
- package/src/apps/nixbuild.json +116 -0
- package/src/apps/northflank.json +161 -0
- package/src/apps/notion.json +3 -0
- package/src/apps/okta.json +131 -0
- package/src/apps/omnikit-analytics.json +73 -1
- package/src/apps/omnikit-api-gateway.json +74 -2
- package/src/apps/omnikit-billing.json +73 -1
- package/src/apps/omnikit-cms.json +73 -1
- package/src/apps/omnikit-code-ops.json +76 -4
- package/src/apps/omnikit-functions.json +74 -2
- package/src/apps/omnikit-intelligence.json +176 -33
- package/src/apps/omnikit-management.json +73 -1
- package/src/apps/omnikit-media.json +73 -1
- package/src/apps/omnikit-messaging.json +72 -0
- package/src/apps/omnikit-redirects.json +73 -1
- package/src/apps/omnikit-sites.json +325 -66
- package/src/apps/omnikit-storage.json +104 -7
- package/src/apps/omnikit-webhooks.json +73 -1
- package/src/apps/omnikit-workflows.json +73 -1
- package/src/apps/onesignal.json +108 -0
- package/src/apps/openai-api.json +176 -30
- package/src/apps/openai-codex.json +187 -0
- package/src/apps/opencode-go.json +113 -0
- package/src/apps/optinmonster.json +7 -4
- package/src/apps/outlook-calendar.json +350 -0
- package/src/apps/outlook-mail.json +337 -0
- package/src/apps/outscraper.json +118 -0
- package/src/apps/ovhcloud.json +209 -0
- package/src/apps/paddle.json +170 -0
- package/src/apps/pagerduty.json +151 -0
- package/src/apps/partnerstack.json +118 -0
- package/src/apps/perplexity.json +37 -0
- package/src/apps/phantombuster.json +85 -0
- package/src/apps/pinecone.json +129 -0
- package/src/apps/pinterest-ads.json +261 -0
- package/src/apps/pinterest.json +217 -0
- package/src/apps/planetscale.json +139 -0
- package/src/apps/polygonscan.json +157 -0
- package/src/apps/polymarket-clob.json +184 -0
- package/src/apps/polymarket-data.json +153 -0
- package/src/apps/porkbun.json +609 -145
- package/src/apps/posthog.json +107 -0
- package/src/apps/pushover.json +28 -0
- package/src/apps/quora-ads.json +251 -0
- package/src/apps/railway.json +57 -0
- package/src/apps/reddit-ads.json +238 -0
- package/src/apps/reddit.json +274 -0
- package/src/apps/render.json +124 -0
- package/src/apps/replicate.json +5 -2
- package/src/apps/reply-io.json +111 -0
- package/src/apps/resend.json +110 -0
- package/src/apps/ringover.json +1144 -0
- package/src/apps/rocketreach.json +158 -0
- package/src/apps/rollbar.json +88 -0
- package/src/apps/runs-on.json +70 -0
- package/src/apps/sanity.json +89 -0
- package/src/apps/scaleway-object-storage.json +175 -0
- package/src/apps/scrapingbee.json +75 -0
- package/src/apps/screenshotlayer.json +49 -0
- package/src/apps/screenshotmachine.json +49 -0
- package/src/apps/se-ranking.json +239 -0
- package/src/apps/seamless-ai.json +91 -0
- package/src/apps/sec-edgar.json +107 -0
- package/src/apps/segment.json +104 -0
- package/src/apps/semrush.json +153 -0
- package/src/apps/sentry.json +109 -0
- package/src/apps/serpapi.json +95 -0
- package/src/apps/serper.json +139 -0
- package/src/apps/shareasale.json +130 -0
- package/src/apps/skimlinks.json +48 -0
- package/src/apps/slack.json +101 -0
- package/src/apps/smartlead.json +146 -0
- package/src/apps/snapchat-ads.json +238 -0
- package/src/apps/snaprender.json +64 -0
- package/src/apps/snowflake.json +70 -0
- package/src/apps/snyk.json +108 -0
- package/src/apps/socialcast.json +74 -8
- package/src/apps/sovrn.json +125 -0
- package/src/apps/spotify-ads.json +231 -0
- package/src/apps/steel.json +239 -0
- package/src/apps/stocktwits.json +120 -0
- package/src/apps/stripe.json +153 -0
- package/src/apps/target-circle.json +348 -0
- package/src/apps/tavily.json +104 -0
- package/src/apps/tavus.json +403 -0
- package/src/apps/telegram.json +5 -2
- package/src/apps/teller.json +187 -0
- package/src/apps/tencent-cloud.json +214 -0
- package/src/apps/tennis-abstract.json +108 -0
- package/src/apps/the-odds-api.json +132 -0
- package/src/apps/the-sports-db.json +163 -0
- package/src/apps/tiktok-ads.json +295 -0
- package/src/apps/tiktok-api.json +181 -7
- package/src/apps/together.json +5 -2
- package/src/apps/trade-desk.json +237 -0
- package/src/apps/trading212.json +26 -29
- package/src/apps/transloadit.json +138 -0
- package/src/apps/truelayer.json +318 -0
- package/src/apps/twilio.json +313 -42
- package/src/apps/twitter-api.json +216 -33
- package/src/apps/ubicloud.json +82 -0
- package/src/apps/uplead.json +105 -0
- package/src/apps/upstash.json +90 -0
- package/src/apps/valueserp.json +63 -0
- package/src/apps/venice-ai.json +685 -0
- package/src/apps/vercel.json +137 -0
- package/src/apps/wappalyzer.json +65 -0
- package/src/apps/wasabi.json +175 -0
- package/src/apps/whale-alert.json +74 -0
- package/src/apps/whatsapp-business.json +131 -0
- package/src/apps/wikipedia.json +112 -0
- package/src/apps/workos.json +123 -0
- package/src/apps/yahoo-dsp.json +265 -0
- package/src/apps/yahoo-finance.json +60 -0
- package/src/apps/youtube-api.json +520 -142
- package/src/apps/zenrows.json +47 -0
- package/src/apps/zenserp.json +99 -0
- package/src/apps/zerobounce.json +80 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
repo: string;
|
|
3
|
+
/** Full or short sha — display will short. */
|
|
4
|
+
sha: string;
|
|
5
|
+
/** Full commit message (first line is subject, rest body). */
|
|
6
|
+
message?: string;
|
|
7
|
+
author_login?: string;
|
|
8
|
+
author_avatar_url?: string;
|
|
9
|
+
committed_at?: string;
|
|
10
|
+
additions?: number;
|
|
11
|
+
deletions?: number;
|
|
12
|
+
changed_files?: number;
|
|
13
|
+
/** Comma-separated paths — agent passes the touched files. */
|
|
14
|
+
files?: string;
|
|
15
|
+
/** GitHub signature verification status. */
|
|
16
|
+
verified?: boolean;
|
|
17
|
+
/** Render as a one-liner for inline mentions in chat. */
|
|
18
|
+
compact?: boolean;
|
|
19
|
+
preview?: boolean;
|
|
20
|
+
projectId?: string;
|
|
21
|
+
}
|
|
22
|
+
export default function CommitCard(props: Props): import("react").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=CommitCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommitCard.d.ts","sourceRoot":"","sources":["../../../src/ui/github/CommitCard.tsx"],"names":[],"mappings":"AAkBA,UAAU,KAAK;IACd,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAiBD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAAK,EAAE,KAAK,+BAsG9C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// CommitCard — single GitHub commit.
|
|
2
|
+
//
|
|
3
|
+
// The agent's"I just pushed X" response, or any inline reference to
|
|
4
|
+
// a commit by sha. Two variants:
|
|
5
|
+
//
|
|
6
|
+
// - Default: full card with subject, body excerpt, file stats, and
|
|
7
|
+
// a list of touched files.
|
|
8
|
+
// - Compact: one-line affordance for inline mentions in chat —
|
|
9
|
+
// [octocat] abc1234 refactor webhook handler
|
|
10
|
+
//
|
|
11
|
+
// The compact variant skips CardHeader entirely and renders inside
|
|
12
|
+
// a <Card compact>.
|
|
13
|
+
import { Avatar, Card, CardHeader, DataList, StatusPill } from "@apteva/ui-kit";
|
|
14
|
+
import { avatarDataUrl, commitUrl, githubVendor, shortSha, timeAgo, } from "./lib/github";
|
|
15
|
+
const previewSample = {
|
|
16
|
+
repo: "acme/api",
|
|
17
|
+
sha: "abc1234d5e6f7890abcdef",
|
|
18
|
+
subject: "refactor webhook handler to share retry logic",
|
|
19
|
+
body: "The retry policy was duplicated across the four webhook receivers." + "Extract into shared/retry.ts and apply consistently across stripe," + "hubspot, github, linear handlers.",
|
|
20
|
+
author: { login: "maya", avatar_url: avatarDataUrl("a78bfa") },
|
|
21
|
+
committed_at: new Date(Date.now() - 12 * 60 * 1000).toISOString(),
|
|
22
|
+
additions: 47,
|
|
23
|
+
deletions: 31,
|
|
24
|
+
changed_files: 5,
|
|
25
|
+
files: ["api/webhooks/stripe.ts", "api/webhooks/hubspot.ts", "api/webhooks/github.ts", "api/webhooks/linear.ts", "shared/retry.ts",
|
|
26
|
+
],
|
|
27
|
+
verified: true,
|
|
28
|
+
};
|
|
29
|
+
export default function CommitCard(props) {
|
|
30
|
+
const p = props.preview
|
|
31
|
+
? previewSample
|
|
32
|
+
: (() => {
|
|
33
|
+
const message = props.message || "";
|
|
34
|
+
const [subject, ...rest] = message.split("\n");
|
|
35
|
+
return {
|
|
36
|
+
repo: props.repo,
|
|
37
|
+
sha: props.sha,
|
|
38
|
+
subject: subject || `Commit ${shortSha(props.sha)}`,
|
|
39
|
+
body: rest.join("\n").trim(),
|
|
40
|
+
author: {
|
|
41
|
+
login: props.author_login || "",
|
|
42
|
+
avatar_url: props.author_avatar_url || "",
|
|
43
|
+
},
|
|
44
|
+
committed_at: props.committed_at || new Date().toISOString(),
|
|
45
|
+
additions: props.additions ?? 0,
|
|
46
|
+
deletions: props.deletions ?? 0,
|
|
47
|
+
changed_files: props.changed_files ?? 0,
|
|
48
|
+
files: (props.files || "").split(",").map((s) => s.trim()).filter(Boolean),
|
|
49
|
+
verified: !!props.verified,
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
const url = commitUrl(p.repo, p.sha);
|
|
53
|
+
const sha = shortSha(p.sha);
|
|
54
|
+
if (props.compact) {
|
|
55
|
+
return (<Card compact href={url}>
|
|
56
|
+
<span className="text-[11px] uppercase tracking-wider font-semibold px-1.5 py-0.5 rounded-md flex-shrink-0" style={{ color: "#8957e5", backgroundColor: "#8957e514" }}>
|
|
57
|
+
GITHUB
|
|
58
|
+
</span>
|
|
59
|
+
<span className="font-mono text-xs text-text-dim flex-shrink-0">{sha}</span>
|
|
60
|
+
<span className="text-sm text-text truncate">{p.subject}</span>
|
|
61
|
+
<span className="ml-auto text-xs text-text-dim flex-shrink-0">{timeAgo(p.committed_at)}</span>
|
|
62
|
+
</Card>);
|
|
63
|
+
}
|
|
64
|
+
return (<Card>
|
|
65
|
+
<CardHeader vendor={githubVendor} title={p.repo} subtitle={<span>
|
|
66
|
+
<span className="font-mono">{sha}</span> · {p.subject}
|
|
67
|
+
</span>} status={p.verified ? { label: "verified", variant: "live" } : undefined} action={{ label: "View commit", href: url }}/>
|
|
68
|
+
|
|
69
|
+
<div className="px-4 py-3 flex flex-col gap-3">
|
|
70
|
+
{/* author + time + diff stats */}
|
|
71
|
+
<div className="flex items-center gap-2 text-xs">
|
|
72
|
+
<Avatar src={p.author.avatar_url} name={p.author.login} size={18}/>
|
|
73
|
+
<span className="text-text font-medium">{p.author.login}</span>
|
|
74
|
+
<span className="text-text-dim">committed {timeAgo(p.committed_at)}</span>
|
|
75
|
+
<span className="ml-auto inline-flex items-center gap-2 tabular-nums">
|
|
76
|
+
<span className="text-green-600 dark:text-success">+{p.additions}</span>
|
|
77
|
+
<span className="text-red-600 dark:text-error">−{p.deletions}</span>
|
|
78
|
+
<span className="text-text-dim">in {p.changed_files} file{p.changed_files === 1 ? "" : "s"}</span>
|
|
79
|
+
</span>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
{p.body && (<p className="text-sm text-text whitespace-pre-wrap break-words leading-relaxed line-clamp-3">
|
|
83
|
+
{p.body}
|
|
84
|
+
</p>)}
|
|
85
|
+
|
|
86
|
+
{p.files.length > 0 && (<DataList items={[
|
|
87
|
+
{
|
|
88
|
+
label: "Files",
|
|
89
|
+
value: (<ul className="flex flex-col gap-0.5 font-mono text-xs">
|
|
90
|
+
{p.files.slice(0, 5).map((f) => (<li key={f} className="text-text truncate">{f}</li>))}
|
|
91
|
+
{p.files.length > 5 && (<li className="text-text-dim">+{p.files.length - 5} more</li>)}
|
|
92
|
+
</ul>),
|
|
93
|
+
},
|
|
94
|
+
]}/>)}
|
|
95
|
+
|
|
96
|
+
{p.verified && (<div className="flex items-center gap-1.5 text-[11px] text-text-dim">
|
|
97
|
+
<StatusPill variant="success">verified signature</StatusPill>
|
|
98
|
+
</div>)}
|
|
99
|
+
</div>
|
|
100
|
+
</Card>);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=CommitCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommitCard.js","sourceRoot":"","sources":["../../../src/ui/github/CommitCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{Avatar as Z,Card as W,CardHeader as $,DataList as k,StatusPill as H}from"@apteva/ui-kit";import{jsx as O}from"react/jsx-runtime";var Y=O("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"currentColor","aria-hidden":!0,children:O("path",{d:"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.807 1.305 3.492.998.108-.776.42-1.305.762-1.604-2.665-.305-5.466-1.334-5.466-5.93 0-1.31.467-2.38 1.235-3.22-.135-.303-.54-1.524.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.652.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.435.375.81 1.102.81 2.222 0 1.605-.015 2.898-.015 3.293 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"})});var Q={name:"GitHub",logo:Y,color:"#8957e5"};function R(y,q){return`https://github.com/${y}/commit/${q}`}function M(y){if(!y)return"";let q=new Date(y).getTime();if(!Number.isFinite(q))return"";let I=Math.max(0,(Date.now()-q)/1000);if(I<60)return"just now";let G=I/60;if(G<60)return`${Math.round(G)}m ago`;let E=G/60;if(E<24)return`${Math.round(E)}h ago`;let J=E/24;if(J<30)return`${Math.round(J)}d ago`;let K=J/30;if(K<12)return`${Math.round(K)}mo ago`;return`${Math.round(K/12)}y ago`}function N(y){if(!y)return"";return y.length>7?y.slice(0,7):y}function T(y){return"data:image/svg+xml;utf8,"+encodeURIComponent(`<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%23${y}'/></svg>`)}import{jsx as z,jsxs as B}from"react/jsx-runtime";var P={repo:"acme/api",sha:"abc1234d5e6f7890abcdef",subject:"refactor webhook handler to share retry logic",body:"The retry policy was duplicated across the four webhook receivers.Extract into shared/retry.ts and apply consistently across stripe,hubspot, github, linear handlers.",author:{login:"maya",avatar_url:T("a78bfa")},committed_at:new Date(Date.now()-720000).toISOString(),additions:47,deletions:31,changed_files:5,files:["api/webhooks/stripe.ts","api/webhooks/hubspot.ts","api/webhooks/github.ts","api/webhooks/linear.ts","shared/retry.ts"],verified:!0};function V(y){let q=y.preview?P:(()=>{let E=y.message||"",[J,...K]=E.split(`
|
|
2
|
+
`);return{repo:y.repo,sha:y.sha,subject:J||`Commit ${N(y.sha)}`,body:K.join(`
|
|
3
|
+
`).trim(),author:{login:y.author_login||"",avatar_url:y.author_avatar_url||""},committed_at:y.committed_at||new Date().toISOString(),additions:y.additions??0,deletions:y.deletions??0,changed_files:y.changed_files??0,files:(y.files||"").split(",").map((X)=>X.trim()).filter(Boolean),verified:!!y.verified}})(),I=R(q.repo,q.sha),G=N(q.sha);if(y.compact)return B(W,{compact:!0,href:I,children:[z("span",{className:"text-[11px] uppercase tracking-wider font-semibold px-1.5 py-0.5 rounded-md flex-shrink-0",style:{color:"#8957e5",backgroundColor:"#8957e514"},children:"GITHUB"}),z("span",{className:"font-mono text-xs text-text-dim flex-shrink-0",children:G}),z("span",{className:"text-sm text-text truncate",children:q.subject}),z("span",{className:"ml-auto text-xs text-text-dim flex-shrink-0",children:M(q.committed_at)})]});return B(W,{children:[z($,{vendor:Q,title:q.repo,subtitle:B("span",{children:[z("span",{className:"font-mono",children:G})," · ",q.subject]}),status:q.verified?{label:"verified",variant:"live"}:void 0,action:{label:"View commit",href:I}}),B("div",{className:"px-4 py-3 flex flex-col gap-3",children:[B("div",{className:"flex items-center gap-2 text-xs",children:[z(Z,{src:q.author.avatar_url,name:q.author.login,size:18}),z("span",{className:"text-text font-medium",children:q.author.login}),B("span",{className:"text-text-dim",children:["committed ",M(q.committed_at)]}),B("span",{className:"ml-auto inline-flex items-center gap-2 tabular-nums",children:[B("span",{className:"text-green-600 dark:text-success",children:["+",q.additions]}),B("span",{className:"text-red-600 dark:text-error",children:["−",q.deletions]}),B("span",{className:"text-text-dim",children:["in ",q.changed_files," file",q.changed_files===1?"":"s"]})]})]}),q.body&&z("p",{className:"text-sm text-text whitespace-pre-wrap break-words leading-relaxed line-clamp-3",children:q.body}),q.files.length>0&&z(k,{items:[{label:"Files",value:B("ul",{className:"flex flex-col gap-0.5 font-mono text-xs",children:[q.files.slice(0,5).map((E)=>z("li",{className:"text-text truncate",children:E},E)),q.files.length>5&&B("li",{className:"text-text-dim",children:["+",q.files.length-5," more"]})]})}]}),q.verified&&z("div",{className:"flex items-center gap-1.5 text-[11px] text-text-dim",children:z(H,{variant:"success",children:"verified signature"})})]})]})}export{V as default};
|
|
4
|
+
|
|
5
|
+
//# debugId=47864A943A50CD3764756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ui/github/CommitCard.tsx", "../../../src/ui/github/lib/github.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// CommitCard — single GitHub commit.\n//\n// The agent's\"I just pushed X\" response, or any inline reference to\n// a commit by sha. Two variants:\n//\n// - Default: full card with subject, body excerpt, file stats, and\n// a list of touched files.\n// - Compact: one-line affordance for inline mentions in chat —\n// [octocat] abc1234 refactor webhook handler\n//\n// The compact variant skips CardHeader entirely and renders inside\n// a <Card compact>.\n\nimport { Avatar, Card, CardHeader, DataList, StatusPill } from \"@apteva/ui-kit\";\nimport {\n avatarDataUrl, commitUrl, githubVendor, shortSha, timeAgo,\n} from \"./lib/github\";\n\ninterface Props {\n repo: string;\n /** Full or short sha — display will short. */\n sha: string;\n /** Full commit message (first line is subject, rest body). */\n message?: string;\n author_login?: string;\n author_avatar_url?: string;\n committed_at?: string;\n additions?: number;\n deletions?: number;\n changed_files?: number;\n /** Comma-separated paths — agent passes the touched files. */\n files?: string;\n /** GitHub signature verification status. */\n verified?: boolean;\n /** Render as a one-liner for inline mentions in chat. */\n compact?: boolean;\n preview?: boolean;\n projectId?: string;\n}\n\nconst previewSample = {\n repo: \"acme/api\",\n sha: \"abc1234d5e6f7890abcdef\",\n subject: \"refactor webhook handler to share retry logic\",\n body: \"The retry policy was duplicated across the four webhook receivers.\" +\"Extract into shared/retry.ts and apply consistently across stripe,\" +\"hubspot, github, linear handlers.\",\n author: { login: \"maya\", avatar_url: avatarDataUrl(\"a78bfa\") },\n committed_at: new Date(Date.now() - 12 * 60 * 1000).toISOString(),\n additions: 47,\n deletions: 31,\n changed_files: 5,\n files: [\"api/webhooks/stripe.ts\",\"api/webhooks/hubspot.ts\",\"api/webhooks/github.ts\",\"api/webhooks/linear.ts\",\"shared/retry.ts\",\n ],\n verified: true,\n};\n\nexport default function CommitCard(props: Props) {\n const p = props.preview\n ? previewSample\n : (() => {\n const message = props.message || \"\";\n const [subject, ...rest] = message.split(\"\\n\");\n return {\n repo: props.repo,\n sha: props.sha,\n subject: subject || `Commit ${shortSha(props.sha)}`,\n body: rest.join(\"\\n\").trim(),\n author: {\n login: props.author_login || \"\",\n avatar_url: props.author_avatar_url || \"\",\n },\n committed_at: props.committed_at || new Date().toISOString(),\n additions: props.additions ?? 0,\n deletions: props.deletions ?? 0,\n changed_files: props.changed_files ?? 0,\n files: (props.files || \"\").split(\",\").map((s) => s.trim()).filter(Boolean),\n verified: !!props.verified,\n };\n })();\n\n const url = commitUrl(p.repo, p.sha);\n const sha = shortSha(p.sha);\n\n if (props.compact) {\n return (\n <Card compact href={url}>\n <span className=\"text-[11px] uppercase tracking-wider font-semibold px-1.5 py-0.5 rounded-md flex-shrink-0\"\n style={{ color: \"#8957e5\", backgroundColor: \"#8957e514\" }}>\n GITHUB\n </span>\n <span className=\"font-mono text-xs text-text-dim flex-shrink-0\">{sha}</span>\n <span className=\"text-sm text-text truncate\">{p.subject}</span>\n <span className=\"ml-auto text-xs text-text-dim flex-shrink-0\">{timeAgo(p.committed_at)}</span>\n </Card>\n );\n }\n\n return (\n <Card>\n <CardHeader\n vendor={githubVendor}\n title={p.repo}\n subtitle={\n <span>\n <span className=\"font-mono\">{sha}</span> · {p.subject}\n </span>\n }\n status={p.verified ? { label: \"verified\", variant: \"live\" } : undefined}\n action={{ label: \"View commit\", href: url }}\n />\n\n <div className=\"px-4 py-3 flex flex-col gap-3\">\n {/* author + time + diff stats */}\n <div className=\"flex items-center gap-2 text-xs\">\n <Avatar src={p.author.avatar_url} name={p.author.login} size={18} />\n <span className=\"text-text font-medium\">{p.author.login}</span>\n <span className=\"text-text-dim\">committed {timeAgo(p.committed_at)}</span>\n <span className=\"ml-auto inline-flex items-center gap-2 tabular-nums\">\n <span className=\"text-green-600 dark:text-success\">+{p.additions}</span>\n <span className=\"text-red-600 dark:text-error\">−{p.deletions}</span>\n <span className=\"text-text-dim\">in {p.changed_files} file{p.changed_files === 1 ? \"\" :\"s\"}</span>\n </span>\n </div>\n\n {p.body && (\n <p className=\"text-sm text-text whitespace-pre-wrap break-words leading-relaxed line-clamp-3\">\n {p.body}\n </p>\n )}\n\n {p.files.length > 0 && (\n <DataList\n items={[\n {\n label: \"Files\",\n value: (\n <ul className=\"flex flex-col gap-0.5 font-mono text-xs\">\n {p.files.slice(0, 5).map((f) => (\n <li key={f} className=\"text-text truncate\">{f}</li>\n ))}\n {p.files.length > 5 && (\n <li className=\"text-text-dim\">+{p.files.length - 5} more</li>\n )}\n </ul>\n ),\n },\n ]}\n />\n )}\n\n {p.verified && (\n <div className=\"flex items-center gap-1.5 text-[11px] text-text-dim\">\n <StatusPill variant=\"success\">verified signature</StatusPill>\n </div>\n )}\n </div>\n </Card>\n );\n}\n",
|
|
6
|
+
"// Shared helpers for every GitHub UI component.\n//\n// * githubVendor — CardHeader brand pill (logo + name + color)\n// * URL builders — repo, issue, PR, commit, workflow run, branch\n// * formatters — relative time, short sha, file-stat string\n// * status mappers — PR state → StatusPill variant, run conclusion\n// → StatusDot variant, etc.\n//\n// Mirrors the lib/hubspot.tsx pattern so any vendor lib has the\n// same shape (logo + vendor + URL helpers + status mappers + time\n// helpers).\n\nimport type { ReactNode } from \"react\";\nimport type { CardVendor, StatusDotVariant, StatusPillVariant } from \"@apteva/ui-kit\";\n\n// ─── Brand mark ───────────────────────────────────────────────────\n//\n// Octocat outline. currentColor so CardHeader's vendor pill can\n// recolor it via inline `style.color`.\n\nexport const githubLogo: ReactNode = (\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.807 1.305 3.492.998.108-.776.42-1.305.762-1.604-2.665-.305-5.466-1.334-5.466-5.93 0-1.31.467-2.38 1.235-3.22-.135-.303-.54-1.524.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.652.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.435.375.81 1.102.81 2.222 0 1.605-.015 2.898-.015 3.293 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n);\n\n// GitHub Mona Purple — secondary brand color, used in the vendor\n// pill and any GitHub-specific accents. Distinct from HubSpot orange\n// so two cards from different vendors read as different upstreams at\n// a glance.\nexport const GITHUB_BRAND_COLOR = \"#8957e5\";\n\nexport const githubVendor: CardVendor = {\n name: \"GitHub\",\n logo: githubLogo,\n color: GITHUB_BRAND_COLOR,\n};\n\n// ─── URL builders ─────────────────────────────────────────────────\n\nexport function repoUrl(repo: string): string {\n return `https://github.com/${repo}`;\n}\nexport function issueUrl(repo: string, number: number | string): string {\n return `https://github.com/${repo}/issues/${number}`;\n}\nexport function pullRequestUrl(repo: string, number: number | string): string {\n return `https://github.com/${repo}/pull/${number}`;\n}\nexport function commitUrl(repo: string, sha: string): string {\n return `https://github.com/${repo}/commit/${sha}`;\n}\nexport function workflowRunUrl(repo: string, run_id: number | string): string {\n return `https://github.com/${repo}/actions/runs/${run_id}`;\n}\nexport function branchUrl(repo: string, branch: string): string {\n return `https://github.com/${repo}/tree/${encodeURIComponent(branch)}`;\n}\nexport function userUrl(login: string): string {\n return `https://github.com/${login}`;\n}\n\n// ─── Formatters ───────────────────────────────────────────────────\n\n/** \"3d ago\" / \"12m ago\" / \"just now\" — coarse human-readable delta. */\nexport function timeAgo(iso?: string): string {\n if (!iso) return \"\";\n const t = new Date(iso).getTime();\n if (!Number.isFinite(t)) return \"\";\n const s = Math.max(0, (Date.now() - t) / 1000);\n if (s < 60) return \"just now\";\n const m = s / 60; if (m < 60) return `${Math.round(m)}m ago`;\n const h = m / 60; if (h < 24) return `${Math.round(h)}h ago`;\n const d = h / 24; if (d < 30) return `${Math.round(d)}d ago`;\n const mo = d / 30; if (mo < 12) return `${Math.round(mo)}mo ago`;\n return `${Math.round(mo / 12)}y ago`;\n}\n\n/** Coerce ISO durations to mm:ss / hh:mm:ss. Used for run/job times. */\nexport function formatDuration(ms?: number): string {\n if (!ms || ms < 0) return \"—\";\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const rs = s % 60;\n if (m < 60) return rs ? `${m}m ${rs}s` : `${m}m`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\n/** \"abc1234\" — 7-char short sha. Tolerates already-short input. */\nexport function shortSha(sha?: string): string {\n if (!sha) return \"\";\n return sha.length > 7 ? sha.slice(0, 7) : sha;\n}\n\n/** Test fixture helper — same shape as lib/hubspot's minusHoursISO. */\nexport function minusHoursISO(h: number): string {\n return new Date(Date.now() - h * 60 * 60 * 1000).toISOString();\n}\n\n// ─── Status mappers ───────────────────────────────────────────────\n\n/** PR state → StatusPill variant + label. */\nexport function pullRequestState(opts: {\n state?: \"open\" | \"closed\";\n merged?: boolean;\n draft?: boolean;\n}): { label: string; variant: StatusPillVariant; dot: StatusDotVariant } {\n if (opts.merged) return { label: \"merged\", variant: \"success\", dot: \"live\" };\n if (opts.state === \"closed\") return { label: \"closed\", variant: \"error\", dot: \"error\" };\n if (opts.draft) return { label: \"draft\", variant: \"neutral\", dot: \"muted\" };\n return { label: \"open\", variant: \"info\", dot: \"active\" };\n}\n\n/** Workflow-run status + conclusion → label/variant pair. */\nexport function runState(opts: {\n status?: string; // queued | in_progress | completed\n conclusion?: string; // success | failure | cancelled | skipped | neutral | timed_out\n}): { label: string; variant: StatusPillVariant; dot: StatusDotVariant } {\n if (opts.status === \"in_progress\") return { label: \"running\", variant: \"info\", dot: \"active\" };\n if (opts.status === \"queued\") return { label: \"queued\", variant: \"neutral\", dot: \"muted\" };\n switch (opts.conclusion) {\n case \"success\": return { label: \"success\", variant: \"success\", dot: \"live\" };\n case \"failure\": return { label: \"failed\", variant: \"error\", dot: \"error\" };\n case \"cancelled\": return { label: \"cancelled\", variant: \"neutral\", dot: \"muted\" };\n case \"skipped\": return { label: \"skipped\", variant: \"neutral\", dot: \"muted\" };\n case \"timed_out\": return { label: \"timed out\", variant: \"warn\", dot: \"warn\" };\n case \"neutral\": return { label: \"neutral\", variant: \"neutral\", dot: \"muted\" };\n default: return { label: \"—\", variant: \"neutral\", dot: \"muted\" };\n }\n}\n\n/** Job conclusion → small dot variant for inline lists. */\nexport function jobDot(conclusion?: string, status?: string): StatusDotVariant {\n if (status === \"in_progress\") return \"active\";\n if (status === \"queued\") return \"muted\";\n switch (conclusion) {\n case \"success\": return \"live\";\n case \"failure\": return \"error\";\n case \"cancelled\": return \"muted\";\n case \"skipped\": return \"muted\";\n case \"timed_out\": return \"warn\";\n default: return \"muted\";\n }\n}\n\n// ─── Mini avatar fallback (data URL) ──────────────────────────────\n//\n// IssueCard's preview avatars used inline data:image/svg+xml URLs so\n// the explorer doesn't depend on network requests. Same helper\n// reused across cards' preview samples.\n\nexport function avatarDataUrl(hexFill: string): string {\n return (\n \"data:image/svg+xml;utf8,\" +\n encodeURIComponent(\n `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%23${hexFill}'/></svg>`,\n )\n );\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "47864A943A50CD3764756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/**"owner/name" — required. */
|
|
3
|
+
repo: string;
|
|
4
|
+
/** GitHub issue number (#NN), required. */
|
|
5
|
+
issue_number: number;
|
|
6
|
+
/** Issue title — agent passes from get_issue response. */
|
|
7
|
+
title?: string;
|
|
8
|
+
/** Issue state —"open" or"closed". */
|
|
9
|
+
state?: "open" | "closed";
|
|
10
|
+
state_reason?: "completed" | "not_planned" | "reopened" | null;
|
|
11
|
+
/** Author login (the user who opened the issue). */
|
|
12
|
+
user_login?: string;
|
|
13
|
+
/** Author avatar URL. */
|
|
14
|
+
user_avatar_url?: string;
|
|
15
|
+
/** Comma-separated label names. Optional convenience for terse
|
|
16
|
+
* agent calls; richer apps can pass `labels` directly. */
|
|
17
|
+
labels?: string;
|
|
18
|
+
/** Comma-separated assignee logins. */
|
|
19
|
+
assignees?: string;
|
|
20
|
+
/** Comments count. */
|
|
21
|
+
comments?: number;
|
|
22
|
+
/** Soft preview convention — render synthetic data when no real
|
|
23
|
+
* data is available so the dashboard's app detail panel can show
|
|
24
|
+
* what the card looks like even before the user creates a
|
|
25
|
+
* connection. */
|
|
26
|
+
preview?: boolean;
|
|
27
|
+
/** Injected by the host (unused in v1, here for the future fetch
|
|
28
|
+
* path). */
|
|
29
|
+
projectId?: string;
|
|
30
|
+
}
|
|
31
|
+
export default function IssueCard(props: Props): import("react").JSX.Element;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=IssueCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IssueCard.d.ts","sourceRoot":"","sources":["../../../src/ui/github/IssueCard.tsx"],"names":[],"mappings":"AA0CA,UAAU,KAAK;IACd,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAC,MAAM,GAAE,QAAQ,CAAC;IACxB,YAAY,CAAC,EAAC,WAAW,GAAE,aAAa,GAAE,UAAU,GAAG,IAAI,CAAC;IAC5D,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;6DACyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;oBAGgB;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;eACW;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA+CD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE,KAAK,+BA8F7C"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// IssueCard — chat-attachment card for a single GitHub issue.
|
|
2
|
+
//
|
|
3
|
+
// The agent calls
|
|
4
|
+
// respond(components=[{ app: "github", name: "issue-card", props:{...}}])
|
|
5
|
+
// and this card mounts under the agent's message bubble.
|
|
6
|
+
//
|
|
7
|
+
// v1 renders from inline props — the agent passes what it just got
|
|
8
|
+
// back from the github get_issue tool. A future revision can add a
|
|
9
|
+
// component-side fetch path so the card live-updates without the
|
|
10
|
+
// agent having to re-render. Until that exists, props ARE the
|
|
11
|
+
// source of truth.
|
|
12
|
+
//
|
|
13
|
+
// Visuals are entirely composed from @apteva/ui-kit primitives so the
|
|
14
|
+
// card looks like every other chat-attachment in the platform.
|
|
15
|
+
import { MessageCircle } from "lucide-react";
|
|
16
|
+
import { Card, CardHeader, StatusPill, Avatar, DataList } from "@apteva/ui-kit";
|
|
17
|
+
import { githubVendor } from "./lib/github";
|
|
18
|
+
const previewSample = {
|
|
19
|
+
number: 1234,
|
|
20
|
+
title: "Retry tier escalation skips dunning step on past-due renewals",
|
|
21
|
+
state: "open",
|
|
22
|
+
state_reason: null,
|
|
23
|
+
user: {
|
|
24
|
+
login: "maya",
|
|
25
|
+
avatar_url: "data:image/svg+xml;utf8," +
|
|
26
|
+
encodeURIComponent("<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%23a78bfa'/></svg>"),
|
|
27
|
+
},
|
|
28
|
+
assignees: [
|
|
29
|
+
{
|
|
30
|
+
login: "ari",
|
|
31
|
+
avatar_url: "data:image/svg+xml;utf8," +
|
|
32
|
+
encodeURIComponent("<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%2334d399'/></svg>"),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
labels: [
|
|
36
|
+
{ name: "billing", color: "1f6feb" },
|
|
37
|
+
{ name: "bug", color: "d73a4a" },
|
|
38
|
+
],
|
|
39
|
+
comments: 7,
|
|
40
|
+
html_url: "https://github.com/acme/api/issues/1234",
|
|
41
|
+
};
|
|
42
|
+
// Stable color palette for labels we don't get a hex from. Hashes
|
|
43
|
+
// the label name into one of a small fixed set so the same label
|
|
44
|
+
// always renders the same color across cards.
|
|
45
|
+
const labelPalette = ["1f6feb", "8957e5", "d73a4a", "fbca04", "0e8a16", "5319e7", "b60205", "0075ca"];
|
|
46
|
+
function defaultLabelColor(name) {
|
|
47
|
+
let h = 0;
|
|
48
|
+
for (let i = 0; i < name.length; i++)
|
|
49
|
+
h = (h * 31 + name.charCodeAt(i)) >>> 0;
|
|
50
|
+
return labelPalette[h % labelPalette.length];
|
|
51
|
+
}
|
|
52
|
+
function pillForState(issue) {
|
|
53
|
+
if (issue.state === "closed") {
|
|
54
|
+
if (issue.state_reason === "not_planned")
|
|
55
|
+
return { label: "closed (not planned)", variant: "neutral" };
|
|
56
|
+
return { label: "closed", variant: "success" };
|
|
57
|
+
}
|
|
58
|
+
return { label: "open", variant: "info" };
|
|
59
|
+
}
|
|
60
|
+
export default function IssueCard(props) {
|
|
61
|
+
const issue = props.preview
|
|
62
|
+
? previewSample
|
|
63
|
+
: {
|
|
64
|
+
number: props.issue_number,
|
|
65
|
+
title: props.title || `Issue #${props.issue_number}`,
|
|
66
|
+
state: props.state || "open",
|
|
67
|
+
state_reason: props.state_reason || null,
|
|
68
|
+
user: {
|
|
69
|
+
login: props.user_login || "",
|
|
70
|
+
avatar_url: props.user_avatar_url || "",
|
|
71
|
+
},
|
|
72
|
+
assignees: (props.assignees || "")
|
|
73
|
+
.split(",")
|
|
74
|
+
.map((s) => s.trim())
|
|
75
|
+
.filter(Boolean)
|
|
76
|
+
.map((login) => ({ login, avatar_url: "" })),
|
|
77
|
+
labels: (props.labels || "")
|
|
78
|
+
.split(",")
|
|
79
|
+
.map((s) => s.trim())
|
|
80
|
+
.filter(Boolean)
|
|
81
|
+
.map((name) => ({ name, color: defaultLabelColor(name) })),
|
|
82
|
+
comments: typeof props.comments === "number" ? props.comments : 0,
|
|
83
|
+
html_url: `https://github.com/${props.repo}/issues/${props.issue_number}`,
|
|
84
|
+
};
|
|
85
|
+
const pill = pillForState(issue);
|
|
86
|
+
const url = issue.html_url;
|
|
87
|
+
const repo = props.repo;
|
|
88
|
+
return (<Card>
|
|
89
|
+
<CardHeader vendor={githubVendor} title={repo} subtitle={`#${issue.number} · ${issue.title}`} status={{ label: pill.label, variant: pill.variant === "info" ? "active" : pill.variant === "success" ? "live" : "muted" }} action={{ label: "View on GitHub", href: url }}/>
|
|
90
|
+
<div className="px-3 py-3 flex flex-col gap-3">
|
|
91
|
+
<div className="flex items-center gap-2 text-xs text-text-muted">
|
|
92
|
+
<Avatar src={issue.user.avatar_url} name={issue.user.login} size={16}/>
|
|
93
|
+
<span className="text-text">{issue.user.login}</span>
|
|
94
|
+
<span className="text-text-dim">opened this issue</span>
|
|
95
|
+
<span className="ml-auto inline-flex items-center gap-1">
|
|
96
|
+
<MessageCircle className="w-3.5 h-3.5 text-text-dim"/>
|
|
97
|
+
<span className="text-text-muted">{issue.comments}</span>
|
|
98
|
+
</span>
|
|
99
|
+
</div>
|
|
100
|
+
<DataList items={[
|
|
101
|
+
{ label: "Status", value: <StatusPill variant={pill.variant}>{pill.label}</StatusPill> },
|
|
102
|
+
...(issue.labels && issue.labels.length > 0
|
|
103
|
+
? [
|
|
104
|
+
{
|
|
105
|
+
label: "Labels",
|
|
106
|
+
value: (<span className="flex flex-wrap gap-1">
|
|
107
|
+
{issue.labels.map((l) => (<span key={l.name} className="px-1.5 py-0.5 rounded text-[11px] font-medium" style={{ backgroundColor: `#${l.color}33`, color: `#${l.color}` }}>
|
|
108
|
+
{l.name}
|
|
109
|
+
</span>))}
|
|
110
|
+
</span>),
|
|
111
|
+
},
|
|
112
|
+
]
|
|
113
|
+
: []),
|
|
114
|
+
...(issue.assignees && issue.assignees.length > 0
|
|
115
|
+
? [
|
|
116
|
+
{
|
|
117
|
+
label: "Assignees",
|
|
118
|
+
value: (<span className="inline-flex items-center gap-1">
|
|
119
|
+
{issue.assignees.map((a) => (<span key={a.login} className="inline-flex items-center gap-1 text-xs text-text">
|
|
120
|
+
<Avatar src={a.avatar_url} name={a.login} size={12}/>
|
|
121
|
+
{a.login}
|
|
122
|
+
</span>))}
|
|
123
|
+
</span>),
|
|
124
|
+
},
|
|
125
|
+
]
|
|
126
|
+
: []),
|
|
127
|
+
]}/>
|
|
128
|
+
</div>
|
|
129
|
+
</Card>);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=IssueCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IssueCard.js","sourceRoot":"","sources":["../../../src/ui/github/IssueCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{forwardRef as h,createElement as d}from"react";var $=(...B)=>B.filter((G,O,T)=>{return Boolean(G)&&G.trim()!==""&&T.indexOf(G)===O}).join(" ").trim();var K=(B)=>B.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var E=(B)=>B.replace(/^([A-Z])|[\s-_]+(\w)/g,(G,O,T)=>T?T.toUpperCase():O.toLowerCase());var V=(B)=>{let G=E(B);return G.charAt(0).toUpperCase()+G.slice(1)};import{forwardRef as w,createElement as U}from"react";var D={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var _=(B)=>{for(let G in B)if(G.startsWith("aria-")||G==="role"||G==="title")return!0;return!1};import{createContext as x,useContext as f,useMemo as QB,createElement as TB}from"react";var g=x({});var I=()=>f(g);var R=w(({color:B,size:G,strokeWidth:O,absoluteStrokeWidth:T,className:X="",children:J,iconNode:W,...q},L)=>{let{size:H=24,strokeWidth:F=2,absoluteStrokeWidth:N=!1,color:z="currentColor",className:v=""}=I()??{},C=T??N?Number(O??F)*24/Number(G??H):O??F;return U("svg",{ref:L,...D,width:G??H??D.width,height:G??H??D.height,stroke:B??z,strokeWidth:C,className:$("lucide",v,X),...!J&&!_(q)&&{"aria-hidden":"true"},...q},[...W.map(([k,b])=>U(k,b)),...Array.isArray(J)?J:[J]])});var A=(B,G)=>{let O=h(({className:T,...X},J)=>d(R,{ref:J,iconNode:G,className:$(`lucide-${K(V(B))}`,`lucide-${B}`,T),...X}));return O.displayName=V(B),O};var u=[["path",{d:"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",key:"1sd12s"}]],Y=A("message-circle",u);import{Card as l,CardHeader as j,StatusPill as a,Avatar as S,DataList as m}from"@apteva/ui-kit";import{jsx as M}from"react/jsx-runtime";var p=M("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"currentColor","aria-hidden":!0,children:M("path",{d:"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.807 1.305 3.492.998.108-.776.42-1.305.762-1.604-2.665-.305-5.466-1.334-5.466-5.93 0-1.31.467-2.38 1.235-3.22-.135-.303-.54-1.524.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.652.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.435.375.81 1.102.81 2.222 0 1.605-.015 2.898-.015 3.293 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"})});var P={name:"GitHub",logo:p,color:"#8957e5"};import{jsx as Q,jsxs as Z}from"react/jsx-runtime";var r={number:1234,title:"Retry tier escalation skips dunning step on past-due renewals",state:"open",state_reason:null,user:{login:"maya",avatar_url:"data:image/svg+xml;utf8,"+encodeURIComponent("<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%23a78bfa'/></svg>")},assignees:[{login:"ari",avatar_url:"data:image/svg+xml;utf8,"+encodeURIComponent("<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%2334d399'/></svg>")}],labels:[{name:"billing",color:"1f6feb"},{name:"bug",color:"d73a4a"}],comments:7,html_url:"https://github.com/acme/api/issues/1234"},y=["1f6feb","8957e5","d73a4a","fbca04","0e8a16","5319e7","b60205","0075ca"];function t(B){let G=0;for(let O=0;O<B.length;O++)G=G*31+B.charCodeAt(O)>>>0;return y[G%y.length]}function n(B){if(B.state==="closed"){if(B.state_reason==="not_planned")return{label:"closed (not planned)",variant:"neutral"};return{label:"closed",variant:"success"}}return{label:"open",variant:"info"}}function c(B){let G=B.preview?r:{number:B.issue_number,title:B.title||`Issue #${B.issue_number}`,state:B.state||"open",state_reason:B.state_reason||null,user:{login:B.user_login||"",avatar_url:B.user_avatar_url||""},assignees:(B.assignees||"").split(",").map((J)=>J.trim()).filter(Boolean).map((J)=>({login:J,avatar_url:""})),labels:(B.labels||"").split(",").map((J)=>J.trim()).filter(Boolean).map((J)=>({name:J,color:t(J)})),comments:typeof B.comments==="number"?B.comments:0,html_url:`https://github.com/${B.repo}/issues/${B.issue_number}`},O=n(G),T=G.html_url,X=B.repo;return Z(l,{children:[Q(j,{vendor:P,title:X,subtitle:`#${G.number} · ${G.title}`,status:{label:O.label,variant:O.variant==="info"?"active":O.variant==="success"?"live":"muted"},action:{label:"View on GitHub",href:T}}),Z("div",{className:"px-3 py-3 flex flex-col gap-3",children:[Z("div",{className:"flex items-center gap-2 text-xs text-text-muted",children:[Q(S,{src:G.user.avatar_url,name:G.user.login,size:16}),Q("span",{className:"text-text",children:G.user.login}),Q("span",{className:"text-text-dim",children:"opened this issue"}),Z("span",{className:"ml-auto inline-flex items-center gap-1",children:[Q(Y,{className:"w-3.5 h-3.5 text-text-dim"}),Q("span",{className:"text-text-muted",children:G.comments})]})]}),Q(m,{items:[{label:"Status",value:Q(a,{variant:O.variant,children:O.label})},...G.labels&&G.labels.length>0?[{label:"Labels",value:Q("span",{className:"flex flex-wrap gap-1",children:G.labels.map((J)=>Q("span",{className:"px-1.5 py-0.5 rounded text-[11px] font-medium",style:{backgroundColor:`#${J.color}33`,color:`#${J.color}`},children:J.name},J.name))})}]:[],...G.assignees&&G.assignees.length>0?[{label:"Assignees",value:Q("span",{className:"inline-flex items-center gap-1",children:G.assignees.map((J)=>Z("span",{className:"inline-flex items-center gap-1 text-xs text-text",children:[Q(S,{src:J.avatar_url,name:J.login,size:12}),J.login]},J.login))})}]:[]]})]})]})}export{c as default};
|
|
2
|
+
|
|
3
|
+
//# debugId=6BE16BA338AFB67664756E2164756E21
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../node_modules/lucide-react/dist/esm/createLucideIcon.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs", "../../../node_modules/lucide-react/dist/esm/Icon.mjs", "../../../node_modules/lucide-react/dist/esm/defaultAttributes.mjs", "../../../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs", "../../../node_modules/lucide-react/dist/esm/context.mjs", "../../../node_modules/lucide-react/dist/esm/icons/message-circle.mjs", "../../../src/ui/github/IssueCard.tsx", "../../../src/ui/github/lib/github.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n",
|
|
6
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n",
|
|
7
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n",
|
|
8
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n",
|
|
9
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n",
|
|
10
|
+
"\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n",
|
|
11
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n",
|
|
12
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n",
|
|
13
|
+
"\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n",
|
|
14
|
+
"/**\n * @license lucide-react v1.14.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\",\n key: \"1sd12s\"\n }\n ]\n];\nconst MessageCircle = createLucideIcon(\"message-circle\", __iconNode);\n\nexport { __iconNode, MessageCircle as default };\n//# sourceMappingURL=message-circle.mjs.map\n",
|
|
15
|
+
"// IssueCard — chat-attachment card for a single GitHub issue.\n//\n// The agent calls\n// respond(components=[{ app: \"github\", name: \"issue-card\", props:{...}}])\n// and this card mounts under the agent's message bubble.\n//\n// v1 renders from inline props — the agent passes what it just got\n// back from the github get_issue tool. A future revision can add a\n// component-side fetch path so the card live-updates without the\n// agent having to re-render. Until that exists, props ARE the\n// source of truth.\n//\n// Visuals are entirely composed from @apteva/ui-kit primitives so the\n// card looks like every other chat-attachment in the platform.\n\nimport { MessageCircle } from \"lucide-react\";\nimport { Card, CardHeader, StatusPill, Avatar, DataList } from \"@apteva/ui-kit\";\nimport { githubVendor } from \"./lib/github\";\n\ninterface User {\n login: string;\n avatar_url: string;\n}\n\ninterface Label {\n name: string;\n color: string;\n}\n\ninterface Issue {\n number: number;\n title: string;\n state: \"open\" |\"closed\";\n state_reason?:\"completed\" |\"not_planned\" |\"reopened\" | null;\n user: User;\n assignees?: User[];\n labels?: Label[];\n comments: number;\n html_url: string;\n body?: string | null;\n}\n\ninterface Props {\n /**\"owner/name\" — required. */\n repo: string;\n /** GitHub issue number (#NN), required. */\n issue_number: number;\n /** Issue title — agent passes from get_issue response. */\n title?: string;\n /** Issue state —\"open\" or\"closed\". */\n state?:\"open\" |\"closed\";\n state_reason?:\"completed\" |\"not_planned\" |\"reopened\" | null;\n /** Author login (the user who opened the issue). */\n user_login?: string;\n /** Author avatar URL. */\n user_avatar_url?: string;\n /** Comma-separated label names. Optional convenience for terse\n * agent calls; richer apps can pass `labels` directly. */\n labels?: string;\n /** Comma-separated assignee logins. */\n assignees?: string;\n /** Comments count. */\n comments?: number;\n /** Soft preview convention — render synthetic data when no real\n * data is available so the dashboard's app detail panel can show\n * what the card looks like even before the user creates a\n * connection. */\n preview?: boolean;\n /** Injected by the host (unused in v1, here for the future fetch\n * path). */\n projectId?: string;\n}\n\nconst previewSample: Issue = {\n number: 1234,\n title: \"Retry tier escalation skips dunning step on past-due renewals\",\n state: \"open\",\n state_reason: null,\n user: {\n login: \"maya\",\n avatar_url: \"data:image/svg+xml;utf8,\" +\n encodeURIComponent(\"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%23a78bfa'/></svg>\",\n ),\n },\n assignees: [\n {\n login: \"ari\",\n avatar_url: \"data:image/svg+xml;utf8,\" +\n encodeURIComponent(\"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%2334d399'/></svg>\",\n ),\n },\n ],\n labels: [\n { name: \"billing\", color: \"1f6feb\" },\n { name: \"bug\", color: \"d73a4a\" },\n ],\n comments: 7,\n html_url: \"https://github.com/acme/api/issues/1234\",\n};\n\n// Stable color palette for labels we don't get a hex from. Hashes\n// the label name into one of a small fixed set so the same label\n// always renders the same color across cards.\nconst labelPalette = [\"1f6feb\",\"8957e5\",\"d73a4a\",\"fbca04\",\"0e8a16\",\"5319e7\",\"b60205\",\"0075ca\"];\nfunction defaultLabelColor(name: string): string {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) >>> 0;\n return labelPalette[h % labelPalette.length];\n}\n\nfunction pillForState(issue: Issue): { label: string; variant:\"success\" |\"info\" |\"error\" |\"neutral\" } {\n if (issue.state === \"closed\") {\n if (issue.state_reason === \"not_planned\") return { label: \"closed (not planned)\", variant: \"neutral\" };\n return { label: \"closed\", variant: \"success\" };\n }\n return { label: \"open\", variant: \"info\" };\n}\n\nexport default function IssueCard(props: Props) {\n const issue: Issue = props.preview\n ? previewSample\n : {\n number: props.issue_number,\n title: props.title || `Issue #${props.issue_number}`,\n state: props.state || \"open\",\n state_reason: props.state_reason || null,\n user: {\n login: props.user_login || \"\",\n avatar_url: props.user_avatar_url || \"\",\n },\n assignees: (props.assignees || \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n .map((login) => ({ login, avatar_url: \"\" })),\n labels: (props.labels || \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n .map((name) => ({ name, color: defaultLabelColor(name) })),\n comments: typeof props.comments === \"number\" ? props.comments : 0,\n html_url: `https://github.com/${props.repo}/issues/${props.issue_number}`,\n };\n\n const pill = pillForState(issue);\n const url = issue.html_url;\n const repo = props.repo;\n\n return (\n <Card>\n <CardHeader\n vendor={githubVendor}\n title={repo}\n subtitle={`#${issue.number} · ${issue.title}`}\n status={{ label: pill.label, variant: pill.variant === \"info\" ? \"active\" : pill.variant === \"success\" ? \"live\" :\"muted\" }}\n action={{ label: \"View on GitHub\", href: url }}\n />\n <div className=\"px-3 py-3 flex flex-col gap-3\">\n <div className=\"flex items-center gap-2 text-xs text-text-muted\">\n <Avatar src={issue.user.avatar_url} name={issue.user.login} size={16} />\n <span className=\"text-text\">{issue.user.login}</span>\n <span className=\"text-text-dim\">opened this issue</span>\n <span className=\"ml-auto inline-flex items-center gap-1\">\n <MessageCircle className=\"w-3.5 h-3.5 text-text-dim\" />\n <span className=\"text-text-muted\">{issue.comments}</span>\n </span>\n </div>\n <DataList\n items={[\n { label: \"Status\", value: <StatusPill variant={pill.variant}>{pill.label}</StatusPill> },\n ...(issue.labels && issue.labels.length > 0\n ? [\n {\n label: \"Labels\",\n value: (\n <span className=\"flex flex-wrap gap-1\">\n {issue.labels.map((l) => (\n <span\n key={l.name}\n className=\"px-1.5 py-0.5 rounded text-[11px] font-medium\"\n style={{ backgroundColor: `#${l.color}33`, color: `#${l.color}` }}\n >\n {l.name}\n </span>\n ))}\n </span>\n ),\n },\n ]\n : []),\n ...(issue.assignees && issue.assignees.length > 0\n ? [\n {\n label: \"Assignees\",\n value: (\n <span className=\"inline-flex items-center gap-1\">\n {issue.assignees.map((a) => (\n <span key={a.login} className=\"inline-flex items-center gap-1 text-xs text-text\">\n <Avatar src={a.avatar_url} name={a.login} size={12} />\n {a.login}\n </span>\n ))}\n </span>\n ),\n },\n ]\n : []),\n ]}\n />\n </div>\n </Card>\n );\n}\n",
|
|
16
|
+
"// Shared helpers for every GitHub UI component.\n//\n// * githubVendor — CardHeader brand pill (logo + name + color)\n// * URL builders — repo, issue, PR, commit, workflow run, branch\n// * formatters — relative time, short sha, file-stat string\n// * status mappers — PR state → StatusPill variant, run conclusion\n// → StatusDot variant, etc.\n//\n// Mirrors the lib/hubspot.tsx pattern so any vendor lib has the\n// same shape (logo + vendor + URL helpers + status mappers + time\n// helpers).\n\nimport type { ReactNode } from \"react\";\nimport type { CardVendor, StatusDotVariant, StatusPillVariant } from \"@apteva/ui-kit\";\n\n// ─── Brand mark ───────────────────────────────────────────────────\n//\n// Octocat outline. currentColor so CardHeader's vendor pill can\n// recolor it via inline `style.color`.\n\nexport const githubLogo: ReactNode = (\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.807 1.305 3.492.998.108-.776.42-1.305.762-1.604-2.665-.305-5.466-1.334-5.466-5.93 0-1.31.467-2.38 1.235-3.22-.135-.303-.54-1.524.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.652.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.435.375.81 1.102.81 2.222 0 1.605-.015 2.898-.015 3.293 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n);\n\n// GitHub Mona Purple — secondary brand color, used in the vendor\n// pill and any GitHub-specific accents. Distinct from HubSpot orange\n// so two cards from different vendors read as different upstreams at\n// a glance.\nexport const GITHUB_BRAND_COLOR = \"#8957e5\";\n\nexport const githubVendor: CardVendor = {\n name: \"GitHub\",\n logo: githubLogo,\n color: GITHUB_BRAND_COLOR,\n};\n\n// ─── URL builders ─────────────────────────────────────────────────\n\nexport function repoUrl(repo: string): string {\n return `https://github.com/${repo}`;\n}\nexport function issueUrl(repo: string, number: number | string): string {\n return `https://github.com/${repo}/issues/${number}`;\n}\nexport function pullRequestUrl(repo: string, number: number | string): string {\n return `https://github.com/${repo}/pull/${number}`;\n}\nexport function commitUrl(repo: string, sha: string): string {\n return `https://github.com/${repo}/commit/${sha}`;\n}\nexport function workflowRunUrl(repo: string, run_id: number | string): string {\n return `https://github.com/${repo}/actions/runs/${run_id}`;\n}\nexport function branchUrl(repo: string, branch: string): string {\n return `https://github.com/${repo}/tree/${encodeURIComponent(branch)}`;\n}\nexport function userUrl(login: string): string {\n return `https://github.com/${login}`;\n}\n\n// ─── Formatters ───────────────────────────────────────────────────\n\n/** \"3d ago\" / \"12m ago\" / \"just now\" — coarse human-readable delta. */\nexport function timeAgo(iso?: string): string {\n if (!iso) return \"\";\n const t = new Date(iso).getTime();\n if (!Number.isFinite(t)) return \"\";\n const s = Math.max(0, (Date.now() - t) / 1000);\n if (s < 60) return \"just now\";\n const m = s / 60; if (m < 60) return `${Math.round(m)}m ago`;\n const h = m / 60; if (h < 24) return `${Math.round(h)}h ago`;\n const d = h / 24; if (d < 30) return `${Math.round(d)}d ago`;\n const mo = d / 30; if (mo < 12) return `${Math.round(mo)}mo ago`;\n return `${Math.round(mo / 12)}y ago`;\n}\n\n/** Coerce ISO durations to mm:ss / hh:mm:ss. Used for run/job times. */\nexport function formatDuration(ms?: number): string {\n if (!ms || ms < 0) return \"—\";\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const rs = s % 60;\n if (m < 60) return rs ? `${m}m ${rs}s` : `${m}m`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\n/** \"abc1234\" — 7-char short sha. Tolerates already-short input. */\nexport function shortSha(sha?: string): string {\n if (!sha) return \"\";\n return sha.length > 7 ? sha.slice(0, 7) : sha;\n}\n\n/** Test fixture helper — same shape as lib/hubspot's minusHoursISO. */\nexport function minusHoursISO(h: number): string {\n return new Date(Date.now() - h * 60 * 60 * 1000).toISOString();\n}\n\n// ─── Status mappers ───────────────────────────────────────────────\n\n/** PR state → StatusPill variant + label. */\nexport function pullRequestState(opts: {\n state?: \"open\" | \"closed\";\n merged?: boolean;\n draft?: boolean;\n}): { label: string; variant: StatusPillVariant; dot: StatusDotVariant } {\n if (opts.merged) return { label: \"merged\", variant: \"success\", dot: \"live\" };\n if (opts.state === \"closed\") return { label: \"closed\", variant: \"error\", dot: \"error\" };\n if (opts.draft) return { label: \"draft\", variant: \"neutral\", dot: \"muted\" };\n return { label: \"open\", variant: \"info\", dot: \"active\" };\n}\n\n/** Workflow-run status + conclusion → label/variant pair. */\nexport function runState(opts: {\n status?: string; // queued | in_progress | completed\n conclusion?: string; // success | failure | cancelled | skipped | neutral | timed_out\n}): { label: string; variant: StatusPillVariant; dot: StatusDotVariant } {\n if (opts.status === \"in_progress\") return { label: \"running\", variant: \"info\", dot: \"active\" };\n if (opts.status === \"queued\") return { label: \"queued\", variant: \"neutral\", dot: \"muted\" };\n switch (opts.conclusion) {\n case \"success\": return { label: \"success\", variant: \"success\", dot: \"live\" };\n case \"failure\": return { label: \"failed\", variant: \"error\", dot: \"error\" };\n case \"cancelled\": return { label: \"cancelled\", variant: \"neutral\", dot: \"muted\" };\n case \"skipped\": return { label: \"skipped\", variant: \"neutral\", dot: \"muted\" };\n case \"timed_out\": return { label: \"timed out\", variant: \"warn\", dot: \"warn\" };\n case \"neutral\": return { label: \"neutral\", variant: \"neutral\", dot: \"muted\" };\n default: return { label: \"—\", variant: \"neutral\", dot: \"muted\" };\n }\n}\n\n/** Job conclusion → small dot variant for inline lists. */\nexport function jobDot(conclusion?: string, status?: string): StatusDotVariant {\n if (status === \"in_progress\") return \"active\";\n if (status === \"queued\") return \"muted\";\n switch (conclusion) {\n case \"success\": return \"live\";\n case \"failure\": return \"error\";\n case \"cancelled\": return \"muted\";\n case \"skipped\": return \"muted\";\n case \"timed_out\": return \"warn\";\n default: return \"muted\";\n }\n}\n\n// ─── Mini avatar fallback (data URL) ──────────────────────────────\n//\n// IssueCard's preview avatars used inline data:image/svg+xml URLs so\n// the explorer doesn't depend on network requests. Same helper\n// reused across cards' preview samples.\n\nexport function avatarDataUrl(hexFill: string): string {\n return (\n \"data:image/svg+xml;utf8,\" +\n encodeURIComponent(\n `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><circle cx='8' cy='8' r='8' fill='%23${hexFill}'/></svg>`,\n )\n );\n}\n"
|
|
17
|
+
],
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "6BE16BA338AFB67664756E2164756E21",
|
|
20
|
+
"names": []
|
|
21
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/**"owner/name" — required. */
|
|
3
|
+
repo: string;
|
|
4
|
+
/** Pull-request number, required. */
|
|
5
|
+
pr_number: number;
|
|
6
|
+
title?: string;
|
|
7
|
+
state?: "open" | "closed";
|
|
8
|
+
/** GitHub returns merged separately on closed PRs. */
|
|
9
|
+
merged?: boolean;
|
|
10
|
+
/** Draft PRs don't get the"open" treatment. */
|
|
11
|
+
draft?: boolean;
|
|
12
|
+
user_login?: string;
|
|
13
|
+
user_avatar_url?: string;
|
|
14
|
+
/** Comma-separated reviewer logins — terse agent calls. */
|
|
15
|
+
reviewers?: string;
|
|
16
|
+
/** Approval count (0+). */
|
|
17
|
+
approvals?: number;
|
|
18
|
+
/** Changes-requested count (0+). */
|
|
19
|
+
changes_requested?: number;
|
|
20
|
+
/** Comma-separated label names. */
|
|
21
|
+
labels?: string;
|
|
22
|
+
comments?: number;
|
|
23
|
+
additions?: number;
|
|
24
|
+
deletions?: number;
|
|
25
|
+
changed_files?: number;
|
|
26
|
+
head_ref?: string;
|
|
27
|
+
base_ref?: string;
|
|
28
|
+
/** Mergeable state from GitHub. */
|
|
29
|
+
mergeable?: "mergeable" | "conflicting" | "unknown" | "draft";
|
|
30
|
+
created_at?: string;
|
|
31
|
+
preview?: boolean;
|
|
32
|
+
projectId?: string;
|
|
33
|
+
}
|
|
34
|
+
export default function PullRequestCard(props: Props): import("react").JSX.Element;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=PullRequestCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PullRequestCard.d.ts","sourceRoot":"","sources":["../../../src/ui/github/PullRequestCard.tsx"],"names":[],"mappings":"AAoBA,UAAU,KAAK;IACd,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAC,MAAM,GAAE,QAAQ,CAAC;IACxB,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,SAAS,CAAC,EAAC,WAAW,GAAE,aAAa,GAAE,SAAS,GAAE,OAAO,CAAC;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAgCD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,KAAK,+BAmInD"}
|