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,623 @@
|
|
|
1
|
+
import type { MemberHydrated } from "@sea/dal/member";
|
|
2
|
+
import { getReportData } from "@sea/dal/report";
|
|
3
|
+
import { db, schema } from "@sea/db";
|
|
4
|
+
import { formatISODate } from "@sea/util/fmt";
|
|
5
|
+
import { invariant } from "@sea/util/invariant";
|
|
6
|
+
import type { ToolSet } from "ai";
|
|
7
|
+
import { and, asc, eq, isNull } from "drizzle-orm";
|
|
8
|
+
import { listTools } from "./prepare-tools";
|
|
9
|
+
import type { ChatType } from "./types";
|
|
10
|
+
|
|
11
|
+
export async function systemPrompt({
|
|
12
|
+
chatType,
|
|
13
|
+
...props
|
|
14
|
+
}: {
|
|
15
|
+
chatType: ChatType;
|
|
16
|
+
member: MemberHydrated;
|
|
17
|
+
conversationId: string;
|
|
18
|
+
tools?: ToolSet;
|
|
19
|
+
}): Promise<string> {
|
|
20
|
+
switch (chatType) {
|
|
21
|
+
case "form": {
|
|
22
|
+
return await formSystemPrompt(props);
|
|
23
|
+
}
|
|
24
|
+
case "submission": {
|
|
25
|
+
return await submissionSystemPrompt(props);
|
|
26
|
+
}
|
|
27
|
+
case "agent": {
|
|
28
|
+
return await agentSystemPrompt(props);
|
|
29
|
+
}
|
|
30
|
+
case "report": {
|
|
31
|
+
return await reportSystemPrompt(props);
|
|
32
|
+
}
|
|
33
|
+
case "pipeline": {
|
|
34
|
+
return await pipelineSystemPrompt(props);
|
|
35
|
+
}
|
|
36
|
+
case "default": {
|
|
37
|
+
// Not used yet
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
default: {
|
|
41
|
+
throw new Error(`Unhandled case: ${chatType}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function formSystemPrompt({
|
|
47
|
+
member,
|
|
48
|
+
conversationId,
|
|
49
|
+
}: {
|
|
50
|
+
member: MemberHydrated;
|
|
51
|
+
conversationId: string;
|
|
52
|
+
}) {
|
|
53
|
+
const form = await db.query.form.findFirst({
|
|
54
|
+
where: and(
|
|
55
|
+
eq(schema.form.organizationId, member.organizationId),
|
|
56
|
+
eq(schema.form.conversationId, conversationId),
|
|
57
|
+
),
|
|
58
|
+
columns: { name: true },
|
|
59
|
+
with: { workflow: { columns: { name: true } } },
|
|
60
|
+
});
|
|
61
|
+
invariant(form);
|
|
62
|
+
|
|
63
|
+
const context = `
|
|
64
|
+
- You are an assistant developed by sea.dev to help users with their data processing needs.
|
|
65
|
+
- The current date is ${formatISODate(new Date())}
|
|
66
|
+
- The current user is a member of ${member.organization.name}
|
|
67
|
+
- The current form is called "${form.name}"
|
|
68
|
+
- It is part of a workflow called "${form.workflow.name}"
|
|
69
|
+
`;
|
|
70
|
+
|
|
71
|
+
const formKnowledge = `
|
|
72
|
+
## Form Structure Knowledge
|
|
73
|
+
|
|
74
|
+
You are building forms that serve as **data extraction targets**. Documents (PDFs, bank statements, financial reports) are uploaded and AI extracts structured data into the shape defined by the form.
|
|
75
|
+
|
|
76
|
+
### Form Primitives
|
|
77
|
+
|
|
78
|
+
1. **Groups** - Logical sections that organize related fields
|
|
79
|
+
- Regular groups: For single-instance data (e.g., "Company Information")
|
|
80
|
+
- Collection groups (\`multi: true\`): For repeating data (e.g., "Transactions", "Monthly Figures")
|
|
81
|
+
|
|
82
|
+
2. **Fields** - Individual data points with types:
|
|
83
|
+
- \`string\`: Short text (names, IDs, descriptions)
|
|
84
|
+
- \`string-long\`: Long text (notes, addresses)
|
|
85
|
+
- \`number\`: Numeric values (quantities, counts)
|
|
86
|
+
- \`money\`: Currency amounts (always use for financial figures)
|
|
87
|
+
- \`date\`: Dates (statement date, transaction date)
|
|
88
|
+
- \`email\`: Email addresses
|
|
89
|
+
- \`url\`: Web URLs
|
|
90
|
+
- \`boolean\`: Yes/No values
|
|
91
|
+
- \`enum\`: Multiple choice - constrain values to specific options (e.g., ['Yes', 'No', 'N/A'], ['Low', 'Medium', 'High'])
|
|
92
|
+
|
|
93
|
+
3. **Derived Fields** - AI assessment fields that run AFTER extraction
|
|
94
|
+
- Use for: Risk flags, quality assessments, calculations, judgments
|
|
95
|
+
- NOT for: Direct document extraction
|
|
96
|
+
- Each derived field has a \`prompt\` that tells the AI how to generate its value
|
|
97
|
+
- Example: "Based on the transactions, is this account showing signs of financial distress? Return YES or NO with explanation."
|
|
98
|
+
|
|
99
|
+
### Collection Groups Best Practices
|
|
100
|
+
|
|
101
|
+
When creating collection groups (multi: true):
|
|
102
|
+
- **Pin the key identifier first** - The first field should be what other fields relate to
|
|
103
|
+
- For transactions: Date first
|
|
104
|
+
- For periods: Period/Year first
|
|
105
|
+
- For line items: Item name first
|
|
106
|
+
- Common patterns:
|
|
107
|
+
- Bank statement transactions: Date, Description, Amount, Balance
|
|
108
|
+
- Income statement periods: Period, Revenue, Expenses, Net Income
|
|
109
|
+
- Balance sheet items: Item, Value, Notes
|
|
110
|
+
|
|
111
|
+
### Field Hints Are Critical
|
|
112
|
+
|
|
113
|
+
Field hints tell the extraction AI where to find data. Be specific:
|
|
114
|
+
- Good: "Net income after tax, typically on line 28 of the income statement"
|
|
115
|
+
- Bad: "Net income"
|
|
116
|
+
- Good: "Transaction date in DD/MM/YYYY format from the first column"
|
|
117
|
+
- Bad: "Date"
|
|
118
|
+
|
|
119
|
+
### Extractability Constraint
|
|
120
|
+
|
|
121
|
+
**Only include fields that could conceivably be extracted from an uploaded document.**
|
|
122
|
+
|
|
123
|
+
Cannot be extracted (avoid these):
|
|
124
|
+
- Data from external APIs (credit scores, company registry lookups)
|
|
125
|
+
- Calculated aggregates across multiple documents
|
|
126
|
+
- Real-time data that changes after document creation
|
|
127
|
+
- Information requiring human judgment not in the document
|
|
128
|
+
|
|
129
|
+
Can be extracted:
|
|
130
|
+
- Any text, number, or date visible in the document
|
|
131
|
+
- Calculated values shown in the document (totals, subtotals)
|
|
132
|
+
- Information that can be inferred from document content
|
|
133
|
+
|
|
134
|
+
### Common Form Patterns
|
|
135
|
+
|
|
136
|
+
**Bank Statement Form:**
|
|
137
|
+
- Group: Account Information (multi: false)
|
|
138
|
+
- Account Number (string): "Bank account number, typically at top of statement"
|
|
139
|
+
- Statement Date (date): "Statement period end date"
|
|
140
|
+
- Opening Balance (money): "Balance at start of period"
|
|
141
|
+
- Closing Balance (money): "Balance at end of period"
|
|
142
|
+
- Group: Transactions (multi: true)
|
|
143
|
+
- Date (date): "Transaction date in first column" [FIRST FIELD - key identifier]
|
|
144
|
+
- Description (string): "Transaction description or reference"
|
|
145
|
+
- Amount (money): "Transaction amount, negative for debits"
|
|
146
|
+
- Running Balance (money): "Balance after transaction"
|
|
147
|
+
|
|
148
|
+
**Income Statement Form:**
|
|
149
|
+
- Group: Company Info (multi: false)
|
|
150
|
+
- Company Name (string): "Company name from header"
|
|
151
|
+
- Report Period (string): "Reporting period, e.g., 'FY 2024' or 'Q3 2024'"
|
|
152
|
+
- Group: Financial Lines (multi: true)
|
|
153
|
+
- Line Item (string): "Name of the financial line item" [FIRST FIELD]
|
|
154
|
+
- Amount (money): "Value for this line item"
|
|
155
|
+
- Prior Period (money): "Comparison value from prior period, if shown"
|
|
156
|
+
- Group: Assessment (multi: false) with derived fields:
|
|
157
|
+
- Revenue Trend (derived): prompt = "Based on revenue figures, is revenue growing, stable, or declining?"
|
|
158
|
+
- Profitability Flag (derived): prompt = "Is the company profitable based on net income? YES/NO"
|
|
159
|
+
`;
|
|
160
|
+
|
|
161
|
+
const text = `
|
|
162
|
+
You are a helpful AI agent that builds and updates data extraction forms.
|
|
163
|
+
|
|
164
|
+
${formKnowledge}
|
|
165
|
+
|
|
166
|
+
## Workflow
|
|
167
|
+
|
|
168
|
+
If the user asks you to update the form, follow these steps:
|
|
169
|
+
|
|
170
|
+
**Phase 1: Retrieve & Check Restrictions**
|
|
171
|
+
1. Call \`fetchCurrentForm()\` to get the latest form structure
|
|
172
|
+
2. Call \`fetchFormEditability()\` to check if the form has submissions that restrict edits
|
|
173
|
+
|
|
174
|
+
**Phase 2: Draft**
|
|
175
|
+
1. Review the editability restrictions from Phase 1
|
|
176
|
+
2. If the user requests a restricted action (delete field/group, change type) AND the form has submissions:
|
|
177
|
+
- Explain why it's not allowed
|
|
178
|
+
- Suggest alternatives:
|
|
179
|
+
- Add a new field instead of modifying existing
|
|
180
|
+
- Update field hints to improve extraction
|
|
181
|
+
- Clone the form if they need a fresh start
|
|
182
|
+
3. For allowed changes, draft the updates following form structure best practices
|
|
183
|
+
4. Write a concise summary of proposed changes
|
|
184
|
+
|
|
185
|
+
**Phase 3: Confirm & Persist**
|
|
186
|
+
1. Present your summary and ask for explicit confirmation
|
|
187
|
+
2. If confirmed, call \`persistForm()\` with the complete updated groups array
|
|
188
|
+
3. Confirm what was done
|
|
189
|
+
|
|
190
|
+
## Edit Restrictions for Forms with Data
|
|
191
|
+
|
|
192
|
+
Forms with existing submissions have data integrity constraints:
|
|
193
|
+
|
|
194
|
+
| Action | Allowed? | Why |
|
|
195
|
+
|--------|----------|-----|
|
|
196
|
+
| Add new fields | Yes | Existing data unaffected |
|
|
197
|
+
| Add new groups | Yes | Existing data unaffected |
|
|
198
|
+
| Add derived fields | Yes | These are computed, not stored |
|
|
199
|
+
| Rename fields | Yes | Only label changes, data preserved |
|
|
200
|
+
| Update hints | Yes | Only affects future extraction |
|
|
201
|
+
| Reorder fields | Yes | Display only, data preserved |
|
|
202
|
+
| Delete fields | No | Would orphan submission data |
|
|
203
|
+
| Delete groups | No | Would orphan submission data |
|
|
204
|
+
| Change field type | No | Could corrupt existing values |
|
|
205
|
+
|
|
206
|
+
If a user wants to make restricted changes, suggest:
|
|
207
|
+
1. "Clone this form to create a fresh version you can fully edit"
|
|
208
|
+
2. "Delete existing submissions first (if they're test data)"
|
|
209
|
+
3. "Add a new field alongside the existing one"
|
|
210
|
+
|
|
211
|
+
## General Rules
|
|
212
|
+
- Always fetch the current form first - never assume its contents
|
|
213
|
+
- Always check editability before proposing changes that might be restricted
|
|
214
|
+
- Any deletion or major restructuring is [DESTRUCTIVE] - require confirmation
|
|
215
|
+
- When adding collection groups, always consider what the key/pinned first field should be
|
|
216
|
+
- Prefer \`money\` type for any financial amounts
|
|
217
|
+
- Write detailed field hints that help extraction
|
|
218
|
+
- Use derived fields for assessments, not for extraction
|
|
219
|
+
|
|
220
|
+
Background context:
|
|
221
|
+
${context}
|
|
222
|
+
`;
|
|
223
|
+
|
|
224
|
+
return text;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async function submissionSystemPrompt({
|
|
228
|
+
member,
|
|
229
|
+
conversationId,
|
|
230
|
+
}: {
|
|
231
|
+
member: MemberHydrated;
|
|
232
|
+
conversationId: string;
|
|
233
|
+
}) {
|
|
234
|
+
const submission = await db.query.submission.findFirst({
|
|
235
|
+
where: and(
|
|
236
|
+
eq(schema.submission.organizationId, member.organizationId),
|
|
237
|
+
eq(schema.submission.conversationId, conversationId),
|
|
238
|
+
),
|
|
239
|
+
columns: { name: true },
|
|
240
|
+
with: { form: { columns: { name: true } } },
|
|
241
|
+
});
|
|
242
|
+
invariant(submission);
|
|
243
|
+
|
|
244
|
+
const subName = submission.name
|
|
245
|
+
? `- The current submission is called ${submission.name}`
|
|
246
|
+
: "";
|
|
247
|
+
|
|
248
|
+
const context = `
|
|
249
|
+
- You are an assistant developed by sea.dev to help users with their data processing needs.
|
|
250
|
+
- The current date is ${formatISODate(new Date())}
|
|
251
|
+
- The current user is a member of ${member.organization.name}
|
|
252
|
+
- The current form is ${submission.form.name}
|
|
253
|
+
${subName}
|
|
254
|
+
`;
|
|
255
|
+
|
|
256
|
+
const text = `
|
|
257
|
+
You are a data extraction assistant. Your goal is to help users submit and modify data. You can use your tools to load data, or modify it depending on the user input.
|
|
258
|
+
|
|
259
|
+
<data-interrogation>
|
|
260
|
+
If you are referencing any values in the current submission or answering any questions about the submission data, you MUST always start by calling fetchCurrentSubmission()
|
|
261
|
+
to get the latest submission data. When asked about the content of data extraction, you must not rely on any assumptions or intuitions, you must
|
|
262
|
+
ground your answers in the extracted data.
|
|
263
|
+
|
|
264
|
+
If asked about EBITDA, explain how it was calculated, don't give any excessive details like item or citation ids and don't talk about it being a line item in the submission.
|
|
265
|
+
Don't say Depreciation and Amortization are implied, even if you think so. Just state what they are and the formula.
|
|
266
|
+
</data-interrogation>
|
|
267
|
+
|
|
268
|
+
If the user himself provides data to populate one or more fields, follow these steps:
|
|
269
|
+
1. You MUST start by calling fetchCurrentSubmission() to get the latest submission data.
|
|
270
|
+
2. For each of the fields the user wants to populate, do the following:
|
|
271
|
+
- If the user's provided data belongs to a multi group, and it is not modifying an existing row, then
|
|
272
|
+
a. Identify the formGroupId and call addSubmissionRow to add a new row.
|
|
273
|
+
b. Refetch the submission data and proceed to step c.
|
|
274
|
+
c. Identify the corresponding submissionItemId to update and call populateSubmissionItem to populate the field.
|
|
275
|
+
- If the user's provided data belongs to a single group or modifies an existing multi group row, then
|
|
276
|
+
a. Identify the corresponding submissionItemId to update and call populateSubmissionItem to populate the field.
|
|
277
|
+
3. Confirm with the user that the data has been populated.
|
|
278
|
+
|
|
279
|
+
If the user complains that not all the data or incorrect data has been extracted from documents, you should:
|
|
280
|
+
1. Use the fileSearch tool to search the available documents for the data the user claims is missing or incorrect
|
|
281
|
+
2. Provide the output of the fileSearch tool to the user to help them identify the correct data.
|
|
282
|
+
|
|
283
|
+
General Rules:
|
|
284
|
+
– Never rely on previous chat context or your own assumptions for the current submission content; always fetchCurrentSubmission first.
|
|
285
|
+
– You may use any tools at your disposal multiple times if needed.
|
|
286
|
+
– Any tool that could delete, overwrite, or drop fields is considered [DESTRUCTIVE] (and is labelled as such); always require confirmation before calling it.
|
|
287
|
+
– Present information concisely using Markdown formatting.
|
|
288
|
+
- You should use the context knowledge below to inform your decisions or answer user's questions:
|
|
289
|
+
|
|
290
|
+
Background context:
|
|
291
|
+
${context}
|
|
292
|
+
`;
|
|
293
|
+
|
|
294
|
+
return text;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
async function agentSystemPrompt({
|
|
298
|
+
member,
|
|
299
|
+
conversationId,
|
|
300
|
+
tools,
|
|
301
|
+
}: {
|
|
302
|
+
member: MemberHydrated;
|
|
303
|
+
conversationId: string;
|
|
304
|
+
tools?: ToolSet;
|
|
305
|
+
}) {
|
|
306
|
+
// Get the agent conversation's memory
|
|
307
|
+
const conversation = await db.query.conversation.findFirst({
|
|
308
|
+
where: and(
|
|
309
|
+
eq(schema.conversation.organizationId, member.organizationId),
|
|
310
|
+
eq(schema.conversation.id, conversationId),
|
|
311
|
+
eq(schema.conversation.agent, true),
|
|
312
|
+
isNull(schema.conversation.deletedAt),
|
|
313
|
+
),
|
|
314
|
+
columns: { memory: true, name: true },
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
const memory = conversation?.memory
|
|
318
|
+
? JSON.stringify(conversation.memory, null, 2)
|
|
319
|
+
: "No memory stored yet";
|
|
320
|
+
const agentName = conversation?.name || "Agent Assistant";
|
|
321
|
+
const context = `
|
|
322
|
+
- You are an AI assistant developed by sea.dev to help users with their data processing needs.
|
|
323
|
+
- The current date is ${formatISODate(new Date())}
|
|
324
|
+
- The current user is a member of ${member.organization.name}
|
|
325
|
+
- Your name is ${agentName}
|
|
326
|
+
- Current conversation memory: ${memory}
|
|
327
|
+
`;
|
|
328
|
+
|
|
329
|
+
const text = `
|
|
330
|
+
You are a comprehensive AI assistant that helps users manage their workflows, extract and analyse their data. You have access to a number of tools that you should
|
|
331
|
+
use whenever appropriate.
|
|
332
|
+
|
|
333
|
+
${
|
|
334
|
+
tools
|
|
335
|
+
? `Here is a list of your tools with descriptions:
|
|
336
|
+
${listTools(tools)}`
|
|
337
|
+
: ""
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
## General Guidelines:
|
|
341
|
+
1. **Always start with context** - When asked to help with something, first use getOrganizationData() to understand the current state
|
|
342
|
+
2. **Use memory effectively** - Store important user preferences, ongoing work, and key context using updateAgentMemory()
|
|
343
|
+
3. **Be proactive** - Suggest relevant actions based on the user's needs and current data state
|
|
344
|
+
4. **Citations** - When referencing specific data from submissions, wrap the cited value in a cite tag with the citation ID: <cite data-id="CITATION_ID">the actual value</cite>. For example, if citing revenue of £100,000 with citation ID "abc123", write: "The revenue was <cite data-id="abc123">£100,000</cite>". This allows users to click the value and view the source document. The CITATION_ID comes from the citationId field in the submission data.
|
|
345
|
+
5. **Be brief by default** - Keep responses concise unless the user asks for more detail.
|
|
346
|
+
6. **Never write explicit submission/deal/workflow or other ids in your main response messages**
|
|
347
|
+
7. **Customer-facing formatting** - This is a customer-facing chat interface. Format your responses to be clean, scannable, and professional. Use short paragraphs, bullet points, and clear sections. Avoid overwhelming users with too much text or technical details unless specifically asked. Think "helpful and concise" rather than "comprehensive documentation".
|
|
348
|
+
|
|
349
|
+
Background context:
|
|
350
|
+
${context}
|
|
351
|
+
`;
|
|
352
|
+
|
|
353
|
+
return text;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
async function reportSystemPrompt({
|
|
357
|
+
member,
|
|
358
|
+
conversationId,
|
|
359
|
+
}: {
|
|
360
|
+
member: MemberHydrated;
|
|
361
|
+
conversationId: string;
|
|
362
|
+
}) {
|
|
363
|
+
const report = await db.query.report.findFirst({
|
|
364
|
+
where: and(
|
|
365
|
+
eq(schema.report.organizationId, member.organizationId),
|
|
366
|
+
eq(schema.report.conversationId, conversationId),
|
|
367
|
+
),
|
|
368
|
+
with: { form: true },
|
|
369
|
+
});
|
|
370
|
+
invariant(report);
|
|
371
|
+
|
|
372
|
+
const { data } = await getReportData({ member, reportId: report.id });
|
|
373
|
+
const selectedDealNames =
|
|
374
|
+
data.map((d) => d.dealName).join(", ") ?? "Not specified";
|
|
375
|
+
|
|
376
|
+
const reportContext = `
|
|
377
|
+
- You are an assistant developed by sea.dev to help users analyze their data.
|
|
378
|
+
- The current date is ${formatISODate(new Date())}
|
|
379
|
+
- The current user is a member of ${member.organization.name}
|
|
380
|
+
- You are viewing a report for the forms "${report.form.name}"
|
|
381
|
+
- The report is scoped to deals/clients: ${selectedDealNames}
|
|
382
|
+
- There are ${data.length} submissions in this report
|
|
383
|
+
`;
|
|
384
|
+
|
|
385
|
+
const text = `
|
|
386
|
+
You are a data analysis assistant.
|
|
387
|
+
|
|
388
|
+
Use this data to answer user questions about the submissions, identify patterns, summarize information, and provide insights.
|
|
389
|
+
|
|
390
|
+
## Available Tools
|
|
391
|
+
You have access to the following tools:
|
|
392
|
+
- **fetchReportData(status, dealIds?)**: Fetch the latest submission data for the selected form. Use this when filters change, or when you need refreshed data. The status parameter can be "latest", "all", "final", or "draft".
|
|
393
|
+
- **selectReportData(options)**: Validate and summarize the user's requested selection. Use this when the user asks to view or compare deals to ensure the selected form has data for each deal. Always call this when they ask to view specific deals or statuses so you can report if a deal has no data.
|
|
394
|
+
|
|
395
|
+
## Guidelines
|
|
396
|
+
- Answer questions about the data directly and concisely
|
|
397
|
+
- Provide summaries when asked
|
|
398
|
+
- Identify patterns and trends in the data
|
|
399
|
+
- Never output raw JSON unless specifically requested
|
|
400
|
+
- NEVER use markdown tables. Always use bullet points, numbered lists, or plain text instead.
|
|
401
|
+
- If asked about specific submissions, reference them by name
|
|
402
|
+
- If the user says they've changed filters or asks about different data, use fetchReportData() to get the latest data
|
|
403
|
+
- When the user requests a new view (deals, form, or status), use selectReportData() to build a concise "Viewing <deals> for <form> showing <status> submissions" summary and highlight any missing data.
|
|
404
|
+
|
|
405
|
+
Background context:
|
|
406
|
+
${reportContext}
|
|
407
|
+
|
|
408
|
+
SUBMISSION DATA (as of this conversation start):
|
|
409
|
+
${JSON.stringify(data, null, 2)}
|
|
410
|
+
`;
|
|
411
|
+
|
|
412
|
+
return text;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
async function pipelineSystemPrompt({
|
|
416
|
+
member,
|
|
417
|
+
conversationId,
|
|
418
|
+
}: {
|
|
419
|
+
member: MemberHydrated;
|
|
420
|
+
conversationId: string;
|
|
421
|
+
}) {
|
|
422
|
+
// Find the pipeline associated with this conversation
|
|
423
|
+
const conversationResource = await db.query.conversationResource.findFirst({
|
|
424
|
+
where: and(
|
|
425
|
+
eq(schema.conversationResource.conversationId, conversationId),
|
|
426
|
+
eq(schema.conversationResource.resourceType, "pipeline"),
|
|
427
|
+
),
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
let pipeline = null;
|
|
431
|
+
if (conversationResource?.resourceId) {
|
|
432
|
+
pipeline = await db.query.pipeline.findFirst({
|
|
433
|
+
where: and(
|
|
434
|
+
eq(schema.pipeline.id, conversationResource.resourceId),
|
|
435
|
+
eq(schema.pipeline.organizationId, member.organizationId),
|
|
436
|
+
isNull(schema.pipeline.deletedAt),
|
|
437
|
+
),
|
|
438
|
+
with: {
|
|
439
|
+
steps: {
|
|
440
|
+
with: {
|
|
441
|
+
outputForms: true,
|
|
442
|
+
},
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
const pipelineContext = pipeline
|
|
449
|
+
? `
|
|
450
|
+
- You are currently helping configure the pipeline: "${pipeline.name}"
|
|
451
|
+
- Pipeline ID: ${pipeline.id}
|
|
452
|
+
- Pipeline description: ${pipeline.description || "No description"}
|
|
453
|
+
- Steps: ${pipeline.steps.length} step(s)
|
|
454
|
+
`
|
|
455
|
+
: `
|
|
456
|
+
- You are helping the user create a new pipeline
|
|
457
|
+
`;
|
|
458
|
+
|
|
459
|
+
const context = `
|
|
460
|
+
- You are an assistant developed by sea.dev to help users create and configure pipelines.
|
|
461
|
+
- The current date is ${formatISODate(new Date())}
|
|
462
|
+
- The current user is a member of ${member.organization.name}
|
|
463
|
+
${pipelineContext}
|
|
464
|
+
`;
|
|
465
|
+
|
|
466
|
+
const formKnowledge = `
|
|
467
|
+
## Form Structure Knowledge
|
|
468
|
+
|
|
469
|
+
Forms are data extraction targets. They define the structure for capturing information from documents.
|
|
470
|
+
|
|
471
|
+
### Form Primitives
|
|
472
|
+
|
|
473
|
+
1. **Workflows** - Collections of related forms (e.g., "Credit Analysis", "Due Diligence")
|
|
474
|
+
2. **Forms** - Templates that define data structure (e.g., "Income Statement", "Bank Statement")
|
|
475
|
+
3. **Groups** - Logical sections within a form
|
|
476
|
+
- Regular groups (\`multi: false\`): Single instance data (e.g., "Company Information")
|
|
477
|
+
- Collection groups (\`multi: true\`): Repeating data (e.g., "Monthly Revenue", "Transactions")
|
|
478
|
+
4. **Fields** - Individual data points with types:
|
|
479
|
+
- \`string\`: Short text
|
|
480
|
+
- \`string-long\`: Long text
|
|
481
|
+
- \`number\`: Numeric values
|
|
482
|
+
- \`money\`: Currency amounts
|
|
483
|
+
- \`date\`: Dates
|
|
484
|
+
- \`email\`: Email addresses
|
|
485
|
+
- \`url\`: Web URLs
|
|
486
|
+
- \`boolean\`: Yes/No values
|
|
487
|
+
|
|
488
|
+
### Best Practices for Form Design
|
|
489
|
+
|
|
490
|
+
- **Pin key identifiers first** in collection groups (Date for transactions, Period for financial data)
|
|
491
|
+
- **Use money type** for all financial amounts
|
|
492
|
+
- **Write detailed hints** that help AI extraction understand where to find data
|
|
493
|
+
- **Group related fields** logically (Company Info, Financial Data, Assessment, etc.)
|
|
494
|
+
`;
|
|
495
|
+
|
|
496
|
+
const text = `
|
|
497
|
+
You are an AI assistant that helps users create pipelines through natural conversation.
|
|
498
|
+
|
|
499
|
+
## What are Pipelines?
|
|
500
|
+
|
|
501
|
+
Pipelines are reusable workflows that define how AI processes data from one form structure to another.
|
|
502
|
+
They consist of:
|
|
503
|
+
- **Name**: A descriptive name for the pipeline
|
|
504
|
+
- **Description**: What the pipeline does and when to use it
|
|
505
|
+
- **Input Form**: The source data structure (what goes in)
|
|
506
|
+
- **Output Form**: The target data structure (what comes out)
|
|
507
|
+
- **Steps**: The steps to execute in order. Each step takes input from the previous step's output (or the pipeline's input form for the first step).
|
|
508
|
+
|
|
509
|
+
${formKnowledge}
|
|
510
|
+
|
|
511
|
+
## Your Workflow
|
|
512
|
+
|
|
513
|
+
When a user describes what they want to create, follow these steps:
|
|
514
|
+
|
|
515
|
+
### Step 1: Understand Requirements
|
|
516
|
+
- Ask clarifying questions:
|
|
517
|
+
- What type of data transformation do they want?
|
|
518
|
+
- What is the source data format?
|
|
519
|
+
- What should the output look like?
|
|
520
|
+
- Do they need to create new forms or use existing ones?
|
|
521
|
+
|
|
522
|
+
### Step 2: Check Existing Resources
|
|
523
|
+
- Use \`listForms\` to see what forms already exist
|
|
524
|
+
- Identify if suitable input/output forms exist or need to be created
|
|
525
|
+
|
|
526
|
+
### Step 3: Create Forms if Needed
|
|
527
|
+
If the required forms don't exist:
|
|
528
|
+
|
|
529
|
+
**Create Workflow (if needed):**
|
|
530
|
+
- Use \`createWorkflow\` with a clear name and description
|
|
531
|
+
- Example: name="Financial Analysis", hint="Workflows for analyzing financial documents"
|
|
532
|
+
|
|
533
|
+
**Create Forms:**
|
|
534
|
+
- Use \`createForm\` to create input and/or output forms
|
|
535
|
+
- For each form, define the structure using \`fetchForm\`, \`fetchFormEditability\`, and \`persistForm\`:
|
|
536
|
+
1. Call \`fetchForm\` with the formId to get current structure (will be empty initially for new forms)
|
|
537
|
+
2. Call \`fetchFormEditability\` with the formId to check if the form has submissions that restrict edits (only needed if editing existing forms)
|
|
538
|
+
3. Design the groups and fields following best practices
|
|
539
|
+
4. Call \`persistForm\` with the complete structure
|
|
540
|
+
|
|
541
|
+
**Example form structure for Financial Statement:**
|
|
542
|
+
\`\`\`json
|
|
543
|
+
{
|
|
544
|
+
"groups": [
|
|
545
|
+
{
|
|
546
|
+
"name": "Company Information",
|
|
547
|
+
"hint": "Basic company details",
|
|
548
|
+
"multi": false,
|
|
549
|
+
"fields": [
|
|
550
|
+
{
|
|
551
|
+
"name": "Company Name",
|
|
552
|
+
"type": "string",
|
|
553
|
+
"hint": "Legal company name from header"
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
"name": "Period End Date",
|
|
557
|
+
"type": "date",
|
|
558
|
+
"hint": "Financial statement period end date"
|
|
559
|
+
}
|
|
560
|
+
]
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
"name": "Financial Lines",
|
|
564
|
+
"hint": "Line items from the financial statement",
|
|
565
|
+
"multi": true,
|
|
566
|
+
"fields": [
|
|
567
|
+
{
|
|
568
|
+
"name": "Line Item",
|
|
569
|
+
"type": "string",
|
|
570
|
+
"hint": "Name of the financial line item (Revenue, COGS, etc.)"
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
"name": "Amount",
|
|
574
|
+
"type": "money",
|
|
575
|
+
"hint": "Value for this line item"
|
|
576
|
+
}
|
|
577
|
+
]
|
|
578
|
+
}
|
|
579
|
+
]
|
|
580
|
+
}
|
|
581
|
+
\`\`\`
|
|
582
|
+
|
|
583
|
+
### Step 4: Create the Pipeline
|
|
584
|
+
Once forms are ready:
|
|
585
|
+
- Use \`createPipeline\` with:
|
|
586
|
+
- **name**: Clear, descriptive pipeline name
|
|
587
|
+
- **description**: What it does and when to use it
|
|
588
|
+
- **inputFormId**: ID of the form to use as input for the first step
|
|
589
|
+
- **steps**: Array of steps, each with:
|
|
590
|
+
- **name**: Display name
|
|
591
|
+
- **description**: What this step does
|
|
592
|
+
- **prompt**: Detailed AI instructions for this step
|
|
593
|
+
- **outputFormId**: Form structure for this step's output
|
|
594
|
+
- **toolsAllowed**: Optional list of tools this step can use
|
|
595
|
+
|
|
596
|
+
Steps are executed sequentially, with each step taking input from the previous step's output (or the pipeline's inputFormId for the first step).
|
|
597
|
+
|
|
598
|
+
Example prompt for a step:
|
|
599
|
+
"Analyze the financial statement data from the input. Calculate key metrics like gross margin, EBITDA, and net profit margin.
|
|
600
|
+
Identify revenue trends and flag any concerning patterns. Populate the risk assessment form with your findings,
|
|
601
|
+
categorizing risk level as Low/Medium/High with supporting evidence."
|
|
602
|
+
|
|
603
|
+
### Step 5: Confirm Success
|
|
604
|
+
- Summarize what was created
|
|
605
|
+
- Provide the pipeline ID and details
|
|
606
|
+
- Explain how to use it
|
|
607
|
+
|
|
608
|
+
## Guidelines
|
|
609
|
+
|
|
610
|
+
- **Be proactive**: If forms don't exist, offer to create them
|
|
611
|
+
- **Be thorough**: Design complete, well-structured forms
|
|
612
|
+
- **Follow best practices**: Use appropriate field types, write clear hints
|
|
613
|
+
- **Be conversational**: Ask questions to understand user needs
|
|
614
|
+
- **Keep it concise**: Don't overwhelm with unnecessary details
|
|
615
|
+
- **NEVER ask the user for pipeline IDs, form IDs, workflow IDs, or other technical identifiers**: These are automatically injected from context. Use the pipeline ID from the background context above.
|
|
616
|
+
- **Use context automatically**: The pipeline you're working on is already identified in the background context - use that information directly without asking the user for it.
|
|
617
|
+
|
|
618
|
+
Background context:
|
|
619
|
+
${context}
|
|
620
|
+
`;
|
|
621
|
+
|
|
622
|
+
return text;
|
|
623
|
+
}
|