@m6d/cortex-server 1.8.0 → 2.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 (352) hide show
  1. package/README.md +8 -3
  2. package/contracts/README.md +23 -0
  3. package/contracts/graph/embed.ts +50 -0
  4. package/{src/lib → contracts}/graph/helpers.ts +4 -10
  5. package/{src/lib → contracts}/graph/neo4j.ts +14 -27
  6. package/contracts/graph/schema.ts +65 -0
  7. package/{src/lib → contracts}/graph/types.ts +2 -29
  8. package/contracts/graph.ts +36 -0
  9. package/contracts/runtime.ts +208 -0
  10. package/contracts/wire.ts +143 -0
  11. package/dist/contracts/graph/embed.d.ts +22 -0
  12. package/dist/{src/lib → contracts}/graph/helpers.d.ts +16 -14
  13. package/dist/{src/lib → contracts}/graph/neo4j.d.ts +5 -5
  14. package/dist/contracts/graph/schema.d.ts +62 -0
  15. package/dist/{src/lib → contracts}/graph/types.d.ts +1 -1
  16. package/dist/contracts/graph.d.ts +14 -0
  17. package/dist/contracts/runtime.d.ts +278 -0
  18. package/dist/contracts/wire.d.ts +120 -0
  19. package/dist/src/lib/adapters/database/index.d.ts +61 -0
  20. package/dist/src/lib/adapters/database/message-content.d.ts +30 -0
  21. package/dist/src/lib/adapters/database/mssql/attachments.d.ts +100 -0
  22. package/dist/src/lib/adapters/database/mssql/client.d.ts +8 -0
  23. package/dist/src/lib/adapters/database/mssql/index.d.ts +194 -0
  24. package/dist/src/lib/adapters/database/mssql/llm-requests.d.ts +17 -0
  25. package/dist/src/lib/adapters/database/mssql/messages.d.ts +37 -0
  26. package/dist/src/lib/adapters/database/mssql/threads.d.ts +50 -0
  27. package/dist/src/lib/adapters/database/postgres/attachments.d.ts +113 -0
  28. package/dist/src/lib/adapters/database/postgres/client.d.ts +8 -0
  29. package/dist/src/lib/adapters/database/postgres/index.d.ts +207 -0
  30. package/dist/src/lib/adapters/database/postgres/llm-requests.d.ts +17 -0
  31. package/dist/src/lib/adapters/database/postgres/messages.d.ts +37 -0
  32. package/dist/src/lib/adapters/database/postgres/threads.d.ts +50 -0
  33. package/{src/lib/adapters/storage.ts → dist/src/lib/adapters/storage/index.d.ts} +1 -1
  34. package/dist/src/lib/adapters/{minio.d.ts → storage/minio.d.ts} +1 -1
  35. package/dist/src/lib/ai/active-runs.d.ts +63 -0
  36. package/dist/src/lib/ai/attachments.d.ts +30 -0
  37. package/dist/src/lib/ai/backend-url.d.ts +16 -0
  38. package/dist/src/lib/ai/cc-runtime.d.ts +61 -0
  39. package/dist/src/lib/ai/commit-gate.d.ts +21 -0
  40. package/dist/src/lib/ai/context/builder.d.ts +6 -7
  41. package/dist/src/lib/ai/context/compression-middleware.d.ts +15 -0
  42. package/dist/src/lib/ai/context/compressor.d.ts +2 -13
  43. package/dist/src/lib/ai/context/intra-turn-compressor.d.ts +9 -9
  44. package/dist/src/lib/ai/context/optimize-thread-context.d.ts +9 -0
  45. package/dist/src/lib/ai/context/summarizer.d.ts +3 -3
  46. package/dist/src/lib/ai/context/token-estimator.d.ts +5 -8
  47. package/dist/src/lib/ai/fetch.d.ts +1 -1
  48. package/dist/src/lib/ai/finish-turn.d.ts +23 -0
  49. package/dist/src/lib/ai/helpers.d.ts +37 -4
  50. package/dist/src/lib/ai/index.d.ts +6 -3
  51. package/dist/src/lib/ai/inspector.d.ts +41 -0
  52. package/dist/src/lib/ai/interceptors/request-interceptor.d.ts +6 -5
  53. package/dist/src/lib/ai/prompt.d.ts +5 -4
  54. package/dist/src/lib/ai/redis-runs.d.ts +41 -0
  55. package/dist/src/lib/ai/redis-stream-log.d.ts +39 -0
  56. package/dist/src/lib/ai/tools/execute-code.tool.d.ts +18 -4
  57. package/dist/src/lib/ai/tools/query-graph.tool.d.ts +13 -5
  58. package/dist/src/lib/ai/tools/read-attachment.tool.d.ts +21 -0
  59. package/dist/src/lib/ai/tools/search-common.d.ts +17 -0
  60. package/dist/src/lib/ai/tools/search-knowledge.tool.d.ts +15 -0
  61. package/dist/src/lib/ai/tools/search-services.tool.d.ts +12 -0
  62. package/dist/src/lib/ai/tools/search-tools.tool.d.ts +12 -0
  63. package/dist/src/lib/ai/turn-tools.d.ts +39 -0
  64. package/dist/src/lib/ai/vision/rasterize-pdf.d.ts +26 -0
  65. package/dist/src/lib/ai/vision/rasterize-pdf.worker.d.ts +1 -0
  66. package/dist/src/lib/ai/vision/vision-reader.d.ts +45 -0
  67. package/dist/src/lib/cc/client.d.ts +183 -0
  68. package/dist/src/lib/cc/config-cache.d.ts +20 -0
  69. package/dist/src/lib/cc/format.d.ts +23 -0
  70. package/dist/src/lib/cc/registry.d.ts +34 -0
  71. package/dist/src/lib/cc/types.d.ts +27 -0
  72. package/dist/src/lib/config.d.ts +81 -64
  73. package/dist/src/lib/db/drizzle.config.mssql.d.ts +2 -0
  74. package/dist/src/lib/db/drizzle.config.pg.d.ts +2 -0
  75. package/dist/src/lib/db/migrate.d.ts +7 -1
  76. package/dist/src/lib/db/{schema.d.ts → schema.mssql.d.ts} +138 -29
  77. package/dist/src/lib/db/schema.pg.d.ts +546 -0
  78. package/dist/src/lib/factory.d.ts +2 -12
  79. package/dist/src/lib/graph/index.d.ts +10 -11
  80. package/dist/src/lib/graph/resolver.d.ts +2 -3
  81. package/dist/src/lib/index.d.ts +3 -3
  82. package/dist/src/lib/redis.d.ts +19 -0
  83. package/dist/src/lib/routes/chat.d.ts +1 -1
  84. package/dist/src/lib/routes/files.d.ts +1 -1
  85. package/dist/src/lib/routes/owned-thread.d.ts +17 -0
  86. package/dist/src/lib/routes/threads.d.ts +1 -1
  87. package/dist/src/lib/routes/ws.d.ts +1 -1
  88. package/dist/src/lib/types.d.ts +20 -37
  89. package/dist/src/lib/ws/connections.d.ts +2 -1
  90. package/package.json +33 -18
  91. package/src/lib/adapters/database/index.ts +78 -0
  92. package/src/lib/adapters/database/message-content.ts +39 -0
  93. package/src/lib/adapters/database/mssql/attachments.ts +90 -0
  94. package/src/lib/adapters/database/mssql/client.ts +11 -0
  95. package/src/lib/adapters/database/mssql/index.ts +23 -0
  96. package/src/lib/adapters/database/mssql/llm-requests.ts +43 -0
  97. package/src/lib/adapters/database/mssql/messages.ts +92 -0
  98. package/src/lib/adapters/database/mssql/threads.ts +83 -0
  99. package/src/lib/adapters/database/postgres/attachments.ts +88 -0
  100. package/src/lib/adapters/database/postgres/client.ts +11 -0
  101. package/src/lib/adapters/database/postgres/index.ts +23 -0
  102. package/src/lib/adapters/database/postgres/llm-requests.ts +45 -0
  103. package/src/lib/adapters/database/postgres/messages.ts +92 -0
  104. package/src/lib/adapters/database/postgres/threads.ts +84 -0
  105. package/{dist/src/lib/adapters/storage.d.ts → src/lib/adapters/storage/index.ts} +1 -1
  106. package/src/lib/adapters/{minio.ts → storage/minio.ts} +5 -5
  107. package/src/lib/ai/active-runs.ts +157 -0
  108. package/src/lib/ai/attachments.ts +144 -0
  109. package/src/lib/ai/backend-url.ts +27 -0
  110. package/src/lib/ai/cc-runtime.ts +63 -0
  111. package/src/lib/ai/commit-gate.ts +116 -0
  112. package/src/lib/ai/context/builder.ts +12 -14
  113. package/src/lib/ai/context/compression-middleware.ts +44 -0
  114. package/src/lib/ai/context/compressor.ts +67 -59
  115. package/src/lib/ai/context/intra-turn-compressor.ts +121 -204
  116. package/src/lib/ai/context/optimize-thread-context.ts +50 -0
  117. package/src/lib/ai/context/summarizer.ts +28 -30
  118. package/src/lib/ai/context/token-estimator.ts +35 -30
  119. package/src/lib/ai/fetch.ts +10 -5
  120. package/src/lib/ai/finish-turn.ts +75 -0
  121. package/src/lib/ai/helpers.ts +83 -15
  122. package/src/lib/ai/index.ts +359 -329
  123. package/src/lib/ai/inspector.ts +112 -0
  124. package/src/lib/ai/interceptors/request-interceptor.ts +70 -42
  125. package/src/lib/ai/prompt.ts +126 -125
  126. package/src/lib/ai/redis-runs.ts +167 -0
  127. package/src/lib/ai/redis-stream-log.ts +219 -0
  128. package/src/lib/ai/tools/execute-code.tool.ts +178 -67
  129. package/src/lib/ai/tools/query-graph.tool.ts +7 -8
  130. package/src/lib/ai/tools/read-attachment.tool.ts +59 -0
  131. package/src/lib/ai/tools/search-common.ts +15 -0
  132. package/src/lib/ai/tools/search-knowledge.tool.ts +33 -0
  133. package/src/lib/ai/tools/search-services.tool.ts +31 -0
  134. package/src/lib/ai/tools/search-tools.tool.ts +29 -0
  135. package/src/lib/ai/turn-tools.ts +154 -0
  136. package/src/lib/ai/vision/rasterize-pdf.ts +69 -0
  137. package/src/lib/ai/vision/rasterize-pdf.worker.ts +81 -0
  138. package/src/lib/ai/vision/vision-reader.ts +130 -0
  139. package/src/lib/auth/middleware.ts +5 -3
  140. package/src/lib/cc/client.ts +273 -0
  141. package/src/lib/cc/config-cache.ts +32 -0
  142. package/src/lib/cc/format.ts +96 -0
  143. package/src/lib/cc/registry.ts +62 -0
  144. package/src/lib/cc/types.ts +44 -0
  145. package/src/lib/config.ts +102 -71
  146. package/src/lib/db/drizzle.config.mssql.ts +9 -0
  147. package/src/lib/db/drizzle.config.pg.ts +9 -0
  148. package/src/lib/db/migrate.ts +45 -10
  149. package/src/lib/db/migrations/mssql/20260729092726_talented_wilson_fisk/migration.sql +20 -0
  150. package/src/lib/db/migrations/mssql/20260729092726_talented_wilson_fisk/snapshot.json +497 -0
  151. package/src/lib/db/migrations/mssql/20260801003652_perpetual_blue_shield/migration.sql +1 -0
  152. package/src/lib/db/migrations/mssql/20260801003652_perpetual_blue_shield/snapshot.json +516 -0
  153. package/src/lib/db/migrations/mssql/20260812174642_user_id_text/migration.sql +2 -0
  154. package/src/lib/db/migrations/mssql/20260812174642_user_id_text/snapshot.json +516 -0
  155. package/src/lib/db/migrations/pg/20260801084117_thick_ben_grimm/migration.sql +53 -0
  156. package/src/lib/db/migrations/pg/20260801084117_thick_ben_grimm/snapshot.json +584 -0
  157. package/src/lib/db/migrations/pg/20260812174622_user_id_text/migration.sql +2 -0
  158. package/src/lib/db/migrations/pg/20260812174622_user_id_text/snapshot.json +584 -0
  159. package/src/lib/db/{schema.ts → schema.mssql.ts} +29 -18
  160. package/src/lib/db/schema.pg.ts +95 -0
  161. package/src/lib/factory.ts +44 -89
  162. package/src/lib/graph/index.ts +12 -40
  163. package/src/lib/graph/resolver.ts +146 -116
  164. package/src/lib/index.ts +11 -4
  165. package/src/lib/redis.ts +44 -0
  166. package/src/lib/routes/chat.ts +91 -62
  167. package/src/lib/routes/files.ts +105 -83
  168. package/src/lib/routes/owned-thread.ts +17 -0
  169. package/src/lib/routes/threads.ts +14 -30
  170. package/src/lib/routes/ws.ts +9 -3
  171. package/src/lib/types.ts +37 -36
  172. package/src/lib/ws/connections.ts +9 -1
  173. package/tsconfig.json +48 -0
  174. package/dist/src/lib/adapters/database.d.ts +0 -45
  175. package/dist/src/lib/adapters/mssql.d.ts +0 -3
  176. package/dist/src/lib/ai/active-streams.d.ts +0 -14
  177. package/dist/src/lib/ai/context/index.d.ts +0 -16
  178. package/dist/src/lib/ai/tools/capture-files.tool.d.ts +0 -6
  179. package/dist/src/lib/cli/extract-endpoints.d.ts +0 -6
  180. package/dist/src/lib/graph/expand-domains.d.ts +0 -2
  181. package/dist/src/lib/graph/generate-cypher.d.ts +0 -22
  182. package/dist/src/lib/graph/seed.d.ts +0 -19
  183. package/dist/src/lib/graph/validate.d.ts +0 -2
  184. package/dist/src/lib/routes/index.d.ts +0 -4
  185. package/dist/src/lib/ws/events.d.ts +0 -39
  186. package/dist/src/lib/ws/index.d.ts +0 -3
  187. package/dist/src/lib/ws/notify.d.ts +0 -2
  188. package/src/lib/adapters/database.ts +0 -48
  189. package/src/lib/adapters/mssql.ts +0 -231
  190. package/src/lib/ai/active-streams.ts +0 -123
  191. package/src/lib/ai/context/index.ts +0 -80
  192. package/src/lib/ai/tools/capture-files.tool.ts +0 -20
  193. package/src/lib/cli/extract-endpoints.ts +0 -550
  194. package/src/lib/graph/expand-domains.ts +0 -276
  195. package/src/lib/graph/generate-cypher.ts +0 -192
  196. package/src/lib/graph/seed.ts +0 -162
  197. package/src/lib/graph/validate.ts +0 -78
  198. package/src/lib/routes/index.ts +0 -4
  199. package/src/lib/ws/events.ts +0 -39
  200. package/src/lib/ws/index.ts +0 -11
  201. package/src/lib/ws/notify.ts +0 -9
  202. package/src/sample/db/client.ts +0 -9
  203. package/src/sample/db/migrations/20260411023125_rich_purple_man/migration.sql +0 -5
  204. package/src/sample/db/migrations/20260411023125_rich_purple_man/snapshot.json +0 -50
  205. package/src/sample/db/schema.ts +0 -10
  206. package/src/sample/domains/account/concepts/session.concept.ts +0 -17
  207. package/src/sample/domains/account/endpoints/listCurrentSessions.endpoint.ts +0 -31
  208. package/src/sample/domains/account/endpoints/revokeAllOtherSessions.endpoint.ts +0 -22
  209. package/src/sample/domains/account/endpoints/revokeCurrentSession.endpoint.ts +0 -33
  210. package/src/sample/domains/account/index.ts +0 -18
  211. package/src/sample/domains/appraisals/concepts/appraisalCycle.concept.ts +0 -15
  212. package/src/sample/domains/appraisals/concepts/appraisalRecord.concept.ts +0 -20
  213. package/src/sample/domains/appraisals/concepts/appraisalRecordCompetency.concept.ts +0 -10
  214. package/src/sample/domains/appraisals/concepts/appraisalRecordFunctionalRequirement.concept.ts +0 -10
  215. package/src/sample/domains/appraisals/concepts/appraisalRecordGoal.concept.ts +0 -17
  216. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordById.endpoint.ts +0 -321
  217. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordCompetencies.endpoint.ts +0 -120
  218. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordFunctionalRequirements.endpoint.ts +0 -126
  219. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordGoals.endpoint.ts +0 -104
  220. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordScore.endpoint.ts +0 -58
  221. package/src/sample/domains/appraisals/endpoints/listAppraisalCyclesSimple.endpoint.ts +0 -52
  222. package/src/sample/domains/appraisals/endpoints/listAppraisalRecords.endpoint.ts +0 -245
  223. package/src/sample/domains/appraisals/endpoints/listAppraisalTemplatesSimple.endpoint.ts +0 -52
  224. package/src/sample/domains/appraisals/index.ts +0 -40
  225. package/src/sample/domains/appraisals/rules/appraisalRecordScoping.rule.ts +0 -7
  226. package/src/sample/domains/attendance/concepts/attendancePermission.concept.ts +0 -17
  227. package/src/sample/domains/attendance/concepts/attendanceTransaction.concept.ts +0 -17
  228. package/src/sample/domains/attendance/concepts/publicHoliday.concept.ts +0 -10
  229. package/src/sample/domains/attendance/concepts/punch.concept.ts +0 -19
  230. package/src/sample/domains/attendance/endpoints/getAttendanceTransactionById.endpoint.ts +0 -444
  231. package/src/sample/domains/attendance/endpoints/getCurrentAttendanceProfile.endpoint.ts +0 -886
  232. package/src/sample/domains/attendance/endpoints/getCurrentAttendanceStatistics.endpoint.ts +0 -49
  233. package/src/sample/domains/attendance/endpoints/listAttendancePermissions.endpoint.ts +0 -176
  234. package/src/sample/domains/attendance/endpoints/listAttendanceTransactionStates.endpoint.ts +0 -26
  235. package/src/sample/domains/attendance/endpoints/listAttendanceTransactions.endpoint.ts +0 -373
  236. package/src/sample/domains/attendance/endpoints/listPublicHolidaysSimple.endpoint.ts +0 -52
  237. package/src/sample/domains/attendance/endpoints/listPunchTypes.endpoint.ts +0 -25
  238. package/src/sample/domains/attendance/endpoints/listPunches.endpoint.ts +0 -178
  239. package/src/sample/domains/attendance/index.ts +0 -41
  240. package/src/sample/domains/attendance/services/attendancePermissions.service.ts +0 -15
  241. package/src/sample/domains/employees/concepts/employee.concept.ts +0 -20
  242. package/src/sample/domains/employees/concepts/employeeBankAccount.concept.ts +0 -19
  243. package/src/sample/domains/employees/concepts/employeeChild.concept.ts +0 -19
  244. package/src/sample/domains/employees/concepts/employeeDocument.concept.ts +0 -21
  245. package/src/sample/domains/employees/concepts/employeeEvent.concept.ts +0 -21
  246. package/src/sample/domains/employees/concepts/employeeExperience.concept.ts +0 -18
  247. package/src/sample/domains/employees/concepts/employeeJobLevelChange.concept.ts +0 -21
  248. package/src/sample/domains/employees/concepts/employeeMedal.concept.ts +0 -20
  249. package/src/sample/domains/employees/concepts/employeeQualification.concept.ts +0 -20
  250. package/src/sample/domains/employees/concepts/employeeSpouse.concept.ts +0 -21
  251. package/src/sample/domains/employees/concepts/employeeViolation.concept.ts +0 -19
  252. package/src/sample/domains/employees/endpoints/getCurrentEmployee.endpoint.ts +0 -1651
  253. package/src/sample/domains/employees/endpoints/getCurrentIdentity.endpoint.ts +0 -197
  254. package/src/sample/domains/employees/endpoints/getCurrentManagers.endpoint.ts +0 -142
  255. package/src/sample/domains/employees/endpoints/getEmployeeById.endpoint.ts +0 -1659
  256. package/src/sample/domains/employees/endpoints/getEmployeeStatistics.endpoint.ts +0 -43
  257. package/src/sample/domains/employees/endpoints/listBankAccounts.endpoint.ts +0 -223
  258. package/src/sample/domains/employees/endpoints/listChildren.endpoint.ts +0 -211
  259. package/src/sample/domains/employees/endpoints/listDocuments.endpoint.ts +0 -222
  260. package/src/sample/domains/employees/endpoints/listEmployeesSimple.endpoint.ts +0 -156
  261. package/src/sample/domains/employees/endpoints/listEvents.endpoint.ts +0 -120
  262. package/src/sample/domains/employees/endpoints/listExperiences.endpoint.ts +0 -188
  263. package/src/sample/domains/employees/endpoints/listJobLevelChanges.endpoint.ts +0 -240
  264. package/src/sample/domains/employees/endpoints/listMedals.endpoint.ts +0 -266
  265. package/src/sample/domains/employees/endpoints/listQualifications.endpoint.ts +0 -265
  266. package/src/sample/domains/employees/endpoints/listSpouses.endpoint.ts +0 -278
  267. package/src/sample/domains/employees/endpoints/listViolations.endpoint.ts +0 -245
  268. package/src/sample/domains/employees/index.ts +0 -75
  269. package/src/sample/domains/employees/services/employees.service.ts +0 -181
  270. package/src/sample/domains/index.ts +0 -10
  271. package/src/sample/domains/leaves/concepts/leave.concept.ts +0 -21
  272. package/src/sample/domains/leaves/concepts/leaveBalance.concept.ts +0 -17
  273. package/src/sample/domains/leaves/concepts/leaveBalanceTransaction.concept.ts +0 -16
  274. package/src/sample/domains/leaves/concepts/leaveType.concept.ts +0 -13
  275. package/src/sample/domains/leaves/concepts/leaveTypes.concept.ts +0 -205
  276. package/src/sample/domains/leaves/endpoints/getBalance.endpoint.ts +0 -53
  277. package/src/sample/domains/leaves/endpoints/getLeaveById.endpoint.ts +0 -53
  278. package/src/sample/domains/leaves/endpoints/listBalanceTransactions.endpoint.ts +0 -196
  279. package/src/sample/domains/leaves/endpoints/listBalanceTypes.endpoint.ts +0 -26
  280. package/src/sample/domains/leaves/endpoints/listBalances.endpoint.ts +0 -201
  281. package/src/sample/domains/leaves/endpoints/listLeaveTypes.endpoint.ts +0 -28
  282. package/src/sample/domains/leaves/endpoints/listLeaves.endpoint.ts +0 -234
  283. package/src/sample/domains/leaves/index.ts +0 -38
  284. package/src/sample/domains/leaves/services/leaveRequests.service.ts +0 -232
  285. package/src/sample/domains/notifications/concepts/notification.concept.ts +0 -19
  286. package/src/sample/domains/notifications/endpoints/countMyNotifications.endpoint.ts +0 -21
  287. package/src/sample/domains/notifications/endpoints/getMyNotification.endpoint.ts +0 -57
  288. package/src/sample/domains/notifications/endpoints/listMyNotifications.endpoint.ts +0 -59
  289. package/src/sample/domains/notifications/endpoints/markMyNotificationAsRead.endpoint.ts +0 -32
  290. package/src/sample/domains/notifications/index.ts +0 -20
  291. package/src/sample/domains/payroll/concepts/payslip.concept.ts +0 -18
  292. package/src/sample/domains/payroll/concepts/salaryCertificate.concept.ts +0 -17
  293. package/src/sample/domains/payroll/concepts/salaryCertificateRequestingEntity.concept.ts +0 -8
  294. package/src/sample/domains/payroll/endpoints/getPayslipById.endpoint.ts +0 -238
  295. package/src/sample/domains/payroll/endpoints/listPayslips.endpoint.ts +0 -216
  296. package/src/sample/domains/payroll/endpoints/listSalaryCertificateLanguages.endpoint.ts +0 -25
  297. package/src/sample/domains/payroll/endpoints/listSalaryCertificateRequestingEntities.endpoint.ts +0 -62
  298. package/src/sample/domains/payroll/endpoints/listSalaryCertificateTypes.endpoint.ts +0 -24
  299. package/src/sample/domains/payroll/endpoints/listSalaryCertificates.endpoint.ts +0 -122
  300. package/src/sample/domains/payroll/endpoints/previewSalaryCertificate.endpoint.ts +0 -45
  301. package/src/sample/domains/payroll/index.ts +0 -32
  302. package/src/sample/domains/payroll/rules/payrollEmployeeContext.rule.ts +0 -7
  303. package/src/sample/domains/payroll/services/salaryCertificates.service.ts +0 -15
  304. package/src/sample/domains/servicing/concepts/service.concept.ts +0 -6
  305. package/src/sample/domains/servicing/concepts/serviceRequest.concept.ts +0 -12
  306. package/src/sample/domains/servicing/concepts/serviceRequestApproval.concept.ts +0 -9
  307. package/src/sample/domains/servicing/endpoints/cancelServiceRequest.endpoint.ts +0 -21
  308. package/src/sample/domains/servicing/endpoints/createServiceRequest.endpoint.ts +0 -511
  309. package/src/sample/domains/servicing/endpoints/getServiceRequest.endpoint.ts +0 -352
  310. package/src/sample/domains/servicing/endpoints/getServiceRequestFormItems.endpoint.ts +0 -219
  311. package/src/sample/domains/servicing/endpoints/getServiceRequestTransactionFormItems.endpoint.ts +0 -216
  312. package/src/sample/domains/servicing/endpoints/getServiceStates.endpoint.ts +0 -47
  313. package/src/sample/domains/servicing/endpoints/invokeServiceRequestAction.endpoint.ts +0 -139
  314. package/src/sample/domains/servicing/endpoints/listServiceRequests.endpoint.ts +0 -292
  315. package/src/sample/domains/servicing/endpoints/listServices.endpoint.ts +0 -108
  316. package/src/sample/domains/servicing/endpoints/updateServiceRequest.endpoint.ts +0 -355
  317. package/src/sample/domains/servicing/index.ts +0 -44
  318. package/src/sample/domains/servicing/rules/checkValidActions.rule.ts +0 -7
  319. package/src/sample/domains/servicing/rules/createServiceRequest.rule.ts +0 -7
  320. package/src/sample/domains/servicing/rules/filterServiceRequestsByState.rule.ts +0 -7
  321. package/src/sample/domains/servicing/rules/passingOptionFields.rule.ts +0 -7
  322. package/src/sample/domains/shared/rules/pagination.rule.ts +0 -7
  323. package/src/sample/domains/suggestions/concepts/suggestion.concept.ts +0 -19
  324. package/src/sample/domains/suggestions/concepts/suggestionCategory.concept.ts +0 -7
  325. package/src/sample/domains/suggestions/concepts/suggestionImpactLevel.concept.ts +0 -7
  326. package/src/sample/domains/suggestions/endpoints/createSuggestion.endpoint.ts +0 -705
  327. package/src/sample/domains/suggestions/endpoints/deleteSuggestion.endpoint.ts +0 -32
  328. package/src/sample/domains/suggestions/endpoints/getSuggestionById.endpoint.ts +0 -635
  329. package/src/sample/domains/suggestions/endpoints/listSuggestionCategories.endpoint.ts +0 -62
  330. package/src/sample/domains/suggestions/endpoints/listSuggestionImpactLevels.endpoint.ts +0 -62
  331. package/src/sample/domains/suggestions/endpoints/listSuggestionStates.endpoint.ts +0 -24
  332. package/src/sample/domains/suggestions/endpoints/listSuggestions.endpoint.ts +0 -132
  333. package/src/sample/domains/suggestions/endpoints/updateSuggestion.endpoint.ts +0 -690
  334. package/src/sample/domains/suggestions/endpoints/updateSuggestionState.endpoint.ts +0 -39
  335. package/src/sample/domains/suggestions/index.ts +0 -34
  336. package/src/sample/domains/suggestions/rules/suggestionScope.rule.ts +0 -7
  337. package/src/sample/domains/surveys/concepts/survey.concept.ts +0 -10
  338. package/src/sample/domains/surveys/concepts/surveyResponse.concept.ts +0 -14
  339. package/src/sample/domains/surveys/endpoints/getSurveyResponseById.endpoint.ts +0 -131
  340. package/src/sample/domains/surveys/endpoints/getTargetedSurvey.endpoint.ts +0 -129
  341. package/src/sample/domains/surveys/endpoints/listTargetedSurveys.endpoint.ts +0 -160
  342. package/src/sample/domains/surveys/endpoints/respondToSurvey.endpoint.ts +0 -144
  343. package/src/sample/domains/surveys/index.ts +0 -21
  344. package/src/sample/drizzle.config.ts +0 -11
  345. package/src/sample/index.bak.ts +0 -341
  346. package/src/sample/index.ts +0 -318
  347. package/src/sample/official-statements/defaults.ts +0 -57
  348. package/src/sample/official-statements/routes.ts +0 -137
  349. package/src/sample/official-statements/service.ts +0 -148
  350. package/src/sample/official-statements/types.ts +0 -23
  351. /package/src/lib/db/migrations/{20260326231647_nice_speedball → mssql/20260326231647_nice_speedball}/migration.sql +0 -0
  352. /package/src/lib/db/migrations/{20260326231647_nice_speedball → mssql/20260326231647_nice_speedball}/snapshot.json +0 -0
