@claritylabs/cl-sdk 3.1.17 → 3.1.19
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/application.d.mts +1 -1
- package/dist/application.d.ts +1 -1
- package/dist/application.js +6 -4
- package/dist/application.js.map +1 -1
- package/dist/application.mjs +6 -4
- package/dist/application.mjs.map +1 -1
- package/dist/{index-CTxWtbqE.d.mts → index-q8LQXen9.d.mts} +2 -0
- package/dist/{index-CTxWtbqE.d.ts → index-q8LQXen9.d.ts} +2 -0
- package/dist/index.d.mts +11 -4
- package/dist/index.d.ts +11 -4
- package/dist/index.js +111 -43
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +111 -43
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { L as LogFn, M as ModelTaskKind, a as ModelBudgetResolution, b as ModelCallTrace, G as GenerateObject, T as TokenUsage, S as SourceSpanLocation, c as SourceSpan, D as DocumentSourceNode, d as SourceKind, e as SourceSpanUnit, f as SourceSpanTableLocation, g as SourceChunk, h as SourceSpanBBox, U as UnifiedQualityReport, B as BaseQualityIssue, Q as QualityGateStatus, I as InsuranceDocument, P as PdfInput, i as DocumentChunk, j as PolicyOperationalProfile, k as PerformanceReport, l as GenerateText, C as ConvertPdfToImagesFn, m as QualityGateMode, n as ModelCapabilities, o as ModelBudgetConstraint, A as AgentContext, p as DocumentStore, q as MemoryStore, r as Platform } from './index-
|
|
2
|
-
export { s as AcroFormMapping, t as AcroFormMappingSchema, u as AnswerParsingResult, v as AnswerParsingResultSchema, w as ApplicationClassifyResult, x as ApplicationClassifyResultSchema, y as ApplicationContextProposal, z as ApplicationContextProposalSchema, E as ApplicationEmailReviewSchema, F as ApplicationField, H as ApplicationFieldSchema, J as ApplicationListFilters, K as ApplicationNextQuestions, N as ApplicationPacket, O as ApplicationPacketAnswer, R as ApplicationPacketAnswerSchema, V as ApplicationPacketSchema, W as ApplicationPipelineConfig, X as ApplicationQualityArtifactSchema, Y as ApplicationQualityIssueSchema, Z as ApplicationQualityReportSchema, _ as ApplicationQualityRoundSchema, $ as ApplicationQuestionCondition, a0 as ApplicationQuestionConditionSchema, a1 as ApplicationQuestionGraph, a2 as ApplicationQuestionGraphSchema, a3 as ApplicationQuestionNode, a4 as ApplicationQuestionNodeSchema, a5 as ApplicationRepeat, a6 as ApplicationRepeatSchema, a7 as ApplicationState, a8 as ApplicationStateSchema, a9 as ApplicationStore, aa as ApplicationTemplate, ab as ApplicationTemplateListFilters, ac as ApplicationTemplateSchema, ad as ApplicationTemplateStore, ae as AutoFillMatch, af as AutoFillMatchSchema, ag as AutoFillResult, ah as AutoFillResultSchema, ai as AuxiliaryFact, aj as AuxiliaryFactSchema, ak as BackfillProvider, al as BuildApplicationPacketInput, am as BuildApplicationPacketResult, an as ChunkFilter, ao as CommunicationIntent, ap as CommunicationIntentSchema, aq as ContextProposalResult, ar as ConversationTurn, as as CoveredReason, at as CoveredReasonSchema, au as CreateApplicationRunInput, av as Definition, aw as DefinitionSchema, ax as DocumentAgentGuidance, ay as DocumentAgentGuidanceSchema, az as DocumentFilters, aA as DocumentMetadata, aB as DocumentMetadataSchema, aC as DocumentNode, aD as DocumentNodeSchema, aE as DocumentPageMapEntry, aF as DocumentPageMapEntrySchema, aG as DocumentSourceNodeKind, aH as DocumentSourceNodeKindSchema, aI as DocumentSourceNodeSchema, aJ as DocumentTableOfContentsEntry, aK as DocumentTableOfContentsEntrySchema, aL as EmbedText, aM as FieldExtractionResult, aN as FieldExtractionResultSchema, aO as FieldType, aP as FieldTypeSchema, aQ as FlatPdfPlacement, aR as FlatPdfPlacementSchema, aS as InsuranceDocumentSchema, aT as LookupFill, aU as LookupFillResult, aV as LookupFillResultSchema, aW as LookupFillSchema, aX as LookupRequest, aY as LookupRequestSchema, aZ as ModelCallReport, a_ as OperationalCoverageLine, a$ as OperationalCoverageLineSchema, b0 as OperationalCoverageTerm, b1 as OperationalCoverageTermSchema, b2 as OperationalEndorsementSupport, b3 as OperationalEndorsementSupportSchema, b4 as OperationalParty, b5 as OperationalPartySchema, b6 as PLATFORM_CONFIGS, b7 as ParsedAnswer, b8 as ParsedAnswerSchema, b9 as PlatformConfig, ba as PlatformSchema, bb as PolicyDocument, bc as PolicyDocumentSchema, bd as PolicyOperationalProfileSchema, be as PremiumLine, bf as PremiumLineSchema, bg as PriorAnswer, bh as ProcessApplicationInput, bi as ProcessApplicationResult, bj as ProcessReplyInput, bk as ProcessReplyResult, bl as QuestionBatchResult, bm as QuestionBatchResultSchema, bn as QuoteDocument, bo as QuoteDocumentSchema, bp as ReplyIntent, bq as ReplyIntentSchema, br as ResolveModelBudgetParams, bs as Section, bt as SectionSchema, bu as SourceBackedValue, bv as SourceBackedValueSchema, bw as SourceChunkSchema, bx as SourceKindSchema, by as SourceSpanBBoxSchema, bz as SourceSpanKind, bA as SourceSpanKindSchema, bB as SourceSpanLocationSchema, bC as SourceSpanRef, bD as SourceSpanRefSchema, bE as SourceSpanSchema, bF as SourceSpanTableLocationSchema, bG as SourceSpanUnitSchema, bH as Subjectivity, bI as SubjectivitySchema, bJ as Subsection, bK as SubsectionSchema, bL as UnderwritingCondition, bM as UnderwritingConditionSchema, bN as applyApplicationAnswers, bO as buildApplicationPacket, bP as buildQuestionGraphFromFields, bQ as createApplicationPipeline, bR as createApplicationRun, bS as extractQuestionGraphFromFields, bT as flattenQuestionGraph, bU as getActiveApplicationFields, bV as getNextApplicationQuestions, bW as normalizeApplicationQuestionGraph, bX as planNextApplicationQuestions, bY as proposeContextWrites, bZ as resolveModelBudget, b_ as validateApplicationPacket } from './index-
|
|
1
|
+
import { L as LogFn, M as ModelTaskKind, a as ModelBudgetResolution, b as ModelCallTrace, G as GenerateObject, T as TokenUsage, S as SourceSpanLocation, c as SourceSpan, D as DocumentSourceNode, d as SourceKind, e as SourceSpanUnit, f as SourceSpanTableLocation, g as SourceChunk, h as SourceSpanBBox, U as UnifiedQualityReport, B as BaseQualityIssue, Q as QualityGateStatus, I as InsuranceDocument, P as PdfInput, i as DocumentChunk, j as PolicyOperationalProfile, k as PerformanceReport, l as GenerateText, C as ConvertPdfToImagesFn, m as QualityGateMode, n as ModelCapabilities, o as ModelBudgetConstraint, A as AgentContext, p as DocumentStore, q as MemoryStore, r as Platform } from './index-q8LQXen9.mjs';
|
|
2
|
+
export { s as AcroFormMapping, t as AcroFormMappingSchema, u as AnswerParsingResult, v as AnswerParsingResultSchema, w as ApplicationClassifyResult, x as ApplicationClassifyResultSchema, y as ApplicationContextProposal, z as ApplicationContextProposalSchema, E as ApplicationEmailReviewSchema, F as ApplicationField, H as ApplicationFieldSchema, J as ApplicationListFilters, K as ApplicationNextQuestions, N as ApplicationPacket, O as ApplicationPacketAnswer, R as ApplicationPacketAnswerSchema, V as ApplicationPacketSchema, W as ApplicationPipelineConfig, X as ApplicationQualityArtifactSchema, Y as ApplicationQualityIssueSchema, Z as ApplicationQualityReportSchema, _ as ApplicationQualityRoundSchema, $ as ApplicationQuestionCondition, a0 as ApplicationQuestionConditionSchema, a1 as ApplicationQuestionGraph, a2 as ApplicationQuestionGraphSchema, a3 as ApplicationQuestionNode, a4 as ApplicationQuestionNodeSchema, a5 as ApplicationRepeat, a6 as ApplicationRepeatSchema, a7 as ApplicationState, a8 as ApplicationStateSchema, a9 as ApplicationStore, aa as ApplicationTemplate, ab as ApplicationTemplateListFilters, ac as ApplicationTemplateSchema, ad as ApplicationTemplateStore, ae as AutoFillMatch, af as AutoFillMatchSchema, ag as AutoFillResult, ah as AutoFillResultSchema, ai as AuxiliaryFact, aj as AuxiliaryFactSchema, ak as BackfillProvider, al as BuildApplicationPacketInput, am as BuildApplicationPacketResult, an as ChunkFilter, ao as CommunicationIntent, ap as CommunicationIntentSchema, aq as ContextProposalResult, ar as ConversationTurn, as as CoveredReason, at as CoveredReasonSchema, au as CreateApplicationRunInput, av as Definition, aw as DefinitionSchema, ax as DocumentAgentGuidance, ay as DocumentAgentGuidanceSchema, az as DocumentFilters, aA as DocumentMetadata, aB as DocumentMetadataSchema, aC as DocumentNode, aD as DocumentNodeSchema, aE as DocumentPageMapEntry, aF as DocumentPageMapEntrySchema, aG as DocumentSourceNodeKind, aH as DocumentSourceNodeKindSchema, aI as DocumentSourceNodeSchema, aJ as DocumentTableOfContentsEntry, aK as DocumentTableOfContentsEntrySchema, aL as EmbedText, aM as FieldExtractionResult, aN as FieldExtractionResultSchema, aO as FieldType, aP as FieldTypeSchema, aQ as FlatPdfPlacement, aR as FlatPdfPlacementSchema, aS as InsuranceDocumentSchema, aT as LookupFill, aU as LookupFillResult, aV as LookupFillResultSchema, aW as LookupFillSchema, aX as LookupRequest, aY as LookupRequestSchema, aZ as ModelCallReport, a_ as OperationalCoverageLine, a$ as OperationalCoverageLineSchema, b0 as OperationalCoverageTerm, b1 as OperationalCoverageTermSchema, b2 as OperationalEndorsementSupport, b3 as OperationalEndorsementSupportSchema, b4 as OperationalParty, b5 as OperationalPartySchema, b6 as PLATFORM_CONFIGS, b7 as ParsedAnswer, b8 as ParsedAnswerSchema, b9 as PlatformConfig, ba as PlatformSchema, bb as PolicyDocument, bc as PolicyDocumentSchema, bd as PolicyOperationalProfileSchema, be as PremiumLine, bf as PremiumLineSchema, bg as PriorAnswer, bh as ProcessApplicationInput, bi as ProcessApplicationResult, bj as ProcessReplyInput, bk as ProcessReplyResult, bl as QuestionBatchResult, bm as QuestionBatchResultSchema, bn as QuoteDocument, bo as QuoteDocumentSchema, bp as ReplyIntent, bq as ReplyIntentSchema, br as ResolveModelBudgetParams, bs as Section, bt as SectionSchema, bu as SourceBackedValue, bv as SourceBackedValueSchema, bw as SourceChunkSchema, bx as SourceKindSchema, by as SourceSpanBBoxSchema, bz as SourceSpanKind, bA as SourceSpanKindSchema, bB as SourceSpanLocationSchema, bC as SourceSpanRef, bD as SourceSpanRefSchema, bE as SourceSpanSchema, bF as SourceSpanTableLocationSchema, bG as SourceSpanUnitSchema, bH as Subjectivity, bI as SubjectivitySchema, bJ as Subsection, bK as SubsectionSchema, bL as UnderwritingCondition, bM as UnderwritingConditionSchema, bN as applyApplicationAnswers, bO as buildApplicationPacket, bP as buildQuestionGraphFromFields, bQ as createApplicationPipeline, bR as createApplicationRun, bS as extractQuestionGraphFromFields, bT as flattenQuestionGraph, bU as getActiveApplicationFields, bV as getNextApplicationQuestions, bW as normalizeApplicationQuestionGraph, bX as planNextApplicationQuestions, bY as proposeContextWrites, bZ as resolveModelBudget, b_ as validateApplicationPacket } from './index-q8LQXen9.mjs';
|
|
3
3
|
import * as zod from 'zod';
|
|
4
4
|
import { ZodTypeAny, z, ZodSchema } from 'zod';
|
|
5
5
|
import { PDFDocument } from 'pdf-lib';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
interface RetryOptions {
|
|
8
|
+
maxRetries?: number;
|
|
9
|
+
baseDelayMs?: number;
|
|
10
|
+
}
|
|
11
|
+
declare function withRetry<T>(fn: () => Promise<T>, log?: LogFn, options?: RetryOptions): Promise<T>;
|
|
8
12
|
|
|
9
13
|
/**
|
|
10
14
|
* Concurrency limiter — returns a function that wraps async tasks
|
|
@@ -31,6 +35,8 @@ interface SafeGenerateOptions<T> {
|
|
|
31
35
|
onError?: (error: unknown, attempt: number) => void;
|
|
32
36
|
/** Logger for pipeline status messages. */
|
|
33
37
|
log?: LogFn;
|
|
38
|
+
/** Controls retryable provider-error backoff around the host callback. Use false when the host already owns fallback. */
|
|
39
|
+
retry?: RetryOptions | false;
|
|
34
40
|
}
|
|
35
41
|
interface SafeGenerateParams {
|
|
36
42
|
prompt: string;
|
|
@@ -44,7 +50,7 @@ interface SafeGenerateParams {
|
|
|
44
50
|
/**
|
|
45
51
|
* Wraps a `generateObject` call with two layers of resilience:
|
|
46
52
|
*
|
|
47
|
-
* 1. Inner: `withRetry` handles
|
|
53
|
+
* 1. Inner: `withRetry` handles retryable provider errors with exponential backoff unless disabled.
|
|
48
54
|
* 2. Outer: catches all other errors (schema validation, malformed JSON, transient API errors)
|
|
49
55
|
* and retries up to `maxRetries` times. If all retries fail, returns `fallback` (if provided)
|
|
50
56
|
* or re-throws.
|
|
@@ -8734,6 +8740,7 @@ interface ExtractorConfig {
|
|
|
8734
8740
|
sourceStore?: SourceStore;
|
|
8735
8741
|
qualityGate?: QualityGateMode;
|
|
8736
8742
|
modelCapabilities?: ModelCapabilities;
|
|
8743
|
+
modelCapabilitiesByTaskKind?: Partial<Record<ModelTaskKind, ModelCapabilities>>;
|
|
8737
8744
|
modelBudgetConstraints?: Partial<Record<ModelTaskKind, ModelBudgetConstraint>>;
|
|
8738
8745
|
/** Optional checkpoint persistence callback. */
|
|
8739
8746
|
onCheckpointSave?: (checkpoint: PipelineCheckpoint<ExtractionState>) => Promise<void>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { L as LogFn, M as ModelTaskKind, a as ModelBudgetResolution, b as ModelCallTrace, G as GenerateObject, T as TokenUsage, S as SourceSpanLocation, c as SourceSpan, D as DocumentSourceNode, d as SourceKind, e as SourceSpanUnit, f as SourceSpanTableLocation, g as SourceChunk, h as SourceSpanBBox, U as UnifiedQualityReport, B as BaseQualityIssue, Q as QualityGateStatus, I as InsuranceDocument, P as PdfInput, i as DocumentChunk, j as PolicyOperationalProfile, k as PerformanceReport, l as GenerateText, C as ConvertPdfToImagesFn, m as QualityGateMode, n as ModelCapabilities, o as ModelBudgetConstraint, A as AgentContext, p as DocumentStore, q as MemoryStore, r as Platform } from './index-
|
|
2
|
-
export { s as AcroFormMapping, t as AcroFormMappingSchema, u as AnswerParsingResult, v as AnswerParsingResultSchema, w as ApplicationClassifyResult, x as ApplicationClassifyResultSchema, y as ApplicationContextProposal, z as ApplicationContextProposalSchema, E as ApplicationEmailReviewSchema, F as ApplicationField, H as ApplicationFieldSchema, J as ApplicationListFilters, K as ApplicationNextQuestions, N as ApplicationPacket, O as ApplicationPacketAnswer, R as ApplicationPacketAnswerSchema, V as ApplicationPacketSchema, W as ApplicationPipelineConfig, X as ApplicationQualityArtifactSchema, Y as ApplicationQualityIssueSchema, Z as ApplicationQualityReportSchema, _ as ApplicationQualityRoundSchema, $ as ApplicationQuestionCondition, a0 as ApplicationQuestionConditionSchema, a1 as ApplicationQuestionGraph, a2 as ApplicationQuestionGraphSchema, a3 as ApplicationQuestionNode, a4 as ApplicationQuestionNodeSchema, a5 as ApplicationRepeat, a6 as ApplicationRepeatSchema, a7 as ApplicationState, a8 as ApplicationStateSchema, a9 as ApplicationStore, aa as ApplicationTemplate, ab as ApplicationTemplateListFilters, ac as ApplicationTemplateSchema, ad as ApplicationTemplateStore, ae as AutoFillMatch, af as AutoFillMatchSchema, ag as AutoFillResult, ah as AutoFillResultSchema, ai as AuxiliaryFact, aj as AuxiliaryFactSchema, ak as BackfillProvider, al as BuildApplicationPacketInput, am as BuildApplicationPacketResult, an as ChunkFilter, ao as CommunicationIntent, ap as CommunicationIntentSchema, aq as ContextProposalResult, ar as ConversationTurn, as as CoveredReason, at as CoveredReasonSchema, au as CreateApplicationRunInput, av as Definition, aw as DefinitionSchema, ax as DocumentAgentGuidance, ay as DocumentAgentGuidanceSchema, az as DocumentFilters, aA as DocumentMetadata, aB as DocumentMetadataSchema, aC as DocumentNode, aD as DocumentNodeSchema, aE as DocumentPageMapEntry, aF as DocumentPageMapEntrySchema, aG as DocumentSourceNodeKind, aH as DocumentSourceNodeKindSchema, aI as DocumentSourceNodeSchema, aJ as DocumentTableOfContentsEntry, aK as DocumentTableOfContentsEntrySchema, aL as EmbedText, aM as FieldExtractionResult, aN as FieldExtractionResultSchema, aO as FieldType, aP as FieldTypeSchema, aQ as FlatPdfPlacement, aR as FlatPdfPlacementSchema, aS as InsuranceDocumentSchema, aT as LookupFill, aU as LookupFillResult, aV as LookupFillResultSchema, aW as LookupFillSchema, aX as LookupRequest, aY as LookupRequestSchema, aZ as ModelCallReport, a_ as OperationalCoverageLine, a$ as OperationalCoverageLineSchema, b0 as OperationalCoverageTerm, b1 as OperationalCoverageTermSchema, b2 as OperationalEndorsementSupport, b3 as OperationalEndorsementSupportSchema, b4 as OperationalParty, b5 as OperationalPartySchema, b6 as PLATFORM_CONFIGS, b7 as ParsedAnswer, b8 as ParsedAnswerSchema, b9 as PlatformConfig, ba as PlatformSchema, bb as PolicyDocument, bc as PolicyDocumentSchema, bd as PolicyOperationalProfileSchema, be as PremiumLine, bf as PremiumLineSchema, bg as PriorAnswer, bh as ProcessApplicationInput, bi as ProcessApplicationResult, bj as ProcessReplyInput, bk as ProcessReplyResult, bl as QuestionBatchResult, bm as QuestionBatchResultSchema, bn as QuoteDocument, bo as QuoteDocumentSchema, bp as ReplyIntent, bq as ReplyIntentSchema, br as ResolveModelBudgetParams, bs as Section, bt as SectionSchema, bu as SourceBackedValue, bv as SourceBackedValueSchema, bw as SourceChunkSchema, bx as SourceKindSchema, by as SourceSpanBBoxSchema, bz as SourceSpanKind, bA as SourceSpanKindSchema, bB as SourceSpanLocationSchema, bC as SourceSpanRef, bD as SourceSpanRefSchema, bE as SourceSpanSchema, bF as SourceSpanTableLocationSchema, bG as SourceSpanUnitSchema, bH as Subjectivity, bI as SubjectivitySchema, bJ as Subsection, bK as SubsectionSchema, bL as UnderwritingCondition, bM as UnderwritingConditionSchema, bN as applyApplicationAnswers, bO as buildApplicationPacket, bP as buildQuestionGraphFromFields, bQ as createApplicationPipeline, bR as createApplicationRun, bS as extractQuestionGraphFromFields, bT as flattenQuestionGraph, bU as getActiveApplicationFields, bV as getNextApplicationQuestions, bW as normalizeApplicationQuestionGraph, bX as planNextApplicationQuestions, bY as proposeContextWrites, bZ as resolveModelBudget, b_ as validateApplicationPacket } from './index-
|
|
1
|
+
import { L as LogFn, M as ModelTaskKind, a as ModelBudgetResolution, b as ModelCallTrace, G as GenerateObject, T as TokenUsage, S as SourceSpanLocation, c as SourceSpan, D as DocumentSourceNode, d as SourceKind, e as SourceSpanUnit, f as SourceSpanTableLocation, g as SourceChunk, h as SourceSpanBBox, U as UnifiedQualityReport, B as BaseQualityIssue, Q as QualityGateStatus, I as InsuranceDocument, P as PdfInput, i as DocumentChunk, j as PolicyOperationalProfile, k as PerformanceReport, l as GenerateText, C as ConvertPdfToImagesFn, m as QualityGateMode, n as ModelCapabilities, o as ModelBudgetConstraint, A as AgentContext, p as DocumentStore, q as MemoryStore, r as Platform } from './index-q8LQXen9.js';
|
|
2
|
+
export { s as AcroFormMapping, t as AcroFormMappingSchema, u as AnswerParsingResult, v as AnswerParsingResultSchema, w as ApplicationClassifyResult, x as ApplicationClassifyResultSchema, y as ApplicationContextProposal, z as ApplicationContextProposalSchema, E as ApplicationEmailReviewSchema, F as ApplicationField, H as ApplicationFieldSchema, J as ApplicationListFilters, K as ApplicationNextQuestions, N as ApplicationPacket, O as ApplicationPacketAnswer, R as ApplicationPacketAnswerSchema, V as ApplicationPacketSchema, W as ApplicationPipelineConfig, X as ApplicationQualityArtifactSchema, Y as ApplicationQualityIssueSchema, Z as ApplicationQualityReportSchema, _ as ApplicationQualityRoundSchema, $ as ApplicationQuestionCondition, a0 as ApplicationQuestionConditionSchema, a1 as ApplicationQuestionGraph, a2 as ApplicationQuestionGraphSchema, a3 as ApplicationQuestionNode, a4 as ApplicationQuestionNodeSchema, a5 as ApplicationRepeat, a6 as ApplicationRepeatSchema, a7 as ApplicationState, a8 as ApplicationStateSchema, a9 as ApplicationStore, aa as ApplicationTemplate, ab as ApplicationTemplateListFilters, ac as ApplicationTemplateSchema, ad as ApplicationTemplateStore, ae as AutoFillMatch, af as AutoFillMatchSchema, ag as AutoFillResult, ah as AutoFillResultSchema, ai as AuxiliaryFact, aj as AuxiliaryFactSchema, ak as BackfillProvider, al as BuildApplicationPacketInput, am as BuildApplicationPacketResult, an as ChunkFilter, ao as CommunicationIntent, ap as CommunicationIntentSchema, aq as ContextProposalResult, ar as ConversationTurn, as as CoveredReason, at as CoveredReasonSchema, au as CreateApplicationRunInput, av as Definition, aw as DefinitionSchema, ax as DocumentAgentGuidance, ay as DocumentAgentGuidanceSchema, az as DocumentFilters, aA as DocumentMetadata, aB as DocumentMetadataSchema, aC as DocumentNode, aD as DocumentNodeSchema, aE as DocumentPageMapEntry, aF as DocumentPageMapEntrySchema, aG as DocumentSourceNodeKind, aH as DocumentSourceNodeKindSchema, aI as DocumentSourceNodeSchema, aJ as DocumentTableOfContentsEntry, aK as DocumentTableOfContentsEntrySchema, aL as EmbedText, aM as FieldExtractionResult, aN as FieldExtractionResultSchema, aO as FieldType, aP as FieldTypeSchema, aQ as FlatPdfPlacement, aR as FlatPdfPlacementSchema, aS as InsuranceDocumentSchema, aT as LookupFill, aU as LookupFillResult, aV as LookupFillResultSchema, aW as LookupFillSchema, aX as LookupRequest, aY as LookupRequestSchema, aZ as ModelCallReport, a_ as OperationalCoverageLine, a$ as OperationalCoverageLineSchema, b0 as OperationalCoverageTerm, b1 as OperationalCoverageTermSchema, b2 as OperationalEndorsementSupport, b3 as OperationalEndorsementSupportSchema, b4 as OperationalParty, b5 as OperationalPartySchema, b6 as PLATFORM_CONFIGS, b7 as ParsedAnswer, b8 as ParsedAnswerSchema, b9 as PlatformConfig, ba as PlatformSchema, bb as PolicyDocument, bc as PolicyDocumentSchema, bd as PolicyOperationalProfileSchema, be as PremiumLine, bf as PremiumLineSchema, bg as PriorAnswer, bh as ProcessApplicationInput, bi as ProcessApplicationResult, bj as ProcessReplyInput, bk as ProcessReplyResult, bl as QuestionBatchResult, bm as QuestionBatchResultSchema, bn as QuoteDocument, bo as QuoteDocumentSchema, bp as ReplyIntent, bq as ReplyIntentSchema, br as ResolveModelBudgetParams, bs as Section, bt as SectionSchema, bu as SourceBackedValue, bv as SourceBackedValueSchema, bw as SourceChunkSchema, bx as SourceKindSchema, by as SourceSpanBBoxSchema, bz as SourceSpanKind, bA as SourceSpanKindSchema, bB as SourceSpanLocationSchema, bC as SourceSpanRef, bD as SourceSpanRefSchema, bE as SourceSpanSchema, bF as SourceSpanTableLocationSchema, bG as SourceSpanUnitSchema, bH as Subjectivity, bI as SubjectivitySchema, bJ as Subsection, bK as SubsectionSchema, bL as UnderwritingCondition, bM as UnderwritingConditionSchema, bN as applyApplicationAnswers, bO as buildApplicationPacket, bP as buildQuestionGraphFromFields, bQ as createApplicationPipeline, bR as createApplicationRun, bS as extractQuestionGraphFromFields, bT as flattenQuestionGraph, bU as getActiveApplicationFields, bV as getNextApplicationQuestions, bW as normalizeApplicationQuestionGraph, bX as planNextApplicationQuestions, bY as proposeContextWrites, bZ as resolveModelBudget, b_ as validateApplicationPacket } from './index-q8LQXen9.js';
|
|
3
3
|
import * as zod from 'zod';
|
|
4
4
|
import { ZodTypeAny, z, ZodSchema } from 'zod';
|
|
5
5
|
import { PDFDocument } from 'pdf-lib';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
interface RetryOptions {
|
|
8
|
+
maxRetries?: number;
|
|
9
|
+
baseDelayMs?: number;
|
|
10
|
+
}
|
|
11
|
+
declare function withRetry<T>(fn: () => Promise<T>, log?: LogFn, options?: RetryOptions): Promise<T>;
|
|
8
12
|
|
|
9
13
|
/**
|
|
10
14
|
* Concurrency limiter — returns a function that wraps async tasks
|
|
@@ -31,6 +35,8 @@ interface SafeGenerateOptions<T> {
|
|
|
31
35
|
onError?: (error: unknown, attempt: number) => void;
|
|
32
36
|
/** Logger for pipeline status messages. */
|
|
33
37
|
log?: LogFn;
|
|
38
|
+
/** Controls retryable provider-error backoff around the host callback. Use false when the host already owns fallback. */
|
|
39
|
+
retry?: RetryOptions | false;
|
|
34
40
|
}
|
|
35
41
|
interface SafeGenerateParams {
|
|
36
42
|
prompt: string;
|
|
@@ -44,7 +50,7 @@ interface SafeGenerateParams {
|
|
|
44
50
|
/**
|
|
45
51
|
* Wraps a `generateObject` call with two layers of resilience:
|
|
46
52
|
*
|
|
47
|
-
* 1. Inner: `withRetry` handles
|
|
53
|
+
* 1. Inner: `withRetry` handles retryable provider errors with exponential backoff unless disabled.
|
|
48
54
|
* 2. Outer: catches all other errors (schema validation, malformed JSON, transient API errors)
|
|
49
55
|
* and retries up to `maxRetries` times. If all retries fail, returns `fallback` (if provided)
|
|
50
56
|
* or re-throws.
|
|
@@ -8734,6 +8740,7 @@ interface ExtractorConfig {
|
|
|
8734
8740
|
sourceStore?: SourceStore;
|
|
8735
8741
|
qualityGate?: QualityGateMode;
|
|
8736
8742
|
modelCapabilities?: ModelCapabilities;
|
|
8743
|
+
modelCapabilitiesByTaskKind?: Partial<Record<ModelTaskKind, ModelCapabilities>>;
|
|
8737
8744
|
modelBudgetConstraints?: Partial<Record<ModelTaskKind, ModelBudgetConstraint>>;
|
|
8738
8745
|
/** Optional checkpoint persistence callback. */
|
|
8739
8746
|
onCheckpointSave?: (checkpoint: PipelineCheckpoint<ExtractionState>) => Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -396,17 +396,19 @@ function isRetryableError(error) {
|
|
|
396
396
|
}
|
|
397
397
|
return false;
|
|
398
398
|
}
|
|
399
|
-
async function withRetry(fn, log) {
|
|
399
|
+
async function withRetry(fn, log, options) {
|
|
400
|
+
const maxRetries = options?.maxRetries ?? MAX_RETRIES;
|
|
401
|
+
const baseDelayMs = options?.baseDelayMs ?? BASE_DELAY_MS;
|
|
400
402
|
for (let attempt = 0; ; attempt++) {
|
|
401
403
|
try {
|
|
402
404
|
return await fn();
|
|
403
405
|
} catch (error) {
|
|
404
|
-
if (!isRetryableError(error) || attempt >=
|
|
406
|
+
if (!isRetryableError(error) || attempt >= maxRetries) {
|
|
405
407
|
throw error;
|
|
406
408
|
}
|
|
407
409
|
const jitter = Math.random() * 1e3;
|
|
408
|
-
const delay =
|
|
409
|
-
await log?.(`Retryable error, retrying in ${(delay / 1e3).toFixed(1)}s (attempt ${attempt + 1}/${
|
|
410
|
+
const delay = baseDelayMs * Math.pow(2, attempt) + jitter;
|
|
411
|
+
await log?.(`Retryable error, retrying in ${(delay / 1e3).toFixed(1)}s (attempt ${attempt + 1}/${maxRetries})...`);
|
|
410
412
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
411
413
|
}
|
|
412
414
|
}
|
|
@@ -533,10 +535,8 @@ async function safeGenerateObject(generateObject, params, options) {
|
|
|
533
535
|
const strictParams = { ...params, schema: toStrictSchema(params.schema) };
|
|
534
536
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
535
537
|
try {
|
|
536
|
-
const
|
|
537
|
-
|
|
538
|
-
options?.log
|
|
539
|
-
);
|
|
538
|
+
const generate = () => generateObject(strictParams);
|
|
539
|
+
const result = options?.retry === false ? await generate() : await withRetry(generate, options?.log, options?.retry);
|
|
540
540
|
return {
|
|
541
541
|
...result,
|
|
542
542
|
object: params.schema.parse(sanitizeNulls(result.object))
|
|
@@ -9578,11 +9578,20 @@ function coverageTextForSelection(coverage) {
|
|
|
9578
9578
|
])
|
|
9579
9579
|
].filter(Boolean).join(" ");
|
|
9580
9580
|
}
|
|
9581
|
+
function coverageCleanupEntries(profile, coverageIndexes) {
|
|
9582
|
+
if (!coverageIndexes) {
|
|
9583
|
+
return profile.coverages.map((coverage, coverageIndex) => ({ coverage, coverageIndex }));
|
|
9584
|
+
}
|
|
9585
|
+
return [...new Set(coverageIndexes)].sort((left, right) => left - right).map((coverageIndex) => {
|
|
9586
|
+
const coverage = profile.coverages[coverageIndex];
|
|
9587
|
+
return coverage ? { coverage, coverageIndex } : void 0;
|
|
9588
|
+
}).filter((entry) => Boolean(entry));
|
|
9589
|
+
}
|
|
9581
9590
|
function nodeTextMatchesCoverage(node, coverageTerms) {
|
|
9582
9591
|
const text = nodeTextForSelection(node).toLowerCase();
|
|
9583
9592
|
return coverageTerms.some((term) => term.length >= 5 && text.includes(term));
|
|
9584
9593
|
}
|
|
9585
|
-
function selectCoverageCleanupNodes(sourceTree,
|
|
9594
|
+
function selectCoverageCleanupNodes(sourceTree, coverages) {
|
|
9586
9595
|
const nodeById = new Map(sourceTree.map((node) => [node.id, node]));
|
|
9587
9596
|
const childrenByParent = /* @__PURE__ */ new Map();
|
|
9588
9597
|
for (const node of sourceTree) {
|
|
@@ -9600,12 +9609,12 @@ function selectCoverageCleanupNodes(sourceTree, profile) {
|
|
|
9600
9609
|
const current = selected.get(node.id);
|
|
9601
9610
|
if (!current || score > current.score) selected.set(node.id, { node, score });
|
|
9602
9611
|
};
|
|
9603
|
-
const sourceNodeIds = uniqueStrings(
|
|
9612
|
+
const sourceNodeIds = uniqueStrings(coverages.flatMap((coverage) => [
|
|
9604
9613
|
...coverage.sourceNodeIds,
|
|
9605
9614
|
...coverage.limits.flatMap((term) => term.sourceNodeIds)
|
|
9606
9615
|
]));
|
|
9607
9616
|
const coveragePages2 = /* @__PURE__ */ new Set();
|
|
9608
|
-
const coverageTerms = uniqueStrings(
|
|
9617
|
+
const coverageTerms = uniqueStrings(coverages.flatMap(
|
|
9609
9618
|
(coverage) => coverageTextForSelection(coverage).toLowerCase().split(/[^a-z0-9$,.]+/i).filter((part) => part.length >= 5)
|
|
9610
9619
|
));
|
|
9611
9620
|
for (const id of sourceNodeIds) {
|
|
@@ -9648,8 +9657,9 @@ function selectCoverageCleanupNodes(sourceTree, profile) {
|
|
|
9648
9657
|
(left, right) => (left.node.pageStart ?? Number.MAX_SAFE_INTEGER) - (right.node.pageStart ?? Number.MAX_SAFE_INTEGER) || left.node.order - right.node.order
|
|
9649
9658
|
).map((entry) => entry.node);
|
|
9650
9659
|
}
|
|
9651
|
-
function buildOperationalProfileCleanupPrompt(sourceTree, profile) {
|
|
9652
|
-
const
|
|
9660
|
+
function buildOperationalProfileCleanupPrompt(sourceTree, profile, options = {}) {
|
|
9661
|
+
const coverageEntries = coverageCleanupEntries(profile, options.coverageIndexes);
|
|
9662
|
+
const nodes = selectCoverageCleanupNodes(sourceTree, coverageEntries.map((entry) => entry.coverage)).map((node) => compactNode(
|
|
9653
9663
|
node,
|
|
9654
9664
|
node.kind === "page" || node.kind === "page_group" ? 260 : node.kind === "table_row" || node.kind === "table_cell" ? 520 : 360
|
|
9655
9665
|
));
|
|
@@ -9657,9 +9667,12 @@ function buildOperationalProfileCleanupPrompt(sourceTree, profile) {
|
|
|
9657
9667
|
documentType: profile.documentType,
|
|
9658
9668
|
policyTypes: profile.policyTypes,
|
|
9659
9669
|
coverageTypes: profile.coverageTypes,
|
|
9660
|
-
coverages:
|
|
9670
|
+
coverages: coverageEntries.map(({ coverage, coverageIndex }) => compactCoverageForCleanup(coverage, coverageIndex))
|
|
9661
9671
|
};
|
|
9662
9672
|
return `Review and clean a source-backed operational profile projection for an insurance policy.
|
|
9673
|
+
${options.label ? `
|
|
9674
|
+
Coverage group: ${options.label}
|
|
9675
|
+
` : ""}
|
|
9663
9676
|
|
|
9664
9677
|
Task:
|
|
9665
9678
|
- Inspect the candidate coverage projection against the source nodes.
|
|
@@ -11744,7 +11757,8 @@ async function runVisualTableRepair(params) {
|
|
|
11744
11757
|
if (candidates.length === 0) return { sourceTree: params.sourceTree, warnings: [] };
|
|
11745
11758
|
let sourceTree = params.sourceTree;
|
|
11746
11759
|
const warnings = [];
|
|
11747
|
-
|
|
11760
|
+
const repairResults = await Promise.all(candidates.map(async (candidate, index) => {
|
|
11761
|
+
const label = `source_tree_visual_table_repair_p${candidate.page}`;
|
|
11748
11762
|
try {
|
|
11749
11763
|
const budget = params.resolveBudget("extraction_source_tree", 1800);
|
|
11750
11764
|
const maxTokens = Math.min(budget.maxTokens, 2400);
|
|
@@ -11758,7 +11772,7 @@ async function runVisualTableRepair(params) {
|
|
|
11758
11772
|
taskKind: "extraction_source_tree",
|
|
11759
11773
|
budgetDiagnostics: { ...budget, maxTokens },
|
|
11760
11774
|
trace: {
|
|
11761
|
-
label
|
|
11775
|
+
label,
|
|
11762
11776
|
startPage: candidate.page,
|
|
11763
11777
|
endPage: candidate.page,
|
|
11764
11778
|
batchIndex: index + 1,
|
|
@@ -11768,23 +11782,43 @@ async function runVisualTableRepair(params) {
|
|
|
11768
11782
|
},
|
|
11769
11783
|
{
|
|
11770
11784
|
fallback: { tables: [], warnings: [] },
|
|
11771
|
-
|
|
11785
|
+
maxRetries: 0,
|
|
11786
|
+
log: params.log,
|
|
11787
|
+
retry: false
|
|
11772
11788
|
}
|
|
11773
11789
|
);
|
|
11774
|
-
|
|
11775
|
-
|
|
11776
|
-
|
|
11790
|
+
return {
|
|
11791
|
+
index,
|
|
11792
|
+
candidate,
|
|
11793
|
+
label,
|
|
11777
11794
|
maxTokens,
|
|
11778
|
-
durationMs: Date.now() - startedAt
|
|
11779
|
-
|
|
11780
|
-
|
|
11781
|
-
|
|
11782
|
-
warnings.push(...repair.warnings.map(
|
|
11783
|
-
(warning) => `Visual table repair warning on page ${candidate.page}: ${warning}`
|
|
11784
|
-
));
|
|
11795
|
+
durationMs: Date.now() - startedAt,
|
|
11796
|
+
usage: response.usage,
|
|
11797
|
+
repair: response.object
|
|
11798
|
+
};
|
|
11785
11799
|
} catch (error) {
|
|
11786
|
-
|
|
11800
|
+
return {
|
|
11801
|
+
index,
|
|
11802
|
+
candidate,
|
|
11803
|
+
error: error instanceof Error ? error.message : String(error)
|
|
11804
|
+
};
|
|
11787
11805
|
}
|
|
11806
|
+
}));
|
|
11807
|
+
for (const result of repairResults.sort((left, right) => left.index - right.index)) {
|
|
11808
|
+
if ("error" in result) {
|
|
11809
|
+
warnings.push(`Visual table repair skipped on page ${result.candidate.page}; parsed table kept (${result.error})`);
|
|
11810
|
+
continue;
|
|
11811
|
+
}
|
|
11812
|
+
params.trackUsage(result.usage, {
|
|
11813
|
+
taskKind: "extraction_source_tree",
|
|
11814
|
+
label: result.label,
|
|
11815
|
+
maxTokens: result.maxTokens,
|
|
11816
|
+
durationMs: result.durationMs
|
|
11817
|
+
});
|
|
11818
|
+
sourceTree = applyVisualTableRepair(sourceTree, result.repair);
|
|
11819
|
+
warnings.push(...result.repair.warnings.map(
|
|
11820
|
+
(warning) => `Visual table repair warning on page ${result.candidate.page}: ${warning}`
|
|
11821
|
+
));
|
|
11788
11822
|
}
|
|
11789
11823
|
return { sourceTree, warnings };
|
|
11790
11824
|
}
|
|
@@ -12037,9 +12071,9 @@ async function runSourceTreeExtraction(params) {
|
|
|
12037
12071
|
};
|
|
12038
12072
|
if (shouldRunSourceTreeOrganizer(sourceTree, sourceSpans)) {
|
|
12039
12073
|
try {
|
|
12040
|
-
const organizations = [];
|
|
12041
12074
|
const batches = organizationBatches(sourceTree);
|
|
12042
|
-
|
|
12075
|
+
const organizationResults = await Promise.all(batches.map(async (batch, batchIndex) => {
|
|
12076
|
+
const label = batches.length > 1 ? `source_tree_organizer_${batchIndex + 1}` : "source_tree_organizer";
|
|
12043
12077
|
const budget = params.resolveBudget("extraction_source_tree", 4096);
|
|
12044
12078
|
const startedAt = Date.now();
|
|
12045
12079
|
const response = await safeGenerateObject(
|
|
@@ -12049,20 +12083,39 @@ async function runSourceTreeExtraction(params) {
|
|
|
12049
12083
|
schema: SourceTreeOrganizationSchema,
|
|
12050
12084
|
maxTokens: budget.maxTokens,
|
|
12051
12085
|
taskKind: "extraction_source_tree",
|
|
12052
|
-
budgetDiagnostics: budget
|
|
12086
|
+
budgetDiagnostics: budget,
|
|
12087
|
+
trace: {
|
|
12088
|
+
label,
|
|
12089
|
+
batchIndex: batchIndex + 1,
|
|
12090
|
+
batchCount: batches.length,
|
|
12091
|
+
sourceBacked: true
|
|
12092
|
+
}
|
|
12053
12093
|
},
|
|
12054
12094
|
{
|
|
12055
12095
|
fallback: { labels: [], groups: [] },
|
|
12056
|
-
|
|
12096
|
+
maxRetries: 0,
|
|
12097
|
+
log: params.log,
|
|
12098
|
+
retry: false
|
|
12057
12099
|
}
|
|
12058
12100
|
);
|
|
12059
|
-
|
|
12101
|
+
return {
|
|
12102
|
+
batchIndex,
|
|
12103
|
+
label,
|
|
12104
|
+
budget,
|
|
12105
|
+
durationMs: Date.now() - startedAt,
|
|
12106
|
+
usage: response.usage,
|
|
12107
|
+
organization: response.object
|
|
12108
|
+
};
|
|
12109
|
+
}));
|
|
12110
|
+
const organizations = [];
|
|
12111
|
+
for (const result of organizationResults.sort((left, right) => left.batchIndex - right.batchIndex)) {
|
|
12112
|
+
localTrack(result.usage, {
|
|
12060
12113
|
taskKind: "extraction_source_tree",
|
|
12061
|
-
label:
|
|
12062
|
-
maxTokens: budget.maxTokens,
|
|
12063
|
-
durationMs:
|
|
12114
|
+
label: result.label,
|
|
12115
|
+
maxTokens: result.budget.maxTokens,
|
|
12116
|
+
durationMs: result.durationMs
|
|
12064
12117
|
});
|
|
12065
|
-
organizations.push(
|
|
12118
|
+
organizations.push(result.organization);
|
|
12066
12119
|
}
|
|
12067
12120
|
sourceTree = applyOrganization(sourceTree, mergeOrganizationResults(organizations));
|
|
12068
12121
|
} catch (error) {
|
|
@@ -12087,7 +12140,9 @@ async function runSourceTreeExtraction(params) {
|
|
|
12087
12140
|
},
|
|
12088
12141
|
{
|
|
12089
12142
|
fallback: { labels: [], groups: [] },
|
|
12090
|
-
|
|
12143
|
+
maxRetries: 0,
|
|
12144
|
+
log: params.log,
|
|
12145
|
+
retry: false
|
|
12091
12146
|
}
|
|
12092
12147
|
);
|
|
12093
12148
|
localTrack(response.usage, {
|
|
@@ -12129,7 +12184,9 @@ async function runSourceTreeExtraction(params) {
|
|
|
12129
12184
|
},
|
|
12130
12185
|
{
|
|
12131
12186
|
fallback: emptyProfile,
|
|
12132
|
-
|
|
12187
|
+
maxRetries: 0,
|
|
12188
|
+
log: params.log,
|
|
12189
|
+
retry: false
|
|
12133
12190
|
}
|
|
12134
12191
|
);
|
|
12135
12192
|
localTrack(response.usage, {
|
|
@@ -12162,16 +12219,23 @@ async function runSourceTreeExtraction(params) {
|
|
|
12162
12219
|
taskKind: "extraction_coverage_cleanup",
|
|
12163
12220
|
budgetDiagnostics: budget,
|
|
12164
12221
|
providerOptions: params.providerOptions,
|
|
12165
|
-
trace: {
|
|
12222
|
+
trace: {
|
|
12223
|
+
phase: "coverage_cleanup",
|
|
12224
|
+
label: "Coverage cleanup",
|
|
12225
|
+
itemCount: operationalProfile.coverages.length,
|
|
12226
|
+
sourceBacked: true
|
|
12227
|
+
}
|
|
12166
12228
|
},
|
|
12167
12229
|
{
|
|
12168
12230
|
fallback: { coverageDecisions: [], warnings: [] },
|
|
12169
|
-
|
|
12231
|
+
maxRetries: 0,
|
|
12232
|
+
log: params.log,
|
|
12233
|
+
retry: false
|
|
12170
12234
|
}
|
|
12171
12235
|
);
|
|
12172
12236
|
localTrack(response.usage, {
|
|
12173
12237
|
taskKind: "extraction_coverage_cleanup",
|
|
12174
|
-
label: "
|
|
12238
|
+
label: "coverage_cleanup",
|
|
12175
12239
|
maxTokens: budget.maxTokens,
|
|
12176
12240
|
durationMs: Date.now() - startedAt
|
|
12177
12241
|
});
|
|
@@ -12231,6 +12295,7 @@ function createExtractor(config) {
|
|
|
12231
12295
|
sourceStore,
|
|
12232
12296
|
qualityGate = "warn",
|
|
12233
12297
|
modelCapabilities,
|
|
12298
|
+
modelCapabilitiesByTaskKind,
|
|
12234
12299
|
modelBudgetConstraints,
|
|
12235
12300
|
onCheckpointSave
|
|
12236
12301
|
} = config;
|
|
@@ -12247,10 +12312,11 @@ function createExtractor(config) {
|
|
|
12247
12312
|
};
|
|
12248
12313
|
let activeProviderOptions = providerOptions;
|
|
12249
12314
|
function resolveBudget(taskKind, hintTokens) {
|
|
12315
|
+
const taskModelCapabilities = modelCapabilitiesByTaskKind?.[taskKind] ?? modelCapabilities;
|
|
12250
12316
|
return resolveModelBudget({
|
|
12251
12317
|
taskKind,
|
|
12252
12318
|
hintTokens,
|
|
12253
|
-
modelCapabilities,
|
|
12319
|
+
modelCapabilities: taskModelCapabilities,
|
|
12254
12320
|
constraint: modelBudgetConstraints?.[taskKind]
|
|
12255
12321
|
});
|
|
12256
12322
|
}
|
|
@@ -12573,7 +12639,9 @@ ${sourceText}`;
|
|
|
12573
12639
|
},
|
|
12574
12640
|
{
|
|
12575
12641
|
fallback: { forms: [] },
|
|
12642
|
+
maxRetries: 0,
|
|
12576
12643
|
log,
|
|
12644
|
+
retry: false,
|
|
12577
12645
|
onError: (err, attempt) => log?.(`Form inventory attempt ${attempt + 1} failed: ${err instanceof Error ? err.message : String(err)}`)
|
|
12578
12646
|
}
|
|
12579
12647
|
);
|