@squidcloud/client 1.0.489 → 1.0.491

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.
@@ -479,8 +479,24 @@ export interface BaseAiChatOptions {
479
479
  legacyKnowledgeBaseContext?: boolean;
480
480
  /** Rewrite prompt for RAG - defaults to false */
481
481
  enablePromptRewriteForRag?: boolean;
482
- /** Whether to include references from the source context in the response. Default to false. */
482
+ /**
483
+ * Whether to include references from the source context in the response. Default to false.
484
+ * @deprecated Use citation instead. Kept for compatibility; renders the legacy Quote/Source format
485
+ * on the legacy upfront-RAG path only.
486
+ */
483
487
  includeReference?: boolean;
488
+ /**
489
+ * When true, the agent cites the sources behind its statements: source name, plus a download link
490
+ * when the agent's stored options set `allowSourceDownloads`. Takes precedence over the deprecated
491
+ * `includeReference`. Default to false.
492
+ */
493
+ citation?: boolean;
494
+ /**
495
+ * Allows citation links to the original source files (presigned, 1h expiry). Honored ONLY from the
496
+ * agent's stored options — the per-request value is ignored, so callers of public agents can never
497
+ * enable downloads. Default to false (citations render source names only).
498
+ */
499
+ allowSourceDownloads?: boolean;
484
500
  /**
485
501
  * The format of the response from the AI model. Defaults to 'text'. A `json_schema` format is
486
502
  * refused for a model whose provider has no way to carry a schema — see
@@ -625,8 +641,21 @@ export interface BaseAiChatOptions {
625
641
  * Files are attached to the conversation and can be read/analyzed by the AI.
626
642
  */
627
643
  fileIds?: string[];
628
- /** Timeout in milliseconds for the entire chat request. Defaults to 240,000 (4 minutes). */
644
+ /**
645
+ * Timeout in milliseconds for one model-call attempt of the chat (a single provider call,
646
+ * covering that call's tool loop). An attempt that produced nothing by this deadline is treated
647
+ * as a stalled provider connection and retried per `retriesOnStall`, each retry getting this
648
+ * full budget again — so the provider phase of a chat may take up to
649
+ * `(1 + retriesOnStall) * timeoutMs` in the worst case. Defaults to 240,000 (4 minutes).
650
+ */
629
651
  timeoutMs?: number;
652
+ /**
653
+ * How many times a stalled model-call attempt is reissued. A retry happens only when the
654
+ * attempt hit `timeoutMs` having produced nothing AND no AI function has executed in the turn,
655
+ * so a retry can never repeat a side effect; aborting the stalled attempt destroys its
656
+ * connection, so the retry cannot reuse it. `0` disables stall retries. Defaults to 1.
657
+ */
658
+ retriesOnStall?: number;
630
659
  /** Maximum number of tool-call iterations the model may perform in a single chat turn. Defaults to 50. */
631
660
  maxToolIterations?: number;
632
661
  }
@@ -673,6 +702,11 @@ export type { CanonicalReasoningEffort } from './ai-common.public-types';
673
702
  * - unknown string the model cannot place on the axis -> dropped, so the model's own default applies,
674
703
  * with a warning;
675
704
  * - model without a reasoning knob -> ignored, with a warning.
705
+ *
706
+ * A model served through an `openai_compatible` integration is the exception: the value is sent to
707
+ * that endpoint exactly as written, with none of the resolution above, since the endpoint's model is
708
+ * the app's own choice and this registry cannot describe it. That is also how to reach a level the
709
+ * canonical set has no name for.
676
710
  * @category AI
677
711
  */
678
712
  export type AiReasoningEffort = CanonicalReasoningEffort | (string & {});
@@ -984,6 +1018,18 @@ export interface BaseUpsertContextStatus {
984
1018
  /** The name of the context item, typically the title or filename. */
985
1019
  name: string;
986
1020
  }
1021
+ /**
1022
+ * An image whose description failed during ingestion: the context is stored without that image's chunk.
1023
+ * @category AI
1024
+ */
1025
+ export interface ContextImageFailure {
1026
+ /** Zero-based index of the page carrying the image. */
1027
+ pageIndex: number;
1028
+ /** Extraction-assigned id of the image within the document. */
1029
+ imageId: string;
1030
+ /** Why describing the image failed. */
1031
+ errorMessage: string;
1032
+ }
987
1033
  /**
988
1034
  * Status of an individual context item after successfully upserting it.
989
1035
  * @category AI
@@ -997,6 +1043,10 @@ export interface UpsertContextStatusSuccess extends BaseUpsertContextStatus {
997
1043
  * surfaced so bulk operations can report which contexts fell outside the graph.
998
1044
  */
999
1045
  graphIndexingSkipped?: boolean;
1046
+ /** First failed images (capped); absent when every image succeeded. `imageFailureCount` is the total. */
1047
+ imageFailures?: Array<ContextImageFailure>;
1048
+ /** Total number of failed images, which exceeds `imageFailures.length` when the list was capped. */
1049
+ imageFailureCount?: number;
1000
1050
  }
1001
1051
  /**
1002
1052
  * Machine-readable code identifying a specific upsert failure reason.
@@ -1042,6 +1092,10 @@ export interface UpsertContextStatusError extends BaseUpsertContextStatus {
1042
1092
  * rejection. `reference`/`folderPath` are present when the existing context carries them.
1043
1093
  */
