@opengeni/documents 0.5.41 → 0.6.9-canary.0

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.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { Settings } from "@opengeni/config";
2
- import { type AddDocumentRequest, CreateDocumentBaseRequest, Document, DocumentAuthorityKind, DocumentBase, DocumentCurationStatus, DocumentSearchMode, DocumentSearchResult, DocumentStatus, DocumentVisibility, FileAsset, KnowledgeBrowseResponse, KnowledgeRecord, KnowledgeSearchResponse, KnowledgeSourceKind, ListIndexedDocumentsResponse } from "@opengeni/contracts";
2
+ import { type AddDocumentRequest, CreateDocumentBaseRequest, Document, DocumentAuthorityKind, DocumentBase, DocumentCurationStatus, DocumentSearchMode, DocumentSearchResult, DocumentStatus, DocumentVisibility, FileAsset, KnowledgeBrowseResponse, KnowledgeRecord, KnowledgeSearchResponse, KnowledgeSourceKind, ListIndexedDocumentsResponse, type ReclassifyDocumentAuthorityRequest, type RunDocumentDefaultCollectionBackfillRequest } from "@opengeni/contracts";
3
3
  import { type Database } from "@opengeni/db";
4
- import type { ObjectStorage } from "@opengeni/storage";
4
+ import { type ObjectStorage } from "@opengeni/storage";
5
5
  export { projectKnowledgeRecord } from "./knowledge-projection.js";
6
6
  export declare const DEFAULT_DOCUMENT_PARSER = "liteparse";
7
7
  export declare const DEFAULT_DOCUMENT_EMBEDDING_MODEL = "text-embedding-3-large";
@@ -84,12 +84,43 @@ export type DocumentAccessFilter = {
84
84
  * only when the agent carries the creating subject as its viewer subject.
85
85
  */
86
86
  agentOnly?: boolean | undefined;
87
+ /** Exact attempt whose grant snapshot must be revalidated in the content query. */
88
+ authorizedPersonalAttempt?: {
89
+ accountId: string;
90
+ workspaceId: string;
91
+ sessionId: string;
92
+ attemptId: string;
93
+ } | undefined;
87
94
  };
88
95
  export type DocumentAuthority = {
89
96
  kind: DocumentAuthorityKind;
90
97
  workspaceId: string | null;
91
98
  subjectId: string | null;
92
99
  };
100
+ /** JSON-safe projection of the opaque capability minted by the API access layer. */
101
+ export type DocumentAccountAdminAuthorization = Readonly<{
102
+ authorizationId: string;
103
+ accountId: string;
104
+ actorSubjectId: string;
105
+ permission: "account:admin";
106
+ }>;
107
+ export type ReclassifyDocumentAuthorityInput = ReclassifyDocumentAuthorityRequest & {
108
+ accountId: string;
109
+ workspaceId: string;
110
+ documentId: string;
111
+ actorSubjectId: string;
112
+ accountAdminAuthorization: DocumentAccountAdminAuthorization | null;
113
+ };
114
+ export type RunDocumentDefaultCollectionBackfillInput = RunDocumentDefaultCollectionBackfillRequest & {
115
+ accountId: string;
116
+ workspaceId: string;
117
+ actorSubjectId: string;
118
+ accountAdminAuthorization: DocumentAccountAdminAuthorization;
119
+ };
120
+ export type AgentDocumentAuthorityContext = {
121
+ sessionId: string;
122
+ attemptId: string;
123
+ };
93
124
  export type DocumentInventoryStatusCounts = Record<DocumentStatus, number>;
94
125
  export type DocumentInventorySourceKindCounts = Record<KnowledgeSourceKind, number>;
95
126
  export type DocumentInventoryAuthorityKindCounts = Record<DocumentAuthorityKind, number>;
@@ -135,6 +166,7 @@ export type EffectiveDocumentSearchInput = Omit<DocumentSearchInput, "access"> &
135
166
  initiatingSubjectId: string;
136
167
  /** Agent retrieval additionally enforces documents.agent_access. */
