@happyvertical/smrt-ingestion 0.0.0-stage → 0.55.5

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.
Files changed (56) hide show
  1. package/AGENTS.md +33 -0
  2. package/CLAUDE.md +1 -0
  3. package/EXTRACTION.md +120 -0
  4. package/LICENSE +7 -0
  5. package/README.md +147 -2
  6. package/dist/__smrt-register__.d.ts +2 -0
  7. package/dist/__smrt-register__.d.ts.map +1 -0
  8. package/dist/chunks/extraction-providers-C66ADDVe.js +433 -0
  9. package/dist/chunks/extraction-providers-C66ADDVe.js.map +1 -0
  10. package/dist/dto.d.ts +53 -0
  11. package/dist/dto.d.ts.map +1 -0
  12. package/dist/dto.js +0 -0
  13. package/dist/execution-contracts.d.ts +128 -0
  14. package/dist/execution-contracts.d.ts.map +1 -0
  15. package/dist/execution-dto.d.ts +70 -0
  16. package/dist/execution-dto.d.ts.map +1 -0
  17. package/dist/execution.d.ts +56 -0
  18. package/dist/execution.d.ts.map +1 -0
  19. package/dist/execution.js +7615 -0
  20. package/dist/execution.js.map +1 -0
  21. package/dist/extraction-providers.d.ts +35 -0
  22. package/dist/extraction-providers.d.ts.map +1 -0
  23. package/dist/extraction-types.d.ts +94 -0
  24. package/dist/extraction-types.d.ts.map +1 -0
  25. package/dist/extraction-worker.d.ts +2 -0
  26. package/dist/extraction-worker.d.ts.map +1 -0
  27. package/dist/extraction-worker.js +81 -0
  28. package/dist/extraction-worker.js.map +1 -0
  29. package/dist/extraction.d.ts +49 -0
  30. package/dist/extraction.d.ts.map +1 -0
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +3 -0
  34. package/dist/manifest.json +4091 -0
  35. package/dist/models.d.ts +186 -0
  36. package/dist/models.d.ts.map +1 -0
  37. package/dist/models.js +923 -0
  38. package/dist/models.js.map +1 -0
  39. package/dist/policy.d.ts +46 -0
  40. package/dist/policy.d.ts.map +1 -0
  41. package/dist/server.d.ts +168 -0
  42. package/dist/server.d.ts.map +1 -0
  43. package/dist/server.js +1758 -0
  44. package/dist/server.js.map +1 -0
  45. package/dist/smrt-knowledge.json +1605 -0
  46. package/dist/sources/common.d.ts +32 -0
  47. package/dist/sources/common.d.ts.map +1 -0
  48. package/dist/sources/email.d.ts +40 -0
  49. package/dist/sources/email.d.ts.map +1 -0
  50. package/dist/sources/http.d.ts +30 -0
  51. package/dist/sources/http.d.ts.map +1 -0
  52. package/dist/sources/index.d.ts +8 -0
  53. package/dist/sources/index.d.ts.map +1 -0
  54. package/dist/sources/watch-folder.d.ts +27 -0
  55. package/dist/sources/watch-folder.d.ts.map +1 -0
  56. package/package.json +80 -3
