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,1120 @@
|
|
|
1
|
+
# PRD: Intelligent Form Builder Strategy
|
|
2
|
+
|
|
3
|
+
## Executive Summary
|
|
4
|
+
|
|
5
|
+
This PRD outlines improvements to the form creation experience to better serve users building data extraction workflows. The core opportunity is transforming form creation from an isolated, manual task into an intelligent, workflow-aware process that maximizes AI extraction accuracy.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Jobs to Be Done (JTBD) Analysis
|
|
10
|
+
|
|
11
|
+
### Primary JTBD
|
|
12
|
+
|
|
13
|
+
> **"When I'm setting up a new underwriting workflow, I want to quickly define what data I need extracted from documents, so I can start processing deals without manual data entry."**
|
|
14
|
+
|
|
15
|
+
### Secondary JTBDs
|
|
16
|
+
|
|
17
|
+
| JTBD | Current Gap |
|
|
18
|
+
|------|-------------|
|
|
19
|
+
| "I want to extract bank statement transactions" | User must manually know to create collection groups; no bank statement template |
|
|
20
|
+
| "I want the AI to assess/calculate values after extraction" | Derived fields exist but chat builder cannot create them |
|
|
21
|
+
| "I want related forms to work together in a workflow" | Each form created in isolation with no workflow context |
|
|
22
|
+
| "I want to track changes to my forms over time" | No version history; only chat history exists |
|
|
23
|
+
| "I want to reuse form patterns across workflows" | Clone exists but no template library or form references |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. Current System Architecture
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
31
|
+
│ WORKFLOW │
|
|
32
|
+
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
|
33
|
+
│ │ Form A │ │ Form B │ │ Form C │ ← Created independently │
|
|
34
|
+
│ │ (chat) │ │ (chat) │ │ (chat) │ No shared context │
|
|
35
|
+
│ └────┬────┘ └────┬────┘ └────┬────┘ │
|
|
36
|
+
└───────┼────────────┼────────────┼───────────────────────────────┘
|
|
37
|
+
│ │ │
|
|
38
|
+
▼ ▼ ▼
|
|
39
|
+
┌─────────────────────────────────────┐
|
|
40
|
+
│ FORM STRUCTURE │
|
|
41
|
+
│ ┌──────────────────────────┐ │
|
|
42
|
+
│ │ Group (multi: false) │ │
|
|
43
|
+
│ │ ├─ Field (8 types) │ │
|
|
44
|
+
│ │ ├─ Field │ │
|
|
45
|
+
│ │ └─ Derived* ← NOT IN CHAT │
|
|
46
|
+
│ ├──────────────────────────┤ │
|
|
47
|
+
│ │ Collection (multi: true) │ │
|
|
48
|
+
│ │ ├─ Field (pinned first) │ │
|
|
49
|
+
│ │ └─ Field │ │
|
|
50
|
+
│ └──────────────────────────┘ │
|
|
51
|
+
└─────────────────────────────────────┘
|
|
52
|
+
│
|
|
53
|
+
▼
|
|
54
|
+
┌─────────────────────────────────────┐
|
|
55
|
+
│ DATA EXTRACTION │
|
|
56
|
+
│ • PDF/Document upload │
|
|
57
|
+
│ • Layout analysis │
|
|
58
|
+
│ • Field hint-guided extraction │
|
|
59
|
+
│ • Derived field LLM assessment │
|
|
60
|
+
└─────────────────────────────────────┘
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Current Chat Builder Limitations
|
|
64
|
+
|
|
65
|
+
| Feature | In Schema | Chat Can Create |
|
|
66
|
+
|---------|-----------|-----------------|
|
|
67
|
+
| Groups | ✅ | ✅ |
|
|
68
|
+
| Collection Groups (multi) | ✅ | ✅ |
|
|
69
|
+
| 8 Field Types | ✅ | ✅ |
|
|
70
|
+
| Field Hints | ✅ | ✅ |
|
|
71
|
+
| **Derived Fields** | ✅ | ❌ |
|
|
72
|
+
| **Bank Statement Type** | ✅ | ❌ |
|
|
73
|
+
| **Workflow Context** | N/A | ❌ |
|
|
74
|
+
| **Other Forms Awareness** | N/A | ❌ |
|
|
75
|
+
| **Submission-Aware Editing** | N/A | ❌ (fails silently) |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 3. Opportunity Analysis
|
|
80
|
+
|
|
81
|
+
### What AI Extraction is Good At
|
|
82
|
+
|
|
83
|
+
- Extracting text/numbers visible in documents
|
|
84
|
+
- Identifying repeating patterns (transaction rows, periods)
|
|
85
|
+
- Matching values to clearly-hinted fields
|
|
86
|
+
- Inferring structure from document layout
|
|
87
|
+
|
|
88
|
+
### What Doesn't Make Sense (Current Limitations)
|
|
89
|
+
|
|
90
|
+
- External data source integration (credit scores, APIs)
|
|
91
|
+
- Multi-document aggregation/analytics
|
|
92
|
+
- Running balance calculations across years
|
|
93
|
+
- Data that isn't in an uploadable document
|
|
94
|
+
|
|
95
|
+
### Key Insight
|
|
96
|
+
|
|
97
|
+
> **"Everything should be conceivably available in an uploaded document"**
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 4. Proposed Improvements
|
|
102
|
+
|
|
103
|
+
### 4.1 Quick Wins (Low Effort, High Impact)
|
|
104
|
+
|
|
105
|
+
#### A. Enable Derived Fields in Chat Builder
|
|
106
|
+
|
|
107
|
+
**Current:** Chat schema omits `derived` field array
|
|
108
|
+
|
|
109
|
+
**Fix:** Add derived fields to `formGroupSchema`
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
const formGroupSchema = z.object({
|
|
113
|
+
// ... existing fields
|
|
114
|
+
derived: z.array(z.object({
|
|
115
|
+
id: z.string().optional(),
|
|
116
|
+
name: z.string(),
|
|
117
|
+
prompt: z.string().describe("LLM prompt for post-extraction assessment"),
|
|
118
|
+
})).optional(),
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Value:** Unlocks assessment fields (e.g., "Is this borrower high-risk based on extracted data?")
|
|
123
|
+
|
|
124
|
+
#### B. Enhance System Prompt with Form Knowledge
|
|
125
|
+
|
|
126
|
+
**Current prompt knows:**
|
|
127
|
+
|
|
128
|
+
- Form name, workflow name
|
|
129
|
+
- Basic CRUD instructions
|
|
130
|
+
|
|
131
|
+
**Add:**
|
|
132
|
+
|
|
133
|
+
- Explanation of collection groups (multi=true) and when to use them
|
|
134
|
+
- Derived fields concept and examples
|
|
135
|
+
- Field type best practices (money vs number, date formatting)
|
|
136
|
+
- Document-extractability constraint
|
|
137
|
+
- First-field-pinned UX for collections
|
|
138
|
+
|
|
139
|
+
#### C. Add Smart Defaults for Common Patterns
|
|
140
|
+
|
|
141
|
+
When user says "bank statement" → suggest:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Collection Group: Transactions
|
|
145
|
+
- Date (pinned first)
|
|
146
|
+
- Description
|
|
147
|
+
- Amount (money)
|
|
148
|
+
- Running Balance (money)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### D. Expose Bank Statement Group Type
|
|
152
|
+
|
|
153
|
+
**Current:** `type: "bank_statement"` exists in schema but not exposed in chat
|
|
154
|
+
|
|
155
|
+
**Fix:** Allow chat to set group type for specialized extraction
|
|
156
|
+
|
|
157
|
+
#### G. Extraction Guidance in Prompts
|
|
158
|
+
|
|
159
|
+
**Effort: S | Impact: High**
|
|
160
|
+
|
|
161
|
+
Add extraction-quality hints to system prompt:
|
|
162
|
+
|
|
163
|
+
```markdown
|
|
164
|
+
## Form Design Best Practices for AI Extraction
|
|
165
|
+
|
|
166
|
+
1. **Be specific in field hints** - "Net income after tax from line 28" > "Net income"
|
|
167
|
+
2. **Use collection groups for repeating data** - Transactions, periods, line items
|
|
168
|
+
3. **Pin the key identifier first** - Date for time series, Account # for statements
|
|
169
|
+
4. **Match document terminology** - Use terms that appear in the actual document
|
|
170
|
+
5. **Derived fields for assessment** - Use these for judgments, not extraction
|
|
171
|
+
6. **Only extractable data** - Everything must be conceivably in an uploaded document
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### K. Submission-Aware Edit Restrictions
|
|
175
|
+
|
|
176
|
+
**Effort: S | Impact: High**
|
|
177
|
+
|
|
178
|
+
**Problem:** When a form has existing submissions (populated data), users cannot delete fields or groups without breaking data integrity. Currently, the chat builder is unaware of this constraint and allows users to attempt destructive edits, which fail silently with a confusing error.
|
|
179
|
+
|
|
180
|
+
**Current behavior:**
|
|
181
|
+
- User asks chat to "remove the Revenue field"
|
|
182
|
+
- Chat attempts `persistForm()` with field removed
|
|
183
|
+
- Backend rejects the change (foreign key constraint)
|
|
184
|
+
- User sees generic error with no explanation
|
|
185
|
+
|
|
186
|
+
**Solution:** Add `fetchFormEditability()` tool that chat calls before any edit
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
// New tool for chat builder
|
|
190
|
+
function fetchFormEditability({ formId }) {
|
|
191
|
+
return tool({
|
|
192
|
+
description: "Check what edits are allowed on this form based on existing submissions",
|
|
193
|
+
execute: async () => {
|
|
194
|
+
const submissions = await getSubmissionCountForForm(formId);
|
|
195
|
+
const hasSubmissions = submissions > 0;
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
hasSubmissions,
|
|
199
|
+
submissionCount: submissions,
|
|
200
|
+
restrictions: hasSubmissions ? {
|
|
201
|
+
canDeleteFields: false,
|
|
202
|
+
canDeleteGroups: false,
|
|
203
|
+
canChangeFieldTypes: false,
|
|
204
|
+
canRenameFields: true,
|
|
205
|
+
canUpdateHints: true,
|
|
206
|
+
canAddFields: true,
|
|
207
|
+
canAddGroups: true,
|
|
208
|
+
canReorderFields: true,
|
|
209
|
+
} : {
|
|
210
|
+
// All edits allowed for forms without submissions
|
|
211
|
+
canDeleteFields: true,
|
|
212
|
+
canDeleteGroups: true,
|
|
213
|
+
canChangeFieldTypes: true,
|
|
214
|
+
canRenameFields: true,
|
|
215
|
+
canUpdateHints: true,
|
|
216
|
+
canAddFields: true,
|
|
217
|
+
canAddGroups: true,
|
|
218
|
+
canReorderFields: true,
|
|
219
|
+
},
|
|
220
|
+
message: hasSubmissions
|
|
221
|
+
? `This form has ${submissions} submission(s). You can add fields, rename fields, and update hints, but cannot delete fields or groups.`
|
|
222
|
+
: "This form has no submissions. All edits are allowed."
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**System prompt addition:**
|
|
230
|
+
|
|
231
|
+
```markdown
|
|
232
|
+
## Edit Restrictions for Forms with Data
|
|
233
|
+
|
|
234
|
+
Before making any changes to a form, you MUST call `fetchFormEditability()` to check what edits are allowed.
|
|
235
|
+
|
|
236
|
+
If the form has existing submissions:
|
|
237
|
+
- ✅ **Allowed:** Add new fields, add new groups, rename fields, update hints, reorder fields
|
|
238
|
+
- ❌ **Not allowed:** Delete fields, delete groups, change field types
|
|
239
|
+
|
|
240
|
+
If a user requests a restricted action, explain:
|
|
241
|
+
> "This form has [N] submissions with data. Deleting fields would break existing data integrity.
|
|
242
|
+
> You can: add new fields, rename existing fields, or update field hints.
|
|
243
|
+
> To delete fields, you would need to first delete all submissions or clone this form."
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Value:**
|
|
247
|
+
- Prevents confusing errors
|
|
248
|
+
- Educates users about data integrity constraints
|
|
249
|
+
- Suggests valid alternatives
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
### 4.2 Medium Projects
|
|
254
|
+
|
|
255
|
+
#### E. Workflow-Aware Form Creation
|
|
256
|
+
|
|
257
|
+
**Problem:** User creates Form A, then Form B, but B has no context of A
|
|
258
|
+
|
|
259
|
+
**Solution:** New `fetchWorkflowContext()` tool
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
{
|
|
263
|
+
workflow: { name, hint },
|
|
264
|
+
existingForms: [
|
|
265
|
+
{ name: "Income Statement", groups: [...], purpose: "..." },
|
|
266
|
+
{ name: "Balance Sheet", groups: [...] }
|
|
267
|
+
],
|
|
268
|
+
commonPatterns: ["All forms have a 'Document Date' field"]
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Prompt enhancement:**
|
|
273
|
+
|
|
274
|
+
> "Consider how this form relates to existing forms in the workflow. Ensure consistent naming conventions and complementary data structures."
|
|
275
|
+
|
|
276
|
+
#### F. Form Templates Library
|
|
277
|
+
|
|
278
|
+
Create reusable templates for common document types:
|
|
279
|
+
|
|
280
|
+
- Bank Statement (transactions collection)
|
|
281
|
+
- Income Statement (line items by period)
|
|
282
|
+
- Balance Sheet (assets, liabilities sections)
|
|
283
|
+
- Tax Return (key fields)
|
|
284
|
+
|
|
285
|
+
**Implementation:** Template selector in form creation modal + template-aware chat
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
### 4.3 Bigger Projects
|
|
290
|
+
|
|
291
|
+
#### H. Version Control & History
|
|
292
|
+
|
|
293
|
+
**Schema additions:**
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
// form_version table
|
|
297
|
+
form_version {
|
|
298
|
+
id: string
|
|
299
|
+
formId: string (FK)
|
|
300
|
+
version: number
|
|
301
|
+
snapshot: jsonb // Full form structure at this version
|
|
302
|
+
changedBy: string (FK to member)
|
|
303
|
+
changeNote: string
|
|
304
|
+
createdAt: timestamp
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// form_reference table (for lineage)
|
|
308
|
+
form_reference {
|
|
309
|
+
id: string
|
|
310
|
+
sourceFormId: string (FK)
|
|
311
|
+
targetFormId: string (FK)
|
|
312
|
+
referenceType: enum ["derived_from", "related_to", "supersedes"]
|
|
313
|
+
createdAt: timestamp
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**Features:**
|
|
318
|
+
|
|
319
|
+
- View version history (Google Docs-style timeline)
|
|
320
|
+
- Compare versions (diff view)
|
|
321
|
+
- Restore previous version
|
|
322
|
+
- Track who changed what and why
|
|
323
|
+
- Reference chains between forms
|
|
324
|
+
|
|
325
|
+
#### I. Cross-Form Intelligence & Lineage Tracking
|
|
326
|
+
|
|
327
|
+
**UUID-Based Lineage System:**
|
|
328
|
+
|
|
329
|
+
Every entity gets a stable UUID for full traceability:
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
// Field-level lineage
|
|
333
|
+
form_field {
|
|
334
|
+
uuid: string // Immutable identifier
|
|
335
|
+
// ... existing fields
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Extraction-level lineage
|
|
339
|
+
submission_item_version {
|
|
340
|
+
uuid: string // Unique per extraction attempt
|
|
341
|
+
formFieldUuid: string // Links to field at extraction time
|
|
342
|
+
formVersionId: string // Which form version was used
|
|
343
|
+
extractedAt: timestamp
|
|
344
|
+
// ... existing fields
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Point-in-time tracking
|
|
348
|
+
extraction_snapshot {
|
|
349
|
+
id: string
|
|
350
|
+
submissionId: string
|
|
351
|
+
formVersionId: string // Form state at extraction time
|
|
352
|
+
extractedAt: timestamp
|
|
353
|
+
documentHash: string // Source document fingerprint
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Cross-Form Join Keys:**
|
|
358
|
+
|
|
359
|
+
New field type: `identifier` - enables entity resolution across forms
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
// Schema addition
|
|
363
|
+
formFieldType: [...existing, "identifier"]
|
|
364
|
+
|
|
365
|
+
// identifier field config
|
|
366
|
+
identifier_config {
|
|
367
|
+
fieldId: string
|
|
368
|
+
entityType: enum ["company", "person", "account", "transaction", "custom"]
|
|
369
|
+
matchStrategy: enum ["exact", "fuzzy", "normalized"]
|
|
370
|
+
canonicalSource: string (FK to form) // Optional: which form is source of truth
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Resolution table
|
|
374
|
+
entity_resolution {
|
|
375
|
+
id: string
|
|
376
|
+
entityType: string
|
|
377
|
+
canonicalUuid: string // Master entity ID
|
|
378
|
+
sourceFieldUuid: string
|
|
379
|
+
sourceValue: string
|
|
380
|
+
confidence: number // For fuzzy matches
|
|
381
|
+
resolvedAt: timestamp
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**How it works:**
|
|
386
|
+
|
|
387
|
+
1. User marks a field as `identifier` type (e.g., "Company Name" in Form A)
|
|
388
|
+
2. When same entity appears in Form B, system attempts resolution:
|
|
389
|
+
- **Exact match:** Same normalized value → auto-link
|
|
390
|
+
- **Fuzzy match:** "Acme Corp" ↔ "ACME Corporation" → suggest link with confidence score
|
|
391
|
+
- **Manual resolution:** User confirms/rejects suggested matches
|
|
392
|
+
3. Linked entities share a `canonicalUuid` enabling cross-form queries
|
|
393
|
+
|
|
394
|
+
**Use cases:**
|
|
395
|
+
|
|
396
|
+
- Join bank statement transactions to income statement line items by date
|
|
397
|
+
- Link company data across multiple document types
|
|
398
|
+
- Track same borrower across deals
|
|
399
|
+
- Reconciliation: flag when same entity has conflicting values
|
|
400
|
+
|
|
401
|
+
#### J. Workflow Builder Mode
|
|
402
|
+
|
|
403
|
+
New experience for creating entire workflows:
|
|
404
|
+
|
|
405
|
+
1. User describes workflow goal ("Commercial loan underwriting")
|
|
406
|
+
2. AI suggests complete form set with relationships
|
|
407
|
+
3. User refines holistically before generating individual forms
|
|
408
|
+
4. Forms created with cross-references and consistent conventions
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## 5. Data Architecture for Version Control
|
|
413
|
+
|
|
414
|
+
```
|
|
415
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
416
|
+
│ VERSION CONTROL MODEL │
|
|
417
|
+
│ │
|
|
418
|
+
│ Form ─────┬──── FormVersion (1, 2, 3...) │
|
|
419
|
+
│ │ └── snapshot: { groups, fields, derived } │
|
|
420
|
+
│ │ └── changeNote, changedBy, timestamp │
|
|
421
|
+
│ │ │
|
|
422
|
+
│ └──── FormReference │
|
|
423
|
+
│ └── sourceForm → targetForm │
|
|
424
|
+
│ └── type: derived_from | related_to │
|
|
425
|
+
│ │
|
|
426
|
+
│ View History: Timeline of versions with diffs │
|
|
427
|
+
│ Restore: Create new version from historical snapshot │
|
|
428
|
+
│ Lineage: Graph of form relationships │
|
|
429
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## 6. Prioritized Roadmap
|
|
435
|
+
|
|
436
|
+
| Priority | Item | Effort | Impact | Dependencies |
|
|
437
|
+
|----------|------|--------|--------|--------------|
|
|
438
|
+
| **P0** | A. Derived fields in chat | S | High | None |
|
|
439
|
+
| **P0** | B. Enhanced system prompt | S | High | None |
|
|
440
|
+
| **P0** | G. Extraction guidance in prompts | S | High | B |
|
|
441
|
+
| **P0** | K. Submission-aware edit restrictions | S | High | None |
|
|
442
|
+
| **P1** | C. Smart defaults for patterns | M | Medium | B |
|
|
443
|
+
| **P1** | D. Bank statement group type | S | Medium | None |
|
|
444
|
+
| **P1** | E. Workflow-aware form creation | M | High | None |
|
|
445
|
+
| **P2** | F. Form templates library | M | Medium | C |
|
|
446
|
+
| **P3** | H. Version control & lineage UUIDs | L | High | Schema migration |
|
|
447
|
+
| **P3** | I. Cross-form intelligence + identifier field type | L | High | H, E |
|
|
448
|
+
| **P4** | J. Workflow builder mode | XL | Very High | E, F, I |
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## 7. Success Metrics
|
|
453
|
+
|
|
454
|
+
| Metric | Current | Target |
|
|
455
|
+
|--------|---------|--------|
|
|
456
|
+
| Forms with derived fields | Unknown (low) | 50%+ of forms |
|
|
457
|
+
| Chat-created vs manual forms | Unknown | 80%+ via chat |
|
|
458
|
+
| Time to first working form | Unknown | < 5 minutes |
|
|
459
|
+
| Extraction accuracy | Baseline TBD | +20% improvement |
|
|
460
|
+
| Form revision frequency | Unknown | -30% (better first drafts) |
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## 8. Technical Debt & Maintainability Notes
|
|
465
|
+
|
|
466
|
+
1. **Prompt versioning** - Consider storing prompt versions to correlate form quality with prompt changes
|
|
467
|
+
2. **Schema migrations** - Version control tables need careful migration strategy
|
|
468
|
+
3. **Backwards compatibility** - FormVersion snapshots must handle schema evolution
|
|
469
|
+
4. **Chat token limits** - Workflow context could bloat prompts; need truncation strategy
|
|
470
|
+
5. **Template maintenance** - Templates need regular updates as extraction improves
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## 9. Open Questions
|
|
475
|
+
|
|
476
|
+
1. Should derived fields support referencing other forms, or only current form data?
|
|
477
|
+
2. Version control: every save, or explicit "checkpoint" UX?
|
|
478
|
+
3. Should templates be org-specific, global, or both?
|
|
479
|
+
4. How to handle form references when source form is deleted?
|
|
480
|
+
5. Should workflow builder be a separate mode or integrated into existing flow?
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## 10. Next Steps
|
|
485
|
+
|
|
486
|
+
1. **Validate priorities** - Confirm P0 items align with roadmap
|
|
487
|
+
2. **Implement quick wins** - A, B, D, G can be done immediately
|
|
488
|
+
3. **Scope version control** - Decide on UX (timeline view, diff UI) before schema design
|
|
489
|
+
4. **User research** - What patterns do users struggle with most?
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## 11. Future Ideas & Extended Scope
|
|
494
|
+
|
|
495
|
+
The following ideas represent potential future enhancements that extend beyond the current roadmap. They are documented here for consideration in later phases.
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
### 11.1 Capability Model as Formal System
|
|
500
|
+
|
|
501
|
+
**Concept:** Instead of embedding extractability rules in prompts, create a formal internal "capability profile" that the builder validates against programmatically.
|
|
502
|
+
|
|
503
|
+
**Capability Profile Structure:**
|
|
504
|
+
|
|
505
|
+
```typescript
|
|
506
|
+
interface CapabilityProfile {
|
|
507
|
+
version: string;
|
|
508
|
+
|
|
509
|
+
extraction: {
|
|
510
|
+
// What can be extracted
|
|
511
|
+
singleDocumentFields: true;
|
|
512
|
+
tabularStructures: true;
|
|
513
|
+
textClassification: true;
|
|
514
|
+
textSummarization: true;
|
|
515
|
+
|
|
516
|
+
// What cannot (yet) be extracted
|
|
517
|
+
multiDocumentAggregation: false;
|
|
518
|
+
externalApiIntegration: false;
|
|
519
|
+
crossYearAnalytics: false;
|
|
520
|
+
realTimeDataFetch: false;
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
fieldPatterns: {
|
|
524
|
+
supported: ["direct_value", "table_cell", "derived_from_text"];
|
|
525
|
+
unsupported: ["api_lookup", "multi_doc_aggregate", "time_series_calc"];
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
**Behaviour:**
|
|
531
|
+
|
|
532
|
+
- Chat builder queries capability profile before suggesting fields
|
|
533
|
+
- Warns user: "This field requires multi-document aggregation which is not yet supported"
|
|
534
|
+
- Tags fields as `future_capability: true` for later enablement
|
|
535
|
+
- Profile is versioned and updated as extraction engine improves
|
|
536
|
+
|
|
537
|
+
**Value:** Prevents invalid forms at creation time; provides clear upgrade path as capabilities expand.
|
|
538
|
+
|
|
539
|
+
**Effort:** Medium | **Dependencies:** None
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
### 11.2 Form Metadata Schema
|
|
544
|
+
|
|
545
|
+
**Concept:** Enrich forms with structured metadata that informs extraction, templates, and discoverability.
|
|
546
|
+
|
|
547
|
+
**Schema Additions:**
|
|
548
|
+
|
|
549
|
+
```typescript
|
|
550
|
+
form {
|
|
551
|
+
// ... existing fields
|
|
552
|
+
|
|
553
|
+
// New metadata fields
|
|
554
|
+
docType: enum ["bank_statement", "income_statement", "balance_sheet",
|
|
555
|
+
"tax_return", "registry_document", "invoice", "custom"]
|
|
556
|
+
|
|
557
|
+
intendedSources: enum[] ["pdf", "html", "ocr_scan", "structured_upload"]
|
|
558
|
+
|
|
559
|
+
description: string // Human-readable purpose
|
|
560
|
+
|
|
561
|
+
exampleDocsUrl: string[] // Links to sample documents
|
|
562
|
+
|
|
563
|
+
extractionNotes: string // Tips for the extraction engine
|
|
564
|
+
|
|
565
|
+
industry: enum ["fintech", "real_estate", "sme_lending", "generic"]
|
|
566
|
+
}
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
**Use Cases:**
|
|
570
|
+
|
|
571
|
+
- Template library filters by `docType` and `industry`
|
|
572
|
+
- Extraction engine uses `intendedSources` to optimize processing
|
|
573
|
+
- `exampleDocsUrl` enables test harness and onboarding
|
|
574
|
+
- Search/filter forms by metadata
|
|
575
|
+
|
|
576
|
+
**Effort:** Small | **Dependencies:** None
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
### 11.3 Version Status Workflow
|
|
581
|
+
|
|
582
|
+
**Concept:** Replace simple linear versioning with an explicit state machine for governance.
|
|
583
|
+
|
|
584
|
+
**States:**
|
|
585
|
+
|
|
586
|
+
```
|
|
587
|
+
draft → active → archived
|
|
588
|
+
↑
|
|
589
|
+
└── (restore creates new draft)
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
**Rules:**
|
|
593
|
+
|
|
594
|
+
- Only ONE `active` version per form at any time
|
|
595
|
+
- Workflows can ONLY reference `active` versions
|
|
596
|
+
- `draft` versions are work-in-progress, not used in extraction
|
|
597
|
+
- `archived` versions are read-only historical records
|
|
598
|
+
- Restoring an old version creates a NEW draft (never mutates history)
|
|
599
|
+
|
|
600
|
+
**Schema:**
|
|
601
|
+
|
|
602
|
+
```typescript
|
|
603
|
+
form_version {
|
|
604
|
+
// ... existing fields
|
|
605
|
+
status: enum ["draft", "active", "archived"]
|
|
606
|
+
publishedAt: timestamp | null
|
|
607
|
+
publishedBy: string (FK) | null
|
|
608
|
+
}
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
**UI Implications:**
|
|
612
|
+
|
|
613
|
+
- "Publish" button to promote draft → active
|
|
614
|
+
- Warning when publishing: "This will replace the current active version"
|
|
615
|
+
- Version list shows status badges
|
|
616
|
+
- Filter by status in version history
|
|
617
|
+
|
|
618
|
+
**Trade-offs:**
|
|
619
|
+
|
|
620
|
+
- More governance = more friction for quick iterations
|
|
621
|
+
- Consider: auto-publish for minor changes, require explicit publish for breaking changes?
|
|
622
|
+
|
|
623
|
+
**Effort:** Medium | **Dependencies:** Version control (H)
|
|
624
|
+
|
|
625
|
+
---
|
|
626
|
+
|
|
627
|
+
### 11.4 Role-Based Access Control for Forms
|
|
628
|
+
|
|
629
|
+
**Concept:** Form-specific permissions beyond organization-level access.
|
|
630
|
+
|
|
631
|
+
**Roles:**
|
|
632
|
+
|
|
633
|
+
| Role | Capabilities |
|
|
634
|
+
|------|-------------|
|
|
635
|
+
| **Viewer** | Read forms, view history, view submissions |
|
|
636
|
+
| **Editor** | Create/edit forms, create draft versions |
|
|
637
|
+
| **Publisher** | Promote drafts to active, rollback versions |
|
|
638
|
+
| **Admin** | Delete forms, manage form permissions, bulk operations |
|
|
639
|
+
|
|
640
|
+
**Schema:**
|
|
641
|
+
|
|
642
|
+
```typescript
|
|
643
|
+
form_permission {
|
|
644
|
+
id: string
|
|
645
|
+
formId: string (FK)
|
|
646
|
+
memberId: string (FK)
|
|
647
|
+
role: enum ["viewer", "editor", "publisher", "admin"]
|
|
648
|
+
grantedBy: string (FK)
|
|
649
|
+
grantedAt: timestamp
|
|
650
|
+
}
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
**Inheritance:**
|
|
654
|
+
|
|
655
|
+
- Organization admins have implicit `admin` on all forms
|
|
656
|
+
- Workflow owners have implicit `publisher` on workflow forms
|
|
657
|
+
- Default role for org members: configurable (viewer/editor)
|
|
658
|
+
|
|
659
|
+
**Effort:** Medium | **Dependencies:** Existing org/member model
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
### 11.5 Audit Logging
|
|
664
|
+
|
|
665
|
+
**Concept:** Comprehensive logging of all form-related actions for compliance and debugging.
|
|
666
|
+
|
|
667
|
+
**Events to Log:**
|
|
668
|
+
|
|
669
|
+
```typescript
|
|
670
|
+
form_audit_log {
|
|
671
|
+
id: string
|
|
672
|
+
formId: string (FK)
|
|
673
|
+
formVersionId: string (FK) | null
|
|
674
|
+
|
|
675
|
+
action: enum [
|
|
676
|
+
"form_created",
|
|
677
|
+
"form_updated",
|
|
678
|
+
"form_deleted",
|
|
679
|
+
"version_created",
|
|
680
|
+
"version_published",
|
|
681
|
+
"version_archived",
|
|
682
|
+
"version_restored",
|
|
683
|
+
"permission_granted",
|
|
684
|
+
"permission_revoked"
|
|
685
|
+
]
|
|
686
|
+
|
|
687
|
+
actorId: string (FK to member)
|
|
688
|
+
actorType: enum ["user", "system", "api"]
|
|
689
|
+
|
|
690
|
+
metadata: jsonb // Action-specific details
|
|
691
|
+
|
|
692
|
+
ipAddress: string | null
|
|
693
|
+
userAgent: string | null
|
|
694
|
+
|
|
695
|
+
timestamp: timestamp
|
|
696
|
+
}
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
**Query Patterns:**
|
|
700
|
+
|
|
701
|
+
- "Show me all changes to Form X in the last 30 days"
|
|
702
|
+
- "Who published version 5?"
|
|
703
|
+
- "What did user Y change across all forms?"
|
|
704
|
+
- "When was this field added?"
|
|
705
|
+
|
|
706
|
+
**Retention:** Consider 90-day hot storage, archive to cold storage thereafter.
|
|
707
|
+
|
|
708
|
+
**Effort:** Small-Medium | **Dependencies:** None (can be added independently)
|
|
709
|
+
|
|
710
|
+
---
|
|
711
|
+
|
|
712
|
+
### 11.6 Form Version Test Harness
|
|
713
|
+
|
|
714
|
+
**Concept:** CI/CD-style testing for form versions before promotion to active.
|
|
715
|
+
|
|
716
|
+
**Workflow:**
|
|
717
|
+
|
|
718
|
+
```
|
|
719
|
+
1. Create/edit form → draft version created
|
|
720
|
+
2. Upload test documents (or use existing samples)
|
|
721
|
+
3. Run extraction against draft version
|
|
722
|
+
4. Compare results to:
|
|
723
|
+
- Expected values (if defined)
|
|
724
|
+
- Previous version results (regression detection)
|
|
725
|
+
5. Generate quality report:
|
|
726
|
+
- Field-level accuracy scores
|
|
727
|
+
- Confidence distributions
|
|
728
|
+
- Extraction failures/warnings
|
|
729
|
+
6. Human review → publish or iterate
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
**Schema:**
|
|
733
|
+
|
|
734
|
+
```typescript
|
|
735
|
+
form_test_run {
|
|
736
|
+
id: string
|
|
737
|
+
formVersionId: string (FK)
|
|
738
|
+
|
|
739
|
+
status: enum ["pending", "running", "completed", "failed"]
|
|
740
|
+
|
|
741
|
+
testDocuments: string[] // Document IDs used
|
|
742
|
+
|
|
743
|
+
results: jsonb {
|
|
744
|
+
fieldAccuracy: { [fieldId]: number }
|
|
745
|
+
overallScore: number
|
|
746
|
+
regressions: { field, previous, current, delta }[]
|
|
747
|
+
warnings: string[]
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
comparedToVersionId: string (FK) | null // For regression testing
|
|
751
|
+
|
|
752
|
+
runAt: timestamp
|
|
753
|
+
runBy: string (FK)
|
|
754
|
+
}
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
**UI:**
|
|
758
|
+
|
|
759
|
+
- "Test this version" button in form editor
|
|
760
|
+
- Test results panel with pass/fail indicators
|
|
761
|
+
- Side-by-side comparison with previous version
|
|
762
|
+
- Block publish if score below threshold (configurable)
|
|
763
|
+
|
|
764
|
+
**Effort:** Large | **Dependencies:** Version control (H), sample document storage
|
|
765
|
+
|
|
766
|
+
---
|
|
767
|
+
|
|
768
|
+
### 11.7 Change Impact Analysis
|
|
769
|
+
|
|
770
|
+
**Concept:** Understand downstream effects before making form changes.
|
|
771
|
+
|
|
772
|
+
**Questions Answered:**
|
|
773
|
+
|
|
774
|
+
- "If I remove this field, which workflows are affected?"
|
|
775
|
+
- "Which submissions used this version?"
|
|
776
|
+
- "What reports/dashboards reference this field?"
|
|
777
|
+
- "Are there derived fields that depend on this?"
|
|
778
|
+
|
|
779
|
+
**Implementation:**
|
|
780
|
+
|
|
781
|
+
```typescript
|
|
782
|
+
// Dependency graph
|
|
783
|
+
form_dependency {
|
|
784
|
+
id: string
|
|
785
|
+
sourceType: enum ["field", "group", "form", "workflow"]
|
|
786
|
+
sourceId: string
|
|
787
|
+
targetType: enum ["field", "derived_field", "workflow_step", "report"]
|
|
788
|
+
targetId: string
|
|
789
|
+
dependencyType: enum ["references", "derives_from", "displays"]
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// Impact analysis query
|
|
793
|
+
function analyzeImpact(formId, proposedChanges) {
|
|
794
|
+
return {
|
|
795
|
+
affectedWorkflows: Workflow[],
|
|
796
|
+
affectedSubmissions: { count, dateRange },
|
|
797
|
+
brokenDependencies: Dependency[],
|
|
798
|
+
derivedFieldsImpacted: DerivedField[],
|
|
799
|
+
severity: "low" | "medium" | "high" | "breaking"
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
**UI:**
|
|
805
|
+
|
|
806
|
+
- Impact preview modal before publishing changes
|
|
807
|
+
- Warning badges on fields with dependencies
|
|
808
|
+
- "Breaking change" confirmation for high-severity impacts
|
|
809
|
+
|
|
810
|
+
**Effort:** Large | **Dependencies:** Cross-form intelligence (I), version control (H)
|
|
811
|
+
|
|
812
|
+
---
|
|
813
|
+
|
|
814
|
+
### 11.8 Environment Separation
|
|
815
|
+
|
|
816
|
+
**Concept:** Separate dev/staging/prod environments for forms and workflows.
|
|
817
|
+
|
|
818
|
+
**Model:**
|
|
819
|
+
|
|
820
|
+
```
|
|
821
|
+
Organization
|
|
822
|
+
└── Environment (dev, staging, prod)
|
|
823
|
+
└── Forms (isolated per environment)
|
|
824
|
+
└── Workflows (isolated per environment)
|
|
825
|
+
└── Submissions (isolated per environment)
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
**Promotion Flow:**
|
|
829
|
+
|
|
830
|
+
```
|
|
831
|
+
dev → staging → prod
|
|
832
|
+
│ │
|
|
833
|
+
└───────┴── Copy form version between environments
|
|
834
|
+
(not move - each env has own instance)
|
|
835
|
+
```
|
|
836
|
+
|
|
837
|
+
**Schema:**
|
|
838
|
+
|
|
839
|
+
```typescript
|
|
840
|
+
environment {
|
|
841
|
+
id: string
|
|
842
|
+
organizationId: string (FK)
|
|
843
|
+
name: string // "dev", "staging", "prod", or custom
|
|
844
|
+
type: enum ["development", "staging", "production"]
|
|
845
|
+
isDefault: boolean
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
// All major entities get environment FK
|
|
849
|
+
form {
|
|
850
|
+
// ... existing
|
|
851
|
+
environmentId: string (FK)
|
|
852
|
+
}
|
|
853
|
+
```
|
|
854
|
+
|
|
855
|
+
**Features:**
|
|
856
|
+
|
|
857
|
+
- Environment switcher in UI
|
|
858
|
+
- Promote form version: copies to target environment
|
|
859
|
+
- Environment-specific API keys
|
|
860
|
+
- Production protection: require approval for changes
|
|
861
|
+
|
|
862
|
+
**Trade-offs:**
|
|
863
|
+
|
|
864
|
+
- Significant infrastructure complexity
|
|
865
|
+
- Data isolation questions (can prod reference staging data?)
|
|
866
|
+
- May be overkill for smaller teams
|
|
867
|
+
|
|
868
|
+
**Effort:** Large | **Dependencies:** Version control (H)
|
|
869
|
+
|
|
870
|
+
---
|
|
871
|
+
|
|
872
|
+
### 11.9 Enhanced DerivedFieldConfig
|
|
873
|
+
|
|
874
|
+
**Concept:** Richer configuration for derived/assessment fields beyond simple prompts.
|
|
875
|
+
|
|
876
|
+
**Extended Schema:**
|
|
877
|
+
|
|
878
|
+
```typescript
|
|
879
|
+
derived_field_config {
|
|
880
|
+
id: string
|
|
881
|
+
formDerivedId: string (FK)
|
|
882
|
+
|
|
883
|
+
// Dependencies
|
|
884
|
+
dependsOnFieldIds: string[] // Explicit field references
|
|
885
|
+
dependsOnGroupIds: string[] // Entire group as context
|
|
886
|
+
crossFormDependencies: { // v2+: cross-form references
|
|
887
|
+
formId: string
|
|
888
|
+
fieldIds: string[]
|
|
889
|
+
}[]
|
|
890
|
+
|
|
891
|
+
// AI behavior
|
|
892
|
+
aiMode: enum [
|
|
893
|
+
"classification", // Categorize into predefined options
|
|
894
|
+
"summarization", // Generate text summary
|
|
895
|
+
"scoring", // Numeric score (0-100, 1-5, etc.)
|
|
896
|
+
"boolean_flag", // Yes/No determination
|
|
897
|
+
"extraction", // Extract specific value from context
|
|
898
|
+
"calculation" // Compute from other fields (with formula)
|
|
899
|
+
]
|
|
900
|
+
|
|
901
|
+
// Mode-specific config
|
|
902
|
+
classificationOptions: string[] | null // For classification mode
|
|
903
|
+
scoringRange: { min: number, max: number } | null
|
|
904
|
+
calculationFormula: string | null // e.g., "field_a + field_b"
|
|
905
|
+
|
|
906
|
+
// Visibility
|
|
907
|
+
visibility: enum ["visible", "internal", "debug"]
|
|
908
|
+
|
|
909
|
+
// Execution
|
|
910
|
+
runTrigger: enum ["on_extraction", "on_demand", "scheduled"]
|
|
911
|
+
cacheDuration: number | null // Seconds, null = no cache
|
|
912
|
+
}
|
|
913
|
+
```
|
|
914
|
+
|
|
915
|
+
**Benefits:**
|
|
916
|
+
|
|
917
|
+
- Standardized AI behavior patterns
|
|
918
|
+
- Better extraction engine optimization
|
|
919
|
+
- Clearer semantics for cross-form dependencies
|
|
920
|
+
- Support for non-LLM calculations
|
|
921
|
+
|
|
922
|
+
**Effort:** Medium | **Dependencies:** Derived fields in chat (A)
|
|
923
|
+
|
|
924
|
+
---
|
|
925
|
+
|
|
926
|
+
### 11.10 Explicit Pinned Field Reference
|
|
927
|
+
|
|
928
|
+
**Concept:** Replace implicit "first field is pinned" with explicit foreign key reference.
|
|
929
|
+
|
|
930
|
+
**Current Behavior:**
|
|
931
|
+
|
|
932
|
+
- Collection groups implicitly treat first field (by order) as pinned
|
|
933
|
+
- UX shows first field specially
|
|
934
|
+
- No schema enforcement
|
|
935
|
+
|
|
936
|
+
**Proposed Schema:**
|
|
937
|
+
|
|
938
|
+
```typescript
|
|
939
|
+
form_group {
|
|
940
|
+
// ... existing fields
|
|
941
|
+
|
|
942
|
+
pinnedFieldId: string (FK to form_field) | null
|
|
943
|
+
// Required when multi = true
|
|
944
|
+
// Must reference a field in this group
|
|
945
|
+
}
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
**Validation Rules:**
|
|
949
|
+
|
|
950
|
+
- If `multi = true`, `pinnedFieldId` is required
|
|
951
|
+
- `pinnedFieldId` must reference a field where `formGroupId = this.id`
|
|
952
|
+
- Cannot delete a field that is pinned
|
|
953
|
+
- Changing pinned field requires explicit action
|
|
954
|
+
|
|
955
|
+
**Migration:**
|
|
956
|
+
|
|
957
|
+
```sql
|
|
958
|
+
-- Backfill: set pinnedFieldId to first field by order
|
|
959
|
+
UPDATE form_group g
|
|
960
|
+
SET pinned_field_id = (
|
|
961
|
+
SELECT id FROM form_field f
|
|
962
|
+
WHERE f.form_group_id = g.id
|
|
963
|
+
ORDER BY f.order ASC
|
|
964
|
+
LIMIT 1
|
|
965
|
+
)
|
|
966
|
+
WHERE g.multi = true;
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
**Benefits:**
|
|
970
|
+
|
|
971
|
+
- Explicit is better than implicit
|
|
972
|
+
- Prevents accidental breakage when reordering fields
|
|
973
|
+
- Cleaner API contracts
|
|
974
|
+
|
|
975
|
+
**Effort:** Small | **Dependencies:** None (can be done independently)
|
|
976
|
+
|
|
977
|
+
---
|
|
978
|
+
|
|
979
|
+
### 11.11 Auto-Refactor Suggestions
|
|
980
|
+
|
|
981
|
+
**Concept:** Use extraction analytics to proactively suggest form improvements.
|
|
982
|
+
|
|
983
|
+
**Data Collection:**
|
|
984
|
+
|
|
985
|
+
```typescript
|
|
986
|
+
field_extraction_metrics {
|
|
987
|
+
id: string
|
|
988
|
+
formFieldId: string (FK)
|
|
989
|
+
formVersionId: string (FK)
|
|
990
|
+
|
|
991
|
+
// Aggregated metrics
|
|
992
|
+
extractionCount: number
|
|
993
|
+
successRate: number // 0-1
|
|
994
|
+
averageConfidence: number
|
|
995
|
+
manualCorrectionRate: number
|
|
996
|
+
|
|
997
|
+
// Common issues
|
|
998
|
+
commonErrors: {
|
|
999
|
+
type: string // "wrong_type", "missed", "hallucinated"
|
|
1000
|
+
count: number
|
|
1001
|
+
examples: string[]
|
|
1002
|
+
}[]
|
|
1003
|
+
|
|
1004
|
+
// Time range
|
|
1005
|
+
periodStart: timestamp
|
|
1006
|
+
periodEnd: timestamp
|
|
1007
|
+
}
|
|
1008
|
+
```
|
|
1009
|
+
|
|
1010
|
+
**Suggestion Engine:**
|
|
1011
|
+
|
|
1012
|
+
```typescript
|
|
1013
|
+
interface RefactorSuggestion {
|
|
1014
|
+
type: "rename" | "retype" | "add_hint" | "split_field" | "merge_fields"
|
|
1015
|
+
| "make_collection" | "remove_field" | "add_derived"
|
|
1016
|
+
|
|
1017
|
+
targetFieldId: string
|
|
1018
|
+
|
|
1019
|
+
reason: string // "This field has 45% correction rate"
|
|
1020
|
+
|
|
1021
|
+
suggestedChange: {
|
|
1022
|
+
before: Partial<Field>
|
|
1023
|
+
after: Partial<Field>
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
confidence: number
|
|
1027
|
+
|
|
1028
|
+
expectedImprovement: string // "Estimated +20% accuracy"
|
|
1029
|
+
}
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
**UI:**
|
|
1033
|
+
|
|
1034
|
+
- "Suggestions" panel in form editor
|
|
1035
|
+
- Notification: "3 forms have improvement suggestions"
|
|
1036
|
+
- One-click apply suggestion
|
|
1037
|
+
- Dismiss with feedback (improves future suggestions)
|
|
1038
|
+
|
|
1039
|
+
**Effort:** Extra Large | **Dependencies:** Extraction analytics infrastructure, significant ML/heuristics work
|
|
1040
|
+
|
|
1041
|
+
---
|
|
1042
|
+
|
|
1043
|
+
### 11.12 Workflow as First-Class Entity
|
|
1044
|
+
|
|
1045
|
+
**Concept:** Formalize workflows with ordered steps, each referencing specific form versions.
|
|
1046
|
+
|
|
1047
|
+
**Current State:**
|
|
1048
|
+
|
|
1049
|
+
- Workflows exist but forms are loosely associated
|
|
1050
|
+
- No explicit step ordering
|
|
1051
|
+
- No version pinning
|
|
1052
|
+
|
|
1053
|
+
**Proposed Schema:**
|
|
1054
|
+
|
|
1055
|
+
```typescript
|
|
1056
|
+
workflow {
|
|
1057
|
+
id: string
|
|
1058
|
+
organizationId: string (FK)
|
|
1059
|
+
name: string
|
|
1060
|
+
description: string
|
|
1061
|
+
status: enum ["draft", "active", "archived"]
|
|
1062
|
+
createdAt: timestamp
|
|
1063
|
+
updatedAt: timestamp
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
workflow_step {
|
|
1067
|
+
id: string
|
|
1068
|
+
workflowId: string (FK)
|
|
1069
|
+
|
|
1070
|
+
order: number // Step sequence
|
|
1071
|
+
name: string // "Upload Bank Statements"
|
|
1072
|
+
|
|
1073
|
+
formId: string (FK)
|
|
1074
|
+
formVersionId: string (FK) // Pinned to specific version
|
|
1075
|
+
|
|
1076
|
+
// Step behavior
|
|
1077
|
+
isRequired: boolean
|
|
1078
|
+
allowMultipleSubmissions: boolean
|
|
1079
|
+
|
|
1080
|
+
// Conditions (future)
|
|
1081
|
+
skipCondition: string | null // Expression: "previous_step.field_x == 'N/A'"
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
workflow_version {
|
|
1085
|
+
id: string
|
|
1086
|
+
workflowId: string (FK)
|
|
1087
|
+
version: number
|
|
1088
|
+
snapshot: jsonb // Full workflow structure
|
|
1089
|
+
status: enum ["draft", "active", "archived"]
|
|
1090
|
+
createdAt: timestamp
|
|
1091
|
+
}
|
|
1092
|
+
```
|
|
1093
|
+
|
|
1094
|
+
**Features:**
|
|
1095
|
+
|
|
1096
|
+
- Visual workflow designer (drag-drop steps)
|
|
1097
|
+
- Version workflows independently of forms
|
|
1098
|
+
- Upgrade individual steps to new form versions
|
|
1099
|
+
- Workflow templates
|
|
1100
|
+
|
|
1101
|
+
**Effort:** Extra Large | **Dependencies:** Version control (H), workflow builder mode (J)
|
|
1102
|
+
|
|
1103
|
+
---
|
|
1104
|
+
|
|
1105
|
+
## 12. Ideas Summary Table
|
|
1106
|
+
|
|
1107
|
+
| ID | Idea | Effort | Priority Suggestion | Dependencies |
|
|
1108
|
+
|----|------|--------|---------------------|--------------|
|
|
1109
|
+
| 11.1 | Capability Model | M | P1 - prevents bad forms early | None |
|
|
1110
|
+
| 11.2 | Form Metadata Schema | S | P1 - enables templates & search | None |
|
|
1111
|
+
| 11.3 | Version Status Workflow | M | P2 - adds governance | H |
|
|
1112
|
+
| 11.4 | Role-Based Access Control | M | P2 - enterprise need | Org model |
|
|
1113
|
+
| 11.5 | Audit Logging | S-M | P2 - compliance | None |
|
|
1114
|
+
| 11.6 | Form Version Test Harness | L | P4 - high value, big build | H |
|
|
1115
|
+
| 11.7 | Change Impact Analysis | L | P4 - requires dependency graph | H, I |
|
|
1116
|
+
| 11.8 | Environment Separation | L | P3 - enterprise feature | H |
|
|
1117
|
+
| 11.9 | Enhanced DerivedFieldConfig | M | P2 - useful standardization | A |
|
|
1118
|
+
| 11.10 | Explicit Pinned Field Reference | S | P1 - cleaner model | None |
|
|
1119
|
+
| 11.11 | Auto-Refactor Suggestions | XL | Future - ML-heavy | Analytics infra |
|
|
1120
|
+
| 11.12 | Workflow as First-Class Entity | XL | Future - major rearchitecture | H, J |
|