@intelligo-dev/core 1.0.0-beta.1 → 1.0.0-beta.14

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 (356) hide show
  1. package/NOTICE +6 -0
  2. package/README.md +102 -0
  3. package/dist/attachments/errors.d.ts +7 -0
  4. package/dist/attachments/errors.d.ts.map +1 -0
  5. package/dist/attachments/errors.js +11 -0
  6. package/dist/attachments/errors.js.map +1 -0
  7. package/dist/attachments/index.d.ts +8 -0
  8. package/dist/attachments/index.d.ts.map +1 -0
  9. package/dist/attachments/index.js +7 -0
  10. package/dist/attachments/index.js.map +1 -0
  11. package/dist/attachments/service.d.ts +45 -0
  12. package/dist/attachments/service.d.ts.map +1 -0
  13. package/dist/attachments/service.js +100 -0
  14. package/dist/attachments/service.js.map +1 -0
  15. package/dist/attachments/types.d.ts +6 -0
  16. package/dist/attachments/types.d.ts.map +1 -0
  17. package/dist/attachments/types.js +2 -0
  18. package/dist/attachments/types.js.map +1 -0
  19. package/dist/conversations/errors.d.ts +2 -8
  20. package/dist/conversations/errors.d.ts.map +1 -1
  21. package/dist/conversations/errors.js +2 -8
  22. package/dist/conversations/errors.js.map +1 -1
  23. package/dist/conversations/index.d.ts +4 -12
  24. package/dist/conversations/index.d.ts.map +1 -1
  25. package/dist/conversations/index.js +2 -11
  26. package/dist/conversations/index.js.map +1 -1
  27. package/dist/conversations/service.d.ts +49 -61
  28. package/dist/conversations/service.d.ts.map +1 -1
  29. package/dist/conversations/service.js +110 -83
  30. package/dist/conversations/service.js.map +1 -1
  31. package/dist/conversations/types.d.ts +1 -4
  32. package/dist/conversations/types.d.ts.map +1 -1
  33. package/dist/conversations/types.js +0 -3
  34. package/dist/conversations/types.js.map +1 -1
  35. package/dist/db/client.d.ts +21 -10
  36. package/dist/db/client.d.ts.map +1 -1
  37. package/dist/db/client.js +43 -18
  38. package/dist/db/client.js.map +1 -1
  39. package/dist/db/index.d.ts +3 -3
  40. package/dist/db/index.d.ts.map +1 -1
  41. package/dist/db/index.js +3 -7
  42. package/dist/db/index.js.map +1 -1
  43. package/dist/db/schema/agents.d.ts +14 -51
  44. package/dist/db/schema/agents.d.ts.map +1 -1
  45. package/dist/db/schema/agents.js +9 -21
  46. package/dist/db/schema/agents.js.map +1 -1
  47. package/dist/db/schema/ai.d.ts +86 -1556
  48. package/dist/db/schema/ai.d.ts.map +1 -1
  49. package/dist/db/schema/ai.js +32 -236
  50. package/dist/db/schema/ai.js.map +1 -1
  51. package/dist/db/schema/auth.d.ts +5 -34
  52. package/dist/db/schema/auth.d.ts.map +1 -1
  53. package/dist/db/schema/auth.js +25 -56
  54. package/dist/db/schema/auth.js.map +1 -1
  55. package/dist/db/schema/billing.d.ts +339 -105
  56. package/dist/db/schema/billing.d.ts.map +1 -1
  57. package/dist/db/schema/billing.js +99 -58
  58. package/dist/db/schema/billing.js.map +1 -1
  59. package/dist/db/schema/feature-flags.d.ts +3 -12
  60. package/dist/db/schema/feature-flags.d.ts.map +1 -1
  61. package/dist/db/schema/feature-flags.js +3 -12
  62. package/dist/db/schema/feature-flags.js.map +1 -1
  63. package/dist/db/schema/identity.d.ts +12 -274
  64. package/dist/db/schema/identity.d.ts.map +1 -1
  65. package/dist/db/schema/identity.js +19 -104
  66. package/dist/db/schema/identity.js.map +1 -1
  67. package/dist/db/schema/index.d.ts +8 -15
  68. package/dist/db/schema/index.d.ts.map +1 -1
  69. package/dist/db/schema/index.js +12 -42
  70. package/dist/db/schema/index.js.map +1 -1
  71. package/dist/db/schema/notifications.d.ts +3 -17
  72. package/dist/db/schema/notifications.d.ts.map +1 -1
  73. package/dist/db/schema/notifications.js +3 -17
  74. package/dist/db/schema/notifications.js.map +1 -1
  75. package/dist/db/schema/usage.d.ts +94 -77
  76. package/dist/db/schema/usage.d.ts.map +1 -1
  77. package/dist/db/schema/usage.js +59 -89
  78. package/dist/db/schema/usage.js.map +1 -1
  79. package/dist/db/validate.d.ts +2 -11
  80. package/dist/db/validate.d.ts.map +1 -1
  81. package/dist/db/validate.js +6 -17
  82. package/dist/db/validate.js.map +1 -1
  83. package/dist/db/workspace-queries.d.ts +5 -29
  84. package/dist/db/workspace-queries.d.ts.map +1 -1
  85. package/dist/db/workspace-queries.js +5 -29
  86. package/dist/db/workspace-queries.js.map +1 -1
  87. package/dist/documents/classifier.d.ts +5 -12
  88. package/dist/documents/classifier.d.ts.map +1 -1
  89. package/dist/documents/classifier.js +16 -16
  90. package/dist/documents/classifier.js.map +1 -1
  91. package/dist/documents/errors.d.ts +2 -10
  92. package/dist/documents/errors.d.ts.map +1 -1
  93. package/dist/documents/errors.js +2 -10
  94. package/dist/documents/errors.js.map +1 -1
  95. package/dist/documents/index.d.ts +4 -13
  96. package/dist/documents/index.d.ts.map +1 -1
  97. package/dist/documents/index.js +3 -12
  98. package/dist/documents/index.js.map +1 -1
  99. package/dist/documents/service.d.ts +19 -26
  100. package/dist/documents/service.d.ts.map +1 -1
  101. package/dist/documents/service.js +44 -38
  102. package/dist/documents/service.js.map +1 -1
  103. package/dist/documents/types.d.ts +6 -10
  104. package/dist/documents/types.d.ts.map +1 -1
  105. package/dist/documents/types.js +0 -3
  106. package/dist/documents/types.js.map +1 -1
  107. package/dist/email/brand.d.ts +17 -0
  108. package/dist/email/brand.d.ts.map +1 -0
  109. package/dist/email/brand.js +9 -0
  110. package/dist/email/brand.js.map +1 -0
  111. package/dist/email/index.d.ts +4 -4
  112. package/dist/email/index.js +4 -4
  113. package/dist/email/provider.d.ts +1 -7
  114. package/dist/email/provider.d.ts.map +1 -1
  115. package/dist/email/provider.js +10 -19
  116. package/dist/email/provider.js.map +1 -1
  117. package/dist/email/send.d.ts +12 -12
  118. package/dist/email/send.d.ts.map +1 -1
  119. package/dist/email/send.js +5 -19
  120. package/dist/email/send.js.map +1 -1
  121. package/dist/email/senders.d.ts +17 -30
  122. package/dist/email/senders.d.ts.map +1 -1
  123. package/dist/email/senders.js +33 -47
  124. package/dist/email/senders.js.map +1 -1
  125. package/dist/email/templates/base-layout.d.ts +1 -1
  126. package/dist/email/templates/base-layout.d.ts.map +1 -1
  127. package/dist/email/templates/base-layout.js +4 -6
  128. package/dist/email/templates/base-layout.js.map +1 -1
  129. package/dist/email/templates/index.d.ts +10 -10
  130. package/dist/email/templates/index.d.ts.map +1 -1
  131. package/dist/email/templates/index.js +10 -16
  132. package/dist/email/templates/index.js.map +1 -1
  133. package/dist/email/templates/password-reset.d.ts +2 -2
  134. package/dist/email/templates/password-reset.d.ts.map +1 -1
  135. package/dist/email/templates/password-reset.js +10 -22
  136. package/dist/email/templates/password-reset.js.map +1 -1
  137. package/dist/email/templates/payment-failed.d.ts +2 -2
  138. package/dist/email/templates/payment-failed.d.ts.map +1 -1
  139. package/dist/email/templates/payment-failed.js +11 -24
  140. package/dist/email/templates/payment-failed.js.map +1 -1
  141. package/dist/email/templates/quota-warning.d.ts +4 -4
  142. package/dist/email/templates/quota-warning.d.ts.map +1 -1
  143. package/dist/email/templates/quota-warning.js +19 -39
  144. package/dist/email/templates/quota-warning.js.map +1 -1
  145. package/dist/email/templates/subscription-confirmed.d.ts +2 -2
  146. package/dist/email/templates/subscription-confirmed.d.ts.map +1 -1
  147. package/dist/email/templates/subscription-confirmed.js +13 -28
  148. package/dist/email/templates/subscription-confirmed.js.map +1 -1
  149. package/dist/email/templates/trial-expiry.d.ts +2 -2
  150. package/dist/email/templates/trial-expiry.d.ts.map +1 -1
  151. package/dist/email/templates/trial-expiry.js +12 -36
  152. package/dist/email/templates/trial-expiry.js.map +1 -1
  153. package/dist/email/templates/trial-warning.d.ts +2 -2
  154. package/dist/email/templates/trial-warning.d.ts.map +1 -1
  155. package/dist/email/templates/trial-warning.js +15 -32
  156. package/dist/email/templates/trial-warning.js.map +1 -1
  157. package/dist/email/templates/verify-email.d.ts +2 -2
  158. package/dist/email/templates/verify-email.d.ts.map +1 -1
  159. package/dist/email/templates/verify-email.js +10 -22
  160. package/dist/email/templates/verify-email.js.map +1 -1
  161. package/dist/email/templates/welcome.d.ts +2 -2
  162. package/dist/email/templates/welcome.d.ts.map +1 -1
  163. package/dist/email/templates/welcome.js +13 -20
  164. package/dist/email/templates/welcome.js.map +1 -1
  165. package/dist/email/templates/workspace-invitation.d.ts +2 -2
  166. package/dist/email/templates/workspace-invitation.d.ts.map +1 -1
  167. package/dist/email/templates/workspace-invitation.js +12 -26
  168. package/dist/email/templates/workspace-invitation.js.map +1 -1
  169. package/dist/env.d.ts +5 -10
  170. package/dist/env.d.ts.map +1 -1
  171. package/dist/env.js +41 -31
  172. package/dist/env.js.map +1 -1
  173. package/dist/identity/audit.d.ts +11 -24
  174. package/dist/identity/audit.d.ts.map +1 -1
  175. package/dist/identity/audit.js +13 -27
  176. package/dist/identity/audit.js.map +1 -1
  177. package/dist/identity/errors.d.ts +4 -12
  178. package/dist/identity/errors.d.ts.map +1 -1
  179. package/dist/identity/errors.js +2 -8
  180. package/dist/identity/errors.js.map +1 -1
  181. package/dist/identity/index.d.ts +6 -13
  182. package/dist/identity/index.d.ts.map +1 -1
  183. package/dist/identity/index.js +5 -12
  184. package/dist/identity/index.js.map +1 -1
  185. package/dist/identity/service.d.ts +29 -47
  186. package/dist/identity/service.d.ts.map +1 -1
  187. package/dist/identity/service.js +107 -79
  188. package/dist/identity/service.js.map +1 -1
  189. package/dist/identity/types.d.ts +28 -4
  190. package/dist/identity/types.d.ts.map +1 -1
  191. package/dist/identity/types.js +0 -3
  192. package/dist/identity/types.js.map +1 -1
  193. package/dist/index.d.ts +1 -2
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +3 -10
  196. package/dist/index.js.map +1 -1
  197. package/dist/logger.d.ts +7 -18
  198. package/dist/logger.d.ts.map +1 -1
  199. package/dist/logger.js +45 -49
  200. package/dist/logger.js.map +1 -1
  201. package/dist/money.d.ts +95 -0
  202. package/dist/money.d.ts.map +1 -0
  203. package/dist/money.js +208 -0
  204. package/dist/money.js.map +1 -0
  205. package/dist/notifications/index.d.ts +9 -43
  206. package/dist/notifications/index.d.ts.map +1 -1
  207. package/dist/notifications/index.js +9 -49
  208. package/dist/notifications/index.js.map +1 -1
  209. package/dist/notifications/triggers.d.ts +9 -32
  210. package/dist/notifications/triggers.d.ts.map +1 -1
  211. package/dist/notifications/triggers.js +21 -58
  212. package/dist/notifications/triggers.js.map +1 -1
  213. package/dist/notifications/types.d.ts +6 -8
  214. package/dist/notifications/types.d.ts.map +1 -1
  215. package/dist/notifications/types.js +0 -9
  216. package/dist/notifications/types.js.map +1 -1
  217. package/dist/prompt.d.ts +38 -0
  218. package/dist/prompt.d.ts.map +1 -0
  219. package/dist/prompt.js +118 -0
  220. package/dist/prompt.js.map +1 -0
  221. package/dist/registry.d.ts +32 -0
  222. package/dist/registry.d.ts.map +1 -0
  223. package/dist/registry.js +60 -0
  224. package/dist/registry.js.map +1 -0
  225. package/dist/request-context.d.ts +49 -0
  226. package/dist/request-context.d.ts.map +1 -0
  227. package/dist/request-context.js +100 -0
  228. package/dist/request-context.js.map +1 -0
  229. package/dist/storage/index.d.ts +65 -0
  230. package/dist/storage/index.d.ts.map +1 -0
  231. package/dist/storage/index.js +109 -0
  232. package/dist/storage/index.js.map +1 -0
  233. package/package.json +74 -24
  234. package/src/attachments/errors.ts +18 -0
  235. package/src/attachments/index.ts +22 -0
  236. package/src/attachments/service.ts +178 -0
  237. package/src/attachments/types.ts +6 -0
  238. package/src/conversations/errors.ts +45 -0
  239. package/src/conversations/index.ts +39 -0
  240. package/src/conversations/service.ts +594 -0
  241. package/src/conversations/types.ts +15 -0
  242. package/src/db/client.ts +91 -0
  243. package/src/db/index.ts +3 -0
  244. package/src/db/migrations/0000_baseline.sql +652 -0
  245. package/src/db/migrations/0001_reconcile_chain_built_databases.sql +53 -0
  246. package/src/db/migrations/0002_webhook_claim_lease.sql +1 -0
  247. package/src/db/migrations/0003_local_payments.sql +18 -0
  248. package/src/db/migrations/README.md +103 -36
  249. package/src/db/migrations/legacy-chain.json +206 -0
  250. package/src/db/migrations/meta/0000_snapshot.json +4182 -157
  251. package/src/db/migrations/meta/0002_snapshot.json +2478 -368
  252. package/src/db/migrations/meta/0003_snapshot.json +2567 -554
  253. package/src/db/migrations/meta/_journal.json +8 -274
  254. package/src/db/schema/agents.ts +57 -0
  255. package/src/db/schema/ai.ts +174 -0
  256. package/src/db/schema/auth.ts +183 -0
  257. package/src/db/schema/billing.ts +245 -0
  258. package/src/db/schema/feature-flags.ts +20 -0
  259. package/src/db/schema/identity.ts +250 -0
  260. package/src/db/schema/index.ts +12 -0
  261. package/src/db/schema/notifications.ts +31 -0
  262. package/src/db/schema/usage.ts +269 -0
  263. package/src/db/validate.ts +63 -0
  264. package/src/db/workspace-queries.ts +64 -0
  265. package/src/documents/classifier.ts +61 -0
  266. package/src/documents/errors.ts +44 -0
  267. package/src/documents/index.ts +24 -0
  268. package/src/documents/service.ts +256 -0
  269. package/src/documents/types.ts +24 -0
  270. package/src/email/brand.ts +24 -0
  271. package/src/email/index.ts +19 -0
  272. package/src/email/provider.ts +278 -0
  273. package/src/email/send.ts +169 -0
  274. package/src/email/senders.ts +292 -0
  275. package/src/email/templates/base-layout.tsx +145 -0
  276. package/src/email/templates/index.ts +28 -0
  277. package/src/email/templates/password-reset.tsx +72 -0
  278. package/src/email/templates/payment-failed.tsx +77 -0
  279. package/src/email/templates/quota-warning.tsx +118 -0
  280. package/src/email/templates/subscription-confirmed.tsx +91 -0
  281. package/src/email/templates/trial-expiry.tsx +124 -0
  282. package/src/email/templates/trial-warning.tsx +104 -0
  283. package/src/email/templates/verify-email.tsx +72 -0
  284. package/src/email/templates/welcome.tsx +64 -0
  285. package/src/email/templates/workspace-invitation.tsx +105 -0
  286. package/src/env.ts +180 -0
  287. package/src/identity/audit.ts +65 -0
  288. package/src/identity/errors.ts +44 -0
  289. package/src/identity/index.ts +29 -0
  290. package/src/identity/service.ts +303 -0
  291. package/src/identity/types.ts +58 -0
  292. package/src/index.ts +4 -0
  293. package/src/logger.ts +198 -0
  294. package/src/money.ts +270 -0
  295. package/src/notifications/index.ts +112 -0
  296. package/src/notifications/triggers.ts +158 -0
  297. package/src/notifications/types.ts +26 -0
  298. package/src/prompt.ts +142 -0
  299. package/src/registry.ts +75 -0
  300. package/src/request-context.ts +137 -0
  301. package/src/storage/index.ts +153 -0
  302. package/dist/db/schema/rag.d.ts +0 -171
  303. package/dist/db/schema/rag.d.ts.map +0 -1
  304. package/dist/db/schema/rag.js +0 -42
  305. package/dist/db/schema/rag.js.map +0 -1
  306. package/src/db/migrations/0000_sharp_night_nurse.sql +0 -52
  307. package/src/db/migrations/0001_hesitant_vapor.sql +0 -40
  308. package/src/db/migrations/0002_numerous_lady_vermin.sql +0 -235
  309. package/src/db/migrations/0003_mighty_jean_grey.sql +0 -37
  310. package/src/db/migrations/0004_cynical_grandmaster.sql +0 -2
  311. package/src/db/migrations/0005_careful_switch.sql +0 -8
  312. package/src/db/migrations/0006_tense_blue_marvel.sql +0 -16
  313. package/src/db/migrations/0007_next_squadron_sinister.sql +0 -1
  314. package/src/db/migrations/0008_powerful_scream.sql +0 -39
  315. package/src/db/migrations/0009_sad_ink.sql +0 -1
  316. package/src/db/migrations/0010_shocking_omega_flight.sql +0 -2
  317. package/src/db/migrations/0011_ambiguous_otto_octavius.sql +0 -151
  318. package/src/db/migrations/0011_hnsw_vector_index.sql +0 -17
  319. package/src/db/migrations/0012_user_profiles.sql +0 -30
  320. package/src/db/migrations/0013_trending_seasonal_columns.sql +0 -9
  321. package/src/db/migrations/0014_add_product_type_to_agents.sql +0 -6
  322. package/src/db/migrations/0015_new_v1_tables.sql +0 -149
  323. package/src/db/migrations/0016_document_types.sql +0 -30
  324. package/src/db/migrations/0017_document_metadata.sql +0 -2
  325. package/src/db/migrations/0018_identity_graph.sql +0 -200
  326. package/src/db/migrations/0019_db_driven_prompts.sql +0 -20
  327. package/src/db/migrations/0020_pending_extractions.sql +0 -35
  328. package/src/db/migrations/0021_rag_documents.sql +0 -39
  329. package/src/db/migrations/0022_user_quotas_usage_jsonb.sql +0 -70
  330. package/src/db/migrations/0023_user_facts_user_scoped_unique.sql +0 -17
  331. package/src/db/migrations/0024_user_memories_hnsw.sql +0 -23
  332. package/src/db/migrations/0025_audit_trigger_errcode.sql +0 -21
  333. package/src/db/migrations/0026_user_profile_snapshots_composite_pk.sql +0 -17
  334. package/src/db/migrations/0027_billing_settings_mnt_columns.sql +0 -54
  335. package/src/db/migrations/0028_trial_credits_normalized_email.sql +0 -37
  336. package/src/db/migrations/0029_usage_records_conversation_idx.sql +0 -13
  337. package/src/db/migrations/0030_pending_extractions_composite_idx.sql +0 -11
  338. package/src/db/migrations/0031_rag_documents_hnsw.sql +0 -16
  339. package/src/db/migrations/0032_rate_limit_unique_idx.sql +0 -16
  340. package/src/db/migrations/0033_pending_extractions_partial_idx.sql +0 -18
  341. package/src/db/migrations/0034_rate_limit_count.sql +0 -9
  342. package/src/db/migrations/0035_credit_reservations.sql +0 -24
  343. package/src/db/migrations/0036_executions_audit_jobs.sql +0 -96
  344. package/src/db/migrations/0037_rate_limit_minute_bucket.sql +0 -46
  345. package/src/db/migrations/0038_user_quotas_generic_usage.sql +0 -25
  346. package/src/db/migrations/0039_platform_admin_impersonation.sql +0 -27
  347. package/src/db/migrations/0040_ee_audit_chain.sql +0 -23
  348. package/src/db/migrations/meta/0001_snapshot.json +0 -631
  349. package/src/db/migrations/meta/0004_snapshot.json +0 -2500
  350. package/src/db/migrations/meta/0005_snapshot.json +0 -2548
  351. package/src/db/migrations/meta/0006_snapshot.json +0 -2650
  352. package/src/db/migrations/meta/0007_snapshot.json +0 -2657
  353. package/src/db/migrations/meta/0008_snapshot.json +0 -2719
  354. package/src/db/migrations/meta/0009_snapshot.json +0 -2726
  355. package/src/db/migrations/meta/0010_snapshot.json +0 -2739
  356. package/src/db/migrations/meta/0011_snapshot.json +0 -3886
