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.
Files changed (784) hide show
  1. package/.claude/tasks/README.md +89 -0
  2. package/.cursor/rules/commits.mdc +31 -0
  3. package/.cursor/rules/general.mdc +84 -0
  4. package/.github/workflows/ci-cd.yml +141 -0
  5. package/CLAUDE.md +337 -0
  6. package/README.md +129 -0
  7. package/apps/api/.prettierignore +6 -0
  8. package/apps/api/.prettierrc.js +3 -0
  9. package/apps/api/dotenvx-safe.sh +11 -0
  10. package/apps/api/eslint.config.mjs +3 -0
  11. package/apps/api/package.json +58 -0
  12. package/apps/api/src/clients/posthog.ts +25 -0
  13. package/apps/api/src/dal/submission.ts +59 -0
  14. package/apps/api/src/errors.ts +55 -0
  15. package/apps/api/src/index.ts +21 -0
  16. package/apps/api/src/lib/channel.ts +28 -0
  17. package/apps/api/src/lib/config.ts +9 -0
  18. package/apps/api/src/lib/fmt.test.ts +9 -0
  19. package/apps/api/src/lib/fmt.ts +62 -0
  20. package/apps/api/src/lib/invariant.ts +23 -0
  21. package/apps/api/src/middleware/auth.ts +66 -0
  22. package/apps/api/src/routes/index.ts +20 -0
  23. package/apps/api/src/routes/v2/chat/handlers.ts +693 -0
  24. package/apps/api/src/routes/v2/chat/index.ts +257 -0
  25. package/apps/api/src/routes/v2/chat/schemas.ts +43 -0
  26. package/apps/api/src/routes/v2/deals/handlers.ts +64 -0
  27. package/apps/api/src/routes/v2/deals/index.ts +88 -0
  28. package/apps/api/src/routes/v2/deals/schemas.ts +38 -0
  29. package/apps/api/src/routes/v2/forms/handlers.ts +415 -0
  30. package/apps/api/src/routes/v2/forms/index.ts +382 -0
  31. package/apps/api/src/routes/v2/forms/schemas.ts +243 -0
  32. package/apps/api/src/routes/v2/index.ts +19 -0
  33. package/apps/api/src/routes/v2/pipelines/handlers.ts +261 -0
  34. package/apps/api/src/routes/v2/pipelines/index.ts +224 -0
  35. package/apps/api/src/routes/v2/pipelines/schemas.ts +173 -0
  36. package/apps/api/src/routes/v2/submissions/handlers.ts +555 -0
  37. package/apps/api/src/routes/v2/submissions/index.ts +366 -0
  38. package/apps/api/src/routes/v2/submissions/schemas.ts +233 -0
  39. package/apps/api/src/routes/v2/workflows/handlers.ts +81 -0
  40. package/apps/api/src/routes/v2/workflows/index.ts +88 -0
  41. package/apps/api/src/routes/v2/workflows/schemas.ts +40 -0
  42. package/apps/api/src/server.ts +146 -0
  43. package/apps/api/src/static/favicon.ico +0 -0
  44. package/apps/api/src/types/api.ts +14 -0
  45. package/apps/api/src/types/result.ts +3 -0
  46. package/apps/api/tsconfig.json +22 -0
  47. package/apps/api/vite.config.ts +28 -0
  48. package/apps/api/vitest.config.ts +14 -0
  49. package/apps/conversion-worker/Dockerfile +59 -0
  50. package/apps/conversion-worker/package.json +31 -0
  51. package/apps/conversion-worker/src/lib/config.ts +7 -0
  52. package/apps/conversion-worker/src/main.ts +22 -0
  53. package/apps/conversion-worker/src/workflows/convert-pptx.ts +116 -0
  54. package/apps/conversion-worker/tsconfig.json +27 -0
  55. package/apps/conversion-worker/vite.config.ts +33 -0
  56. package/apps/main/.prettierignore +6 -0
  57. package/apps/main/.prettierrc.js +3 -0
  58. package/apps/main/CLAUDE.md +245 -0
  59. package/apps/main/Procfile +1 -0
  60. package/apps/main/README.md +193 -0
  61. package/apps/main/db-tests.jsonl +116 -0
  62. package/apps/main/dotenvx-safe.sh +11 -0
  63. package/apps/main/drizzle/meta/_journal.json +1 -0
  64. package/apps/main/drizzle.config.ts +25 -0
  65. package/apps/main/eslint.config.mjs +3 -0
  66. package/apps/main/generate-routes.mjs +5 -0
  67. package/apps/main/package.json +131 -0
  68. package/apps/main/playwright.config.ts +23 -0
  69. package/apps/main/postcss.config.ts +5 -0
  70. package/apps/main/public/bg-dark.svg +10 -0
  71. package/apps/main/public/bg.svg +10 -0
  72. package/apps/main/public/favicon.ico +0 -0
  73. package/apps/main/run.sh +146 -0
  74. package/apps/main/scripts/browser.ts +14 -0
  75. package/apps/main/scripts/db-test-cov.ts +277 -0
  76. package/apps/main/scripts/login.ts +78 -0
  77. package/apps/main/scripts/repl.ts +61 -0
  78. package/apps/main/src/_foo.ts +31 -0
  79. package/apps/main/src/_tests/db.test.ts +19 -0
  80. package/apps/main/src/_tests/mock-db.ts +60 -0
  81. package/apps/main/src/client.tsx +13 -0
  82. package/apps/main/src/clients/loops.ts +13 -0
  83. package/apps/main/src/clients/polar.ts +12 -0
  84. package/apps/main/src/clients/posthog.ts +12 -0
  85. package/apps/main/src/components/chat/chat-context.tsx +99 -0
  86. package/apps/main/src/components/chat/chat-messages.tsx +184 -0
  87. package/apps/main/src/components/chat/chat-status.tsx +140 -0
  88. package/apps/main/src/components/chat/chat.tsx +458 -0
  89. package/apps/main/src/components/chat/citation-modal.tsx +54 -0
  90. package/apps/main/src/components/cta.tsx +21 -0
  91. package/apps/main/src/components/data-display/derived.tsx +40 -0
  92. package/apps/main/src/components/data-display/group-single.tsx +57 -0
  93. package/apps/main/src/components/data-display/group-table.tsx +165 -0
  94. package/apps/main/src/components/data-display/group-wrapper.tsx +54 -0
  95. package/apps/main/src/components/data-display/item.tsx +678 -0
  96. package/apps/main/src/components/error.tsx +45 -0
  97. package/apps/main/src/components/forms/error.tsx +22 -0
  98. package/apps/main/src/components/grid.tsx +7 -0
  99. package/apps/main/src/components/header/container.tsx +73 -0
  100. package/apps/main/src/components/header/header-bar.tsx +102 -0
  101. package/apps/main/src/components/modals/copy-display.tsx +37 -0
  102. package/apps/main/src/components/modals/copy-form.tsx +152 -0
  103. package/apps/main/src/components/modals/duplicate-workflow.tsx +89 -0
  104. package/apps/main/src/components/modals/field-correction.tsx +323 -0
  105. package/apps/main/src/components/modals/form-viewer.tsx +126 -0
  106. package/apps/main/src/components/modals/modals.tsx +44 -0
  107. package/apps/main/src/components/modals/new-deal.tsx +78 -0
  108. package/apps/main/src/components/modals/new-form.tsx +133 -0
  109. package/apps/main/src/components/modals/new-pipeline.tsx +70 -0
  110. package/apps/main/src/components/modals/new-submission.tsx +321 -0
  111. package/apps/main/src/components/modals/new-workflow.tsx +342 -0
  112. package/apps/main/src/components/modals/transformation-sources-modal.tsx +157 -0
  113. package/apps/main/src/components/modals/view-report.tsx +193 -0
  114. package/apps/main/src/components/not-found.tsx +14 -0
  115. package/apps/main/src/components/search/search-bar.tsx +178 -0
  116. package/apps/main/src/components/sheet-selector.tsx +135 -0
  117. package/apps/main/src/components/side-panel/doc-list.tsx +480 -0
  118. package/apps/main/src/components/sidebar/admin-sidebar.tsx +75 -0
  119. package/apps/main/src/components/sidebar/app-sidebar.tsx +417 -0
  120. package/apps/main/src/components/sidebar/model-select.tsx +134 -0
  121. package/apps/main/src/components/sidebar/settings-sidebar.tsx +132 -0
  122. package/apps/main/src/components/sidebar/sidebar-right.tsx +22 -0
  123. package/apps/main/src/components/sidebar/stop-impersonate.tsx +21 -0
  124. package/apps/main/src/components/svg/loading.tsx +33 -0
  125. package/apps/main/src/components/theme-selector.tsx +43 -0
  126. package/apps/main/src/components/unsaved-badge.tsx +19 -0
  127. package/apps/main/src/components/upload/file-upload.tsx +354 -0
  128. package/apps/main/src/fns/submission-groups.ts +28 -0
  129. package/apps/main/src/fns/submission-items.ts +11 -0
  130. package/apps/main/src/global-middleware.ts +16 -0
  131. package/apps/main/src/hooks/use-update-state.ts +18 -0
  132. package/apps/main/src/lib/auth-client.ts +16 -0
  133. package/apps/main/src/lib/auth.test.ts +359 -0
  134. package/apps/main/src/lib/auth.ts +144 -0
  135. package/apps/main/src/lib/billing.ts +23 -0
  136. package/apps/main/src/lib/config-iso.ts +76 -0
  137. package/apps/main/src/lib/config.ts +61 -0
  138. package/apps/main/src/lib/excel.ts +16 -0
  139. package/apps/main/src/lib/feedback-cache.ts +70 -0
  140. package/apps/main/src/lib/logger.ts +44 -0
  141. package/apps/main/src/lib/models.ts +22 -0
  142. package/apps/main/src/lib/not-found.ts +17 -0
  143. package/apps/main/src/lib/pdf.ts +16 -0
  144. package/apps/main/src/lib/tabularize.ts +54 -0
  145. package/apps/main/src/lib/utils.ts +10 -0
  146. package/apps/main/src/lib/zfd.ts +217 -0
  147. package/apps/main/src/middleware.ts +55 -0
  148. package/apps/main/src/routeTree.gen.ts +1255 -0
  149. package/apps/main/src/router.tsx +24 -0
  150. package/apps/main/src/routes/__root.tsx +92 -0
  151. package/apps/main/src/routes/_authed/_app/(dashboard)/index.tsx +227 -0
  152. package/apps/main/src/routes/_authed/_app/agents/$agentId/config.tsx +224 -0
  153. package/apps/main/src/routes/_authed/_app/agents/$agentId/index.tsx +206 -0
  154. package/apps/main/src/routes/_authed/_app/agents/-components/agent-actions-menu.tsx +94 -0
  155. package/apps/main/src/routes/_authed/_app/agents/-components/agent-artifacts.tsx +153 -0
  156. package/apps/main/src/routes/_authed/_app/agents/-components/agent-chat.tsx +220 -0
  157. package/apps/main/src/routes/_authed/_app/agents/-components/agent-history-menu.tsx +81 -0
  158. package/apps/main/src/routes/_authed/_app/agents/-components/agent-model-select.tsx +84 -0
  159. package/apps/main/src/routes/_authed/_app/agents/-components/agent-relevant-items.tsx +226 -0
  160. package/apps/main/src/routes/_authed/_app/agents/-components/agent-upload-button.tsx +298 -0
  161. package/apps/main/src/routes/_authed/_app/agents/-components/context-modal.tsx +187 -0
  162. package/apps/main/src/routes/_authed/_app/agents/-fns.ts +560 -0
  163. package/apps/main/src/routes/_authed/_app/agents/index.tsx +65 -0
  164. package/apps/main/src/routes/_authed/_app/deals/$dealId/$subId/-components/citation-tree.tsx +268 -0
  165. package/apps/main/src/routes/_authed/_app/deals/$dealId/$subId.tsx +655 -0
  166. package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/doc-loading.tsx +37 -0
  167. package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/share-link.tsx +42 -0
  168. package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/submission-card.tsx +89 -0
  169. package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/submission-filter.tsx +193 -0
  170. package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/submissions.tsx +36 -0
  171. package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/summary.tsx +82 -0
  172. package/apps/main/src/routes/_authed/_app/deals/$dealId/-components/upload-doc.tsx +120 -0
  173. package/apps/main/src/routes/_authed/_app/deals/$dealId/-fns.ts +653 -0
  174. package/apps/main/src/routes/_authed/_app/deals/$dealId/index.tsx +259 -0
  175. package/apps/main/src/routes/_authed/_app/deals/$dealId/route.tsx +29 -0
  176. package/apps/main/src/routes/_authed/_app/deals/index.tsx +104 -0
  177. package/apps/main/src/routes/_authed/_app/feedback/index.tsx +639 -0
  178. package/apps/main/src/routes/_authed/_app/feedback/insights.tsx +250 -0
  179. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/blockers-panel.tsx +260 -0
  180. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/manual-input-panel.tsx +301 -0
  181. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/submission-selector-modal.tsx +143 -0
  182. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/-components/upload-doc.tsx +120 -0
  183. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/$runId/index.tsx +1485 -0
  184. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/-components/dag-view.tsx +296 -0
  185. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/-components/step-config-modal.tsx +634 -0
  186. package/apps/main/src/routes/_authed/_app/pipelines/$pipelineId/index.tsx +911 -0
  187. package/apps/main/src/routes/_authed/_app/pipelines/-fns.ts +510 -0
  188. package/apps/main/src/routes/_authed/_app/pipelines/index.tsx +103 -0
  189. package/apps/main/src/routes/_authed/_app/reports/$reportId.tsx +397 -0
  190. package/apps/main/src/routes/_authed/_app/reports/-fns.ts +11 -0
  191. package/apps/main/src/routes/_authed/_app/reports/index.tsx +22 -0
  192. package/apps/main/src/routes/_authed/_app/route.tsx +48 -0
  193. package/apps/main/src/routes/_authed/_app/submissions/-columns.tsx +161 -0
  194. package/apps/main/src/routes/_authed/_app/submissions/-fns.ts +128 -0
  195. package/apps/main/src/routes/_authed/_app/submissions/index.tsx +190 -0
  196. package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/$formId.tsx +542 -0
  197. package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/-components/derived.tsx +154 -0
  198. package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/-components/field.tsx +369 -0
  199. package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/-components/group.tsx +475 -0
  200. package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/index.tsx +263 -0
  201. package/apps/main/src/routes/_authed/_app/workflows/$wfSlug/route.tsx +33 -0
  202. package/apps/main/src/routes/_authed/_app/workflows/-components/form-card.tsx +315 -0
  203. package/apps/main/src/routes/_authed/_app/workflows/index.tsx +86 -0
  204. package/apps/main/src/routes/_authed/admin/index.tsx +12 -0
  205. package/apps/main/src/routes/_authed/admin/route.tsx +42 -0
  206. package/apps/main/src/routes/_authed/admin/users/-columns.tsx +124 -0
  207. package/apps/main/src/routes/_authed/admin/users/-fns.ts +30 -0
  208. package/apps/main/src/routes/_authed/admin/users/index.tsx +29 -0
  209. package/apps/main/src/routes/_authed/catchNotFound.tsx +114 -0
  210. package/apps/main/src/routes/_authed/redirects/forms.$id.tsx +29 -0
  211. package/apps/main/src/routes/_authed/redirects/submissions.$id.tsx +27 -0
  212. package/apps/main/src/routes/_authed/redirects/workflows.$id.tsx +27 -0
  213. package/apps/main/src/routes/_authed/route.tsx +51 -0
  214. package/apps/main/src/routes/_authed/settings/-components/new-api-key.tsx +85 -0
  215. package/apps/main/src/routes/_authed/settings/-components/new-invite.tsx +100 -0
  216. package/apps/main/src/routes/_authed/settings/analytics.tsx +1710 -0
  217. package/apps/main/src/routes/_authed/settings/billing/-components/price-table.tsx +129 -0
  218. package/apps/main/src/routes/_authed/settings/billing/-fns.ts +76 -0
  219. package/apps/main/src/routes/_authed/settings/billing/index.tsx +119 -0
  220. package/apps/main/src/routes/_authed/settings/embed.tsx +337 -0
  221. package/apps/main/src/routes/_authed/settings/index.tsx +12 -0
  222. package/apps/main/src/routes/_authed/settings/keys.tsx +157 -0
  223. package/apps/main/src/routes/_authed/settings/members.tsx +276 -0
  224. package/apps/main/src/routes/_authed/settings/route.tsx +22 -0
  225. package/apps/main/src/routes/_authed/settings/user.tsx +87 -0
  226. package/apps/main/src/routes/_authed/settings/workspace.tsx +206 -0
  227. package/apps/main/src/routes/_public/-components/sign-in-up.tsx +96 -0
  228. package/apps/main/src/routes/_public/embedded.tsx +57 -0
  229. package/apps/main/src/routes/_public/invite.$inviteId.tsx +143 -0
  230. package/apps/main/src/routes/_public/no-access.tsx +38 -0
  231. package/apps/main/src/routes/_public/no-invite.tsx +39 -0
  232. package/apps/main/src/routes/_public/otp.tsx +103 -0
  233. package/apps/main/src/routes/_public/route.tsx +15 -0
  234. package/apps/main/src/routes/_public/sign-in.tsx +111 -0
  235. package/apps/main/src/routes/_public/sign-up.tsx +114 -0
  236. package/apps/main/src/routes/api/auth/$.ts +11 -0
  237. package/apps/main/src/routes/api/billing/paid.ts +42 -0
  238. package/apps/main/src/routes/api/billing/webhooks.ts +70 -0
  239. package/apps/main/src/routes/api/chat/agent.ts +40 -0
  240. package/apps/main/src/routes/api/chat/key.ts +42 -0
  241. package/apps/main/src/routes/api/chat/member.ts +35 -0
  242. package/apps/main/src/routes/api/test/index.ts +19 -0
  243. package/apps/main/src/server.tsx +6 -0
  244. package/apps/main/src/styles/app.css +23 -0
  245. package/apps/main/src/vite-env.d.ts +7 -0
  246. package/apps/main/test.http +6 -0
  247. package/apps/main/tsconfig.json +17 -0
  248. package/apps/main/vite.config.ts +24 -0
  249. package/apps/main/vitest.config.js +17 -0
  250. package/apps/mcp/README.md +171 -0
  251. package/apps/mcp/eslint.config.mjs +3 -0
  252. package/apps/mcp/package.json +37 -0
  253. package/apps/mcp/src/index.ts +414 -0
  254. package/apps/mcp/tsconfig.json +19 -0
  255. package/apps/mcp/vite.config.ts +22 -0
  256. package/apps/posthog-proxy/index.html +9 -0
  257. package/apps/workers/.prettierignore +7 -0
  258. package/apps/workers/.prettierrc.js +3 -0
  259. package/apps/workers/dotenvx-safe.sh +11 -0
  260. package/apps/workers/eslint.config.mjs +3 -0
  261. package/apps/workers/package.json +65 -0
  262. package/apps/workers/src/lib/config.ts +7 -0
  263. package/apps/workers/src/lib/messages.ts +0 -0
  264. package/apps/workers/src/lib/posthog.ts +25 -0
  265. package/apps/workers/src/main.ts +58 -0
  266. package/apps/workers/src/workflows/extraction.ts +866 -0
  267. package/apps/workers/src/workflows/index.ts +3 -0
  268. package/apps/workers/src/workflows/pipeline-dag.ts +210 -0
  269. package/apps/workers/src/workflows/pipeline-steps.ts +1393 -0
  270. package/apps/workers/tsconfig.json +16 -0
  271. package/apps/workers/vite.config.ts +35 -0
  272. package/docs/CHANGELOG.md +84 -0
  273. package/docs/agent-templates-and-runs.md +859 -0
  274. package/docs/aws-migration-plan.md +267 -0
  275. package/docs/impl-p0-form-builder-improvements.md +683 -0
  276. package/docs/on-prem-deployment-spec.docx +0 -0
  277. package/docs/on-prem-deployment-spec.md +378 -0
  278. package/docs/prd-form-builder-strategy.md +1120 -0
  279. package/docs/widget-ng-apf-packaging-spec.md +43 -0
  280. package/infra/k8s/charts/seadotdev/Chart.yaml +6 -0
  281. package/infra/k8s/charts/seadotdev/templates/_helpers.tpl +27 -0
  282. package/infra/k8s/charts/seadotdev/templates/api-v2.yaml +105 -0
  283. package/infra/k8s/charts/seadotdev/templates/external-secrets.yaml +83 -0
  284. package/infra/k8s/charts/seadotdev/templates/ingress.yaml +54 -0
  285. package/infra/k8s/charts/seadotdev/templates/main-app.yaml +104 -0
  286. package/infra/k8s/charts/seadotdev/templates/workers.yaml +182 -0
  287. package/infra/k8s/charts/seadotdev/values.yaml +143 -0
  288. package/infra/terraform/main.tf +399 -0
  289. package/libs/ai/.prettierignore +2 -0
  290. package/libs/ai/.prettierrc.js +5 -0
  291. package/libs/ai/README.md +139 -0
  292. package/libs/ai/eslint.config.mjs +3 -0
  293. package/libs/ai/package.json +42 -0
  294. package/libs/ai/src/index.ts +5 -0
  295. package/libs/ai/src/models.ts +19 -0
  296. package/libs/ai/src/rag/index.ts +1 -0
  297. package/libs/ai/src/rag/rag.test.ts +99 -0
  298. package/libs/ai/src/rag/rag.ts +510 -0
  299. package/libs/ai/tsconfig.json +21 -0
  300. package/libs/ai/vite.config.ts +38 -0
  301. package/libs/cache/.prettierignore +2 -0
  302. package/libs/cache/eslint.config.mjs +3 -0
  303. package/libs/cache/package.json +35 -0
  304. package/libs/cache/src/feedback.ts +77 -0
  305. package/libs/cache/src/index.ts +2 -0
  306. package/libs/cache/tsconfig.json +19 -0
  307. package/libs/cache/vite.config.ts +36 -0
  308. package/libs/clients/.prettierignore +6 -0
  309. package/libs/clients/eslint.config.mjs +3 -0
  310. package/libs/clients/package.json +59 -0
  311. package/libs/clients/src/azure.ts +249 -0
  312. package/libs/clients/src/gcp.ts +220 -0
  313. package/libs/clients/src/hatchet.ts +86 -0
  314. package/libs/clients/src/index.ts +8 -0
  315. package/libs/clients/src/loops.ts +86 -0
  316. package/libs/clients/src/polar.ts +77 -0
  317. package/libs/clients/src/posthog.ts +55 -0
  318. package/libs/clients/tsconfig.json +19 -0
  319. package/libs/clients/vite.config.ts +35 -0
  320. package/libs/config/.prettierignore +6 -0
  321. package/libs/config/.prettierrc.js +12 -0
  322. package/libs/config/eslint.config.mjs +3 -0
  323. package/libs/config/package.json +50 -0
  324. package/libs/config/src/azure.ts +54 -0
  325. package/libs/config/src/db.ts +18 -0
  326. package/libs/config/src/gcp.ts +53 -0
  327. package/libs/config/src/google.ts +17 -0
  328. package/libs/config/src/hatchet.ts +20 -0
  329. package/libs/config/src/index.ts +108 -0
  330. package/libs/config/src/llm.ts +17 -0
  331. package/libs/config/src/polar.ts +24 -0
  332. package/libs/config/src/util.ts +8 -0
  333. package/libs/config/src/vercel.ts +26 -0
  334. package/libs/config/tsconfig.json +19 -0
  335. package/libs/config/vite.config.ts +34 -0
  336. package/libs/core/.prettierignore +2 -0
  337. package/libs/core/eslint.config.mjs +3 -0
  338. package/libs/core/package.json +59 -0
  339. package/libs/core/src/chat/derived.ts +97 -0
  340. package/libs/core/src/chat/feedback.ts +293 -0
  341. package/libs/core/src/chat/index.ts +6 -0
  342. package/libs/core/src/chat/model.ts +92 -0
  343. package/libs/core/src/chat/prepare-tools.ts +286 -0
  344. package/libs/core/src/chat/prompts.ts +623 -0
  345. package/libs/core/src/chat/stream.ts +311 -0
  346. package/libs/core/src/chat/summarize.ts +168 -0
  347. package/libs/core/src/chat/tools/agent.ts +403 -0
  348. package/libs/core/src/chat/tools/chart-agent.ts +526 -0
  349. package/libs/core/src/chat/tools/chart-helpers/sandbox.ts +47 -0
  350. package/libs/core/src/chat/tools/chart.ts +86 -0
  351. package/libs/core/src/chat/tools/credit-agent.ts +1383 -0
  352. package/libs/core/src/chat/tools/credit.ts +1435 -0
  353. package/libs/core/src/chat/tools/deep-dive-agent.ts +100 -0
  354. package/libs/core/src/chat/tools/deep-dive.ts +141 -0
  355. package/libs/core/src/chat/tools/form.ts +449 -0
  356. package/libs/core/src/chat/tools/helpers.ts +91 -0
  357. package/libs/core/src/chat/tools/index.ts +42 -0
  358. package/libs/core/src/chat/tools/pipeline-artifact.ts +76 -0
  359. package/libs/core/src/chat/tools/report.ts +40 -0
  360. package/libs/core/src/chat/tools/search.ts +390 -0
  361. package/libs/core/src/chat/tools/submission.ts +227 -0
  362. package/libs/core/src/chat/tools/workflow.ts +684 -0
  363. package/libs/core/src/chat/types.ts +3 -0
  364. package/libs/core/src/data-extraction/classification/azure.ts +168 -0
  365. package/libs/core/src/data-extraction/classification/index.ts +1 -0
  366. package/libs/core/src/data-extraction/dal.ts +246 -0
  367. package/libs/core/src/data-extraction/form-structure-extractor.ts +294 -0
  368. package/libs/core/src/data-extraction/index.ts +4 -0
  369. package/libs/core/src/data-extraction/layout/azure.ts +730 -0
  370. package/libs/core/src/data-extraction/layout/excel.ts +180 -0
  371. package/libs/core/src/data-extraction/layout/gcp.ts +1071 -0
  372. package/libs/core/src/data-extraction/layout/index.ts +266 -0
  373. package/libs/core/src/data-extraction/layout/plaintext.ts +45 -0
  374. package/libs/core/src/data-extraction/models.ts +38 -0
  375. package/libs/core/src/data-extraction/pdf-utils.ts +96 -0
  376. package/libs/core/src/data-extraction/structuring/bank-statement.ts +1182 -0
  377. package/libs/core/src/data-extraction/structuring/custom.ts +495 -0
  378. package/libs/core/src/data-extraction/structuring/index.ts +290 -0
  379. package/libs/core/src/data-extraction/structuring/prompts.ts +69 -0
  380. package/libs/core/src/data-extraction/type-guards.ts +110 -0
  381. package/libs/core/src/data-extraction/types.ts +84 -0
  382. package/libs/core/src/data-extraction/utils.ts +31 -0
  383. package/libs/core/src/data-extraction/validation/bank-statement.ts +127 -0
  384. package/libs/core/src/deals.ts +17 -0
  385. package/libs/core/src/documents.ts +152 -0
  386. package/libs/core/src/index.ts +5 -0
  387. package/libs/core/src/pipelines/display.ts +678 -0
  388. package/libs/core/src/pipelines/execute.ts +2342 -0
  389. package/libs/core/src/pipelines/index.ts +4 -0
  390. package/libs/core/src/pipelines/list.ts +12 -0
  391. package/libs/core/src/pipelines/runs.ts +53 -0
  392. package/libs/core/tsconfig.json +20 -0
  393. package/libs/core/vite.config.ts +56 -0
  394. package/libs/dal/.prettierignore +6 -0
  395. package/libs/dal/.prettierrc.js +12 -0
  396. package/libs/dal/eslint.config.mjs +3 -0
  397. package/libs/dal/package.json +57 -0
  398. package/libs/dal/src/_tests/db.test.ts +19 -0
  399. package/libs/dal/src/_tests/mock-db.ts +60 -0
  400. package/libs/dal/src/api-key.test.ts +397 -0
  401. package/libs/dal/src/api-key.ts +110 -0
  402. package/libs/dal/src/billing.ts +23 -0
  403. package/libs/dal/src/conversation.test.ts +655 -0
  404. package/libs/dal/src/conversation.ts +532 -0
  405. package/libs/dal/src/deal.test.ts +45 -0
  406. package/libs/dal/src/deal.ts +87 -0
  407. package/libs/dal/src/defaults-consumer-lending-uk.ts +33 -0
  408. package/libs/dal/src/defaults-consumer-lending-us.ts +33 -0
  409. package/libs/dal/src/defaults-private-credit.ts +57 -0
  410. package/libs/dal/src/defaults-private-equity.ts +51 -0
  411. package/libs/dal/src/defaults-smb-lending-us.ts +1569 -0
  412. package/libs/dal/src/defaults-sme-lending-uk-express.ts +1527 -0
  413. package/libs/dal/src/defaults-sme-lending-uk.ts +1669 -0
  414. package/libs/dal/src/defaults-types.ts +23 -0
  415. package/libs/dal/src/defaults.ts +550 -0
  416. package/libs/dal/src/document.test.ts +70 -0
  417. package/libs/dal/src/document.ts +192 -0
  418. package/libs/dal/src/feedback.ts +255 -0
  419. package/libs/dal/src/form.test.ts +637 -0
  420. package/libs/dal/src/form.ts +1165 -0
  421. package/libs/dal/src/index.ts +20 -0
  422. package/libs/dal/src/invitation.test.ts +746 -0
  423. package/libs/dal/src/invitation.ts +207 -0
  424. package/libs/dal/src/member.test.ts +185 -0
  425. package/libs/dal/src/member.ts +80 -0
  426. package/libs/dal/src/organization.ts +116 -0
  427. package/libs/dal/src/permission.ts +25 -0
  428. package/libs/dal/src/pipeline.test.ts +388 -0
  429. package/libs/dal/src/pipeline.ts +4222 -0
  430. package/libs/dal/src/report.ts +199 -0
  431. package/libs/dal/src/result.ts +16 -0
  432. package/libs/dal/src/search.ts +172 -0
  433. package/libs/dal/src/session.test.ts +110 -0
  434. package/libs/dal/src/session.ts +31 -0
  435. package/libs/dal/src/submission.test.ts +1304 -0
  436. package/libs/dal/src/submission.ts +1396 -0
  437. package/libs/dal/src/tool.ts +159 -0
  438. package/libs/dal/src/user.ts +16 -0
  439. package/libs/dal/src/workflow.test.ts +89 -0
  440. package/libs/dal/src/workflow.ts +262 -0
  441. package/libs/dal/tsconfig.build.json +4 -0
  442. package/libs/dal/tsconfig.json +22 -0
  443. package/libs/dal/vite.config.ts +34 -0
  444. package/libs/db/.prettierignore +6 -0
  445. package/libs/db/.prettierrc.js +12 -0
  446. package/libs/db/eslint.config.mjs +3 -0
  447. package/libs/db/package.json +52 -0
  448. package/libs/db/src/index.ts +24 -0
  449. package/libs/db/src/relations.ts +549 -0
  450. package/libs/db/src/schema.ts +2 -0
  451. package/libs/db/src/schemas/api.ts +35 -0
  452. package/libs/db/src/schemas/conversations.ts +175 -0
  453. package/libs/db/src/schemas/core.ts +359 -0
  454. package/libs/db/src/schemas/documents.ts +181 -0
  455. package/libs/db/src/schemas/feedback.ts +40 -0
  456. package/libs/db/src/schemas/index.ts +26 -0
  457. package/libs/db/src/schemas/organisations.ts +97 -0
  458. package/libs/db/src/schemas/pipelines.ts +440 -0
  459. package/libs/db/src/schemas/users.ts +95 -0
  460. package/libs/db/src/types.ts +190 -0
  461. package/libs/db/src/utils.ts +14 -0
  462. package/libs/db/tsconfig.json +19 -0
  463. package/libs/db/vite.config.ts +31 -0
  464. package/libs/lint/.prettierignore +6 -0
  465. package/libs/lint/eslint.config.mjs +61 -0
  466. package/libs/lint/package.json +29 -0
  467. package/libs/lint/prettier.config.js +12 -0
  468. package/libs/schemas/.prettierignore +6 -0
  469. package/libs/schemas/.prettierrc.js +12 -0
  470. package/libs/schemas/README.md +15 -0
  471. package/libs/schemas/eslint.config.mjs +3 -0
  472. package/libs/schemas/package.json +67 -0
  473. package/libs/schemas/src/core/chat.ts +67 -0
  474. package/libs/schemas/src/core/core-result.ts +15 -0
  475. package/libs/schemas/src/core/data-extraction.ts +184 -0
  476. package/libs/schemas/src/core/layout.ts +478 -0
  477. package/libs/schemas/src/core/pipeline.ts +128 -0
  478. package/libs/schemas/src/core/submission.ts +97 -0
  479. package/libs/schemas/src/db/account.ts +57 -0
  480. package/libs/schemas/src/db/apiKey.ts +57 -0
  481. package/libs/schemas/src/db/context.ts +33 -0
  482. package/libs/schemas/src/db/conversation.ts +65 -0
  483. package/libs/schemas/src/db/deal.ts +42 -0
  484. package/libs/schemas/src/db/document.ts +103 -0
  485. package/libs/schemas/src/db/documentCitation.ts +58 -0
  486. package/libs/schemas/src/db/documentExtraction.ts +69 -0
  487. package/libs/schemas/src/db/fieldCorrection.ts +85 -0
  488. package/libs/schemas/src/db/form.ts +45 -0
  489. package/libs/schemas/src/db/formField.ts +59 -0
  490. package/libs/schemas/src/db/formGroup.ts +42 -0
  491. package/libs/schemas/src/db/impersonation.ts +39 -0
  492. package/libs/schemas/src/db/index.ts +25 -0
  493. package/libs/schemas/src/db/invitation.ts +42 -0
  494. package/libs/schemas/src/db/member.ts +36 -0
  495. package/libs/schemas/src/db/message.ts +58 -0
  496. package/libs/schemas/src/db/organization.ts +62 -0
  497. package/libs/schemas/src/db/session.ts +48 -0
  498. package/libs/schemas/src/db/submission.ts +54 -0
  499. package/libs/schemas/src/db/submissionGroup.ts +36 -0
  500. package/libs/schemas/src/db/submissionItem.ts +33 -0
  501. package/libs/schemas/src/db/submissionItemVersion.ts +70 -0
  502. package/libs/schemas/src/db/user.ts +51 -0
  503. package/libs/schemas/src/db/utils.ts +3 -0
  504. package/libs/schemas/src/db/verification.ts +36 -0
  505. package/libs/schemas/src/db/workflow.ts +42 -0
  506. package/libs/schemas/src/index.ts +10 -0
  507. package/libs/schemas/tsconfig.json +21 -0
  508. package/libs/schemas/vite.config.ts +38 -0
  509. package/libs/ui/.prettierignore +6 -0
  510. package/libs/ui/.prettierrc.js +12 -0
  511. package/libs/ui/components.json +24 -0
  512. package/libs/ui/eslint.config.mjs +3 -0
  513. package/libs/ui/package.json +142 -0
  514. package/libs/ui/src/components/chart-viz/chart.tsx +255 -0
  515. package/libs/ui/src/components/chart-viz/converters.ts +474 -0
  516. package/libs/ui/src/components/chart-viz/dashboard.tsx +146 -0
  517. package/libs/ui/src/components/chart-viz/index.ts +37 -0
  518. package/libs/ui/src/components/chart-viz/markdown.tsx +344 -0
  519. package/libs/ui/src/components/chart-viz/table.tsx +446 -0
  520. package/libs/ui/src/components/chart-viz/theme-context.tsx +70 -0
  521. package/libs/ui/src/components/chart-viz/themes/dark.ts +98 -0
  522. package/libs/ui/src/components/chart-viz/themes/index.ts +69 -0
  523. package/libs/ui/src/components/chart-viz/themes/light.ts +98 -0
  524. package/libs/ui/src/components/chart-viz/themes/tailwind.ts +326 -0
  525. package/libs/ui/src/components/chart-viz/themes/types.ts +99 -0
  526. package/libs/ui/src/components/chart-viz/tool-display.tsx +150 -0
  527. package/libs/ui/src/components/chart-viz/types.ts +95 -0
  528. package/libs/ui/src/components/doc-viewers/excel/index.tsx +431 -0
  529. package/libs/ui/src/components/doc-viewers/excel/themes.ts +160 -0
  530. package/libs/ui/src/components/doc-viewers/image/index.tsx +410 -0
  531. package/libs/ui/src/components/doc-viewers/pdf/index.tsx +258 -0
  532. package/libs/ui/src/components/doc-viewers/pdf/virtualized-pdf.tsx +556 -0
  533. package/libs/ui/src/components/misc/rel-date.tsx +52 -0
  534. package/libs/ui/src/components/misc/styled-link.tsx +2 -0
  535. package/libs/ui/src/components/table/data-table.tsx +546 -0
  536. package/libs/ui/src/components/table/report-table.tsx +305 -0
  537. package/libs/ui/src/components/table/sortable-column.tsx +34 -0
  538. package/libs/ui/src/components/ui/accordion.tsx +62 -0
  539. package/libs/ui/src/components/ui/alert-dialog.tsx +142 -0
  540. package/libs/ui/src/components/ui/alert.tsx +62 -0
  541. package/libs/ui/src/components/ui/artifact.tsx +118 -0
  542. package/libs/ui/src/components/ui/attachments.tsx +388 -0
  543. package/libs/ui/src/components/ui/avatar.tsx +39 -0
  544. package/libs/ui/src/components/ui/badge.tsx +43 -0
  545. package/libs/ui/src/components/ui/breadcrumb.tsx +102 -0
  546. package/libs/ui/src/components/ui/button-group.tsx +78 -0
  547. package/libs/ui/src/components/ui/button.tsx +79 -0
  548. package/libs/ui/src/components/ui/card.tsx +32 -0
  549. package/libs/ui/src/components/ui/carousel.tsx +228 -0
  550. package/libs/ui/src/components/ui/chain-of-thought.tsx +198 -0
  551. package/libs/ui/src/components/ui/checkbox.tsx +27 -0
  552. package/libs/ui/src/components/ui/citation.tsx +34 -0
  553. package/libs/ui/src/components/ui/code-block.tsx +500 -0
  554. package/libs/ui/src/components/ui/collapsible.tsx +19 -0
  555. package/libs/ui/src/components/ui/command.tsx +161 -0
  556. package/libs/ui/src/components/ui/conversation.tsx +90 -0
  557. package/libs/ui/src/components/ui/dialog.tsx +142 -0
  558. package/libs/ui/src/components/ui/dropdown-menu.tsx +246 -0
  559. package/libs/ui/src/components/ui/highlight.tsx +3 -0
  560. package/libs/ui/src/components/ui/hover-card.tsx +36 -0
  561. package/libs/ui/src/components/ui/inline-citation.tsx +251 -0
  562. package/libs/ui/src/components/ui/input-group.tsx +156 -0
  563. package/libs/ui/src/components/ui/input-otp.tsx +78 -0
  564. package/libs/ui/src/components/ui/input.tsx +21 -0
  565. package/libs/ui/src/components/ui/label.tsx +19 -0
  566. package/libs/ui/src/components/ui/model-selector.tsx +174 -0
  567. package/libs/ui/src/components/ui/multisidebar.tsx +750 -0
  568. package/libs/ui/src/components/ui/popover.tsx +43 -0
  569. package/libs/ui/src/components/ui/progress.tsx +28 -0
  570. package/libs/ui/src/components/ui/reasoning.tsx +178 -0
  571. package/libs/ui/src/components/ui/resizable.tsx +49 -0
  572. package/libs/ui/src/components/ui/scroll-area.tsx +54 -0
  573. package/libs/ui/src/components/ui/select.tsx +171 -0
  574. package/libs/ui/src/components/ui/separator.tsx +26 -0
  575. package/libs/ui/src/components/ui/sheet.tsx +128 -0
  576. package/libs/ui/src/components/ui/shimmer.tsx +53 -0
  577. package/libs/ui/src/components/ui/skeleton.tsx +13 -0
  578. package/libs/ui/src/components/ui/sonner.tsx +23 -0
  579. package/libs/ui/src/components/ui/switch.tsx +26 -0
  580. package/libs/ui/src/components/ui/table.tsx +96 -0
  581. package/libs/ui/src/components/ui/tabs.tsx +52 -0
  582. package/libs/ui/src/components/ui/textarea.tsx +41 -0
  583. package/libs/ui/src/components/ui/tool.tsx +209 -0
  584. package/libs/ui/src/components/ui/tooltip.tsx +58 -0
  585. package/libs/ui/src/components/ui/typography.tsx +113 -0
  586. package/libs/ui/src/fonts/manrope-v15-latin-300.woff2 +0 -0
  587. package/libs/ui/src/fonts/manrope-v15-latin-400.woff2 +0 -0
  588. package/libs/ui/src/fonts/manrope-v15-latin-500.woff2 +0 -0
  589. package/libs/ui/src/fonts/manrope-v15-latin-600.woff2 +0 -0
  590. package/libs/ui/src/hooks/use-mobile.ts +19 -0
  591. package/libs/ui/src/lib/utils.ts +6 -0
  592. package/libs/ui/src/styles/fonts.css +35 -0
  593. package/libs/ui/src/styles/style.css +218 -0
  594. package/libs/ui/tsconfig.json +21 -0
  595. package/libs/ui/vite.config.ts +80 -0
  596. package/libs/ui-lit/README.md +245 -0
  597. package/libs/ui-lit/TESTING_GUIDE.md +296 -0
  598. package/libs/ui-lit/eslint.config.mjs +3 -0
  599. package/libs/ui-lit/package.json +41 -0
  600. package/libs/ui-lit/scripts/build-css.js +43 -0
  601. package/libs/ui-lit/src/components/sea-alert.ts +132 -0
  602. package/libs/ui-lit/src/components/sea-button.ts +95 -0
  603. package/libs/ui-lit/src/components/sea-card.ts +113 -0
  604. package/libs/ui-lit/src/components/sea-input.ts +184 -0
  605. package/libs/ui-lit/src/components/sea-spinner.ts +65 -0
  606. package/libs/ui-lit/src/index.ts +15 -0
  607. package/libs/ui-lit/src/lib/utils.ts +6 -0
  608. package/libs/ui-lit/src/styles/tailwind.css +76 -0
  609. package/libs/ui-lit/src/theme.css +66 -0
  610. package/libs/ui-lit/src/theme.ts +79 -0
  611. package/libs/ui-lit/src/vite-env.d.ts +6 -0
  612. package/libs/ui-lit/tailwind.config.ts +50 -0
  613. package/libs/ui-lit/test.html +289 -0
  614. package/libs/ui-lit/tsconfig.json +23 -0
  615. package/libs/ui-lit/vite.config.ts +31 -0
  616. package/libs/ui-lit/vite.css.config.ts +20 -0
  617. package/libs/util/.prettierignore +6 -0
  618. package/libs/util/.prettierrc.js +12 -0
  619. package/libs/util/eslint.config.mjs +3 -0
  620. package/libs/util/package.json +45 -0
  621. package/libs/util/src/billing.ts +10 -0
  622. package/libs/util/src/data-transform.ts +19 -0
  623. package/libs/util/src/encryption.ts +45 -0
  624. package/libs/util/src/fmt.test.ts +9 -0
  625. package/libs/util/src/fmt.ts +71 -0
  626. package/libs/util/src/fuzzy.ts +47 -0
  627. package/libs/util/src/id.ts +24 -0
  628. package/libs/util/src/invariant.ts +31 -0
  629. package/libs/util/src/sub-name.ts +7 -0
  630. package/libs/util/tsconfig.json +19 -0
  631. package/libs/util/vite.config.ts +34 -0
  632. package/package.json +28 -0
  633. package/packages/widget/.prettierignore +6 -0
  634. package/packages/widget/.prettierrc.js +12 -0
  635. package/packages/widget/README.md +95 -0
  636. package/packages/widget/eslint.config.mjs +11 -0
  637. package/packages/widget/openapi-ts.config.ts +8 -0
  638. package/packages/widget/package.json +89 -0
  639. package/packages/widget/postcss.config.mjs +10 -0
  640. package/packages/widget/src/clients/api/client/client.ts +187 -0
  641. package/packages/widget/src/clients/api/client/index.ts +22 -0
  642. package/packages/widget/src/clients/api/client/types.ts +192 -0
  643. package/packages/widget/src/clients/api/client/utils.ts +394 -0
  644. package/packages/widget/src/clients/api/client.gen.ts +18 -0
  645. package/packages/widget/src/clients/api/core/auth.ts +39 -0
  646. package/packages/widget/src/clients/api/core/bodySerializer.ts +74 -0
  647. package/packages/widget/src/clients/api/core/params.ts +132 -0
  648. package/packages/widget/src/clients/api/core/pathSerializer.ts +169 -0
  649. package/packages/widget/src/clients/api/core/types.ts +80 -0
  650. package/packages/widget/src/clients/api/index.ts +3 -0
  651. package/packages/widget/src/clients/api/sdk.gen.ts +805 -0
  652. package/packages/widget/src/clients/api/types.gen.ts +2085 -0
  653. package/packages/widget/src/components/container.tsx +42 -0
  654. package/packages/widget/src/components/data-display.tsx +384 -0
  655. package/packages/widget/src/components/data-viewer.tsx +311 -0
  656. package/packages/widget/src/components/doc-list.tsx +102 -0
  657. package/packages/widget/src/components/field-correction-modal.tsx +265 -0
  658. package/packages/widget/src/components/header.tsx +71 -0
  659. package/packages/widget/src/components/new-submission.tsx +290 -0
  660. package/packages/widget/src/components/sidebar-right.tsx +19 -0
  661. package/packages/widget/src/components/submission-card.tsx +66 -0
  662. package/packages/widget/src/components/submission-page.tsx +75 -0
  663. package/packages/widget/src/components/upload-doc.tsx +241 -0
  664. package/packages/widget/src/components/widget.tsx +101 -0
  665. package/packages/widget/src/index.tsx +167 -0
  666. package/packages/widget/src/lib/config.ts +2 -0
  667. package/packages/widget/src/lib/util.ts +40 -0
  668. package/packages/widget/src/styles/index.css +5 -0
  669. package/packages/widget/src/styles/tw-properties.css +337 -0
  670. package/packages/widget/src/vite-env.d.ts +3 -0
  671. package/packages/widget/tsconfig.app.json +35 -0
  672. package/packages/widget/tsconfig.json +4 -0
  673. package/packages/widget/tsconfig.node.json +24 -0
  674. package/packages/widget/vite.config.ts +116 -0
  675. package/packages/widget-lit/BOTTLENECKS.md +250 -0
  676. package/packages/widget-lit/IMPLEMENTATION_SUMMARY.md +295 -0
  677. package/packages/widget-lit/README.md +232 -0
  678. package/packages/widget-lit/eslint.config.mjs +3 -0
  679. package/packages/widget-lit/package.json +52 -0
  680. package/packages/widget-lit/src/api-client.ts +230 -0
  681. package/packages/widget-lit/src/api-client.ts.backup +218 -0
  682. package/packages/widget-lit/src/components/sea-chat.ts +382 -0
  683. package/packages/widget-lit/src/components/sea-submission-viewer.ts +267 -0
  684. package/packages/widget-lit/src/components/sea-widget.ts +317 -0
  685. package/packages/widget-lit/src/index.ts +48 -0
  686. package/packages/widget-lit/src/react.ts +58 -0
  687. package/packages/widget-lit/src/style.css +47 -0
  688. package/packages/widget-lit/tsconfig.json +24 -0
  689. package/packages/widget-lit/vite.config.ts +29 -0
  690. package/packages/widget-ng/DEVELOPMENT.md +74 -0
  691. package/packages/widget-ng/README.md +657 -0
  692. package/packages/widget-ng/dev.sh +14 -0
  693. package/packages/widget-ng/eslint.config.mjs +24 -0
  694. package/packages/widget-ng/ng-package.json +9 -0
  695. package/packages/widget-ng/package.json +85 -0
  696. package/packages/widget-ng/src/index.ts +45 -0
  697. package/packages/widget-ng/src/lib/components/sea-chat.component.ts +737 -0
  698. package/packages/widget-ng/src/lib/components/sea-data-viewer.component.ts +2240 -0
  699. package/packages/widget-ng/src/lib/components/sea-deal-form-modal.component.ts +702 -0
  700. package/packages/widget-ng/src/lib/components/sea-document-list.component.ts +350 -0
  701. package/packages/widget-ng/src/lib/components/sea-feedback-modal.component.ts +461 -0
  702. package/packages/widget-ng/src/lib/components/sea-file-upload.component.ts +655 -0
  703. package/packages/widget-ng/src/lib/components/sea-model-selection-modal.component.ts +367 -0
  704. package/packages/widget-ng/src/lib/components/sea-new-submission-modal.component.ts +414 -0
  705. package/packages/widget-ng/src/lib/components/sea-pdf-viewer.component.ts +869 -0
  706. package/packages/widget-ng/src/lib/components/sea-submission-card.component.ts +251 -0
  707. package/packages/widget-ng/src/lib/components/sea-widget.component.ts +684 -0
  708. package/packages/widget-ng/src/lib/models/submission.model.ts +170 -0
  709. package/packages/widget-ng/src/lib/pipes/markdown.pipe.ts +57 -0
  710. package/packages/widget-ng/src/lib/services/api-client.service.ts +715 -0
  711. package/packages/widget-ng/src/lib/services/chat.service.ts +330 -0
  712. package/packages/widget-ng/src/lib/services/config.service.ts +107 -0
  713. package/packages/widget-ng/src/web-component.ts +56 -0
  714. package/packages/widget-ng/tsconfig.json +25 -0
  715. package/packages/widget-ng/tsconfig.lib.json +9 -0
  716. package/packages/widget-ng/vite.config.elements.ts +26 -0
  717. package/packages/widget-ng/vitest.config.ts +19 -0
  718. package/packages/widget-ng/vitest.setup.ts +13 -0
  719. package/pnpm-workspace.yaml +18 -0
  720. package/render.yaml +136 -0
  721. package/scripts/README.md +57 -0
  722. package/scripts/package.json +22 -0
  723. package/scripts/python/.python-version +1 -0
  724. package/scripts/python/README.md +3 -0
  725. package/scripts/python/export-org-data.py +693 -0
  726. package/scripts/python/pyproject.toml +29 -0
  727. package/scripts/python/requirements-dev.lock +36 -0
  728. package/scripts/python/requirements.lock +36 -0
  729. package/scripts/python/src/gen.py +297 -0
  730. package/scripts/python/test.py +34 -0
  731. package/scripts/src/fix-storage-provider-mismatch.ts +239 -0
  732. package/scripts/src/sync-render-yaml.ts +290 -0
  733. package/scripts/src/test-chat-stream.ts +300 -0
  734. package/scripts/src/test-reconciliation.ts +230 -0
  735. package/scripts/tsconfig.json +15 -0
  736. package/tests/angular-test-app/.vscode/extensions.json +4 -0
  737. package/tests/angular-test-app/.vscode/launch.json +13 -0
  738. package/tests/angular-test-app/.vscode/tasks.json +24 -0
  739. package/tests/angular-test-app/README.md +59 -0
  740. package/tests/angular-test-app/angular.json +111 -0
  741. package/tests/angular-test-app/clean-start.sh +14 -0
  742. package/tests/angular-test-app/package.json +36 -0
  743. package/tests/angular-test-app/public/favicon.ico +0 -0
  744. package/tests/angular-test-app/src/app/app.component.ts +220 -0
  745. package/tests/angular-test-app/src/app/app.config.ts +5 -0
  746. package/tests/angular-test-app/src/env.d.ts +13 -0
  747. package/tests/angular-test-app/src/index.html +13 -0
  748. package/tests/angular-test-app/src/main.ts +6 -0
  749. package/tests/angular-test-app/src/styles.css +8 -0
  750. package/tests/angular-test-app/tsconfig.app.json +15 -0
  751. package/tests/angular-test-app/tsconfig.json +27 -0
  752. package/tests/crm-viewer-app/API_INTEGRATION_SUMMARY.md +295 -0
  753. package/tests/crm-viewer-app/CURRENT_ASSETS_FIELDS.md +148 -0
  754. package/tests/crm-viewer-app/FIELD_ID_MAPPING.md +206 -0
  755. package/tests/crm-viewer-app/INTEGRATION_GUIDE.md +309 -0
  756. package/tests/crm-viewer-app/README.md +174 -0
  757. package/tests/crm-viewer-app/REAL_API_INTEGRATION.md +240 -0
  758. package/tests/crm-viewer-app/UPDATED_IMPLEMENTATION.md +279 -0
  759. package/tests/crm-viewer-app/angular.json +114 -0
  760. package/tests/crm-viewer-app/package.json +35 -0
  761. package/tests/crm-viewer-app/src/app/app.component.ts +534 -0
  762. package/tests/crm-viewer-app/src/app/citation.service.ts +316 -0
  763. package/tests/crm-viewer-app/src/env.d.ts +16 -0
  764. package/tests/crm-viewer-app/src/index.html +19 -0
  765. package/tests/crm-viewer-app/src/main.ts +7 -0
  766. package/tests/crm-viewer-app/src/styles.css +409 -0
  767. package/tests/crm-viewer-app/src/template.html +2678 -0
  768. package/tests/crm-viewer-app/tsconfig.app.json +15 -0
  769. package/tests/crm-viewer-app/tsconfig.json +27 -0
  770. package/tests/e2e/package.json +17 -0
  771. package/tests/e2e/playwright.config.ts +75 -0
  772. package/tests/e2e/tests/api/health.spec.ts +10 -0
  773. package/tests/e2e/tests/app/example.spec.ts +10 -0
  774. package/tests/widget-test-app/.prettierignore +6 -0
  775. package/tests/widget-test-app/README.md +48 -0
  776. package/tests/widget-test-app/index.html +12 -0
  777. package/tests/widget-test-app/package.json +24 -0
  778. package/tests/widget-test-app/src/App.css +192 -0
  779. package/tests/widget-test-app/src/App.tsx +80 -0
  780. package/tests/widget-test-app/src/main.tsx +9 -0
  781. package/tests/widget-test-app/src/vite-env.d.ts +4 -0
  782. package/tests/widget-test-app/tsconfig.json +25 -0
  783. package/tests/widget-test-app/tsconfig.node.json +11 -0
  784. 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 |