@@ -1,276 +0,0 @@
1
- import type { ConceptDef, DomainDef, EndpointDef, RuleDef, ServiceDef } from "./types.ts";
2
-
3
- type DomainCollections = {
4
- concepts: ConceptDef[];
5
- endpoints: EndpointDef[];
6
- services: ServiceDef[];
7
- rules: RuleDef[];
8
- };
9
-
10
- type OwnershipMaps = {
11
- concepts: WeakMap<ConceptDef, string>;
12
- endpoints: WeakMap<EndpointDef, string>;
13
- services: WeakMap<ServiceDef, string>;
14
- rules: WeakMap<RuleDef, string>;
15
- };
16
-
17
- export function expandDomains(domains: Record<string, DomainDef>) {
18
- const ownership = createOwnershipMaps(domains);
19
- const expanded: Record<string, DomainDef> = {};
20
-
21
- for (const [domainKey, domain] of Object.entries(domains)) {
22
- const collections = cloneCollections(domain);
23
- const pendingConcepts = [...collections.concepts];
24
- const pendingEndpoints = [...collections.endpoints];
25
- const pendingServices = [...collections.services];
26
-
27
- while (
28
- pendingConcepts.length > 0 ||
29
- pendingEndpoints.length > 0 ||
30
- pendingServices.length > 0
31
- ) {
32
- const concept = pendingConcepts.pop();
33
- if (concept) {
34
- includeConcept({
35
- domainKey,
36
- concept,
37
- ownership,
38
- collections,
39
- pendingConcepts,
40
- pendingEndpoints,
41
- });
42
- }
43
-
44
- const endpoint = pendingEndpoints.pop();
45
- if (endpoint) {
46
- includeEndpoint({
47
- domainKey,
48
- endpoint,
49
- ownership,
50
- collections,
51
- pendingConcepts,
52
- pendingEndpoints,
53
- });
54
- }
55
-
56
- const service = pendingServices.pop();
57
- if (service) {
58
- includeService({
59
- domainKey,
60
- service,
61
- ownership,
62
- collections,
63
- pendingConcepts,
64
- });
65
- }
66
- }
67
-
68
- expanded[domainKey] = {
69
- ...domain,
70
- concepts: collections.concepts,
71
- endpoints: collections.endpoints,
72
- services: collections.services,
73
- rules: collections.rules,
74
- };
75
- }
76
-
77
- return expanded;
78
- }
79
-
80
- function createOwnershipMaps(domains: Record<string, DomainDef>) {
81
- const ownership: OwnershipMaps = {
82
- concepts: new WeakMap<ConceptDef, string>(),
83
- endpoints: new WeakMap<EndpointDef, string>(),
84
- services: new WeakMap<ServiceDef, string>(),
85
- rules: new WeakMap<RuleDef, string>(),
86
- };
87
-
88
- for (const [domainKey, domain] of Object.entries(domains)) {
89
- for (const concept of domain.concepts ?? []) {
90
- assignOwner(ownership.concepts, concept, domainKey);
91
- }
92
-
93
- for (const endpoint of domain.endpoints ?? []) {
94
- assignOwner(ownership.endpoints, endpoint, domainKey);
95
- }
96
-
97
- for (const service of domain.services ?? []) {
98
- assignOwner(ownership.services, service, domainKey);
99
- }
100
-
101
- for (const rule of domain.rules ?? []) {
102
- assignOwner(ownership.rules, rule, domainKey);
103
- }
104
- }
105
-
106
- return ownership;
107
- }
108
-
109
- function assignOwner<T extends object>(owners: WeakMap<T, string>, value: T, domainKey: string) {
110
- if (!owners.has(value)) {
111
- owners.set(value, domainKey);
112
- }
113
- }
114
-
115
- function cloneCollections(domain: DomainDef) {
116
- return {
117
- concepts: [...(domain.concepts ?? [])],
118
- endpoints: [...(domain.endpoints ?? [])],
119
- services: [...(domain.services ?? [])],
120
- rules: [...(domain.rules ?? [])],
121
- } satisfies DomainCollections;
122
- }
123
-
124
- function includeConcept(options: {
125
- domainKey: string;
126
- concept: ConceptDef;
127
- ownership: OwnershipMaps;
128
- collections: DomainCollections;
129
- pendingConcepts: ConceptDef[];
130
- pendingEndpoints: EndpointDef[];
131
- }) {
132
- const { domainKey, concept, ownership, collections, pendingConcepts, pendingEndpoints } =
133
- options;
134
-
135
- includeRule(domainKey, concept.governedBy ?? [], ownership, collections);
136
-
137
- if (shouldAttach(ownership.concepts, concept, domainKey)) {
138
- pushUnique(collections.concepts, concept);
139
- }
140
-
141
- if (
142
- concept.parentConcept &&
143
- shouldAttach(ownership.concepts, concept.parentConcept, domainKey)
144
- ) {
145
- if (pushUnique(collections.concepts, concept.parentConcept)) {
146
- pendingConcepts.push(concept.parentConcept);
147
- }
148
- }
149
-
150
- for (const endpoint of collections.endpoints) {
151
- if (referencesConcept(endpoint, concept)) {
152
- includeEndpoint({
153
- domainKey,
154
- endpoint,
155
- ownership,
156
- collections,
157
- pendingConcepts,
158
- pendingEndpoints,
159
- });
160
- }
161
- }
162
- }
163
-
164
- function includeEndpoint(options: {
165
- domainKey: string;
166
- endpoint: EndpointDef;
167
- ownership: OwnershipMaps;
168
- collections: DomainCollections;
169
- pendingConcepts: ConceptDef[];
170
- pendingEndpoints: EndpointDef[];
171
- }) {
172
- const { domainKey, endpoint, ownership, collections, pendingConcepts, pendingEndpoints } =
173
- options;
174
-
175
- if (shouldAttach(ownership.endpoints, endpoint, domainKey)) {
176
- pushUnique(collections.endpoints, endpoint);
177
- }
178
-
179
- includeRule(domainKey, endpoint.governedBy ?? [], ownership, collections);
180
-
181
- for (const concept of endpoint.queries ?? []) {
182
- if (
183
- shouldAttach(ownership.concepts, concept, domainKey) &&
184
- pushUnique(collections.concepts, concept)
185
- ) {
186
- pendingConcepts.push(concept);
187
- }
188
- }
189
-
190
- for (const concept of endpoint.mutates ?? []) {
191
- if (
192
- shouldAttach(ownership.concepts, concept, domainKey) &&
193
- pushUnique(collections.concepts, concept)
194
- ) {
195
- pendingConcepts.push(concept);
196
- }
197
- }
198
-
199
- for (const returned of endpoint.returns ?? []) {
200
- if (
201
- shouldAttach(ownership.concepts, returned.concept, domainKey) &&
202
- pushUnique(collections.concepts, returned.concept)
203
- ) {
204
- pendingConcepts.push(returned.concept);
205
- }
206
- }
207
-
208
- for (const dependency of endpoint.dependsOn ?? []) {
209
- if (
210
- shouldAttach(ownership.endpoints, dependency.endpoint, domainKey) &&
211
- pushUnique(collections.endpoints, dependency.endpoint)
212
- ) {
213
- pendingEndpoints.push(dependency.endpoint);
214
- }
215
- }
216
- }
217
-
218
- function includeService(options: {
219
- domainKey: string;
220
- service: ServiceDef;
221
- ownership: OwnershipMaps;
222
- collections: DomainCollections;
223
- pendingConcepts: ConceptDef[];
224
- }) {
225
- const { domainKey, service, ownership, collections, pendingConcepts } = options;
226
-
227
- if (shouldAttach(ownership.services, service, domainKey)) {
228
- pushUnique(collections.services, service);
229
- }
230
-
231
- includeRule(domainKey, service.governedBy ?? [], ownership, collections);
232
-
233
- if (
234
- shouldAttach(ownership.concepts, service.belongsTo, domainKey) &&
235
- pushUnique(collections.concepts, service.belongsTo)
236
- ) {
237
- pendingConcepts.push(service.belongsTo);
238
- }
239
- }
240
-
241
- function includeRule(
242
- domainKey: string,
243
- rules: readonly RuleDef[],
244
- ownership: OwnershipMaps,
245
- collections: DomainCollections,
246
- ) {
247
- for (const rule of rules) {
248
- if (shouldAttach(ownership.rules, rule, domainKey)) {
249
- pushUnique(collections.rules, rule);
250
- }
251
- }
252
- }
253
-
254
- function shouldAttach<T extends object>(owners: WeakMap<T, string>, value: T, domainKey: string) {
255
- const owner = owners.get(value);
256
- return owner == null || owner === domainKey;
257
- }
258
-
259
- function pushUnique<T extends object>(values: T[], value: T) {
260
- if (values.includes(value)) {
261
- return false;
262
- }
263
-
264
- values.push(value);
265
- return true;
266
- }
267
-
268
- function referencesConcept(endpoint: EndpointDef, concept: ConceptDef) {
269
- return (
270
- endpoint.queries?.includes(concept) ||
271
- endpoint.mutates?.includes(concept) ||
272
- endpoint.returns?.some(function (returned) {
273
- return returned.concept === concept;
274
- })
275
- );
276
- }
@@ -1,192 +0,0 @@
1
- /**
2
- * Transforms declarative DomainDef into idempotent MERGE-based Cypher.
3
- *
4
- * Returns two phases:
5
- * - `nodes` -- MERGE statements that create/update Domain, Concept, Endpoint,
6
- * Service, and Rule nodes.
7
- * - `edges` -- MATCH+MERGE statements that wire up relationships between nodes.
8
- *
9
- * The caller MUST run all `nodes` from every module before running any `edges`,
10
- * because edges may reference nodes defined in a different module (e.g. a Rule
11
- * in the leaves module that GOVERNS a Concept created by the servicing module).
12
- */
13
-
14
- import type { DomainDef } from "./types.ts";
15
-
16
- export type GeneratedCypher = {
17
- nodes: string[];
18
- edges: string[];
19
- };
20
-
21
- function esc(s: string) {
22
- return s.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/\n/g, "\\n");
23
- }
24
-
25
- function jsonStr(value: unknown) {
26
- return esc(JSON.stringify(value));
27
- }
28
-
29
- export function generateCypher(data: DomainDef) {
30
- const nodes: string[] = [];
31
- const edges: string[] = [];
32
-
33
- // -- Domain node --
34
- const domainMeta = data.metadata
35
- ? `,\n d.metadata = '${jsonStr(data.metadata)}'`
36
- : "";
37
- nodes.push(
38
- `MERGE (d:Domain {name: '${esc(data.name)}'})
39
- SET d.description = '${esc(data.description)}'${domainMeta}`,
40
- );
41
-
42
- // -- Concept nodes --
43
- for (const c of data.concepts ?? []) {
44
- const aliasClause =
45
- c.aliases && c.aliases.length > 0
46
- ? `, c.aliases = [${c.aliases.map((a) => `'${esc(a)}'`).join(", ")}]`
47
- : "";
48
- const conceptMeta = c.metadata ? `, c.metadata = '${jsonStr(c.metadata)}'` : "";
49
-
50
- nodes.push(
51
- `MERGE (c:Concept {name: '${esc(c.name)}'})
52
- SET c.description = '${esc(c.description)}'${aliasClause}${conceptMeta}`,
53
- );
54
-
55
- edges.push(
56
- `MATCH (c:Concept {name: '${esc(c.name)}'})
57
- MATCH (d:Domain {name: '${esc(data.name)}'})
58
- MERGE (c)-[:BELONGS_TO]->(d)`,
59
- );
60
-
61
- if (c.parentConcept) {
62
- edges.push(
63
- `MATCH (child:Concept {name: '${esc(c.name)}'})
64
- MATCH (parent:Concept {name: '${esc(c.parentConcept.name)}'})
65
- MERGE (child)-[:SPECIALIZES]->(parent)`,
66
- );
67
- }
68
-
69
- c.governedBy?.forEach((rule) => {
70
- edges.push(
71
- `MATCH (r:Rule {name: '${esc(rule.name)}'})
72
- MATCH (t:Concept {name: '${esc(c.name)}'})
73
- MERGE (r)-[:GOVERNS]->(t)`,
74
- );
75
- });
76
- }
77
-
78
- // -- Endpoint nodes --
79
- for (const ep of data.endpoints ?? []) {
80
- const endpointMeta = ep.metadata
81
- ? `,\n e.metadata = '${jsonStr(ep.metadata)}'`
82
- : "";
83
- nodes.push(
84
- `MERGE (e:Endpoint {path: '${esc(ep.path)}', method: '${ep.method}'})
85
- SET e.name = '${esc(ep.name)}',
86
- e.description = '${esc(ep.description)}',
87
- e.params = '${jsonStr(ep.params)}',
88
- e.body = '${jsonStr(ep.body)}',
89
- e.response = '${jsonStr(ep.response)}',
90
- e.propertiesDescriptions = '${jsonStr(ep.propertiesDescriptions)}',
91
- e.successStatus = ${ep.successStatus},
92
- e.errorStatuses = [${ep.errorStatuses.join(", ")}]${endpointMeta}`,
93
- );
94
-
95
- for (const concept of ep.queries ?? []) {
96
- edges.push(
97
- `MATCH (c:Concept {name: '${esc(concept.name)}'})
98
- MATCH (e:Endpoint {path: '${esc(ep.path)}', method: '${ep.method}'})
99
- MERGE (c)-[:QUERIED_VIA]->(e)`,
100
- );
101
- }
102
-
103
- for (const concept of ep.mutates ?? []) {
104
- edges.push(
105
- `MATCH (c:Concept {name: '${esc(concept.name)}'})
106
- MATCH (e:Endpoint {path: '${esc(ep.path)}', method: '${ep.method}'})
107
- MERGE (c)-[:MUTATED_VIA]->(e)`,
108
- );
109
- }
110
-
111
- for (const ret of ep.returns ?? []) {
112
- const fieldClause = ret.field ? ` SET r.field = '${esc(ret.field)}'` : "";
113
-
114
- edges.push(
115
- `MATCH (e:Endpoint {path: '${esc(ep.path)}', method: '${ep.method}'})
116
- MATCH (c:Concept {name: '${esc(ret.concept.name)}'})
117
- MERGE (e)-[r:RETURNS]->(c)${fieldClause}`,
118
- );
119
- }
120
-
121
- for (const rule of ep.governedBy ?? []) {
122
- edges.push(
123
- `MATCH (r:Rule {name: '${esc(rule.name)}'})
124
- MATCH (t:Endpoint {path: '${esc(ep.path)}', method: '${ep.method}'})
125
- MERGE (r)-[:GOVERNS]->(t)`,
126
- );
127
- }
128
-
129
- for (const dep of ep.dependsOn ?? []) {
130
- edges.push(
131
- `MATCH (e:Endpoint {path: '${esc(ep.path)}', method: '${ep.method}'})
132
- MATCH (dep:Endpoint {path: '${esc(dep.endpoint.path)}', method: '${dep.endpoint.method}'})
133
- MERGE (e)-[d:DEPENDS_ON]->(dep)
134
- SET d.paramName = '${esc(dep.paramName)}', d.fromField = '${esc(dep.fromField)}'`,
135
- );
136
- }
137
- }
138
-
139
- // -- Service nodes --
140
- for (const svc of data.services ?? []) {
141
- const serviceMeta = svc.metadata
142
- ? `,\n s.metadata = '${jsonStr(svc.metadata)}'`
143
- : "";
144
- nodes.push(
145
- `MERGE (s:Service {builtInId: '${esc(svc.builtInId)}'})
146
- SET s.name = '${esc(svc.name)}',
147
- s.description = '${esc(svc.description)}'${serviceMeta}`,
148
- );
149
-
150
- edges.push(
151
- `MATCH (c:Concept {name: '${esc(svc.belongsTo.name)}'})
152
- MATCH (s:Service {builtInId: '${esc(svc.builtInId)}'})
153
- MERGE (c)-[:REQUESTED_VIA]->(s)`,
154
- );
155
-
156
- svc.governedBy?.forEach((rule) => {
157
- edges.push(
158
- `MATCH (r:Rule {name: '${esc(rule.name)}'})
159
- MATCH (t:Service {builtInId: '${esc(svc.builtInId)}'})
160
- MERGE (r)-[:GOVERNS]->(t)`,
161
- );
162
- });
163
- }
164
-
165
- // -- Rule nodes --
166
- for (const rule of data.rules ?? []) {
167
- const ruleMeta = rule.metadata
168
- ? `,\n r.metadata = '${jsonStr(rule.metadata)}'`
169
- : "";
170
- nodes.push(
171
- `MERGE (r:Rule {name: '${esc(rule.name)}'})
172
- SET r.description = '${esc(rule.description)}'${ruleMeta}`,
173
- );
174
- }
175
-
176
- return { nodes, edges } satisfies GeneratedCypher;
177
- }
178
-
179
- export function toCypherScript(data: DomainDef) {
180
- const { nodes, edges } = generateCypher(data);
181
- return (
182
- `// Auto-generated seed script for module: ${data.name}\n` +
183
- `// Generated at: ${new Date().toISOString()}\n` +
184
- `// Safe to re-run (uses MERGE)\n\n` +
185
- `// --- Nodes ---\n` +
186
- nodes.join(";\n\n") +
187
- ";\n\n" +
188
- `// --- Edges ---\n` +
189
- edges.join(";\n\n") +
190
- ";\n"
191
- );
192
- }
@@ -1,162 +0,0 @@
1
- /**
2
- * Seed orchestrator for the knowledge graph.
3
- *
4
- * Validates domains, generates Cypher, executes against Neo4j,
5
- * and generates concept embeddings. All configuration is passed
6
- * explicitly — no environment variables or Convex dependencies.
7
- */
8
-
9
- import type { EmbeddingModel } from "ai";
10
- import { embed } from "ai";
11
- import type { Neo4jClient, Neo4jConfig } from "./neo4j.ts";
12
- import { createNeo4jClient } from "./neo4j.ts";
13
- import { expandDomains } from "./expand-domains.ts";
14
- import { generateCypher, type GeneratedCypher } from "./generate-cypher.ts";
15
- import type { DomainDef } from "./types.ts";
16
- import { validateDomain } from "./validate.ts";
17
-
18
- // ---------------------------------------------------------------------------
19
- // Config
20
- // ---------------------------------------------------------------------------
21
-
22
- export type EmbeddingConfig = {
23
- model: EmbeddingModel;
24
- dimension: number;
25
- };
26
-
27
- export type SeedGraphConfig = {
28
- neo4j: Neo4jConfig;
29
- embedding: EmbeddingConfig;
30
- };
31
-
32
- // ---------------------------------------------------------------------------
33
- // Internal helpers
34
- // ---------------------------------------------------------------------------
35
-
36
- async function runStatements(client: Neo4jClient, label: string, statements: string[]) {
37
- console.log(`\n--- ${label} (${statements.length} statements) ---`);
38
-
39
- let success = 0;
40
- let failed = 0;
41
-
42
- for (const stmt of statements) {
43
- try {
44
- const result = await client.query(stmt);
45
- const parsed = JSON.parse(result);
46
- if (parsed.error) {
47
- console.error(` ✗ Failed: ${parsed.message}`);
48
- console.error(` Statement: ${stmt.substring(0, 120)}...`);
49
- failed++;
50
- } else {
51
- success++;
52
- }
53
- } catch (e) {
54
- console.error(` ✗ Exception: ${e}`);
55
- console.error(` Statement: ${stmt.substring(0, 120)}...`);
56
- failed++;
57
- }
58
- }
59
-
60
- console.log(` ✓ ${success} succeeded, ${failed} failed`);
61
- }
62
-
63
- async function generateEmbeddings(client: Neo4jClient, embeddingConfig: EmbeddingConfig) {
64
- console.log("Seeding concept embeddings...");
65
-
66
- // 1. Create the vector index (idempotent)
67
- await client.query(
68
- `CREATE VECTOR INDEX concept_embeddings IF NOT EXISTS
69
- FOR (c:Concept) ON (c.embedding)
70
- OPTIONS {indexConfig: {
71
- \`vector.dimensions\`: ${embeddingConfig.dimension},
72
- \`vector.similarity_function\`: 'cosine'
73
- }}`,
74
- );
75
- console.log("Vector index created (or already exists)");
76
-
77
- // 2. Fetch all concepts
78
- const conceptsRaw = await client.query(
79
- "MATCH (c:Concept) RETURN c.name AS name, c.description AS description",
80
- );
81
- const concepts: { name: string; description: string }[] = JSON.parse(conceptsRaw);
82
-
83
- if (!Array.isArray(concepts) || concepts.length === 0) {
84
- console.log("No concepts found in Neo4j");
85
- return;
86
- }
87
-
88
- console.log(`Found ${concepts.length} concepts, generating embeddings...`);
89
-
90
- // 3. Generate and store embeddings for each concept
91
- const embeddingResults = await Promise.all(
92
- concepts.map(async (concept) => ({
93
- concept,
94
- embedding: (
95
- await embed({
96
- model: embeddingConfig.model,
97
- value: concept.description,
98
- })
99
- ).embedding,
100
- })),
101
- );
102
-
103
- // 4. Store the embeddings in the graph
104
- await Promise.all(
105
- embeddingResults.map(
106
- async (result) =>
107
- await client.query(
108
- `MATCH (c:Concept {name: $name})
109
- SET c.embedding = $embedding`,
110
- {
111
- name: result.concept.name,
112
- embedding: result.embedding,
113
- },
114
- ),
115
- ),
116
- );
117
-
118
- console.log("Embedding seeding complete!");
119
- }
120
-
121
- // ---------------------------------------------------------------------------
122
- // Public API
123
- // ---------------------------------------------------------------------------
124
-
125
- export async function seedGraph(config: SeedGraphConfig, domains: Record<string, DomainDef>) {
126
- const expandedDomains = expandDomains(domains);
127
-
128
- // Validate all domains
129
- const validationErrors = Object.entries(expandedDomains).flatMap(([name, domain]) =>
130
- validateDomain(domain).map((err) => `[${name}] ${err}`),
131
- );
132
-
133
- if (validationErrors.length) {
134
- validationErrors.forEach((err) => console.error(err));
135
- throw new Error(`Validation failed with ${validationErrors.length} error(s)`);
136
- }
137
-
138
- const client = createNeo4jClient(config.neo4j, config.embedding.model);
139
- const targets = Object.entries(expandedDomains);
140
-
141
- console.log(`Seeding ${targets.length} domain(s)...`);
142
-
143
- // Generate Cypher for all target domains
144
- const allCypher: [string, GeneratedCypher][] = targets.map(([name, data]) => [
145
- name,
146
- generateCypher(data),
147
- ]);
148
-
149
- // Phase 1: Create all nodes across every domain first.
150
- // This ensures cross-domain references resolve correctly.
151
- const allNodes = allCypher.flatMap(([, c]) => c.nodes);
152
- await runStatements(client, "Phase 1: Nodes", allNodes);
153
-
154
- // Phase 2: Create all edges now that every node exists.
155
- const allEdges = allCypher.flatMap(([, c]) => c.edges);
156
- await runStatements(client, "Phase 2: Edges", allEdges);
157
-
158
- console.log("\nGraph seeding complete!");
159
-
160
- // Phase 3: Generate embeddings for concepts
161
- await generateEmbeddings(client, config.embedding);
162
- }
@@ -1,78 +0,0 @@
1
- import type { DomainDef } from "./types.ts";
2
-
3
- export function validateDomain(data: DomainDef) {
4
- const errors: string[] = [];
5
-
6
- const seenConceptNames = new Set<string>();
7
- for (const c of data.concepts ?? []) {
8
- if (seenConceptNames.has(c.name)) {
9
- errors.push(`Duplicate concept name: "${c.name}"`);
10
- }
11
- seenConceptNames.add(c.name);
12
- }
13
-
14
- const seenEndpointNames = new Set<string>();
15
- for (const e of data.endpoints ?? []) {
16
- if (seenEndpointNames.has(e.name)) {
17
- errors.push(`Duplicate endpoint name: "${e.name}"`);
18
- }
19
- seenEndpointNames.add(e.name);
20
- }
21
-
22
- const seenServiceNames = new Set<string>();
23
- for (const s of data.services ?? []) {
24
- if (seenServiceNames.has(s.name)) {
25
- errors.push(`Duplicate service name: "${s.name}"`);
26
- }
27
- seenServiceNames.add(s.name);
28
- }
29
-
30
- const seenRuleNames = new Set<string>();
31
- for (const r of data.rules ?? []) {
32
- if (seenRuleNames.has(r.name)) {
33
- errors.push(`Duplicate rule name: "${r.name}"`);
34
- }
35
- seenRuleNames.add(r.name);
36
- }
37
-
38
- // Cross-domain references are allowed (concepts/endpoints/services may
39
- // be defined in another domain), so we do not enforce local membership.
40
-
41
- const referencedConcepts = new Set<string>();
42
- const referencedRules = new Set<string>();
43
-
44
- for (const ep of data.endpoints ?? []) {
45
- ep.queries?.forEach((c) => referencedConcepts.add(c.name));
46
- ep.mutates?.forEach((c) => referencedConcepts.add(c.name));
47
- ep.returns?.forEach((r) => referencedConcepts.add(r.concept.name));
48
- ep.governedBy?.forEach((r) => referencedRules.add(r.name));
49
- }
50
-
51
- for (const svc of data.services ?? []) {
52
- referencedConcepts.add(svc.belongsTo.name);
53
- svc.governedBy?.forEach((r) => referencedRules.add(r.name));
54
- }
55
-
56
- for (const c of data.concepts ?? []) {
57
- c.governedBy?.forEach((r) => referencedRules.add(r.name));
58
- if (c.parentConcept) {
59
- referencedConcepts.add(c.parentConcept.name);
60
- }
61
- }
62
-
63
- for (const c of data.concepts ?? []) {
64
- if (!referencedConcepts.has(c.name)) {
65
- errors.push(`Concept "${c.name}" is never referenced by any endpoint, or service`);
66
- }
67
- }
68
-
69
- for (const r of data.rules ?? []) {
70
- if (!referencedRules.has(r.name)) {
71
- errors.push(
72
- `Rule "${r.name}" is never referenced by any endpoint, service, or concept`,
73
- );
74
- }
75
- }
76
-
77
- return errors;
78
- }