sea-dev 1.0.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/.claude/tasks/README.md +89 -0
- package/.cursor/rules/commits.mdc +31 -0
- package/.cursor/rules/general.mdc +84 -0
- package/.github/workflows/ci-cd.yml +141 -0
- package/CLAUDE.md +337 -0
- package/README.md +129 -0
- package/apps/api/.prettierignore +6 -0
- package/apps/api/.prettierrc.js +3 -0
- package/apps/api/dotenvx-safe.sh +11 -0
- package/apps/api/eslint.config.mjs +3 -0
- package/apps/api/package.json +58 -0
- package/apps/api/src/clients/posthog.ts +25 -0
- package/apps/api/src/dal/submission.ts +59 -0
- package/apps/api/src/errors.ts +55 -0
- package/apps/api/src/index.ts +21 -0
- package/apps/api/src/lib/channel.ts +28 -0
- package/apps/api/src/lib/config.ts +9 -0
- package/apps/api/src/lib/fmt.test.ts +9 -0
- package/apps/api/src/lib/fmt.ts +62 -0
- package/apps/api/src/lib/invariant.ts +23 -0
- package/apps/api/src/middleware/auth.ts +66 -0
- package/apps/api/src/routes/index.ts +20 -0
- package/apps/api/src/routes/v2/chat/handlers.ts +693 -0
- package/apps/api/src/routes/v2/chat/index.ts +257 -0
- package/apps/api/src/routes/v2/chat/schemas.ts +43 -0
- package/apps/api/src/routes/v2/deals/handlers.ts +64 -0
- package/apps/api/src/routes/v2/deals/index.ts +88 -0
- package/apps/api/src/routes/v2/deals/schemas.ts +38 -0
- package/apps/api/src/routes/v2/forms/handlers.ts +415 -0
- package/apps/api/src/routes/v2/forms/index.ts +382 -0
- package/apps/api/src/routes/v2/forms/schemas.ts +243 -0
- package/apps/api/src/routes/v2/index.ts +19 -0
- package/apps/api/src/routes/v2/pipelines/handlers.ts +261 -0
- package/apps/api/src/routes/v2/pipelines/index.ts +224 -0
- package/apps/api/src/routes/v2/pipelines/schemas.ts +173 -0
- package/apps/api/src/routes/v2/submissions/handlers.ts +555 -0
- package/apps/api/src/routes/v2/submissions/index.ts +366 -0
- package/apps/api/src/routes/v2/submissions/schemas.ts +233 -0
- package/apps/api/src/routes/v2/workflows/handlers.ts +81 -0
- package/apps/api/src/routes/v2/workflows/index.ts +88 -0
- package/apps/api/src/routes/v2/workflows/schemas.ts +40 -0
- package/apps/api/src/server.ts +146 -0
- package/apps/api/src/static/favicon.ico +0 -0
- package/apps/api/src/types/api.ts +14 -0
- package/apps/api/src/types/result.ts +3 -0
- package/apps/api/tsconfig.json +22 -0
- package/apps/api/vite.config.ts +28 -0
- package/apps/api/vitest.config.ts +14 -0
- package/apps/conversion-worker/Dockerfile +59 -0
- package/apps/conversion-worker/package.json +31 -0
- package/apps/conversion-worker/src/lib/config.ts +7 -0
- package/apps/conversion-worker/src/main.ts +22 -0
- package/apps/conversion-worker/src/workflows/convert-pptx.ts +116 -0
- package/apps/conversion-worker/tsconfig.json +27 -0
- package/apps/conversion-worker/vite.config.ts +33 -0
- package/apps/main/.prettierignore +6 -0
- package/apps/main/.prettierrc.js +3 -0
- package/apps/main/CLAUDE.md +245 -0
- package/apps/main/Procfile +1 -0
- package/apps/main/README.md +193 -0
- package/apps/main/db-tests.jsonl +116 -0
- package/apps/main/dotenvx-safe.sh +11 -0
- package/apps/main/drizzle/meta/_journal.json +1 -0
- package/apps/main/drizzle.config.ts +25 -0
- package/apps/main/eslint.config.mjs +3 -0
- package/apps/main/generate-routes.mjs +5 -0
- package/apps/main/package.json +131 -0
- package/apps/main/playwright.config.ts +23 -0
- package/apps/main/postcss.config.ts +5 -0
- package/apps/main/public/bg-dark.svg +10 -0
- package/apps/main/public/bg.svg +10 -0
- package/apps/main/public/favicon.ico +0 -0
- package/apps/main/run.sh +146 -0
- package/apps/main/scripts/browser.ts +14 -0
- package/apps/main/scripts/db-test-cov.ts +277 -0
- package/apps/main/scripts/login.ts +78 -0
- package/apps/main/scripts/repl.ts +61 -0
- package/apps/main/src/_foo.ts +31 -0
- package/apps/main/src/_tests/db.test.ts +19 -0
- package/apps/main/src/_tests/mock-db.ts +60 -0
- package/apps/main/src/client.tsx +13 -0
- package/apps/main/src/clients/loops.ts +13 -0
- package/apps/main/src/clients/polar.ts +12 -0
- package/apps/main/src/clients/posthog.ts +12 -0
- package/apps/main/src/components/chat/chat-context.tsx +99 -0
- package/apps/main/src/components/chat/chat-messages.tsx +184 -0
- package/apps/main/src/components/chat/chat-status.tsx +140 -0
- package/apps/main/src/components/chat/chat.tsx +458 -0
- package/apps/main/src/components/chat/citation-modal.tsx +54 -0
- package/apps/main/src/components/cta.tsx +21 -0
- package/apps/main/src/components/data-display/derived.tsx +40 -0
- package/apps/main/src/components/data-display/group-single.tsx +57 -0
- package/apps/main/src/components/data-display/group-table.tsx +165 -0
- package/apps/main/src/components/data-display/group-wrapper.tsx +54 -0
- package/apps/main/src/components/data-display/item.tsx +678 -0
- package/apps/main/src/components/error.tsx +45 -0
- package/apps/main/src/components/forms/error.tsx +22 -0
- package/apps/main/src/components/grid.tsx +7 -0
- package/apps/main/src/components/header/container.tsx +73 -0
- package/apps/main/src/components/header/header-bar.tsx +102 -0
- package/apps/main/src/components/modals/copy-display.tsx +37 -0
- package/apps/main/src/components/modals/copy-form.tsx +152 -0
- package/apps/main/src/components/modals/duplicate-workflow.tsx +89 -0
- package/apps/main/src/components/modals/field-correction.tsx +323 -0
- package/apps/main/src/components/modals/form-viewer.tsx +126 -0
- package/apps/main/src/components/modals/modals.tsx +44 -0
- package/apps/main/src/components/modals/new-deal.tsx +78 -0
- package/apps/main/src/components/modals/new-form.tsx +133 -0
- package/apps/main/src/components/modals/new-pipeline.tsx +70 -0
- package/apps/main/src/components/modals/new-submission.tsx +321 -0
- package/apps/main/src/components/modals/new-workflow.tsx +342 -0
- package/apps/main/src/components/modals/transformation-sources-modal.tsx +157 -0
- package/apps/main/src/components/modals/view-report.tsx +193 -0
- package/apps/main/src/components/not-found.tsx +14 -0
- package/apps/main/src/components/search/search-bar.tsx +178 -0
- package/apps/main/src/components/sheet-selector.tsx +135 -0
- package/apps/main/src/components/side-panel/doc-list.tsx +480 -0
- package/apps/main/src/components/sidebar/admin-sidebar.tsx +75 -0
- package/apps/main/src/components/sidebar/app-sidebar.tsx +417 -0
- package/apps/main/src/components/sidebar/model-select.tsx +134 -0
- package/apps/main/src/components/sidebar/settings-sidebar.tsx +132 -0
- package/apps/main/src/components/sidebar/sidebar-right.tsx +22 -0
- package/apps/main/src/components/sidebar/stop-impersonate.tsx +21 -0
- package/apps/main/src/components/svg/loading.tsx +33 -0
- package/apps/main/src/components/theme-selector.tsx +43 -0
- package/apps/main/src/components/unsaved-badge.tsx +19 -0
- package/apps/main/src/components/upload/file-upload.tsx +354 -0
- package/apps/main/src/fns/submission-groups.ts +28 -0
- package/apps/main/src/fns/submission-items.ts +11 -0
- package/apps/main/src/global-middleware.ts +16 -0
- package/apps/main/src/hooks/use-update-state.ts +18 -0
- package/apps/main/src/lib/auth-client.ts +16 -0
- package/apps/main/src/lib/auth.test.ts +359 -0
- package/apps/main/src/lib/auth.ts +144 -0
- package/apps/main/src/lib/billing.ts +23 -0
- package/apps/main/src/lib/config-iso.ts +76 -0
- package/apps/main/src/lib/config.ts +61 -0
- package/apps/main/src/lib/excel.ts +16 -0
- package/apps/main/src/lib/feedback-cache.ts +70 -0
- package/apps/main/src/lib/logger.ts +44 -0
- package/apps/main/src/lib/models.ts +22 -0
- package/apps/main/src/lib/not-found.ts +17 -0
- package/apps/main/src/lib/pdf.ts +16 -0
- package/apps/main/src/lib/tabularize.ts +54 -0
- package/apps/main/src/lib/utils.ts +10 -0
- package/apps/main/src/lib/zfd.ts +217 -0
- package/apps/main/src/middleware.ts +55 -0
- package/apps/main/src/routeTree.gen.ts +1255 -0
- package/apps/main/src/router.tsx +24 -0
- package/apps/main/src/routes/__root.tsx +92 -0
- package/apps/main/src/routes/_authed/_app/(dashboard)/index.tsx +227 -0
- package/apps/main/src/routes/_authed/_app/agents/$agentId/config.tsx +224 -0
- package/apps/main/src/routes/_authed/_app/agents/$agentId/index.tsx +206 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/agent-actions-menu.tsx +94 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/agent-artifacts.tsx +153 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/agent-chat.tsx +220 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/agent-history-menu.tsx +81 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/agent-model-select.tsx +84 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/agent-relevant-items.tsx +226 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/agent-upload-button.tsx +298 -0
- package/apps/main/src/routes/_authed/_app/agents/-components/context-modal.tsx +187 -0
- package/apps/main/src/routes/_authed/_app/agents/-fns.ts +560 -0
- package/apps/main/src/routes/_authed/_app/agents/index.tsx +65 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/$subId/-components/citation-tree.tsx +268 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/$subId.tsx +655 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/doc-loading.tsx +37 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/share-link.tsx +42 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/submission-card.tsx +89 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/submission-filter.tsx +193 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/submissions.tsx +36 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/summary.tsx +82 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/upload-doc.tsx +120 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/-fns.ts +653 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/index.tsx +259 -0
- package/apps/main/src/routes/_authed/_app/deals/$dealId/route.tsx +29 -0
- package/apps/main/src/routes/_authed/_app/deals/index.tsx +104 -0
- package/apps/main/src/routes/_authed/_app/feedback/index.tsx +639 -0
- package/apps/main/src/routes/_authed/_app/feedback/insights.tsx +250 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/blockers-panel.tsx +260 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/manual-input-panel.tsx +301 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/submission-selector-modal.tsx +143 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/upload-doc.tsx +120 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/index.tsx +1485 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/-components/dag-view.tsx +296 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/-components/step-config-modal.tsx +634 -0
- package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/index.tsx +911 -0
- package/apps/main/src/routes/_authed/_app/pipelines/-fns.ts +510 -0
- package/apps/main/src/routes/_authed/_app/pipelines/index.tsx +103 -0
- package/apps/main/src/routes/_authed/_app/reports/$reportId.tsx +397 -0
- package/apps/main/src/routes/_authed/_app/reports/-fns.ts +11 -0
- package/apps/main/src/routes/_authed/_app/reports/index.tsx +22 -0
- package/apps/main/src/routes/_authed/_app/route.tsx +48 -0
- package/apps/main/src/routes/_authed/_app/submissions/-columns.tsx +161 -0
- package/apps/main/src/routes/_authed/_app/submissions/-fns.ts +128 -0
- package/apps/main/src/routes/_authed/_app/submissions/index.tsx +190 -0
- package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/$formId.tsx +542 -0
- package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/-components/derived.tsx +154 -0
- package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/-components/field.tsx +369 -0
- package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/-components/group.tsx +475 -0
- package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/index.tsx +263 -0
- package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/route.tsx +33 -0
- package/apps/main/src/routes/_authed/_app/workflows/-components/form-card.tsx +315 -0
- package/apps/main/src/routes/_authed/_app/workflows/index.tsx +86 -0
- package/apps/main/src/routes/_authed/admin/index.tsx +12 -0
- package/apps/main/src/routes/_authed/admin/route.tsx +42 -0
- package/apps/main/src/routes/_authed/admin/users/-columns.tsx +124 -0
- package/apps/main/src/routes/_authed/admin/users/-fns.ts +30 -0
- package/apps/main/src/routes/_authed/admin/users/index.tsx +29 -0
- package/apps/main/src/routes/_authed/catchNotFound.tsx +114 -0
- package/apps/main/src/routes/_authed/redirects/forms.$id.tsx +29 -0
- package/apps/main/src/routes/_authed/redirects/submissions.$id.tsx +27 -0
- package/apps/main/src/routes/_authed/redirects/workflows.$id.tsx +27 -0
- package/apps/main/src/routes/_authed/route.tsx +51 -0
- package/apps/main/src/routes/_authed/settings/-components/new-api-key.tsx +85 -0
- package/apps/main/src/routes/_authed/settings/-components/new-invite.tsx +100 -0
- package/apps/main/src/routes/_authed/settings/analytics.tsx +1710 -0
- package/apps/main/src/routes/_authed/settings/billing/-components/price-table.tsx +129 -0
- package/apps/main/src/routes/_authed/settings/billing/-fns.ts +76 -0
- package/apps/main/src/routes/_authed/settings/billing/index.tsx +119 -0
- package/apps/main/src/routes/_authed/settings/embed.tsx +337 -0
- package/apps/main/src/routes/_authed/settings/index.tsx +12 -0
- package/apps/main/src/routes/_authed/settings/keys.tsx +157 -0
- package/apps/main/src/routes/_authed/settings/members.tsx +276 -0
- package/apps/main/src/routes/_authed/settings/route.tsx +22 -0
- package/apps/main/src/routes/_authed/settings/user.tsx +87 -0
- package/apps/main/src/routes/_authed/settings/workspace.tsx +206 -0
- package/apps/main/src/routes/_public/-components/sign-in-up.tsx +96 -0
- package/apps/main/src/routes/_public/embedded.tsx +57 -0
- package/apps/main/src/routes/_public/invite.$inviteId.tsx +143 -0
- package/apps/main/src/routes/_public/no-access.tsx +38 -0
- package/apps/main/src/routes/_public/no-invite.tsx +39 -0
- package/apps/main/src/routes/_public/otp.tsx +103 -0
- package/apps/main/src/routes/_public/route.tsx +15 -0
- package/apps/main/src/routes/_public/sign-in.tsx +111 -0
- package/apps/main/src/routes/_public/sign-up.tsx +114 -0
- package/apps/main/src/routes/api/auth/$.ts +11 -0
- package/apps/main/src/routes/api/billing/paid.ts +42 -0
- package/apps/main/src/routes/api/billing/webhooks.ts +70 -0
- package/apps/main/src/routes/api/chat/agent.ts +40 -0
- package/apps/main/src/routes/api/chat/key.ts +42 -0
- package/apps/main/src/routes/api/chat/member.ts +35 -0
- package/apps/main/src/routes/api/test/index.ts +19 -0
- package/apps/main/src/server.tsx +6 -0
- package/apps/main/src/styles/app.css +23 -0
- package/apps/main/src/vite-env.d.ts +7 -0
- package/apps/main/test.http +6 -0
- package/apps/main/tsconfig.json +17 -0
- package/apps/main/vite.config.ts +24 -0
- package/apps/main/vitest.config.js +17 -0
- package/apps/mcp/README.md +171 -0
- package/apps/mcp/eslint.config.mjs +3 -0
- package/apps/mcp/package.json +37 -0
- package/apps/mcp/src/index.ts +414 -0
- package/apps/mcp/tsconfig.json +19 -0
- package/apps/mcp/vite.config.ts +22 -0
- package/apps/posthog-proxy/index.html +9 -0
- package/apps/workers/.prettierignore +7 -0
- package/apps/workers/.prettierrc.js +3 -0
- package/apps/workers/dotenvx-safe.sh +11 -0
- package/apps/workers/eslint.config.mjs +3 -0
- package/apps/workers/package.json +65 -0
- package/apps/workers/src/lib/config.ts +7 -0
- package/apps/workers/src/lib/messages.ts +0 -0
- package/apps/workers/src/lib/posthog.ts +25 -0
- package/apps/workers/src/main.ts +58 -0
- package/apps/workers/src/workflows/extraction.ts +866 -0
- package/apps/workers/src/workflows/index.ts +3 -0
- package/apps/workers/src/workflows/pipeline-dag.ts +210 -0
- package/apps/workers/src/workflows/pipeline-steps.ts +1393 -0
- package/apps/workers/tsconfig.json +16 -0
- package/apps/workers/vite.config.ts +35 -0
- package/docs/CHANGELOG.md +84 -0
- package/docs/agent-templates-and-runs.md +859 -0
- package/docs/aws-migration-plan.md +267 -0
- package/docs/impl-p0-form-builder-improvements.md +683 -0
- package/docs/on-prem-deployment-spec.docx +0 -0
- package/docs/on-prem-deployment-spec.md +378 -0
- package/docs/prd-form-builder-strategy.md +1120 -0
- package/docs/widget-ng-apf-packaging-spec.md +43 -0
- package/infra/k8s/charts/seadotdev/Chart.yaml +6 -0
- package/infra/k8s/charts/seadotdev/templates/_helpers.tpl +27 -0
- package/infra/k8s/charts/seadotdev/templates/api-v2.yaml +105 -0
- package/infra/k8s/charts/seadotdev/templates/external-secrets.yaml +83 -0
- package/infra/k8s/charts/seadotdev/templates/ingress.yaml +54 -0
- package/infra/k8s/charts/seadotdev/templates/main-app.yaml +104 -0
- package/infra/k8s/charts/seadotdev/templates/workers.yaml +182 -0
- package/infra/k8s/charts/seadotdev/values.yaml +143 -0
- package/infra/terraform/main.tf +399 -0
- package/libs/ai/.prettierignore +2 -0
- package/libs/ai/.prettierrc.js +5 -0
- package/libs/ai/README.md +139 -0
- package/libs/ai/eslint.config.mjs +3 -0
- package/libs/ai/package.json +42 -0
- package/libs/ai/src/index.ts +5 -0
- package/libs/ai/src/models.ts +19 -0
- package/libs/ai/src/rag/index.ts +1 -0
- package/libs/ai/src/rag/rag.test.ts +99 -0
- package/libs/ai/src/rag/rag.ts +510 -0
- package/libs/ai/tsconfig.json +21 -0
- package/libs/ai/vite.config.ts +38 -0
- package/libs/cache/.prettierignore +2 -0
- package/libs/cache/eslint.config.mjs +3 -0
- package/libs/cache/package.json +35 -0
- package/libs/cache/src/feedback.ts +77 -0
- package/libs/cache/src/index.ts +2 -0
- package/libs/cache/tsconfig.json +19 -0
- package/libs/cache/vite.config.ts +36 -0
- package/libs/clients/.prettierignore +6 -0
- package/libs/clients/eslint.config.mjs +3 -0
- package/libs/clients/package.json +59 -0
- package/libs/clients/src/azure.ts +249 -0
- package/libs/clients/src/gcp.ts +220 -0
- package/libs/clients/src/hatchet.ts +86 -0
- package/libs/clients/src/index.ts +8 -0
- package/libs/clients/src/loops.ts +86 -0
- package/libs/clients/src/polar.ts +77 -0
- package/libs/clients/src/posthog.ts +55 -0
- package/libs/clients/tsconfig.json +19 -0
- package/libs/clients/vite.config.ts +35 -0
- package/libs/config/.prettierignore +6 -0
- package/libs/config/.prettierrc.js +12 -0
- package/libs/config/eslint.config.mjs +3 -0
- package/libs/config/package.json +50 -0
- package/libs/config/src/azure.ts +54 -0
- package/libs/config/src/db.ts +18 -0
- package/libs/config/src/gcp.ts +53 -0
- package/libs/config/src/google.ts +17 -0
- package/libs/config/src/hatchet.ts +20 -0
- package/libs/config/src/index.ts +108 -0
- package/libs/config/src/llm.ts +17 -0
- package/libs/config/src/polar.ts +24 -0
- package/libs/config/src/util.ts +8 -0
- package/libs/config/src/vercel.ts +26 -0
- package/libs/config/tsconfig.json +19 -0
- package/libs/config/vite.config.ts +34 -0
- package/libs/core/.prettierignore +2 -0
- package/libs/core/eslint.config.mjs +3 -0
- package/libs/core/package.json +59 -0
- package/libs/core/src/chat/derived.ts +97 -0
- package/libs/core/src/chat/feedback.ts +293 -0
- package/libs/core/src/chat/index.ts +6 -0
- package/libs/core/src/chat/model.ts +92 -0
- package/libs/core/src/chat/prepare-tools.ts +286 -0
- package/libs/core/src/chat/prompts.ts +623 -0
- package/libs/core/src/chat/stream.ts +311 -0
- package/libs/core/src/chat/summarize.ts +168 -0
- package/libs/core/src/chat/tools/agent.ts +403 -0
- package/libs/core/src/chat/tools/chart-agent.ts +526 -0
- package/libs/core/src/chat/tools/chart-helpers/sandbox.ts +47 -0
- package/libs/core/src/chat/tools/chart.ts +86 -0
- package/libs/core/src/chat/tools/credit-agent.ts +1383 -0
- package/libs/core/src/chat/tools/credit.ts +1435 -0
- package/libs/core/src/chat/tools/deep-dive-agent.ts +100 -0
- package/libs/core/src/chat/tools/deep-dive.ts +141 -0
- package/libs/core/src/chat/tools/form.ts +449 -0
- package/libs/core/src/chat/tools/helpers.ts +91 -0
- package/libs/core/src/chat/tools/index.ts +42 -0
- package/libs/core/src/chat/tools/pipeline-artifact.ts +76 -0
- package/libs/core/src/chat/tools/report.ts +40 -0
- package/libs/core/src/chat/tools/search.ts +390 -0
- package/libs/core/src/chat/tools/submission.ts +227 -0
- package/libs/core/src/chat/tools/workflow.ts +684 -0
- package/libs/core/src/chat/types.ts +3 -0
- package/libs/core/src/data-extraction/classification/azure.ts +168 -0
- package/libs/core/src/data-extraction/classification/index.ts +1 -0
- package/libs/core/src/data-extraction/dal.ts +246 -0
- package/libs/core/src/data-extraction/form-structure-extractor.ts +294 -0
- package/libs/core/src/data-extraction/index.ts +4 -0
- package/libs/core/src/data-extraction/layout/azure.ts +730 -0
- package/libs/core/src/data-extraction/layout/excel.ts +180 -0
- package/libs/core/src/data-extraction/layout/gcp.ts +1071 -0
- package/libs/core/src/data-extraction/layout/index.ts +266 -0
- package/libs/core/src/data-extraction/layout/plaintext.ts +45 -0
- package/libs/core/src/data-extraction/models.ts +38 -0
- package/libs/core/src/data-extraction/pdf-utils.ts +96 -0
- package/libs/core/src/data-extraction/structuring/bank-statement.ts +1182 -0
- package/libs/core/src/data-extraction/structuring/custom.ts +495 -0
- package/libs/core/src/data-extraction/structuring/index.ts +290 -0
- package/libs/core/src/data-extraction/structuring/prompts.ts +69 -0
- package/libs/core/src/data-extraction/type-guards.ts +110 -0
- package/libs/core/src/data-extraction/types.ts +84 -0
- package/libs/core/src/data-extraction/utils.ts +31 -0
- package/libs/core/src/data-extraction/validation/bank-statement.ts +127 -0
- package/libs/core/src/deals.ts +17 -0
- package/libs/core/src/documents.ts +152 -0
- package/libs/core/src/index.ts +5 -0
- package/libs/core/src/pipelines/display.ts +678 -0
- package/libs/core/src/pipelines/execute.ts +2342 -0
- package/libs/core/src/pipelines/index.ts +4 -0
- package/libs/core/src/pipelines/list.ts +12 -0
- package/libs/core/src/pipelines/runs.ts +53 -0
- package/libs/core/tsconfig.json +20 -0
- package/libs/core/vite.config.ts +56 -0
- package/libs/dal/.prettierignore +6 -0
- package/libs/dal/.prettierrc.js +12 -0
- package/libs/dal/eslint.config.mjs +3 -0
- package/libs/dal/package.json +57 -0
- package/libs/dal/src/_tests/db.test.ts +19 -0
- package/libs/dal/src/_tests/mock-db.ts +60 -0
- package/libs/dal/src/api-key.test.ts +397 -0
- package/libs/dal/src/api-key.ts +110 -0
- package/libs/dal/src/billing.ts +23 -0
- package/libs/dal/src/conversation.test.ts +655 -0
- package/libs/dal/src/conversation.ts +532 -0
- package/libs/dal/src/deal.test.ts +45 -0
- package/libs/dal/src/deal.ts +87 -0
- package/libs/dal/src/defaults-consumer-lending-uk.ts +33 -0
- package/libs/dal/src/defaults-consumer-lending-us.ts +33 -0
- package/libs/dal/src/defaults-private-credit.ts +57 -0
- package/libs/dal/src/defaults-private-equity.ts +51 -0
- package/libs/dal/src/defaults-smb-lending-us.ts +1569 -0
- package/libs/dal/src/defaults-sme-lending-uk-express.ts +1527 -0
- package/libs/dal/src/defaults-sme-lending-uk.ts +1669 -0
- package/libs/dal/src/defaults-types.ts +23 -0
- package/libs/dal/src/defaults.ts +550 -0
- package/libs/dal/src/document.test.ts +70 -0
- package/libs/dal/src/document.ts +192 -0
- package/libs/dal/src/feedback.ts +255 -0
- package/libs/dal/src/form.test.ts +637 -0
- package/libs/dal/src/form.ts +1165 -0
- package/libs/dal/src/index.ts +20 -0
- package/libs/dal/src/invitation.test.ts +746 -0
- package/libs/dal/src/invitation.ts +207 -0
- package/libs/dal/src/member.test.ts +185 -0
- package/libs/dal/src/member.ts +80 -0
- package/libs/dal/src/organization.ts +116 -0
- package/libs/dal/src/permission.ts +25 -0
- package/libs/dal/src/pipeline.test.ts +388 -0
- package/libs/dal/src/pipeline.ts +4222 -0
- package/libs/dal/src/report.ts +199 -0
- package/libs/dal/src/result.ts +16 -0
- package/libs/dal/src/search.ts +172 -0
- package/libs/dal/src/session.test.ts +110 -0
- package/libs/dal/src/session.ts +31 -0
- package/libs/dal/src/submission.test.ts +1304 -0
- package/libs/dal/src/submission.ts +1396 -0
- package/libs/dal/src/tool.ts +159 -0
- package/libs/dal/src/user.ts +16 -0
- package/libs/dal/src/workflow.test.ts +89 -0
- package/libs/dal/src/workflow.ts +262 -0
- package/libs/dal/tsconfig.build.json +4 -0
- package/libs/dal/tsconfig.json +22 -0
- package/libs/dal/vite.config.ts +34 -0
- package/libs/db/.prettierignore +6 -0
- package/libs/db/.prettierrc.js +12 -0
- package/libs/db/eslint.config.mjs +3 -0
- package/libs/db/package.json +52 -0
- package/libs/db/src/index.ts +24 -0
- package/libs/db/src/relations.ts +549 -0
- package/libs/db/src/schema.ts +2 -0
- package/libs/db/src/schemas/api.ts +35 -0
- package/libs/db/src/schemas/conversations.ts +175 -0
- package/libs/db/src/schemas/core.ts +359 -0
- package/libs/db/src/schemas/documents.ts +181 -0
- package/libs/db/src/schemas/feedback.ts +40 -0
- package/libs/db/src/schemas/index.ts +26 -0
- package/libs/db/src/schemas/organisations.ts +97 -0
- package/libs/db/src/schemas/pipelines.ts +440 -0
- package/libs/db/src/schemas/users.ts +95 -0
- package/libs/db/src/types.ts +190 -0
- package/libs/db/src/utils.ts +14 -0
- package/libs/db/tsconfig.json +19 -0
- package/libs/db/vite.config.ts +31 -0
- package/libs/lint/.prettierignore +6 -0
- package/libs/lint/eslint.config.mjs +61 -0
- package/libs/lint/package.json +29 -0
- package/libs/lint/prettier.config.js +12 -0
- package/libs/schemas/.prettierignore +6 -0
- package/libs/schemas/.prettierrc.js +12 -0
- package/libs/schemas/README.md +15 -0
- package/libs/schemas/eslint.config.mjs +3 -0
- package/libs/schemas/package.json +67 -0
- package/libs/schemas/src/core/chat.ts +67 -0
- package/libs/schemas/src/core/core-result.ts +15 -0
- package/libs/schemas/src/core/data-extraction.ts +184 -0
- package/libs/schemas/src/core/layout.ts +478 -0
- package/libs/schemas/src/core/pipeline.ts +128 -0
- package/libs/schemas/src/core/submission.ts +97 -0
- package/libs/schemas/src/db/account.ts +57 -0
- package/libs/schemas/src/db/apiKey.ts +57 -0
- package/libs/schemas/src/db/context.ts +33 -0
- package/libs/schemas/src/db/conversation.ts +65 -0
- package/libs/schemas/src/db/deal.ts +42 -0
- package/libs/schemas/src/db/document.ts +103 -0
- package/libs/schemas/src/db/documentCitation.ts +58 -0
- package/libs/schemas/src/db/documentExtraction.ts +69 -0
- package/libs/schemas/src/db/fieldCorrection.ts +85 -0
- package/libs/schemas/src/db/form.ts +45 -0
- package/libs/schemas/src/db/formField.ts +59 -0
- package/libs/schemas/src/db/formGroup.ts +42 -0
- package/libs/schemas/src/db/impersonation.ts +39 -0
- package/libs/schemas/src/db/index.ts +25 -0
- package/libs/schemas/src/db/invitation.ts +42 -0
- package/libs/schemas/src/db/member.ts +36 -0
- package/libs/schemas/src/db/message.ts +58 -0
- package/libs/schemas/src/db/organization.ts +62 -0
- package/libs/schemas/src/db/session.ts +48 -0
- package/libs/schemas/src/db/submission.ts +54 -0
- package/libs/schemas/src/db/submissionGroup.ts +36 -0
- package/libs/schemas/src/db/submissionItem.ts +33 -0
- package/libs/schemas/src/db/submissionItemVersion.ts +70 -0
- package/libs/schemas/src/db/user.ts +51 -0
- package/libs/schemas/src/db/utils.ts +3 -0
- package/libs/schemas/src/db/verification.ts +36 -0
- package/libs/schemas/src/db/workflow.ts +42 -0
- package/libs/schemas/src/index.ts +10 -0
- package/libs/schemas/tsconfig.json +21 -0
- package/libs/schemas/vite.config.ts +38 -0
- package/libs/ui/.prettierignore +6 -0
- package/libs/ui/.prettierrc.js +12 -0
- package/libs/ui/components.json +24 -0
- package/libs/ui/eslint.config.mjs +3 -0
- package/libs/ui/package.json +142 -0
- package/libs/ui/src/components/chart-viz/chart.tsx +255 -0
- package/libs/ui/src/components/chart-viz/converters.ts +474 -0
- package/libs/ui/src/components/chart-viz/dashboard.tsx +146 -0
- package/libs/ui/src/components/chart-viz/index.ts +37 -0
- package/libs/ui/src/components/chart-viz/markdown.tsx +344 -0
- package/libs/ui/src/components/chart-viz/table.tsx +446 -0
- package/libs/ui/src/components/chart-viz/theme-context.tsx +70 -0
- package/libs/ui/src/components/chart-viz/themes/dark.ts +98 -0
- package/libs/ui/src/components/chart-viz/themes/index.ts +69 -0
- package/libs/ui/src/components/chart-viz/themes/light.ts +98 -0
- package/libs/ui/src/components/chart-viz/themes/tailwind.ts +326 -0
- package/libs/ui/src/components/chart-viz/themes/types.ts +99 -0
- package/libs/ui/src/components/chart-viz/tool-display.tsx +150 -0
- package/libs/ui/src/components/chart-viz/types.ts +95 -0
- package/libs/ui/src/components/doc-viewers/excel/index.tsx +431 -0
- package/libs/ui/src/components/doc-viewers/excel/themes.ts +160 -0
- package/libs/ui/src/components/doc-viewers/image/index.tsx +410 -0
- package/libs/ui/src/components/doc-viewers/pdf/index.tsx +258 -0
- package/libs/ui/src/components/doc-viewers/pdf/virtualized-pdf.tsx +556 -0
- package/libs/ui/src/components/misc/rel-date.tsx +52 -0
- package/libs/ui/src/components/misc/styled-link.tsx +2 -0
- package/libs/ui/src/components/table/data-table.tsx +546 -0
- package/libs/ui/src/components/table/report-table.tsx +305 -0
- package/libs/ui/src/components/table/sortable-column.tsx +34 -0
- package/libs/ui/src/components/ui/accordion.tsx +62 -0
- package/libs/ui/src/components/ui/alert-dialog.tsx +142 -0
- package/libs/ui/src/components/ui/alert.tsx +62 -0
- package/libs/ui/src/components/ui/artifact.tsx +118 -0
- package/libs/ui/src/components/ui/attachments.tsx +388 -0
- package/libs/ui/src/components/ui/avatar.tsx +39 -0
- package/libs/ui/src/components/ui/badge.tsx +43 -0
- package/libs/ui/src/components/ui/breadcrumb.tsx +102 -0
- package/libs/ui/src/components/ui/button-group.tsx +78 -0
- package/libs/ui/src/components/ui/button.tsx +79 -0
- package/libs/ui/src/components/ui/card.tsx +32 -0
- package/libs/ui/src/components/ui/carousel.tsx +228 -0
- package/libs/ui/src/components/ui/chain-of-thought.tsx +198 -0
- package/libs/ui/src/components/ui/checkbox.tsx +27 -0
- package/libs/ui/src/components/ui/citation.tsx +34 -0
- package/libs/ui/src/components/ui/code-block.tsx +500 -0
- package/libs/ui/src/components/ui/collapsible.tsx +19 -0
- package/libs/ui/src/components/ui/command.tsx +161 -0
- package/libs/ui/src/components/ui/conversation.tsx +90 -0
- package/libs/ui/src/components/ui/dialog.tsx +142 -0
- package/libs/ui/src/components/ui/dropdown-menu.tsx +246 -0
- package/libs/ui/src/components/ui/highlight.tsx +3 -0
- package/libs/ui/src/components/ui/hover-card.tsx +36 -0
- package/libs/ui/src/components/ui/inline-citation.tsx +251 -0
- package/libs/ui/src/components/ui/input-group.tsx +156 -0
- package/libs/ui/src/components/ui/input-otp.tsx +78 -0
- package/libs/ui/src/components/ui/input.tsx +21 -0
- package/libs/ui/src/components/ui/label.tsx +19 -0
- package/libs/ui/src/components/ui/model-selector.tsx +174 -0
- package/libs/ui/src/components/ui/multisidebar.tsx +750 -0
- package/libs/ui/src/components/ui/popover.tsx +43 -0
- package/libs/ui/src/components/ui/progress.tsx +28 -0
- package/libs/ui/src/components/ui/reasoning.tsx +178 -0
- package/libs/ui/src/components/ui/resizable.tsx +49 -0
- package/libs/ui/src/components/ui/scroll-area.tsx +54 -0
- package/libs/ui/src/components/ui/select.tsx +171 -0
- package/libs/ui/src/components/ui/separator.tsx +26 -0
- package/libs/ui/src/components/ui/sheet.tsx +128 -0
- package/libs/ui/src/components/ui/shimmer.tsx +53 -0
- package/libs/ui/src/components/ui/skeleton.tsx +13 -0
- package/libs/ui/src/components/ui/sonner.tsx +23 -0
- package/libs/ui/src/components/ui/switch.tsx +26 -0
- package/libs/ui/src/components/ui/table.tsx +96 -0
- package/libs/ui/src/components/ui/tabs.tsx +52 -0
- package/libs/ui/src/components/ui/textarea.tsx +41 -0
- package/libs/ui/src/components/ui/tool.tsx +209 -0
- package/libs/ui/src/components/ui/tooltip.tsx +58 -0
- package/libs/ui/src/components/ui/typography.tsx +113 -0
- package/libs/ui/src/fonts/manrope-v15-latin-300.woff2 +0 -0
- package/libs/ui/src/fonts/manrope-v15-latin-400.woff2 +0 -0
- package/libs/ui/src/fonts/manrope-v15-latin-500.woff2 +0 -0
- package/libs/ui/src/fonts/manrope-v15-latin-600.woff2 +0 -0
- package/libs/ui/src/hooks/use-mobile.ts +19 -0
- package/libs/ui/src/lib/utils.ts +6 -0
- package/libs/ui/src/styles/fonts.css +35 -0
- package/libs/ui/src/styles/style.css +218 -0
- package/libs/ui/tsconfig.json +21 -0
- package/libs/ui/vite.config.ts +80 -0
- package/libs/ui-lit/README.md +245 -0
- package/libs/ui-lit/TESTING_GUIDE.md +296 -0
- package/libs/ui-lit/eslint.config.mjs +3 -0
- package/libs/ui-lit/package.json +41 -0
- package/libs/ui-lit/scripts/build-css.js +43 -0
- package/libs/ui-lit/src/components/sea-alert.ts +132 -0
- package/libs/ui-lit/src/components/sea-button.ts +95 -0
- package/libs/ui-lit/src/components/sea-card.ts +113 -0
- package/libs/ui-lit/src/components/sea-input.ts +184 -0
- package/libs/ui-lit/src/components/sea-spinner.ts +65 -0
- package/libs/ui-lit/src/index.ts +15 -0
- package/libs/ui-lit/src/lib/utils.ts +6 -0
- package/libs/ui-lit/src/styles/tailwind.css +76 -0
- package/libs/ui-lit/src/theme.css +66 -0
- package/libs/ui-lit/src/theme.ts +79 -0
- package/libs/ui-lit/src/vite-env.d.ts +6 -0
- package/libs/ui-lit/tailwind.config.ts +50 -0
- package/libs/ui-lit/test.html +289 -0
- package/libs/ui-lit/tsconfig.json +23 -0
- package/libs/ui-lit/vite.config.ts +31 -0
- package/libs/ui-lit/vite.css.config.ts +20 -0
- package/libs/util/.prettierignore +6 -0
- package/libs/util/.prettierrc.js +12 -0
- package/libs/util/eslint.config.mjs +3 -0
- package/libs/util/package.json +45 -0
- package/libs/util/src/billing.ts +10 -0
- package/libs/util/src/data-transform.ts +19 -0
- package/libs/util/src/encryption.ts +45 -0
- package/libs/util/src/fmt.test.ts +9 -0
- package/libs/util/src/fmt.ts +71 -0
- package/libs/util/src/fuzzy.ts +47 -0
- package/libs/util/src/id.ts +24 -0
- package/libs/util/src/invariant.ts +31 -0
- package/libs/util/src/sub-name.ts +7 -0
- package/libs/util/tsconfig.json +19 -0
- package/libs/util/vite.config.ts +34 -0
- package/package.json +28 -0
- package/packages/widget/.prettierignore +6 -0
- package/packages/widget/.prettierrc.js +12 -0
- package/packages/widget/README.md +95 -0
- package/packages/widget/eslint.config.mjs +11 -0
- package/packages/widget/openapi-ts.config.ts +8 -0
- package/packages/widget/package.json +89 -0
- package/packages/widget/postcss.config.mjs +10 -0
- package/packages/widget/src/clients/api/client/client.ts +187 -0
- package/packages/widget/src/clients/api/client/index.ts +22 -0
- package/packages/widget/src/clients/api/client/types.ts +192 -0
- package/packages/widget/src/clients/api/client/utils.ts +394 -0
- package/packages/widget/src/clients/api/client.gen.ts +18 -0
- package/packages/widget/src/clients/api/core/auth.ts +39 -0
- package/packages/widget/src/clients/api/core/bodySerializer.ts +74 -0
- package/packages/widget/src/clients/api/core/params.ts +132 -0
- package/packages/widget/src/clients/api/core/pathSerializer.ts +169 -0
- package/packages/widget/src/clients/api/core/types.ts +80 -0
- package/packages/widget/src/clients/api/index.ts +3 -0
- package/packages/widget/src/clients/api/sdk.gen.ts +805 -0
- package/packages/widget/src/clients/api/types.gen.ts +2085 -0
- package/packages/widget/src/components/container.tsx +42 -0
- package/packages/widget/src/components/data-display.tsx +384 -0
- package/packages/widget/src/components/data-viewer.tsx +311 -0
- package/packages/widget/src/components/doc-list.tsx +102 -0
- package/packages/widget/src/components/field-correction-modal.tsx +265 -0
- package/packages/widget/src/components/header.tsx +71 -0
- package/packages/widget/src/components/new-submission.tsx +290 -0
- package/packages/widget/src/components/sidebar-right.tsx +19 -0
- package/packages/widget/src/components/submission-card.tsx +66 -0
- package/packages/widget/src/components/submission-page.tsx +75 -0
- package/packages/widget/src/components/upload-doc.tsx +241 -0
- package/packages/widget/src/components/widget.tsx +101 -0
- package/packages/widget/src/index.tsx +167 -0
- package/packages/widget/src/lib/config.ts +2 -0
- package/packages/widget/src/lib/util.ts +40 -0
- package/packages/widget/src/styles/index.css +5 -0
- package/packages/widget/src/styles/tw-properties.css +337 -0
- package/packages/widget/src/vite-env.d.ts +3 -0
- package/packages/widget/tsconfig.app.json +35 -0
- package/packages/widget/tsconfig.json +4 -0
- package/packages/widget/tsconfig.node.json +24 -0
- package/packages/widget/vite.config.ts +116 -0
- package/packages/widget-lit/BOTTLENECKS.md +250 -0
- package/packages/widget-lit/IMPLEMENTATION_SUMMARY.md +295 -0
- package/packages/widget-lit/README.md +232 -0
- package/packages/widget-lit/eslint.config.mjs +3 -0
- package/packages/widget-lit/package.json +52 -0
- package/packages/widget-lit/src/api-client.ts +230 -0
- package/packages/widget-lit/src/api-client.ts.backup +218 -0
- package/packages/widget-lit/src/components/sea-chat.ts +382 -0
- package/packages/widget-lit/src/components/sea-submission-viewer.ts +267 -0
- package/packages/widget-lit/src/components/sea-widget.ts +317 -0
- package/packages/widget-lit/src/index.ts +48 -0
- package/packages/widget-lit/src/react.ts +58 -0
- package/packages/widget-lit/src/style.css +47 -0
- package/packages/widget-lit/tsconfig.json +24 -0
- package/packages/widget-lit/vite.config.ts +29 -0
- package/packages/widget-ng/DEVELOPMENT.md +74 -0
- package/packages/widget-ng/README.md +657 -0
- package/packages/widget-ng/dev.sh +14 -0
- package/packages/widget-ng/eslint.config.mjs +24 -0
- package/packages/widget-ng/ng-package.json +9 -0
- package/packages/widget-ng/package.json +85 -0
- package/packages/widget-ng/src/index.ts +45 -0
- package/packages/widget-ng/src/lib/components/sea-chat.component.ts +737 -0
- package/packages/widget-ng/src/lib/components/sea-data-viewer.component.ts +2240 -0
- package/packages/widget-ng/src/lib/components/sea-deal-form-modal.component.ts +702 -0
- package/packages/widget-ng/src/lib/components/sea-document-list.component.ts +350 -0
- package/packages/widget-ng/src/lib/components/sea-feedback-modal.component.ts +461 -0
- package/packages/widget-ng/src/lib/components/sea-file-upload.component.ts +655 -0
- package/packages/widget-ng/src/lib/components/sea-model-selection-modal.component.ts +367 -0
- package/packages/widget-ng/src/lib/components/sea-new-submission-modal.component.ts +414 -0
- package/packages/widget-ng/src/lib/components/sea-pdf-viewer.component.ts +869 -0
- package/packages/widget-ng/src/lib/components/sea-submission-card.component.ts +251 -0
- package/packages/widget-ng/src/lib/components/sea-widget.component.ts +684 -0
- package/packages/widget-ng/src/lib/models/submission.model.ts +170 -0
- package/packages/widget-ng/src/lib/pipes/markdown.pipe.ts +57 -0
- package/packages/widget-ng/src/lib/services/api-client.service.ts +715 -0
- package/packages/widget-ng/src/lib/services/chat.service.ts +330 -0
- package/packages/widget-ng/src/lib/services/config.service.ts +107 -0
- package/packages/widget-ng/src/web-component.ts +56 -0
- package/packages/widget-ng/tsconfig.json +25 -0
- package/packages/widget-ng/tsconfig.lib.json +9 -0
- package/packages/widget-ng/vite.config.elements.ts +26 -0
- package/packages/widget-ng/vitest.config.ts +19 -0
- package/packages/widget-ng/vitest.setup.ts +13 -0
- package/pnpm-workspace.yaml +18 -0
- package/render.yaml +136 -0
- package/scripts/README.md +57 -0
- package/scripts/package.json +22 -0
- package/scripts/python/.python-version +1 -0
- package/scripts/python/README.md +3 -0
- package/scripts/python/export-org-data.py +693 -0
- package/scripts/python/pyproject.toml +29 -0
- package/scripts/python/requirements-dev.lock +36 -0
- package/scripts/python/requirements.lock +36 -0
- package/scripts/python/src/gen.py +297 -0
- package/scripts/python/test.py +34 -0
- package/scripts/src/fix-storage-provider-mismatch.ts +239 -0
- package/scripts/src/sync-render-yaml.ts +290 -0
- package/scripts/src/test-chat-stream.ts +300 -0
- package/scripts/src/test-reconciliation.ts +230 -0
- package/scripts/tsconfig.json +15 -0
- package/tests/angular-test-app/.vscode/extensions.json +4 -0
- package/tests/angular-test-app/.vscode/launch.json +13 -0
- package/tests/angular-test-app/.vscode/tasks.json +24 -0
- package/tests/angular-test-app/README.md +59 -0
- package/tests/angular-test-app/angular.json +111 -0
- package/tests/angular-test-app/clean-start.sh +14 -0
- package/tests/angular-test-app/package.json +36 -0
- package/tests/angular-test-app/public/favicon.ico +0 -0
- package/tests/angular-test-app/src/app/app.component.ts +220 -0
- package/tests/angular-test-app/src/app/app.config.ts +5 -0
- package/tests/angular-test-app/src/env.d.ts +13 -0
- package/tests/angular-test-app/src/index.html +13 -0
- package/tests/angular-test-app/src/main.ts +6 -0
- package/tests/angular-test-app/src/styles.css +8 -0
- package/tests/angular-test-app/tsconfig.app.json +15 -0
- package/tests/angular-test-app/tsconfig.json +27 -0
- package/tests/crm-viewer-app/API_INTEGRATION_SUMMARY.md +295 -0
- package/tests/crm-viewer-app/CURRENT_ASSETS_FIELDS.md +148 -0
- package/tests/crm-viewer-app/FIELD_ID_MAPPING.md +206 -0
- package/tests/crm-viewer-app/INTEGRATION_GUIDE.md +309 -0
- package/tests/crm-viewer-app/README.md +174 -0
- package/tests/crm-viewer-app/REAL_API_INTEGRATION.md +240 -0
- package/tests/crm-viewer-app/UPDATED_IMPLEMENTATION.md +279 -0
- package/tests/crm-viewer-app/angular.json +114 -0
- package/tests/crm-viewer-app/package.json +35 -0
- package/tests/crm-viewer-app/src/app/app.component.ts +534 -0
- package/tests/crm-viewer-app/src/app/citation.service.ts +316 -0
- package/tests/crm-viewer-app/src/env.d.ts +16 -0
- package/tests/crm-viewer-app/src/index.html +19 -0
- package/tests/crm-viewer-app/src/main.ts +7 -0
- package/tests/crm-viewer-app/src/styles.css +409 -0
- package/tests/crm-viewer-app/src/template.html +2678 -0
- package/tests/crm-viewer-app/tsconfig.app.json +15 -0
- package/tests/crm-viewer-app/tsconfig.json +27 -0
- package/tests/e2e/package.json +17 -0
- package/tests/e2e/playwright.config.ts +75 -0
- package/tests/e2e/tests/api/health.spec.ts +10 -0
- package/tests/e2e/tests/app/example.spec.ts +10 -0
- package/tests/widget-test-app/.prettierignore +6 -0
- package/tests/widget-test-app/README.md +48 -0
- package/tests/widget-test-app/index.html +12 -0
- package/tests/widget-test-app/package.json +24 -0
- package/tests/widget-test-app/src/App.css +192 -0
- package/tests/widget-test-app/src/App.tsx +80 -0
- package/tests/widget-test-app/src/main.tsx +9 -0
- package/tests/widget-test-app/src/vite-env.d.ts +4 -0
- package/tests/widget-test-app/tsconfig.json +25 -0
- package/tests/widget-test-app/tsconfig.node.json +11 -0
- package/tests/widget-test-app/vite.config.ts +14 -0
|
@@ -0,0 +1,730 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AnalyzedDocumentOutput,
|
|
3
|
+
AnalyzeOperationOutput,
|
|
4
|
+
AnalyzeResultOutput,
|
|
5
|
+
DocumentIntelligenceClient,
|
|
6
|
+
} from "@azure-rest/ai-document-intelligence";
|
|
7
|
+
import createClient, {
|
|
8
|
+
getLongRunningPoller,
|
|
9
|
+
} from "@azure-rest/ai-document-intelligence";
|
|
10
|
+
import { AzureKeyCredential } from "@azure/core-auth";
|
|
11
|
+
import type { AzureDocumentProcessorConfig } from "@sea/config";
|
|
12
|
+
import type {
|
|
13
|
+
AzureDocumentResult,
|
|
14
|
+
AzureFieldOutput,
|
|
15
|
+
AzureParagraph,
|
|
16
|
+
AzureSection,
|
|
17
|
+
AzureTable,
|
|
18
|
+
AzureTableCell,
|
|
19
|
+
} from "@sea/clients/azure";
|
|
20
|
+
import type { Polygon, LayoutItemType } from "@sea/schemas/core/layout";
|
|
21
|
+
import {
|
|
22
|
+
type PretrainedEntity,
|
|
23
|
+
type EntityType,
|
|
24
|
+
type ReferenceMap,
|
|
25
|
+
Cell,
|
|
26
|
+
DocumentLayout,
|
|
27
|
+
Footer,
|
|
28
|
+
Header,
|
|
29
|
+
Paragraph,
|
|
30
|
+
Row,
|
|
31
|
+
Section,
|
|
32
|
+
Table,
|
|
33
|
+
Heading,
|
|
34
|
+
} from "@sea/schemas/core/layout";
|
|
35
|
+
import { MAX_PAGES_PER_CHUNK } from "../pdf-utils";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Azure Document Intelligence adapter for document extraction
|
|
39
|
+
* Handles document processing using Azure's Document Intelligence API
|
|
40
|
+
*/
|
|
41
|
+
export class AzureDocumentProcessor {
|
|
42
|
+
private documentIntelligenceClient: DocumentIntelligenceClient;
|
|
43
|
+
|
|
44
|
+
constructor(config: AzureDocumentProcessorConfig) {
|
|
45
|
+
this.documentIntelligenceClient = createClient(
|
|
46
|
+
config.documentIntelligenceEndpoint,
|
|
47
|
+
new AzureKeyCredential(config.documentIntelligenceKey),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Performs asynchronous document processing using a prebuilt model (e.g., bank statements, invoices)
|
|
53
|
+
* @param base64Data - Base64-encoded document data
|
|
54
|
+
* @param modelId - The prebuilt model ID (default: "prebuilt-document")
|
|
55
|
+
* @param mimeType - MIME type of the document
|
|
56
|
+
* @returns Promise<AnalyzeResultOutput> - The extracted data from the document
|
|
57
|
+
* @throws Error if the processing operation fails or Document Intelligence client is not configured
|
|
58
|
+
*/
|
|
59
|
+
public async runExtractionAsync(
|
|
60
|
+
base64Data: string,
|
|
61
|
+
modelId: string,
|
|
62
|
+
mimeType: "image/png" | "application/pdf" = "application/pdf",
|
|
63
|
+
): Promise<AnalyzeResultOutput> {
|
|
64
|
+
console.info(`Running extraction for ${mimeType} with model ${modelId}`);
|
|
65
|
+
if (!this.documentIntelligenceClient) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
"Document Intelligence client is not configured. Please provide credentials in the config.",
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const initialResponse = await this.documentIntelligenceClient
|
|
72
|
+
.path("/documentModels/{modelId}:analyze", modelId)
|
|
73
|
+
.post({
|
|
74
|
+
contentType: "application/json",
|
|
75
|
+
body: { base64Source: base64Data },
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
if (initialResponse.status !== "202") {
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Analysis failed with status: ${initialResponse.status}`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
const poller = getLongRunningPoller(
|
|
84
|
+
this.documentIntelligenceClient,
|
|
85
|
+
initialResponse,
|
|
86
|
+
);
|
|
87
|
+
const result = await poller.pollUntilDone();
|
|
88
|
+
if (result.status !== "200") {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`Analysis completed with error status: ${result.status}`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
const analysisOutput = result.body as AnalyzeOperationOutput;
|
|
94
|
+
const analyzeResult = analysisOutput.analyzeResult;
|
|
95
|
+
if (!analyzeResult) {
|
|
96
|
+
throw new Error("No documents were analyzed or extraction failed");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Return the extracted data
|
|
100
|
+
return analyzeResult;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
console.error("Error in runExtractionAsync:", error);
|
|
103
|
+
throw new Error(
|
|
104
|
+
`Failed to extract data using prebuilt model ${modelId}: ${error instanceof Error ? error.message : String(error)}`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Processes multiple document buffers with Azure Document Intelligence
|
|
111
|
+
* @param fileBuffers - Array of document buffers to process
|
|
112
|
+
* @param modelId - The model ID to use for extraction
|
|
113
|
+
* @param mimeType - MIME type of the documents
|
|
114
|
+
* @returns Promise<AnalyzeResultOutput[]> - Array of extraction results
|
|
115
|
+
*/
|
|
116
|
+
public async runExtraction(
|
|
117
|
+
fileBuffers: Buffer<ArrayBufferLike>[],
|
|
118
|
+
modelId: string,
|
|
119
|
+
mimeType: string,
|
|
120
|
+
): Promise<AnalyzeResultOutput[]> {
|
|
121
|
+
try {
|
|
122
|
+
const extractions = fileBuffers.map(async (b) => {
|
|
123
|
+
const base64File = b.toString("base64");
|
|
124
|
+
return await this.runExtractionAsync(
|
|
125
|
+
base64File,
|
|
126
|
+
modelId,
|
|
127
|
+
mimeType as "image/png" | "application/pdf",
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
return await Promise.all(extractions);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error("Error performing extraction:", error);
|
|
133
|
+
throw new Error(
|
|
134
|
+
`Extraction failed: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
type PageInfo = {
|
|
141
|
+
pageNumber?: number;
|
|
142
|
+
width?: number;
|
|
143
|
+
height?: number;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Merges multiple Azure document chunks into a single document with corrected page offsets.
|
|
148
|
+
*
|
|
149
|
+
* Each chunk's pages are offset by their position multiplied by MAX_PAGES_PER_CHUNK
|
|
150
|
+
* to maintain correct page numbering across document chunks.
|
|
151
|
+
*
|
|
152
|
+
* @param layouts - Array of Azure document chunks to merge
|
|
153
|
+
* @returns Single merged Azure document with corrected page references
|
|
154
|
+
*/
|
|
155
|
+
export function mergeChunkedLayoutsAzure(
|
|
156
|
+
layouts: AzureDocumentResult[],
|
|
157
|
+
): AzureDocumentResult {
|
|
158
|
+
const [mergedDocument] = layouts;
|
|
159
|
+
if (!mergedDocument) {
|
|
160
|
+
throw new Error("Cannot merge empty layouts array");
|
|
161
|
+
}
|
|
162
|
+
for (const [i, layout] of layouts.slice(1).entries()) {
|
|
163
|
+
const pageOffset = (i + 1) * MAX_PAGES_PER_CHUNK;
|
|
164
|
+
const sectionOffset = mergedDocument.sections?.length ?? 0;
|
|
165
|
+
const paragraphOffset = mergedDocument.paragraphs?.length ?? 0;
|
|
166
|
+
const tableOffset = mergedDocument.tables?.length ?? 0;
|
|
167
|
+
const figureOffset = mergedDocument.figures?.length ?? 0;
|
|
168
|
+
|
|
169
|
+
// merge text content
|
|
170
|
+
if (layout.content) {
|
|
171
|
+
mergedDocument.content += layout.content;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// offset pages
|
|
175
|
+
if (layout.pages) {
|
|
176
|
+
layout.pages.forEach((page) => {
|
|
177
|
+
if (page.pageNumber !== undefined) {
|
|
178
|
+
page.pageNumber += pageOffset;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
mergedDocument.pages?.push(...layout.pages);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// merge section elements - need to offset the indices
|
|
185
|
+
for (const section of layout.sections ?? []) {
|
|
186
|
+
section.elements = section.elements?.map((e) => {
|
|
187
|
+
const { kind, index } = parseAzureElementPath(e);
|
|
188
|
+
if (!kind) {
|
|
189
|
+
throw new Error(`Invalid element path: ${e}`);
|
|
190
|
+
}
|
|
191
|
+
switch (kind) {
|
|
192
|
+
case "sections": {
|
|
193
|
+
return `/${kind}/${index + sectionOffset}`;
|
|
194
|
+
}
|
|
195
|
+
case "paragraphs": {
|
|
196
|
+
return `/${kind}/${index + paragraphOffset}`;
|
|
197
|
+
}
|
|
198
|
+
case "tables": {
|
|
199
|
+
return `/${kind}/${index + tableOffset}`;
|
|
200
|
+
}
|
|
201
|
+
case "figures": {
|
|
202
|
+
return `/${kind}/${index + figureOffset}`;
|
|
203
|
+
}
|
|
204
|
+
default: {
|
|
205
|
+
throw new Error(`Unrecognized element kind: ${kind}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
mergedDocument.sections?.push(section);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// offset paragraph page numbers
|
|
213
|
+
if (layout.paragraphs) {
|
|
214
|
+
layout.paragraphs.forEach((paragraph) =>
|
|
215
|
+
offsetBoundingRegions(paragraph, pageOffset),
|
|
216
|
+
);
|
|
217
|
+
mergedDocument.paragraphs?.push(...layout.paragraphs);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// offset table page numbers
|
|
221
|
+
if (layout.tables) {
|
|
222
|
+
layout.tables.forEach((table) => offsetTablePages(table, pageOffset));
|
|
223
|
+
mergedDocument.tables?.push(...layout.tables);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// offset table page numbers
|
|
227
|
+
if (layout.figures) {
|
|
228
|
+
layout.figures.forEach((figure) =>
|
|
229
|
+
offsetBoundingRegions(figure, pageOffset),
|
|
230
|
+
);
|
|
231
|
+
mergedDocument.figures?.push(...layout.figures);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// TODO: do proper offset of documents, for now not used
|
|
235
|
+
// if (layout.documents) {
|
|
236
|
+
// layout.documents.forEach((doc) =>
|
|
237
|
+
// offsetDocumentPages(doc, pageOffset),
|
|
238
|
+
// );
|
|
239
|
+
// mergedDocument.documents?.push(...layout.documents);
|
|
240
|
+
// }
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return mergedDocument;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Offsets all pageNumbers in boundingRegions by the given offset.
|
|
248
|
+
*/
|
|
249
|
+
function offsetBoundingRegions(
|
|
250
|
+
item: { boundingRegions?: Array<{ pageNumber?: number }> },
|
|
251
|
+
pageOffset: number,
|
|
252
|
+
) {
|
|
253
|
+
item.boundingRegions?.forEach((region) => {
|
|
254
|
+
if (region.pageNumber !== undefined) {
|
|
255
|
+
region.pageNumber += pageOffset;
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Offsets pageNumbers in a table and all its cells.
|
|
262
|
+
*/
|
|
263
|
+
function offsetTablePages(table: AzureTable, pageOffset: number) {
|
|
264
|
+
offsetBoundingRegions(table, pageOffset);
|
|
265
|
+
table.cells?.forEach((cell) => offsetBoundingRegions(cell, pageOffset));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Transforms Azure document results into a hierarchical DocumentLayout structure.
|
|
270
|
+
*
|
|
271
|
+
* Azure documents can have explicit sections or just paragraphs/tables. This method
|
|
272
|
+
* handles both cases, maintaining document order and properly nesting content within
|
|
273
|
+
* sections when available. All elements are registered in the reference map.
|
|
274
|
+
*
|
|
275
|
+
* @param result - Azure document extraction result
|
|
276
|
+
* @returns DocumentLayout with sections, paragraphs, tables, headers, and footers
|
|
277
|
+
*/
|
|
278
|
+
export function serializeLayoutAzure(
|
|
279
|
+
result: AzureDocumentResult,
|
|
280
|
+
): DocumentLayout {
|
|
281
|
+
const currentLayout = new DocumentLayout([], {}, {});
|
|
282
|
+
const parsedSections: Set<string> = new Set();
|
|
283
|
+
for (const [index, section] of result.sections?.entries() ?? []) {
|
|
284
|
+
if (parsedSections.has(`/sections/${index}`)) continue;
|
|
285
|
+
const parsedSection = parseAzureSection(
|
|
286
|
+
section,
|
|
287
|
+
currentLayout.documentLayout,
|
|
288
|
+
result,
|
|
289
|
+
parsedSections,
|
|
290
|
+
currentLayout.referenceMap,
|
|
291
|
+
result.pages,
|
|
292
|
+
);
|
|
293
|
+
currentLayout.documentLayout.push(parsedSection);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// TODO: parse elements that are not in a section
|
|
297
|
+
|
|
298
|
+
return currentLayout;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Converts an Azure section into a structured Section object.
|
|
303
|
+
*
|
|
304
|
+
* Azure sections reference their content via element paths (e.g., "/paragraphs/0").
|
|
305
|
+
* This method resolves those references, identifies the section title (first element
|
|
306
|
+
* with title/heading role), and parses all remaining paragraphs and tables into the
|
|
307
|
+
* section's content.
|
|
308
|
+
*
|
|
309
|
+
* @param section - Azure section object with element references
|
|
310
|
+
* @param sectionIndex - Index of this section in the document
|
|
311
|
+
* @param doc - Full Azure document result for resolving references
|
|
312
|
+
* @param referenceMap - Map to register element locations
|
|
313
|
+
* @param pages - Page information for normalizing coordinates
|
|
314
|
+
* @returns Structured Section object, or null if the section has no valid elements
|
|
315
|
+
*
|
|
316
|
+
* @private
|
|
317
|
+
*/
|
|
318
|
+
function parseAzureSection(
|
|
319
|
+
section: AzureSection,
|
|
320
|
+
container: Section | LayoutItemType[],
|
|
321
|
+
doc: AzureDocumentResult,
|
|
322
|
+
parsedSections: Set<string>,
|
|
323
|
+
referenceMap: ReferenceMap,
|
|
324
|
+
pages?: Array<PageInfo>,
|
|
325
|
+
): Section {
|
|
326
|
+
const parent: { id: string; itemCount: number } = { id: "", itemCount: 0 };
|
|
327
|
+
if (container instanceof Section) {
|
|
328
|
+
parent.id = container.id;
|
|
329
|
+
parent.itemCount = container.content.filter(
|
|
330
|
+
(item) => item instanceof Section,
|
|
331
|
+
).length;
|
|
332
|
+
} else {
|
|
333
|
+
parent.itemCount = container.filter(
|
|
334
|
+
(item) => item instanceof Section,
|
|
335
|
+
).length;
|
|
336
|
+
}
|
|
337
|
+
const sectionId = `${parent.id}/s${parent.itemCount}`;
|
|
338
|
+
const currentSection = new Section(
|
|
339
|
+
sectionId,
|
|
340
|
+
[],
|
|
341
|
+
new Header(`${sectionId}/h`, []),
|
|
342
|
+
new Footer(`${sectionId}/f`, []),
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
// parse section elements
|
|
346
|
+
for (const elementPath of section.elements ?? []) {
|
|
347
|
+
const { kind, index } = parseAzureElementPath(elementPath);
|
|
348
|
+
if (!kind) {
|
|
349
|
+
console.warn("Invalid element path: ", elementPath);
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
switch (kind) {
|
|
353
|
+
case "sections": {
|
|
354
|
+
// mark section as parsed to avoid double counting nested sections
|
|
355
|
+
const subSection = doc.sections?.[index];
|
|
356
|
+
if (subSection) {
|
|
357
|
+
currentSection.content.push(
|
|
358
|
+
parseAzureSection(
|
|
359
|
+
subSection,
|
|
360
|
+
currentSection,
|
|
361
|
+
doc,
|
|
362
|
+
parsedSections,
|
|
363
|
+
referenceMap,
|
|
364
|
+
pages,
|
|
365
|
+
),
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
parsedSections.add(elementPath);
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
case "paragraphs": {
|
|
372
|
+
const paragraph = doc.paragraphs?.[index];
|
|
373
|
+
if (paragraph) {
|
|
374
|
+
const { location, item } = parseAzureParagraph(
|
|
375
|
+
paragraph,
|
|
376
|
+
index,
|
|
377
|
+
currentSection,
|
|
378
|
+
referenceMap,
|
|
379
|
+
pages,
|
|
380
|
+
);
|
|
381
|
+
switch (location) {
|
|
382
|
+
case "header":
|
|
383
|
+
currentSection.header.content.push(item);
|
|
384
|
+
break;
|
|
385
|
+
case "footer":
|
|
386
|
+
currentSection.footer.content.push(item);
|
|
387
|
+
break;
|
|
388
|
+
case "content":
|
|
389
|
+
currentSection.content.push(item);
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
case "tables": {
|
|
396
|
+
const table = doc.tables?.[index];
|
|
397
|
+
if (table) {
|
|
398
|
+
currentSection.content.push(
|
|
399
|
+
parseAzureTable(table, index, currentSection, referenceMap, pages),
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
case "figures": {
|
|
405
|
+
console.log("Found figure: ", elementPath);
|
|
406
|
+
// TODO: implement figure parsing
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
default:
|
|
410
|
+
console.warn("Invalid element kind: ", kind);
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
return currentSection;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Converts an Azure paragraph into a structured content element.
|
|
420
|
+
*
|
|
421
|
+
* Azure paragraphs have roles (pageHeader, pageFooter, or regular content) that
|
|
422
|
+
* determine the return type. This method creates the appropriate element type,
|
|
423
|
+
* registers it in the reference map with bounding regions, and assigns a unique ID.
|
|
424
|
+
*
|
|
425
|
+
* @param paragraph - Azure paragraph object
|
|
426
|
+
* @param index - Index of this paragraph in the document
|
|
427
|
+
* @param referenceMap - Map to register paragraph location
|
|
428
|
+
* @param pages - Page information for normalizing coordinates
|
|
429
|
+
* @returns Paragraph, PageHeader, or PageFooter based on the role
|
|
430
|
+
*
|
|
431
|
+
* @private
|
|
432
|
+
*/
|
|
433
|
+
function parseAzureParagraph(
|
|
434
|
+
paragraph: AzureParagraph,
|
|
435
|
+
paragraphIndex: number,
|
|
436
|
+
parentSection: Section,
|
|
437
|
+
referenceMap: ReferenceMap,
|
|
438
|
+
pages?: Array<PageInfo>,
|
|
439
|
+
): { location: "header" | "footer" | "content"; item: Paragraph | Heading } {
|
|
440
|
+
const { role, content } = paragraph;
|
|
441
|
+
const depth = parentSection.id.split("/").length - 1;
|
|
442
|
+
switch (role) {
|
|
443
|
+
case "title":
|
|
444
|
+
case "sectionHeading": {
|
|
445
|
+
const headingId = `${parentSection.id}/h/h${paragraphIndex}`;
|
|
446
|
+
addItemToReferenceMap(paragraph, headingId, referenceMap, pages);
|
|
447
|
+
return {
|
|
448
|
+
location: "header",
|
|
449
|
+
item: new Heading(headingId, depth as 1 | 2 | 3 | 4 | 5, content),
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
case "pageHeader": {
|
|
453
|
+
const headingId = `${parentSection.id}/h/p${paragraphIndex}`;
|
|
454
|
+
addItemToReferenceMap(paragraph, headingId, referenceMap, pages);
|
|
455
|
+
return {
|
|
456
|
+
location: "header",
|
|
457
|
+
item: new Heading(headingId, 1, content),
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
case "pageFooter": {
|
|
461
|
+
const paragraphId = `${parentSection.id}/f/p${paragraphIndex}`;
|
|
462
|
+
addItemToReferenceMap(paragraph, paragraphId, referenceMap, pages);
|
|
463
|
+
return {
|
|
464
|
+
location: "footer",
|
|
465
|
+
item: new Paragraph(paragraphId, content),
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
default: {
|
|
469
|
+
const paragraphId = `${parentSection.id}/p${paragraphIndex}`;
|
|
470
|
+
addItemToReferenceMap(paragraph, paragraphId, referenceMap, pages);
|
|
471
|
+
return {
|
|
472
|
+
location: "content",
|
|
473
|
+
item: new Paragraph(paragraphId, content),
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Converts an Azure table into the standardized Table structure.
|
|
481
|
+
*
|
|
482
|
+
* Azure tables provide cells with row/column indices that need to be grouped into rows.
|
|
483
|
+
* This method organizes cells by row, identifies header rows (containing columnHeader cells),
|
|
484
|
+
* and creates structured Row objects. All cells are registered in the reference map.
|
|
485
|
+
*
|
|
486
|
+
* @param table - Azure table object with cells
|
|
487
|
+
* @param index - Index of this table in the document
|
|
488
|
+
* @param referenceMap - Map to register cell locations
|
|
489
|
+
* @param pages - Page information for normalizing coordinates
|
|
490
|
+
* @returns Structured Table object with properly typed rows
|
|
491
|
+
*
|
|
492
|
+
* @private
|
|
493
|
+
*/
|
|
494
|
+
function parseAzureTable(
|
|
495
|
+
table: AzureTable,
|
|
496
|
+
tableIndex: number,
|
|
497
|
+
parentSection: Section,
|
|
498
|
+
referenceMap: ReferenceMap,
|
|
499
|
+
pages?: Array<PageInfo>,
|
|
500
|
+
): Table {
|
|
501
|
+
const rowMap: Map<number, AzureTableCell[]> = new Map();
|
|
502
|
+
for (const cell of table.cells) {
|
|
503
|
+
if (!rowMap.has(cell.rowIndex)) {
|
|
504
|
+
rowMap.set(cell.rowIndex, []);
|
|
505
|
+
}
|
|
506
|
+
rowMap.get(cell.rowIndex)!.push(cell);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// convert to rows
|
|
510
|
+
const rows: Row[] = [];
|
|
511
|
+
const sortedRowIndices = Array.from(rowMap.keys()).sort();
|
|
512
|
+
const tableId = `${parentSection.id}/t${tableIndex}`;
|
|
513
|
+
for (const rowIndex of sortedRowIndices) {
|
|
514
|
+
const cells = rowMap.get(rowIndex) ?? [];
|
|
515
|
+
cells.sort((a, b) => a.columnIndex - b.columnIndex);
|
|
516
|
+
|
|
517
|
+
const rowType = cells.some((c) => c.kind === "columnHeader")
|
|
518
|
+
? "head"
|
|
519
|
+
: "body";
|
|
520
|
+
const row = new Row(rowType, []);
|
|
521
|
+
for (const cell of cells) {
|
|
522
|
+
const cellId = `${tableId}/${cell.rowIndex}/${cell.columnIndex}`;
|
|
523
|
+
addItemToReferenceMap(cell, cellId, referenceMap, pages);
|
|
524
|
+
row.cells.push(
|
|
525
|
+
new Cell(cellId, cell.content ?? "", cell.columnSpan, cell.rowSpan),
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
rows.push(row);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return new Table(tableId, rows);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
function addItemToReferenceMap(
|
|
535
|
+
item: AzureParagraph | AzureTableCell,
|
|
536
|
+
itemId: string,
|
|
537
|
+
referenceMap: ReferenceMap,
|
|
538
|
+
pages?: Array<PageInfo>,
|
|
539
|
+
) {
|
|
540
|
+
if (!pages) {
|
|
541
|
+
console.warn(
|
|
542
|
+
"No pages provided for item: ",
|
|
543
|
+
itemId,
|
|
544
|
+
", unable to add to reference map",
|
|
545
|
+
);
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
if (!item.boundingRegions) {
|
|
549
|
+
console.warn("No bounding regions for item: ", itemId);
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
referenceMap[itemId] = {
|
|
553
|
+
text: item.content ?? "",
|
|
554
|
+
boundingRegions: item.boundingRegions.map((r) => ({
|
|
555
|
+
pageNumber: r.pageNumber,
|
|
556
|
+
polygon: normalizePolygon(r.polygon as Polygon, r.pageNumber, pages),
|
|
557
|
+
})),
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Normalizes Azure polygon coordinates to 0-1 range.
|
|
563
|
+
* Azure returns coordinates in inches (for PDFs) or pixels (for images).
|
|
564
|
+
* We need to normalize them by dividing by page width/height.
|
|
565
|
+
*/
|
|
566
|
+
function normalizePolygon(
|
|
567
|
+
polygon: number[],
|
|
568
|
+
pageNumber: number,
|
|
569
|
+
pages?: Array<PageInfo>,
|
|
570
|
+
): Polygon {
|
|
571
|
+
if (!pages) {
|
|
572
|
+
throw new Error("Missing page metadata for polygon normalization");
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
const page = pages.find((p) => p.pageNumber === pageNumber);
|
|
576
|
+
if (!page?.width || !page?.height) {
|
|
577
|
+
return polygon as Polygon;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Normalize coordinates to 0-1 range
|
|
581
|
+
const normalized: number[] = [];
|
|
582
|
+
for (const [i, coord] of polygon.entries()) {
|
|
583
|
+
const scaleBy = i % 2 === 0 ? page.width : page.height;
|
|
584
|
+
normalized.push(coord / scaleBy);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
return normalized as Polygon;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
function parseAzureElementPath(elementPath: string): {
|
|
591
|
+
kind: string | null;
|
|
592
|
+
index: number;
|
|
593
|
+
} {
|
|
594
|
+
const [_, kind, indexStr] = elementPath.split("/");
|
|
595
|
+
if (!indexStr || !kind) {
|
|
596
|
+
console.warn(
|
|
597
|
+
"Invalid element path: ",
|
|
598
|
+
elementPath,
|
|
599
|
+
", returning dummy path",
|
|
600
|
+
);
|
|
601
|
+
return { kind: null, index: 0 };
|
|
602
|
+
}
|
|
603
|
+
return { kind, index: parseInt(indexStr) };
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Transforms Azure-specific extraction output into a standardized entity format.
|
|
608
|
+
*/
|
|
609
|
+
export function serializePretrainedLayoutAzure(content: AzureDocumentResult): {
|
|
610
|
+
entities: Record<string, PretrainedEntity>;
|
|
611
|
+
} {
|
|
612
|
+
const entities: Record<string, PretrainedEntity> = {};
|
|
613
|
+
if (content.documents && Array.isArray(content.documents)) {
|
|
614
|
+
for (const document of content.documents) {
|
|
615
|
+
if (document.fields) {
|
|
616
|
+
for (const [fieldName, fieldValue] of Object.entries(document.fields)) {
|
|
617
|
+
const convertedEntity = convertAzureFieldValueToEntity(
|
|
618
|
+
fieldName,
|
|
619
|
+
fieldValue,
|
|
620
|
+
content.pages,
|
|
621
|
+
);
|
|
622
|
+
|
|
623
|
+
// If an entity with this name already exists, convert to array or append to existing array
|
|
624
|
+
if (entities[fieldName]) {
|
|
625
|
+
const existing = entities[fieldName];
|
|
626
|
+
if (existing.type === "array") {
|
|
627
|
+
existing.valueArray = existing.valueArray || [];
|
|
628
|
+
existing.valueArray.push(convertedEntity);
|
|
629
|
+
} else {
|
|
630
|
+
// Convert to array
|
|
631
|
+
entities[fieldName] = {
|
|
632
|
+
id: "dummy",
|
|
633
|
+
type: "array",
|
|
634
|
+
valueArray: [existing, convertedEntity],
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
} else {
|
|
638
|
+
entities[fieldName] = convertedEntity;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
return { entities };
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Converts an Azure field value into the standardized PretrainedEntity format.
|
|
650
|
+
*
|
|
651
|
+
* Azure's field structure already includes typed values, so this method primarily
|
|
652
|
+
* maps Azure types to our standardized types and handles nested structures (arrays
|
|
653
|
+
* and objects). It preserves confidence scores and bounding regions.
|
|
654
|
+
*
|
|
655
|
+
* @param fieldName - Name of the field being converted
|
|
656
|
+
* @param fieldValue - Azure field output from Document Intelligence
|
|
657
|
+
* @param pages - Page information for normalizing coordinates
|
|
658
|
+
* @returns Standardized PretrainedEntity with typed values
|
|
659
|
+
*
|
|
660
|
+
* @private
|
|
661
|
+
*/
|
|
662
|
+
function convertAzureFieldValueToEntity(
|
|
663
|
+
fieldName: string,
|
|
664
|
+
fieldValue: AzureFieldOutput,
|
|
665
|
+
pages?: Array<{ pageNumber?: number; width?: number; height?: number }>,
|
|
666
|
+
): PretrainedEntity {
|
|
667
|
+
const entity: PretrainedEntity = {
|
|
668
|
+
id: "dummy",
|
|
669
|
+
type: fieldValue.type as EntityType,
|
|
670
|
+
content: fieldValue.content ?? "",
|
|
671
|
+
confidence: fieldValue.confidence ?? 0,
|
|
672
|
+
boundingRegions:
|
|
673
|
+
fieldValue.boundingRegions?.map((r) => ({
|
|
674
|
+
pageNumber: r.pageNumber || 0,
|
|
675
|
+
polygon: normalizePolygon(
|
|
676
|
+
r.polygon as number[],
|
|
677
|
+
r.pageNumber || 0,
|
|
678
|
+
pages,
|
|
679
|
+
),
|
|
680
|
+
})) ?? [],
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
switch (fieldValue.type) {
|
|
684
|
+
case "array":
|
|
685
|
+
entity.valueArray = [];
|
|
686
|
+
if (fieldValue.valueArray) {
|
|
687
|
+
for (const arrayItem of fieldValue.valueArray) {
|
|
688
|
+
entity.valueArray.push(
|
|
689
|
+
convertAzureFieldValueToEntity(fieldName, arrayItem, pages),
|
|
690
|
+
);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
break;
|
|
694
|
+
case "object":
|
|
695
|
+
if (!fieldValue.valueObject) {
|
|
696
|
+
console.warn("Object value is required");
|
|
697
|
+
return entity;
|
|
698
|
+
}
|
|
699
|
+
entity.valueObject = {};
|
|
700
|
+
for (const [key, value] of Object.entries(fieldValue.valueObject)) {
|
|
701
|
+
entity.valueObject[key] = convertAzureFieldValueToEntity(
|
|
702
|
+
key,
|
|
703
|
+
value,
|
|
704
|
+
pages,
|
|
705
|
+
);
|
|
706
|
+
}
|
|
707
|
+
break;
|
|
708
|
+
case "date":
|
|
709
|
+
if (fieldValue.valueDate) {
|
|
710
|
+
entity.valueDate = fieldValue.valueDate;
|
|
711
|
+
}
|
|
712
|
+
break;
|
|
713
|
+
case "number":
|
|
714
|
+
if (fieldValue.valueNumber !== undefined) {
|
|
715
|
+
entity.valueNumber = fieldValue.valueNumber;
|
|
716
|
+
}
|
|
717
|
+
break;
|
|
718
|
+
case "string":
|
|
719
|
+
if (fieldValue.valueString) {
|
|
720
|
+
entity.valueString = fieldValue.valueString;
|
|
721
|
+
}
|
|
722
|
+
break;
|
|
723
|
+
case "boolean":
|
|
724
|
+
if (fieldValue.valueBoolean !== undefined) {
|
|
725
|
+
entity.valueBoolean = fieldValue.valueBoolean;
|
|
726
|
+
}
|
|
727
|
+
break;
|
|
728
|
+
}
|
|
729
|
+
return entity;
|
|
730
|
+
}
|