@@ -1,39 +0,0 @@
1
- -- Step 1: Add workspace_id columns as NULLABLE first to allow backfill
2
- ALTER TABLE "documents" ADD COLUMN "workspace_id" text;--> statement-breakpoint
3
- ALTER TABLE "suggestions" ADD COLUMN "workspace_id" text;--> statement-breakpoint
4
-
5
- -- Step 2: Backfill workspace_id for documents using the member table
6
- -- Each document's user_id maps to an organization via the member table
7
- -- We pick the user's first organization (LIMIT 1) in case of multiple memberships
8
- UPDATE "documents" d
9
- SET workspace_id = (
10
- SELECT m.organization_id
11
- FROM "member" m
12
- WHERE m.user_id = d.user_id
13
- ORDER BY m.created_at ASC
14
- LIMIT 1
15
- )
16
- WHERE d.workspace_id IS NULL;--> statement-breakpoint
17
-
18
- -- Step 3: Backfill workspace_id for suggestions using the member table
19
- UPDATE "suggestions" s
20
- SET workspace_id = (
21
- SELECT m.organization_id
22
- FROM "member" m
23
- WHERE m.user_id = s.user_id
24
- ORDER BY m.created_at ASC
25
- LIMIT 1
26
- )
27
- WHERE s.workspace_id IS NULL;--> statement-breakpoint
28
-
29
- -- Step 4: Set NOT NULL constraint (after backfill ensures no nulls remain)
30
- ALTER TABLE "documents" ALTER COLUMN "workspace_id" SET NOT NULL;--> statement-breakpoint
31
- ALTER TABLE "suggestions" ALTER COLUMN "workspace_id" SET NOT NULL;--> statement-breakpoint
32
-
33
- -- Step 5: Add FK constraints
34
- ALTER TABLE "documents" ADD CONSTRAINT "documents_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
35
- ALTER TABLE "suggestions" ADD CONSTRAINT "suggestions_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
36
-
37
- -- Step 6: Create indexes for performance
38
- CREATE INDEX "documents_workspace_id_idx" ON "documents" USING btree ("workspace_id");--> statement-breakpoint
39
- CREATE INDEX "suggestions_workspace_id_idx" ON "suggestions" USING btree ("workspace_id");
@@ -1 +0,0 @@
1
- ALTER TABLE "usage_records" ADD COLUMN "cost" real DEFAULT 0 NOT NULL;
@@ -1,2 +0,0 @@
1
- ALTER TABLE "agents" ADD COLUMN "feature_key" text;--> statement-breakpoint
2
- ALTER TABLE "agents" ADD COLUMN "color" text DEFAULT 'bg-gray-500' NOT NULL;
@@ -1,151 +0,0 @@
1
- CREATE TABLE "competition_entries" (
2
- "id" text PRIMARY KEY NOT NULL,
3
- "competition_id" text NOT NULL,
4
- "workspace_id" text NOT NULL,
5
- "school_name" text NOT NULL,
6
- "class_name" text NOT NULL,
7
- "assessment_count" integer DEFAULT 0 NOT NULL,
8
- "total_score" integer DEFAULT 0 NOT NULL,
9
- "created_at" timestamp DEFAULT now() NOT NULL,
10
- "updated_at" timestamp DEFAULT now() NOT NULL
11
- );
12
- --> statement-breakpoint
13
- CREATE TABLE "competitions" (
14
- "id" text PRIMARY KEY NOT NULL,
15
- "name" jsonb NOT NULL,
16
- "description" jsonb NOT NULL,
17
- "start_date" timestamp NOT NULL,
18
- "end_date" timestamp NOT NULL,
19
- "is_active" boolean DEFAULT false NOT NULL,
20
- "prize_description" jsonb,
21
- "created_at" timestamp DEFAULT now() NOT NULL,
22
- "updated_at" timestamp DEFAULT now() NOT NULL
23
- );
24
- --> statement-breakpoint
25
- CREATE TABLE "image_generations" (
26
- "id" text PRIMARY KEY NOT NULL,
27
- "user_id" text NOT NULL,
28
- "workspace_id" text NOT NULL,
29
- "tool_id" text NOT NULL,
30
- "prompt" text NOT NULL,
31
- "result_url" text,
32
- "model" text DEFAULT 'gpt-image-1' NOT NULL,
33
- "status" text DEFAULT 'pending' NOT NULL,
34
- "error_message" text,
35
- "created_at" timestamp DEFAULT now() NOT NULL
36
- );
37
- --> statement-breakpoint
38
- CREATE TABLE "image_tools" (
39
- "id" text PRIMARY KEY NOT NULL,
40
- "name" jsonb NOT NULL,
41
- "description" jsonb NOT NULL,
42
- "category" text NOT NULL,
43
- "prompt_template" text NOT NULL,
44
- "model" text DEFAULT 'gpt-image-1' NOT NULL,
45
- "preview_image_url" text,
46
- "is_active" boolean DEFAULT true NOT NULL,
47
- "sort_order" integer DEFAULT 0 NOT NULL,
48
- "is_trending" boolean DEFAULT false NOT NULL,
49
- "is_seasonal" boolean DEFAULT false NOT NULL,
50
- "active_months" integer[],
51
- "season" text,
52
- "created_at" timestamp DEFAULT now() NOT NULL,
53
- "updated_at" timestamp DEFAULT now() NOT NULL
54
- );
55
- --> statement-breakpoint
56
- CREATE TABLE "knowledge_articles" (
57
- "id" text PRIMARY KEY NOT NULL,
58
- "slug" text NOT NULL,
59
- "category" text NOT NULL,
60
- "title" jsonb NOT NULL,
61
- "description" jsonb NOT NULL,
62
- "content" jsonb NOT NULL,
63
- "tags" text[],
64
- "reading_time_minutes" integer DEFAULT 5 NOT NULL,
65
- "sort_order" integer DEFAULT 0 NOT NULL,
66
- "is_published" boolean DEFAULT false NOT NULL,
67
- "created_at" timestamp DEFAULT now() NOT NULL,
68
- "updated_at" timestamp DEFAULT now() NOT NULL
69
- );
70
- --> statement-breakpoint
71
- CREATE TABLE "referral_codes" (
72
- "id" text PRIMARY KEY NOT NULL,
73
- "user_id" text NOT NULL,
74
- "code" text NOT NULL,
75
- "created_at" timestamp DEFAULT now() NOT NULL
76
- );
77
- --> statement-breakpoint
78
- CREATE TABLE "referrals" (
79
- "id" text PRIMARY KEY NOT NULL,
80
- "referrer_id" text NOT NULL,
81
- "referred_user_id" text NOT NULL,
82
- "referral_code_id" text NOT NULL,
83
- "status" text DEFAULT 'pending' NOT NULL,
84
- "completed_at" timestamp,
85
- "created_at" timestamp DEFAULT now() NOT NULL
86
- );
87
- --> statement-breakpoint
88
- CREATE TABLE "shared_reports" (
89
- "id" text PRIMARY KEY NOT NULL,
90
- "user_id" text NOT NULL,
91
- "workspace_id" text NOT NULL,
92
- "report_type" text DEFAULT 'career' NOT NULL,
93
- "report_data" jsonb NOT NULL,
94
- "parent_report_id" text,
95
- "conversation_id" text,
96
- "is_public" boolean DEFAULT true NOT NULL,
97
- "view_count" integer DEFAULT 0 NOT NULL,
98
- "created_at" timestamp DEFAULT now() NOT NULL,
99
- "updated_at" timestamp DEFAULT now() NOT NULL
100
- );
101
- --> statement-breakpoint
102
- CREATE TABLE "user_profiles" (
103
- "id" text PRIMARY KEY NOT NULL,
104
- "user_id" text NOT NULL,
105
- "workspace_id" text NOT NULL,
106
- "product" text DEFAULT 'career' NOT NULL,
107
- "interests" text,
108
- "skills" text,
109
- "education" text,
110
- "goals" text,
111
- "constraints" text,
112
- "completed_phases" text,
113
- "last_assessment_at" timestamp,
114
- "created_at" timestamp DEFAULT now() NOT NULL,
115
- "updated_at" timestamp DEFAULT now() NOT NULL
116
- );
117
- --> statement-breakpoint
118
- ALTER TABLE "agents" ADD COLUMN "product_type" text DEFAULT 'chat' NOT NULL;--> statement-breakpoint
119
- ALTER TABLE "competition_entries" ADD CONSTRAINT "competition_entries_competition_id_competitions_id_fk" FOREIGN KEY ("competition_id") REFERENCES "public"."competitions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
120
- ALTER TABLE "competition_entries" ADD CONSTRAINT "competition_entries_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
121
- ALTER TABLE "image_generations" ADD CONSTRAINT "image_generations_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
122
- ALTER TABLE "image_generations" ADD CONSTRAINT "image_generations_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
123
- ALTER TABLE "image_generations" ADD CONSTRAINT "image_generations_tool_id_image_tools_id_fk" FOREIGN KEY ("tool_id") REFERENCES "public"."image_tools"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
124
- ALTER TABLE "referral_codes" ADD CONSTRAINT "referral_codes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
125
- ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referrer_id_users_id_fk" FOREIGN KEY ("referrer_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
126
- ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referred_user_id_users_id_fk" FOREIGN KEY ("referred_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
127
- ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referral_code_id_referral_codes_id_fk" FOREIGN KEY ("referral_code_id") REFERENCES "public"."referral_codes"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
128
- ALTER TABLE "shared_reports" ADD CONSTRAINT "shared_reports_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
129
- ALTER TABLE "shared_reports" ADD CONSTRAINT "shared_reports_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
130
- ALTER TABLE "user_profiles" ADD CONSTRAINT "user_profiles_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
131
- ALTER TABLE "user_profiles" ADD CONSTRAINT "user_profiles_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
132
- CREATE INDEX "competition_entries_competition_id_idx" ON "competition_entries" USING btree ("competition_id");--> statement-breakpoint
133
- CREATE INDEX "competition_entries_workspace_id_idx" ON "competition_entries" USING btree ("workspace_id");--> statement-breakpoint
134
- CREATE UNIQUE INDEX "competition_entries_competition_workspace_idx" ON "competition_entries" USING btree ("competition_id","workspace_id");--> statement-breakpoint
135
- CREATE INDEX "competitions_is_active_idx" ON "competitions" USING btree ("is_active");--> statement-breakpoint
136
- CREATE INDEX "image_generations_user_id_idx" ON "image_generations" USING btree ("user_id");--> statement-breakpoint
137
- CREATE INDEX "image_generations_workspace_id_idx" ON "image_generations" USING btree ("workspace_id");--> statement-breakpoint
138
- CREATE INDEX "image_generations_tool_id_idx" ON "image_generations" USING btree ("tool_id");--> statement-breakpoint
139
- CREATE INDEX "image_generations_created_at_idx" ON "image_generations" USING btree ("created_at");--> statement-breakpoint
140
- CREATE UNIQUE INDEX "knowledge_articles_slug_idx" ON "knowledge_articles" USING btree ("slug");--> statement-breakpoint
141
- CREATE INDEX "knowledge_articles_category_idx" ON "knowledge_articles" USING btree ("category");--> statement-breakpoint
142
- CREATE UNIQUE INDEX "referral_codes_code_idx" ON "referral_codes" USING btree ("code");--> statement-breakpoint
143
- CREATE UNIQUE INDEX "referral_codes_user_id_idx" ON "referral_codes" USING btree ("user_id");--> statement-breakpoint
144
- CREATE INDEX "referrals_referrer_id_idx" ON "referrals" USING btree ("referrer_id");--> statement-breakpoint
145
- CREATE INDEX "referrals_referred_user_id_idx" ON "referrals" USING btree ("referred_user_id");--> statement-breakpoint
146
- CREATE UNIQUE INDEX "referrals_referred_user_id_unique_idx" ON "referrals" USING btree ("referred_user_id");--> statement-breakpoint
147
- CREATE INDEX "shared_reports_user_id_idx" ON "shared_reports" USING btree ("user_id");--> statement-breakpoint
148
- CREATE INDEX "shared_reports_workspace_id_idx" ON "shared_reports" USING btree ("workspace_id");--> statement-breakpoint
149
- CREATE INDEX "user_profiles_user_id_idx" ON "user_profiles" USING btree ("user_id");--> statement-breakpoint
150
- CREATE UNIQUE INDEX "user_profiles_workspace_user_product_idx" ON "user_profiles" USING btree ("workspace_id","user_id","product");--> statement-breakpoint
151
- CREATE INDEX "votes_message_id_idx" ON "votes" USING btree ("message_id");
@@ -1,17 +0,0 @@
1
- -- HNSW index for fast cosine similarity search on knowledge chunks
2
- -- Required for knowledgeSearch tool to perform semantic vector search efficiently
3
- -- Uses cosine distance operator (<=>) which is the default for text-embedding-3-small
4
- --
5
- -- Run with: psql $DATABASE_URL -f packages/core/src/db/migrations/0011_hnsw_vector_index.sql
6
- -- Or via: cd packages/core && pnpm drizzle-kit push (if using Drizzle migration runner)
7
-
8
- CREATE INDEX IF NOT EXISTS knowledge_chunks_embedding_hnsw_idx
9
- ON knowledge_chunks
10
- USING hnsw (embedding vector_cosine_ops)
11
- WITH (m = 16, ef_construction = 64);
12
-
13
- -- Composite index for product-scoped document lookups
14
- -- Used by knowledgeSearch to filter chunks by product via knowledgeDocuments join
15
- CREATE INDEX IF NOT EXISTS knowledge_documents_product_status_idx
16
- ON knowledge_documents (product, status)
17
- WHERE status = 'ready';
@@ -1,30 +0,0 @@
1
- -- User profiles table for persistent career assessment data
2
- -- Stores profile data that persists across conversations for returning user detection
3
- -- and personalized experiences, scoped per user per workspace per product.
4
- --
5
- -- Run with: psql $DATABASE_URL -f packages/core/src/db/migrations/0012_user_profiles.sql
6
- -- Or via the migration runner in the app bootstrap
7
-
8
- CREATE TABLE IF NOT EXISTS "user_profiles" (
9
- "id" text PRIMARY KEY NOT NULL,
10
- "user_id" text NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
11
- "workspace_id" text NOT NULL REFERENCES "organization"("id") ON DELETE CASCADE,
12
- "product" text NOT NULL DEFAULT 'career',
13
- "interests" text,
14
- "skills" text,
15
- "education" text,
16
- "goals" text,
17
- "constraints" text,
18
- "completed_phases" text,
19
- "last_assessment_at" timestamp,
20
- "created_at" timestamp NOT NULL DEFAULT now(),
21
- "updated_at" timestamp NOT NULL DEFAULT now()
22
- );
23
-
24
- -- Unique composite index: one profile per user per workspace per product
25
- CREATE UNIQUE INDEX IF NOT EXISTS "user_profiles_workspace_user_product_idx"
26
- ON "user_profiles" ("workspace_id", "user_id", "product");
27
-
28
- -- Index for user-based lookups (all profiles for a user)
29
- CREATE INDEX IF NOT EXISTS "user_profiles_user_id_idx"
30
- ON "user_profiles" ("user_id");
@@ -1,9 +0,0 @@
1
- -- Add trending and seasonal columns to image_tools table
2
- -- Phase 61: Schema foundation for trending engine (Phase 62) and seasonal templates (Phase 63)
3
- --
4
- -- Run with: psql $DATABASE_URL -f packages/core/src/db/migrations/0013_trending_seasonal_columns.sql
5
-
6
- ALTER TABLE "image_tools" ADD COLUMN IF NOT EXISTS "is_trending" boolean NOT NULL DEFAULT false;
7
- ALTER TABLE "image_tools" ADD COLUMN IF NOT EXISTS "is_seasonal" boolean NOT NULL DEFAULT false;
8
- ALTER TABLE "image_tools" ADD COLUMN IF NOT EXISTS "active_months" integer[];
9
- ALTER TABLE "image_tools" ADD COLUMN IF NOT EXISTS "season" text;
@@ -1,6 +0,0 @@
1
- -- Add product_type column to agents table
2
- -- Required by Drizzle schema: agents.productType (text, not null, default 'chat')
3
- --
4
- -- Run with: psql $DATABASE_URL -f packages/core/src/db/migrations/0014_add_product_type_to_agents.sql
5
-
6
- ALTER TABLE "agents" ADD COLUMN IF NOT EXISTS "product_type" text NOT NULL DEFAULT 'chat';
@@ -1,149 +0,0 @@
1
- -- NOTE (2026-08-26): every table below is also created by
2
- -- 0011_ambiguous_otto_octavius.sql, which runs first and whose
3
- -- shared_reports definition is the fuller one (it has conversation_id
4
- -- and parent_report_id; this file's does not). Replaying the chain
5
- -- against an empty database therefore failed here with
6
- -- `relation "knowledge_articles" already exists`.
7
- --
8
- -- Guarded rather than deleted: the file is in the journal, and on any
9
- -- database where it did run first its statements are the ones that
10
- -- created these tables. IF NOT EXISTS makes both orders converge on
11
- -- 0011's schema.
12
-
13
- -- Migration: 0015_new_v1_tables
14
- -- Description: Add 6 new tables for v1.0 features (knowledge, competition, referral, shared reports)
15
- -- Phase: 72-02
16
-
17
- CREATE TABLE IF NOT EXISTS "knowledge_articles" (
18
- "id" text PRIMARY KEY NOT NULL,
19
- "slug" text NOT NULL,
20
- "category" text NOT NULL,
21
- "title" jsonb NOT NULL,
22
- "description" jsonb NOT NULL,
23
- "content" jsonb NOT NULL,
24
- "tags" text[],
25
- "reading_time_minutes" integer DEFAULT 5 NOT NULL,
26
- "sort_order" integer DEFAULT 0 NOT NULL,
27
- "is_published" boolean DEFAULT false NOT NULL,
28
- "created_at" timestamp DEFAULT now() NOT NULL,
29
- "updated_at" timestamp DEFAULT now() NOT NULL
30
- );
31
- --> statement-breakpoint
32
- CREATE TABLE IF NOT EXISTS "competitions" (
33
- "id" text PRIMARY KEY NOT NULL,
34
- "name" jsonb NOT NULL,
35
- "description" jsonb NOT NULL,
36
- "start_date" timestamp NOT NULL,
37
- "end_date" timestamp NOT NULL,
38
- "is_active" boolean DEFAULT false NOT NULL,
39
- "prize_description" jsonb,
40
- "created_at" timestamp DEFAULT now() NOT NULL,
41
- "updated_at" timestamp DEFAULT now() NOT NULL
42
- );
43
- --> statement-breakpoint
44
- CREATE TABLE IF NOT EXISTS "competition_entries" (
45
- "id" text PRIMARY KEY NOT NULL,
46
- "competition_id" text NOT NULL,
47
- "workspace_id" text NOT NULL,
48
- "school_name" text NOT NULL,
49
- "class_name" text NOT NULL,
50
- "assessment_count" integer DEFAULT 0 NOT NULL,
51
- "total_score" integer DEFAULT 0 NOT NULL,
52
- "created_at" timestamp DEFAULT now() NOT NULL,
53
- "updated_at" timestamp DEFAULT now() NOT NULL
54
- );
55
- --> statement-breakpoint
56
- CREATE TABLE IF NOT EXISTS "referral_codes" (
57
- "id" text PRIMARY KEY NOT NULL,
58
- "user_id" text NOT NULL,
59
- "code" text NOT NULL,
60
- "created_at" timestamp DEFAULT now() NOT NULL
61
- );
62
- --> statement-breakpoint
63
- CREATE TABLE IF NOT EXISTS "referrals" (
64
- "id" text PRIMARY KEY NOT NULL,
65
- "referrer_id" text NOT NULL,
66
- "referred_user_id" text NOT NULL,
67
- "referral_code_id" text NOT NULL,
68
- "status" text DEFAULT 'pending' NOT NULL,
69
- "completed_at" timestamp,
70
- "created_at" timestamp DEFAULT now() NOT NULL
71
- );
72
- --> statement-breakpoint
73
- CREATE TABLE IF NOT EXISTS "shared_reports" (
74
- "id" text PRIMARY KEY NOT NULL,
75
- "user_id" text NOT NULL,
76
- "workspace_id" text NOT NULL,
77
- "report_type" text DEFAULT 'career' NOT NULL,
78
- "report_data" jsonb NOT NULL,
79
- "is_public" boolean DEFAULT true NOT NULL,
80
- "view_count" integer DEFAULT 0 NOT NULL,
81
- "created_at" timestamp DEFAULT now() NOT NULL,
82
- "updated_at" timestamp DEFAULT now() NOT NULL
83
- );
84
- --> statement-breakpoint
85
- DO $$ BEGIN
86
- ALTER TABLE "competition_entries" ADD CONSTRAINT "competition_entries_competition_id_competitions_id_fk" FOREIGN KEY ("competition_id") REFERENCES "public"."competitions"("id") ON DELETE cascade ON UPDATE no action;
87
- EXCEPTION WHEN duplicate_object THEN NULL;
88
- END $$;
89
- --> statement-breakpoint
90
- DO $$ BEGIN
91
- ALTER TABLE "competition_entries" ADD CONSTRAINT "competition_entries_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
92
- EXCEPTION WHEN duplicate_object THEN NULL;
93
- END $$;
94
- --> statement-breakpoint
95
- DO $$ BEGIN
96
- ALTER TABLE "referral_codes" ADD CONSTRAINT "referral_codes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
97
- EXCEPTION WHEN duplicate_object THEN NULL;
98
- END $$;
99
- --> statement-breakpoint
100
- DO $$ BEGIN
101
- ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referrer_id_users_id_fk" FOREIGN KEY ("referrer_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
102
- EXCEPTION WHEN duplicate_object THEN NULL;
103
- END $$;
104
- --> statement-breakpoint
105
- DO $$ BEGIN
106
- ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referred_user_id_users_id_fk" FOREIGN KEY ("referred_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
107
- EXCEPTION WHEN duplicate_object THEN NULL;
108
- END $$;
109
- --> statement-breakpoint
110
- DO $$ BEGIN
111
- ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referral_code_id_referral_codes_id_fk" FOREIGN KEY ("referral_code_id") REFERENCES "public"."referral_codes"("id") ON DELETE cascade ON UPDATE no action;
112
- EXCEPTION WHEN duplicate_object THEN NULL;
113
- END $$;
114
- --> statement-breakpoint
115
- DO $$ BEGIN
116
- ALTER TABLE "shared_reports" ADD CONSTRAINT "shared_reports_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
117
- EXCEPTION WHEN duplicate_object THEN NULL;
118
- END $$;
119
- --> statement-breakpoint
120
- DO $$ BEGIN
121
- ALTER TABLE "shared_reports" ADD CONSTRAINT "shared_reports_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
122
- EXCEPTION WHEN duplicate_object THEN NULL;
123
- END $$;
124
- --> statement-breakpoint
125
- CREATE UNIQUE INDEX IF NOT EXISTS "knowledge_articles_slug_idx" ON "knowledge_articles" USING btree ("slug");
126
- --> statement-breakpoint
127
- CREATE INDEX IF NOT EXISTS "knowledge_articles_category_idx" ON "knowledge_articles" USING btree ("category");
128
- --> statement-breakpoint
129
- CREATE INDEX IF NOT EXISTS "competitions_is_active_idx" ON "competitions" USING btree ("is_active");
130
- --> statement-breakpoint
131
- CREATE INDEX IF NOT EXISTS "competition_entries_competition_id_idx" ON "competition_entries" USING btree ("competition_id");
132
- --> statement-breakpoint
133
- CREATE INDEX IF NOT EXISTS "competition_entries_workspace_id_idx" ON "competition_entries" USING btree ("workspace_id");
134
- --> statement-breakpoint
135
- CREATE UNIQUE INDEX IF NOT EXISTS "competition_entries_competition_workspace_idx" ON "competition_entries" USING btree ("competition_id","workspace_id");
136
- --> statement-breakpoint
137
- CREATE UNIQUE INDEX IF NOT EXISTS "referral_codes_code_idx" ON "referral_codes" USING btree ("code");
138
- --> statement-breakpoint
139
- CREATE UNIQUE INDEX IF NOT EXISTS "referral_codes_user_id_idx" ON "referral_codes" USING btree ("user_id");
140
- --> statement-breakpoint
141
- CREATE INDEX IF NOT EXISTS "referrals_referrer_id_idx" ON "referrals" USING btree ("referrer_id");
142
- --> statement-breakpoint
143
- CREATE INDEX IF NOT EXISTS "referrals_referred_user_id_idx" ON "referrals" USING btree ("referred_user_id");
144
- --> statement-breakpoint
145
- CREATE UNIQUE INDEX IF NOT EXISTS "referrals_referred_user_id_unique_idx" ON "referrals" USING btree ("referred_user_id");
146
- --> statement-breakpoint
147
- CREATE INDEX IF NOT EXISTS "shared_reports_user_id_idx" ON "shared_reports" USING btree ("user_id");
148
- --> statement-breakpoint
149
- CREATE INDEX IF NOT EXISTS "shared_reports_workspace_id_idx" ON "shared_reports" USING btree ("workspace_id");
@@ -1,30 +0,0 @@
1
- -- Document Types reference table
2
- CREATE TABLE IF NOT EXISTS "document_types" (
3
- "id" text PRIMARY KEY,
4
- "name" text NOT NULL,
5
- "name_mn" text NOT NULL,
6
- "description" text,
7
- "icon" text,
8
- "sort_order" integer NOT NULL DEFAULT 0,
9
- "is_active" boolean NOT NULL DEFAULT true,
10
- "created_at" timestamp DEFAULT now() NOT NULL
11
- );
12
-
13
- -- Add type_id column to documents
14
- ALTER TABLE "documents" ADD COLUMN IF NOT EXISTS "type_id" text REFERENCES "document_types"("id") ON DELETE SET NULL;
15
-
16
- -- Index for type lookups
17
- CREATE INDEX IF NOT EXISTS "documents_type_id_idx" ON "documents" ("type_id");
18
-
19
- -- Seed 5 career document types
20
- INSERT INTO "document_types" ("id", "name", "name_mn", "description", "icon", "sort_order") VALUES
21
- ('career-report', 'Career Report', 'Карьерын тайлан', 'Full career assessment report with recommendations', 'file-text', 0),
22
- ('deep-dive-report', 'Deep Dive Report', 'Гүнзгий шинжилгээ', 'Detailed analysis of a specific career path', 'search', 1),
23
- ('scholarship-report', 'Scholarship Report', 'Тэтгэлгийн тайлан', 'Scholarship matching and financial aid report', 'gift', 2),
24
- ('comparison-report', 'Comparison Report', 'Харьцуулалт', 'Side-by-side career or university comparison', 'columns', 3),
25
- ('skills-report', 'Skills Report', 'Ур чадварын тайлан', 'Skills gap analysis and development plan', 'target', 4)
26
- ON CONFLICT ("id") DO NOTHING;
27
-
28
- -- Backfill existing career report documents
29
- UPDATE "documents" SET "type_id" = 'career-report'
30
- WHERE "kind" = 'text' AND ("title" LIKE '%Карьерын Тайлан%' OR "title" LIKE '%Career Report%');
@@ -1,2 +0,0 @@
1
- -- Add metadata JSONB column to documents for structured data storage
2
- ALTER TABLE "documents" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
@@ -1,200 +0,0 @@
1
- -- AI-ARCHITECTURE Phase B: User Identity Graph
2
- --
3
- -- Adds the four tables that back the cross-product memory system.
4
- -- See packages/core/src/db/schema/identity.ts for the Drizzle schema
5
- -- and docs/AI-ARCHITECTURE.md §2 for the design rationale.
6
- --
7
- -- Numbering note: this file is named 0018 to slot after the existing
8
- -- 0017_document_metadata. The project mixes two migration patterns —
9
- -- 0000–0011 are tracked by drizzle's _journal.json (auto-generated by
10
- -- `drizzle-kit generate`), while 0012–0018 are hand-rolled SQL applied
11
- -- via `pnpm --filter @intelligo-dev/core db:push` and have no journal
12
- -- entry. Future hand-rolled migrations should continue the 0019,
13
- -- 0020, ... sequence and stay out of _journal.json.
14
- --
15
- -- This migration is hand-crafted (not produced by `drizzle-kit generate`)
16
- -- because the auto-generator also picks up unrelated drift between the
17
- -- current schema files and the last applied migration. Keeping the
18
- -- diff narrow lets this PR ship the identity layer without dragging in
19
- -- those unrelated alterations.
20
-
21
- -- ---------------------------------------------------------------------------
22
- -- 1. user_facts — structured, evidence-backed facts
23
- -- ---------------------------------------------------------------------------
24
- CREATE TABLE "user_facts" (
25
- "id" text PRIMARY KEY NOT NULL,
26
- "user_id" text NOT NULL,
27
- "workspace_id" text NOT NULL,
28
- "category" text NOT NULL,
29
- "key" text NOT NULL,
30
- "value" jsonb NOT NULL,
31
- "confidence" double precision NOT NULL,
32
- "importance" integer DEFAULT 5 NOT NULL,
33
- "source_product" text,
34
- "source_session_id" text,
35
- "source_message_id" text,
36
- "extraction_method" text,
37
- "created_at" timestamp DEFAULT now() NOT NULL,
38
- "last_confirmed_at" timestamp,
39
- "expires_at" timestamp
40
- );
41
- --> statement-breakpoint
42
- ALTER TABLE "user_facts" ADD CONSTRAINT "user_facts_user_id_users_id_fk"
43
- FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade;
44
- --> statement-breakpoint
45
- ALTER TABLE "user_facts" ADD CONSTRAINT "user_facts_workspace_id_organization_id_fk"
46
- FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade;
47
- --> statement-breakpoint
48
- CREATE INDEX "user_facts_user_idx" ON "user_facts" USING btree ("user_id");
49
- --> statement-breakpoint
50
- CREATE INDEX "user_facts_workspace_idx" ON "user_facts" USING btree ("workspace_id");
51
- --> statement-breakpoint
52
- CREATE INDEX "user_facts_category_idx" ON "user_facts" USING btree ("workspace_id", "category");
53
- --> statement-breakpoint
54
- CREATE UNIQUE INDEX "user_facts_workspace_category_key_uniq"
55
- ON "user_facts" USING btree ("workspace_id", "category", "key");
56
- --> statement-breakpoint
57
-
58
- -- ---------------------------------------------------------------------------
59
- -- 2. user_memories — episodic memories with pgvector embedding
60
- -- ---------------------------------------------------------------------------
61
- CREATE TABLE "user_memories" (
62
- "id" text PRIMARY KEY NOT NULL,
63
- "user_id" text NOT NULL,
64
- "workspace_id" text NOT NULL,
65
- "kind" text NOT NULL,
66
- "content" text NOT NULL,
67
- -- 1536 dimensions matches OpenAI text-embedding-3-small (the default
68
- -- embedding model used across @intelligo-dev/ai). If the embedding model
69
- -- ever changes the dimension constraint will need a new migration —
70
- -- pgvector cannot resize a vector column in place. Search for
71
- -- "vector(1536)" in apps/* before editing.
72
- "embedding" vector(1536),
73
- "source_product" text,
74
- "source_session_id" text,
75
- "source_message_ids" text[],
76
- "importance" integer DEFAULT 5 NOT NULL,
77
- "decay_factor" double precision DEFAULT 1 NOT NULL,
78
- "metadata" jsonb,
79
- "created_at" timestamp DEFAULT now() NOT NULL
80
- );
81
- --> statement-breakpoint
82
- ALTER TABLE "user_memories" ADD CONSTRAINT "user_memories_user_id_users_id_fk"
83
- FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade;
84
- --> statement-breakpoint
85
- ALTER TABLE "user_memories" ADD CONSTRAINT "user_memories_workspace_id_organization_id_fk"
86
- FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade;
87
- --> statement-breakpoint
88
- CREATE INDEX "user_memories_user_idx" ON "user_memories" USING btree ("user_id");
89
- --> statement-breakpoint
90
- CREATE INDEX "user_memories_workspace_idx" ON "user_memories" USING btree ("workspace_id");
91
- --> statement-breakpoint
92
- CREATE INDEX "user_memories_kind_idx" ON "user_memories" USING btree ("workspace_id", "kind");
93
- --> statement-breakpoint
94
- -- IVFFlat vector index for cosine-similarity recall. Drizzle-orm
95
- -- doesn't expose this syntax natively, so it lives in the migration.
96
- --
97
- -- `lists = 100` is a starter value tuned for ~100k–1M rows
98
- -- (rule of thumb: rows / 1000). IVFFlat performance degrades when the
99
- -- table grows past `lists * sqrt(rows)`, so once Phase F starts
100
- -- ingesting real memories at scale this should be either:
101
- -- (a) raised to ~sqrt(actual_rows), then REINDEX, or
102
- -- (b) replaced with HNSW (`USING hnsw (...) WITH (m=16, ef_construction=64)`),
103
- -- which doesn't have IVFFlat's tuning sensitivity but uses more memory.
104
- -- See docs/AI-ARCHITECTURE.md §2.2 for the recall path that uses this.
105
- CREATE INDEX "user_memories_embedding_ivfflat"
106
- ON "user_memories" USING ivfflat ("embedding" vector_cosine_ops) WITH (lists = 100);
107
- --> statement-breakpoint
108
-
109
- -- ---------------------------------------------------------------------------
110
- -- 3. user_profile_snapshots — synthesized, fast-read profile cache
111
- -- ---------------------------------------------------------------------------
112
- CREATE TABLE "user_profile_snapshots" (
113
- "user_id" text PRIMARY KEY NOT NULL,
114
- "workspace_id" text NOT NULL,
115
- "version" integer NOT NULL,
116
- "summary" text NOT NULL,
117
- "summary_en" text,
118
- "summary_mn" text,
119
- "facts_digest" jsonb NOT NULL,
120
- "active_goals" jsonb,
121
- "personality_signals" jsonb,
122
- "relationship_notes" jsonb,
123
- "synthesized_by_model" text,
124
- "synthesized_at" timestamp DEFAULT now() NOT NULL,
125
- "next_synthesis_at" timestamp,
126
- "trigger_reason" text
127
- );
128
- --> statement-breakpoint
129
- ALTER TABLE "user_profile_snapshots" ADD CONSTRAINT "user_profile_snapshots_user_id_users_id_fk"
130
- FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade;
131
- --> statement-breakpoint
132
- ALTER TABLE "user_profile_snapshots" ADD CONSTRAINT "user_profile_snapshots_workspace_id_organization_id_fk"
133
- FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade;
134
- --> statement-breakpoint
135
- CREATE INDEX "user_profile_snapshots_workspace_idx"
136
- ON "user_profile_snapshots" USING btree ("workspace_id");
137
- --> statement-breakpoint
138
-
139
- -- ---------------------------------------------------------------------------
140
- -- 4. user_memory_audit — append-only audit log
141
- -- ---------------------------------------------------------------------------
142
- CREATE TABLE "user_memory_audit" (
143
- "id" text PRIMARY KEY NOT NULL,
144
- "user_id" text NOT NULL,
145
- "workspace_id" text NOT NULL,
146
- "target_kind" text NOT NULL,
147
- "target_id" text NOT NULL,
148
- "action" text NOT NULL,
149
- "actor_kind" text NOT NULL,
150
- "actor_id" text,
151
- "before_value" jsonb,
152
- "after_value" jsonb,
153
- "reason" text,
154
- "created_at" timestamp DEFAULT now() NOT NULL
155
- );
156
- --> statement-breakpoint
157
- ALTER TABLE "user_memory_audit" ADD CONSTRAINT "user_memory_audit_user_id_users_id_fk"
158
- FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade;
159
- --> statement-breakpoint
160
- ALTER TABLE "user_memory_audit" ADD CONSTRAINT "user_memory_audit_workspace_id_organization_id_fk"
161
- FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade;
162
- --> statement-breakpoint
163
- CREATE INDEX "user_memory_audit_user_idx" ON "user_memory_audit" USING btree ("user_id");
164
- --> statement-breakpoint
165
- CREATE INDEX "user_memory_audit_workspace_idx" ON "user_memory_audit" USING btree ("workspace_id");
166
- --> statement-breakpoint
167
- CREATE INDEX "user_memory_audit_target_idx"
168
- ON "user_memory_audit" USING btree ("target_kind", "target_id");
169
- --> statement-breakpoint
170
-
171
- -- Append-only enforcement: facts/memories/snapshots can be updated and
172
- -- deleted via the application layer, but their audit trail must not.
173
- -- A future PR can replace this with a row-level revoke if RLS is wired
174
- -- up; the trigger guard is the smaller change for now.
175
- --
176
- -- The function is fully qualified as `public.user_memory_audit_block_mutation`
177
- -- so a future schema split (e.g., moving identity tables into an
178
- -- "identity" schema) won't shadow it.
179
- --
180
- -- The exception message deliberately omits NEW.* / OLD.* — Postgres
181
- -- writes RAISE EXCEPTION strings to the server log by default, and the
182
- -- audit row's before/after values can contain user PII (interest,
183
- -- skill, etc. extracted by an LLM). ERRCODE 25006 = read_only_sql_transaction;
184
- -- close enough for upstream callers to recognize the class without
185
- -- needing a custom code.
186
- CREATE OR REPLACE FUNCTION public.user_memory_audit_block_mutation()
187
- RETURNS trigger AS $$
188
- BEGIN
189
- RAISE EXCEPTION 'user_memory_audit is append-only'
190
- USING ERRCODE = '25006', HINT = 'INSERT new audit rows; do not UPDATE or DELETE existing ones.';
191
- END;
192
- $$ LANGUAGE plpgsql;
193
- --> statement-breakpoint
194
- CREATE TRIGGER user_memory_audit_no_update
195
- BEFORE UPDATE ON "user_memory_audit"
196
- FOR EACH ROW EXECUTE FUNCTION public.user_memory_audit_block_mutation();
197
- --> statement-breakpoint
198
- CREATE TRIGGER user_memory_audit_no_delete
199
- BEFORE DELETE ON "user_memory_audit"
200
- FOR EACH ROW EXECUTE FUNCTION public.user_memory_audit_block_mutation();