1044
1094
  duplicateOf?: UpsertContextDuplicateOf;
1095
+ /** First failed images (capped) when every image failed and the document had no text; otherwise absent. */
1096
+ imageFailures?: Array<ContextImageFailure>;
1097
+ /** Total number of failed images, which exceeds `imageFailures.length` when the list was capped. */
1098
+ imageFailureCount?: number;
1045
1099
  }
1046
1100
  /**
1047
1101
  * Status of an individual context item after attempting to upsert it.
@@ -1234,7 +1288,7 @@ export interface UserAiChatOptions extends BaseAiChatOptions {
1234
1288
  export interface UserAiAskResponse {
1235
1289
  /** The response from the AI agent. */
1236
1290
  response?: string;
1237
- /** The number of input tokens used in the request. */
1291
+ /** Prompt tokens used by the request, including any the prompt cache served. */
1238
1292
  inputTokens?: number;
1239
1293
  /** The number of output tokens generated by the AI agent. */
1240
1294
  outputTokens?: number;
@@ -2,7 +2,7 @@ import { UserAiChatModelName } from './backend.public-types';
2
2
  /**
3
3
  * @category AI
4
4
  */
5
- export declare const RERANK_PROVIDERS: readonly ["cohere", "none"];
5
+ export declare const RERANK_PROVIDERS: readonly ["cohere", "voyage", "none"];
6
6
  /**
7
7
  * @category AI
8
8
  */
@@ -41,12 +41,12 @@ export declare function isFileCapableProviderType(type: AiProviderType): type is
41
41
  * Public OpenAI chat model names (active models only).
42
42
  * @category AI
43
43
  */
