@m6d/cortex-server 1.8.0 → 2.0.1

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 (354) 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/rich-text.ts +207 -0
  10. package/contracts/runtime.ts +243 -0
  11. package/contracts/wire.ts +143 -0
  12. package/dist/contracts/graph/embed.d.ts +22 -0
  13. package/dist/{src/lib → contracts}/graph/helpers.d.ts +16 -14
  14. package/dist/{src/lib → contracts}/graph/neo4j.d.ts +5 -5
  15. package/dist/contracts/graph/schema.d.ts +62 -0
  16. package/dist/{src/lib → contracts}/graph/types.d.ts +1 -1
  17. package/dist/contracts/graph.d.ts +14 -0
  18. package/dist/contracts/rich-text.d.ts +32 -0
  19. package/dist/contracts/runtime.d.ts +310 -0
  20. package/dist/contracts/wire.d.ts +120 -0
  21. package/dist/src/lib/adapters/database/index.d.ts +61 -0
  22. package/dist/src/lib/adapters/database/message-content.d.ts +30 -0
  23. package/dist/src/lib/adapters/database/mssql/attachments.d.ts +100 -0
  24. package/dist/src/lib/adapters/database/mssql/client.d.ts +8 -0
  25. package/dist/src/lib/adapters/database/mssql/index.d.ts +194 -0
  26. package/dist/src/lib/adapters/database/mssql/llm-requests.d.ts +17 -0
  27. package/dist/src/lib/adapters/database/mssql/messages.d.ts +37 -0
  28. package/dist/src/lib/adapters/database/mssql/threads.d.ts +50 -0
  29. package/dist/src/lib/adapters/database/postgres/attachments.d.ts +113 -0
  30. package/dist/src/lib/adapters/database/postgres/client.d.ts +8 -0
  31. package/dist/src/lib/adapters/database/postgres/index.d.ts +207 -0
  32. package/dist/src/lib/adapters/database/postgres/llm-requests.d.ts +17 -0
  33. package/dist/src/lib/adapters/database/postgres/messages.d.ts +37 -0
  34. package/dist/src/lib/adapters/database/postgres/threads.d.ts +50 -0
  35. package/{src/lib/adapters/storage.ts → dist/src/lib/adapters/storage/index.d.ts} +1 -1
  36. package/dist/src/lib/adapters/{minio.d.ts → storage/minio.d.ts} +1 -1
  37. package/dist/src/lib/ai/active-runs.d.ts +63 -0
  38. package/dist/src/lib/ai/attachments.d.ts +30 -0
  39. package/dist/src/lib/ai/backend-url.d.ts +16 -0
  40. package/dist/src/lib/ai/cc-runtime.d.ts +61 -0
  41. package/dist/src/lib/ai/commit-gate.d.ts +21 -0
  42. package/dist/src/lib/ai/context/builder.d.ts +6 -7
  43. package/dist/src/lib/ai/context/compression-middleware.d.ts +15 -0
  44. package/dist/src/lib/ai/context/compressor.d.ts +2 -13
  45. package/dist/src/lib/ai/context/intra-turn-compressor.d.ts +9 -9
  46. package/dist/src/lib/ai/context/optimize-thread-context.d.ts +9 -0
  47. package/dist/src/lib/ai/context/summarizer.d.ts +3 -3
  48. package/dist/src/lib/ai/context/token-estimator.d.ts +5 -8
  49. package/dist/src/lib/ai/fetch.d.ts +1 -1
  50. package/dist/src/lib/ai/finish-turn.d.ts +23 -0
  51. package/dist/src/lib/ai/helpers.d.ts +37 -4
  52. package/dist/src/lib/ai/index.d.ts +6 -3
  53. package/dist/src/lib/ai/inspector.d.ts +41 -0
  54. package/dist/src/lib/ai/interceptors/request-interceptor.d.ts +6 -5
  55. package/dist/src/lib/ai/prompt.d.ts +5 -4
  56. package/dist/src/lib/ai/redis-runs.d.ts +41 -0
  57. package/dist/src/lib/ai/redis-stream-log.d.ts +39 -0
  58. package/dist/src/lib/ai/tools/execute-code.tool.d.ts +18 -4
  59. package/dist/src/lib/ai/tools/query-graph.tool.d.ts +13 -5
  60. package/dist/src/lib/ai/tools/read-attachment.tool.d.ts +21 -0
  61. package/dist/src/lib/ai/tools/search-common.d.ts +17 -0
  62. package/dist/src/lib/ai/tools/search-knowledge.tool.d.ts +15 -0
  63. package/dist/src/lib/ai/tools/search-services.tool.d.ts +12 -0
  64. package/dist/src/lib/ai/tools/search-tools.tool.d.ts +12 -0
  65. package/dist/src/lib/ai/turn-tools.d.ts +39 -0
  66. package/dist/src/lib/ai/vision/rasterize-pdf.d.ts +26 -0
  67. package/dist/src/lib/ai/vision/rasterize-pdf.worker.d.ts +1 -0
  68. package/dist/src/lib/ai/vision/vision-reader.d.ts +45 -0
  69. package/dist/src/lib/cc/client.d.ts +183 -0
  70. package/dist/src/lib/cc/config-cache.d.ts +20 -0
  71. package/dist/src/lib/cc/format.d.ts +23 -0
  72. package/dist/src/lib/cc/registry.d.ts +34 -0
  73. package/dist/src/lib/cc/types.d.ts +27 -0
  74. package/dist/src/lib/config.d.ts +81 -64
  75. package/dist/src/lib/db/drizzle.config.mssql.d.ts +2 -0
  76. package/dist/src/lib/db/drizzle.config.pg.d.ts +2 -0
  77. package/dist/src/lib/db/migrate.d.ts +7 -1
  78. package/dist/src/lib/db/{schema.d.ts → schema.mssql.d.ts} +138 -29
  79. package/dist/src/lib/db/schema.pg.d.ts +546 -0
  80. package/dist/src/lib/factory.d.ts +2 -12
  81. package/dist/src/lib/graph/index.d.ts +10 -11
  82. package/dist/src/lib/graph/resolver.d.ts +2 -3
  83. package/dist/src/lib/index.d.ts +3 -3
  84. package/dist/src/lib/redis.d.ts +19 -0
  85. package/dist/src/lib/routes/chat.d.ts +1 -1
  86. package/dist/src/lib/routes/files.d.ts +1 -1
  87. package/dist/src/lib/routes/owned-thread.d.ts +17 -0
  88. package/dist/src/lib/routes/threads.d.ts +1 -1
  89. package/dist/src/lib/routes/ws.d.ts +1 -1
  90. package/dist/src/lib/types.d.ts +20 -37
  91. package/dist/src/lib/ws/connections.d.ts +2 -1
  92. package/package.json +33 -18
  93. package/src/lib/adapters/database/index.ts +78 -0
  94. package/src/lib/adapters/database/message-content.ts +39 -0
  95. package/src/lib/adapters/database/mssql/attachments.ts +90 -0
  96. package/src/lib/adapters/database/mssql/client.ts +11 -0
  97. package/src/lib/adapters/database/mssql/index.ts +23 -0
  98. package/src/lib/adapters/database/mssql/llm-requests.ts +43 -0
  99. package/src/lib/adapters/database/mssql/messages.ts +92 -0
  100. package/src/lib/adapters/database/mssql/threads.ts +83 -0
  101. package/src/lib/adapters/database/postgres/attachments.ts +88 -0
  102. package/src/lib/adapters/database/postgres/client.ts +11 -0
  103. package/src/lib/adapters/database/postgres/index.ts +23 -0
  104. package/src/lib/adapters/database/postgres/llm-requests.ts +45 -0
  105. package/src/lib/adapters/database/postgres/messages.ts +92 -0
  106. package/src/lib/adapters/database/postgres/threads.ts +84 -0
  107. package/{dist/src/lib/adapters/storage.d.ts → src/lib/adapters/storage/index.ts} +1 -1
  108. package/src/lib/adapters/{minio.ts → storage/minio.ts} +5 -5
  109. package/src/lib/ai/active-runs.ts +157 -0
  110. package/src/lib/ai/attachments.ts +144 -0
  111. package/src/lib/ai/backend-url.ts +27 -0
  112. package/src/lib/ai/cc-runtime.ts +63 -0
  113. package/src/lib/ai/commit-gate.ts +116 -0
  114. package/src/lib/ai/context/builder.ts +12 -14
  115. package/src/lib/ai/context/compression-middleware.ts +44 -0
  116. package/src/lib/ai/context/compressor.ts +67 -59
  117. package/src/lib/ai/context/intra-turn-compressor.ts +121 -204
  118. package/src/lib/ai/context/optimize-thread-context.ts +50 -0
  119. package/src/lib/ai/context/summarizer.ts +28 -30
  120. package/src/lib/ai/context/token-estimator.ts +35 -30
  121. package/src/lib/ai/fetch.ts +10 -5
  122. package/src/lib/ai/finish-turn.ts +75 -0
  123. package/src/lib/ai/helpers.ts +83 -15
  124. package/src/lib/ai/index.ts +366 -329
  125. package/src/lib/ai/inspector.ts +112 -0
  126. package/src/lib/ai/interceptors/request-interceptor.ts +70 -42
  127. package/src/lib/ai/prompt.ts +126 -125
  128. package/src/lib/ai/redis-runs.ts +167 -0
  129. package/src/lib/ai/redis-stream-log.ts +219 -0
  130. package/src/lib/ai/tools/execute-code.tool.ts +178 -67
  131. package/src/lib/ai/tools/query-graph.tool.ts +7 -8
  132. package/src/lib/ai/tools/read-attachment.tool.ts +59 -0
  133. package/src/lib/ai/tools/search-common.ts +15 -0
  134. package/src/lib/ai/tools/search-knowledge.tool.ts +33 -0
  135. package/src/lib/ai/tools/search-services.tool.ts +31 -0
  136. package/src/lib/ai/tools/search-tools.tool.ts +29 -0
  137. package/src/lib/ai/turn-tools.ts +154 -0
  138. package/src/lib/ai/vision/rasterize-pdf.ts +69 -0
  139. package/src/lib/ai/vision/rasterize-pdf.worker.ts +81 -0
  140. package/src/lib/ai/vision/vision-reader.ts +130 -0
  141. package/src/lib/auth/middleware.ts +5 -3
  142. package/src/lib/cc/client.ts +273 -0
  143. package/src/lib/cc/config-cache.ts +32 -0
  144. package/src/lib/cc/format.ts +92 -0
  145. package/src/lib/cc/registry.ts +62 -0
  146. package/src/lib/cc/types.ts +44 -0
  147. package/src/lib/config.ts +102 -71
  148. package/src/lib/db/drizzle.config.mssql.ts +9 -0
  149. package/src/lib/db/drizzle.config.pg.ts +9 -0
  150. package/src/lib/db/migrate.ts +45 -10
  151. package/src/lib/db/migrations/mssql/20260729092726_talented_wilson_fisk/migration.sql +20 -0
  152. package/src/lib/db/migrations/mssql/20260729092726_talented_wilson_fisk/snapshot.json +497 -0
  153. package/src/lib/db/migrations/mssql/20260801003652_perpetual_blue_shield/migration.sql +1 -0
  154. package/src/lib/db/migrations/mssql/20260801003652_perpetual_blue_shield/snapshot.json +516 -0
  155. package/src/lib/db/migrations/mssql/20260812174642_user_id_text/migration.sql +2 -0
  156. package/src/lib/db/migrations/mssql/20260812174642_user_id_text/snapshot.json +516 -0
  157. package/src/lib/db/migrations/pg/20260801084117_thick_ben_grimm/migration.sql +53 -0
  158. package/src/lib/db/migrations/pg/20260801084117_thick_ben_grimm/snapshot.json +584 -0
  159. package/src/lib/db/migrations/pg/20260812174622_user_id_text/migration.sql +2 -0
  160. package/src/lib/db/migrations/pg/20260812174622_user_id_text/snapshot.json +584 -0
  161. package/src/lib/db/{schema.ts → schema.mssql.ts} +29 -18
  162. package/src/lib/db/schema.pg.ts +95 -0
  163. package/src/lib/factory.ts +44 -89
  164. package/src/lib/graph/index.ts +12 -40
  165. package/src/lib/graph/resolver.ts +146 -116
  166. package/src/lib/index.ts +11 -4
  167. package/src/lib/redis.ts +44 -0
  168. package/src/lib/routes/chat.ts +91 -62
  169. package/src/lib/routes/files.ts +105 -83
  170. package/src/lib/routes/owned-thread.ts +17 -0
  171. package/src/lib/routes/threads.ts +14 -30
  172. package/src/lib/routes/ws.ts +9 -3
  173. package/src/lib/types.ts +37 -36
  174. package/src/lib/ws/connections.ts +9 -1
  175. package/tsconfig.json +48 -0
  176. package/dist/src/lib/adapters/database.d.ts +0 -45
  177. package/dist/src/lib/adapters/mssql.d.ts +0 -3
  178. package/dist/src/lib/ai/active-streams.d.ts +0 -14
  179. package/dist/src/lib/ai/context/index.d.ts +0 -16
  180. package/dist/src/lib/ai/tools/capture-files.tool.d.ts +0 -6
  181. package/dist/src/lib/cli/extract-endpoints.d.ts +0 -6
  182. package/dist/src/lib/graph/expand-domains.d.ts +0 -2
  183. package/dist/src/lib/graph/generate-cypher.d.ts +0 -22
  184. package/dist/src/lib/graph/seed.d.ts +0 -19
  185. package/dist/src/lib/graph/validate.d.ts +0 -2
  186. package/dist/src/lib/routes/index.d.ts +0 -4
  187. package/dist/src/lib/ws/events.d.ts +0 -39
  188. package/dist/src/lib/ws/index.d.ts +0 -3
  189. package/dist/src/lib/ws/notify.d.ts +0 -2
  190. package/src/lib/adapters/database.ts +0 -48
  191. package/src/lib/adapters/mssql.ts +0 -231
  192. package/src/lib/ai/active-streams.ts +0 -123
  193. package/src/lib/ai/context/index.ts +0 -80
  194. package/src/lib/ai/tools/capture-files.tool.ts +0 -20
  195. package/src/lib/cli/extract-endpoints.ts +0 -550
  196. package/src/lib/graph/expand-domains.ts +0 -276
  197. package/src/lib/graph/generate-cypher.ts +0 -192
  198. package/src/lib/graph/seed.ts +0 -162
  199. package/src/lib/graph/validate.ts +0 -78
  200. package/src/lib/routes/index.ts +0 -4
  201. package/src/lib/ws/events.ts +0 -39
  202. package/src/lib/ws/index.ts +0 -11
  203. package/src/lib/ws/notify.ts +0 -9
  204. package/src/sample/db/client.ts +0 -9
  205. package/src/sample/db/migrations/20260411023125_rich_purple_man/migration.sql +0 -5
  206. package/src/sample/db/migrations/20260411023125_rich_purple_man/snapshot.json +0 -50
  207. package/src/sample/db/schema.ts +0 -10
  208. package/src/sample/domains/account/concepts/session.concept.ts +0 -17
  209. package/src/sample/domains/account/endpoints/listCurrentSessions.endpoint.ts +0 -31
  210. package/src/sample/domains/account/endpoints/revokeAllOtherSessions.endpoint.ts +0 -22
  211. package/src/sample/domains/account/endpoints/revokeCurrentSession.endpoint.ts +0 -33
  212. package/src/sample/domains/account/index.ts +0 -18
  213. package/src/sample/domains/appraisals/concepts/appraisalCycle.concept.ts +0 -15
  214. package/src/sample/domains/appraisals/concepts/appraisalRecord.concept.ts +0 -20
  215. package/src/sample/domains/appraisals/concepts/appraisalRecordCompetency.concept.ts +0 -10
  216. package/src/sample/domains/appraisals/concepts/appraisalRecordFunctionalRequirement.concept.ts +0 -10
  217. package/src/sample/domains/appraisals/concepts/appraisalRecordGoal.concept.ts +0 -17
  218. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordById.endpoint.ts +0 -321
  219. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordCompetencies.endpoint.ts +0 -120
  220. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordFunctionalRequirements.endpoint.ts +0 -126
  221. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordGoals.endpoint.ts +0 -104
  222. package/src/sample/domains/appraisals/endpoints/getAppraisalRecordScore.endpoint.ts +0 -58
  223. package/src/sample/domains/appraisals/endpoints/listAppraisalCyclesSimple.endpoint.ts +0 -52
  224. package/src/sample/domains/appraisals/endpoints/listAppraisalRecords.endpoint.ts +0 -245
  225. package/src/sample/domains/appraisals/endpoints/listAppraisalTemplatesSimple.endpoint.ts +0 -52
  226. package/src/sample/domains/appraisals/index.ts +0 -40
  227. package/src/sample/domains/appraisals/rules/appraisalRecordScoping.rule.ts +0 -7
  228. package/src/sample/domains/attendance/concepts/attendancePermission.concept.ts +0 -17
  229. package/src/sample/domains/attendance/concepts/attendanceTransaction.concept.ts +0 -17
  230. package/src/sample/domains/attendance/concepts/publicHoliday.concept.ts +0 -10
  231. package/src/sample/domains/attendance/concepts/punch.concept.ts +0 -19
  232. package/src/sample/domains/attendance/endpoints/getAttendanceTransactionById.endpoint.ts +0 -444
  233. package/src/sample/domains/attendance/endpoints/getCurrentAttendanceProfile.endpoint.ts +0 -886
  234. package/src/sample/domains/attendance/endpoints/getCurrentAttendanceStatistics.endpoint.ts +0 -49
  235. package/src/sample/domains/attendance/endpoints/listAttendancePermissions.endpoint.ts +0 -176
  236. package/src/sample/domains/attendance/endpoints/listAttendanceTransactionStates.endpoint.ts +0 -26
  237. package/src/sample/domains/attendance/endpoints/listAttendanceTransactions.endpoint.ts +0 -373
  238. package/src/sample/domains/attendance/endpoints/listPublicHolidaysSimple.endpoint.ts +0 -52
  239. package/src/sample/domains/attendance/endpoints/listPunchTypes.endpoint.ts +0 -25
  240. package/src/sample/domains/attendance/endpoints/listPunches.endpoint.ts +0 -178
  241. package/src/sample/domains/attendance/index.ts +0 -41
  242. package/src/sample/domains/attendance/services/attendancePermissions.service.ts +0 -15
  243. package/src/sample/domains/employees/concepts/employee.concept.ts +0 -20
  244. package/src/sample/domains/employees/concepts/employeeBankAccount.concept.ts +0 -19
  245. package/src/sample/domains/employees/concepts/employeeChild.concept.ts +0 -19
  246. package/src/sample/domains/employees/concepts/employeeDocument.concept.ts +0 -21
  247. package/src/sample/domains/employees/concepts/employeeEvent.concept.ts +0 -21
  248. package/src/sample/domains/employees/concepts/employeeExperience.concept.ts +0 -18
  249. package/src/sample/domains/employees/concepts/employeeJobLevelChange.concept.ts +0 -21
  250. package/src/sample/domains/employees/concepts/employeeMedal.concept.ts +0 -20
  251. package/src/sample/domains/employees/concepts/employeeQualification.concept.ts +0 -20
  252. package/src/sample/domains/employees/concepts/employeeSpouse.concept.ts +0 -21
  253. package/src/sample/domains/employees/concepts/employeeViolation.concept.ts +0 -19
  254. package/src/sample/domains/employees/endpoints/getCurrentEmployee.endpoint.ts +0 -1651
  255. package/src/sample/domains/employees/endpoints/getCurrentIdentity.endpoint.ts +0 -197
  256. package/src/sample/domains/employees/endpoints/getCurrentManagers.endpoint.ts +0 -142
  257. package/src/sample/domains/employees/endpoints/getEmployeeById.endpoint.ts +0 -1659
  258. package/src/sample/domains/employees/endpoints/getEmployeeStatistics.endpoint.ts +0 -43
  259. package/src/sample/domains/employees/endpoints/listBankAccounts.endpoint.ts +0 -223
  260. package/src/sample/domains/employees/endpoints/listChildren.endpoint.ts +0 -211
  261. package/src/sample/domains/employees/endpoints/listDocuments.endpoint.ts +0 -222
  262. package/src/sample/domains/employees/endpoints/listEmployeesSimple.endpoint.ts +0 -156
  263. package/src/sample/domains/employees/endpoints/listEvents.endpoint.ts +0 -120
  264. package/src/sample/domains/employees/endpoints/listExperiences.endpoint.ts +0 -188
  265. package/src/sample/domains/employees/endpoints/listJobLevelChanges.endpoint.ts +0 -240
  266. package/src/sample/domains/employees/endpoints/listMedals.endpoint.ts +0 -266
  267. package/src/sample/domains/employees/endpoints/listQualifications.endpoint.ts +0 -265
  268. package/src/sample/domains/employees/endpoints/listSpouses.endpoint.ts +0 -278
  269. package/src/sample/domains/employees/endpoints/listViolations.endpoint.ts +0 -245
  270. package/src/sample/domains/employees/index.ts +0 -75
  271. package/src/sample/domains/employees/services/employees.service.ts +0 -181
  272. package/src/sample/domains/index.ts +0 -10
  273. package/src/sample/domains/leaves/concepts/leave.concept.ts +0 -21
  274. package/src/sample/domains/leaves/concepts/leaveBalance.concept.ts +0 -17
  275. package/src/sample/domains/leaves/concepts/leaveBalanceTransaction.concept.ts +0 -16
  276. package/src/sample/domains/leaves/concepts/leaveType.concept.ts +0 -13
  277. package/src/sample/domains/leaves/concepts/leaveTypes.concept.ts +0 -205
  278. package/src/sample/domains/leaves/endpoints/getBalance.endpoint.ts +0 -53
  279. package/src/sample/domains/leaves/endpoints/getLeaveById.endpoint.ts +0 -53
  280. package/src/sample/domains/leaves/endpoints/listBalanceTransactions.endpoint.ts +0 -196
  281. package/src/sample/domains/leaves/endpoints/listBalanceTypes.endpoint.ts +0 -26
  282. package/src/sample/domains/leaves/endpoints/listBalances.endpoint.ts +0 -201
  283. package/src/sample/domains/leaves/endpoints/listLeaveTypes.endpoint.ts +0 -28
  284. package/src/sample/domains/leaves/endpoints/listLeaves.endpoint.ts +0 -234
  285. package/src/sample/domains/leaves/index.ts +0 -38
  286. package/src/sample/domains/leaves/services/leaveRequests.service.ts +0 -232
  287. package/src/sample/domains/notifications/concepts/notification.concept.ts +0 -19
  288. package/src/sample/domains/notifications/endpoints/countMyNotifications.endpoint.ts +0 -21
  289. package/src/sample/domains/notifications/endpoints/getMyNotification.endpoint.ts +0 -57
  290. package/src/sample/domains/notifications/endpoints/listMyNotifications.endpoint.ts +0 -59
  291. package/src/sample/domains/notifications/endpoints/markMyNotificationAsRead.endpoint.ts +0 -32
  292. package/src/sample/domains/notifications/index.ts +0 -20
  293. package/src/sample/domains/payroll/concepts/payslip.concept.ts +0 -18
  294. package/src/sample/domains/payroll/concepts/salaryCertificate.concept.ts +0 -17
  295. package/src/sample/domains/payroll/concepts/salaryCertificateRequestingEntity.concept.ts +0 -8
  296. package/src/sample/domains/payroll/endpoints/getPayslipById.endpoint.ts +0 -238
  297. package/src/sample/domains/payroll/endpoints/listPayslips.endpoint.ts +0 -216
  298. package/src/sample/domains/payroll/endpoints/listSalaryCertificateLanguages.endpoint.ts +0 -25
  299. package/src/sample/domains/payroll/endpoints/listSalaryCertificateRequestingEntities.endpoint.ts +0 -62
  300. package/src/sample/domains/payroll/endpoints/listSalaryCertificateTypes.endpoint.ts +0 -24
  301. package/src/sample/domains/payroll/endpoints/listSalaryCertificates.endpoint.ts +0 -122
  302. package/src/sample/domains/payroll/endpoints/previewSalaryCertificate.endpoint.ts +0 -45
  303. package/src/sample/domains/payroll/index.ts +0 -32
  304. package/src/sample/domains/payroll/rules/payrollEmployeeContext.rule.ts +0 -7
  305. package/src/sample/domains/payroll/services/salaryCertificates.service.ts +0 -15
  306. package/src/sample/domains/servicing/concepts/service.concept.ts +0 -6
  307. package/src/sample/domains/servicing/concepts/serviceRequest.concept.ts +0 -12
  308. package/src/sample/domains/servicing/concepts/serviceRequestApproval.concept.ts +0 -9
  309. package/src/sample/domains/servicing/endpoints/cancelServiceRequest.endpoint.ts +0 -21
  310. package/src/sample/domains/servicing/endpoints/createServiceRequest.endpoint.ts +0 -511
  311. package/src/sample/domains/servicing/endpoints/getServiceRequest.endpoint.ts +0 -352
  312. package/src/sample/domains/servicing/endpoints/getServiceRequestFormItems.endpoint.ts +0 -219
  313. package/src/sample/domains/servicing/endpoints/getServiceRequestTransactionFormItems.endpoint.ts +0 -216
  314. package/src/sample/domains/servicing/endpoints/getServiceStates.endpoint.ts +0 -47
  315. package/src/sample/domains/servicing/endpoints/invokeServiceRequestAction.endpoint.ts +0 -139
  316. package/src/sample/domains/servicing/endpoints/listServiceRequests.endpoint.ts +0 -292
  317. package/src/sample/domains/servicing/endpoints/listServices.endpoint.ts +0 -108
  318. package/src/sample/domains/servicing/endpoints/updateServiceRequest.endpoint.ts +0 -355
  319. package/src/sample/domains/servicing/index.ts +0 -44
  320. package/src/sample/domains/servicing/rules/checkValidActions.rule.ts +0 -7
  321. package/src/sample/domains/servicing/rules/createServiceRequest.rule.ts +0 -7
  322. package/src/sample/domains/servicing/rules/filterServiceRequestsByState.rule.ts +0 -7
  323. package/src/sample/domains/servicing/rules/passingOptionFields.rule.ts +0 -7
  324. package/src/sample/domains/shared/rules/pagination.rule.ts +0 -7
  325. package/src/sample/domains/suggestions/concepts/suggestion.concept.ts +0 -19
  326. package/src/sample/domains/suggestions/concepts/suggestionCategory.concept.ts +0 -7
  327. package/src/sample/domains/suggestions/concepts/suggestionImpactLevel.concept.ts +0 -7
  328. package/src/sample/domains/suggestions/endpoints/createSuggestion.endpoint.ts +0 -705
  329. package/src/sample/domains/suggestions/endpoints/deleteSuggestion.endpoint.ts +0 -32
  330. package/src/sample/domains/suggestions/endpoints/getSuggestionById.endpoint.ts +0 -635
  331. package/src/sample/domains/suggestions/endpoints/listSuggestionCategories.endpoint.ts +0 -62
  332. package/src/sample/domains/suggestions/endpoints/listSuggestionImpactLevels.endpoint.ts +0 -62
  333. package/src/sample/domains/suggestions/endpoints/listSuggestionStates.endpoint.ts +0 -24
  334. package/src/sample/domains/suggestions/endpoints/listSuggestions.endpoint.ts +0 -132
  335. package/src/sample/domains/suggestions/endpoints/updateSuggestion.endpoint.ts +0 -690
  336. package/src/sample/domains/suggestions/endpoints/updateSuggestionState.endpoint.ts +0 -39
  337. package/src/sample/domains/suggestions/index.ts +0 -34
  338. package/src/sample/domains/suggestions/rules/suggestionScope.rule.ts +0 -7
  339. package/src/sample/domains/surveys/concepts/survey.concept.ts +0 -10
  340. package/src/sample/domains/surveys/concepts/surveyResponse.concept.ts +0 -14
  341. package/src/sample/domains/surveys/endpoints/getSurveyResponseById.endpoint.ts +0 -131
  342. package/src/sample/domains/surveys/endpoints/getTargetedSurvey.endpoint.ts +0 -129
  343. package/src/sample/domains/surveys/endpoints/listTargetedSurveys.endpoint.ts +0 -160
  344. package/src/sample/domains/surveys/endpoints/respondToSurvey.endpoint.ts +0 -144
  345. package/src/sample/domains/surveys/index.ts +0 -21
  346. package/src/sample/drizzle.config.ts +0 -11
  347. package/src/sample/index.bak.ts +0 -341
  348. package/src/sample/index.ts +0 -318
  349. package/src/sample/official-statements/defaults.ts +0 -57
  350. package/src/sample/official-statements/routes.ts +0 -137
  351. package/src/sample/official-statements/service.ts +0 -148
  352. package/src/sample/official-statements/types.ts +0 -23
  353. /package/src/lib/db/migrations/{20260326231647_nice_speedball → mssql/20260326231647_nice_speedball}/migration.sql +0 -0
  354. /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
- }