@bubblelab/bubble-core 0.1.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/LICENSE.txt +202 -0
- package/dist/bubble-bundle.d.ts +2021 -0
- package/dist/bubble-factory.d.ts +161 -0
- package/dist/bubble-factory.d.ts.map +1 -0
- package/dist/bubble-factory.js +426 -0
- package/dist/bubble-factory.js.map +1 -0
- package/dist/bubble-flow/bubble-flow-class.d.ts +19 -0
- package/dist/bubble-flow/bubble-flow-class.d.ts.map +1 -0
- package/dist/bubble-flow/bubble-flow-class.js +23 -0
- package/dist/bubble-flow/bubble-flow-class.js.map +1 -0
- package/dist/bubble-flow/sample/data-analyst-flow.d.ts +15 -0
- package/dist/bubble-flow/sample/data-analyst-flow.d.ts.map +1 -0
- package/dist/bubble-flow/sample/data-analyst-flow.js +63 -0
- package/dist/bubble-flow/sample/data-analyst-flow.js.map +1 -0
- package/dist/bubble-flow/sample/error-ts.d.ts +23 -0
- package/dist/bubble-flow/sample/error-ts.d.ts.map +1 -0
- package/dist/bubble-flow/sample/error-ts.js +31 -0
- package/dist/bubble-flow/sample/error-ts.js.map +1 -0
- package/dist/bubble-flow/sample/sanitytest.d.ts +10 -0
- package/dist/bubble-flow/sample/sanitytest.d.ts.map +1 -0
- package/dist/bubble-flow/sample/sanitytest.js +13 -0
- package/dist/bubble-flow/sample/sanitytest.js.map +1 -0
- package/dist/bubble-flow/sample/simple-webhook-2.d.ts +19 -0
- package/dist/bubble-flow/sample/simple-webhook-2.d.ts.map +1 -0
- package/dist/bubble-flow/sample/simple-webhook-2.js +23 -0
- package/dist/bubble-flow/sample/simple-webhook-2.js.map +1 -0
- package/dist/bubble-flow/sample/simple-webhook.d.ts +10 -0
- package/dist/bubble-flow/sample/simple-webhook.d.ts.map +1 -0
- package/dist/bubble-flow/sample/simple-webhook.js +18 -0
- package/dist/bubble-flow/sample/simple-webhook.js.map +1 -0
- package/dist/bubble-flow/sample/simplified-data-analysis.flow.d.ts +29 -0
- package/dist/bubble-flow/sample/simplified-data-analysis.flow.d.ts.map +1 -0
- package/dist/bubble-flow/sample/simplified-data-analysis.flow.js +150 -0
- package/dist/bubble-flow/sample/simplified-data-analysis.flow.js.map +1 -0
- package/dist/bubble-flow/sample/slack-v0.1.d.ts +10 -0
- package/dist/bubble-flow/sample/slack-v0.1.d.ts.map +1 -0
- package/dist/bubble-flow/sample/slack-v0.1.js +59 -0
- package/dist/bubble-flow/sample/slack-v0.1.js.map +1 -0
- package/dist/bubble-flow/sample/slackagenttest.d.ts +10 -0
- package/dist/bubble-flow/sample/slackagenttest.d.ts.map +1 -0
- package/dist/bubble-flow/sample/slackagenttest.js +59 -0
- package/dist/bubble-flow/sample/slackagenttest.js.map +1 -0
- package/dist/bubble-trigger/index.d.ts +2 -0
- package/dist/bubble-trigger/index.d.ts.map +1 -0
- package/dist/bubble-trigger/index.js +2 -0
- package/dist/bubble-trigger/index.js.map +1 -0
- package/dist/bubble-trigger/types.d.ts +87 -0
- package/dist/bubble-trigger/types.d.ts.map +1 -0
- package/dist/bubble-trigger/types.js +14 -0
- package/dist/bubble-trigger/types.js.map +1 -0
- package/dist/bubbles/service-bubble/ai-agent.d.ts +428 -0
- package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/ai-agent.js +881 -0
- package/dist/bubbles/service-bubble/ai-agent.js.map +1 -0
- package/dist/bubbles/service-bubble/gmail.d.ts +3073 -0
- package/dist/bubbles/service-bubble/gmail.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/gmail.js +908 -0
- package/dist/bubbles/service-bubble/gmail.js.map +1 -0
- package/dist/bubbles/service-bubble/google-calendar.d.ts +3377 -0
- package/dist/bubbles/service-bubble/google-calendar.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/google-calendar.js +527 -0
- package/dist/bubbles/service-bubble/google-calendar.js.map +1 -0
- package/dist/bubbles/service-bubble/google-drive.d.ts +1152 -0
- package/dist/bubbles/service-bubble/google-drive.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/google-drive.js +943 -0
- package/dist/bubbles/service-bubble/google-drive.js.map +1 -0
- package/dist/bubbles/service-bubble/google-sheets.d.ts +1811 -0
- package/dist/bubbles/service-bubble/google-sheets.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/google-sheets.js +904 -0
- package/dist/bubbles/service-bubble/google-sheets.js.map +1 -0
- package/dist/bubbles/service-bubble/hello-world.d.ts +74 -0
- package/dist/bubbles/service-bubble/hello-world.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/hello-world.js +67 -0
- package/dist/bubbles/service-bubble/hello-world.js.map +1 -0
- package/dist/bubbles/service-bubble/http.d.ts +134 -0
- package/dist/bubbles/service-bubble/http.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/http.js +184 -0
- package/dist/bubbles/service-bubble/http.js.map +1 -0
- package/dist/bubbles/service-bubble/postgresql.d.ts +180 -0
- package/dist/bubbles/service-bubble/postgresql.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/postgresql.js +448 -0
- package/dist/bubbles/service-bubble/postgresql.js.map +1 -0
- package/dist/bubbles/service-bubble/resend.d.ts +301 -0
- package/dist/bubbles/service-bubble/resend.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/resend.js +253 -0
- package/dist/bubbles/service-bubble/resend.js.map +1 -0
- package/dist/bubbles/service-bubble/slack.d.ts +5869 -0
- package/dist/bubbles/service-bubble/slack.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/slack.js +1536 -0
- package/dist/bubbles/service-bubble/slack.js.map +1 -0
- package/dist/bubbles/service-bubble/storage.d.ts +571 -0
- package/dist/bubbles/service-bubble/storage.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/storage.js +504 -0
- package/dist/bubbles/service-bubble/storage.js.map +1 -0
- package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +308 -0
- package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js +285 -0
- package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +416 -0
- package/dist/bubbles/tool-bubble/chart-js-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/chart-js-tool.js +570 -0
- package/dist/bubbles/tool-bubble/chart-js-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts +99 -0
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.js +645 -0
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts +112 -0
- package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/list-bubbles-tool.js +82 -0
- package/dist/bubbles/tool-bubble/list-bubbles-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +413 -0
- package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/reddit-scrape-tool.js +327 -0
- package/dist/bubbles/tool-bubble/reddit-scrape-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +122 -0
- package/dist/bubbles/tool-bubble/research-agent-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/research-agent-tool.js +343 -0
- package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +131 -0
- package/dist/bubbles/tool-bubble/sql-query-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/sql-query-tool.js +147 -0
- package/dist/bubbles/tool-bubble/sql-query-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/tool-template.d.ts +257 -0
- package/dist/bubbles/tool-bubble/tool-template.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/tool-template.js +238 -0
- package/dist/bubbles/tool-bubble/tool-template.js.map +1 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor-example.d.ts +8 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor-example.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor-example.js +65 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor-example.js.map +1 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor.tool.d.ts +125 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor.tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor.tool.js +169 -0
- package/dist/bubbles/tool-bubble/virtual-file-editor.tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +218 -0
- package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/web-crawl-tool.js +255 -0
- package/dist/bubbles/tool-bubble/web-crawl-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +134 -0
- package/dist/bubbles/tool-bubble/web-extract-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/web-extract-tool.js +175 -0
- package/dist/bubbles/tool-bubble/web-extract-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +228 -0
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/web-scrape-tool.js +214 -0
- package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/web-search-tool.d.ts +134 -0
- package/dist/bubbles/tool-bubble/web-search-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/web-search-tool.js +155 -0
- package/dist/bubbles/tool-bubble/web-search-tool.js.map +1 -0
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts +114 -0
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js +777 -0
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.d.ts +97 -0
- package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.js +327 -0
- package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts +303 -0
- package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/database-analyzer.workflow.js +297 -0
- package/dist/bubbles/workflow-bubble/database-analyzer.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.d.ts +157 -0
- package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.js +310 -0
- package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +543 -0
- package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/generate-document.workflow.js +628 -0
- package/dist/bubbles/workflow-bubble/generate-document.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts +679 -0
- package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/parse-document.workflow.js +604 -0
- package/dist/bubbles/workflow-bubble/parse-document.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +1011 -0
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js +841 -0
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +883 -0
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js +781 -0
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +300 -0
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js +508 -0
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +731 -0
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.js +690 -0
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.js.map +1 -0
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts +401 -0
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js +382 -0
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js.map +1 -0
- package/dist/bubbles/workflow-bubble/workflow-template.d.ts +144 -0
- package/dist/bubbles/workflow-bubble/workflow-template.d.ts.map +1 -0
- package/dist/bubbles/workflow-bubble/workflow-template.js +124 -0
- package/dist/bubbles/workflow-bubble/workflow-template.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/BubbleLogger.d.ts +146 -0
- package/dist/logging/BubbleLogger.d.ts.map +1 -0
- package/dist/logging/BubbleLogger.js +472 -0
- package/dist/logging/BubbleLogger.js.map +1 -0
- package/dist/logging/StreamingBubbleLogger.d.ts +85 -0
- package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -0
- package/dist/logging/StreamingBubbleLogger.js +340 -0
- package/dist/logging/StreamingBubbleLogger.js.map +1 -0
- package/dist/types/ai-models.d.ts +4 -0
- package/dist/types/ai-models.d.ts.map +1 -0
- package/dist/types/ai-models.js +14 -0
- package/dist/types/ai-models.js.map +1 -0
- package/dist/types/available-tools.d.ts +4 -0
- package/dist/types/available-tools.d.ts.map +1 -0
- package/dist/types/available-tools.js +19 -0
- package/dist/types/available-tools.js.map +1 -0
- package/dist/types/base-bubble-class.d.ts +47 -0
- package/dist/types/base-bubble-class.d.ts.map +1 -0
- package/dist/types/base-bubble-class.js +212 -0
- package/dist/types/base-bubble-class.js.map +1 -0
- package/dist/types/bubble-errors.d.ts +44 -0
- package/dist/types/bubble-errors.d.ts.map +1 -0
- package/dist/types/bubble-errors.js +51 -0
- package/dist/types/bubble-errors.js.map +1 -0
- package/dist/types/bubble.d.ts +73 -0
- package/dist/types/bubble.d.ts.map +1 -0
- package/dist/types/bubble.js +2 -0
- package/dist/types/bubble.js.map +1 -0
- package/dist/types/credentials.d.ts +6 -0
- package/dist/types/credentials.d.ts.map +1 -0
- package/dist/types/credentials.js +6 -0
- package/dist/types/credentials.js.map +1 -0
- package/dist/types/service-bubble-class.d.ts +31 -0
- package/dist/types/service-bubble-class.d.ts.map +1 -0
- package/dist/types/service-bubble-class.js +36 -0
- package/dist/types/service-bubble-class.js.map +1 -0
- package/dist/types/streaming-events.d.ts +18 -0
- package/dist/types/streaming-events.d.ts.map +1 -0
- package/dist/types/streaming-events.js +5 -0
- package/dist/types/streaming-events.js.map +1 -0
- package/dist/types/tool-bubble-class.d.ts +19 -0
- package/dist/types/tool-bubble-class.d.ts.map +1 -0
- package/dist/types/tool-bubble-class.js +48 -0
- package/dist/types/tool-bubble-class.js.map +1 -0
- package/dist/types/workflow-bubble-class.d.ts +25 -0
- package/dist/types/workflow-bubble-class.d.ts.map +1 -0
- package/dist/types/workflow-bubble-class.js +30 -0
- package/dist/types/workflow-bubble-class.js.map +1 -0
- package/dist/utils/bubbleflow-parser.d.ts +32 -0
- package/dist/utils/bubbleflow-parser.d.ts.map +1 -0
- package/dist/utils/bubbleflow-parser.js +332 -0
- package/dist/utils/bubbleflow-parser.js.map +1 -0
- package/dist/utils/bubbleflow-validation.d.ts +9 -0
- package/dist/utils/bubbleflow-validation.d.ts.map +1 -0
- package/dist/utils/bubbleflow-validation.js +116 -0
- package/dist/utils/bubbleflow-validation.js.map +1 -0
- package/dist/utils/json-parsing.d.ts +20 -0
- package/dist/utils/json-parsing.d.ts.map +1 -0
- package/dist/utils/json-parsing.js +394 -0
- package/dist/utils/json-parsing.js.map +1 -0
- package/dist/utils/mock-data-generator.d.ts +43 -0
- package/dist/utils/mock-data-generator.d.ts.map +1 -0
- package/dist/utils/mock-data-generator.js +312 -0
- package/dist/utils/mock-data-generator.js.map +1 -0
- package/dist/utils/param-helper.d.ts +2 -0
- package/dist/utils/param-helper.d.ts.map +1 -0
- package/dist/utils/param-helper.js +5 -0
- package/dist/utils/param-helper.js.map +1 -0
- package/dist/utils/source-bubble-parser.d.ts +31 -0
- package/dist/utils/source-bubble-parser.d.ts.map +1 -0
- package/dist/utils/source-bubble-parser.js +231 -0
- package/dist/utils/source-bubble-parser.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PARSE DOCUMENT WORKFLOW
|
|
3
|
+
*
|
|
4
|
+
* A comprehensive workflow that converts images and PDFs into structured markdown
|
|
5
|
+
* using AI vision analysis. Preserves document structure, describes charts and images
|
|
6
|
+
* numerically, and maintains formatting and layout information.
|
|
7
|
+
*
|
|
8
|
+
* This workflow combines:
|
|
9
|
+
* 1. PDF to images conversion using pdf-img-convert
|
|
10
|
+
* 2. AI vision analysis for content extraction and markdown generation
|
|
11
|
+
* 3. Structure preservation with table, chart, and image descriptions
|
|
12
|
+
*
|
|
13
|
+
* Returns clean markdown with preserved structure and detailed visual descriptions.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { WorkflowBubble } from '../../types/workflow-bubble-class.js';
|
|
17
|
+
import { CredentialType } from '@bubblelab/shared-schemas';
|
|
18
|
+
import { PDFFormOperationsWorkflow } from './pdf-form-operations.workflow.js';
|
|
19
|
+
import { AIAgentBubble } from '../service-bubble/ai-agent.js';
|
|
20
|
+
import { AvailableModels } from '../../types/ai-models.js';
|
|
21
|
+
/**
|
|
22
|
+
* System prompt for document parsing and markdown conversion
|
|
23
|
+
*/
|
|
24
|
+
const DOCUMENT_PARSING_PROMPT = `Extract ONLY the most important information from this document. Focus on meaning and data, NOT text transcription.
|
|
25
|
+
|
|
26
|
+
CRITICAL LIMITS:
|
|
27
|
+
- Maximum response: 800 words
|
|
28
|
+
- NO full text transcription or OCR
|
|
29
|
+
- Extract MEANING and NUMBERS only
|
|
30
|
+
- Be concise and focused
|
|
31
|
+
|
|
32
|
+
EXTRACT ONLY:
|
|
33
|
+
1. **Key Numbers**: amounts, percentages, dates, quantities, IDs, phone numbers
|
|
34
|
+
2. **Important Names**: people, companies, locations, products
|
|
35
|
+
3. **Critical Data**: totals, balances, scores, measurements
|
|
36
|
+
4. **Document Type**: what kind of document this is
|
|
37
|
+
5. **Main Purpose**: what this document is about in 1-2 sentences
|
|
38
|
+
|
|
39
|
+
IGNORE:
|
|
40
|
+
- Full sentences and paragraphs
|
|
41
|
+
- Boilerplate text
|
|
42
|
+
- Legal disclaimers
|
|
43
|
+
- Formatting details
|
|
44
|
+
- Complete transcription
|
|
45
|
+
|
|
46
|
+
FORMAT: Use bullet points. Be extremely concise. Focus on actionable data.
|
|
47
|
+
|
|
48
|
+
EXAMPLE OUTPUT:
|
|
49
|
+
• Document: Invoice
|
|
50
|
+
• Company: XYZ Corp
|
|
51
|
+
• Amount: $1,234.56
|
|
52
|
+
• Date: 2024-01-15
|
|
53
|
+
• Invoice #: INV-2024-001
|
|
54
|
+
• Purpose: Software licensing fees
|
|
55
|
+
|
|
56
|
+
STOP after extracting key data. Do not transcribe full text.`;
|
|
57
|
+
/**
|
|
58
|
+
* Parameters schema for Parse Document workflow
|
|
59
|
+
*/
|
|
60
|
+
const ParseDocumentWorkflowParamsSchema = z.object({
|
|
61
|
+
documentData: z
|
|
62
|
+
.string()
|
|
63
|
+
.min(1, 'Document data is required')
|
|
64
|
+
.describe('Base64 encoded document data (PDF or image) OR R2 file URL starting with https://'),
|
|
65
|
+
documentType: z
|
|
66
|
+
.enum(['pdf', 'image'])
|
|
67
|
+
.default('pdf')
|
|
68
|
+
.describe('Type of document being processed'),
|
|
69
|
+
isFileUrl: z
|
|
70
|
+
.boolean()
|
|
71
|
+
.optional()
|
|
72
|
+
.default(false)
|
|
73
|
+
.describe('Set to true if documentData is an R2 file URL instead of base64'),
|
|
74
|
+
conversionOptions: z
|
|
75
|
+
.object({
|
|
76
|
+
preserveStructure: z
|
|
77
|
+
.boolean()
|
|
78
|
+
.default(true)
|
|
79
|
+
.describe('Maintain original document structure and hierarchy'),
|
|
80
|
+
includeVisualDescriptions: z
|
|
81
|
+
.boolean()
|
|
82
|
+
.default(true)
|
|
83
|
+
.describe('Include detailed descriptions of charts, images, and diagrams'),
|
|
84
|
+
extractNumericalData: z
|
|
85
|
+
.boolean()
|
|
86
|
+
.default(true)
|
|
87
|
+
.describe('Extract specific numerical values from charts and tables'),
|
|
88
|
+
combinePages: z
|
|
89
|
+
.boolean()
|
|
90
|
+
.default(false)
|
|
91
|
+
.describe('Deprecated: Pages are always kept separate with clear headers'),
|
|
92
|
+
})
|
|
93
|
+
.default({
|
|
94
|
+
preserveStructure: true,
|
|
95
|
+
includeVisualDescriptions: true,
|
|
96
|
+
extractNumericalData: true,
|
|
97
|
+
combinePages: false,
|
|
98
|
+
})
|
|
99
|
+
.describe('Options for document conversion and parsing'),
|
|
100
|
+
imageOptions: z
|
|
101
|
+
.object({
|
|
102
|
+
format: z
|
|
103
|
+
.enum(['png', 'jpeg'])
|
|
104
|
+
.default('png')
|
|
105
|
+
.describe('Output image format for PDF conversion'),
|
|
106
|
+
quality: z
|
|
107
|
+
.number()
|
|
108
|
+
.min(0.1)
|
|
109
|
+
.max(1.0)
|
|
110
|
+
.default(0.9)
|
|
111
|
+
.describe('Image quality (0.1-1.0, higher = better quality)'),
|
|
112
|
+
dpi: z
|
|
113
|
+
.number()
|
|
114
|
+
.min(150)
|
|
115
|
+
.max(300)
|
|
116
|
+
.default(200)
|
|
117
|
+
.describe('Output DPI for PDF conversion (higher = better quality)'),
|
|
118
|
+
pages: z
|
|
119
|
+
.array(z.number().positive())
|
|
120
|
+
.optional()
|
|
121
|
+
.describe('Specific page numbers to process (1-indexed)'),
|
|
122
|
+
})
|
|
123
|
+
.default({
|
|
124
|
+
format: 'png',
|
|
125
|
+
quality: 0.9,
|
|
126
|
+
dpi: 200,
|
|
127
|
+
})
|
|
128
|
+
.describe('Options for PDF to images conversion'),
|
|
129
|
+
aiOptions: z
|
|
130
|
+
.object({
|
|
131
|
+
model: AvailableModels.default('google/gemini-2.5-flash').describe('AI model to use for document analysis and conversion'),
|
|
132
|
+
temperature: z
|
|
133
|
+
.number()
|
|
134
|
+
.min(0)
|
|
135
|
+
.max(2)
|
|
136
|
+
.default(0.4)
|
|
137
|
+
.describe('Temperature for AI responses (balanced for accuracy vs recitation)'),
|
|
138
|
+
maxTokens: z
|
|
139
|
+
.number()
|
|
140
|
+
.positive()
|
|
141
|
+
.default(2000)
|
|
142
|
+
.describe('Maximum tokens for AI response'),
|
|
143
|
+
jsonMode: z
|
|
144
|
+
.boolean()
|
|
145
|
+
.default(false)
|
|
146
|
+
.describe('Use JSON mode for structured output'),
|
|
147
|
+
})
|
|
148
|
+
.default({
|
|
149
|
+
model: 'google/gemini-2.5-flash',
|
|
150
|
+
temperature: 0.4,
|
|
151
|
+
maxTokens: 9000,
|
|
152
|
+
jsonMode: false,
|
|
153
|
+
})
|
|
154
|
+
.describe('AI agent configuration options'),
|
|
155
|
+
storageOptions: z
|
|
156
|
+
.object({
|
|
157
|
+
uploadImages: z
|
|
158
|
+
.boolean()
|
|
159
|
+
.default(false)
|
|
160
|
+
.describe('Whether to upload converted page images to S3'),
|
|
161
|
+
bucketName: z
|
|
162
|
+
.string()
|
|
163
|
+
.optional()
|
|
164
|
+
.describe('S3 bucket name for image uploads'),
|
|
165
|
+
pageImageUrls: z
|
|
166
|
+
.array(z.object({
|
|
167
|
+
pageNumber: z.number(),
|
|
168
|
+
uploadUrl: z.string(),
|
|
169
|
+
fileName: z.string(),
|
|
170
|
+
}))
|
|
171
|
+
.optional()
|
|
172
|
+
.describe('Pre-generated upload URLs for page images'),
|
|
173
|
+
userId: z
|
|
174
|
+
.string()
|
|
175
|
+
.optional()
|
|
176
|
+
.describe('User ID for secure file isolation'),
|
|
177
|
+
})
|
|
178
|
+
.optional()
|
|
179
|
+
.describe('Storage options for uploading page images'),
|
|
180
|
+
credentials: z
|
|
181
|
+
.record(z.nativeEnum(CredentialType), z.string())
|
|
182
|
+
.optional()
|
|
183
|
+
.describe('Credentials for AI model access (GOOGLE_GEMINI_CRED, OPENAI_CRED, etc.)'),
|
|
184
|
+
});
|
|
185
|
+
/**
|
|
186
|
+
* Result schema for Parse Document workflow
|
|
187
|
+
*/
|
|
188
|
+
const ParseDocumentWorkflowResultSchema = z.object({
|
|
189
|
+
markdown: z.string().describe('Generated markdown content from the document'),
|
|
190
|
+
pages: z
|
|
191
|
+
.array(z.object({
|
|
192
|
+
pageNumber: z.number().describe('Page number (1-indexed)'),
|
|
193
|
+
markdown: z.string().describe('Markdown content for this page'),
|
|
194
|
+
hasCharts: z
|
|
195
|
+
.boolean()
|
|
196
|
+
.describe('Whether this page contains charts or graphs'),
|
|
197
|
+
hasTables: z.boolean().describe('Whether this page contains tables'),
|
|
198
|
+
hasImages: z.boolean().describe('Whether this page contains images'),
|
|
199
|
+
}))
|
|
200
|
+
.describe('Per-page analysis results'),
|
|
201
|
+
metadata: z
|
|
202
|
+
.object({
|
|
203
|
+
totalPages: z.number().describe('Total number of pages processed'),
|
|
204
|
+
processedPages: z
|
|
205
|
+
.number()
|
|
206
|
+
.describe('Number of pages successfully processed'),
|
|
207
|
+
hasVisualElements: z
|
|
208
|
+
.boolean()
|
|
209
|
+
.describe('Whether document contains charts, tables, or images'),
|
|
210
|
+
processingTime: z
|
|
211
|
+
.number()
|
|
212
|
+
.describe('Total processing time in milliseconds'),
|
|
213
|
+
imageFormat: z.string().describe('Image format used for conversion'),
|
|
214
|
+
imageDpi: z.number().describe('DPI used for image conversion'),
|
|
215
|
+
})
|
|
216
|
+
.describe('Metadata about the parsing process'),
|
|
217
|
+
conversionSummary: z
|
|
218
|
+
.object({
|
|
219
|
+
totalCharacters: z
|
|
220
|
+
.number()
|
|
221
|
+
.describe('Total characters in generated markdown'),
|
|
222
|
+
tablesExtracted: z
|
|
223
|
+
.number()
|
|
224
|
+
.describe('Number of tables converted to markdown'),
|
|
225
|
+
chartsDescribed: z
|
|
226
|
+
.number()
|
|
227
|
+
.describe('Number of charts and graphs described'),
|
|
228
|
+
imagesDescribed: z.number().describe('Number of images described'),
|
|
229
|
+
})
|
|
230
|
+
.describe('Summary of conversion results'),
|
|
231
|
+
aiAnalysis: z
|
|
232
|
+
.object({
|
|
233
|
+
model: z.string().describe('AI model used for analysis'),
|
|
234
|
+
iterations: z.number().describe('Number of AI iterations'),
|
|
235
|
+
processingTime: z.number().describe('AI processing time in milliseconds'),
|
|
236
|
+
})
|
|
237
|
+
.describe('AI analysis metadata'),
|
|
238
|
+
uploadedImages: z
|
|
239
|
+
.array(z.object({
|
|
240
|
+
pageNumber: z.number(),
|
|
241
|
+
fileName: z.string(),
|
|
242
|
+
fileUrl: z.string().optional(),
|
|
243
|
+
uploaded: z.boolean(),
|
|
244
|
+
}))
|
|
245
|
+
.optional()
|
|
246
|
+
.describe('Information about uploaded page images'),
|
|
247
|
+
success: z.boolean().describe('Whether the workflow completed successfully'),
|
|
248
|
+
error: z.string().describe('Error message if workflow failed'),
|
|
249
|
+
});
|
|
250
|
+
/**
|
|
251
|
+
* Parse Document Workflow
|
|
252
|
+
* Converts PDFs and images to structured markdown using AI vision analysis
|
|
253
|
+
*/
|
|
254
|
+
export class ParseDocumentWorkflow extends WorkflowBubble {
|
|
255
|
+
static type = 'workflow';
|
|
256
|
+
static bubbleName = 'parse-document-workflow';
|
|
257
|
+
static schema = ParseDocumentWorkflowParamsSchema;
|
|
258
|
+
static resultSchema = ParseDocumentWorkflowResultSchema;
|
|
259
|
+
static shortDescription = 'Parse Document workflow: convert PDFs/images to markdown using AI vision';
|
|
260
|
+
static longDescription = `
|
|
261
|
+
Comprehensive document parsing workflow that converts PDFs and images into structured markdown:
|
|
262
|
+
|
|
263
|
+
**Process:**
|
|
264
|
+
1. Convert PDFs to high-quality images (if needed)
|
|
265
|
+
2. Analyze images using AI vision models to extract content
|
|
266
|
+
3. Generate clean, structured markdown preserving document layout
|
|
267
|
+
4. Describe charts, tables, and images with numerical data when possible
|
|
268
|
+
|
|
269
|
+
**Features:**
|
|
270
|
+
- **PDF & Image Support**: Handles both PDF documents and image files
|
|
271
|
+
- **Structure Preservation**: Maintains headers, lists, paragraphs, and formatting
|
|
272
|
+
- **Visual Element Analysis**: Describes charts, graphs, tables, and images in detail
|
|
273
|
+
- **Numerical Data Extraction**: Extracts specific values from charts and tables
|
|
274
|
+
- **High-Quality Conversion**: Configurable DPI and quality settings
|
|
275
|
+
- **Per-Page Analysis**: Detailed breakdown of each page's content
|
|
276
|
+
|
|
277
|
+
**Visual Element Handling:**
|
|
278
|
+
- **Charts & Graphs**: Extract data points, trends, axis labels, percentages
|
|
279
|
+
- **Tables**: Convert to markdown tables with all visible data
|
|
280
|
+
- **Images & Diagrams**: Detailed descriptions including any visible text/numbers
|
|
281
|
+
- **Forms**: Structure field names and any filled values
|
|
282
|
+
|
|
283
|
+
**Output Options:**
|
|
284
|
+
- Combined markdown document or per-page breakdown
|
|
285
|
+
- Configurable structure preservation and visual descriptions
|
|
286
|
+
- Comprehensive metadata and conversion statistics
|
|
287
|
+
|
|
288
|
+
**Common Use Cases:**
|
|
289
|
+
- **Document Digitization**: Convert scanned PDFs to editable markdown
|
|
290
|
+
- **Report Analysis**: Extract data from business reports and charts
|
|
291
|
+
- **Academic Papers**: Preserve structure and extract figures/tables
|
|
292
|
+
- **Technical Documentation**: Maintain formatting and describe diagrams
|
|
293
|
+
- **Research Materials**: Extract and structure information from various documents
|
|
294
|
+
|
|
295
|
+
**Input**: PDF or image data + conversion preferences
|
|
296
|
+
**Output**: Clean markdown with preserved structure and visual descriptions
|
|
297
|
+
`;
|
|
298
|
+
static alias = 'parse-doc';
|
|
299
|
+
constructor(params, context) {
|
|
300
|
+
super(params, context);
|
|
301
|
+
}
|
|
302
|
+
async performAction(context) {
|
|
303
|
+
const startTime = Date.now();
|
|
304
|
+
console.log('[ParseDocumentWorkflow] Starting document parsing and conversion');
|
|
305
|
+
console.log('[ParseDocumentWorkflow] Document type:', this.params.documentType);
|
|
306
|
+
console.log('[ParseDocumentWorkflow] Document data length:', this.params.documentData.length);
|
|
307
|
+
try {
|
|
308
|
+
// Step 0: Download file from R2 if needed
|
|
309
|
+
let documentDataToProcess = this.params.documentData;
|
|
310
|
+
if (this.params.isFileUrl ||
|
|
311
|
+
this.params.documentData.startsWith('https://')) {
|
|
312
|
+
console.log('[ParseDocumentWorkflow] Step 0: Downloading file from R2...');
|
|
313
|
+
try {
|
|
314
|
+
const downloadResponse = await fetch(this.params.documentData);
|
|
315
|
+
if (!downloadResponse.ok) {
|
|
316
|
+
throw new Error(`Failed to download file: ${downloadResponse.status} ${downloadResponse.statusText}`);
|
|
317
|
+
}
|
|
318
|
+
const arrayBuffer = await downloadResponse.arrayBuffer();
|
|
319
|
+
documentDataToProcess = Buffer.from(arrayBuffer).toString('base64');
|
|
320
|
+
console.log(`[ParseDocumentWorkflow] Downloaded file successfully, size: ${arrayBuffer.byteLength} bytes`);
|
|
321
|
+
}
|
|
322
|
+
catch (downloadError) {
|
|
323
|
+
throw new Error(`Failed to download file from R2: ${downloadError instanceof Error ? downloadError.message : 'Unknown error'}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
let imageData = [];
|
|
327
|
+
// Step 1: Convert to images (if needed)
|
|
328
|
+
if (this.params.documentType === 'pdf') {
|
|
329
|
+
console.log('[ParseDocumentWorkflow] Step 1: Converting PDF to images...');
|
|
330
|
+
const imageWorkflow = new PDFFormOperationsWorkflow({
|
|
331
|
+
operation: 'convert-to-images',
|
|
332
|
+
pdfData: documentDataToProcess,
|
|
333
|
+
format: this.params.storageOptions?.uploadImages
|
|
334
|
+
? 'jpeg'
|
|
335
|
+
: this.params.imageOptions?.format || 'png',
|
|
336
|
+
quality: this.params.imageOptions?.quality || 0.9,
|
|
337
|
+
dpi: this.params.imageOptions?.dpi || 200,
|
|
338
|
+
pages: this.params.imageOptions?.pages,
|
|
339
|
+
credentials: this.params.credentials,
|
|
340
|
+
}, context);
|
|
341
|
+
const imageResult = await imageWorkflow.action();
|
|
342
|
+
if (!imageResult.success || !imageResult.data?.images) {
|
|
343
|
+
throw new Error(`PDF to images conversion failed: ${imageResult.error}`);
|
|
344
|
+
}
|
|
345
|
+
imageData = imageResult.data.images;
|
|
346
|
+
console.log(`[ParseDocumentWorkflow] Converted ${imageData.length} pages to images`);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
// For image input, create a single page entry
|
|
350
|
+
imageData = [
|
|
351
|
+
{
|
|
352
|
+
pageNumber: 1,
|
|
353
|
+
imageData: documentDataToProcess,
|
|
354
|
+
format: this.params.imageOptions?.format || 'png',
|
|
355
|
+
},
|
|
356
|
+
];
|
|
357
|
+
console.log('[ParseDocumentWorkflow] Using provided image data');
|
|
358
|
+
}
|
|
359
|
+
// Step 1.5: Upload page images to S3 if enabled
|
|
360
|
+
const uploadedImages = [];
|
|
361
|
+
console.log('[ParseDocumentWorkflow] DEBUG - Storage options:', {
|
|
362
|
+
hasStorageOptions: !!this.params.storageOptions,
|
|
363
|
+
uploadImages: this.params.storageOptions?.uploadImages,
|
|
364
|
+
pageImageUrlsCount: this.params.storageOptions?.pageImageUrls?.length || 0,
|
|
365
|
+
pageImageUrls: this.params.storageOptions?.pageImageUrls,
|
|
366
|
+
});
|
|
367
|
+
if (this.params.storageOptions?.uploadImages &&
|
|
368
|
+
this.params.storageOptions?.pageImageUrls) {
|
|
369
|
+
console.log('[ParseDocumentWorkflow] Step 1.5: Uploading page images to S3...');
|
|
370
|
+
for (const pageData of imageData) {
|
|
371
|
+
const pageUploadInfo = this.params.storageOptions.pageImageUrls.find((info) => info.pageNumber === pageData.pageNumber);
|
|
372
|
+
if (pageUploadInfo) {
|
|
373
|
+
console.log(`[ParseDocumentWorkflow] Uploading page ${pageData.pageNumber} to S3...`);
|
|
374
|
+
try {
|
|
375
|
+
// Convert base64 to buffer
|
|
376
|
+
const imageBuffer = Buffer.from(pageData.imageData.replace(/^data:image\/[^;]+;base64,/, ''), 'base64');
|
|
377
|
+
// Upload to S3 using the pre-signed URL
|
|
378
|
+
const contentType = pageData.format === 'jpeg' ? 'image/jpeg' : 'image/png';
|
|
379
|
+
const uploadResponse = await fetch(pageUploadInfo.uploadUrl, {
|
|
380
|
+
method: 'PUT',
|
|
381
|
+
body: imageBuffer,
|
|
382
|
+
headers: {
|
|
383
|
+
'Content-Type': contentType,
|
|
384
|
+
},
|
|
385
|
+
});
|
|
386
|
+
const uploaded = uploadResponse.ok;
|
|
387
|
+
// Get the proper download URL using StorageBubble
|
|
388
|
+
let finalImageUrl = undefined;
|
|
389
|
+
if (uploaded) {
|
|
390
|
+
try {
|
|
391
|
+
const { StorageBubble } = await import('../service-bubble/storage.js');
|
|
392
|
+
const downloadStorageBubble = new StorageBubble({
|
|
393
|
+
operation: 'getFile',
|
|
394
|
+
bucketName: this.params.storageOptions.bucketName ||
|
|
395
|
+
'bubble-lab-bucket',
|
|
396
|
+
fileName: pageUploadInfo.fileName,
|
|
397
|
+
expirationMinutes: 1440, // 24 hours for page images
|
|
398
|
+
credentials: this.params.credentials,
|
|
399
|
+
}, this.context);
|
|
400
|
+
const downloadResult = await downloadStorageBubble.action();
|
|
401
|
+
console.log(`[ParseDocumentWorkflow] Download result for page ${pageData.pageNumber}:`, {
|
|
402
|
+
success: downloadResult.success,
|
|
403
|
+
error: downloadResult.error,
|
|
404
|
+
hasDownloadUrl: !!downloadResult.data?.downloadUrl,
|
|
405
|
+
downloadUrl: downloadResult.data?.downloadUrl,
|
|
406
|
+
});
|
|
407
|
+
if (downloadResult.success &&
|
|
408
|
+
downloadResult.data?.downloadUrl) {
|
|
409
|
+
finalImageUrl = downloadResult.data.downloadUrl;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch (storageError) {
|
|
413
|
+
console.error(`[ParseDocumentWorkflow] Failed to get download URL for page ${pageData.pageNumber}:`, storageError);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
uploadedImages.push({
|
|
417
|
+
pageNumber: pageData.pageNumber,
|
|
418
|
+
fileName: pageUploadInfo.fileName,
|
|
419
|
+
fileUrl: finalImageUrl, // Ready-to-use download URL from StorageBubble
|
|
420
|
+
uploaded,
|
|
421
|
+
});
|
|
422
|
+
console.log(`[ParseDocumentWorkflow] Page ${pageData.pageNumber} upload ${uploaded ? 'successful' : 'failed'}, finalImageUrl: ${finalImageUrl}`);
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
console.error(`[ParseDocumentWorkflow] Failed to upload page ${pageData.pageNumber}:`, error);
|
|
426
|
+
uploadedImages.push({
|
|
427
|
+
pageNumber: pageData.pageNumber,
|
|
428
|
+
fileName: pageUploadInfo.fileName,
|
|
429
|
+
uploaded: false,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
console.log(`[ParseDocumentWorkflow] No upload URL found for page ${pageData.pageNumber}`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// Step 2: Process pages with AI vision in parallel batches
|
|
439
|
+
console.log('[ParseDocumentWorkflow] Step 2: Analyzing pages with AI vision in parallel batches...');
|
|
440
|
+
const pageAnalyses = [];
|
|
441
|
+
const totalAiProcessingTime = 0;
|
|
442
|
+
let totalAiIterations = 0;
|
|
443
|
+
console.log(`[ParseDocumentWorkflow] Processing ALL ${imageData.length} pages in parallel...`);
|
|
444
|
+
console.log(`[ParseDocumentWorkflow] WARNING: Processing ${imageData.length} pages simultaneously may hit API rate limits for large documents`);
|
|
445
|
+
// Create AI agents for ALL pages at once (no batching)
|
|
446
|
+
const allPagePromises = imageData.map((page) => {
|
|
447
|
+
console.log(`[ParseDocumentWorkflow] Starting page ${page.pageNumber}...`);
|
|
448
|
+
const pagePrompt = DOCUMENT_PARSING_PROMPT;
|
|
449
|
+
// Create AI agent for this page
|
|
450
|
+
const aiAgent = new AIAgentBubble({
|
|
451
|
+
message: `Please extract all the data from the page.`,
|
|
452
|
+
images: [
|
|
453
|
+
{
|
|
454
|
+
type: 'base64',
|
|
455
|
+
data: page.imageData,
|
|
456
|
+
mimeType: page.format === 'png' ? 'image/png' : 'image/jpeg',
|
|
457
|
+
description: `Document page ${page.pageNumber} for markdown conversion`,
|
|
458
|
+
},
|
|
459
|
+
],
|
|
460
|
+
systemPrompt: pagePrompt,
|
|
461
|
+
model: {
|
|
462
|
+
model: this.params.aiOptions?.model || 'google/gemini-2.5-flash',
|
|
463
|
+
temperature: this.params.aiOptions?.temperature || 0.4,
|
|
464
|
+
maxTokens: this.params.aiOptions?.maxTokens || 2000,
|
|
465
|
+
jsonMode: this.params.aiOptions?.jsonMode ?? false,
|
|
466
|
+
},
|
|
467
|
+
credentials: this.params.credentials,
|
|
468
|
+
tools: [],
|
|
469
|
+
maxIterations: 3,
|
|
470
|
+
}, this.context);
|
|
471
|
+
// Return the promise directly (don't await here - that's the key!)
|
|
472
|
+
return aiAgent
|
|
473
|
+
.action()
|
|
474
|
+
.then((aiResult) => {
|
|
475
|
+
if (!aiResult.success) {
|
|
476
|
+
console.warn(`[ParseDocumentWorkflow] AI analysis failed for page ${page.pageNumber}: ${aiResult.error}`);
|
|
477
|
+
return {
|
|
478
|
+
pageNumber: page.pageNumber,
|
|
479
|
+
markdown: `# Page ${page.pageNumber}\n\n*Error: Could not process this page*\n`,
|
|
480
|
+
hasCharts: false,
|
|
481
|
+
hasTables: false,
|
|
482
|
+
hasImages: false,
|
|
483
|
+
confidence: 0,
|
|
484
|
+
iterations: 0,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
const markdown = aiResult.data?.response || '';
|
|
488
|
+
// Analyze the generated markdown to detect visual elements
|
|
489
|
+
const hasCharts = /chart|graph|figure|plot|axis|data|trend/i.test(markdown);
|
|
490
|
+
const hasTables = /\|.*\|.*\|/m.test(markdown); // Basic markdown table detection
|
|
491
|
+
const hasImages = /image|photo|picture|diagram|illustration/i.test(markdown);
|
|
492
|
+
console.log(`[ParseDocumentWorkflow] Page ${page.pageNumber} processed: ${markdown.length} characters`);
|
|
493
|
+
return {
|
|
494
|
+
pageNumber: page.pageNumber,
|
|
495
|
+
markdown,
|
|
496
|
+
hasCharts,
|
|
497
|
+
hasTables,
|
|
498
|
+
hasImages,
|
|
499
|
+
iterations: aiResult.data?.iterations || 0,
|
|
500
|
+
};
|
|
501
|
+
})
|
|
502
|
+
.catch((error) => {
|
|
503
|
+
console.error(`[ParseDocumentWorkflow] Error processing page ${page.pageNumber}:`, error);
|
|
504
|
+
return {
|
|
505
|
+
pageNumber: page.pageNumber,
|
|
506
|
+
markdown: `# Page ${page.pageNumber}\n\n*Error: Could not process this page*\n`,
|
|
507
|
+
hasCharts: false,
|
|
508
|
+
hasTables: false,
|
|
509
|
+
hasImages: false,
|
|
510
|
+
confidence: 0,
|
|
511
|
+
iterations: 0,
|
|
512
|
+
};
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
// Wait for ALL pages to complete in parallel
|
|
516
|
+
console.log(`[ParseDocumentWorkflow] Waiting for all ${imageData.length} pages to complete...`);
|
|
517
|
+
const allResults = await Promise.all(allPagePromises);
|
|
518
|
+
// Add results to our main array and accumulate iterations
|
|
519
|
+
for (const result of allResults) {
|
|
520
|
+
totalAiIterations += result.iterations;
|
|
521
|
+
pageAnalyses.push({
|
|
522
|
+
pageNumber: result.pageNumber,
|
|
523
|
+
markdown: result.markdown,
|
|
524
|
+
hasCharts: result.hasCharts,
|
|
525
|
+
hasTables: result.hasTables,
|
|
526
|
+
hasImages: result.hasImages,
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
console.log(`[ParseDocumentWorkflow] All ${allResults.length} pages completed in parallel!`);
|
|
530
|
+
// Step 3: Format pages with proper separation (never combine pages)
|
|
531
|
+
console.log('[ParseDocumentWorkflow] Step 3: Formatting results with page separation...');
|
|
532
|
+
// Sort pages by page number to ensure correct order
|
|
533
|
+
const sortedPages = pageAnalyses.sort((a, b) => a.pageNumber - b.pageNumber);
|
|
534
|
+
// Always separate pages with clear headers - never combine them
|
|
535
|
+
const finalMarkdown = sortedPages
|
|
536
|
+
.map((page) => `--- Page ${page.pageNumber} ---\n\n${page.markdown}`)
|
|
537
|
+
.join('\n\n');
|
|
538
|
+
// Step 4: Generate metadata and summary
|
|
539
|
+
const processingTime = Date.now() - startTime;
|
|
540
|
+
const conversionSummary = {
|
|
541
|
+
totalCharacters: finalMarkdown.length,
|
|
542
|
+
tablesExtracted: pageAnalyses.reduce((sum, page) => sum + (page.hasTables ? 1 : 0), 0),
|
|
543
|
+
chartsDescribed: pageAnalyses.reduce((sum, page) => sum + (page.hasCharts ? 1 : 0), 0),
|
|
544
|
+
imagesDescribed: pageAnalyses.reduce((sum, page) => sum + (page.hasImages ? 1 : 0), 0),
|
|
545
|
+
};
|
|
546
|
+
const metadata = {
|
|
547
|
+
totalPages: imageData.length,
|
|
548
|
+
processedPages: pageAnalyses.length,
|
|
549
|
+
hasVisualElements: pageAnalyses.some((page) => page.hasCharts || page.hasTables || page.hasImages),
|
|
550
|
+
processingTime,
|
|
551
|
+
imageFormat: this.params.imageOptions?.format || 'png',
|
|
552
|
+
imageDpi: this.params.imageOptions?.dpi || 200,
|
|
553
|
+
};
|
|
554
|
+
console.log(`[ParseDocumentWorkflow] Conversion completed successfully in ${processingTime}ms`);
|
|
555
|
+
console.log(`[ParseDocumentWorkflow] Generated ${finalMarkdown.length} characters of markdown`);
|
|
556
|
+
return {
|
|
557
|
+
markdown: finalMarkdown,
|
|
558
|
+
pages: pageAnalyses,
|
|
559
|
+
metadata,
|
|
560
|
+
conversionSummary,
|
|
561
|
+
aiAnalysis: {
|
|
562
|
+
model: this.params.aiOptions?.model || 'google/gemini-2.5-flash',
|
|
563
|
+
iterations: totalAiIterations,
|
|
564
|
+
processingTime: totalAiProcessingTime,
|
|
565
|
+
},
|
|
566
|
+
uploadedImages: uploadedImages.length > 0 ? uploadedImages : undefined,
|
|
567
|
+
success: true,
|
|
568
|
+
error: '',
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
catch (error) {
|
|
572
|
+
const processingTime = Date.now() - startTime;
|
|
573
|
+
console.error('[ParseDocumentWorkflow] Workflow failed:', error);
|
|
574
|
+
return {
|
|
575
|
+
markdown: '',
|
|
576
|
+
pages: [],
|
|
577
|
+
metadata: {
|
|
578
|
+
totalPages: 0,
|
|
579
|
+
processedPages: 0,
|
|
580
|
+
hasVisualElements: false,
|
|
581
|
+
processingTime,
|
|
582
|
+
imageFormat: this.params.imageOptions?.format || 'png',
|
|
583
|
+
imageDpi: this.params.imageOptions?.dpi || 200,
|
|
584
|
+
},
|
|
585
|
+
conversionSummary: {
|
|
586
|
+
totalCharacters: 0,
|
|
587
|
+
tablesExtracted: 0,
|
|
588
|
+
chartsDescribed: 0,
|
|
589
|
+
imagesDescribed: 0,
|
|
590
|
+
},
|
|
591
|
+
aiAnalysis: {
|
|
592
|
+
model: this.params.aiOptions?.model || 'google/gemini-2.5-flash',
|
|
593
|
+
iterations: 0,
|
|
594
|
+
processingTime,
|
|
595
|
+
},
|
|
596
|
+
success: false,
|
|
597
|
+
error: error instanceof Error
|
|
598
|
+
? error.message
|
|
599
|
+
: 'Unknown error during document parsing workflow',
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=parse-document.workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-document.workflow.js","sourceRoot":"","sources":["../../../src/bubbles/workflow-bubble/parse-document.workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAmB,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DAgC6B,CAAC;AAwB9D;;GAEG;AACH,MAAM,iCAAiC,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;SACnC,QAAQ,CACP,mFAAmF,CACpF;IACH,YAAY,EAAE,CAAC;SACZ,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SACtB,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,kCAAkC,CAAC;IAC/C,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,iEAAiE,CAClE;IACH,iBAAiB,EAAE,CAAC;SACjB,MAAM,CAAC;QACN,iBAAiB,EAAE,CAAC;aACjB,OAAO,EAAE;aACT,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CAAC,oDAAoD,CAAC;QACjE,yBAAyB,EAAE,CAAC;aACzB,OAAO,EAAE;aACT,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CACP,+DAA+D,CAChE;QACH,oBAAoB,EAAE,CAAC;aACpB,OAAO,EAAE;aACT,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CAAC,0DAA0D,CAAC;QACvE,YAAY,EAAE,CAAC;aACZ,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,+DAA+D,CAChE;KACJ,CAAC;SACD,OAAO,CAAC;QACP,iBAAiB,EAAE,IAAI;QACvB,yBAAyB,EAAE,IAAI;QAC/B,oBAAoB,EAAE,IAAI;QAC1B,YAAY,EAAE,KAAK;KACpB,CAAC;SACD,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aACrB,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,wCAAwC,CAAC;QACrD,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,GAAG,CAAC,GAAG,CAAC;aACR,OAAO,CAAC,GAAG,CAAC;aACZ,QAAQ,CAAC,kDAAkD,CAAC;QAC/D,GAAG,EAAE,CAAC;aACH,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,GAAG,CAAC,GAAG,CAAC;aACR,OAAO,CAAC,GAAG,CAAC;aACZ,QAAQ,CAAC,yDAAyD,CAAC;QACtE,KAAK,EAAE,CAAC;aACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;aAC5B,QAAQ,EAAE;aACV,QAAQ,CAAC,8CAA8C,CAAC;KAC5D,CAAC;SACD,OAAO,CAAC;QACP,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,GAAG;QACZ,GAAG,EAAE,GAAG;KACT,CAAC;SACD,QAAQ,CAAC,sCAAsC,CAAC;IACnD,SAAS,EAAE,CAAC;SACT,MAAM,CAAC;QACN,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAChE,sDAAsD,CACvD;QACD,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,CAAC,CAAC;aACN,OAAO,CAAC,GAAG,CAAC;aACZ,QAAQ,CACP,oEAAoE,CACrE;QACH,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,QAAQ,EAAE,CAAC;aACR,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,qCAAqC,CAAC;KACnD,CAAC;SACD,OAAO,CAAC;QACP,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC;SACD,QAAQ,CAAC,gCAAgC,CAAC;IAC7C,cAAc,EAAE,CAAC;SACd,MAAM,CAAC;QACN,YAAY,EAAE,CAAC;aACZ,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,+CAA+C,CAAC;QAC5D,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,aAAa,EAAE,CAAC;aACb,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;YACP,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;YACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CACH;aACA,QAAQ,EAAE;aACV,QAAQ,CAAC,2CAA2C,CAAC;QACxD,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,mCAAmC,CAAC;KACjD,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,2CAA2C,CAAC;IACxD,WAAW,EAAE,CAAC;SACX,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;SAChD,QAAQ,EAAE;SACV,QAAQ,CACP,yEAAyE,CAC1E;CACJ,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,iCAAiC,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC7E,KAAK,EAAE,CAAC;SACL,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC1D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC/D,SAAS,EAAE,CAAC;aACT,OAAO,EAAE;aACT,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACpE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KACrE,CAAC,CACH;SACA,QAAQ,CAAC,2BAA2B,CAAC;IACxC,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAClE,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,QAAQ,CAAC,wCAAwC,CAAC;QACrD,iBAAiB,EAAE,CAAC;aACjB,OAAO,EAAE;aACT,QAAQ,CAAC,qDAAqD,CAAC;QAClE,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,QAAQ,CAAC,uCAAuC,CAAC;QACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACpE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAC/D,CAAC;SACD,QAAQ,CAAC,oCAAoC,CAAC;IACjD,iBAAiB,EAAE,CAAC;SACjB,MAAM,CAAC;QACN,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,CAAC,wCAAwC,CAAC;QACrD,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,CAAC,wCAAwC,CAAC;QACrD,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,CAAC,uCAAuC,CAAC;QACpD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACnE,CAAC;SACD,QAAQ,CAAC,+BAA+B,CAAC;IAC5C,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC1D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAC1E,CAAC;SACD,QAAQ,CAAC,sBAAsB,CAAC;IACnC,cAAc,EAAE,CAAC;SACd,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;KACtB,CAAC,CACH;SACA,QAAQ,EAAE;SACV,QAAQ,CAAC,wCAAwC,CAAC;IACrD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IAC5E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CAC/D,CAAC,CAAC;AASH;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,cAG1C;IACC,MAAM,CAAU,IAAI,GAAG,UAAmB,CAAC;IAC3C,MAAM,CAAU,UAAU,GAAe,yBAAyB,CAAC;IACnE,MAAM,CAAU,MAAM,GAAG,iCAAiC,CAAC;IAC3D,MAAM,CAAU,YAAY,GAAG,iCAAiC,CAAC;IACjE,MAAM,CAAU,gBAAgB,GAC9B,0EAA0E,CAAC;IAC7E,MAAM,CAAU,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCjC,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,WAAW,CAAC;IAEpC,YAAY,MAAmC,EAAE,OAAuB;QACtE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,OAAuB;QAEvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,CAAC,GAAG,CACT,kEAAkE,CACnE,CAAC;QACF,OAAO,CAAC,GAAG,CACT,wCAAwC,EACxC,IAAI,CAAC,MAAM,CAAC,YAAY,CACzB,CAAC;QACF,OAAO,CAAC,GAAG,CACT,+CAA+C,EAC/C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAChC,CAAC;QAEF,IAAI,CAAC;YACH,0CAA0C;YAC1C,IAAI,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YACrD,IACE,IAAI,CAAC,MAAM,CAAC,SAAS;gBACrB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAC/C,CAAC;gBACD,OAAO,CAAC,GAAG,CACT,6DAA6D,CAC9D,CAAC;gBAEF,IAAI,CAAC;oBACH,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC/D,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;wBACzB,MAAM,IAAI,KAAK,CACb,4BAA4B,gBAAgB,CAAC,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,CACrF,CAAC;oBACJ,CAAC;oBAED,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC;oBACzD,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAEpE,OAAO,CAAC,GAAG,CACT,+DAA+D,WAAW,CAAC,UAAU,QAAQ,CAC9F,CAAC;gBACJ,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACb,oCAAoC,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC/G,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,SAAS,GAIR,EAAE,CAAC;YAER,wCAAwC;YACxC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CACT,6DAA6D,CAC9D,CAAC;gBAEF,MAAM,aAAa,GAAG,IAAI,yBAAyB,CACjD;oBACE,SAAS,EAAE,mBAAmB;oBAC9B,OAAO,EAAE,qBAAqB;oBAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY;wBAC9C,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,KAAK;oBAC7C,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,GAAG;oBACjD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,GAAG;oBACzC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK;oBACtC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;iBACrC,EACD,OAAO,CACR,CAAC;gBAEF,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC;gBAEjD,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;oBACtD,MAAM,IAAI,KAAK,CACb,oCAAoC,WAAW,CAAC,KAAK,EAAE,CACxD,CAAC;gBACJ,CAAC;gBAED,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;gBACpC,OAAO,CAAC,GAAG,CACT,qCAAqC,SAAS,CAAC,MAAM,kBAAkB,CACxE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,SAAS,GAAG;oBACV;wBACE,UAAU,EAAE,CAAC;wBACb,SAAS,EAAE,qBAAqB;wBAChC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,KAAK;qBAClD;iBACF,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACnE,CAAC;YAED,gDAAgD;YAChD,MAAM,cAAc,GAKf,EAAE,CAAC;YAER,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE;gBAC9D,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc;gBAC/C,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY;gBACtD,kBAAkB,EAChB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;gBACxD,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa;aACzD,CAAC,CAAC;YAEH,IACE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY;gBACxC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,EACzC,CAAC;gBACD,OAAO,CAAC,GAAG,CACT,kEAAkE,CACnE,CAAC;gBAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAClE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAClD,CAAC;oBAEF,IAAI,cAAc,EAAE,CAAC;wBACnB,OAAO,CAAC,GAAG,CACT,0CAA0C,QAAQ,CAAC,UAAU,WAAW,CACzE,CAAC;wBACF,IAAI,CAAC;4BACH,2BAA2B;4BAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAC7B,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,EAC5D,QAAQ,CACT,CAAC;4BAEF,wCAAwC;4BACxC,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;4BAC1D,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE;gCAC3D,MAAM,EAAE,KAAK;gCACb,IAAI,EAAE,WAAW;gCACjB,OAAO,EAAE;oCACP,cAAc,EAAE,WAAW;iCAC5B;6BACF,CAAC,CAAC;4BAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,CAAC;4BAEnC,kDAAkD;4BAClD,IAAI,aAAa,GAAuB,SAAS,CAAC;4BAClD,IAAI,QAAQ,EAAE,CAAC;gCACb,IAAI,CAAC;oCACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CACpC,8BAA8B,CAC/B,CAAC;oCACF,MAAM,qBAAqB,GAAG,IAAI,aAAa,CAC7C;wCACE,SAAS,EAAE,SAAS;wCACpB,UAAU,EACR,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU;4CACrC,mBAAmB;wCACrB,QAAQ,EAAE,cAAc,CAAC,QAAQ;wCACjC,iBAAiB,EAAE,IAAI,EAAE,2BAA2B;wCACpD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;qCACrC,EACD,IAAI,CAAC,OAAO,CACb,CAAC;oCAEF,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,CAAC;oCAC5D,OAAO,CAAC,GAAG,CACT,oDAAoD,QAAQ,CAAC,UAAU,GAAG,EAC1E;wCACE,OAAO,EAAE,cAAc,CAAC,OAAO;wCAC/B,KAAK,EAAE,cAAc,CAAC,KAAK;wCAC3B,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW;wCAClD,WAAW,EAAE,cAAc,CAAC,IAAI,EAAE,WAAW;qCAC9C,CACF,CAAC;oCAEF,IACE,cAAc,CAAC,OAAO;wCACtB,cAAc,CAAC,IAAI,EAAE,WAAW,EAChC,CAAC;wCACD,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;oCAClD,CAAC;gCACH,CAAC;gCAAC,OAAO,YAAY,EAAE,CAAC;oCACtB,OAAO,CAAC,KAAK,CACX,+DAA+D,QAAQ,CAAC,UAAU,GAAG,EACrF,YAAY,CACb,CAAC;gCACJ,CAAC;4BACH,CAAC;4BAED,cAAc,CAAC,IAAI,CAAC;gCAClB,UAAU,EAAE,QAAQ,CAAC,UAAU;gCAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ;gCACjC,OAAO,EAAE,aAAa,EAAE,+CAA+C;gCACvE,QAAQ;6BACT,CAAC,CAAC;4BAEH,OAAO,CAAC,GAAG,CACT,gCAAgC,QAAQ,CAAC,UAAU,WAAW,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,oBAAoB,aAAa,EAAE,CACpI,CAAC;wBACJ,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,KAAK,CACX,iDAAiD,QAAQ,CAAC,UAAU,GAAG,EACvE,KAAK,CACN,CAAC;4BACF,cAAc,CAAC,IAAI,CAAC;gCAClB,UAAU,EAAE,QAAQ,CAAC,UAAU;gCAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ;gCACjC,QAAQ,EAAE,KAAK;6BAChB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CACT,wDAAwD,QAAQ,CAAC,UAAU,EAAE,CAC9E,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,2DAA2D;YAC3D,OAAO,CAAC,GAAG,CACT,uFAAuF,CACxF,CAAC;YAEF,MAAM,YAAY,GAAmB,EAAE,CAAC;YACxC,MAAM,qBAAqB,GAAG,CAAC,CAAC;YAChC,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAE1B,OAAO,CAAC,GAAG,CACT,0CAA0C,SAAS,CAAC,MAAM,uBAAuB,CAClF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,+CAA+C,SAAS,CAAC,MAAM,mEAAmE,CACnI,CAAC;YAEF,uDAAuD;YACvD,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC7C,OAAO,CAAC,GAAG,CACT,yCAAyC,IAAI,CAAC,UAAU,KAAK,CAC9D,CAAC;gBAEF,MAAM,UAAU,GAAG,uBAAuB,CAAC;gBAC3C,gCAAgC;gBAChC,MAAM,OAAO,GAAG,IAAI,aAAa,CAC/B;oBACE,OAAO,EAAE,4CAA4C;oBACrD,MAAM,EAAE;wBACN;4BACE,IAAI,EAAE,QAAiB;4BACvB,IAAI,EAAE,IAAI,CAAC,SAAS;4BACpB,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;4BAC5D,WAAW,EAAE,iBAAiB,IAAI,CAAC,UAAU,0BAA0B;yBACxE;qBACF;oBACD,YAAY,EAAE,UAAU;oBACxB,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,IAAI,yBAAyB;wBAChE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,IAAI,GAAG;wBACtD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI;wBACnD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,IAAI,KAAK;qBACnD;oBACD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;oBACpC,KAAK,EAAE,EAAE;oBACT,aAAa,EAAE,CAAC;iBACjB,EACD,IAAI,CAAC,OAAO,CACb,CAAC;gBAEF,mEAAmE;gBACnE,OAAO,OAAO;qBACX,MAAM,EAAE;qBACR,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACjB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBACtB,OAAO,CAAC,IAAI,CACV,uDAAuD,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,KAAK,EAAE,CAC5F,CAAC;wBACF,OAAO;4BACL,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,QAAQ,EAAE,UAAU,IAAI,CAAC,UAAU,4CAA4C;4BAC/E,SAAS,EAAE,KAAK;4BAChB,SAAS,EAAE,KAAK;4BAChB,SAAS,EAAE,KAAK;4BAChB,UAAU,EAAE,CAAC;4BACb,UAAU,EAAE,CAAC;yBACd,CAAC;oBACJ,CAAC;oBAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;oBAE/C,2DAA2D;oBAC3D,MAAM,SAAS,GAAG,0CAA0C,CAAC,IAAI,CAC/D,QAAQ,CACT,CAAC;oBACF,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iCAAiC;oBACjF,MAAM,SAAS,GAAG,2CAA2C,CAAC,IAAI,CAChE,QAAQ,CACT,CAAC;oBAEF,OAAO,CAAC,GAAG,CACT,gCAAgC,IAAI,CAAC,UAAU,eAAe,QAAQ,CAAC,MAAM,aAAa,CAC3F,CAAC;oBAEF,OAAO;wBACL,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,QAAQ;wBACR,SAAS;wBACT,SAAS;wBACT,SAAS;wBACT,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC;qBAC3C,CAAC;gBACJ,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACf,OAAO,CAAC,KAAK,CACX,iDAAiD,IAAI,CAAC,UAAU,GAAG,EACnE,KAAK,CACN,CAAC;oBACF,OAAO;wBACL,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,QAAQ,EAAE,UAAU,IAAI,CAAC,UAAU,4CAA4C;wBAC/E,SAAS,EAAE,KAAK;wBAChB,SAAS,EAAE,KAAK;wBAChB,SAAS,EAAE,KAAK;wBAChB,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,CAAC;qBACd,CAAC;gBACJ,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,6CAA6C;YAC7C,OAAO,CAAC,GAAG,CACT,2CAA2C,SAAS,CAAC,MAAM,uBAAuB,CACnF,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAEtD,0DAA0D;YAC1D,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;gBAChC,iBAAiB,IAAI,MAAM,CAAC,UAAU,CAAC;gBACvC,YAAY,CAAC,IAAI,CAAC;oBAChB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;iBAC5B,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CACT,+BAA+B,UAAU,CAAC,MAAM,+BAA+B,CAChF,CAAC;YAEF,oEAAoE;YACpE,OAAO,CAAC,GAAG,CACT,4EAA4E,CAC7E,CAAC;YAEF,oDAAoD;YACpD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CACtC,CAAC;YAEF,gEAAgE;YAChE,MAAM,aAAa,GAAG,WAAW;iBAC9B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,CAAC,UAAU,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;iBACpE,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,wCAAwC;YACxC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE9C,MAAM,iBAAiB,GAAG;gBACxB,eAAe,EAAE,aAAa,CAAC,MAAM;gBACrC,eAAe,EAAE,YAAY,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7C,CAAC,CACF;gBACD,eAAe,EAAE,YAAY,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7C,CAAC,CACF;gBACD,eAAe,EAAE,YAAY,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7C,CAAC,CACF;aACF,CAAC;YAEF,MAAM,QAAQ,GAAqB;gBACjC,UAAU,EAAE,SAAS,CAAC,MAAM;gBAC5B,cAAc,EAAE,YAAY,CAAC,MAAM;gBACnC,iBAAiB,EAAE,YAAY,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAC7D;gBACD,cAAc;gBACd,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,KAAK;gBACtD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,GAAG;aAC/C,CAAC;YAEF,OAAO,CAAC,GAAG,CACT,gEAAgE,cAAc,IAAI,CACnF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,qCAAqC,aAAa,CAAC,MAAM,yBAAyB,CACnF,CAAC;YAEF,OAAO;gBACL,QAAQ,EAAE,aAAa;gBACvB,KAAK,EAAE,YAAY;gBACnB,QAAQ;gBACR,iBAAiB;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,IAAI,yBAAyB;oBAChE,UAAU,EAAE,iBAAiB;oBAC7B,cAAc,EAAE,qBAAqB;iBACtC;gBACD,cAAc,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;gBACtE,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YAEjE,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE;oBACR,UAAU,EAAE,CAAC;oBACb,cAAc,EAAE,CAAC;oBACjB,iBAAiB,EAAE,KAAK;oBACxB,cAAc;oBACd,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,KAAK;oBACtD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,GAAG;iBAC/C;gBACD,iBAAiB,EAAE;oBACjB,eAAe,EAAE,CAAC;oBAClB,eAAe,EAAE,CAAC;oBAClB,eAAe,EAAE,CAAC;oBAClB,eAAe,EAAE,CAAC;iBACnB;gBACD,UAAU,EAAE;oBACV,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,IAAI,yBAAyB;oBAChE,UAAU,EAAE,CAAC;oBACb,cAAc;iBACf;gBACD,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,KAAK,YAAY,KAAK;oBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,gDAAgD;aACvD,CAAC;QACJ,CAAC;IACH,CAAC"}
|