@squidcloud/cli 1.0.460 → 1.0.462
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/index.js +5 -3
- package/dist/resources/claude/skills/squid-development/SKILL.md +9 -2
- package/dist/resources/claude/skills/squid-development/reference/ai.md +8 -6
- package/dist/resources/claude/skills/squid-development/reference/backend.md +72 -0
- package/dist/resources/claude/skills/squid-development/reference/client.md +23 -0
- package/dist/resources/claude/skills/squid-development/reference/connectors.md +28 -0
- package/dist/resources/claude/skills/squid-integrations/SKILL.md +249 -0
- package/dist/resources/claude/skills/squid-integrations/reference/connector-functions.md +541 -0
- package/dist/resources/claude/skills/squid-integrations/reference/connector-sdks.md +616 -0
- package/dist/resources/claude/skills/squid-integrations/reference/integration-catalog.md +154 -0
- package/dist/resources/claude/skills/squid-integrations/reference/integration-setup.md +529 -0
- package/dist/resources/claude/skills/squid-react-development/SKILL.md +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
# Connector Client SDKs & Executable Methods
|
|
2
|
+
|
|
3
|
+
Squid ships 13 connector client SDKs that developers can import and call directly from frontend or backend code. These provide typed methods for interacting with SaaS services without needing the raw APIs.
|
|
4
|
+
|
|
5
|
+
## How Connector Functions Work
|
|
6
|
+
|
|
7
|
+
There are **three ways** to use connector functionality:
|
|
8
|
+
|
|
9
|
+
1. **Client SDK** (`@squidcloud/<connector>-client`) - Import and call typed methods directly from frontend or backend code
|
|
10
|
+
2. **AI Functions** (`@aiFunction`) - Automatically available to AI agents when the integration is connected (see [connector-functions.md](connector-functions.md))
|
|
11
|
+
3. **Executables** (`@executable`) - Backend methods callable via `squid.executeFunction()` from the client
|
|
12
|
+
|
|
13
|
+
All three call the same underlying connector logic. Use Client SDKs for the best developer experience.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Slack - `@squidcloud/slack-client`
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { SquidSlackClient } from '@squidcloud/slack-client';
|
|
21
|
+
|
|
22
|
+
const slackClient = new SquidSlackClient(squid, 'my-slack-integration-id');
|
|
23
|
+
|
|
24
|
+
// Send a message to a channel
|
|
25
|
+
await slackClient.sendMessage({ channel: '#general', text: 'Hello from Squid!' });
|
|
26
|
+
|
|
27
|
+
// Search indexed messages (semantic search)
|
|
28
|
+
const results = await slackClient.searchMessages({ prompt: 'deployment issues', limit: 10 });
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Methods
|
|
32
|
+
| Method | Parameters | Description |
|
|
33
|
+
|--------|-----------|-------------|
|
|
34
|
+
| `sendMessage` | `{ channel, text }` | Send a message to a Slack channel |
|
|
35
|
+
| `searchMessages` | `{ prompt, limit? }` | Semantic search across indexed Slack messages |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Jira - `@squidcloud/jira-client`
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import { SquidJiraClient } from '@squidcloud/jira-client';
|
|
43
|
+
|
|
44
|
+
const jiraClient = new SquidJiraClient(squid, 'my-jira-integration-id');
|
|
45
|
+
|
|
46
|
+
// Search issues
|
|
47
|
+
const issues = await jiraClient.searchIssues({ query: 'login bug', projectKey: 'BACKEND' });
|
|
48
|
+
|
|
49
|
+
// Search by JQL
|
|
50
|
+
const jqlResults = await jiraClient.searchByJql({ jql: 'project = BACKEND AND status = Open' });
|
|
51
|
+
|
|
52
|
+
// Get issue details
|
|
53
|
+
const issue = await jiraClient.getIssue({ issueKey: 'BACKEND-123' });
|
|
54
|
+
|
|
55
|
+
// Create an issue
|
|
56
|
+
const newIssue = await jiraClient.createIssue({
|
|
57
|
+
projectKey: 'BACKEND',
|
|
58
|
+
summary: 'Fix login button',
|
|
59
|
+
issueType: 'Bug',
|
|
60
|
+
description: 'The login button is not responding on mobile'
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Update an issue
|
|
64
|
+
await jiraClient.updateIssue({ issueKey: 'BACKEND-123', fields: { priority: 'High' } });
|
|
65
|
+
|
|
66
|
+
// Add a comment
|
|
67
|
+
await jiraClient.addComment({ issueKey: 'BACKEND-123', comment: 'Working on this now' });
|
|
68
|
+
|
|
69
|
+
// Transition issue status
|
|
70
|
+
await jiraClient.transitionIssue({ issueKey: 'BACKEND-123', transitionId: '31' });
|
|
71
|
+
|
|
72
|
+
// Add labels
|
|
73
|
+
await jiraClient.addLabels({ issueKey: 'BACKEND-123', labels: ['urgent', 'mobile'] });
|
|
74
|
+
|
|
75
|
+
// List projects
|
|
76
|
+
const projects = await jiraClient.listProjects();
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Methods
|
|
80
|
+
| Method | Description |
|
|
81
|
+
|--------|-------------|
|
|
82
|
+
| `searchIssues` | Text search with optional project/status filters |
|
|
83
|
+
| `searchByJql` | Search using Jira Query Language |
|
|
84
|
+
| `getIssue` | Get full issue details by key |
|
|
85
|
+
| `createIssue` | Create a new issue |
|
|
86
|
+
| `updateIssue` | Update issue fields |
|
|
87
|
+
| `addComment` | Add a comment to an issue |
|
|
88
|
+
| `transitionIssue` | Move issue to a new status |
|
|
89
|
+
| `addLabels` | Add labels to an issue |
|
|
90
|
+
| `listProjects` | List available projects |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Jira Service Management - `@squidcloud/jira-jsm-client`
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { SquidJiraJsmClient } from '@squidcloud/jira-jsm-client';
|
|
98
|
+
|
|
99
|
+
const jsmClient = new SquidJiraJsmClient(squid, 'my-jsm-integration-id');
|
|
100
|
+
|
|
101
|
+
// List service desks
|
|
102
|
+
const desks = await jsmClient.listServiceDesks();
|
|
103
|
+
|
|
104
|
+
// List request types for a desk
|
|
105
|
+
const types = await jsmClient.listRequestTypes({ serviceDeskId: '1' });
|
|
106
|
+
|
|
107
|
+
// Create a request
|
|
108
|
+
const request = await jsmClient.createRequest({
|
|
109
|
+
serviceDeskId: '1',
|
|
110
|
+
requestTypeId: '10',
|
|
111
|
+
summary: 'Laptop replacement needed',
|
|
112
|
+
description: 'Screen is cracked'
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Search requests
|
|
116
|
+
const results = await jsmClient.searchRequests({ query: 'laptop' });
|
|
117
|
+
|
|
118
|
+
// Get request details
|
|
119
|
+
const details = await jsmClient.getRequest({ requestId: 'IT-42' });
|
|
120
|
+
|
|
121
|
+
// Update a request
|
|
122
|
+
await jsmClient.updateRequest({ requestId: 'IT-42', fields: { priority: 'High' } });
|
|
123
|
+
|
|
124
|
+
// Add a comment
|
|
125
|
+
await jsmClient.addComment({ requestId: 'IT-42', comment: 'Ordered replacement', isPublic: true });
|
|
126
|
+
|
|
127
|
+
// Transition request status
|
|
128
|
+
await jsmClient.transitionRequest({ requestId: 'IT-42', transitionId: '5' });
|
|
129
|
+
|
|
130
|
+
// List customers
|
|
131
|
+
const customers = await jsmClient.listCustomers({ serviceDeskId: '1' });
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Methods
|
|
135
|
+
| Method | Description |
|
|
136
|
+
|--------|-------------|
|
|
137
|
+
| `listServiceDesks` | List all service desks |
|
|
138
|
+
| `listRequestTypes` | List request types for a service desk |
|
|
139
|
+
| `searchRequests` | Search requests by text |
|
|
140
|
+
| `getRequest` | Get request details |
|
|
141
|
+
| `createRequest` | Create a new service request |
|
|
142
|
+
| `updateRequest` | Update request fields |
|
|
143
|
+
| `addComment` | Add a comment (public or internal) |
|
|
144
|
+
| `transitionRequest` | Transition request status |
|
|
145
|
+
| `listCustomers` | List customers in a service desk |
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Zendesk
|
|
150
|
+
|
|
151
|
+
Zendesk does NOT have a separate client SDK package. Use `squid.executeFunction()` to call the backend executables:
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
// Search tickets (semantic)
|
|
155
|
+
const results = await squid.executeFunction('searchInZendesk', prompt, integrationId);
|
|
156
|
+
|
|
157
|
+
// List tickets
|
|
158
|
+
const tickets = await squid.executeFunction('listZendeskTickets', integrationId, limit, sortBy, ascending, status);
|
|
159
|
+
|
|
160
|
+
// Get ticket details
|
|
161
|
+
const details = await squid.executeFunction('getZendeskTicketDetails', ticketId, integrationId, relatedTicketsMode);
|
|
162
|
+
|
|
163
|
+
// Reply to a ticket
|
|
164
|
+
await squid.executeFunction('replyToZendeskTicket', ticketId, integrationId, replyText, isReplyToCustomer, reassignToEmail, status);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Executable Methods
|
|
168
|
+
| Method | Description |
|
|
169
|
+
|--------|-------------|
|
|
170
|
+
| `searchInZendesk` | Semantic search across tickets and KB |
|
|
171
|
+
| `listZendeskTickets` | List tickets with sorting/filtering |
|
|
172
|
+
| `getZendeskTicketDetails` | Get full ticket details with comments |
|
|
173
|
+
| `replyToZendeskTicket` | Reply to a ticket (customer or internal) |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## GitHub - `@squidcloud/github-client`
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
import { SquidGitHubClient } from '@squidcloud/github-client';
|
|
181
|
+
|
|
182
|
+
const ghClient = new SquidGitHubClient(squid, 'my-github-integration-id');
|
|
183
|
+
|
|
184
|
+
// Search PRs
|
|
185
|
+
const prs = await ghClient.searchPullRequests({ query: 'fix', state: 'open' });
|
|
186
|
+
|
|
187
|
+
// Get PR details
|
|
188
|
+
const pr = await ghClient.getPullRequest({ prNumber: 42 });
|
|
189
|
+
|
|
190
|
+
// List open PRs
|
|
191
|
+
const openPrs = await ghClient.listPullRequests();
|
|
192
|
+
|
|
193
|
+
// Search code
|
|
194
|
+
const code = await ghClient.searchCode({ query: 'handleAuth', path: 'src/' });
|
|
195
|
+
|
|
196
|
+
// Get file content
|
|
197
|
+
const file = await ghClient.getFileContent({ path: 'src/index.ts', ref: 'main' });
|
|
198
|
+
|
|
199
|
+
// Create a PR
|
|
200
|
+
const newPr = await ghClient.createPullRequest({
|
|
201
|
+
title: 'Fix auth bug',
|
|
202
|
+
body: 'Fixes the login issue',
|
|
203
|
+
head: 'fix/auth-bug',
|
|
204
|
+
base: 'main'
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// Add a PR comment
|
|
208
|
+
await ghClient.addPRComment({ prNumber: 42, body: 'Looks good!' });
|
|
209
|
+
|
|
210
|
+
// Submit a review
|
|
211
|
+
await ghClient.addPRReview({ prNumber: 42, body: 'LGTM', event: 'APPROVE' });
|
|
212
|
+
|
|
213
|
+
// Close a PR
|
|
214
|
+
await ghClient.closePullRequest({ prNumber: 42 });
|
|
215
|
+
|
|
216
|
+
// Merge a PR
|
|
217
|
+
await ghClient.mergePullRequest({ prNumber: 42, mergeMethod: 'squash' });
|
|
218
|
+
|
|
219
|
+
// Extract webhook data
|
|
220
|
+
const payload = await ghClient.extractWebhookData(webhookRequest);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Methods
|
|
224
|
+
| Method | Description |
|
|
225
|
+
|--------|-------------|
|
|
226
|
+
| `searchPullRequests` | Search PRs by query, state, author, label |
|
|
227
|
+
| `getPullRequest` | Get PR details with files and reviews |
|
|
228
|
+
| `listPullRequests` | List open pull requests |
|
|
229
|
+
| `searchCode` | Search code across repository |
|
|
230
|
+
| `getFileContent` | Get file content by path and ref |
|
|
231
|
+
| `createPullRequest` | Create a new PR |
|
|
232
|
+
| `addPRComment` | Add a comment to a PR |
|
|
233
|
+
| `addPRReview` | Submit a review (APPROVE/REQUEST_CHANGES/COMMENT) |
|
|
234
|
+
| `closePullRequest` | Close a PR |
|
|
235
|
+
| `mergePullRequest` | Merge a PR (merge/squash/rebase) |
|
|
236
|
+
| `extractWebhookData` | Parse GitHub webhook payload |
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Salesforce - `@squidcloud/salesforce-client`
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
import { SquidSalesforceClient } from '@squidcloud/salesforce-client';
|
|
244
|
+
|
|
245
|
+
const sfClient = new SquidSalesforceClient(squid, 'my-salesforce-integration-id');
|
|
246
|
+
|
|
247
|
+
// Opportunities
|
|
248
|
+
const opp = await sfClient.getOpportunity({ opportunityId: '006...' });
|
|
249
|
+
const newOpp = await sfClient.createOpportunity({ name: 'Acme Deal', stageName: 'Prospecting', closeDate: '2025-06-01', amount: 50000 });
|
|
250
|
+
await sfClient.updateOpportunity({ opportunityId: '006...', fields: { stageName: 'Closed Won' } });
|
|
251
|
+
await sfClient.deleteOpportunity({ opportunityId: '006...' });
|
|
252
|
+
const oppFields = await sfClient.describeOpportunity();
|
|
253
|
+
|
|
254
|
+
// Cases
|
|
255
|
+
const case_ = await sfClient.getCase({ caseId: '500...' });
|
|
256
|
+
const newCase = await sfClient.createCase({ subject: 'Login issue', description: 'Cannot log in', priority: 'High' });
|
|
257
|
+
await sfClient.updateCase({ caseId: '500...', fields: { status: 'Closed' } });
|
|
258
|
+
await sfClient.deleteCase({ caseId: '500...' });
|
|
259
|
+
|
|
260
|
+
// Accounts
|
|
261
|
+
const account = await sfClient.getAccount({ accountId: '001...' });
|
|
262
|
+
const newAccount = await sfClient.createAccount({ name: 'Acme Corp', industry: 'Technology' });
|
|
263
|
+
await sfClient.updateAccount({ accountId: '001...', fields: { phone: '555-0100' } });
|
|
264
|
+
await sfClient.deleteAccount({ accountId: '001...' });
|
|
265
|
+
|
|
266
|
+
// Incidents
|
|
267
|
+
const incident = await sfClient.getIncident({ incidentId: '...' });
|
|
268
|
+
const newIncident = await sfClient.createIncident({ subject: 'Outage', description: 'Service down' });
|
|
269
|
+
await sfClient.updateIncident({ incidentId: '...', fields: { status: 'Resolved' } });
|
|
270
|
+
await sfClient.deleteIncident({ incidentId: '...' });
|
|
271
|
+
|
|
272
|
+
// Knowledge Base search
|
|
273
|
+
const kbResults = await sfClient.searchKnowledgeBase({ prompt: 'password reset policy' });
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Methods (per object type: Opportunity, Case, Account, Incident)
|
|
277
|
+
| Method | Description |
|
|
278
|
+
|--------|-------------|
|
|
279
|
+
| `get{Type}` | Get record by ID |
|
|
280
|
+
| `create{Type}` | Create a new record |
|
|
281
|
+
| `update{Type}` | Update record fields |
|
|
282
|
+
| `delete{Type}` | Delete a record |
|
|
283
|
+
| `describe{Type}` | Get field metadata |
|
|
284
|
+
| `searchKnowledgeBase` | Semantic search across knowledge articles |
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Freshdesk - `@squidcloud/freshdesk-client`
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
import { FreshdeskClient } from '@squidcloud/freshdesk-client';
|
|
292
|
+
|
|
293
|
+
const fdClient = new FreshdeskClient(squid, 'my-freshdesk-integration-id');
|
|
294
|
+
|
|
295
|
+
// Search tickets
|
|
296
|
+
const tickets = await fdClient.searchTickets({ query: 'billing issue' });
|
|
297
|
+
|
|
298
|
+
// Get ticket details
|
|
299
|
+
const ticket = await fdClient.getTicketDetails({ ticketId: '12345' });
|
|
300
|
+
|
|
301
|
+
// Create a ticket
|
|
302
|
+
const newTicket = await fdClient.createTicket({
|
|
303
|
+
subject: 'Cannot access account',
|
|
304
|
+
description: 'Getting 403 error',
|
|
305
|
+
email: 'customer@example.com',
|
|
306
|
+
priority: 3 // 1=Low, 2=Medium, 3=High, 4=Urgent
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
// Update a ticket
|
|
310
|
+
await fdClient.updateTicket({ ticketId: '12345', fields: { priority: 4 } });
|
|
311
|
+
|
|
312
|
+
// Reply to a ticket (visible to requester)
|
|
313
|
+
await fdClient.replyToTicket({ ticketId: '12345', body: 'We are looking into this.' });
|
|
314
|
+
|
|
315
|
+
// Add internal note (not visible to requester)
|
|
316
|
+
await fdClient.addNote({ ticketId: '12345', body: 'Escalated to engineering' });
|
|
317
|
+
|
|
318
|
+
// Change status/priority
|
|
319
|
+
await fdClient.changeStatus({ ticketId: '12345', status: 4 }); // 2=Open, 3=Pending, 4=Resolved, 5=Closed
|
|
320
|
+
await fdClient.changePriority({ ticketId: '12345', priority: 2 });
|
|
321
|
+
|
|
322
|
+
// Quick actions
|
|
323
|
+
await fdClient.resolveTicket({ ticketId: '12345' });
|
|
324
|
+
await fdClient.closeTicket({ ticketId: '12345' });
|
|
325
|
+
await fdClient.reopenTicket({ ticketId: '12345' });
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Methods
|
|
329
|
+
| Method | Description |
|
|
330
|
+
|--------|-------------|
|
|
331
|
+
| `searchTickets` | Text search for tickets |
|
|
332
|
+
| `getTicketDetails` | Get full ticket details |
|
|
333
|
+
| `createTicket` | Create a new ticket |
|
|
334
|
+
| `updateTicket` | Update ticket fields |
|
|
335
|
+
| `replyToTicket` | Public reply (visible to requester) |
|
|
336
|
+
| `addNote` | Internal note (not visible to requester) |
|
|
337
|
+
| `changeStatus` | Change ticket status |
|
|
338
|
+
| `changePriority` | Change ticket priority |
|
|
339
|
+
| `resolveTicket` | Set ticket to Resolved |
|
|
340
|
+
| `closeTicket` | Set ticket to Closed |
|
|
341
|
+
| `reopenTicket` | Reopen a closed ticket |
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## HubSpot
|
|
346
|
+
|
|
347
|
+
HubSpot does NOT have a separate client SDK package. Use `squid.executeFunction()`:
|
|
348
|
+
|
|
349
|
+
```typescript
|
|
350
|
+
// Get contact details
|
|
351
|
+
const contact = await squid.executeFunction('getHubSpotContactDetails', contactId, integrationId);
|
|
352
|
+
|
|
353
|
+
// Get company details
|
|
354
|
+
const company = await squid.executeFunction('getHubSpotCompanyDetails', companyId, integrationId);
|
|
355
|
+
|
|
356
|
+
// Search contacts
|
|
357
|
+
const contacts = await squid.executeFunction('searchHubSpotContacts', query, limit, integrationId);
|
|
358
|
+
|
|
359
|
+
// Search companies
|
|
360
|
+
const companies = await squid.executeFunction('searchHubSpotCompanies', query, limit, integrationId);
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## Linear - `@squidcloud/linear-client`
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
import { SquidLinearClient } from '@squidcloud/linear-client';
|
|
369
|
+
|
|
370
|
+
const linearClient = new SquidLinearClient(squid, 'my-linear-integration-id');
|
|
371
|
+
|
|
372
|
+
// Search issues
|
|
373
|
+
const issues = await linearClient.searchIssues({ query: 'login bug', teamId: 'team-1' });
|
|
374
|
+
|
|
375
|
+
// Get issue details
|
|
376
|
+
const issue = await linearClient.getIssue({ issueId: 'LIN-42' });
|
|
377
|
+
|
|
378
|
+
// Create an issue
|
|
379
|
+
const newIssue = await linearClient.createIssue({
|
|
380
|
+
title: 'Fix mobile login',
|
|
381
|
+
description: 'Button not responding on iOS',
|
|
382
|
+
teamId: 'team-1',
|
|
383
|
+
priority: 1
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
// Update an issue
|
|
387
|
+
await linearClient.updateIssue({ issueId: 'LIN-42', fields: { status: 'In Progress' } });
|
|
388
|
+
|
|
389
|
+
// Add a comment
|
|
390
|
+
await linearClient.addComment({ issueId: 'LIN-42', body: 'Reproduced on iOS 17' });
|
|
391
|
+
|
|
392
|
+
// List teams
|
|
393
|
+
const teams = await linearClient.listTeams();
|
|
394
|
+
|
|
395
|
+
// Extract webhook data
|
|
396
|
+
const payload = await linearClient.extractWebhookData(webhookRequest);
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Methods
|
|
400
|
+
| Method | Description |
|
|
401
|
+
|--------|-------------|
|
|
402
|
+
| `searchIssues` | Search issues by text with team/status filters |
|
|
403
|
+
| `getIssue` | Get issue details |
|
|
404
|
+
| `createIssue` | Create a new issue |
|
|
405
|
+
| `updateIssue` | Update issue fields |
|
|
406
|
+
| `addComment` | Add a comment |
|
|
407
|
+
| `listTeams` | List available teams |
|
|
408
|
+
| `extractWebhookData` | Parse Linear webhook payload |
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## Mail - `@squidcloud/mail-client`
|
|
413
|
+
|
|
414
|
+
```typescript
|
|
415
|
+
import { SquidMailClient } from '@squidcloud/mail-client';
|
|
416
|
+
|
|
417
|
+
const mailClient = new SquidMailClient(squid, 'my-mail-integration-id');
|
|
418
|
+
|
|
419
|
+
// Send an email
|
|
420
|
+
await mailClient.sendMail({
|
|
421
|
+
to: 'user@example.com',
|
|
422
|
+
from: 'noreply@company.com', // optional, uses configured default
|
|
423
|
+
subject: 'Welcome!',
|
|
424
|
+
body: '<h1>Welcome to our platform</h1>',
|
|
425
|
+
html: true
|
|
426
|
+
});
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Methods
|
|
430
|
+
| Method | Description |
|
|
431
|
+
|--------|-------------|
|
|
432
|
+
| `sendMail` | Send an email via SMTP (supports HTML) |
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## Google Calendar - `@squidcloud/google-calendar-client`
|
|
437
|
+
|
|
438
|
+
```typescript
|
|
439
|
+
import { SquidGoogleCalendarClient, SCOPES } from '@squidcloud/google-calendar-client';
|
|
440
|
+
|
|
441
|
+
const calClient = new SquidGoogleCalendarClient(squid, 'my-gcal-integration-id');
|
|
442
|
+
|
|
443
|
+
// Save OAuth auth code (first-time setup)
|
|
444
|
+
await calClient.saveAuthCode({ authCode: 'code-from-oauth-flow' });
|
|
445
|
+
|
|
446
|
+
// Get calendar events
|
|
447
|
+
const events = await calClient.getCalendarEvents({
|
|
448
|
+
startDate: '2025-01-01',
|
|
449
|
+
endDate: '2025-01-31',
|
|
450
|
+
maxResults: 50,
|
|
451
|
+
calendarId: 'primary'
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
// Create/update a calendar event
|
|
455
|
+
await calClient.upsertCalendarEvent({
|
|
456
|
+
summary: 'Team Meeting',
|
|
457
|
+
start: '2025-01-15T10:00:00',
|
|
458
|
+
end: '2025-01-15T11:00:00',
|
|
459
|
+
calendarId: 'primary'
|
|
460
|
+
});
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Methods
|
|
464
|
+
| Method | Description |
|
|
465
|
+
|--------|-------------|
|
|
466
|
+
| `saveAuthCode` | Save OAuth authorization code |
|
|
467
|
+
| `getCalendarEvents` | List events in a date range |
|
|
468
|
+
| `upsertCalendarEvent` | Create or update a calendar event |
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## Google Drive - `@squidcloud/google-drive-client`
|
|
473
|
+
|
|
474
|
+
```typescript
|
|
475
|
+
import { GoogleDriveClient, GOOGLE_DRIVE_SCOPES } from '@squidcloud/google-drive-client';
|
|
476
|
+
|
|
477
|
+
const driveClient = new GoogleDriveClient(squid, 'my-gdrive-integration-id');
|
|
478
|
+
|
|
479
|
+
// Save OAuth auth code (first-time setup)
|
|
480
|
+
await driveClient.saveAuthCode({ authCode: 'code-from-oauth-flow' });
|
|
481
|
+
|
|
482
|
+
// List indexed documents
|
|
483
|
+
const docs = await driveClient.listIndexedDocuments({ type: 'document' });
|
|
484
|
+
|
|
485
|
+
// Index a document or folder for semantic search
|
|
486
|
+
await driveClient.indexDocumentOrFolder({ documentId: 'doc-id-123' });
|
|
487
|
+
|
|
488
|
+
// Unindex a document
|
|
489
|
+
await driveClient.unindexDocumentOrFolder({ documentId: 'doc-id-123' });
|
|
490
|
+
|
|
491
|
+
// Extract structured data from a document
|
|
492
|
+
const data = await driveClient.extractDataFromDocument({ documentId: 'doc-id-123', schema: extractionSchema });
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### Methods
|
|
496
|
+
| Method | Description |
|
|
497
|
+
|--------|-------------|
|
|
498
|
+
| `saveAuthCode` | Save OAuth authorization code |
|
|
499
|
+
| `listIndexedDocuments` | List indexed documents with type filter |
|
|
500
|
+
| `indexDocumentOrFolder` | Index a document/folder for search |
|
|
501
|
+
| `unindexDocumentOrFolder` | Remove from search index |
|
|
502
|
+
| `extractDataFromDocument` | Extract structured data from a document |
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
## ServiceNow CSM - `@squidcloud/servicenow_csm-client`
|
|
507
|
+
|
|
508
|
+
```typescript
|
|
509
|
+
import { SquidServiceNowCSMClient } from '@squidcloud/servicenow_csm-client';
|
|
510
|
+
|
|
511
|
+
const snowClient = new SquidServiceNowCSMClient(squid, 'my-servicenow-integration-id');
|
|
512
|
+
|
|
513
|
+
// Get case details
|
|
514
|
+
const case_ = await snowClient.getCase({ caseId: 'CS001234' });
|
|
515
|
+
|
|
516
|
+
// Create a case
|
|
517
|
+
const newCase = await snowClient.createCase({
|
|
518
|
+
short_description: 'Network connectivity issue',
|
|
519
|
+
description: 'Cannot access internal services from office'
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
// Reply to a case
|
|
523
|
+
await snowClient.replyToCase({ caseId: 'CS001234', body: 'Investigating now' });
|
|
524
|
+
|
|
525
|
+
// Search knowledge base
|
|
526
|
+
const articles = await snowClient.searchKnowledgeBase({ prompt: 'VPN setup instructions' });
|
|
527
|
+
|
|
528
|
+
// Search cases
|
|
529
|
+
const cases = await snowClient.searchCases({ query: 'network', state: 'open' });
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### Methods
|
|
533
|
+
| Method | Description |
|
|
534
|
+
|--------|-------------|
|
|
535
|
+
| `getCase` | Get case details |
|
|
536
|
+
| `createCase` | Create a new case |
|
|
537
|
+
| `replyToCase` | Reply to an existing case |
|
|
538
|
+
| `searchKnowledgeBase` | Semantic search in ServiceNow KB |
|
|
539
|
+
| `searchCases` | Search cases by text |
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
## Teams - `@squidcloud/teams-client`
|
|
544
|
+
|
|
545
|
+
```typescript
|
|
546
|
+
import { SquidTeamsClient } from '@squidcloud/teams-client';
|
|
547
|
+
|
|
548
|
+
const teamsClient = new SquidTeamsClient(squid, 'my-teams-integration-id');
|
|
549
|
+
|
|
550
|
+
// Search indexed messages
|
|
551
|
+
const results = await teamsClient.searchMessages({
|
|
552
|
+
prompt: 'product launch discussion',
|
|
553
|
+
teamNames: 'Engineering',
|
|
554
|
+
channelNames: 'general'
|
|
555
|
+
});
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### Methods
|
|
559
|
+
| Method | Description |
|
|
560
|
+
|--------|-------------|
|
|
561
|
+
| `searchMessages` | Semantic search across indexed Teams messages |
|
|
562
|
+
|
|
563
|
+
---
|
|
564
|
+
|
|
565
|
+
## SharePoint - `@squidcloud/sharepoint-client`
|
|
566
|
+
|
|
567
|
+
```typescript
|
|
568
|
+
import { SharePointClient } from '@squidcloud/sharepoint-client';
|
|
569
|
+
|
|
570
|
+
const spClient = new SharePointClient(squid, 'my-sharepoint-integration-id');
|
|
571
|
+
|
|
572
|
+
// List indexed documents
|
|
573
|
+
const docs = await spClient.listIndexedDocuments({ type: 'document' });
|
|
574
|
+
|
|
575
|
+
// Index a document or folder
|
|
576
|
+
await spClient.indexDocumentOrFolder({ documentId: 'doc-id' });
|
|
577
|
+
|
|
578
|
+
// Unindex a document
|
|
579
|
+
await spClient.unindexDocumentOrFolder({ documentId: 'doc-id' });
|
|
580
|
+
|
|
581
|
+
// Extract structured data from a document
|
|
582
|
+
const data = await spClient.extractDataFromDocument({ documentId: 'doc-id', schema: extractionSchema });
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Methods
|
|
586
|
+
| Method | Description |
|
|
587
|
+
|--------|-------------|
|
|
588
|
+
| `listIndexedDocuments` | List indexed SharePoint documents |
|
|
589
|
+
| `indexDocumentOrFolder` | Index a document/folder for search |
|
|
590
|
+
| `unindexDocumentOrFolder` | Remove from search index |
|
|
591
|
+
| `extractDataFromDocument` | Extract structured data from a document |
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
## Summary: Which Connectors Have Client SDKs
|
|
596
|
+
|
|
597
|
+
| Connector | Client SDK Package | Has Client SDK |
|
|
598
|
+
|-----------|-------------------|----------------|
|
|
599
|
+
| Slack | `@squidcloud/slack-client` | Yes |
|
|
600
|
+
| Jira | `@squidcloud/jira-client` | Yes |
|
|
601
|
+
| Jira JSM | `@squidcloud/jira-jsm-client` | Yes |
|
|
602
|
+
| Zendesk | - | No (use executeFunction) |
|
|
603
|
+
| GitHub | `@squidcloud/github-client` | Yes |
|
|
604
|
+
| Salesforce | `@squidcloud/salesforce-client` | Yes |
|
|
605
|
+
| Freshdesk | `@squidcloud/freshdesk-client` | Yes |
|
|
606
|
+
| HubSpot | - | No (use executeFunction) |
|
|
607
|
+
| Linear | `@squidcloud/linear-client` | Yes |
|
|
608
|
+
| Mail | `@squidcloud/mail-client` | Yes |
|
|
609
|
+
| Google Calendar | `@squidcloud/google-calendar-client` | Yes |
|
|
610
|
+
| Google Drive | `@squidcloud/google-drive-client` | Yes |
|
|
611
|
+
| ServiceNow CSM | `@squidcloud/servicenow_csm-client` | Yes |
|
|
612
|
+
| Teams | `@squidcloud/teams-client` | Yes |
|
|
613
|
+
| SharePoint | `@squidcloud/sharepoint-client` | Yes |
|
|
614
|
+
| Confluence | - | No (AI functions only) |
|
|
615
|
+
|
|
616
|
+
For connectors without a client SDK, use `squid.executeFunction('methodName', ...args)` to call the backend executable methods directly.
|