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