44
- export declare const OPENAI_CHAT_MODEL_NAMES: readonly ["gpt-5.5-pro", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"];
44
+ export declare const OPENAI_CHAT_MODEL_NAMES: readonly ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-6-astra"];
45
45
  /**
46
46
  * Public Gemini chat model names (active models only).
47
47
  * @category AI
48
48
  */
49
- export declare const GEMINI_CHAT_MODEL_NAMES: readonly ["gemini-3.1-pro", "gemini-3.7-flash", "gemini-3.5-flash-lite"];
49
+ export declare const GEMINI_CHAT_MODEL_NAMES: readonly ["gemini-3.1-pro", "gemini-3.8-flash", "gemini-3.5-flash-lite"];
50
50
  /**
51
51
  * Public Grok chat model names (active models only).
52
52
  * @category AI
@@ -56,12 +56,12 @@ export declare const GROK_CHAT_MODEL_NAMES: readonly ["grok-4.6", "grok-4-1-fast
56
56
  * Public Anthropic chat model names (active models only).
57
57
  * @category AI
58
58
  */
59
- export declare const ANTHROPIC_CHAT_MODEL_NAMES: readonly ["claude-fable-5", "claude-haiku-4-5-20251001", "claude-opus-5", "claude-sonnet-5"];
59
+ export declare const ANTHROPIC_CHAT_MODEL_NAMES: readonly ["claude-fable-5", "claude-fable-5-1", "claude-haiku-4-5-20251001", "claude-opus-5", "claude-sonnet-5"];
60
60
  /**
61
61
  * The supported AI model names.
62
62
  * @category AI
63
63
  */
64
- export declare const VENDOR_AI_CHAT_MODEL_NAMES: readonly ["gpt-5.5-pro", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "claude-fable-5", "claude-haiku-4-5-20251001", "claude-opus-5", "claude-sonnet-5", "gemini-3.1-pro", "gemini-3.7-flash", "gemini-3.5-flash-lite", "grok-4.6", "grok-4-1-fast-reasoning", "grok-4-1-fast-non-reasoning"];
64
+ export declare const VENDOR_AI_CHAT_MODEL_NAMES: readonly ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-6-astra", "claude-fable-5", "claude-fable-5-1", "claude-haiku-4-5-20251001", "claude-opus-5", "claude-sonnet-5", "gemini-3.1-pro", "gemini-3.8-flash", "gemini-3.5-flash-lite", "grok-4.6", "grok-4-1-fast-reasoning", "grok-4-1-fast-non-reasoning"];
65
65
  /** Checks if the given model name is a global AI chat model name. */
66
66
  export declare function isVendorAiChatModelName(modelName: unknown): modelName is VendorAiChatModelName;
67
67
  /**
@@ -71,7 +71,7 @@ export declare const OPENAI_EMBEDDINGS_MODEL_NAMES: readonly ["text-embedding-3-
71
71
  /**
72
72
  * @category AI
73
73
  */
74
- export declare const VOYAGE_EMBEDDING_MODEL_NAMES: readonly ["voyage-3-large"];
74
+ export declare const VOYAGE_EMBEDDING_MODEL_NAMES: readonly ["voyage-3-large", "voyage-4-large", "voyage-4"];
75
75
  /**
76
76
  * @category AI
77
77
  */
@@ -79,7 +79,7 @@ export declare const BEDROCK_EMBEDDING_MODEL_NAMES: readonly ["titan-embed-text-
79
79
  /**
80
80
  * @category AI
81
81
  */
82
- export declare const AI_EMBEDDINGS_MODEL_NAMES: readonly ["text-embedding-3-small", "voyage-3-large", "titan-embed-text-v2"];
82
+ export declare const AI_EMBEDDINGS_MODEL_NAMES: readonly ["text-embedding-3-small", "voyage-3-large", "voyage-4-large", "voyage-4", "titan-embed-text-v2"];
83
83
  /**
84
84
  * Checks if the given model name is a valid AI embeddings model name.
85
85
  * @category AI
@@ -1,4 +1,4 @@
1
- import { AgentContextRequest, AiChatModelSelection, UpsertContextStatusError } from './ai-agent.public-types';
1
+ import { AgentContextRequest, AiChatModelSelection, AiReasoningEffort, ContextImageFailure, UpsertContextStatusError } from './ai-agent.public-types';
2
2
  import { AiEmbeddingsModelSelection, AiRerankProvider } from './ai-common.public-types';
3
3
  import { AiContextId, AiKnowledgeBaseId, AppId } from './communication.public-types';
4
4
  import { DocumentExtractionMethod } from './extraction.public-types';
@@ -44,8 +44,8 @@ export interface AiKnowledgeBase {
44
44
  graphRag?: AiKnowledgeBaseGraphConfig;
45
45
  /**
46
46
  * Default RAG strategy for newly ingested contexts; a per-request `options.ragType` overrides it.
47
- * Omitted ⇒ the server default (`'basic'`). Changing it affects future ingests only — existing chunks
48
- * are not re-processed.
47
+ * Omitted ⇒ the server default (`'contextual'`). Changing it affects future ingests only — existing
48
+ * chunks are not re-processed.
49
49
  */
50
50
  ragType?: AiRagType;
51
51
  /**
@@ -54,9 +54,56 @@ export interface AiKnowledgeBase {
54
54
  * store. Under the combined-ingest strategy this stays ≈0 — growth is a visible fallback-rate signal.
55
55
  */
56
56
  contextualIngestUsage?: KnowledgeBaseGraphUsage;
57
+ /**
58
+ * Per-caller access control over retrieval. Omitted ⇒ `'none'`: stored scopes are ignored and every
59
+ * caller sees every chunk.
60
+ */
61
+ accessControl?: AiKnowledgeBaseAccessControl;
57
62
  /** The timestamp the knowledge base was last updated */
58
63
  updatedAt: Date;
59
64
  }
65
+ /**
66
+ * The access-control modes a knowledge base can be in. See {@link AiKnowledgeBaseAccessControl}.
67
+ * @category AI
68
+ */
69
+ export declare const AI_KB_ACCESS_CONTROL_MODES: readonly ["none", "enforced"];
70
+ /**
71
+ * A knowledge base access-control mode. See {@link AI_KB_ACCESS_CONTROL_MODES}.
72
+ * @category AI
73
+ */
74
+ export type AiKnowledgeBaseAccessControlMode = (typeof AI_KB_ACCESS_CONTROL_MODES)[number];
75
+ /**
76
+ * Restricts what a search returns to the content its caller is entitled to.
77
+ *
78
+ * Under `'enforced'`, every chunk carries the access scopes of the context it came from, the caller is
79
+ * resolved to the scopes they hold, and the two are intersected inside the vector query — so a caller
80
+ * never retrieves a chunk they hold no scope for. A chunk stamped as public is visible to everyone; a
81
+ * chunk with no scopes at all (ingested before access control was enabled) is visible to no one.
82
+ *
83
+ * Enforcement covers retrieval channels that can apply the scope predicate. The raw-text scan (`grep`)
84
+ * and knowledge-graph (`queryGraph`, `searchMode: 'graph'`) channels read stores that carry no scopes,
85
+ * so an enforced knowledge base refuses them rather than answering unfiltered.
86
+ *
87
+ * Mutable, but enabling it on a populated knowledge base hides everything already ingested until those
88
+ * contexts are re-ingested with scopes.
89
+ *
90
+ * @category AI
91
+ */
92
+ export interface AiKnowledgeBaseAccessControl {
93
+ /** `'none'` (the default) ignores stored scopes entirely; `'enforced'` intersects them per caller. */
94
+ mode: AiKnowledgeBaseAccessControlMode;
95
+ /**
96
+ * The backend function that resolves a caller into the access scopes they hold, as
97
+ * `'ServiceName:functionName'`. It runs once per search, receives a `ResolveKbScopesContext` and
98
+ * returns the scopes as an array of strings. Required under `'enforced'`.
99
+ *
100
+ * An `'enforced'` knowledge base whose function is not deployed fails every search rather than
101
+ * falling back to an unfiltered one.
102
+ *
103
+ * @pattern ^[^:]+:[^:]+$
104
+ */
105
+ scopeResolver?: string;
106
+ }
60
107
  /**
61
108
  * Represents a field in an AI knowledge base metadata.
62
109
  */
@@ -225,6 +272,13 @@ export interface AiKnowledgeBaseGraphPathFacetConfig {
225
272
  /** Path segment separator. Defaults to `'/'`. */
226
273
  separator?: string;
227
274
  }
275
+ /**
276
+ * The canonical declaration of {@link FOLDER_PATH_METADATA_FIELD_NAME}, shared by every writer that
277
+ * declares it on a knowledge base. `llmExtraction` is off, so a missing folder path stays absent
278
+ * instead of being guessed from document content.
279
+ * @category AI
280
+ */
281
+ export declare const FOLDER_PATH_METADATA_FIELD: AiKnowledgeBaseMetadataField;
228
282
  /** A single entity surfaced in a graph search's {@link AiKnowledgeBaseGraphContext}. @category AI */
229
283
  export interface AiKnowledgeBaseGraphContextEntity {
230
284
  /** Canonical display name of the entity. */
@@ -271,6 +325,11 @@ export interface AiKnowledgeBaseChatOptions {
271
325
  includeMetadata?: boolean;
272
326
  /** Which provider's reranker to use for reranking the context. Defaults to 'cohere'. */
273
327
  rerankProvider?: AiRerankProvider;
328
+ /**
329
+ * Minimum reranker relevance score a chunk must reach to stay once at least 10 chunks are already kept.
330
+ * Defaults to 0.2. Lets an eval tune the drop threshold per reranker, whose score ranges differ.
331
+ */
332
+ rerankScoreThreshold?: number;
274
333
  /** The maximum number of results to return. Defaults to 30 */
275
334
  limit?: number;
276
335
  /** How many chunks to look over. Defaults to 100 */
@@ -452,6 +511,18 @@ export interface BaseAiKnowledgeBaseContextRequest {
452
511
  type: AiKnowledgeBaseContextType;
453
512
  /** Optional metadata associated with the context item. */
454
513
  metadata?: AiContextMetadata;
514
+ /**
515
+ * Access scopes granting read access to this context, stamped onto every chunk it produces. Only
516
+ * meaningful on a knowledge base with `accessControl.mode: 'enforced'`, where a caller retrieves the
517
+ * context only if they hold at least one of these scopes.
518
+ *
519
+ * Supplied here rather than through a follow-up call so a restricted context is never briefly
520
+ * readable by everyone between being indexed and being scoped. Omitted on a re-ingest keeps whatever
521
+ * scopes the context already had; an empty array makes it visible to every caller.
522
+ *
523
+ * Scopes are opaque strings the resolver and the ingest side agree on. The `__` prefix is reserved.
524
+ */
525
+ scopes?: Array<string>;
455
526
  }
456
527
  /**
457
528
  * Base options for upserting text content into the AI agent's context.
@@ -571,6 +642,34 @@ export interface AiKnowledgeBaseFileContextRequest extends BaseAiKnowledgeBaseCo
571
642
  * @category AI
572
643
  */
573
644
  export declare const BULK_INGESTION_MAX_MULTIPART_FILE_BYTES: number;
645
+ /**
646
+ * Largest single file the platform's upload endpoints accept, per file: the multer limit core applies
647
+ * to every file-upload route (`COMMON_FILE_UPLOAD_OPTIONS`). By definition it also caps a bulk-ingestion
648
+ * source object, whichever way its bytes arrive: core re-enforces it on every staged object — rejecting
649
+ * the whole staging batch with the oversized object — so a staging caller pre-parks larger files.
650
+ * @category AI
651
+ */
652
+ export declare const MAX_UPLOAD_FILE_BYTES: number;
653
+ /**
654
+ * Embedding models the bulk-ingestion (batch embeddings) lane admits. A model needs a provider batch
655
+ * adapter to be listed here, but an adapter alone is not enough: a route is listed only once every core
656
+ * pod can take it, because a pod on an older image routes a job it cannot place to the wrong provider.
657
+ * This list IS that switch — adding a model here opens its route everywhere at once.
658
+ *
659
+ * Public and shared deliberately: `bulkUpsertContexts` answers a batch-transport job on any other model
660
+ * with a 501, but `createBulkUploadUrls` resolves no base at all, so a caller that stages before it upserts
661
+ * learns of the refusal only once the bytes are already uploaded. A caller that knows this bound can check
662
+ * the base up front and refuse the request instead — which only works while this list says what the
663
+ * deployment will really take. A base on an unlisted model keeps ingesting on the sync transport.
664
+ * @category AI
665
+ */
666
+ export declare const BULK_INGESTION_EMBEDDING_MODELS: readonly ["text-embedding-3-small", "voyage-3-large", "voyage-4-large", "voyage-4"];
667
+ /**
668
+ * Whether `model` is one of {@link BULK_INGESTION_EMBEDDING_MODELS}. Takes any embedding model selection
669
+ * (an integration-backed model spec is an object and is never supported).
670
+ * @category AI
671
+ */
672
+ export declare function isBulkIngestionEmbeddingModel(model: unknown): model is (typeof BULK_INGESTION_EMBEDDING_MODELS)[number];
574
673
  /**
575
674
  * @category AI
576
675
  */
@@ -600,6 +699,11 @@ export interface AiKnowledgeBaseSearchOptions {
600
699
  limit?: number;
601
700
  /** Which provider's reranker to use for reranking the context. Defaults to 'cohere'. */
602
701
  rerankProvider?: AiRerankProvider;
702
+ /**
703
+ * Minimum reranker relevance score a chunk must reach to stay once at least 10 chunks are already kept.
704
+ * Defaults to 0.2. Lets an eval tune the drop threshold per reranker, whose score ranges differ.
705
+ */
706
+ rerankScoreThreshold?: number;
603
707
  /** How many chunks to look over. Defaults to 100 */
604
708
  chunkLimit?: number;
605
709
  /** Which chat model to use when asking the question */
@@ -668,6 +772,25 @@ export interface UpsertKnowledgeBaseContextResponse {
668
772
  * singular counterpart of {@link UpsertKnowledgeBaseContextsResponse.graphIndexingSkippedContextIds}.
669
773
  */
670
774
  graphIndexingSkipped?: boolean;
775
+ /**
776
+ * First images (capped) the context lacks a description for because describing them failed; the context
777
+ * is otherwise fully ingested. Absent when every image succeeded. `imageFailureCount` is the total.
778
+ */
779
+ imageFailures?: Array<ContextImageFailure>;
780
+ /** Total number of failed images, which exceeds `imageFailures.length` when the list was capped. */
781
+ imageFailureCount?: number;
782
+ }
783
+ /**
784
+ * The failed images of one context in a multi-context upsert.
785
+ * @category AI
786
+ */
787
+ export interface UpsertContextImageFailures {
788
+ /** The context the images belong to. */
789
+ contextId: AiContextId;
790
+ /** First failed images (capped); `imageFailureCount` is the total. */
791
+ imageFailures: Array<ContextImageFailure>;
792
+ /** Total number of failed images, which exceeds `imageFailures.length` when the list was capped. */
793
+ imageFailureCount: number;
671
794
  }
672
795
  /**
673
796
  * Response structure for upserting contexts for an AiKnowledgeBase
@@ -692,6 +815,12 @@ export interface UpsertKnowledgeBaseContextsResponse {
692
815
  * caller can report the graph-coverage gap. Absent/empty when nothing was skipped or graph is disabled.
693
816
  */
694
817
  graphIndexingSkippedContextIds?: Array<AiContextId>;
818
+ /**
819
+ * Per stored context, the images that lack a description because describing them failed; each such
820
+ * context is otherwise fully ingested. A context that failed outright lists its images on its entry in
821
+ * `failures` instead. Absent when every image succeeded.
822
+ */
823
+ imageFailures?: Array<UpsertContextImageFailures>;
695
824
  }
696
825
  /**
697
826
  * Request structure for searching an AiKnowledgeBase
@@ -848,6 +977,11 @@ export interface BaseAiKnowledgeBaseSearchContextsRequest {
848
977
  rerank?: boolean;
849
978
  /** Which chat model to use when doing reranking */
850
979
  chatModel?: AiChatModelSelection;
980
+ /**
981
+ * Reasoning effort of the reranking model. A score needs little thought, so `'low'` is the usual
982
+ * choice; when unset the model applies its own default.
983
+ */
984
+ rerankReasoningEffort?: AiReasoningEffort;
851
985
  }
852
986
  /**
853
987
  * Request structure for searching AI contexts in the AiKnowledgeBase with prompt.
@@ -1099,6 +1233,14 @@ export interface GetKnowledgeBaseGraphStatusResponse {
1099
1233
  * is pending. Recomputed per poll — it moves forward while ingest activity continues.
1100
1234
  */
1101
1235
  nextAutoBuildAt?: number;
1236
+ /**
1237
+ * True when graph-scoped search (`graphFilter.underConcept`) runs on the index-native denormalized
1238
+ * `conceptIds` pre-filter: the backend's search indexes serve the field AND the chunk copies are in
1239
+ * sync with the doc nodes. False while either half is not ready (index still building, or a rebuild
1240
+ * is in flight — a rebuild drops the sync gate for its duration); scoped search then uses the
1241
+ * capped contextId-closure fallback. Absent when GraphRAG is disabled.
1242
+ */
1243
+ conceptScopeReady?: boolean;
1102
1244
  }
1103
1245
  /** The most recent graph backfill/rebuild job of a knowledge base. @category AI */
1104
1246
  export interface KnowledgeBaseGraphBuildJob {
@@ -1291,6 +1433,8 @@ export interface KnowledgeBaseGraphTopic {
1291
1433
  parentId?: string;
1292
1434
  /** Documents under the topic, when tracked. */
1293
1435
  docCount?: number;
1436
+ /** Members of the topic: entities at level 0, child topics at higher levels. */
1437
+ memberCount?: number;
1294
1438
  }
1295
1439
  /**
1296
1440
  * An aggregated relationship edge between two leaf topics: how many entity relationships cross
@@ -1359,6 +1503,8 @@ export interface KnowledgeBaseGraphQueryMatch {
1359
1503
  description?: string;
1360
1504
  /** Documents under the node, where tracked (topics and facet nodes). */
1361
1505
  docCount?: number;
1506
+ /** Topics: members of the node (entities at level 0, child topics at higher levels). */
1507
+ memberCount?: number;
1362
1508
  }
1363
1509
  /** A node in a `subtree` response: the resolved node with its children, recursively. @category AI */
1364
1510
  export interface KnowledgeBaseGraphQuerySubtreeNode {
@@ -1463,6 +1609,16 @@ export interface QueryKnowledgeBaseGraphResponse {
1463
1609
  * @category AI
1464
1610
  */
1465
1611
  export interface BulkIngestionContext {
1612
+ /**
1613
+ * The id of the context. Optional: when omitted, the server generates one and rejects the upload if
1614
+ * another context in the knowledge base already holds identical content (content-level dedup). Provide
1615
+ * an explicit id to address a specific context — that overwrites it unconditionally and allows duplicate
1616
+ * content across different ids, exactly as the synchronous `upsertContexts` treats a supplied id. Must
1617
+ * be unique within one request (each staged context becomes one per-file row keyed by this id), at most
1618
+ * 512 UTF-8 bytes of letters, digits, `_`, `.`, `:`, `@` or `-` only, and the overwrite lands
1619
+ * asynchronously when the job finalizes the file.
1620
+ */
1621
+ contextId?: AiContextId;
1466
1622
  /** `'text'` (the default) stages a text context; `'file'` consumes the next uploaded file positionally. */
1467
1623
  type?: 'text' | 'file';
1468
1624
  /** Title for a text context (required); optional display title for a file context. */
@@ -1489,6 +1645,14 @@ export interface BulkIngestionContext {
1489
1645
  * knowledge base's `metadataFields` schema when one is declared.
1490
1646
  */
1491
1647
  metadata?: Record<string, unknown>;
1648
+ /**
1649
+ * Access scopes granting read access to this context, stamped onto every chunk it produces when the
1650
+ * job finalizes; mirrors {@link BaseAiKnowledgeBaseContextRequest.scopes}, with the same semantics:
1651
+ * omitted keeps whatever scopes the context already had, an empty array makes it visible to every
1652
+ * caller. On a knowledge base with `accessControl.mode: 'enforced'`, a context whose scopes resolve
1653
+ * to nothing at finalize is stamped unreadable rather than public.
1654
+ */
1655
+ scopes?: Array<string>;
1492
1656
  }
1493
1657
  /**
1494
1658
  * Request structure for staging contexts through bulk ingestion: a durable, asynchronous lane that
@@ -1575,6 +1739,41 @@ export interface BulkIngestionFileStatus {
1575
1739
  * Additive; absent for ordinary failures.
1576
1740
  */
1577
1741
  errorCode?: 'DUPLICATE_CONTENT';
1742
+ /**
1743
+ * First images (capped) the context lacks a description for because describing them failed; a
1744
+ * `completed` file is otherwise fully ingested. Absent when every image succeeded.
1745
+ */
1746
+ imageFailures?: Array<ContextImageFailure>;
1747
+ /** Total number of failed images, which exceeds `imageFailures.length` when the list was capped. */
1748
+ imageFailureCount?: number;
1749
+ }
1750
+ /**
1751
+ * One provider batch created for a bulk-ingestion job, so a caller can tell a job waiting on a
1752
+ * submitted provider batch (healthy — the designed cost/latency tradeoff of the batch lane, with
1753
+ * turnaround up to 24 hours) from a job that is actually stuck, and see since when.
1754
+ * @category AI
1755
+ */
1756
+ export interface BulkIngestionProviderBatchStatus {
1757
+ /** The provider running the batch. Mirrors the core batch row's union, like {@link state}. */
1758
+ provider: 'openai' | 'anthropic' | 'mistral' | 'voyage';
1759
+ /** The provider API the batch rides. Mirrors the core batch row's union, like {@link state}. */
1760
+ endpoint: '/v1/embeddings' | '/v1/messages/batches' | '/v1/chat/completions' | '/v1/ocr';
1761
+ /**
1762
+ * The batch's lifecycle state: `intent` (created, not yet submitted), `submitted` (waiting on the
1763
+ * provider), `ended` (provider finished, results not yet absorbed), or terminal
1764
+ * (`reconciled`/`cancelled`/`failed`).
1765
+ */
1766
+ state: 'intent' | 'submitted' | 'ended' | 'reconciled' | 'cancelled' | 'failed';
1767
+ /** The provider's own batch id; absent until the batch is submitted. */
1768
+ providerBatchId?: string;
1769
+ /** When the batch was created — the "since when has this been waiting" clock for an in-flight batch. */
1770
+ createdAt: Date;
1771
+ /**
1772
+ * When the batch row was last written. NOT a state-transition time: the poller refreshes it on every
1773
+ * poll of an in-flight batch, so on a healthy job it is always recent — it freezing means polling
1774
+ * stopped, not that the batch is waiting. Read wait duration off {@link createdAt}.
1775
+ */
1776
+ updatedAt: Date;
1578
1777
  }
1579
1778
  /**
1580
1779
  * Response describing a bulk-ingestion job's current state and progress counts.
@@ -1583,10 +1782,55 @@ export interface BulkIngestionFileStatus {
1583
1782
  export interface BulkIngestionJobStatusResponse {
1584
1783
  /** The job's lifecycle state (e.g. running, completed, failed, cancelled). */
1585
1784
  state: string;
1785
+ /**
1786
+ * The job's execution transport: `'batch'` rides provider batches (half price, tails up to 24
1787
+ * hours), `'sync'` executes inline within minutes. Decided at staging from the job's size, with one
1788
+ * transition — a defer-eligible job whose OCR routing lands on the provider batch is promoted
1789
+ * `'sync'` to `'batch'` — and held from then on. Descriptive metadata ONLY: it says how the job
1790
+ * runs, never whether a batch is draining right now, so it must not gate any wait/timeout policy;
1791
+ * that is {@link activeProviderBatchCount}. Optional on the wire: consumers must tolerate its
1792
+ * absence.
1793
+ */
1794
+ transport?: 'batch' | 'sync';
1795
+ /**
1796
+ * The lanes a `'batch'` job ROUTES inline — at the synchronous price, within minutes — rather than onto a
1797
+ * provider batch: `embeddings`, whose batches are too small for the discount to beat the queue tail.
1798
+ * Absent when every lane batches, and on a `'sync'` job (every lane of which runs inline). The job's
1799
+ * routing policy, not a record of what ran: a lane handed to the inline transport by a cancelled
1800
+ * provider-batch tail executes inline without being named here. Descriptive metadata, like {@link transport}.
1801
+ */
1802
+ inlineLanes?: Array<'embeddings' | 'imageDescription' | 'spreadsheetSummary' | 'metadataExtraction'>;
1586
1803
  /** Progress counters aggregated from the job's files and logical requests. */
1587
1804
  counts: BulkIngestionJobStatusCounts;
1588
- /** Provider batch ids submitted for this job. */
1805
+ /** Provider batch ids created for this job, across every batch state — including already-drained ones. */
1589
1806
  providerBatchIds: Array<string>;
1807
+ /**
1808
+ * Number of provider batches still in flight (created, submitted, or awaiting result reconciliation).
1809
+ * THE deferral signal: work is draining through a provider batch right now exactly when this is
1810
+ * positive — unlike {@link providerBatchIds}, which keeps terminal batches, and unlike
1811
+ * {@link transport}, which is descriptive metadata. Optional on the wire: consumers must tolerate
1812
+ * its absence.
1813
+ */
1814
+ activeProviderBatchCount?: number;
1815
+ /**
1816
+ * Per-batch detail for every provider batch of the job, so a caller can tell a healthy wait on a
1817
+ * submitted provider batch from a stall — and see since when. A SUPERSET of
1818
+ * {@link providerBatchIds}, not index-aligned with it: an `intent` batch appears here with no
1819
+ * `providerBatchId` while that list omits it. Optional on the wire: consumers must tolerate its
1820
+ * absence.
1821
+ */
1822
+ providerBatches?: Array<BulkIngestionProviderBatchStatus>;
1823
+ /**
1824
+ * Coarse answer to "what is this job doing right now": `awaiting-provider-batch` while the
1825
+ * PROVIDER is working — an `intent` or `submitted` batch (deferred OCR included; it wins whatever stage the
1826
+ * files carry) or batch-route work still queued for submission — `extracting` while files still
1827
+ * await or undergo extraction with no submitted batch, and `indexing` otherwise (inline/flex
1828
+ * requests executing, `ended` batches' results being absorbed, contexts being written — our own
1829
+ * work, however long it takes). Present only while the job {@link state} is `running`; the other
1830
+ * non-terminal states (`finalizing`, `cancelling`) already name what the job is doing. Optional on
1831
+ * the wire: consumers must tolerate its absence.
1832
+ */
1833
+ phase?: 'extracting' | 'awaiting-provider-batch' | 'indexing';
1590
1834
  /** Per-file status, one entry per staged context (bounded by the job's file cap). */
1591
1835
  files: Array<BulkIngestionFileStatus>;
1592
1836
  }
@@ -4,7 +4,7 @@
4
4
  * 'CONNECTOR_PACKAGES_TO_EXCLUDE_FROM_AUTO_SYNC' in ConnectorsService (console-backend).
5
5
  * @category Platform
6
6
  */
7
- export declare const CONNECTOR_IDS: readonly ["bitbucket", "confluence", "cotomi", "essentials", "freshdesk", "github", "google_calendar", "google_drive", "hubspot", "sharepoint", "jira", "jira_jsm", "linear", "mail", "onedrive", "outlook", "salesforce", "servicenow_csm", "slack", "teams", "ticketmind_companion", "zendesk"];
7
+ export declare const CONNECTOR_IDS: readonly ["bitbucket", "confluence", "cotomi", "essentials", "freshdesk", "generic_site_ingester", "github", "google_calendar", "google_drive", "hubspot", "sharepoint", "jira", "jira_jsm", "linear", "mail", "onedrive", "outlook", "salesforce", "servicenow_csm", "slack", "teams", "ticketmind_companion", "zendesk"];
8
8
  /**
9
9
  * Unique connector package name.
10
10
  * @category Platform
@@ -1,7 +1,12 @@
1
1
  /**
2
2
  * The extraction method to use for processing documents.
3
+ *
4
+ * `legacy` extracts text and embedded images in-process without any external model call.
5
+ * `legacy_with_llm` extracts the same text, and additionally renders each page to a screenshot that is
6
+ * described by a vision model — covering content the text layer cannot carry (figures, layout, scanned
7
+ * regions) at the cost of one model call per page. Both run with no external OCR provider.
3
8
  */
4
- export type DocumentExtractionMethod = 'mistral_ocr' | 'legacy' | 'amazon_textract' | 'azure_document_intelligence';
9
+ export type DocumentExtractionMethod = 'mistral_ocr' | 'legacy' | 'legacy_with_llm' | 'amazon_textract' | 'azure_document_intelligence';
5
10
  /**
6
11
  * Options for customizing how data is extracted from a document.
7
12
  */
@@ -82,6 +87,10 @@ export interface ExtractDataFromDocumentFileRequest {
82
87
  */
83
88
  options?: ExtractDataFromDocumentOptions;
84
89
  }
90
+ /**
91
+ * What an extracted image depicts: an image embedded in the page, or a full-page screenshot.
92
+ */
93
+ export type ExtractedImageKind = 'embedded' | 'fullPage';
85
94
  /**
86
95
  * Representation of an image extracted from a document, for use in generated content.
87
96
  */
@@ -98,6 +107,11 @@ export interface ExtractDataFromDocumentImage {
98
107
  * The base64-encoded image data, prefixed with its MIME type (e.g., data:image/png;base64,...).
99
108
  */
100
109
  imageBase64Url: string;
110
+ /**
111
+ * What the image depicts. Absent means `embedded`. Selects the description prompt — a page
112
+ * screenshot is described as a complement to the page's stored text, an embedded image in full.
113
+ */
114
+ kind?: ExtractedImageKind;
101
115
  }
102
116
  /**
103
117
  * A single extracted page from the document, including structured content and images.
@@ -1,6 +1,6 @@
1
1
  import { IntegrationId } from './communication.public-types';
2
2
  /** List of all integration types supported by Squid. */
3
- export declare const INTEGRATION_TYPES: readonly ["active_directory", "ai_agents", "ai_chatbot", "algolia", "alloydb", "api", "auth0", "bedrock", "azure_blob", "azure_cosmosdb", "azure_postgresql", "azure_sql", "bigquery", "bitbucket", "built_in_azure_blob", "built_in_db", "built_in_gcs", "built_in_queue", "built_in_s3", "cassandra", "clickhouse", "cloudsql", "cockroach", "cognito", "connected_knowledgebases", "confluence", "confluent", "datadog", "db2", "descope", "documentdb", "azure-entra-external-id", "dynamodb", "elasticsearch", "firebase_auth", "firestore", "gcs", "github", "google_calendar", "google_docs", "google_drive", "graphql", "hubspot", "jira", "jira_jsm", "jwt_hmac", "jwt_rsa", "kafka", "keycloak", "linear", "mariadb", "monday", "mongo", "mssql", "databricks", "mysql", "newrelic", "okta", "onedrive", "outlook", "oracledb", "pinecone", "postgres", "redis", "s3", "salesforce", "sap_hana", "sentry", "snowflake", "spanner", "xata", "zendesk", "servicenow_csm", "freshdesk", "mail", "slack", "mcp", "a2a", "legend", "teams", "openai_compatible", "openai_compatible_embedding", "sharepoint", "vertex"];
3
+ export declare const INTEGRATION_TYPES: readonly ["active_directory", "ai_agents", "ai_chatbot", "algolia", "alloydb", "api", "auth0", "bedrock", "azure_blob", "azure_cosmosdb", "azure_postgresql", "azure_sql", "bigquery", "bitbucket", "built_in_azure_blob", "built_in_db", "built_in_gcs", "built_in_queue", "built_in_s3", "cassandra", "clickhouse", "cloudsql", "cockroach", "cognito", "connected_knowledgebases", "confluence", "confluent", "datadog", "db2", "descope", "documentdb", "azure-entra-external-id", "azure-entra-id", "dynamodb", "elasticsearch", "firebase_auth", "firestore", "gcs", "generic_site_ingester", "github", "google_calendar", "google_docs", "google_drive", "graphql", "hubspot", "jira", "jira_jsm", "jwt_hmac", "jwt_rsa", "kafka", "keycloak", "linear", "mariadb", "monday", "mongo", "mssql", "databricks", "mysql", "newrelic", "okta", "onedrive", "outlook", "oracledb", "pinecone", "postgres", "redis", "s3", "salesforce", "sap_hana", "sentry", "snowflake", "spanner", "xata", "zendesk", "servicenow_csm", "freshdesk", "mail", "slack", "mcp", "a2a", "legend", "teams", "openai_compatible", "openai_compatible_embedding", "sharepoint", "vertex"];
4
4
  /**
5
5
  * @category Database
6
6
  */
@@ -8,7 +8,7 @@ export declare const DATA_INTEGRATION_TYPES: readonly ["bigquery", "built_in_db"
8
8
  /**
9
9
  * @category Auth
10
10
  */
11
- export declare const AUTH_INTEGRATION_TYPES: readonly ["auth0", "jwt_rsa", "jwt_hmac", "cognito", "okta", "keycloak", "descope", "firebase_auth", "azure-entra-external-id"];
11
+ export declare const AUTH_INTEGRATION_TYPES: readonly ["auth0", "jwt_rsa", "jwt_hmac", "cognito", "okta", "keycloak", "descope", "firebase_auth", "azure-entra-external-id", "azure-entra-id"];
12
12
  /**
13
13
  * Auth integration types that can OAuth-protect an MCP server (see `McpOAuthOptions` and
14
14
  * `AiAgentMcpServerConfig.oauthIntegrationId`). Kept in sync with the providers supported by the
@@ -48,9 +48,17 @@ export interface IntegrationInfo<ConfigurationType = Record<string, any> | undef
48
48
  creationDate?: Date;
49
49
  /** The date when the integration was last updated. */
50
50
  updateDate?: Date;
51
+ /**
52
+ * When false, the integration is disabled: runtime access is rejected and sync jobs skip it.
53
+ * Absent means enabled on create; an update that omits it keeps the stored value, so re-enabling
54
+ * requires an explicit `enabled: true`.
55
+ */
56
+ enabled?: boolean | null;
51
57
  /** The configuration object for the integration, if any. */
52
58
  configuration: ConfigurationType;
53
59
  }
60
+ /** Returns true when the integration is explicitly disabled. An absent or null `enabled` means enabled. */
61
+ export declare function isIntegrationDisabled(integration: Pick<IntegrationInfo, 'enabled'>): boolean;
54
62
  /** Integration IDs used for built-in integrations by Squid. */
55
63
  export declare const SQUID_BUILT_IN_INTEGRATION_IDS: readonly [string, string, string];
56
64
  /** Returns true if ID is a built-in integration ID in Squid. */