@nuxtagentic/integrations 0.0.0-stage → 0.1.1
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/LICENSE.md +9 -0
- package/README.md +175 -2
- package/client.ts +124 -0
- package/module.ts +44 -0
- package/package.json +52 -3
- package/runtime/assets/logos/discord.svg +1 -0
- package/runtime/assets/logos/github.svg +1 -0
- package/runtime/assets/logos/gmail.svg +1 -0
- package/runtime/assets/logos/googleads.svg +1 -0
- package/runtime/assets/logos/googleanalytics.svg +1 -0
- package/runtime/assets/logos/googlecalendar.svg +1 -0
- package/runtime/assets/logos/googledrive.svg +1 -0
- package/runtime/assets/logos/googlesearchconsole.svg +1 -0
- package/runtime/assets/logos/hubspot.svg +1 -0
- package/runtime/assets/logos/intercom.svg +1 -0
- package/runtime/assets/logos/linear.svg +1 -0
- package/runtime/assets/logos/mcp.svg +1 -0
- package/runtime/assets/logos/meta.svg +1 -0
- package/runtime/assets/logos/notion.svg +1 -0
- package/runtime/assets/logos/reddit.svg +1 -0
- package/runtime/assets/logos/sentry.svg +1 -0
- package/runtime/assets/logos/shopify.svg +1 -0
- package/runtime/assets/logos/slack.svg +1 -0
- package/runtime/assets/logos/stripe.svg +1 -0
- package/runtime/assets/logos/tiktok-dark.svg +1 -0
- package/runtime/assets/logos/tiktok.svg +1 -0
- package/runtime/assets/logos/vercel.svg +1 -0
- package/runtime/assets/logos/x.svg +1 -0
- package/runtime/components/IntegrationCard.vue +82 -0
- package/runtime/components/IntegrationCatalog.vue +130 -0
- package/runtime/components/IntegrationConnectionPanel.vue +589 -0
- package/runtime/components/IntegrationLogo.vue +41 -0
- package/runtime/pages/integrations.vue +481 -0
- package/runtime/server/api/integrations/approvals/[id].post.ts +69 -0
- package/runtime/server/api/integrations/catalog/[provider]/action.post.ts +35 -0
- package/runtime/server/api/integrations/catalog/[provider]/connection.post.ts +242 -0
- package/runtime/server/api/integrations/catalog/[provider]/tools.get.ts +40 -0
- package/runtime/server/api/integrations/catalog/index.get.ts +48 -0
- package/runtime/server/api/integrations/catalog/tools.get.ts +27 -0
- package/runtime/server/plugins/connect-maintenance.ts +30 -0
- package/runtime/server/utils/approval-continuation.ts +37 -0
- package/runtime/server/utils/google-mcp.ts +296 -0
- package/runtime/server/utils/integration-adapters.ts +836 -0
- package/runtime/server/utils/integration-context.ts +510 -0
- package/runtime/server/utils/integration-crypto.ts +13 -0
- package/runtime/server/utils/request-body.ts +38 -0
- package/runtime/shared/agent.ts +14 -0
- package/runtime/shared/catalog.ts +566 -0
- package/runtime/shared/google-mcp.ts +8 -0
- package/runtime/workspace.ts +15 -0
- package/schema.ts +179 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Proprietary software. All rights reserved.
|
|
2
|
+
|
|
3
|
+
Use of Nuxt Agentic packages and starter materials is governed by the applicable
|
|
4
|
+
commercial agreement supplied with a purchase. This repository does not grant
|
|
5
|
+
an open-source license or permission to redistribute the packages as a competing
|
|
6
|
+
template or module library.
|
|
7
|
+
|
|
8
|
+
Third-party dependencies retain their respective licenses. This notice does not
|
|
9
|
+
replace or modify those licenses.
|
package/README.md
CHANGED
|
@@ -1,3 +1,176 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Integrations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Integrations** is a core feature, always available from the dashboard sidebar at
|
|
4
|
+
`/dashboard/integrations`. Search the catalog, connect an account and select the actions
|
|
5
|
+
agents may use. No accounts are connected automatically.
|
|
6
|
+
|
|
7
|
+
Connections run on [CloudConfig Connect](https://cloudconfig.dev/docs/connect). An
|
|
8
|
+
integration connects in one of three ways, offered in this order:
|
|
9
|
+
|
|
10
|
+
- **OAuth** with your registered provider app: `pnpm exec cloudconfig connect add github`
|
|
11
|
+
guides registration, prints callback and webhook URLs, and saves the credentials you supply.
|
|
12
|
+
- **Hosted MCP servers** (Linear, Notion, Sentry, Stripe, or any URL): compatible servers
|
|
13
|
+
support sign-in without manual app registration. Their tools become the actions; tools not marked
|
|
14
|
+
read-only ask for approval by default.
|
|
15
|
+
- **A pasted API token**, for providers without OAuth here and as the fallback while an
|
|
16
|
+
OAuth app is not registered yet.
|
|
17
|
+
|
|
18
|
+
Google integrations (Gmail, Calendar, Drive, Analytics, Search Console, Ads) use their own
|
|
19
|
+
Google grant, separate from Google sign-in, so the mailbox an agent reads need not be the
|
|
20
|
+
account someone signs in with. Google Ads also reads the app's
|
|
21
|
+
`NUXT_GOOGLE_ADS_DEVELOPER_TOKEN`; the customer ID is a per-connection setting.
|
|
22
|
+
|
|
23
|
+
## Google-hosted MCP tools
|
|
24
|
+
|
|
25
|
+
Set `NUXT_GOOGLE_MCP_ENABLED=true` to use Google's hosted MCP servers for compatible
|
|
26
|
+
Calendar, Gmail draft, and Drive actions. The default is `false` while these servers
|
|
27
|
+
require Google Workspace Developer Preview access. This reuses the Google account
|
|
28
|
+
already connected through CloudConfig Connect and the same `CONNECT_GOOGLE_CLIENT_ID`
|
|
29
|
+
and `CONNECT_GOOGLE_CLIENT_SECRET`. It does not use the application's Google sign-in
|
|
30
|
+
session or require a second account grant.
|
|
31
|
+
|
|
32
|
+
Before enabling the setting:
|
|
33
|
+
|
|
34
|
+
1. Join the [Google Workspace Developer Preview Program](https://developers.google.com/workspace/preview).
|
|
35
|
+
2. Enable Calendar, Gmail, and Drive APIs and their MCP services in the OAuth app's
|
|
36
|
+
Google Cloud project (`calendarmcp.googleapis.com`, `gmailmcp.googleapis.com`, and
|
|
37
|
+
`drivemcp.googleapis.com`). Register the existing `/api/connect/google/callback`
|
|
38
|
+
URL and configure the OAuth client for an AI-powered agent.
|
|
39
|
+
3. Keep the scopes declared in `cloud.config.ts`: `calendar.events` authorizes event
|
|
40
|
+
creation, `gmail.modify` covers drafts and REST email actions, and `drive.file`
|
|
41
|
+
limits file access to the grant. MCP does not bypass consent or Google verification.
|
|
42
|
+
4. Configure [Google's required content screening](https://developers.google.com/workspace/guides/configure-mcp-security),
|
|
43
|
+
for example Model Armor floor settings that screen MCP calls and responses in
|
|
44
|
+
the project. A custom screening solution must be documented as Google requires.
|
|
45
|
+
5. Set the environment variable and restart or deploy the application. The host's
|
|
46
|
+
`deploy.optionalSecrets` includes this setting.
|
|
47
|
+
|
|
48
|
+
The source config explicitly allows only Google's three MCP endpoint URLs to receive
|
|
49
|
+
Google account tokens. The pinned CloudConfig version receives this capability through
|
|
50
|
+
the starter's `patches/@cloudconfig__core@0.2.0-beta.2.patch`. Keep the patch and
|
|
51
|
+
its `pnpm-workspace.yaml` registration when customizing or upgrading the starter.
|
|
52
|
+
|
|
53
|
+
Existing agent tool names, action parameters, connection permissions, and automation
|
|
54
|
+
definitions remain valid. Compatible requests use `list_events`, `create_event`,
|
|
55
|
+
`create_draft`, `search_files`, or `create_file`. Calendar event lists and Drive file
|
|
56
|
+
metadata are normalized to the existing field names. With MCP enabled, Calendar event
|
|
57
|
+
creation, Gmail drafts, and Drive file creation require owner approval before execution.
|
|
58
|
+
|
|
59
|
+
REST remains available for Gmail reads and sends, thread-linked drafts, Drive moves,
|
|
60
|
+
Analytics, Ads, Search Console, API-key connections, and requests whose options the MCP
|
|
61
|
+
tools cannot represent faithfully. Calendar attendees/all-day events, advanced queries,
|
|
62
|
+
and binary file metadata creation also retain their REST behavior. An MCP authorization,
|
|
63
|
+
service, or tool error is reported directly; an action is never retried through REST
|
|
64
|
+
after an MCP failure. Scheduled monitors and event triggers remain application code.
|
|
65
|
+
An MCP permission or service rejection does not disable the shared Google grant
|
|
66
|
+
used by REST actions. Authentication failures retry once with a refreshed token.
|
|
67
|
+
|
|
68
|
+
See Google's [Calendar](https://developers.google.com/workspace/calendar/api/guides/configure-mcp-server),
|
|
69
|
+
[Gmail](https://developers.google.com/workspace/gmail/api/guides/configure-mcp-server), and
|
|
70
|
+
[Drive](https://developers.google.com/workspace/drive/api/guides/configure-mcp-server) setup guides.
|
|
71
|
+
|
|
72
|
+
## Who a connection belongs to
|
|
73
|
+
|
|
74
|
+
- **Just me** — agents and automations act as the person who connected it, and only
|
|
75
|
+
their own runs may use it.
|
|
76
|
+
- **Whole workspace** — added by an organization owner or admin and shared with every
|
|
77
|
+
member's runs. Prefer it for bots and installations (GitHub App, Slack): it keeps working
|
|
78
|
+
after the person who added it leaves.
|
|
79
|
+
|
|
80
|
+
An integration can have several accounts. The first keeps the plain tool names
|
|
81
|
+
(`github_open_and_label_issues`); further accounts add their id (`github_7_open_and_label_issues`).
|
|
82
|
+
Automations act as their owner, or — with **Acts as → Workspace only** — use only shared
|
|
83
|
+
connections. Runs re-check membership: when the owner leaves, their automations pause and
|
|
84
|
+
their personal connections are revoked at the vendor.
|
|
85
|
+
|
|
86
|
+
## Credential storage
|
|
87
|
+
|
|
88
|
+
Tokens and keys are sealed by Connect in this database under `CLOUDCONFIG_CONNECT_KEY`
|
|
89
|
+
and bound to their row; nothing here stores a token. Development creates
|
|
90
|
+
`.cloudconfig/connect.key`; production requires the key
|
|
91
|
+
(`pnpm exec cloudconfig connect key`). Rotate with `--rotate`; the Worker's cron refreshes
|
|
92
|
+
tokens ahead of expiry and re-seals after a rotation.
|
|
93
|
+
|
|
94
|
+
Connecting verifies the account with the provider before enabling it. Disconnecting
|
|
95
|
+
removes the integration and revokes the account at the vendor once nothing else uses
|
|
96
|
+
it. Every action reloads permissions and membership from the server; saving a tool in an
|
|
97
|
+
agent never grants additional permissions. Stripe refunds, Intercom reply drafts and MCP
|
|
98
|
+
tools marked **Ask first** create pending approvals. Review their parameters in the
|
|
99
|
+
Integrations page; **Approve** executes the action, while **Reject** leaves the provider
|
|
100
|
+
unchanged.
|
|
101
|
+
|
|
102
|
+
## Agent commands
|
|
103
|
+
|
|
104
|
+
Model records use the existing CloudConfig client and MCP tools. Runtime commands
|
|
105
|
+
are available separately; use an authenticated transport such as Nuxt's
|
|
106
|
+
`useRequestFetch()` so the account and active workspace remain attached:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import { createIntegrationCommands } from '@nuxtagentic/integrations/client'
|
|
110
|
+
|
|
111
|
+
const integrations = createIntegrationCommands(useRequestFetch())
|
|
112
|
+
const tools = await integrations.tools()
|
|
113
|
+
await integrations.action('github', 'open_and_label_issues', {
|
|
114
|
+
owner: 'your-company',
|
|
115
|
+
repo: 'internal-agent',
|
|
116
|
+
body: { title: 'Investigate this incident', body: 'Agent findings…', labels: ['triage'] },
|
|
117
|
+
})
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`tools()` returns the actual connected and permitted action names, JSON parameter
|
|
121
|
+
schemas, and the account each one acts through. Pass a connection id as the fourth
|
|
122
|
+
argument of `action()` to choose one of several accounts. The suggestions at the bottom of Agents → Tools add those
|
|
123
|
+
handlers to a saved agent. Automations executes only enabled tools with a connected
|
|
124
|
+
handler. Arbitrary custom declarations remain portable metadata; add a runtime
|
|
125
|
+
handler before executing them, or disable them.
|
|
126
|
+
|
|
127
|
+
Adapter inputs contain path parameters, optional `query` and write `body` fields.
|
|
128
|
+
API hosts, HTTP methods and GraphQL operations are owned by the server adapter;
|
|
129
|
+
agents cannot choose them. Provider-specific pagination and filters belong in
|
|
130
|
+
`query`. Write bodies use the provider's documented fields. Narrow actions restrict
|
|
131
|
+
their fields: pausing ads cannot edit creatives, updating a deal stage cannot edit
|
|
132
|
+
other contact properties, and moving Drive files cannot modify file metadata.
|
|
133
|
+
For Gmail, supply `messageId` to read a full message, or omit it to list messages.
|
|
134
|
+
Google Ads bid/budget updates use `resource: 'bid' | 'budget'` with update operations.
|
|
135
|
+
|
|
136
|
+
## Events
|
|
137
|
+
|
|
138
|
+
Vendor webhooks for GitHub (App), Slack, Shopify, HubSpot, Intercom and Notion arrive at
|
|
139
|
+
`/api/connect/hooks/<provider>` — the URL `cloudconfig connect add` prints. Connect verifies
|
|
140
|
+
the signature, and the event starts the automations of everyone who can see the
|
|
141
|
+
connection: its owner for a personal one, every member for a shared one.
|
|
142
|
+
|
|
143
|
+
For other senders, open a connection and choose **Event endpoint**. POST a normalized event
|
|
144
|
+
to `/api/integration-hooks/<id>`, authenticated with the connection's secret — as a bearer
|
|
145
|
+
token, as a GitHub repository webhook secret, or as Connect's `X-CloudConfig-Signature`:
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"event": "github.an_issue_is_created",
|
|
150
|
+
"id": "unique-provider-event-id",
|
|
151
|
+
"payload": { "issue": { "number": 42, "title": "Investigate an incident" } }
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Repeated event IDs reuse the existing run. Analytics thresholds, weekly reports and
|
|
156
|
+
upcoming calendar events require a monitor or scheduler to emit the corresponding event;
|
|
157
|
+
connecting an account does not create one. Agents can emit normalized events with the
|
|
158
|
+
Automations command helper.
|
|
159
|
+
|
|
160
|
+
## Add a provider
|
|
161
|
+
|
|
162
|
+
Keep its browser-safe definition in `runtime/shared/catalog.ts` — including `auth`
|
|
163
|
+
(a Connect OAuth provider and scopes, `apiKey`, or an MCP server) and `ownership` — and its
|
|
164
|
+
fixed endpoints, verification request and action restrictions in
|
|
165
|
+
`runtime/server/utils/integration-adapters.ts`. Enable the OAuth provider under
|
|
166
|
+
`connect.providers` in `cloud.config.ts`. Keep permissions explicit. New catalog entries do
|
|
167
|
+
not need new database tables; an MCP server needs only a catalog entry.
|
|
168
|
+
|
|
169
|
+
Add its brand SVG to `runtime/assets/logos/<logo>.svg`, matching the catalog's
|
|
170
|
+
`logo` key. The cards and connection dialogs share `runtime/components/IntegrationLogo.vue`
|
|
171
|
+
and preserve the SVG's colors. Logos are bundled locally from
|
|
172
|
+
[SVG Logos](https://github.com/gilbarbara/logos) and
|
|
173
|
+
[Simple Icons](https://github.com/simple-icons/simple-icons); Search Console uses
|
|
174
|
+
[Google's current logo](https://gstatic.com/search-console/scfe/logo_search_console.svg).
|
|
175
|
+
Monochrome marks use a light variant in dark mode; TikTok keeps its cyan and red
|
|
176
|
+
accents with a white center.
|
package/client.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { IntegrationDefinition, IntegrationScope } from './runtime/shared/catalog'
|
|
2
|
+
export type CommandRequest = <T>(
|
|
3
|
+
url: string,
|
|
4
|
+
options?: { method?: 'GET' | 'POST'; body?: Record<string, unknown> },
|
|
5
|
+
) => Promise<T>
|
|
6
|
+
export interface IntegrationConnection {
|
|
7
|
+
id: number
|
|
8
|
+
provider: string
|
|
9
|
+
account: string
|
|
10
|
+
label: string
|
|
11
|
+
scope: IntegrationScope
|
|
12
|
+
connectionId: number
|
|
13
|
+
enabled: boolean
|
|
14
|
+
permissions: string[]
|
|
15
|
+
approvals: string[]
|
|
16
|
+
settings: Record<string, string>
|
|
17
|
+
mine: boolean
|
|
18
|
+
canManage: boolean
|
|
19
|
+
status?: 'pending' | 'active' | 'error' | 'revoked'
|
|
20
|
+
statusMessage?: string
|
|
21
|
+
}
|
|
22
|
+
export interface IntegrationProvider {
|
|
23
|
+
id: string
|
|
24
|
+
label: string
|
|
25
|
+
configured: boolean
|
|
26
|
+
missing: string[]
|
|
27
|
+
allow: readonly IntegrationScope[]
|
|
28
|
+
startFields: readonly { key: string; label: string; placeholder?: string }[]
|
|
29
|
+
}
|
|
30
|
+
export interface PendingAccount {
|
|
31
|
+
id: number
|
|
32
|
+
provider: string
|
|
33
|
+
scope: IntegrationScope
|
|
34
|
+
account: { name: string }
|
|
35
|
+
targets?: { id: string; name: string; hint?: string }[]
|
|
36
|
+
}
|
|
37
|
+
export interface IntegrationTool {
|
|
38
|
+
provider: string
|
|
39
|
+
action: string
|
|
40
|
+
name: string
|
|
41
|
+
description: string
|
|
42
|
+
parameters: Record<string, unknown>
|
|
43
|
+
approvalRequired: boolean
|
|
44
|
+
account: string
|
|
45
|
+
scope: IntegrationScope
|
|
46
|
+
}
|
|
47
|
+
export interface McpServerTool {
|
|
48
|
+
name: string
|
|
49
|
+
title: string
|
|
50
|
+
description: string
|
|
51
|
+
write: boolean
|
|
52
|
+
destructive: boolean
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Command endpoints only. Use CloudConfig's typed client for records and CRUD. */
|
|
56
|
+
export function createIntegrationCommands(request: CommandRequest) {
|
|
57
|
+
const operation = <T>(provider: string, body: Record<string, unknown>) =>
|
|
58
|
+
request<T>(`/api/integrations/catalog/${encodeURIComponent(provider)}/connection`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
body,
|
|
61
|
+
})
|
|
62
|
+
return {
|
|
63
|
+
catalog: () =>
|
|
64
|
+
request<{
|
|
65
|
+
catalog: IntegrationDefinition[]
|
|
66
|
+
connections: IntegrationConnection[]
|
|
67
|
+
pending: PendingAccount[]
|
|
68
|
+
providers: IntegrationProvider[]
|
|
69
|
+
manager: boolean
|
|
70
|
+
organization: boolean
|
|
71
|
+
}>('/api/integrations/catalog'),
|
|
72
|
+
tools: () => request<IntegrationTool[]>('/api/integrations/catalog/tools'),
|
|
73
|
+
/** Start OAuth or MCP sign-in; resolves the URL to send the browser to. */
|
|
74
|
+
start: (
|
|
75
|
+
provider: string,
|
|
76
|
+
input: {
|
|
77
|
+
scope: IntegrationScope
|
|
78
|
+
server?: string
|
|
79
|
+
fields?: Record<string, string>
|
|
80
|
+
connection?: number
|
|
81
|
+
},
|
|
82
|
+
) => operation<{ url: string }>(provider, { operation: 'start', ...input }),
|
|
83
|
+
/** Attach the account the OAuth flow just connected. */
|
|
84
|
+
bind: (provider: string, connection: number) =>
|
|
85
|
+
operation<IntegrationConnection>(provider, { operation: 'bind', connection }),
|
|
86
|
+
target: (provider: string, connection: number, target: string) =>
|
|
87
|
+
operation<IntegrationConnection>(provider, { operation: 'target', connection, target }),
|
|
88
|
+
apiKey: (
|
|
89
|
+
provider: string,
|
|
90
|
+
input: { scope: IntegrationScope; credentials: Record<string, string>; label?: string },
|
|
91
|
+
) => operation<IntegrationConnection>(provider, { operation: 'apiKey', ...input }),
|
|
92
|
+
update: (
|
|
93
|
+
provider: string,
|
|
94
|
+
binding: number,
|
|
95
|
+
input: {
|
|
96
|
+
permissions?: string[]
|
|
97
|
+
approvals?: string[]
|
|
98
|
+
settings?: Record<string, string>
|
|
99
|
+
enabled?: boolean
|
|
100
|
+
label?: string
|
|
101
|
+
},
|
|
102
|
+
) =>
|
|
103
|
+
operation<IntegrationConnection>(provider, { operation: 'permissions', binding, ...input }),
|
|
104
|
+
disconnect: (provider: string, binding: number) =>
|
|
105
|
+
operation<{ removed: number }>(provider, { operation: 'disconnect', binding }),
|
|
106
|
+
webhook: (provider: string, binding: number, rotate = false) =>
|
|
107
|
+
operation<{ url: string; secret: string }>(provider, {
|
|
108
|
+
operation: 'webhook',
|
|
109
|
+
binding,
|
|
110
|
+
rotate,
|
|
111
|
+
}),
|
|
112
|
+
mcpTools: (provider: string, binding: number) =>
|
|
113
|
+
request<McpServerTool[]>(
|
|
114
|
+
`/api/integrations/catalog/${encodeURIComponent(provider)}/tools?binding=${binding}`,
|
|
115
|
+
),
|
|
116
|
+
action: (provider: string, action: string, input: Record<string, unknown>, binding?: number) =>
|
|
117
|
+
request<unknown>(`/api/integrations/catalog/${encodeURIComponent(provider)}/action`, {
|
|
118
|
+
method: 'POST',
|
|
119
|
+
body: { action, input, ...(binding ? { binding } : {}) },
|
|
120
|
+
}),
|
|
121
|
+
approve: (id: number, approve: boolean) =>
|
|
122
|
+
request<unknown>(`/api/integrations/approvals/${id}`, { method: 'POST', body: { approve } }),
|
|
123
|
+
}
|
|
124
|
+
}
|
package/module.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createResolver, defineNuxtModule } from '@nuxt/kit'
|
|
2
|
+
import { registerWorkspaceModule } from '@nuxtagentic/kit'
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs'
|
|
4
|
+
import { randomBytes } from 'node:crypto'
|
|
5
|
+
import { resolve } from 'node:path'
|
|
6
|
+
|
|
7
|
+
export default defineNuxtModule({
|
|
8
|
+
meta: { name: '@nuxtagentic/integrations' },
|
|
9
|
+
moduleDependencies: { '@nuxtagentic/workspace': {}, '@nuxtagentic/google': {} },
|
|
10
|
+
setup(_options, nuxt) {
|
|
11
|
+
const resolver = createResolver(import.meta.url)
|
|
12
|
+
// Development gets its own private sealing key instead of Connect's shared
|
|
13
|
+
// fallback, so a copied local database does not open with a known key.
|
|
14
|
+
if (nuxt.options.dev && !process.env.CLOUDCONFIG_CONNECT_KEY) {
|
|
15
|
+
const directory = resolve(nuxt.options.rootDir, '.cloudconfig')
|
|
16
|
+
const file = resolve(directory, 'connect.key')
|
|
17
|
+
mkdirSync(directory, { recursive: true })
|
|
18
|
+
if (!existsSync(file)) {
|
|
19
|
+
writeFileSync(file, randomBytes(32).toString('hex'), { mode: 0o600, flag: 'wx' })
|
|
20
|
+
}
|
|
21
|
+
process.env.CLOUDCONFIG_CONNECT_KEY = readFileSync(file, 'utf8').trim()
|
|
22
|
+
}
|
|
23
|
+
nuxt.options.runtimeConfig.integrations = { webhookOrigins: '' }
|
|
24
|
+
registerWorkspaceModule(
|
|
25
|
+
{
|
|
26
|
+
id: 'integrations',
|
|
27
|
+
runtime: resolver.resolve('./runtime'),
|
|
28
|
+
feature: {
|
|
29
|
+
from: resolver.resolve('./runtime/workspace.ts'),
|
|
30
|
+
name: 'integrationsContribution',
|
|
31
|
+
},
|
|
32
|
+
metadata: resolver.resolve('./runtime/shared/agent.ts'),
|
|
33
|
+
},
|
|
34
|
+
nuxt,
|
|
35
|
+
)
|
|
36
|
+
nuxt.hook('pages:extend', (pages) => {
|
|
37
|
+
pages.push({
|
|
38
|
+
name: 'dashboard-integrations',
|
|
39
|
+
path: '/dashboard/integrations',
|
|
40
|
+
file: resolver.resolve('./runtime/pages/integrations.vue'),
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
},
|
|
44
|
+
})
|
package/package.json
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nuxtagentic/integrations",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"module.ts",
|
|
7
|
+
"runtime",
|
|
8
|
+
"schema.ts",
|
|
9
|
+
"client.ts",
|
|
10
|
+
"README.md",
|
|
11
|
+
"LICENSE.md"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": "./module.ts",
|
|
15
|
+
"./package.json": "./package.json",
|
|
16
|
+
"./schema": "./schema.ts",
|
|
17
|
+
"./client": "./client.ts",
|
|
18
|
+
"./runtime/*.vue": "./runtime/*.vue",
|
|
19
|
+
"./runtime/*.css": "./runtime/*.css",
|
|
20
|
+
"./runtime/*.json": "./runtime/*.json",
|
|
21
|
+
"./runtime/*.svg": "./runtime/*.svg",
|
|
22
|
+
"./runtime/*": "./runtime/*.ts"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@cloudconfig/core": "0.2.0-beta.2",
|
|
26
|
+
"@nuxt/kit": "4.6.1",
|
|
27
|
+
"@nuxt/ui": "^4.11.1",
|
|
28
|
+
"h3": "1.15.11",
|
|
29
|
+
"@nuxtagentic/google": "0.1.1",
|
|
30
|
+
"@nuxtagentic/workspace": "0.1.1",
|
|
31
|
+
"@nuxtagentic/kit": "0.1.1",
|
|
32
|
+
"@nuxtagentic/prompt": "0.1.1",
|
|
33
|
+
"@nuxtagentic/identity": "0.1.1"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"nuxt": "^4.6.1",
|
|
37
|
+
"vue": "^3.5.43",
|
|
38
|
+
"nitropack": "^2.13.4"
|
|
39
|
+
},
|
|
40
|
+
"cloudconfig": {
|
|
41
|
+
"models": "integrationsModels",
|
|
42
|
+
"secrets": [
|
|
43
|
+
"CLOUDCONFIG_CONNECT_KEY"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
47
|
+
"description": "Connected providers, permissions and actions for Nuxt Agentic.",
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public",
|
|
50
|
+
"registry": "https://registry.npmjs.org/"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": "^22.22.3 || ^24.15.0 || >=26.0.0"
|
|
54
|
+
}
|
|
6
55
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 199"><path fill="#5865f2" d="M216.856 16.597A208.5 208.5 0 0 0 164.042 0c-2.275 4.113-4.933 9.645-6.766 14.046q-29.538-4.442-58.533 0c-1.832-4.4-4.55-9.933-6.846-14.046a207.8 207.8 0 0 0-52.855 16.638C5.618 67.147-3.443 116.4 1.087 164.956c22.169 16.555 43.653 26.612 64.775 33.193A161 161 0 0 0 79.735 175.3a136.4 136.4 0 0 1-21.846-10.632a109 109 0 0 0 5.356-4.237c42.122 19.702 87.89 19.702 129.51 0a132 132 0 0 0 5.355 4.237a136 136 0 0 1-21.886 10.653c4.006 8.02 8.638 15.67 13.873 22.848c21.142-6.58 42.646-16.637 64.815-33.213c5.316-56.288-9.08-105.09-38.056-148.36M85.474 135.095c-12.645 0-23.015-11.805-23.015-26.18s10.149-26.2 23.015-26.2s23.236 11.804 23.015 26.2c.02 14.375-10.148 26.18-23.015 26.18m85.051 0c-12.645 0-23.014-11.805-23.014-26.18s10.148-26.2 23.014-26.2c12.867 0 23.236 11.804 23.015 26.2c0 14.375-10.148 26.18-23.015 26.18"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 250"><path fill="#161614" d="M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46c6.397 1.185 8.746-2.777 8.746-6.158c0-3.052-.12-13.135-.174-23.83c-35.61 7.742-43.124-15.103-43.124-15.103c-5.823-14.795-14.213-18.73-14.213-18.73c-11.613-7.944.876-7.78.876-7.78c12.853.902 19.621 13.19 19.621 13.19c11.417 19.568 29.945 13.911 37.249 10.64c1.149-8.272 4.466-13.92 8.127-17.116c-28.431-3.236-58.318-14.212-58.318-63.258c0-13.975 5-25.394 13.188-34.358c-1.329-3.224-5.71-16.242 1.24-33.874c0 0 10.749-3.44 35.21 13.121c10.21-2.836 21.16-4.258 32.038-4.307c10.878.049 21.837 1.47 32.066 4.307c24.431-16.56 35.165-13.12 35.165-13.12c6.967 17.63 2.584 30.65 1.255 33.873c8.207 8.964 13.173 20.383 13.173 34.358c0 49.163-29.944 59.988-58.447 63.157c4.591 3.972 8.682 11.762 8.682 23.704c0 17.126-.148 30.91-.148 35.126c0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002C256 57.307 198.691 0 128.001 0m-80.06 182.34c-.282.636-1.283.827-2.194.39c-.929-.417-1.45-1.284-1.15-1.922c.276-.655 1.279-.838 2.205-.399c.93.418 1.46 1.293 1.139 1.931m6.296 5.618c-.61.566-1.804.303-2.614-.591c-.837-.892-.994-2.086-.375-2.66c.63-.566 1.787-.301 2.626.591c.838.903 1 2.088.363 2.66m4.32 7.188c-.785.545-2.067.034-2.86-1.104c-.784-1.138-.784-2.503.017-3.05c.795-.547 2.058-.055 2.861 1.075c.782 1.157.782 2.522-.019 3.08m7.304 8.325c-.701.774-2.196.566-3.29-.49c-1.119-1.032-1.43-2.496-.726-3.27c.71-.776 2.213-.558 3.315.49c1.11 1.03 1.45 2.505.701 3.27m9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033c-1.448-.439-2.395-1.613-2.103-2.626c.301-1.01 1.747-1.484 3.207-1.028c1.446.436 2.396 1.602 2.095 2.622m10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95c-1.53.034-2.769-.82-2.786-1.86c0-1.065 1.202-1.932 2.733-1.958c1.522-.03 2.768.818 2.768 1.868m10.555-.405c.182 1.03-.875 2.088-2.387 2.37c-1.485.271-2.861-.365-3.05-1.386c-.184-1.056.893-2.114 2.376-2.387c1.514-.263 2.868.356 3.061 1.403"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 193"><path fill="#4285f4" d="M58.182 192.05V93.14L27.507 65.077L0 49.504v125.091c0 9.658 7.825 17.455 17.455 17.455z"/><path fill="#34a853" d="M197.818 192.05h40.727c9.659 0 17.455-7.826 17.455-17.455V49.505l-31.156 17.837l-27.026 25.798z"/><path fill="#ea4335" d="m58.182 93.14l-4.174-38.647l4.174-36.989L128 69.868l69.818-52.364l4.669 34.992l-4.669 40.644L128 145.504z"/><path fill="#fbbc04" d="M197.818 17.504V93.14L256 49.504V26.231c0-21.585-24.64-33.89-41.89-20.945z"/><path fill="#c5221f" d="m0 49.504l26.759 20.07L58.182 93.14V17.504L41.89 5.286C24.61-7.66 0 4.646 0 26.23z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 230"><path fill="#fbbc04" d="M5.888 166.405L90.88 20.9c10.796 6.356 65.236 36.484 74.028 42.214L79.916 208.627c-9.295 12.28-85.804-23.587-74.028-42.23z"/><path fill="#4285f4" d="M250.084 166.402L165.092 20.906C153.21 1.132 127.62-6.054 106.601 5.625S79.182 42.462 91.064 63.119l84.992 145.514c11.882 19.765 37.473 26.95 58.492 15.272c20.1-11.68 27.418-37.73 15.536-57.486z"/><ellipse cx="42.664" cy="187.924" fill="#34a853" rx="42.664" ry="41.604"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 284"><path fill="#f9ab00" d="M256.003 247.933a35.224 35.224 0 0 1-39.376 35.161c-18.044-2.67-31.266-18.371-30.826-36.606V36.845C185.365 18.591 198.62 2.881 216.687.24a35.22 35.22 0 0 1 39.316 35.16z"/><path fill="#e37400" d="M35.101 213.193c19.386 0 35.101 15.716 35.101 35.101c0 19.386-15.715 35.101-35.101 35.101S0 267.68 0 248.295s15.715-35.102 35.101-35.102m92.358-106.387c-19.477 1.068-34.59 17.406-34.137 36.908v94.285c0 25.588 11.259 41.122 27.755 44.433a35.16 35.16 0 0 0 42.146-34.56V142.089a35.22 35.22 0 0 0-35.764-35.282"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#fff" d="M195.368 60.632H60.632v134.736h134.736z"/><path fill="#ea4335" d="M195.368 256L256 195.368l-30.316-5.172l-30.316 5.172l-5.533 27.73z"/><path fill="#188038" d="M0 195.368v40.421C0 246.956 9.044 256 20.21 256h40.422l6.225-30.316l-6.225-30.316l-33.033-5.172z"/><path fill="#1967d2" d="M256 60.632V20.21C256 9.044 246.956 0 235.79 0h-40.422q-5.532 22.554-5.533 33.196q0 10.641 5.533 27.436q20.115 5.76 30.316 5.76T256 60.631"/><path fill="#fbbc04" d="M256 60.632h-60.632v134.736H256z"/><path fill="#34a853" d="M195.368 195.368H60.632V256h134.736z"/><path fill="#4285f4" d="M195.368 0H20.211C9.044 0 0 9.044 0 20.21v175.158h60.632V60.632h134.736z"/><path fill="#4285f4" d="M88.27 165.154c-5.036-3.402-8.523-8.37-10.426-14.94l11.689-4.816q1.59 6.063 5.558 9.398c2.627 2.223 5.827 3.318 9.566 3.318q5.734 0 9.852-3.487c2.746-2.324 4.127-5.288 4.127-8.875q0-5.508-4.345-8.994c-2.897-2.324-6.535-3.486-10.88-3.486h-6.754v-11.57h6.063q5.608 0 9.448-3.033c2.56-2.02 3.84-4.783 3.84-8.303c0-3.132-1.145-5.625-3.435-7.494c-2.29-1.87-5.188-2.813-8.708-2.813c-3.436 0-6.164.91-8.185 2.745a16.1 16.1 0 0 0-4.413 6.754l-11.57-4.817c1.532-4.345 4.345-8.185 8.471-11.503s9.398-4.985 15.798-4.985c4.733 0 8.994.91 12.767 2.745c3.772 1.836 6.736 4.379 8.875 7.613c2.14 3.25 3.2 6.888 3.2 10.93c0 4.126-.993 7.613-2.98 10.476s-4.43 5.052-7.327 6.585v.69a22.25 22.25 0 0 1 9.398 7.327c2.442 3.284 3.672 7.208 3.672 11.79c0 4.58-1.163 8.673-3.487 12.26c-2.324 3.588-5.54 6.417-9.617 8.472c-4.092 2.055-8.69 3.1-13.793 3.1c-5.912.016-11.369-1.685-16.405-5.087m71.797-58.005l-12.833 9.28l-6.417-9.734l23.023-16.607h8.825v78.333h-12.598z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 229"><path fill="#0066da" d="m19.354 196.034l11.29 19.5c2.346 4.106 5.718 7.332 9.677 9.678q17.009-21.591 23.68-33.137q6.77-11.717 16.641-36.655q-26.604-3.502-40.32-3.502q-13.165 0-40.322 3.502c0 4.545 1.173 9.09 3.519 13.196z"/><path fill="#ea4335" d="M215.681 225.212c3.96-2.346 7.332-5.572 9.677-9.677l4.692-8.064l22.434-38.855a26.57 26.57 0 0 0 3.518-13.196q-27.315-3.502-40.247-3.502q-13.899 0-40.248 3.502q9.754 25.075 16.422 36.655q6.724 11.683 23.752 33.137"/><path fill="#00832d" d="M128.001 73.311q19.68-23.768 27.125-36.655q5.996-10.377 13.196-33.137C164.363 1.173 159.818 0 155.126 0h-54.25C96.184 0 91.64 1.32 87.68 3.519q9.16 26.103 15.544 37.154q7.056 12.213 24.777 32.638"/><path fill="#2684fc" d="M175.36 155.42H80.642l-40.32 69.792c3.958 2.346 8.503 3.519 13.195 3.519h148.968c4.692 0 9.238-1.32 13.196-3.52z"/><path fill="#00ac47" d="M128.001 73.311L87.681 3.52c-3.96 2.346-7.332 5.571-9.678 9.677L3.519 142.224A26.57 26.57 0 0 0 0 155.42h80.642z"/><path fill="#ffba00" d="m215.242 77.71l-37.243-64.514c-2.345-4.106-5.718-7.331-9.677-9.677l-40.32 69.792l47.358 82.109h80.496c0-4.546-1.173-9.09-3.519-13.196z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="4 4 32 32" fill="none"><path d="M11.081 30.527l-4.72 4.721a.933.933 0 0 1-1.317 0l-.292-.292a.933.933 0 0 1 0-1.316l4.72-4.721a.933.933 0 0 1 1.318 0l.291.291a.93.93 0 0 1 0 1.317z" fill="#FBBC04"/><path d="M23.75 32.5h6.042a6.04 6.04 0 0 0 6.041-6.042v-16.25a6.04 6.04 0 0 0-6.041-6.041 6.04 6.04 0 0 0-6.042 6.041V32.5z" fill="#4285F4"/><path d="M13.75 32.5a6.04 6.04 0 0 0 6.042-6.042 6.04 6.04 0 0 0-6.042-6.041 6.04 6.04 0 0 0-6.042 6.041A6.04 6.04 0 0 0 13.75 32.5z" fill="#FBBC04"/><path d="M27.97 32.5h-5.887a6.04 6.04 0 0 1-6.041-6.042v-7.916a6.04 6.04 0 0 1 6.041-6.042 6.04 6.04 0 0 1 6.042 6.042v13.804a.154.154 0 0 1-.154.154z" fill="#34A853"/><path d="M28.125 32.346V18.542a6.042 6.042 0 0 0-4.375-5.807V32.5h4.22a.154.154 0 0 0 .155-.154z" fill="#1967D2"/><path d="M19.792 26.575a6.04 6.04 0 0 0-3.75-5.59v5.59c0 1.72.72 3.273 1.875 4.373a6.024 6.024 0 0 0 1.875-4.373z" fill="#EA4335"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#FF7A59" d="M18.164 7.93V5.084a2.2 2.2 0 0 0 1.267-1.978v-.067A2.2 2.2 0 0 0 17.238.845h-.067a2.2 2.2 0 0 0-2.193 2.193v.067a2.2 2.2 0 0 0 1.252 1.973l.013.006v2.852a6.2 6.2 0 0 0-2.969 1.31l.012-.01l-7.828-6.095A2.497 2.497 0 1 0 4.3 4.656l-.012.006l7.697 5.991a6.2 6.2 0 0 0-1.038 3.446a6.2 6.2 0 0 0 1.147 3.607l-.013-.02l-2.342 2.343a2 2 0 0 0-.58-.095h-.002a2.033 2.033 0 1 0 2.033 2.033a2 2 0 0 0-.1-.595l.005.014l2.317-2.317a6.247 6.247 0 1 0 4.782-11.134l-.036-.005zm-.964 9.378a3.206 3.206 0 1 1 3.215-3.207v.002a3.206 3.206 0 0 1-3.207 3.207z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 263"><path d="M221.66 144.561c0 2.342-.897 4.588-2.493 6.244c-1.597 1.656-3.763 2.586-6.021 2.586s-4.424-.93-6.021-2.586s-2.494-3.902-2.494-6.244V65.677c0-2.342.897-4.588 2.494-6.243s3.763-2.587 6.02-2.587c2.259 0 4.425.93 6.022 2.587c1.596 1.655 2.493 3.901 2.493 6.243zm-2.955 54.657c-1.126 1.168-32.792 28.533-90.846 28.533s-89.508-27.22-90.845-28.387a8.6 8.6 0 0 1-2.043-2.654a9 9 0 0 1-.533-6.637a8.8 8.8 0 0 1 1.59-2.969c1.47-1.763 3.552-2.852 5.793-3.03a8.32 8.32 0 0 1 6.17 2.082c.493.365 28.78 24.154 79.798 24.154s79.516-23.935 79.798-24.154a8.45 8.45 0 0 1 6.202-2.059c2.247.177 4.339 1.256 5.83 3.007a8.9 8.9 0 0 1 1.995 6.274c-.158 2.282-1.178 4.407-2.839 5.913zM33.988 65.678c.127-2.35 1.146-4.551 2.834-6.124s3.907-2.388 6.173-2.269a8.38 8.38 0 0 1 5.564 2.6a9 9 0 0 1 2.458 5.792v78.738c0 2.342-.897 4.588-2.494 6.244c-1.596 1.656-3.762 2.586-6.02 2.586c-2.259 0-4.424-.93-6.021-2.586s-2.494-3.902-2.494-6.244zM76.7 48.163c.128-2.35 1.146-4.551 2.834-6.124s3.908-2.388 6.174-2.268a8.38 8.38 0 0 1 5.564 2.599a9 9 0 0 1 2.458 5.793V164.92c0 2.341-.898 4.587-2.494 6.243s-3.763 2.586-6.02 2.586c-2.26 0-4.425-.93-6.022-2.586s-2.494-3.902-2.494-6.243zm42.925-4.379c0-2.342.897-4.587 2.494-6.243s3.763-2.587 6.02-2.587c2.259 0 4.425.93 6.021 2.587c1.597 1.656 2.494 3.901 2.494 6.243v126.973c0 2.342-.897 4.588-2.494 6.244c-1.596 1.656-3.762 2.586-6.02 2.586s-4.424-.93-6.021-2.586s-2.494-3.902-2.494-6.244zm42.221 4.379c0-2.342.897-4.588 2.494-6.244s3.763-2.586 6.02-2.586c2.259 0 4.425.93 6.021 2.586s2.494 3.902 2.494 6.244V164.92c0 2.341-.897 4.587-2.494 6.243c-1.596 1.656-3.762 2.586-6.02 2.586s-4.424-.93-6.021-2.586s-2.494-3.902-2.494-6.243zM223.982 0H32.018a30.8 30.8 0 0 0-12.205 2.434A31.7 31.7 0 0 0 9.44 9.533A33.1 33.1 0 0 0 2.482 20.21A34 34 0 0 0 0 32.839v197.028a34 34 0 0 0 2.482 12.628a33.1 33.1 0 0 0 6.958 10.678a31.7 31.7 0 0 0 10.373 7.098a30.8 30.8 0 0 0 12.205 2.434h191.964a30.8 30.8 0 0 0 12.188-2.427a31.7 31.7 0 0 0 10.365-7.08a33.1 33.1 0 0 0 6.963-10.652A34 34 0 0 0 256 229.94V32.84a34 34 0 0 0-2.475-12.612a33.1 33.1 0 0 0-6.94-10.67a31.75 31.75 0 0 0-10.35-7.102A30.8 30.8 0 0 0 224.053.001"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#222326" d="m8.174 102.613l145.213 145.213c2.12 2.12 1.097 5.72-1.85 6.27a128 128 0 0 1-15.02 1.896a3.78 3.78 0 0 1-2.92-1.109L1.117 122.403a3.78 3.78 0 0 1-1.109-2.92c.34-5.095.978-10.107 1.896-15.02c.55-2.947 4.15-3.97 6.27-1.85m-4.092 58.796c-.97-3.614 3.3-5.894 5.946-3.248l87.81 87.811c2.647 2.646.367 6.915-3.247 5.946c-44.03-11.805-78.704-46.478-90.51-90.509m12.727-97.245c1.233-2.135 4.147-2.463 5.89-.719L192.556 233.3c1.744 1.744 1.417 4.658-.72 5.891a128 128 0 0 1-11.1 5.705c-1.43.65-3.11.322-4.22-.79L11.893 79.487c-1.111-1.112-1.439-2.79-.79-4.221a128 128 0 0 1 5.706-11.1M127.86 0C198.63 0 256 57.37 256 128.14c0 37.57-16.168 71.362-41.926 94.8c-1.487 1.354-3.768 1.264-5.19-.157L33.217 47.116c-1.421-1.422-1.51-3.703-.158-5.19C56.498 16.168 90.291 0 127.86 0"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#000000" d="M13.85 0a4.16 4.16 0 0 0-2.95 1.217L1.456 10.66a.835.835 0 0 0 0 1.18a.835.835 0 0 0 1.18 0l9.442-9.442a2.49 2.49 0 0 1 3.541 0a2.49 2.49 0 0 1 0 3.541L8.59 12.97l-.1.1a.835.835 0 0 0 0 1.18a.835.835 0 0 0 1.18 0l.1-.098l7.03-7.034a2.49 2.49 0 0 1 3.542 0l.049.05a2.49 2.49 0 0 1 0 3.54l-8.54 8.54a1.96 1.96 0 0 0 0 2.755l1.753 1.753a.835.835 0 0 0 1.18 0a.835.835 0 0 0 0-1.18l-1.753-1.753a.266.266 0 0 1 0-.394l8.54-8.54a4.185 4.185 0 0 0 0-5.9l-.05-.05a4.16 4.16 0 0 0-2.95-1.218c-.2 0-.401.02-.6.048a4.17 4.17 0 0 0-1.17-3.552A4.16 4.16 0 0 0 13.85 0m0 3.333a.84.84 0 0 0-.59.245L6.275 10.56a4.186 4.186 0 0 0 0 5.902a4.186 4.186 0 0 0 5.902 0L19.16 9.48a.835.835 0 0 0 0-1.18a.835.835 0 0 0-1.18 0l-6.985 6.984a2.49 2.49 0 0 1-3.54 0a2.49 2.49 0 0 1 0-3.54l6.983-6.985a.835.835 0 0 0 0-1.18a.84.84 0 0 0-.59-.245"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 171"><defs><linearGradient id="SVGYeLhubCc" x1="13.878%" x2="89.144%" y1="55.934%" y2="58.694%"><stop offset="0%" stop-color="#0064e1"/><stop offset="40%" stop-color="#0064e1"/><stop offset="83%" stop-color="#0073ee"/><stop offset="100%" stop-color="#0082fb"/></linearGradient><linearGradient id="SVGll66Sdsg" x1="54.315%" x2="54.315%" y1="82.782%" y2="39.307%"><stop offset="0%" stop-color="#0082fb"/><stop offset="100%" stop-color="#0064e0"/></linearGradient></defs><path fill="#0081fb" d="M27.651 112.136c0 9.775 2.146 17.28 4.95 21.82c3.677 5.947 9.16 8.466 14.751 8.466c7.211 0 13.808-1.79 26.52-19.372c10.185-14.092 22.186-33.874 30.26-46.275l13.675-21.01c9.499-14.591 20.493-30.811 33.1-41.806C161.196 4.985 172.298 0 183.47 0c18.758 0 36.625 10.87 50.3 31.257C248.735 53.584 256 81.707 256 110.729c0 17.253-3.4 29.93-9.187 39.946c-5.591 9.686-16.488 19.363-34.818 19.363v-27.616c15.695 0 19.612-14.422 19.612-30.927c0-23.52-5.484-49.623-17.564-68.273c-8.574-13.23-19.684-21.313-31.907-21.313c-13.22 0-23.859 9.97-35.815 27.75c-6.356 9.445-12.882 20.956-20.208 33.944l-8.066 14.289c-16.203 28.728-20.307 35.271-28.408 46.07c-14.2 18.91-26.324 26.076-42.287 26.076c-18.935 0-30.91-8.2-38.325-20.556C2.973 139.413 0 126.202 0 111.148z"/><path fill="url(#SVGYeLhubCc)" d="M21.802 33.206C34.48 13.666 52.774 0 73.757 0C85.91 0 97.99 3.597 110.605 13.897c13.798 11.261 28.505 29.805 46.853 60.368l6.58 10.967c15.881 26.459 24.917 40.07 30.205 46.49c6.802 8.243 11.565 10.7 17.752 10.7c15.695 0 19.612-14.422 19.612-30.927l24.393-.766c0 17.253-3.4 29.93-9.187 39.946c-5.591 9.686-16.488 19.363-34.818 19.363c-11.395 0-21.49-2.475-32.654-13.007c-8.582-8.083-18.615-22.443-26.334-35.352l-22.96-38.352C118.528 64.08 107.96 49.73 101.845 43.23c-6.578-6.988-15.036-15.428-28.532-15.428c-10.923 0-20.2 7.666-27.963 19.39z"/><path fill="url(#SVGll66Sdsg)" d="M73.312 27.802c-10.923 0-20.2 7.666-27.963 19.39c-10.976 16.568-17.698 41.245-17.698 64.944c0 9.775 2.146 17.28 4.95 21.82L9.027 149.482C2.973 139.413 0 126.202 0 111.148C0 83.772 7.514 55.24 21.802 33.206C34.48 13.666 52.774 0 73.757 0z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 268"><path fill="#fff" d="M16.092 11.538L164.09.608c18.179-1.56 22.85-.508 34.28 7.801l47.243 33.282C253.406 47.414 256 48.975 256 55.207v182.527c0 11.439-4.155 18.205-18.696 19.24L65.44 267.378c-10.913.517-16.11-1.043-21.825-8.327L8.826 213.814C2.586 205.487 0 199.254 0 191.97V29.726c0-9.352 4.155-17.153 16.092-18.188"/><path d="M164.09.608L16.092 11.538C4.155 12.573 0 20.374 0 29.726v162.245c0 7.284 2.585 13.516 8.826 21.843l34.789 45.237c5.715 7.284 10.912 8.844 21.825 8.327l171.864-10.404c14.532-1.035 18.696-7.801 18.696-19.24V55.207c0-5.911-2.336-7.614-9.21-12.66l-1.185-.856L198.37 8.409C186.94.1 182.27-.952 164.09.608M69.327 52.22c-14.033.945-17.216 1.159-25.186-5.323L23.876 30.778c-2.06-2.086-1.026-4.69 4.163-5.207l142.274-10.395c11.947-1.043 18.17 3.12 22.842 6.758l24.401 17.68c1.043.525 3.638 3.637.517 3.637L71.146 52.095zm-16.36 183.954V81.222c0-6.767 2.077-9.887 8.3-10.413L230.02 60.93c5.724-.517 8.31 3.12 8.31 9.879v153.917c0 6.767-1.044 12.49-10.387 13.008l-161.487 9.361c-9.343.517-13.489-2.594-13.489-10.921M212.377 89.53c1.034 4.681 0 9.362-4.681 9.897l-7.783 1.542v114.404c-6.758 3.637-12.981 5.715-18.18 5.715c-8.308 0-10.386-2.604-16.609-10.396l-50.898-80.079v77.476l16.1 3.646s0 9.362-12.989 9.362l-35.814 2.077c-1.043-2.086 0-7.284 3.63-8.318l9.351-2.595V109.823l-12.98-1.052c-1.044-4.68 1.55-11.439 8.826-11.965l38.426-2.585l52.958 81.113v-71.76l-13.498-1.552c-1.043-5.733 3.111-9.896 8.3-10.404z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><circle cx="128" cy="128" r="128" fill="#ff4500"/><path fill="#fff" d="M213.15 129.22c0-10.376-8.391-18.617-18.617-18.617a18.74 18.74 0 0 0-12.97 5.189c-12.818-9.157-30.368-15.107-49.9-15.87l8.544-39.981l27.773 5.95c.307 7.02 6.104 12.667 13.278 12.667c7.324 0 13.275-5.95 13.275-13.278c0-7.324-5.95-13.275-13.275-13.275c-5.188 0-9.768 3.052-11.904 7.478l-30.976-6.562c-.916-.154-1.832 0-2.443.458c-.763.458-1.22 1.22-1.371 2.136l-9.464 44.558c-19.837.612-37.692 6.562-50.662 15.872a18.74 18.74 0 0 0-12.971-5.188c-10.377 0-18.617 8.391-18.617 18.617c0 7.629 4.577 14.037 10.988 16.939a33.6 33.6 0 0 0-.458 5.646c0 28.686 33.42 52.036 74.621 52.036c41.202 0 74.622-23.196 74.622-52.036a35 35 0 0 0-.458-5.646c6.408-2.902 10.985-9.464 10.985-17.093M85.272 142.495c0-7.324 5.95-13.275 13.278-13.275c7.324 0 13.275 5.95 13.275 13.275s-5.95 13.278-13.275 13.278c-7.327.15-13.278-5.953-13.278-13.278m74.317 35.251c-9.156 9.157-26.553 9.768-31.588 9.768c-5.188 0-22.584-.765-31.59-9.768c-1.371-1.373-1.371-3.51 0-4.883c1.374-1.371 3.51-1.371 4.884 0c5.8 5.8 18.008 7.782 26.706 7.782s21.058-1.983 26.704-7.782c1.374-1.371 3.51-1.371 4.884 0c1.22 1.373 1.22 3.51 0 4.883m-2.443-21.822c-7.325 0-13.275-5.95-13.275-13.275s5.95-13.275 13.275-13.275c7.327 0 13.277 5.95 13.277 13.275c0 7.17-5.95 13.275-13.277 13.275"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#362D59" d="M13.91 2.505c-.873-1.448-2.972-1.448-3.844 0L6.904 7.92a15.48 15.48 0 0 1 8.53 12.811h-2.221A13.3 13.3 0 0 0 5.784 9.814l-2.926 5.06a7.65 7.65 0 0 1 4.435 5.848H2.194a.365.365 0 0 1-.298-.534l1.413-2.402a5.2 5.2 0 0 0-1.614-.913L.296 19.275a2.18 2.18 0 0 0 .812 2.999a2.24 2.24 0 0 0 1.086.288h6.983a9.32 9.32 0 0 0-3.845-8.318l1.11-1.922a11.47 11.47 0 0 1 4.95 10.24h5.915a17.24 17.24 0 0 0-7.885-15.28l2.244-3.845a.37.37 0 0 1 .504-.13c.255.14 9.75 16.708 9.928 16.9a.365.365 0 0 1-.327.543h-2.287q.043.918 0 1.831h2.297a2.206 2.206 0 0 0 1.922-3.31z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 292"><path fill="#95bf46" d="M223.774 57.34c-.201-1.46-1.48-2.268-2.537-2.357a19614 19614 0 0 0-23.383-1.743s-15.507-15.395-17.209-17.099c-1.703-1.703-5.029-1.185-6.32-.805c-.19.056-3.388 1.043-8.678 2.68c-5.18-14.906-14.322-28.604-30.405-28.604c-.444 0-.901.018-1.358.044C129.31 3.407 123.644.779 118.75.779c-37.465 0-55.364 46.835-60.976 70.635c-14.558 4.511-24.9 7.718-26.221 8.133c-8.126 2.549-8.383 2.805-9.45 10.462C21.3 95.806.038 260.235.038 260.235l165.678 31.042l89.77-19.42S223.973 58.8 223.775 57.34M156.49 40.848l-14.019 4.339c.005-.988.01-1.96.01-3.023c0-9.264-1.286-16.723-3.349-22.636c8.287 1.04 13.806 10.469 17.358 21.32m-27.638-19.483c2.304 5.773 3.802 14.058 3.802 25.238c0 .572-.005 1.095-.01 1.624c-9.117 2.824-19.024 5.89-28.953 8.966c5.575-21.516 16.025-31.908 25.161-35.828m-11.131-10.537c1.617 0 3.246.549 4.805 1.622c-12.007 5.65-24.877 19.88-30.312 48.297l-22.886 7.088C75.694 46.16 90.81 10.828 117.72 10.828"/><path fill="#5e8e3e" d="M221.237 54.983a19614 19614 0 0 0-23.383-1.743s-15.507-15.395-17.209-17.099c-.637-.634-1.496-.959-2.394-1.099l-12.527 256.233l89.762-19.418S223.972 58.8 223.774 57.34c-.201-1.46-1.48-2.268-2.537-2.357"/><path fill="#fff" d="m135.242 104.585l-11.069 32.926s-9.698-5.176-21.586-5.176c-17.428 0-18.305 10.937-18.305 13.693c0 15.038 39.2 20.8 39.2 56.024c0 27.713-17.577 45.558-41.277 45.558c-28.44 0-42.984-17.7-42.984-17.7l7.615-25.16s14.95 12.835 27.565 12.835c8.243 0 11.596-6.49 11.596-11.232c0-19.616-32.16-20.491-32.16-52.724c0-27.129 19.472-53.382 58.778-53.382c15.145 0 22.627 4.338 22.627 4.338"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#e01e5a" d="M53.841 161.32c0 14.832-11.987 26.82-26.819 26.82S.203 176.152.203 161.32c0-14.831 11.987-26.818 26.82-26.818H53.84zm13.41 0c0-14.831 11.987-26.818 26.819-26.818s26.819 11.987 26.819 26.819v67.047c0 14.832-11.987 26.82-26.82 26.82c-14.83 0-26.818-11.988-26.818-26.82z"/><path fill="#36c5f0" d="M94.07 53.638c-14.832 0-26.82-11.987-26.82-26.819S79.239 0 94.07 0s26.819 11.987 26.819 26.819v26.82zm0 13.613c14.832 0 26.819 11.987 26.819 26.819s-11.987 26.819-26.82 26.819H26.82C11.987 120.889 0 108.902 0 94.069c0-14.83 11.987-26.818 26.819-26.818z"/><path fill="#2eb67d" d="M201.55 94.07c0-14.832 11.987-26.82 26.818-26.82s26.82 11.988 26.82 26.82s-11.988 26.819-26.82 26.819H201.55zm-13.41 0c0 14.832-11.988 26.819-26.82 26.819c-14.831 0-26.818-11.987-26.818-26.82V26.82C134.502 11.987 146.489 0 161.32 0s26.819 11.987 26.819 26.819z"/><path fill="#ecb22e" d="M161.32 201.55c14.832 0 26.82 11.987 26.82 26.818s-11.988 26.82-26.82 26.82c-14.831 0-26.818-11.988-26.818-26.82V201.55zm0-13.41c-14.831 0-26.818-11.988-26.818-26.82c0-14.831 11.987-26.818 26.819-26.818h67.25c14.832 0 26.82 11.987 26.82 26.819s-11.988 26.819-26.82 26.819z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#635BFF" d="M13.976 9.15c-2.172-.806-3.356-1.426-3.356-2.409c0-.831.683-1.305 1.901-1.305c2.227 0 4.515.858 6.09 1.631l.89-5.494C18.252.975 15.697 0 12.165 0C9.667 0 7.589.654 6.104 1.872C4.56 3.147 3.757 4.992 3.757 7.218c0 4.039 2.467 5.76 6.476 7.219c2.585.92 3.445 1.574 3.445 2.583c0 .98-.84 1.545-2.354 1.545c-1.875 0-4.965-.921-6.99-2.109l-.9 5.555C5.175 22.99 8.385 24 11.714 24c2.641 0 4.843-.624 6.328-1.813c1.664-1.305 2.525-3.236 2.525-5.732c0-4.128-2.524-5.851-6.594-7.305z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 290"><path fill="#ff004f" d="M189.72 104.421c18.678 13.345 41.56 21.197 66.273 21.197v-47.53a67 67 0 0 1-13.918-1.456v37.413c-24.711 0-47.59-7.851-66.272-21.195v96.996c0 48.523-39.356 87.855-87.9 87.855c-18.113 0-34.949-5.473-48.934-14.86c15.962 16.313 38.222 26.432 62.848 26.432c48.548 0 87.905-39.332 87.905-87.857v-96.995zm17.17-47.952c-9.546-10.423-15.814-23.893-17.17-38.785v-6.113h-13.189c3.32 18.927 14.644 35.097 30.358 44.898M69.673 225.607a40 40 0 0 1-8.203-24.33c0-22.192 18.001-40.186 40.21-40.186a40.3 40.3 0 0 1 12.197 1.883v-48.593c-4.61-.631-9.262-.9-13.912-.801v37.822a40.3 40.3 0 0 0-12.203-1.882c-22.208 0-40.208 17.992-40.208 40.187c0 15.694 8.997 29.281 22.119 35.9"/><path fill="#fff" d="M175.803 92.849c18.683 13.344 41.56 21.195 66.272 21.195V76.631c-13.794-2.937-26.005-10.141-35.186-20.162c-15.715-9.802-27.038-25.972-30.358-44.898h-34.643v189.843c-.079 22.132-18.049 40.052-40.21 40.052c-13.058 0-24.66-6.221-32.007-15.86c-13.12-6.618-22.118-20.206-22.118-35.898c0-22.193 18-40.187 40.208-40.187c4.255 0 8.356.662 12.203 1.882v-37.822c-47.692.985-86.047 39.933-86.047 87.834c0 23.912 9.551 45.589 25.053 61.428c13.985 9.385 30.82 14.86 48.934 14.86c48.545 0 87.9-39.335 87.9-87.857z"/><path fill="#00f2ea" d="M242.075 76.63V66.516a66.3 66.3 0 0 1-35.186-10.047a66.47 66.47 0 0 0 35.186 20.163M176.53 11.57a68 68 0 0 1-.728-5.457V0h-47.834v189.845c-.076 22.13-18.046 40.05-40.208 40.05a40.06 40.06 0 0 1-18.09-4.287c7.347 9.637 18.949 15.857 32.007 15.857c22.16 0 40.132-17.918 40.21-40.05V11.571zM99.966 113.58v-10.769a89 89 0 0 0-12.061-.818C39.355 101.993 0 141.327 0 189.845c0 30.419 15.467 57.227 38.971 72.996c-15.502-15.838-25.053-37.516-25.053-61.427c0-47.9 38.354-86.848 86.048-87.833"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 290"><path fill="#ff004f" d="M189.72 104.421c18.678 13.345 41.56 21.197 66.273 21.197v-47.53a67 67 0 0 1-13.918-1.456v37.413c-24.711 0-47.59-7.851-66.272-21.195v96.996c0 48.523-39.356 87.855-87.9 87.855c-18.113 0-34.949-5.473-48.934-14.86c15.962 16.313 38.222 26.432 62.848 26.432c48.548 0 87.905-39.332 87.905-87.857v-96.995zm17.17-47.952c-9.546-10.423-15.814-23.893-17.17-38.785v-6.113h-13.189c3.32 18.927 14.644 35.097 30.358 44.898M69.673 225.607a40 40 0 0 1-8.203-24.33c0-22.192 18.001-40.186 40.21-40.186a40.3 40.3 0 0 1 12.197 1.883v-48.593c-4.61-.631-9.262-.9-13.912-.801v37.822a40.3 40.3 0 0 0-12.203-1.882c-22.208 0-40.208 17.992-40.208 40.187c0 15.694 8.997 29.281 22.119 35.9"/><path d="M175.803 92.849c18.683 13.344 41.56 21.195 66.272 21.195V76.631c-13.794-2.937-26.005-10.141-35.186-20.162c-15.715-9.802-27.038-25.972-30.358-44.898h-34.643v189.843c-.079 22.132-18.049 40.052-40.21 40.052c-13.058 0-24.66-6.221-32.007-15.86c-13.12-6.618-22.118-20.206-22.118-35.898c0-22.193 18-40.187 40.208-40.187c4.255 0 8.356.662 12.203 1.882v-37.822c-47.692.985-86.047 39.933-86.047 87.834c0 23.912 9.551 45.589 25.053 61.428c13.985 9.385 30.82 14.86 48.934 14.86c48.545 0 87.9-39.335 87.9-87.857z"/><path fill="#00f2ea" d="M242.075 76.63V66.516a66.3 66.3 0 0 1-35.186-10.047a66.47 66.47 0 0 0 35.186 20.163M176.53 11.57a68 68 0 0 1-.728-5.457V0h-47.834v189.845c-.076 22.13-18.046 40.05-40.208 40.05a40.06 40.06 0 0 1-18.09-4.287c7.347 9.637 18.949 15.857 32.007 15.857c22.16 0 40.132-17.918 40.21-40.05V11.571zM99.966 113.58v-10.769a89 89 0 0 0-12.061-.818C39.355 101.993 0 141.327 0 189.845c0 30.419 15.467 57.227 38.971 72.996c-15.502-15.838-25.053-37.516-25.053-61.427c0-47.9 38.354-86.848 86.048-87.833"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 222"><path d="m128 0l128 221.705H0z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#000000" d="M14.234 10.162L22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299l-.929-1.329L3.076 1.56h3.182l5.965 8.532l.929 1.329l7.754 11.09h-3.182z"/></svg>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import type { IntegrationConnection } from '../../client'
|
|
4
|
+
import type { IntegrationDefinition } from '../shared/catalog'
|
|
5
|
+
import IntegrationLogo from './IntegrationLogo.vue'
|
|
6
|
+
|
|
7
|
+
const { integration, connections } = defineProps<{
|
|
8
|
+
integration: IntegrationDefinition
|
|
9
|
+
connections: IntegrationConnection[]
|
|
10
|
+
}>()
|
|
11
|
+
defineEmits<{ select: [event: MouseEvent] }>()
|
|
12
|
+
const connectedConnections = computed(() => connections.filter((entry) => entry.enabled))
|
|
13
|
+
const hasConnectionErrors = computed(() => connections.some((entry) => entry.status === 'error'))
|
|
14
|
+
const statusIndicatorClass = computed(() => {
|
|
15
|
+
if (hasConnectionErrors.value) {
|
|
16
|
+
return 'bg-error'
|
|
17
|
+
}
|
|
18
|
+
return connectedConnections.value.length ? 'bg-success' : 'bg-(--gray-600)'
|
|
19
|
+
})
|
|
20
|
+
const summary = computed(() => {
|
|
21
|
+
if (hasConnectionErrors.value) {
|
|
22
|
+
return 'Needs attention'
|
|
23
|
+
}
|
|
24
|
+
const [firstConnection] = connectedConnections.value
|
|
25
|
+
if (!firstConnection) {
|
|
26
|
+
return integration.category
|
|
27
|
+
}
|
|
28
|
+
const { label, account } = firstConnection
|
|
29
|
+
const connectedCount = connectedConnections.value.length
|
|
30
|
+
return connectedCount === 1
|
|
31
|
+
? `Connected · ${label || account}`
|
|
32
|
+
: `${connectedCount} accounts connected`
|
|
33
|
+
})
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<template>
|
|
37
|
+
<article
|
|
38
|
+
data-integration-card
|
|
39
|
+
class="flex flex-col gap-3.5 rounded-xl border bg-(--gray-200) p-4"
|
|
40
|
+
:class="connectedConnections.length ? 'border-(--gray-500)' : 'border-(--gray-400)'"
|
|
41
|
+
>
|
|
42
|
+
<div class="flex items-center gap-3">
|
|
43
|
+
<span
|
|
44
|
+
class="grid size-10 shrink-0 place-items-center rounded-[10px] border border-(--gray-400) bg-(--gray-300)"
|
|
45
|
+
>
|
|
46
|
+
<IntegrationLogo
|
|
47
|
+
:name="integration.logo"
|
|
48
|
+
class="size-5"
|
|
49
|
+
/>
|
|
50
|
+
</span>
|
|
51
|
+
<div class="flex min-w-0 flex-col gap-0.5">
|
|
52
|
+
<span class="text-[15px] leading-5 font-medium text-highlighted">
|
|
53
|
+
{{ integration.name }}
|
|
54
|
+
</span>
|
|
55
|
+
<span class="flex items-center gap-1.5 text-xs leading-4 text-dimmed">
|
|
56
|
+
<span
|
|
57
|
+
class="size-1.5 shrink-0 rounded-full"
|
|
58
|
+
:class="statusIndicatorClass"
|
|
59
|
+
/>
|
|
60
|
+
<span class="truncate">{{ summary }}</span>
|
|
61
|
+
</span>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<p class="flex-1 text-[13px] leading-5 text-muted text-pretty">{{ integration.description }}</p>
|
|
65
|
+
<div class="flex items-center gap-2">
|
|
66
|
+
<span class="min-w-0 flex-1 truncate text-xs text-dimmed">
|
|
67
|
+
{{
|
|
68
|
+
integration.auth.mcp
|
|
69
|
+
? 'Hosted MCP server'
|
|
70
|
+
: `${integration.triggers.length} triggers · ${integration.actions.length} actions`
|
|
71
|
+
}}
|
|
72
|
+
</span>
|
|
73
|
+
<UButton
|
|
74
|
+
color="neutral"
|
|
75
|
+
:variant="connections.length ? 'outline' : 'solid'"
|
|
76
|
+
:label="connections.length ? 'Manage' : 'Connect'"
|
|
77
|
+
class="h-8 rounded-lg px-3.5 text-[13px] font-medium"
|
|
78
|
+
@click="$emit('select', $event)"
|
|
79
|
+
/>
|
|
80
|
+
</div>
|
|
81
|
+
</article>
|
|
82
|
+
</template>
|