@squidcloud/cli 1.0.459 → 1.0.461

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.
@@ -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.