@@ -0,0 +1,35 @@
1
+ import type { AIInterface } from '@happyvertical/ai';
2
+ import type { OCRCapabilities, OCRImage, OCROptions, OCRResult } from '@happyvertical/ocr';
3
+ import type { PDFReader } from '@happyvertical/pdf';
4
+ import type { Transcriber } from '@happyvertical/speech';
5
+ import type { IntakeFailure } from './dto.js';
6
+ import type { ExtractionRequest, ExtractionResult, ProviderIdentity } from './extraction-types.js';
7
+ export interface ExtractionProviders {
8
+ pdf?: {
9
+ client: Pick<PDFReader, 'checkCapabilities' | 'extractMetadata' | 'extractText' | 'renderPages'>;
10
+ identity: ProviderIdentity;
11
+ };
12
+ ocr?: {
13
+ performOCR(images: OCRImage[], options?: OCROptions): Promise<OCRResult>;
14
+ capabilities(): Promise<OCRCapabilities>;
15
+ identity: ProviderIdentity;
16
+ };
17
+ speech?: {
18
+ client: Transcriber;
19
+ identity: ProviderIdentity;
20
+ };
21
+ vision?: {
22
+ client: Pick<AIInterface, 'chat' | 'getCapabilities'>;
23
+ identity: ProviderIdentity;
24
+ };
25
+ imageMode?: 'ocr' | 'vision';
26
+ }
27
+ export declare class ExtractionFailure extends Error {
28
+ readonly category: IntakeFailure;
29
+ constructor(category: IntakeFailure);
30
+ }
31
+ export declare function emptyExtraction(request: ExtractionRequest): ExtractionResult;
32
+ export declare function validateExtractionRequest(request: ExtractionRequest): void;
33
+ /** SDK-boundary normalization. Production calls this only inside a disposable worker. */
34
+ export declare function extractWithProviders(request: ExtractionRequest, providers: ExtractionProviders, progress?: (result: ExtractionResult) => void): Promise<ExtractionResult>;
35
+ //# sourceMappingURL=extraction-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-providers.d.ts","sourceRoot":"","sources":["../src/extraction-providers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,UAAU,EACV,SAAS,EACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAEV,iBAAiB,EACjB,gBAAgB,EAEhB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,IAAI,CACV,SAAS,EACT,mBAAmB,GAAG,iBAAiB,GAAG,aAAa,GAAG,aAAa,CACxE,CAAC;QACF,QAAQ,EAAE,gBAAgB,CAAC;KAC5B,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACzE,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;QACzC,QAAQ,EAAE,gBAAgB,CAAC;KAC5B,CAAC;IACF,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAC7D,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC;QACtD,QAAQ,EAAE,gBAAgB,CAAC;KAC5B,CAAC;IACF,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC9B;AACD,qBAAa,iBAAkB,SAAQ,KAAK;IAC9B,QAAQ,CAAC,QAAQ,EAAE,aAAa;gBAAvB,QAAQ,EAAE,aAAa;CAG7C;AAYD,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAmB5E;AACD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAU1E;AACD,yFAAyF;AACzF,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAC5C,OAAO,CAAC,gBAAgB,CAAC,CAkc3B"}
@@ -0,0 +1,94 @@
1
+ import type { IntakeEvidenceDTO, IntakeFailure } from './dto.js';
2
+ export interface ExtractionLimits {
3
+ maxBytes: number;
4
+ maxPages: number;
5
+ maxPixels: number;
6
+ maxOutputBytes: number;
7
+ timeoutMs: number;
8
+ maxTokens: number;
9
+ workerHeapMb: number;
10
+ }
11
+ export interface ProviderIdentity {
12
+ provider: string;
13
+ model: string;
14
+ version: string;
15
+ }
16
+ /** Project host/provider objects onto the only persistable identity fields. */
17
+ export declare function providerIdentity(value: unknown): ProviderIdentity;
18
+ export type EvidenceLocation = {
19
+ kind: 'source';
20
+ } | {
21
+ kind: 'page';
22
+ page: number;
23
+ } | {
24
+ kind: 'pages';
25
+ startPage: number;
26
+ endPage: number;
27
+ } | {
28
+ kind: 'time';
29
+ startMs: number;
30
+ endMs: number;
31
+ };
32
+ export interface ExtractionSegment {
33
+ text: string;
34
+ location: EvidenceLocation;
35
+ confidence: {
36
+ value: number;
37
+ scale: '0-1';
38
+ calibration: 'unknown';
39
+ } | null;
40
+ boxes: Array<{
41
+ text: string;
42
+ x: number;
43
+ y: number;
44
+ width: number;
45
+ height: number;
46
+ }> | null;
47
+ provenance: ProviderIdentity;
48
+ kind: 'text' | 'transcript' | 'observation';
49
+ }
50
+ export interface ExtractionResult {
51
+ status: 'complete' | 'partial' | 'failed' | 'unsupported';
52
+ evidence: IntakeEvidenceDTO;
53
+ configurationRevision: string;
54
+ options: {
55
+ imageMode: 'ocr' | 'vision';
56
+ pdfOCRFallback: 'empty-page';
57
+ ocrOutputFormat: 'json';
58
+ };
59
+ limits: ExtractionLimits;
60
+ segments: ExtractionSegment[];
61
+ /** Full provider transcript when timed segments are also returned. */
62
+ transcriptText?: string;
63
+ capabilities: Array<ProviderIdentity & {
64
+ confidence: boolean;
65
+ boxes: boolean;
66
+ location: 'source' | 'page' | 'time';
67
+ /** Whether the SDK exposed upstream completion/usage metadata. */
68
+ truncation: 'unknown' | 'reported';
69
+ usage: 'unknown' | 'reported';
70
+ }>;
71
+ errors: Array<{
72
+ category: IntakeFailure;
73
+ location: EvidenceLocation;
74
+ }>;
75
+ omitted: EvidenceLocation[];
76
+ truncated: boolean;
77
+ usage: Record<string, number>;
78
+ /** Extraction is evidence, never an approval or automatic-action grant. */
79
+ automaticActionEligible: false;
80
+ }
81
+ export interface ExtractionRequest {
82
+ evidence: IntakeEvidenceDTO;
83
+ bytes: Uint8Array;
84
+ limits: ExtractionLimits;
85
+ configurationRevision: string;
86
+ signal?: AbortSignal;
87
+ /** Trusted parent authorization; adapters must await before every provider call. */
88
+ beforeProviderCall?: () => Promise<void>;
89
+ }
90
+ export interface ExtractionAdapter {
91
+ extract(request: ExtractionRequest): Promise<ExtractionResult>;
92
+ }
93
+ export declare function validLimits(limits: ExtractionLimits): boolean;
94
+ //# sourceMappingURL=extraction-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-types.d.ts","sourceRoot":"","sources":["../src/extraction-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extraction-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-worker.d.ts","sourceRoot":"","sources":["../src/extraction-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import { r as extractWithProviders } from "./chunks/extraction-providers-C66ADDVe.js";
2
+ import { getAI } from "@happyvertical/ai";
3
+ import { UnlimitedOCRProvider, getOCR } from "@happyvertical/ocr";
4
+ import { getPDFReader } from "@happyvertical/pdf";
5
+ import { getTranscriber } from "@happyvertical/speech";
6
+ //#region src/extraction-worker.ts
7
+ process.once("message", async (message) => {
8
+ try {
9
+ const { request, configuration } = message;
10
+ let sequence = 0;
11
+ const beforeProviderCall = () => new Promise((resolve) => {
12
+ const id = ++sequence;
13
+ const receive = (reply) => {
14
+ if (reply.kind === "authorized" && reply.id === id) {
15
+ process.off("message", receive);
16
+ resolve();
17
+ }
18
+ };
19
+ process.on("message", receive);
20
+ process.send?.({
21
+ kind: "authorize",
22
+ id
23
+ });
24
+ });
25
+ const providers = { imageMode: configuration.imageMode };
26
+ const mime = request.evidence.mediaType.split(";")[0].trim().toLowerCase();
27
+ const needsImages = mime === "application/pdf" || mime.startsWith("image/");
28
+ if (configuration.pdf && mime === "application/pdf") providers.pdf = {
29
+ identity: configuration.pdf.identity,
30
+ client: await getPDFReader({
31
+ provider: configuration.pdf.provider,
32
+ enableOCR: false,
33
+ maxFileSize: request.limits.maxBytes,
34
+ timeout: request.limits.timeoutMs
35
+ })
36
+ };
37
+ if (configuration.ocr && needsImages && (mime === "application/pdf" || configuration.imageMode !== "vision")) {
38
+ const config = configuration.ocr;
39
+ const unlimited = config.identity.provider === "unlimited-ocr" ? new UnlimitedOCRProvider(config.options) : void 0;
40
+ const factory = getOCR({
41
+ provider: config.identity.provider,
42
+ fallbackProviders: [],
43
+ providerConfig: { [config.identity.provider]: config.options ?? {} }
44
+ });
45
+ providers.ocr = {
46
+ identity: config.identity,
47
+ performOCR: (images, options) => unlimited ? unlimited.performOCR(images, options) : factory.performOCR(images, options),
48
+ capabilities: async () => {
49
+ if (unlimited) return unlimited.checkCapabilities();
50
+ const info = (await factory.getProvidersInfo()).find((candidate) => candidate.name === config.identity.provider);
51
+ if (!info?.available || !info.capabilities) throw new Error("Provider unavailable");
52
+ return info.capabilities;
53
+ }
54
+ };
55
+ }
56
+ if (configuration.speech && mime.startsWith("audio/")) providers.speech = {
57
+ identity: configuration.speech.identity,
58
+ client: await getTranscriber(configuration.speech.options)
59
+ };
60
+ if (configuration.vision && needsImages && configuration.imageMode === "vision") providers.vision = {
61
+ identity: configuration.vision.identity,
62
+ client: await getAI(configuration.vision.options)
63
+ };
64
+ const result = await extractWithProviders({
65
+ ...request,
66
+ beforeProviderCall
67
+ }, providers, (partial) => process.send?.({
68
+ kind: "progress",
69
+ result: partial
70
+ }));
71
+ process.send?.({
72
+ kind: "result",
73
+ result
74
+ }, () => process.exit(0));
75
+ } catch {
76
+ process.send?.({ kind: "failure" }, () => process.exit(1));
77
+ }
78
+ });
79
+ //#endregion
80
+
81
+ //# sourceMappingURL=extraction-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-worker.js","names":[],"sources":["../src/extraction-worker.ts"],"sourcesContent":["import { getAI } from '@happyvertical/ai';\nimport { getOCR, UnlimitedOCRProvider } from '@happyvertical/ocr';\nimport { getPDFReader } from '@happyvertical/pdf';\nimport { getTranscriber } from '@happyvertical/speech';\nimport type { ExtractionSDKConfiguration } from './extraction.js';\nimport {\n type ExtractionProviders,\n extractWithProviders,\n} from './extraction-providers.js';\nimport type { ExtractionRequest } from './extraction-types.js';\n\n// A separate entry, never imported by browser or normal server initialization.\nprocess.once(\n 'message',\n async (message: {\n request: Omit<ExtractionRequest, 'signal' | 'beforeProviderCall'>;\n configuration: ExtractionSDKConfiguration;\n }) => {\n try {\n const { request, configuration } = message;\n let sequence = 0;\n const beforeProviderCall = () =>\n new Promise<void>((resolve) => {\n const id = ++sequence;\n const receive = (reply: { kind: string; id?: number }) => {\n if (reply.kind === 'authorized' && reply.id === id) {\n process.off('message', receive);\n resolve();\n }\n };\n process.on('message', receive);\n process.send?.({ kind: 'authorize', id });\n });\n const providers: ExtractionProviders = {\n imageMode: configuration.imageMode,\n };\n const mime = request.evidence.mediaType\n .split(';')[0]\n .trim()\n .toLowerCase();\n const needsImages =\n mime === 'application/pdf' || mime.startsWith('image/');\n if (configuration.pdf && mime === 'application/pdf')\n providers.pdf = {\n identity: configuration.pdf.identity,\n client: await getPDFReader({\n provider: configuration.pdf.provider,\n enableOCR: false,\n maxFileSize: request.limits.maxBytes,\n timeout: request.limits.timeoutMs,\n }),\n };\n if (\n configuration.ocr &&\n needsImages &&\n (mime === 'application/pdf' || configuration.imageMode !== 'vision')\n ) {\n const config = configuration.ocr;\n const unlimited =\n config.identity.provider === 'unlimited-ocr'\n ? new UnlimitedOCRProvider(config.options)\n : undefined;\n const factory = getOCR({\n provider: config.identity.provider,\n fallbackProviders: [],\n providerConfig: { [config.identity.provider]: config.options ?? {} },\n });\n providers.ocr = {\n identity: config.identity,\n performOCR: (images, options) =>\n unlimited\n ? unlimited.performOCR(images, options)\n : factory.performOCR(images, options),\n capabilities: async () => {\n if (unlimited) return unlimited.checkCapabilities();\n const infos = await factory.getProvidersInfo();\n const info = infos.find(\n (candidate) => candidate.name === config.identity.provider,\n );\n if (!info?.available || !info.capabilities)\n throw new Error('Provider unavailable');\n return info.capabilities;\n },\n };\n }\n if (configuration.speech && mime.startsWith('audio/'))\n providers.speech = {\n identity: configuration.speech.identity,\n client: await getTranscriber(configuration.speech.options),\n };\n if (\n configuration.vision &&\n needsImages &&\n configuration.imageMode === 'vision'\n )\n providers.vision = {\n identity: configuration.vision.identity,\n client: await getAI(configuration.vision.options),\n };\n const result = await extractWithProviders(\n { ...request, beforeProviderCall },\n providers,\n (partial) => process.send?.({ kind: 'progress', result: partial }),\n );\n process.send?.({ kind: 'result', result }, () => process.exit(0));\n } catch {\n process.send?.({ kind: 'failure' }, () => process.exit(1));\n }\n },\n);\n"],"mappings":";;;;;;AAYA,QAAQ,KACN,WACA,OAAO,YAGD;CACJ,IAAI;EACF,MAAM,EAAE,SAAS,kBAAkB;EACnC,IAAI,WAAW;EACf,MAAM,2BACJ,IAAI,SAAe,YAAY;GAC7B,MAAM,KAAK,EAAE;GACb,MAAM,WAAW,UAAyC;IACxD,IAAI,MAAM,SAAS,gBAAgB,MAAM,OAAO,IAAI;KAClD,QAAQ,IAAI,WAAW,OAAO;KAC9B,QAAQ;IACV;GACF;GACA,QAAQ,GAAG,WAAW,OAAO;GAC7B,QAAQ,OAAO;IAAE,MAAM;IAAa;GAAG,CAAC;EAC1C,CAAC;EACH,MAAM,YAAiC,EACrC,WAAW,cAAc,UAC3B;EACA,MAAM,OAAO,QAAQ,SAAS,UAC3B,MAAM,GAAG,CAAA,CAAE,EAAC,CACZ,KAAK,CAAA,CACL,YAAY;EACf,MAAM,cACJ,SAAS,qBAAqB,KAAK,WAAW,QAAQ;EACxD,IAAI,cAAc,OAAO,SAAS,mBAChC,UAAU,MAAM;GACd,UAAU,cAAc,IAAI;GAC5B,QAAQ,MAAM,aAAa;IACzB,UAAU,cAAc,IAAI;IAC5B,WAAW;IACX,aAAa,QAAQ,OAAO;IAC5B,SAAS,QAAQ,OAAO;GAC1B,CAAC;EACH;EACF,IACE,cAAc,OACd,gBACC,SAAS,qBAAqB,cAAc,cAAc,WAC3D;GACA,MAAM,SAAS,cAAc;GAC7B,MAAM,YACJ,OAAO,SAAS,aAAa,kBACzB,IAAI,qBAAqB,OAAO,OAAO,IACvC,KAAA;GACN,MAAM,UAAU,OAAO;IACrB,UAAU,OAAO,SAAS;IAC1B,mBAAmB,CAAC;IACpB,gBAAgB,GAAG,OAAO,SAAS,WAAW,OAAO,WAAW,CAAC,EAAE;GACrE,CAAC;GACD,UAAU,MAAM;IACd,UAAU,OAAO;IACjB,aAAa,QAAQ,YACnB,YACI,UAAU,WAAW,QAAQ,OAAO,IACpC,QAAQ,WAAW,QAAQ,OAAO;IACxC,cAAc,YAAY;KACxB,IAAI,WAAW,OAAO,UAAU,kBAAkB;KAElD,MAAM,QAAO,MADO,QAAQ,iBAAiB,EAAA,CAC1B,MAChB,cAAc,UAAU,SAAS,OAAO,SAAS,QACpD;KACA,IAAI,CAAC,MAAM,aAAa,CAAC,KAAK,cAC5B,MAAM,IAAI,MAAM,sBAAsB;KACxC,OAAO,KAAK;IACd;GACF;EACF;EACA,IAAI,cAAc,UAAU,KAAK,WAAW,QAAQ,GAClD,UAAU,SAAS;GACjB,UAAU,cAAc,OAAO;GAC/B,QAAQ,MAAM,eAAe,cAAc,OAAO,OAAO;EAC3D;EACF,IACE,cAAc,UACd,eACA,cAAc,cAAc,UAE5B,UAAU,SAAS;GACjB,UAAU,cAAc,OAAO;GAC/B,QAAQ,MAAM,MAAM,cAAc,OAAO,OAAO;EAClD;EACF,MAAM,SAAS,MAAM,qBACnB;GAAE,GAAG;GAAS;EAAmB,GACjC,YACC,YAAY,QAAQ,OAAO;GAAE,MAAM;GAAY,QAAQ;EAAQ,CAAC,CACnE;EACA,QAAQ,OAAO;GAAE,MAAM;GAAU;EAAO,SAAS,QAAQ,KAAK,CAAC,CAAC;CAClE,QAAQ;EACN,QAAQ,OAAO,EAAE,MAAM,UAAU,SAAS,QAAQ,KAAK,CAAC,CAAC;CAC3D;AACF,CACF"}
@@ -0,0 +1,49 @@
1
+ import type { GetAIOptions } from '@happyvertical/ai';
2
+ import type { PDFReaderOptions } from '@happyvertical/pdf';
3
+ import type { GetTranscriberOptions } from '@happyvertical/speech';
4
+ import type { ExtractionAdapter, ExtractionRequest, ExtractionResult, ProviderIdentity } from './extraction-types.js';
5
+ import type { AnalysisLease, IngestionService } from './server.js';
6
+ export type * from './extraction-types.js';
7
+ /** Trusted server configuration. Credentials never enter analysis provenance. */
8
+ export interface ExtractionSDKConfiguration {
9
+ pdf?: {
10
+ provider: NonNullable<PDFReaderOptions['provider']>;
11
+ identity: ProviderIdentity;
12
+ };
13
+ ocr?: {
14
+ identity: ProviderIdentity;
15
+ options?: Record<string, unknown>;
16
+ };
17
+ speech?: {
18
+ identity: ProviderIdentity;
19
+ options: GetTranscriberOptions;
20
+ };
21
+ vision?: {
22
+ identity: ProviderIdentity;
23
+ options: GetAIOptions;
24
+ };
25
+ imageMode?: 'ocr' | 'vision';
26
+ /** Maximum concurrent child processes for this adapter instance (default 1). */
27
+ maxConcurrentProcesses?: number;
28
+ /** The deployment enforces a native-memory ceiling outside Node (e.g. container).
29
+ * Required for native decoders: Node's heap cap does not bound native allocation. */
30
+ nativeMemoryIsolation: 'host-enforced';
31
+ }
32
+ /** Production adapter: bounded per-evidence child, terminated on deadline/abort. */
33
+ export declare function createSDKExtractionAdapter(configuration: ExtractionSDKConfiguration): ExtractionAdapter;
34
+ /** Current access is rechecked on read and fenced publication by the foundation.
35
+ * The host already allocated the immutable input/config revision and lease. */
36
+ export declare function extractAnalysis(service: IngestionService, lease: AnalysisLease, adapter: ExtractionAdapter, options: Pick<ExtractionRequest, 'limits' | 'configurationRevision' | 'signal'>): Promise<boolean>;
37
+ /** Side-effect-free, versioned split proposal. Original evidence is not replaced. */
38
+ export declare function proposeDocumentSplits(result: ExtractionResult, revision: number, groups: number[][]): {
39
+ digest: string;
40
+ revision: number;
41
+ evidenceId: string;
42
+ inputHash: string;
43
+ configurationRevision: string;
44
+ groups: {
45
+ pages: number[];
46
+ }[];
47
+ status: "proposed";
48
+ };
49
+ //# sourceMappingURL=extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../src/extraction.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAOnE,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEnE,mBAAmB,uBAAuB,CAAC;AAE3C,iFAAiF;AACjF,MAAM,WAAW,0BAA0B;IACzC,GAAG,CAAC,EAAE;QACJ,QAAQ,EAAE,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,QAAQ,EAAE,gBAAgB,CAAC;KAC5B,CAAC;IACF,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACxE,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,CAAC;IACxE,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,YAAY,CAAA;KAAE,CAAC;IAC/D,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,gFAAgF;IAChF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;yFACqF;IACrF,qBAAqB,EAAE,eAAe,CAAC;CACxC;AAED,oFAAoF;AACpF,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,0BAA0B,GACxC,iBAAiB,CAyJnB;AAuHD;+EAC+E;AAC/E,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,IAAI,CACX,iBAAiB,EACjB,QAAQ,GAAG,uBAAuB,GAAG,QAAQ,CAC9C,GACA,OAAO,CAAC,OAAO,CAAC,CAuGlB;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAAE;;;;;;;;;;EAgCnB"}
@@ -0,0 +1,4 @@
1
+ import './__smrt-register__.js';
2
+ export * from './dto.js';
3
+ export * from './models.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAEhC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import "./dto.js";
2
+ import { IntakeAction, IntakeAnalysis, IntakeAnalysisAttempt, IntakeDeletion, IntakeDispatch, IntakeEvidence, IntakeExecution, IntakeFeedback, IntakeItem, IntakePlan, IntakeProposal, IntakeReviewDecision } from "./models.js";
3
+ export { IntakeAction, IntakeAnalysis, IntakeAnalysisAttempt, IntakeDeletion, IntakeDispatch, IntakeEvidence, IntakeExecution, IntakeFeedback, IntakeItem, IntakePlan, IntakeProposal, IntakeReviewDecision };