137
168
  surface: "human" | "agent";
169
+ agentAuthority?: AgentDocumentAuthorityContext | undefined;
138
170
  };
139
171
  export type ListEffectiveIndexedDocumentsInput = {
140
172
  accountId: string;
@@ -143,18 +175,22 @@ export type ListEffectiveIndexedDocumentsInput = {
143
175
  initiatingSubjectId: string;
144
176
  checkpoint?: string | undefined;
145
177
  limit?: number | undefined;
178
+ agentAuthority?: AgentDocumentAuthorityContext | undefined;
146
179
  };
147
180
  export type EffectiveKnowledgeBrowseInput = {
148
181
  accountId: string;
149
182
  workspaceId: string;
150
183
  /** Immutable human subject accepted for the logical request/turn. */
151
184
  initiatingSubjectId: string;
185
+ /** Human inspection bypasses agent_access but still uses exact subject/RLS authority. */
186
+ surface?: "human" | "agent" | undefined;
152
187
  /** Omit to browse top-level documents; pass a document record id for chunks. */
153
188
  parentId?: string | undefined;
154
189
  topic?: string | undefined;
155
190
  sourceKinds?: KnowledgeSourceKind[] | undefined;
156
191
  cursor?: string | undefined;
157
192
  limit?: number | undefined;
193
+ agentAuthority?: AgentDocumentAuthorityContext | undefined;
158
194
  };
159
195
  export type DocumentIndexHooks = {
160
196
  beforeEmbed?: (input: {
@@ -275,6 +311,61 @@ export declare function listDocumentBasesEnsuringDefault(db: Database, input: {
275
311
  accountId: string;
276
312
  workspaceId: string;
277
313
  }): Promise<DocumentBase[]>;
314
+ export declare function runDocumentDefaultCollectionBackfill(db: Database, input: RunDocumentDefaultCollectionBackfillInput): Promise<{
315
+ runId: string;
316
+ operationId: string;
317
+ status: "completed" | "running";
318
+ lastWorkspaceId: string | null;
319
+ processedCount: number;
320
+ createdCount: number;
321
+ adoptedCount: number;
322
+ completedAt: string | null;
323
+ }>;
324
+ export declare function reclassifyDocumentAuthority(db: Database, input: ReclassifyDocumentAuthorityInput): Promise<{
325
+ operationId: string;
326
+ documentId: string;
327
+ previousAuthority: {
328
+ kind: "organization" | "personal" | "workspace";
329
+ workspaceId: string | null;
330
+ subjectId: string | null;
331
+ authorityId: string | null;
332
+ };
333
+ authority: {
334
+ kind: "organization" | "personal" | "workspace";
335
+ workspaceId: string | null;
336
+ subjectId: string | null;
337
+ authorityId: string | null;
338
+ };
339
+ createdAt: string;
340
+ }>;
341
+ export declare function listDocumentAuthorityReclassifications(db: Database, input: {
342
+ accountId: string;
343
+ workspaceId: string;
344
+ documentId: string;
345
+ actorSubjectId: string;
346
+ limit?: number | undefined;
347
+ cursor?: string | undefined;
348
+ }): Promise<{
349
+ receipts: {
350
+ operationId: string;
351
+ documentId: string;
352
+ previousAuthority: {
353
+ kind: "organization" | "personal" | "workspace";
354
+ workspaceId: string | null;
355
+ subjectId: string | null;
356
+ authorityId: string | null;
357
+ };
358
+ authority: {
359
+ kind: "organization" | "personal" | "workspace";
360
+ workspaceId: string | null;
361
+ subjectId: string | null;
362
+ authorityId: string | null;
363
+ };
364
+ createdAt: string;
365
+ }[];
366
+ hasMore: boolean;
367
+ nextCursor: string | null;
368
+ }>;
278
369
  export declare function addDocumentToBase(db: Database, input: AddDocumentRequest & {
279
370
  accountId: string;
280
371
  workspaceId: string;
@@ -308,6 +399,14 @@ export declare function deleteDocumentFromBase(db: Database, input: {
308
399
  access?: DocumentAccessFilter | undefined;
309
400
  }): Promise<void>;
310
401
  export declare function listDocuments(db: Database, workspaceId: string, baseId: string, access?: DocumentAccessFilter): Promise<Document[]>;
402
+ /**
403
+ * List Documents the human can discover and manage from the requested
404
+ * workspace. Organization Documents are account-wide, workspace Documents are
405
+ * local, activated organization-user Documents are portable across the owner's
406
+ * same-organization workspaces, and legacy personal rows remain anchored to
407
+ * their ingestion workspace through documentAccessConditions.
408
+ */
409
+ export declare function listAccessibleDocuments(db: Database, workspaceId: string, access: DocumentAccessFilter): Promise<Document[]>;
311
410
  /**
312
411
  * List newly ready documents in the same effective scope used by agent
313
412
  * retrieval. The opaque checkpoint is bound to the account, requesting
@@ -327,6 +426,17 @@ export declare function decodeDocumentIndexCheckpoint(value: string, scope: {
327
426
  initiatingSubjectId: string;
328
427
  }): bigint;
329
428
  export declare function getDocument(db: Database, workspaceId: string, documentId: string, access?: DocumentAccessFilter): Promise<Document | null>;
429
+ /**
430
+ * Resolve the immutable source file through Document authority in the requested
431
+ * workspace. The file remains physically owned by its ingestion workspace;
432
+ * callers never gain generic access to that workspace's file inventory.
433
+ */
434
+ export declare function getDocumentOriginalFile(db: Database, input: {
435
+ accountId: string;
436
+ workspaceId: string;
437
+ documentId: string;
438
+ access: DocumentAccessFilter;
439
+ }): Promise<FileAsset | null>;
330
440
  /**
331
441
  * Internal ingestion-only read used after the worker has independently resolved
332
442
  * and fenced the immutable document authority tuple. It deliberately does not
@@ -338,6 +448,14 @@ export declare function getDocumentForIndexing(db: Database, workspaceId: string
338
448
  export declare function queueDocumentForReindex(db: Database, workspaceId: string, documentId: string, access?: DocumentAccessFilter, organizationAuthorityGranted?: boolean): Promise<Document>;
339
449
  export declare function indexDocumentNow(db: Database, objectStorage: ObjectStorage, workspaceId: string, documentId: string, services?: DocumentServices, hooks?: DocumentIndexHooks, access?: DocumentAccessFilter): Promise<Document>;
340
450
  export declare function searchDocuments(db: Database, input: DocumentSearchInput, services?: Pick<DocumentServices, "embedder">): Promise<DocumentSearchResult[]>;
451
+ export type DocumentCandidateRelevanceFloor = {
452
+ vectorScore: number;
453
+ keywordScore: number;
454
+ };
455
+ export declare function selectDocumentSearchCandidateWindow(merged: DocumentSearchResult[], limit: number, relevanceFloor?: DocumentCandidateRelevanceFloor): {
456
+ results: DocumentSearchResult[];
457
+ belowRelevanceFloor: number;
458
+ };
341
459
  /**
342
460
  * Canonical effective retrieval composition for API, SDK, and MCP surfaces.
343
461
  * Callers supply the already-authorized immutable initiating subject; no
@@ -351,12 +469,48 @@ export declare function searchEffectiveDocuments(db: Database, input: EffectiveD
351
469
  * ranking and response construction disappears rather than leaking stale data.
352
470
  */
353
471
  export declare function searchEffectiveKnowledge(db: Database, input: EffectiveDocumentSearchInput, services?: Pick<DocumentServices, "embedder">): Promise<KnowledgeSearchResponse>;
472
+ type KnowledgeSearchCandidate = {
473
+ record: KnowledgeRecord;
474
+ semanticScore: number;
475
+ matchType: DocumentSearchMode;
476
+ vectorScore: number | null;
477
+ keywordScore: number | null;
478
+ };
479
+ type KnowledgeSearchSelectionInput = {
480
+ candidates: KnowledgeSearchCandidate[];
481
+ rankedCandidateCount: number;
482
+ requestedLimit: number;
483
+ alreadyBelowRelevanceFloor?: number | undefined;
484
+ now?: Date | undefined;
485
+ };
486
+ /**
487
+ * Deterministic, content-safe final selection over already-authorized and
488
+ * freshly rechecked Knowledge candidates. Exported for boundary tests; callers
489
+ * must never use it as a substitute for the database authorization pass above.
490
+ */
491
+ export declare function selectKnowledgeSearchResults(input: KnowledgeSearchSelectionInput): KnowledgeSearchResponse;
492
+ type KnowledgeBrowseEntry = {
493
+ record: KnowledgeRecord;
494
+ cursorAfter: string;
495
+ };
496
+ /**
497
+ * Bound a browse page without skipping records. Tail records omitted for the
498
+ * response budget remain behind the returned cursor. If one complete record is
499
+ * itself too large, return a deterministic discovery projection; knowledge_get
500
+ * remains the freshly authorized full-record path.
501
+ */
502
+ export declare function selectKnowledgeBrowseRecords(input: {
503
+ entries: KnowledgeBrowseEntry[];
504
+ hasMoreAfterEntries: boolean;
505
+ }): KnowledgeBrowseResponse;
354
506
  /** Fetch one stable Knowledge record with a fresh authorization check. */
355
507
  export declare function getEffectiveKnowledgeRecord(db: Database, input: {
356
508
  accountId: string;
357
509
  workspaceId: string;
358
510
  initiatingSubjectId: string;
511
+ surface?: "human" | "agent" | undefined;
359
512
  id: string;
513
+ agentAuthority?: AgentDocumentAuthorityContext | undefined;
360
514
  }): Promise<KnowledgeRecord | null>;
361
515
  /**
362
516
  * Browse top-level authorized documents or the chunks of one authorized
@@ -369,6 +523,7 @@ type KnowledgeBrowseCursorScope = {
369
523
  workspaceId: string;
370
524
  initiatingSubjectId: string;
371
525
  parentId: string | null;
526
+ parentRevision?: string | null | undefined;
372
527
  topic: string | null;
373
528
  sourceKinds: readonly string[];
374
529
  };
@@ -381,17 +536,26 @@ export declare function resolveDocumentAuthority(input: {
381
536
  workspaceId: string;
382
537
  initiatingSubjectId?: string | null | undefined;
383
538
  }): DocumentAuthority;
539
+ export declare function resolveEffectiveDocumentAccess(_db: Database, input: {
540
+ accountId: string;
541
+ workspaceId: string;
542
+ initiatingSubjectId: string;
543
+ surface: "human" | "agent";
544
+ agentAuthority?: AgentDocumentAuthorityContext | undefined;
545
+ }): Promise<DocumentAccessFilter>;
384
546
  /**
385
547
  * Whether a single already-fetched document is readable in this workspace.
386
548
  *
387
- * Keep this compatibility predicate as strict as SQL/RLS: personal authority
388
- * remains anchored to its originating workspace, and unknown or incomplete
389
- * authority tuples deny instead of falling through as workspace-visible.
549
+ * Keep this compatibility predicate as strict as SQL/RLS: legacy personal
550
+ * authority remains origin-workspace anchored while activated personal
551
+ * authority has a null workspace and follows the exact owner within the org.
390
552
  */
391
553
  export declare function canViewDocument(document: Pick<DocumentAccessRecord, "authorityKind" | "authoritySubjectId"> & {
392
554
  authorityWorkspaceId?: string | null | undefined;
393
555
  }, viewerSubjectId: string | null | undefined, workspaceId?: string | null | undefined): boolean;
394
556
  type DocumentAccessRecord = {
557
+ id: string;
558
+ authorityId: string | null;
395
559
  authorityKind: string;
396
560
  authorityWorkspaceId: string | null;
397
561
  authoritySubjectId: string | null;