@squidcloud/cli 1.0.487 → 1.0.489

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 CHANGED
@@ -32174,7 +32174,8 @@ module.exports = function toBuffer(data, encoding) {
32174
32174
  var __webpack_unused_export__;
32175
32175
 
32176
32176
  __webpack_unused_export__ = ({ value: true });
32177
- __webpack_unused_export__ = __webpack_unused_export__ = __webpack_unused_export__ = __webpack_unused_export__ = __webpack_unused_export__ = exports.h3 = exports.VF = __webpack_unused_export__ = exports.F3 = exports.eS = exports.Eh = exports.dH = exports.mz = exports.Pq = exports.lZ = exports.I1 = exports.xV = exports.Kq = exports.oL = exports.hp = exports.AI_PROVIDER_TYPES = __webpack_unused_export__ = void 0;
32177
+ __webpack_unused_export__ = __webpack_unused_export__ = __webpack_unused_export__ = __webpack_unused_export__ = __webpack_unused_export__ = exports.h3 = exports.VF = __webpack_unused_export__ = exports.F3 = exports.eS = exports.Eh = exports.dH = exports.mz = exports.Pq = exports.lZ = exports.I1 = exports.xV = exports.Kq = exports.oL = exports.hp = exports.MD = exports.AI_PROVIDER_TYPES = __webpack_unused_export__ = void 0;
32178
+ __webpack_unused_export__ = isFileCapableProviderType;
32178
32179
  __webpack_unused_export__ = isVendorAiChatModelName;
32179
32180
  __webpack_unused_export__ = isAiEmbeddingsModelName;
32180
32181
  __webpack_unused_export__ = isIntegrationEmbeddingModelSpec;
@@ -32204,29 +32205,40 @@ exports.AI_PROVIDER_TYPES = [
32204
32205
  'vertex',
32205
32206
  'external', // This is a technicality, referring to user-defined providers.
32206
32207
  ];
32208
+ /**
32209
+ * The AI providers that support file upload operations, and so are the only ones that resolve a
32210
+ * pre-uploaded file id. Declared as the list, with the type derived from it, so the two cannot drift:
32211
+ * a provider added to one is added to both.
32212
+ */
32213
+ exports.MD = [
32214
+ 'openai',
32215
+ 'gemini',
32216
+ 'anthropic',
32217
+ 'grok',
32218
+ ];
32219
+ /**
32220
+ * True when the provider resolves pre-uploaded file ids. Every other provider — the integration-backed
32221
+ * and user-defined ones, which report no vendor identity of their own — ignores `fileIds` outright, so
32222
+ * for them the ids are inert rather than wrong.
32223
+ */
32224
+ function isFileCapableProviderType(type) {
32225
+ return exports.MD.includes(type);
32226
+ }
32207
32227
  /**
32208
32228
  * Public OpenAI chat model names (active models only).
32209
32229
  * @category AI
32210
32230
  */
32211
- exports.hp = [
32212
- 'gpt-5.4-mini',
32213
- 'gpt-5.4-nano',
32214
- 'gpt-5.5',
32215
- 'gpt-5.5-pro',
32216
- 'gpt-5.6-sol',
32217
- 'gpt-5.6-terra',
32218
- 'gpt-5.6-luna',
32219
- ];
32231
+ exports.hp = ['gpt-5.5-pro', 'gpt-5.6-sol', 'gpt-5.6-terra', 'gpt-5.6-luna'];
32220
32232
  /**
32221
32233
  * Public Gemini chat model names (active models only).
32222
32234
  * @category AI
32223
32235
  */
32224
- exports.oL = ['gemini-3.1-pro', 'gemini-3.6-flash', 'gemini-3.5-flash-lite'];
32236
+ exports.oL = ['gemini-3.1-pro', 'gemini-3.7-flash', 'gemini-3.5-flash-lite'];
32225
32237
  /**
32226
32238
  * Public Grok chat model names (active models only).
32227
32239
  * @category AI
32228
32240
  */
32229
- exports.Kq = ['grok-4.5', 'grok-4-1-fast-reasoning', 'grok-4-1-fast-non-reasoning'];
32241
+ exports.Kq = ['grok-4.6', 'grok-4-1-fast-reasoning', 'grok-4-1-fast-non-reasoning'];
32230
32242
  /**
32231
32243
  * Public Anthropic chat model names (active models only).
32232
32244
  * @category AI
@@ -34735,7 +34747,24 @@ onStagingStarted) {
34735
34747
  activeJobIds.add(jobId);
34736
34748
  const { finalStatus, timedOut } = await waitForJobCompletion(client, jobId, batchLabel, timeoutMillis, isInterrupted);
34737
34749
  activeJobIds.delete(jobId);
34738
- return { batchIndex, batchCount, jobId, uploadFailures, duplicates, finalStatus, timedOut };
34750
+ // A duplicate found by the deferred extraction pass (a presigned object's bytes are first hashed
34751
+ // there) reports as a failed file with `errorCode: 'DUPLICATE_CONTENT'` — the same skip a
34752
+ // staging-time rejection is, so fold it into the duplicates the summary reconciles by name.
34753
+ const deferredDuplicates = (finalStatus?.files ?? [])
34754
+ .filter(file => file.errorCode === 'DUPLICATE_CONTENT')
34755
+ .map(file => file.title);
34756
+ if (deferredDuplicates.length > 0) {
34757
+ console.log(`${batchLabel}: ${deferredDuplicates.length} file(s) skipped as content this knowledge base already holds.`);
34758
+ }
34759
+ return {
34760
+ batchIndex,
34761
+ batchCount,
34762
+ jobId,
34763
+ uploadFailures,
34764
+ duplicates: [...duplicates, ...deferredDuplicates],
34765
+ finalStatus,
34766
+ timedOut,
34767
+ };
34739
34768
  }
34740
34769
  /** Mints presigned upload URLs for a batch, chunking requests to the server's per-call cap. */
34741
34770
  async function createUploadUrlsForBatch(client, fileNames) {
@@ -34832,7 +34861,13 @@ async function cancelActiveJobs(client, activeJobIds) {
34832
34861
  }
34833
34862
  function printProgress(batchLabel, jobId, status) {
34834
34863
  const { counts, state } = status;
34835
- const line = `${batchLabel} job ${jobId}: ${counts.finalized}/${counts.files} finalized, ${counts.failed} failed, state=${state}`;
34864
+ // Deferred duplicates sit inside counts.failed but are skips to the caller (see printSummary) — shown
34865
+ // raw, the live line says "1 failed" on a job the summary then reports as 0 failed, 1 skipped.
34866
+ const duplicateSkips = status.files.filter(file => file.errorCode === 'DUPLICATE_CONTENT').length;
34867
+ const failed = Math.max(0, counts.failed - duplicateSkips);
34868
+ const skippedPart = duplicateSkips > 0 ? `, ${duplicateSkips} skipped` : '';
34869
+ const line = `${batchLabel} job ${jobId}: ${counts.finalized}/${counts.files} finalized, ` +
34870
+ `${failed} failed${skippedPart}, state=${state}`;
34836
34871
  process.stdout.write(`\r${line}${' '.repeat(Math.max(0, PROGRESS_LINE_WIDTH - line.length))}`);
34837
34872
  }
34838
34873
  /** Narrows a `FileUploadResult` to one that uploaded successfully (has a `stagedObjectKey`, no `error`). */
@@ -34855,7 +34890,13 @@ async function printDryRun(dir, files, batchSize) {
34855
34890
  }
34856
34891
  function printSummary(totalFiles, results) {
34857
34892
  const totalFinalized = results.reduce((sum, result) => sum + (result.finalStatus?.counts.finalized ?? 0), 0);
34858
- const totalServerFailed = results.reduce((sum, result) => sum + (result.finalStatus?.counts.failed ?? 0), 0);
34893
+ // Deferred duplicates sit inside counts.failed but are reported on the "Skipped as duplicate" line
34894
+ // (runBatch folds them into `duplicates`), so subtract them here or the two lines double-count.
34895
+ const totalServerFailed = results.reduce((sum, result) => {
34896
+ const failed = result.finalStatus?.counts.failed ?? 0;
34897
+ const duplicateFailures = (result.finalStatus?.files ?? []).filter(file => file.errorCode === 'DUPLICATE_CONTENT').length;
34898
+ return sum + Math.max(0, failed - duplicateFailures);
34899
+ }, 0);
34859
34900
  const totalUploadFailed = results.reduce((sum, result) => sum + result.uploadFailures.length, 0);
34860
34901
  const totalDuplicates = results.reduce((sum, result) => sum + result.duplicates.length, 0);
34861
34902
  const totalStagedButFailed = results.reduce((sum, result) => sum + (result.stagingError ? (result.stagedCount ?? 0) : 0), 0);
@@ -34890,9 +34931,15 @@ function printSummary(totalFiles, results) {
34890
34931
  const state = result.timedOut
34891
34932
  ? `${result.finalStatus?.state ?? 'unknown'} (timed out waiting)`
34892
34933
  : result.finalStatus?.state;
34893
- console.log(` ${label}: job ${result.jobId} ${result.finalStatus?.counts.finalized ?? 0}/${result.finalStatus?.counts.files ?? 0} finalized, ${result.finalStatus?.counts.failed ?? 0} failed [${state}]`);
34934
+ // Deferred duplicates are excluded from BOTH the failed count and the per-file failure lines: they
34935
+ // are already named on the "skipped" lines below, and a clean idempotent re-run must not read as
34936
+ // "0/1 finalized, 1 failed" while exiting 0 — the CLI tells one story about a skip.
34937
+ const deferredDuplicateCount = result.finalStatus?.files.filter(file => file.errorCode === 'DUPLICATE_CONTENT').length ?? 0;
34938
+ const failedCount = Math.max(0, (result.finalStatus?.counts.failed ?? 0) - deferredDuplicateCount);
34939
+ console.log(` ${label}: job ${result.jobId} — ${result.finalStatus?.counts.finalized ?? 0}/${result.finalStatus?.counts.files ?? 0} finalized, ${failedCount} failed [${state}]`);
34894
34940
  // Per-file failure reasons, straight from the job-status response (BulkIngestionFileStatus).
34895
- const failedFiles = result.finalStatus?.files.filter(file => file.status === 'failed') ?? [];
34941
+ const failedFiles = result.finalStatus?.files.filter(file => file.status === 'failed' && file.errorCode !== 'DUPLICATE_CONTENT') ??
34942
+ [];
34896
34943
  for (const failedFile of failedFiles) {
34897
34944
  console.log(` - ${failedFile.title}: ${failedFile.errorMessage ?? 'unknown error'}`);
34898
34945
  }
@@ -34908,7 +34955,10 @@ function hasBatchFailed(result) {
34908
34955
  return true;
34909
34956
  if (!result.finalStatus)
34910
34957
  return true;
34911
- return result.finalStatus.state !== 'completed' || result.finalStatus.counts.failed > 0;
34958
+ // Deferred duplicates are skips, not failures: an idempotent re-run over an already-ingested
34959
+ // directory must exit 0, exactly as it does when staging rejects the duplicates synchronously.
34960
+ const duplicateFailures = result.finalStatus.files.filter(file => file.errorCode === 'DUPLICATE_CONTENT').length;
34961
+ return result.finalStatus.state !== 'completed' || result.finalStatus.counts.failed > duplicateFailures;
34912
34962
  }
34913
34963
  /** Recursively walks `dir`, skipping symlinks and dotfiles/dot-directories, filtered to `extensions`. */
34914
34964
  async function collectFiles(dir, extensions) {
@@ -40729,7 +40779,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"name":"seek-bzip","version":"1.0.6",
40729
40779
  (module) {
40730
40780
 
40731
40781
  "use strict";
40732
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@squidcloud/cli","version":"1.0.487","description":"The Squid CLI","main":"dist/index.js","scripts":{"start":"node dist/index.js","start-ts":"ts-node -r tsconfig-paths/register src/index.ts","prebuild":"rimraf dist","build":"webpack --mode=production","build:dev":"webpack --mode=development","lint":"eslint","link":"npm run build && chmod 755 dist/index.js && npm link","watch":"webpack --watch","deploy":"npm run build && npm pack --silent | xargs -I {} mv {} package.tgz && npm install -g package.tgz && rm -rf package.tgz","publish:public":"npm run build && npm publish --access public"},"files":["dist/**/*"],"bin":{"squid":"dist/index.js"},"keywords":[],"author":"","license":"ISC","engines":{"node":">=18.0.0"},"dependencies":{"@squidcloud/local-backend":"^1.0.487","adm-zip":"^0.5.16","copy-webpack-plugin":"^14.0.0","decompress":"^4.2.1","logpipes":"^1.11.0","nodemon":"^3.1.9","terser-webpack-plugin":"^5.5.0","ts-loader":"^9.5.1","ts-node":"^10.9.2","tsconfig-paths":"^4.2.0","tsconfig-paths-webpack-plugin":"^4.1.0","webpack":"^5.106.2","zip-webpack-plugin":"^4.0.1"},"devDependencies":{"@types/adm-zip":"^0.5.7","@types/decompress":"^4.2.7","terminal-link":"^3.0.0"}}');
40782
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@squidcloud/cli","version":"1.0.489","description":"The Squid CLI","main":"dist/index.js","scripts":{"start":"node dist/index.js","start-ts":"ts-node -r tsconfig-paths/register src/index.ts","prebuild":"rimraf dist","build":"webpack --mode=production","build:dev":"webpack --mode=development","lint":"eslint","link":"npm run build && chmod 755 dist/index.js && npm link","watch":"webpack --watch","deploy":"npm run build && npm pack --silent | xargs -I {} mv {} package.tgz && npm install -g package.tgz && rm -rf package.tgz","publish:public":"npm run build && npm publish --access public"},"files":["dist/**/*"],"bin":{"squid":"dist/index.js"},"keywords":[],"author":"","license":"ISC","engines":{"node":">=18.0.0"},"dependencies":{"@squidcloud/local-backend":"^1.0.489","adm-zip":"^0.5.16","copy-webpack-plugin":"^14.0.0","decompress":"^4.2.1","logpipes":"^1.11.0","nodemon":"^3.1.9","terser-webpack-plugin":"^5.5.0","ts-loader":"^9.5.1","ts-node":"^10.9.2","tsconfig-paths":"^4.2.0","tsconfig-paths-webpack-plugin":"^4.1.0","webpack":"^5.106.2","zip-webpack-plugin":"^4.0.1"},"devDependencies":{"@types/adm-zip":"^0.5.7","@types/decompress":"^4.2.7","terminal-link":"^3.0.0"}}');
40733
40783
 
40734
40784
  /***/ }
40735
40785
 
@@ -21,15 +21,15 @@ Squid is a backend-as-a-service platform that provides:
21
21
 
22
22
  ## Feature-Specific Guidance
23
23
 
24
- - **[client.md](reference/client.md)** → client SDK, initialization, setup, auth, login, tokens, OAuth, appId, region, environmentId, apiKey, authProvider, getToken, setAuthProvider, Squid client, frontend, collection, executeFunction, executeFunctionWithHeaders, getWebhookUrl, externalAuth, saveAuthCode, getAccessToken, storage, uploadFile, downloadUrl, queues, produce, consume, distributed locks, acquireLock, withLock, web, aiSearch, getUrlContent, createShortUrl, jobs, getJob, awaitJob, observability, metrics, reportMetric, queryMetrics, notifications, publishNotification, observeNotifications
25
- - **[console.md](reference/console.md)** → Squid Console, web UI, organizations, applications, AI Studio, knowledge bases, integrations, monitoring, logs, API keys, secrets, testing, debugging, profile settings, management API keys
26
- - **[ai.md](reference/ai.md)** → AI agents, chat, ask, askWithAnnotations, askAsync, askWithVoiceResponse, transcribeAndChat, transcribeAndAsk, knowledge bases, RAG, embeddings, image generation, audio, transcription, text-to-speech, TTS, connectedAgents, connectedIntegrations, connectedKnowledgeBases, @aiFunction, @secureAiAgent, @secureAiQuery, memory, memoryOptions, voiceOptions, OpenAI, Anthropic, Gemini, Grok, DALL-E, Whisper, MCP, @mcpServer, @mcpTool, executeAiQuery, executeAiApiCall, extraction, createPdf, upsert agent, listAgents, spreadsheet understanding, querySpreadsheetsWithAi, searchMode, keyword search, xlsx, csv
24
+ - **[client.md](reference/client.md)** → client SDK, initialization, setup, auth, login, tokens, OAuth, appId, region, environmentId, apiKey, authProvider, getToken, setAuthProvider, Squid client, frontend, collection, executeFunction, executeFunctionWithHeaders, getWebhookUrl, externalAuth, saveAuthCode, getAccessToken, storage, uploadFile, downloadUrl, queues, produce, consume, distributed locks, acquireLock, withLock, web, aiSearch, allowedDomains, getUrlContent, createShortUrl, jobs, getJob, awaitJob, startJob, completeJob, failJob, events, squid.events(), emit, TriggerEvent, LangGraph, squid.langGraph(), invoke, invokeAsync, resume, getState, deleteThread, observability, metrics, reportMetric, queryMetrics, setMetricAnnotations, notifications, publishNotification, observeNotifications
25
+ - **[console.md](reference/console.md)** → Squid Console, web UI, organizations, applications, AI Studio, knowledge bases, knowledge graph toggle, integrations, monitoring, logs, API keys, secrets, testing, debugging, profile settings, management API keys
26
+ - **[ai.md](reference/ai.md)** → AI agents, chat, ask, askWithAnnotations, askAsync, askWithVoiceResponse, transcribeAndChat, transcribeAndAsk, knowledge bases, RAG, embeddings, image generation, audio, transcription, text-to-speech, TTS, connectedAgents, connectedIntegrations, connectedKnowledgeBases, @aiFunction, @secureAiAgent, @secureAiQuery, memory, memoryOptions, metricAnnotations, voiceOptions, OpenAI, Anthropic, Gemini, Grok, DALL-E, Whisper, MCP, @mcpServer, @mcpTool, agent as MCP server, updateMcpServer, generateMcpDescriptions, agent API key, executeAiQuery, executeAiApiCall, extraction, createPdf, upsert agent, listAgents, listChatModels, listFunctions, spreadsheet understanding, querySpreadsheetsWithAi, searchMode, keyword search, xlsx, csv, grep, literal scan, knowledge graph, GraphRAG, graphRag, graph search, queryGraph, getGraphStatus, rebuildGraph, exploreGraph, searchWithGraphContext, graphOptions, graphFilter, underConcept, entityTypes, queryKnowledgeGraph, bulk ingestion, bulkUpsertContexts, createBulkUploadUrls, observeBulkIngestionJob, listContextsPage, generateMetadataFieldDescriptions
27
27
  - **[chat-widget.md](reference/chat-widget.md)** → AI chat widget, @squidcloud/react-chat-widget, squid-chat-widget, squid-chat-widget-with-fab-button, embeddable chat, custom API webhook, AI query mode, chain-of-thought, status updates, session management, agentContext, memoryOptions, squid-ai-custom-api-url, squid-ai-agent-chat-options, FAB button, theming, CSS variables, localization, RTL, menu items slots, suggested prompts, voice transcription, error formatting, authentication, squid-auth-provider, onChange events
28
- - **[databases.md](reference/databases.md)** → collections, documents, queries, subscriptions, snapshots, insert, update, delete, CRUD, real-time, dereference, pagination, transactions, query operators, eq, neq, gt, gte, lt, lte, like, in, nin, arrayIncludesSome, arrayIncludesAll, sortBy, limit, join queries, OR queries, @trigger, native queries, SQL, MongoDB, Elasticsearch, incrementInPath, decrementInPath, watch changes, doc(), projectFields, field projection, __docId__, __id
29
- - **[backend.md](reference/backend.md)** → SquidService, @executable, @webhook, @trigger, TriggerRequest, @scheduler, @limits, rate limiting, quotas, decorators, backend functions, WebhookRequest, CronExpression, cron, file handling, SquidFile, getUserAuth, isAuthenticated, assertIsAuthenticated, createWebhookResponse, this.squid, this.secrets, @clientConnectionStateHandler, @onQueueMessage, QueueMessageRequest, queue message handler, server-side queue consumer, CLI, squid init, squid start, squid deploy, squid build, project structure, multiple services, service architecture, squidInject, cross-service communication
30
- - **[security.md](reference/security.md)** → security rules, @secureDatabase, @secureCollection, @secureTopic, @secureStorage, @secureApi, @secureNativeQuery, @secureAiQuery, @secureAiAgent, @secureDistributedLock, @secureGraphQL, QueryContext, MutationContext, isSubqueryOf, affectsPath, permissions, authorization, row-level security, role-based access
31
- - **[admin.md](reference/admin.md)** → ManagementClient, management API keys, organizations, applications, programmatic management, CI/CD, automation, integrations admin, secrets admin, upsertIntegration, discoverDataConnectionSchema, testDataConnection, createOrganization, createApplication
32
- - **[api.md](reference/api.md)** → API, REST API, HTTP endpoints, API reference, Agent API, AI Audio API, AI Image API, KnowledgeBase API, Matchmaking API, Web Utilities API, Database API, Extraction API
28
+ - **[databases.md](reference/databases.md)** → collections, documents, queries, subscriptions, snapshots, insert, update, delete, CRUD, real-time, dereference, pagination, transactions, query operators, eq, neq, gt, gte, lt, lte, like, in, nin, arrayIncludesSome, arrayIncludesAll, sortBy, limit, join queries, OR queries, @trigger, native queries, SQL, MongoDB, Elasticsearch, incrementInPath, decrementInPath, watch changes, doc(), docId, docIds, query.delete(), delete by query, projectFields, field projection, __docId__, __id
29
+ - **[backend.md](reference/backend.md)** → SquidService, @executable, @webhook, @trigger, TriggerRequest, @scheduler, @limits, rate limiting, quotas, decorators, backend functions, WebhookRequest, CronExpression, cron, file handling, SquidFile, getUserAuth, isAuthenticated, assertIsAuthenticated, createWebhookResponse, this.squid, getSquid, getPassiveSquid, this.secrets, @clientConnectionStateHandler, @onQueueMessage, QueueMessageRequest, queue message handler, server-side queue consumer, @eventHandler, event handler, workspace, CLI, squid init, squid start, squid deploy, squid build, squid kb-upload, printBundle, project structure, multiple services, service architecture, squidInject, cross-service communication
30
+ - **[security.md](reference/security.md)** → security rules, @secureDatabase, @secureCollection, @publicCollection, public read, @secureTopic, @secureStorage, @secureApi, @secureNativeQuery, @secureAiQuery, @secureAiAgent, @secureLangGraph, @secureDistributedLock, @secureGraphQL, QueryContext, MutationContext, SecureLangGraphContext, isSubqueryOf, affectsPath, permissions, authorization, row-level security, role-based access
31
+ - **[admin.md](reference/admin.md)** → ManagementClient, management API keys, organizations, applications, programmatic management, CI/CD, automation, integrations admin, secrets admin, connectors admin, squid.admin().connectors(), attach connector, appConnectors, upsertIntegration, discoverDataConnectionSchema, testDataConnection, createOrganization, createApplication
32
+ - **[api.md](reference/api.md)** → API, REST API, HTTP endpoints, API reference, Agent API, AiSettings API, AiFunction API, AI Audio API, AI Image API, KnowledgeBase API, Matchmaking API, Web Utilities API, Database API, Extraction API, apiKeyAuth, agentApiKeyAuth, x-squid-agent-api-key, memoryOptions, memoryId, memoryMode
33
33
  - **[openai.md](reference/openai.md)** → OpenAI, code interpreter, verbosity, reasoning models, o1, o3, gpt-5, DALL-E, Whisper, TTS, voice options, structured output, file upload
34
34
  - **[connectors.md](reference/connectors.md)** → connectors, integrations, IntegrationType, postgres, mongo, auth0, s3, kafka, salesforce, essentials connector, built-in connector, @squidcloud/slack-client, @squidcloud/jira-client, @squidcloud/github-client, @squidcloud/salesforce-client, @squidcloud/freshdesk-client, @squidcloud/linear-client, @squidcloud/mail-client, @squidcloud/google-calendar-client, @squidcloud/google-drive-client, @squidcloud/teams-client, @squidcloud/sharepoint-client, @squidcloud/servicenow_csm-client, @squidcloud/jira-jsm-client, SquidSlackClient, SquidJiraClient, SquidGitHubClient, sendMail, sendMessage, searchIssues, createIssue, connector SDK
35
35
  - **Integrations** → See `squid-integrations` skill for full catalog, connector AI functions, SDK methods, and configuration
@@ -5,6 +5,7 @@ This document covers programmatic management of Squid organizations, application
5
5
  ## Contents
6
6
  - ManagementClient
7
7
  - Admin Integrations
8
+ - Admin Connectors
8
9
  - Admin Secrets
9
10
 
10
11
  ## ManagementClient
@@ -204,6 +205,35 @@ const openApiSchema = await integrations.discoverOpenApiSchema('my-api', {
204
205
  const fileSchema = await integrations.discoverOpenApiSchemaFromFile('my-api');
205
206
  ```
206
207
 
208
+ ### Admin - Connectors
209
+
210
+ Attach and detach **app-level (integration-less) connectors**. Unlike integrations, these carry no
211
+ per-connector configuration record — attaching one adds it to the application's `appConnectors` list
212
+ and (re)deploys its bundle. Any configuration the connector needs comes in out of band, e.g. via
213
+ application secrets.
214
+
215
+ ```typescript
216
+ const connectors = squid.admin().connectors();
217
+
218
+ // List the connectors explicitly attached to the app
219
+ const attached = await connectors.list(); // Array<ConnectorId>
220
+
221
+ // Attach (idempotent - attaching an already-attached connector is a no-op)
222
+ await connectors.connect('slack');
223
+
224
+ // Detach
225
+ await connectors.disconnect('slack');
226
+ ```
227
+
228
+ `ConnectorId` is one of: `bitbucket`, `confluence`, `cotomi`, `essentials`, `freshdesk`, `github`,
229
+ `google_calendar`, `google_drive`, `hubspot`, `sharepoint`, `jira`, `jira_jsm`, `linear`, `mail`,
230
+ `onedrive`, `outlook`, `salesforce`, `servicenow_csm`, `slack`, `teams`, `ticketmind_companion`,
231
+ `zendesk`.
232
+
233
+ **Connectors vs integrations:** use `squid.admin().integrations()` when the connection needs
234
+ configuration (credentials, a connection string, an OAuth app). Use `connectors()` for connectors the
235
+ app just needs turned on.
236
+
207
237
  ### Admin - Secrets
208
238
 
209
239
  ```typescript