@lwelliott/cortex-cli 1.0.3

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 (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/cli/audit.d.ts +3 -0
  4. package/dist/cli/audit.d.ts.map +1 -0
  5. package/dist/cli/audit.js +78 -0
  6. package/dist/cli/audit.js.map +1 -0
  7. package/dist/cli/doc.d.ts +3 -0
  8. package/dist/cli/doc.d.ts.map +1 -0
  9. package/dist/cli/doc.js +291 -0
  10. package/dist/cli/doc.js.map +1 -0
  11. package/dist/cli/entity.d.ts +3 -0
  12. package/dist/cli/entity.d.ts.map +1 -0
  13. package/dist/cli/entity.js +135 -0
  14. package/dist/cli/entity.js.map +1 -0
  15. package/dist/cli/format-selector.d.ts +30 -0
  16. package/dist/cli/format-selector.d.ts.map +1 -0
  17. package/dist/cli/format-selector.js +101 -0
  18. package/dist/cli/format-selector.js.map +1 -0
  19. package/dist/cli/formatters/audit-formatter.d.ts +33 -0
  20. package/dist/cli/formatters/audit-formatter.d.ts.map +1 -0
  21. package/dist/cli/formatters/audit-formatter.js +204 -0
  22. package/dist/cli/formatters/audit-formatter.js.map +1 -0
  23. package/dist/cli/formatters/json.d.ts +10 -0
  24. package/dist/cli/formatters/json.d.ts.map +1 -0
  25. package/dist/cli/formatters/json.js +31 -0
  26. package/dist/cli/formatters/json.js.map +1 -0
  27. package/dist/cli/formatters/markdown.d.ts +12 -0
  28. package/dist/cli/formatters/markdown.d.ts.map +1 -0
  29. package/dist/cli/formatters/markdown.js +341 -0
  30. package/dist/cli/formatters/markdown.js.map +1 -0
  31. package/dist/cli/formatters/quiet.d.ts +15 -0
  32. package/dist/cli/formatters/quiet.d.ts.map +1 -0
  33. package/dist/cli/formatters/quiet.js +75 -0
  34. package/dist/cli/formatters/quiet.js.map +1 -0
  35. package/dist/cli/formatters/table.d.ts +11 -0
  36. package/dist/cli/formatters/table.d.ts.map +1 -0
  37. package/dist/cli/formatters/table.js +726 -0
  38. package/dist/cli/formatters/table.js.map +1 -0
  39. package/dist/cli/graph.d.ts +3 -0
  40. package/dist/cli/graph.d.ts.map +1 -0
  41. package/dist/cli/graph.js +209 -0
  42. package/dist/cli/graph.js.map +1 -0
  43. package/dist/cli/index.d.ts +3 -0
  44. package/dist/cli/index.d.ts.map +1 -0
  45. package/dist/cli/index.js +144 -0
  46. package/dist/cli/index.js.map +1 -0
  47. package/dist/cli/lesson.d.ts +3 -0
  48. package/dist/cli/lesson.d.ts.map +1 -0
  49. package/dist/cli/lesson.js +85 -0
  50. package/dist/cli/lesson.js.map +1 -0
  51. package/dist/cli/project-resolver.d.ts +17 -0
  52. package/dist/cli/project-resolver.d.ts.map +1 -0
  53. package/dist/cli/project-resolver.js +25 -0
  54. package/dist/cli/project-resolver.js.map +1 -0
  55. package/dist/cli/project.d.ts +12 -0
  56. package/dist/cli/project.d.ts.map +1 -0
  57. package/dist/cli/project.js +169 -0
  58. package/dist/cli/project.js.map +1 -0
  59. package/dist/cli/relation.d.ts +3 -0
  60. package/dist/cli/relation.d.ts.map +1 -0
  61. package/dist/cli/relation.js +128 -0
  62. package/dist/cli/relation.js.map +1 -0
  63. package/dist/cli/review.d.ts +3 -0
  64. package/dist/cli/review.d.ts.map +1 -0
  65. package/dist/cli/review.js +131 -0
  66. package/dist/cli/review.js.map +1 -0
  67. package/dist/cli/router.d.ts +38 -0
  68. package/dist/cli/router.d.ts.map +1 -0
  69. package/dist/cli/router.js +49 -0
  70. package/dist/cli/router.js.map +1 -0
  71. package/dist/cli/schema.d.ts +3 -0
  72. package/dist/cli/schema.d.ts.map +1 -0
  73. package/dist/cli/schema.js +94 -0
  74. package/dist/cli/schema.js.map +1 -0
  75. package/dist/cli/sprint.d.ts +12 -0
  76. package/dist/cli/sprint.d.ts.map +1 -0
  77. package/dist/cli/sprint.js +200 -0
  78. package/dist/cli/sprint.js.map +1 -0
  79. package/dist/cli/task.d.ts +12 -0
  80. package/dist/cli/task.d.ts.map +1 -0
  81. package/dist/cli/task.js +252 -0
  82. package/dist/cli/task.js.map +1 -0
  83. package/dist/cli/test-report.d.ts +3 -0
  84. package/dist/cli/test-report.d.ts.map +1 -0
  85. package/dist/cli/test-report.js +134 -0
  86. package/dist/cli/test-report.js.map +1 -0
  87. package/dist/cli/validate.d.ts +8 -0
  88. package/dist/cli/validate.d.ts.map +1 -0
  89. package/dist/cli/validate.js +86 -0
  90. package/dist/cli/validate.js.map +1 -0
  91. package/dist/config/config.d.ts +18 -0
  92. package/dist/config/config.d.ts.map +1 -0
  93. package/dist/config/config.js +70 -0
  94. package/dist/config/config.js.map +1 -0
  95. package/dist/config/registry.d.ts +52 -0
  96. package/dist/config/registry.d.ts.map +1 -0
  97. package/dist/config/registry.js +193 -0
  98. package/dist/config/registry.js.map +1 -0
  99. package/dist/config/resolver.d.ts +26 -0
  100. package/dist/config/resolver.d.ts.map +1 -0
  101. package/dist/config/resolver.js +87 -0
  102. package/dist/config/resolver.js.map +1 -0
  103. package/dist/db/builtin-schema-constants.d.ts +109 -0
  104. package/dist/db/builtin-schema-constants.d.ts.map +1 -0
  105. package/dist/db/builtin-schema-constants.js +32 -0
  106. package/dist/db/builtin-schema-constants.js.map +1 -0
  107. package/dist/db/connection.d.ts +34 -0
  108. package/dist/db/connection.d.ts.map +1 -0
  109. package/dist/db/connection.js +140 -0
  110. package/dist/db/connection.js.map +1 -0
  111. package/dist/db/generated/schema-types.d.ts +134 -0
  112. package/dist/db/generated/schema-types.d.ts.map +1 -0
  113. package/dist/db/generated/schema-types.js +31 -0
  114. package/dist/db/generated/schema-types.js.map +1 -0
  115. package/dist/db/locks.d.ts +106 -0
  116. package/dist/db/locks.d.ts.map +1 -0
  117. package/dist/db/locks.js +211 -0
  118. package/dist/db/locks.js.map +1 -0
  119. package/dist/db/migration.d.ts +65 -0
  120. package/dist/db/migration.d.ts.map +1 -0
  121. package/dist/db/migration.js +233 -0
  122. package/dist/db/migration.js.map +1 -0
  123. package/dist/db/retry.d.ts +26 -0
  124. package/dist/db/retry.d.ts.map +1 -0
  125. package/dist/db/retry.js +71 -0
  126. package/dist/db/retry.js.map +1 -0
  127. package/dist/db/schema.d.ts +21 -0
  128. package/dist/db/schema.d.ts.map +1 -0
  129. package/dist/db/schema.js +830 -0
  130. package/dist/db/schema.js.map +1 -0
  131. package/dist/models/common.d.ts +27 -0
  132. package/dist/models/common.d.ts.map +1 -0
  133. package/dist/models/common.js +4 -0
  134. package/dist/models/common.js.map +1 -0
  135. package/dist/models/document.d.ts +89 -0
  136. package/dist/models/document.d.ts.map +1 -0
  137. package/dist/models/document.js +5 -0
  138. package/dist/models/document.js.map +1 -0
  139. package/dist/models/entity-model.d.ts +30 -0
  140. package/dist/models/entity-model.d.ts.map +1 -0
  141. package/dist/models/entity-model.js +99 -0
  142. package/dist/models/entity-model.js.map +1 -0
  143. package/dist/models/entity.d.ts +88 -0
  144. package/dist/models/entity.d.ts.map +1 -0
  145. package/dist/models/entity.js +5 -0
  146. package/dist/models/entity.js.map +1 -0
  147. package/dist/models/graph-schema.d.ts +43 -0
  148. package/dist/models/graph-schema.d.ts.map +1 -0
  149. package/dist/models/graph-schema.js +76 -0
  150. package/dist/models/graph-schema.js.map +1 -0
  151. package/dist/models/project.d.ts +49 -0
  152. package/dist/models/project.d.ts.map +1 -0
  153. package/dist/models/project.js +18 -0
  154. package/dist/models/project.js.map +1 -0
  155. package/dist/models/relation.d.ts +35 -0
  156. package/dist/models/relation.d.ts.map +1 -0
  157. package/dist/models/relation.js +212 -0
  158. package/dist/models/relation.js.map +1 -0
  159. package/dist/models/review.d.ts +86 -0
  160. package/dist/models/review.d.ts.map +1 -0
  161. package/dist/models/review.js +5 -0
  162. package/dist/models/review.js.map +1 -0
  163. package/dist/models/sprint.d.ts +38 -0
  164. package/dist/models/sprint.d.ts.map +1 -0
  165. package/dist/models/sprint.js +4 -0
  166. package/dist/models/sprint.js.map +1 -0
  167. package/dist/models/task.d.ts +75 -0
  168. package/dist/models/task.d.ts.map +1 -0
  169. package/dist/models/task.js +4 -0
  170. package/dist/models/task.js.map +1 -0
  171. package/dist/models/validation.d.ts +25 -0
  172. package/dist/models/validation.d.ts.map +1 -0
  173. package/dist/models/validation.js +4 -0
  174. package/dist/models/validation.js.map +1 -0
  175. package/dist/services/audit-check-service.d.ts +16 -0
  176. package/dist/services/audit-check-service.d.ts.map +1 -0
  177. package/dist/services/audit-check-service.js +137 -0
  178. package/dist/services/audit-check-service.js.map +1 -0
  179. package/dist/services/audit-checks/dangling-relations-check.d.ts +7 -0
  180. package/dist/services/audit-checks/dangling-relations-check.d.ts.map +1 -0
  181. package/dist/services/audit-checks/dangling-relations-check.js +52 -0
  182. package/dist/services/audit-checks/dangling-relations-check.js.map +1 -0
  183. package/dist/services/audit-checks/duplicate-ids-check.d.ts +4 -0
  184. package/dist/services/audit-checks/duplicate-ids-check.d.ts.map +1 -0
  185. package/dist/services/audit-checks/duplicate-ids-check.js +49 -0
  186. package/dist/services/audit-checks/duplicate-ids-check.js.map +1 -0
  187. package/dist/services/audit-checks/fix-engine.d.ts +24 -0
  188. package/dist/services/audit-checks/fix-engine.d.ts.map +1 -0
  189. package/dist/services/audit-checks/fix-engine.js +114 -0
  190. package/dist/services/audit-checks/fix-engine.js.map +1 -0
  191. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts +9 -0
  192. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts.map +1 -0
  193. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js +56 -0
  194. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js.map +1 -0
  195. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts +10 -0
  196. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts.map +1 -0
  197. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js +57 -0
  198. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js.map +1 -0
  199. package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts +9 -0
  200. package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts.map +1 -0
  201. package/dist/services/audit-checks/fs-nfs-to-ts-check.js +56 -0
  202. package/dist/services/audit-checks/fs-nfs-to-ts-check.js.map +1 -0
  203. package/dist/services/audit-checks/inverse-consistency-check.d.ts +7 -0
  204. package/dist/services/audit-checks/inverse-consistency-check.d.ts.map +1 -0
  205. package/dist/services/audit-checks/inverse-consistency-check.js +54 -0
  206. package/dist/services/audit-checks/inverse-consistency-check.js.map +1 -0
  207. package/dist/services/audit-checks/mapping-check.d.ts +4 -0
  208. package/dist/services/audit-checks/mapping-check.d.ts.map +1 -0
  209. package/dist/services/audit-checks/mapping-check.js +74 -0
  210. package/dist/services/audit-checks/mapping-check.js.map +1 -0
  211. package/dist/services/audit-checks/orphan-documents-check.d.ts +9 -0
  212. package/dist/services/audit-checks/orphan-documents-check.d.ts.map +1 -0
  213. package/dist/services/audit-checks/orphan-documents-check.js +54 -0
  214. package/dist/services/audit-checks/orphan-documents-check.js.map +1 -0
  215. package/dist/services/audit-checks/orphan-entities-check.d.ts +4 -0
  216. package/dist/services/audit-checks/orphan-entities-check.d.ts.map +1 -0
  217. package/dist/services/audit-checks/orphan-entities-check.js +39 -0
  218. package/dist/services/audit-checks/orphan-entities-check.js.map +1 -0
  219. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts +9 -0
  220. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts.map +1 -0
  221. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js +56 -0
  222. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js.map +1 -0
  223. package/dist/services/audit-checks/sprint-consistency-check.d.ts +4 -0
  224. package/dist/services/audit-checks/sprint-consistency-check.d.ts.map +1 -0
  225. package/dist/services/audit-checks/sprint-consistency-check.js +80 -0
  226. package/dist/services/audit-checks/sprint-consistency-check.js.map +1 -0
  227. package/dist/services/audit-checks/src-filesystem-only-check.d.ts +10 -0
  228. package/dist/services/audit-checks/src-filesystem-only-check.d.ts.map +1 -0
  229. package/dist/services/audit-checks/src-filesystem-only-check.js +106 -0
  230. package/dist/services/audit-checks/src-filesystem-only-check.js.map +1 -0
  231. package/dist/services/audit-checks/ts-to-tc-check.d.ts +10 -0
  232. package/dist/services/audit-checks/ts-to-tc-check.d.ts.map +1 -0
  233. package/dist/services/audit-checks/ts-to-tc-check.js +58 -0
  234. package/dist/services/audit-checks/ts-to-tc-check.js.map +1 -0
  235. package/dist/services/audit-checks/type-mismatch-check.d.ts +4 -0
  236. package/dist/services/audit-checks/type-mismatch-check.d.ts.map +1 -0
  237. package/dist/services/audit-checks/type-mismatch-check.js +55 -0
  238. package/dist/services/audit-checks/type-mismatch-check.js.map +1 -0
  239. package/dist/services/audit-checks/types.d.ts +66 -0
  240. package/dist/services/audit-checks/types.d.ts.map +1 -0
  241. package/dist/services/audit-checks/types.js +30 -0
  242. package/dist/services/audit-checks/types.js.map +1 -0
  243. package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts +9 -0
  244. package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts.map +1 -0
  245. package/dist/services/audit-checks/us-to-fr-nfr-check.js +56 -0
  246. package/dist/services/audit-checks/us-to-fr-nfr-check.js.map +1 -0
  247. package/dist/services/doc-entity-mapping.d.ts +19 -0
  248. package/dist/services/doc-entity-mapping.d.ts.map +1 -0
  249. package/dist/services/doc-entity-mapping.js +35 -0
  250. package/dist/services/doc-entity-mapping.js.map +1 -0
  251. package/dist/services/document-service.d.ts +58 -0
  252. package/dist/services/document-service.d.ts.map +1 -0
  253. package/dist/services/document-service.js +409 -0
  254. package/dist/services/document-service.js.map +1 -0
  255. package/dist/services/graph-export-service.d.ts +12 -0
  256. package/dist/services/graph-export-service.d.ts.map +1 -0
  257. package/dist/services/graph-export-service.js +112 -0
  258. package/dist/services/graph-export-service.js.map +1 -0
  259. package/dist/services/graph-service.d.ts +21 -0
  260. package/dist/services/graph-service.d.ts.map +1 -0
  261. package/dist/services/graph-service.js +49 -0
  262. package/dist/services/graph-service.js.map +1 -0
  263. package/dist/services/graph-validation-service.d.ts +13 -0
  264. package/dist/services/graph-validation-service.d.ts.map +1 -0
  265. package/dist/services/graph-validation-service.js +171 -0
  266. package/dist/services/graph-validation-service.js.map +1 -0
  267. package/dist/services/project.d.ts +80 -0
  268. package/dist/services/project.d.ts.map +1 -0
  269. package/dist/services/project.js +256 -0
  270. package/dist/services/project.js.map +1 -0
  271. package/dist/services/review-service.d.ts +81 -0
  272. package/dist/services/review-service.d.ts.map +1 -0
  273. package/dist/services/review-service.js +242 -0
  274. package/dist/services/review-service.js.map +1 -0
  275. package/dist/services/schema-migration-service.d.ts +44 -0
  276. package/dist/services/schema-migration-service.d.ts.map +1 -0
  277. package/dist/services/schema-migration-service.js +894 -0
  278. package/dist/services/schema-migration-service.js.map +1 -0
  279. package/dist/services/sprint.d.ts +71 -0
  280. package/dist/services/sprint.d.ts.map +1 -0
  281. package/dist/services/sprint.js +238 -0
  282. package/dist/services/sprint.js.map +1 -0
  283. package/dist/services/stage-validator.d.ts +36 -0
  284. package/dist/services/stage-validator.d.ts.map +1 -0
  285. package/dist/services/stage-validator.js +78 -0
  286. package/dist/services/stage-validator.js.map +1 -0
  287. package/dist/services/task.d.ts +75 -0
  288. package/dist/services/task.d.ts.map +1 -0
  289. package/dist/services/task.js +487 -0
  290. package/dist/services/task.js.map +1 -0
  291. package/dist/services/validation.d.ts +24 -0
  292. package/dist/services/validation.d.ts.map +1 -0
  293. package/dist/services/validation.js +53 -0
  294. package/dist/services/validation.js.map +1 -0
  295. package/dist/state-machines/sprint-state.d.ts +25 -0
  296. package/dist/state-machines/sprint-state.d.ts.map +1 -0
  297. package/dist/state-machines/sprint-state.js +64 -0
  298. package/dist/state-machines/sprint-state.js.map +1 -0
  299. package/dist/state-machines/task-state.d.ts +31 -0
  300. package/dist/state-machines/task-state.d.ts.map +1 -0
  301. package/dist/state-machines/task-state.js +83 -0
  302. package/dist/state-machines/task-state.js.map +1 -0
  303. package/dist/utils/errors.d.ts +673 -0
  304. package/dist/utils/errors.d.ts.map +1 -0
  305. package/dist/utils/errors.js +1447 -0
  306. package/dist/utils/errors.js.map +1 -0
  307. package/dist/utils/format.d.ts +52 -0
  308. package/dist/utils/format.d.ts.map +1 -0
  309. package/dist/utils/format.js +65 -0
  310. package/dist/utils/format.js.map +1 -0
  311. package/dist/validators/board-integrity.d.ts +25 -0
  312. package/dist/validators/board-integrity.d.ts.map +1 -0
  313. package/dist/validators/board-integrity.js +102 -0
  314. package/dist/validators/board-integrity.js.map +1 -0
  315. package/dist/validators/board-shape.d.ts +13 -0
  316. package/dist/validators/board-shape.d.ts.map +1 -0
  317. package/dist/validators/board-shape.js +74 -0
  318. package/dist/validators/board-shape.js.map +1 -0
  319. package/dist/validators/owner-validator.d.ts +30 -0
  320. package/dist/validators/owner-validator.d.ts.map +1 -0
  321. package/dist/validators/owner-validator.js +70 -0
  322. package/dist/validators/owner-validator.js.map +1 -0
  323. package/dist/validators/spawn-legality.d.ts +19 -0
  324. package/dist/validators/spawn-legality.d.ts.map +1 -0
  325. package/dist/validators/spawn-legality.js +77 -0
  326. package/dist/validators/spawn-legality.js.map +1 -0
  327. package/dist/validators/state-field-checker.d.ts +8 -0
  328. package/dist/validators/state-field-checker.d.ts.map +1 -0
  329. package/dist/validators/state-field-checker.js +47 -0
  330. package/dist/validators/state-field-checker.js.map +1 -0
  331. package/dist/validators/state-field-recorder.d.ts +39 -0
  332. package/dist/validators/state-field-recorder.d.ts.map +1 -0
  333. package/dist/validators/state-field-recorder.js +62 -0
  334. package/dist/validators/state-field-recorder.js.map +1 -0
  335. package/package.json +53 -0
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ // Document service: orchestrates document lifecycle
3
+ // SAD-0003: MOD-012 Document Registry & Content
4
+ // AD-0018: FTS5 with trigger-based index
5
+ // AD-0019: Dual-mode document storage
6
+ // SAD-0035: Entity auto-sync removed — entities table dropped
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.registerDocument = registerDocument;
9
+ exports.listDocuments = listDocuments;
10
+ exports.getDocument = getDocument;
11
+ exports.showDocument = showDocument;
12
+ exports.updateDocument = updateDocument;
13
+ exports.removeDocument = removeDocument;
14
+ exports.searchDocuments = searchDocuments;
15
+ const crypto_1 = require("crypto");
16
+ const fs_1 = require("fs");
17
+ const errors_1 = require("../utils/errors");
18
+ const retry_1 = require("../db/retry");
19
+ // ─── Order-by validation ───
20
+ const VALID_ORDER_FIELDS = ['id', 'type', 'title', 'created', 'updated'];
21
+ function parseOrderBy(raw) {
22
+ let field;
23
+ let direction;
24
+ if (raw.startsWith('-')) {
25
+ field = raw.slice(1);
26
+ direction = 'DESC';
27
+ }
28
+ else {
29
+ field = raw.startsWith('+') ? raw.slice(1) : raw;
30
+ direction = 'ASC';
31
+ }
32
+ if (!VALID_ORDER_FIELDS.includes(field)) {
33
+ throw new errors_1.DocumentInvalidOrderByError(field);
34
+ }
35
+ return { field: field, direction };
36
+ }
37
+ // ─── Public API ───
38
+ function sha256(content) {
39
+ return (0, crypto_1.createHash)('sha256').update(content).digest('hex');
40
+ }
41
+ // ─── Public API ───
42
+ /**
43
+ * Register a new document.
44
+ */
45
+ function registerDocument(db, id, type, title, opts) {
46
+ if (!id || !id.trim())
47
+ throw new errors_1.DocumentMissingFieldError('id');
48
+ if (!type || !type.trim())
49
+ throw new errors_1.DocumentMissingFieldError('type');
50
+ if (!title || !title.trim())
51
+ throw new errors_1.DocumentMissingFieldError('title');
52
+ // Check duplicate
53
+ const existing = db.prepare('SELECT id FROM documents WHERE id = ?').get(id);
54
+ if (existing)
55
+ throw new errors_1.DocumentDuplicateError(id);
56
+ // Pre-transaction doc type validation gate (FS-SS-012-0011, SAD-0027 §5)
57
+ // builtin:3.0: doc type IS entity type name (no mapping needed)
58
+ // Pre-transaction SRC storage enforcement (FS-SS-029-0001 v2 VR-001/VR-002)
59
+ // SRC documents must use filesystem storage; DB storage via --content-file is rejected
60
+ if (type === 'SRC' && (opts?.content || opts?.contentFile)) {
61
+ throw new errors_1.DocSrcStorageError();
62
+ }
63
+ // FS-SS-012-0001 v4 VR-004: When content is provided (via --content-file),
64
+ // content_storage defaults to 'db'. Otherwise defaults to 'filesystem'.
65
+ const storage = opts?.contentStorage ?? ((opts?.content || opts?.contentFile) ? 'db' : 'filesystem');
66
+ const metadata = opts?.metadata ? JSON.stringify(opts.metadata) : '{}';
67
+ const now = new Date().toISOString();
68
+ // Handle content: compute hash and load content from file or direct input
69
+ // Content is ALWAYS stored in document_contents to enable FTS5 indexing,
70
+ // regardless of whether content_storage is 'db' or 'filesystem'.
71
+ let contentHash = null;
72
+ let contentValue = null;
73
+ let contentFilePath = null;
74
+ if (opts?.content) {
75
+ contentHash = sha256(opts.content);
76
+ contentValue = opts.content;
77
+ }
78
+ else if (opts?.contentFile) {
79
+ try {
80
+ const fileContent = (0, fs_1.readFileSync)(opts.contentFile, 'utf-8');
81
+ contentHash = sha256(fileContent);
82
+ contentValue = fileContent;
83
+ contentFilePath = opts.contentFile;
84
+ }
85
+ catch (err) {
86
+ const msg = err instanceof Error ? err.message : String(err);
87
+ throw new errors_1.DocumentFileError(opts.contentFile, msg);
88
+ }
89
+ }
90
+ // Determine the filesystem path to store in the documents table.
91
+ // Prefer the explicit --path option; fall back to --content-file path.
92
+ const storedPath = opts?.path ?? contentFilePath ?? null;
93
+ // Insert document and content (FK: document_contents → documents)
94
+ // SAD-0035: Entity auto-creation removed — entities table dropped
95
+ (0, retry_1.withTransaction)(db, () => {
96
+ db.prepare(`INSERT INTO documents (id, type, title, path, content_hash, content_storage, metadata, created_at, updated_at)
97
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, type, title, storedPath, contentHash, storage, metadata, now, now);
98
+ if (contentValue !== null) {
99
+ db.prepare(`INSERT INTO document_contents (document_id, content, content_hash, updated_at) VALUES (?, ?, ?, ?)`).run(id, contentValue, contentHash, now);
100
+ }
101
+ });
102
+ return getDocument(db, id);
103
+ }
104
+ /**
105
+ * List documents with optional filters, pagination, sorting, and count-only support.
106
+ * Default ordering: ascending by id.
107
+ *
108
+ * When countOnly is true, returns { count: number } instead of Document[].
109
+ */
110
+ function listDocuments(db, opts) {
111
+ const clauses = [];
112
+ const params = [];
113
+ if (opts?.type) {
114
+ clauses.push('type = ?');
115
+ params.push(opts.type);
116
+ }
117
+ const where = clauses.length > 0 ? ` WHERE ${clauses.join(' AND ')}` : '';
118
+ // Count-only path: no ORDER BY, LIMIT, or OFFSET needed
119
+ if (opts?.countOnly) {
120
+ const row = db.prepare(`SELECT COUNT(*) as count FROM documents${where}`).get(...params);
121
+ return { count: row.count };
122
+ }
123
+ // Determine ordering — map user-facing field names to SQL column names
124
+ let orderClause;
125
+ if (opts?.orderBy) {
126
+ const { field, direction } = parseOrderBy(opts.orderBy);
127
+ const columnMap = {
128
+ id: 'id',
129
+ type: 'type',
130
+ title: 'title',
131
+ created: 'created_at',
132
+ updated: 'updated_at',
133
+ };
134
+ const col = columnMap[field];
135
+ orderClause = ` ORDER BY ${col} ${direction}`;
136
+ }
137
+ else {
138
+ orderClause = ' ORDER BY id ASC'; // default per FS-SS-012-0002 v3 VR-003
139
+ }
140
+ let sql = `SELECT id, type, title, path, content_hash, content_storage, metadata, created_at, updated_at FROM documents${where}${orderClause}`;
141
+ // Apply pagination — LIMIT is required when OFFSET is present (SQLite constraint)
142
+ const hasOffset = opts?.offset !== undefined && opts.offset >= 0;
143
+ const hasLimit = opts?.limit !== undefined && opts.limit >= 0;
144
+ if (hasLimit || hasOffset) {
145
+ // When OFFSET is provided without LIMIT, use a very large explicit LIMIT
146
+ // instead of -1 (which SQLite treats as unbounded but is confusing to readers).
147
+ const limit = hasLimit ? opts.limit : 999999;
148
+ sql += ' LIMIT ?';
149
+ params.push(limit);
150
+ }
151
+ if (hasOffset) {
152
+ sql += ' OFFSET ?';
153
+ params.push(opts.offset);
154
+ }
155
+ const rows = db.prepare(sql).all(...params);
156
+ return rows;
157
+ }
158
+ /**
159
+ * Get a single document by ID.
160
+ */
161
+ function getDocument(db, id) {
162
+ const row = db.prepare('SELECT * FROM documents WHERE id = ?').get(id);
163
+ if (!row)
164
+ throw new errors_1.DocumentNotFoundError(id);
165
+ return row;
166
+ }
167
+ /**
168
+ * Show document detail (with content if stored).
169
+ * Content is fetched from document_contents (primary) or doc.path (fallback for
170
+ * legacy documents registered before this fix).
171
+ */
172
+ function showDocument(db, id) {
173
+ const doc = getDocument(db, id);
174
+ let content = null;
175
+ // Primary: read from document_contents (used for FTS indexing for all storage types)
176
+ const row = db.prepare('SELECT content FROM document_contents WHERE document_id = ?').get(id);
177
+ if (row) {
178
+ content = row.content;
179
+ }
180
+ else if (doc.path) {
181
+ // Fallback: read from filesystem path (legacy documents)
182
+ try {
183
+ content = (0, fs_1.readFileSync)(doc.path, 'utf-8');
184
+ }
185
+ catch {
186
+ content = null;
187
+ }
188
+ }
189
+ return { ...doc, content };
190
+ }
191
+ /**
192
+ * Update document metadata.
193
+ * --meta replaces entirely (not merge), per spec.
194
+ *
195
+ * MOD-021: When fields.type changes the document type, the old entity is deleted
196
+ * (with relation cascade) and a new entity is created with the updated type mapping.
197
+ * All operations (content upsert, entity sync, document update) run within a single
198
+ * atomic transaction per FS-SS-021-0004.
199
+ */
200
+ function updateDocument(db, id, fields) {
201
+ const doc = getDocument(db, id);
202
+ const now = new Date().toISOString();
203
+ const sets = ['updated_at = ?'];
204
+ const params = [now];
205
+ if (fields.title !== undefined) {
206
+ sets.push('title = ?');
207
+ params.push(fields.title);
208
+ }
209
+ if (fields.type !== undefined) {
210
+ sets.push('type = ?');
211
+ params.push(fields.type);
212
+ }
213
+ if (fields.metadata !== undefined) {
214
+ sets.push('metadata = ?');
215
+ params.push(JSON.stringify(fields.metadata));
216
+ }
217
+ if (fields.content_storage !== undefined) {
218
+ sets.push('content_storage = ?');
219
+ params.push(fields.content_storage);
220
+ }
221
+ // Handle content update
222
+ let newContent;
223
+ let contentHash;
224
+ if (fields.contentFile) {
225
+ try {
226
+ newContent = (0, fs_1.readFileSync)(fields.contentFile, 'utf-8');
227
+ }
228
+ catch (err) {
229
+ const msg = err instanceof Error ? err.message : String(err);
230
+ throw new errors_1.DocumentFileError(fields.contentFile, msg);
231
+ }
232
+ }
233
+ else if (fields.content !== undefined) {
234
+ newContent = fields.content;
235
+ }
236
+ if (newContent !== undefined) {
237
+ contentHash = sha256(newContent);
238
+ sets.push('content_hash = ?');
239
+ params.push(contentHash);
240
+ }
241
+ // SAD-0035: Entity sync on type change removed — entities table dropped
242
+ // content_storage switch validation (FR-URD-G001-0001 M6)
243
+ // Switching from filesystem to db without providing content creates an
244
+ // inconsistency: the document_contents table has no authoritative copy.
245
+ if (fields.content_storage !== undefined && fields.content_storage !== doc.content_storage) {
246
+ if (fields.content_storage === 'db' && doc.content_storage === 'filesystem' && newContent === undefined && !fields.contentFile) {
247
+ throw new errors_1.DocumentMissingFieldError('content');
248
+ }
249
+ }
250
+ params.push(id);
251
+ // Single atomic transaction: content upsert + document update
252
+ // SAD-0035: Entity sync removed — entities table dropped
253
+ (0, retry_1.withTransaction)(db, () => {
254
+ // Step 1: Content upsert
255
+ // Content is ALWAYS written to document_contents to enable FTS5 indexing
256
+ // and maintain content_hash consistency, regardless of storage type.
257
+ if (newContent !== undefined) {
258
+ db.prepare(`INSERT INTO document_contents (document_id, content, content_hash, updated_at)
259
+ VALUES (?, ?, ?, ?)
260
+ ON CONFLICT(document_id) DO UPDATE SET content = excluded.content, content_hash = excluded.content_hash, updated_at = excluded.updated_at`).run(id, newContent, contentHash, now);
261
+ }
262
+ // Step 2: Document row UPDATE
263
+ db.prepare(`UPDATE documents SET ${sets.join(', ')} WHERE id = ?`).run(...params);
264
+ });
265
+ return getDocument(db, id);
266
+ }
267
+ /**
268
+ * Remove a document registration.
269
+ *
270
+ * Deletion ordering per SAD-0035 (3-step sequence after entities table drop):
271
+ * Step 1: Delete relations (outgoing and incoming) referencing the document
272
+ * Step 2: Delete document_contents row (UNCONDITIONAL per AD-0028 — FK constraint
273
+ * requires content deletion before the document row is removed)
274
+ * Step 3: Delete document row
275
+ *
276
+ * Content is always deleted unconditionally per AD-0028 — there is no soft-delete option.
277
+ */
278
+ function removeDocument(db, id) {
279
+ getDocument(db, id); // verify exists
280
+ (0, retry_1.withTransaction)(db, () => {
281
+ // Step 1: Delete all relations referencing this document (from_id OR to_id)
282
+ db.prepare('DELETE FROM relations WHERE from_id = ? OR to_id = ?').run(id, id);
283
+ // Step 2: Delete document_contents unconditionally per AD-0028
284
+ // FK constraint (document_contents.document_id → documents.id) requires
285
+ // content deletion before the document row is removed.
286
+ db.prepare('DELETE FROM document_contents WHERE document_id = ?').run(id);
287
+ // Step 3: Delete document row
288
+ db.prepare('DELETE FROM documents WHERE id = ?').run(id);
289
+ });
290
+ }
291
+ /**
292
+ * Full-text search across document contents with pagination, sorting, count-only support, and type filtering.
293
+ * Default ordering: FTS5 BM25 relevance ranking (descending).
294
+ * When --order-by is specified, results are sorted by the given column via SQL subquery instead of by rank.
295
+ *
296
+ * When countOnly is true, returns { count: number } instead of SearchResult[].
297
+ */
298
+ function searchDocuments(db, query, opts) {
299
+ // Validate query is not purely whitespace or obviously malformed
300
+ if (!query || !query.trim()) {
301
+ throw new errors_1.DocumentInvalidSearchQueryError(query, 'query cannot be empty or whitespace');
302
+ }
303
+ // Validate order-by early (before FTS5 query to fail fast)
304
+ if (opts?.orderBy) {
305
+ parseOrderBy(opts.orderBy); // throws on invalid field
306
+ }
307
+ const hasTypeFilter = opts?.type !== undefined && opts.type.length > 0;
308
+ const UNBOUNDED_LIMIT = 999999;
309
+ // ── Path A: orderBy specified → use SQL subquery with documents-table ORDER BY ──
310
+ // This avoids type-unsafe _createdAt/_updatedAt casting and JavaScript sorting.
311
+ if (opts?.orderBy) {
312
+ const { field, direction } = parseOrderBy(opts.orderBy);
313
+ const columnMap = {
314
+ id: 'd.id',
315
+ type: 'd.type',
316
+ title: 'd.title',
317
+ created: 'd.created_at',
318
+ updated: 'd.updated_at',
319
+ };
320
+ const orderCol = columnMap[field];
321
+ // Build WHERE clauses
322
+ const whereClauses = [];
323
+ const params = [];
324
+ // FTS5 subquery for matching document IDs
325
+ whereClauses.push('d.id IN (SELECT fts.document_id FROM document_contents_fts fts WHERE document_contents_fts MATCH ?)');
326
+ params.push(query);
327
+ if (hasTypeFilter) {
328
+ whereClauses.push('d.type = ?');
329
+ params.push(opts.type);
330
+ }
331
+ const where = ` WHERE ${whereClauses.join(' AND ')}`;
332
+ // Count-only path
333
+ if (opts?.countOnly) {
334
+ const row = db.prepare(`SELECT COUNT(*) as count FROM documents d${where}`).get(...params);
335
+ return { count: row.count };
336
+ }
337
+ const limit = opts.limit ?? 20;
338
+ const offset = opts.offset ?? 0;
339
+ let sql = `SELECT d.id as document_id, d.title, d.type, d.created_at, d.updated_at FROM documents d${where} ORDER BY ${orderCol} ${direction}`;
340
+ sql += ' LIMIT ? OFFSET ?';
341
+ params.push(limit, offset);
342
+ try {
343
+ const rows = db.prepare(sql).all(...params);
344
+ return rows.map(r => ({
345
+ documentId: r.document_id,
346
+ title: r.title,
347
+ type: r.type,
348
+ rank: 0, // rank not applicable when ordered by document field
349
+ snippet: undefined,
350
+ }));
351
+ }
352
+ catch (err) {
353
+ throw new errors_1.DocumentInvalidSearchQueryError(query, 'malformed FTS5 syntax');
354
+ }
355
+ }
356
+ // ── Path B: default FTS5 BM25 ranking (no orderBy) ──
357
+ // Run the FTS5 query in a transaction so we can catch errors and wrap them
358
+ // with DocumentInvalidSearchQueryError.
359
+ let rows = [];
360
+ try {
361
+ // Build WHERE clause with optional type filter
362
+ let whereClauses = 'WHERE document_contents_fts MATCH ?';
363
+ const params = [query];
364
+ if (hasTypeFilter) {
365
+ whereClauses += ' AND d.type = ?';
366
+ params.push(opts.type);
367
+ }
368
+ const hasOffset = opts?.offset !== undefined && opts.offset >= 0;
369
+ const ftsLimit = opts?.countOnly
370
+ ? UNBOUNDED_LIMIT
371
+ : (opts?.limit ?? 20) + (opts?.offset ?? 0);
372
+ params.push(ftsLimit);
373
+ let ftsSql = `SELECT fts.document_id, d.title, d.type, fts.rank, d.created_at, d.updated_at,
374
+ snippet(document_contents_fts, 0, '<b>', '</b>', '…', 32) as snippet
375
+ FROM document_contents_fts fts
376
+ JOIN documents d ON d.id = fts.document_id
377
+ ${whereClauses}
378
+ ORDER BY fts.rank
379
+ LIMIT ?`;
380
+ if (hasOffset && !opts?.countOnly) {
381
+ ftsSql += ' OFFSET ?';
382
+ params.push(opts.offset);
383
+ }
384
+ rows = db.prepare(ftsSql).all(...params);
385
+ }
386
+ catch (err) {
387
+ throw new errors_1.DocumentInvalidSearchQueryError(query, 'malformed FTS5 syntax');
388
+ }
389
+ // Count-only path: return count before applying offset
390
+ if (opts?.countOnly) {
391
+ return { count: rows.length };
392
+ }
393
+ // Map to SearchResult[] with snippet populated from FTS5 snippet() function
394
+ let results = rows.map(r => ({
395
+ documentId: r.document_id,
396
+ title: r.title,
397
+ type: r.type,
398
+ rank: r.rank,
399
+ snippet: r.snippet || undefined,
400
+ }));
401
+ // Apply limit (SQL LIMIT fetched offset + limit rows, slice to exact limit)
402
+ if (opts?.limit !== undefined && opts.limit >= 0) {
403
+ if (results.length > opts.limit) {
404
+ results = results.slice(0, opts.limit);
405
+ }
406
+ }
407
+ return results;
408
+ }
409
+ //# sourceMappingURL=document-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-service.js","sourceRoot":"","sources":["../../src/services/document-service.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,gDAAgD;AAChD,yCAAyC;AACzC,sCAAsC;AACtC,8DAA8D;;AA2C9D,4CAyEC;AAQD,sCAqDC;AAKD,kCAIC;AAOD,oCAkBC;AAWD,wCAuEC;AAaD,wCAeC;AASD,0CAoIC;AA3cD,mCAAoC;AACpC,2BAAkC;AAGlC,4CAAgN;AAChN,uCAA8C;AAG9C,8BAA8B;AAE9B,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAGlF,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,KAAa,CAAC;IAClB,IAAI,SAAyB,CAAC;IAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,IAAI,CAAE,kBAAwC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,oCAA2B,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAmB,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC;AAED,qBAAqB;AAErB,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,qBAAqB;AAErB;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,EAAqB,EACrB,EAAU,EACV,IAAY,EACZ,KAAa,EACb,IAA8B;IAE9B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,kCAAyB,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,kCAAyB,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,kCAAyB,CAAC,OAAO,CAAC,CAAC;IAE1E,kBAAkB;IAClB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,QAAQ;QAAE,MAAM,IAAI,+BAAsB,CAAC,EAAE,CAAC,CAAC;IAEnD,yEAAyE;IACzE,gEAAgE;IAEhE,4EAA4E;IAC5E,uFAAuF;IACvF,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,2BAAkB,EAAE,CAAC;IACjC,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,OAAO,GAAmB,IAAI,EAAE,cAAc,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACrH,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,0EAA0E;IAC1E,yEAAyE;IACzE,iEAAiE;IACjE,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;SAAM,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,iBAAY,EAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC5D,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAClC,YAAY,GAAG,WAAW,CAAC;YAC3B,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,0BAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,uEAAuE;IACvE,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,IAAI,eAAe,IAAI,IAAI,CAAC;IAEzD,kEAAkE;IAClE,kEAAkE;IAClE,IAAA,uBAAe,EAAC,EAAE,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,OAAO,CACR;0CACoC,CACrC,CAAC,GAAG,CACH,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAC3B,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CACzC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,EAAE,CAAC,OAAO,CACR,oGAAoG,CACrG,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAC3B,EAAqB,EACrB,IAAkB;IAElB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAErE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,wDAAwD;IACxD,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAsB,CAAC;QAC9G,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,uEAAuE;IACvE,IAAI,WAAmB,CAAC;IACxB,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAA2B;YACxC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,YAAY;SACtB,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7B,WAAW,GAAG,aAAa,GAAG,IAAI,SAAS,EAAE,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,kBAAkB,CAAC,CAAC,uCAAuC;IAC3E,CAAC;IAED,IAAI,GAAG,GAAG,+GAA+G,KAAK,GAAG,WAAW,EAAE,CAAC;IAE/I,kFAAkF;IAClF,MAAM,SAAS,GAAG,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9D,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC1B,yEAAyE;QACzE,gFAAgF;QAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9C,GAAG,IAAI,UAAU,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,IAAI,WAAW,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAkB,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,EAAqB,EAAE,EAAU;IAC3D,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAyB,CAAC;IAC/F,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,8BAAqB,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,EAAqB,EAAE,EAAU;IAC5D,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,qFAAqF;IACrF,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,CAAC,EAAE,CAAoC,CAAC;IACjI,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,CAAC;SAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,yDAAyD;QACzD,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,iBAAY,EAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC5B,EAAqB,EACrB,EAAU,EACV,MAA4B;IAE5B,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,IAAI,GAAa,CAAC,gBAAgB,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAc,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IACtF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IACnF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAAC,CAAC;IAEpH,wBAAwB;IACxB,IAAI,UAA8B,CAAC;IACnC,IAAI,WAA+B,CAAC;IACpC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,IAAA,iBAAY,EAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,0BAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACxC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAED,wEAAwE;IAExE,0DAA0D;IAC1D,uEAAuE;IACvE,wEAAwE;IACxE,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe,EAAE,CAAC;QAC3F,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,IAAI,GAAG,CAAC,eAAe,KAAK,YAAY,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC/H,MAAM,IAAI,kCAAyB,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,8DAA8D;IAC9D,yDAAyD;IACzD,IAAA,uBAAe,EAAC,EAAE,EAAE,GAAG,EAAE;QACvB,yBAAyB;QACzB,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,EAAE,CAAC,OAAO,CACR;;mJAE2I,CAC5I,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,WAAY,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,8BAA8B;QAC9B,EAAE,CAAC,OAAO,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,EAAqB,EAAE,EAAU;IAC9D,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB;IAErC,IAAA,uBAAe,EAAC,EAAE,EAAE,GAAG,EAAE;QACvB,4EAA4E;QAC5E,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE/E,+DAA+D;QAC/D,wEAAwE;QACxE,uDAAuD;QACvD,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1E,8BAA8B;QAC9B,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,EAAqB,EACrB,KAAa,EACb,IAAoB;IAEpB,iEAAiE;IACjE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,wCAA+B,CAAC,KAAK,EAAE,qCAAqC,CAAC,CAAC;IAC1F,CAAC;IAED,2DAA2D;IAC3D,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;IACxD,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,MAAM,CAAC;IAE/B,mFAAmF;IACnF,gFAAgF;IAChF,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAA2B;YACxC,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,cAAc;SACxB,CAAC;QACF,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAElC,sBAAsB;QACtB,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,0CAA0C;QAC1C,YAAY,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;QACzH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAErD,kBAAkB;QAClB,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAsB,CAAC;YAChH,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAEhC,IAAI,GAAG,GAAG,2FAA2F,KAAK,aAAa,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/I,GAAG,IAAI,mBAAmB,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAwG,CAAC;YACnJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,UAAU,EAAE,CAAC,CAAC,WAAW;gBACzB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,EAAE,qDAAqD;gBAC9D,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,wCAA+B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,2EAA2E;IAC3E,wCAAwC;IACxC,IAAI,IAAI,GAAwI,EAAE,CAAC;IACnJ,IAAI,CAAC;QACH,+CAA+C;QAC/C,IAAI,YAAY,GAAG,qCAAqC,CAAC;QACzD,MAAM,MAAM,GAAc,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,IAAI,iBAAiB,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,EAAE,SAAS;YAC9B,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtB,IAAI,MAAM,GAAG;;;;SAIR,YAAY;;eAEN,CAAC;QAEZ,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,WAAW,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAwI,CAAC;IAClL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,wCAA+B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IAC5E,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,GAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,SAAS;KAChC,CAAC,CAAC,CAAC;IAEJ,4EAA4E;IAC5E,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { ExportFormat, GraphExportData } from '../models/entity';
3
+ /**
4
+ * Export all graph data from the database.
5
+ * SAD-0035: entities removed — only entityTypes, relationTypes, and relations.
6
+ */
7
+ export declare function exportGraph(db: Database.Database): GraphExportData;
8
+ /**
9
+ * Export graph data to a file in the specified format.
10
+ */
11
+ export declare function exportGraphToFile(db: Database.Database, outputPath: string, format?: ExportFormat): void;
12
+ //# sourceMappingURL=graph-export-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-export-service.d.ts","sourceRoot":"","sources":["../../src/services/graph-export-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAA4B,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIhG;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAMlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,YAAqB,GAAG,IAAI,CAyDhH"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ // Graph export service: export graph data to various formats
3
+ // SAD-0003: MOD-011 Graph Export
4
+ // SAD-0035: Entities removed from export — entities table dropped
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.exportGraph = exportGraph;
40
+ exports.exportGraphToFile = exportGraphToFile;
41
+ const errors_1 = require("../utils/errors");
42
+ const fs = __importStar(require("fs"));
43
+ /**
44
+ * Export all graph data from the database.
45
+ * SAD-0035: entities removed — only entityTypes, relationTypes, and relations.
46
+ */
47
+ function exportGraph(db) {
48
+ const entityTypes = db.prepare('SELECT DISTINCT type AS name FROM documents ORDER BY type').all();
49
+ const relationTypes = db.prepare('SELECT * FROM relation_types ORDER BY name').all();
50
+ const relations = db.prepare('SELECT * FROM relations ORDER BY id').all();
51
+ return { entityTypes, relationTypes, entities: [], relations };
52
+ }
53
+ /**
54
+ * Export graph data to a file in the specified format.
55
+ */
56
+ function exportGraphToFile(db, outputPath, format = 'json') {
57
+ const data = exportGraph(db);
58
+ let content;
59
+ switch (format) {
60
+ case 'json':
61
+ content = JSON.stringify(data, null, 2);
62
+ break;
63
+ case 'jsonl': {
64
+ const lines = [];
65
+ // Header line with counts (SAD-0035: entities always 0)
66
+ lines.push(JSON.stringify({ _type: 'header', entityTypes: data.entityTypes.length, relationTypes: data.relationTypes.length, entities: 0, relations: data.relations.length }));
67
+ for (const et of data.entityTypes) {
68
+ lines.push(JSON.stringify({ _type: 'entity_type', ...et }));
69
+ }
70
+ for (const rt of data.relationTypes) {
71
+ lines.push(JSON.stringify({ _type: 'relation_type', ...rt }));
72
+ }
73
+ for (const r of data.relations) {
74
+ lines.push(JSON.stringify({ _type: 'relation', ...r }));
75
+ }
76
+ content = lines.join('\n');
77
+ break;
78
+ }
79
+ case 'csv': {
80
+ const lines = [];
81
+ // Entity types CSV
82
+ lines.push('# Entity Types');
83
+ lines.push('name');
84
+ for (const et of data.entityTypes) {
85
+ lines.push(`"${et.name}"`);
86
+ }
87
+ lines.push('');
88
+ // Relation types CSV
89
+ lines.push('# Relation Types');
90
+ lines.push('name,from_types,to_types,cardinality,inverse_of,description');
91
+ for (const rt of data.relationTypes) {
92
+ lines.push(`"${rt.name}","${rt.from_types}","${rt.to_types}","${rt.cardinality ?? ''}","${rt.inverse_of ?? ''}","${rt.description ?? ''}"`);
93
+ }
94
+ lines.push('');
95
+ // SAD-0035: Entities section removed (entities table dropped)
96
+ lines.push('# Entities (dropped in SAD-0035)');
97
+ lines.push('');
98
+ // Relations CSV
99
+ lines.push('# Relations');
100
+ lines.push('id,from_id,rel_type,to_id,properties,created_at,updated_at');
101
+ for (const r of data.relations) {
102
+ lines.push(`${r.id},"${r.from_id}","${r.rel_type}","${r.to_id}","${r.properties.replace(/"/g, '""')}","${r.created_at}","${r.updated_at}"`);
103
+ }
104
+ content = lines.join('\n');
105
+ break;
106
+ }
107
+ default:
108
+ throw new errors_1.GraphExportFormatError(format, ['json', 'jsonl', 'csv']);
109
+ }
110
+ fs.writeFileSync(outputPath, content, 'utf-8');
111
+ }
112
+ //# sourceMappingURL=graph-export-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-export-service.js","sourceRoot":"","sources":["../../src/services/graph-export-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { Relation, RelationQueryOptions } from '../models/entity';
3
+ import { createRelation, removeRelation, queryRelations } from '../models/relation';
4
+ import { isSchemaBootstrapped, getEntityTypes, getRelationTypes, getSchemaMeta } from '../models/graph-schema';
5
+ export { createRelation, removeRelation, queryRelations, isSchemaBootstrapped, getEntityTypes, getRelationTypes, getSchemaMeta, };
6
+ /**
7
+ * Auto-init guard for pre-change projects (FS-SS-008-0007-E).
8
+ * Initializes the builtin schema using INSERT OR IGNORE for idempotency.
9
+ * This is called at the start of operations that need a populated schema.
10
+ */
11
+ export declare function ensureBuiltinSchemaInitialized(db: Database.Database): void;
12
+ /**
13
+ * Get related documents (convenience method).
14
+ * SAD-0035: Updated to use documents table instead of entities.
15
+ */
16
+ export declare function getRelatedDocuments(db: Database.Database, docId: string, options?: Partial<RelationQueryOptions>): Array<{
17
+ relation: Relation;
18
+ docId: string;
19
+ docType: string;
20
+ }>;
21
+ //# sourceMappingURL=graph-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-service.d.ts","sourceRoot":"","sources":["../../src/services/graph-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG/G,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAE1E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACtC,KAAK,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB/D"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ // Graph service: orchestrates relation + schema operations
3
+ // SAD-0035: Entity operations removed — entities table dropped
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.getSchemaMeta = exports.getRelationTypes = exports.getEntityTypes = exports.isSchemaBootstrapped = exports.queryRelations = exports.removeRelation = exports.createRelation = void 0;
6
+ exports.ensureBuiltinSchemaInitialized = ensureBuiltinSchemaInitialized;
7
+ exports.getRelatedDocuments = getRelatedDocuments;
8
+ const relation_1 = require("../models/relation");
9
+ Object.defineProperty(exports, "createRelation", { enumerable: true, get: function () { return relation_1.createRelation; } });
10
+ Object.defineProperty(exports, "removeRelation", { enumerable: true, get: function () { return relation_1.removeRelation; } });
11
+ Object.defineProperty(exports, "queryRelations", { enumerable: true, get: function () { return relation_1.queryRelations; } });
12
+ const graph_schema_1 = require("../models/graph-schema");
13
+ Object.defineProperty(exports, "isSchemaBootstrapped", { enumerable: true, get: function () { return graph_schema_1.isSchemaBootstrapped; } });
14
+ Object.defineProperty(exports, "getEntityTypes", { enumerable: true, get: function () { return graph_schema_1.getEntityTypes; } });
15
+ Object.defineProperty(exports, "getRelationTypes", { enumerable: true, get: function () { return graph_schema_1.getRelationTypes; } });
16
+ Object.defineProperty(exports, "getSchemaMeta", { enumerable: true, get: function () { return graph_schema_1.getSchemaMeta; } });
17
+ const migration_1 = require("../db/migration");
18
+ /**
19
+ * Auto-init guard for pre-change projects (FS-SS-008-0007-E).
20
+ * Initializes the builtin schema using INSERT OR IGNORE for idempotency.
21
+ * This is called at the start of operations that need a populated schema.
22
+ */
23
+ function ensureBuiltinSchemaInitialized(db) {
24
+ (0, migration_1.initializeBuiltinSchema)(db);
25
+ }
26
+ /**
27
+ * Get related documents (convenience method).
28
+ * SAD-0035: Updated to use documents table instead of entities.
29
+ */
30
+ function getRelatedDocuments(db, docId, options) {
31
+ const relations = (0, relation_1.queryRelations)(db, {
32
+ entityId: docId,
33
+ relType: options?.relType,
34
+ direction: options?.direction ?? 'outgoing',
35
+ limit: options?.limit ?? 100,
36
+ offset: options?.offset ?? 0,
37
+ });
38
+ const results = [];
39
+ for (const rel of relations) {
40
+ const targetId = rel.from_id === docId ? rel.to_id : rel.from_id;
41
+ const doc = db.prepare('SELECT id, type FROM documents WHERE id = ?').get(targetId);
42
+ if (doc) {
43
+ results.push({ relation: rel, docId: doc.id, docType: doc.type });
44
+ }
45
+ // Skip dangling references
46
+ }
47
+ return results;
48
+ }
49
+ //# sourceMappingURL=graph-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-service.js","sourceRoot":"","sources":["../../src/services/graph-service.ts"],"names":[],"mappings":";AAAA,2DAA2D;AAC3D,+DAA+D;;;AAuB/D,wEAEC;AAMD,kDAwBC;AAnDD,iDAAoF;AAKlF,+FALO,yBAAc,OAKP;AACd,+FANuB,yBAAc,OAMvB;AACd,+FAPuC,yBAAc,OAOvC;AANhB,yDAA+G;AAO7G,qGAPO,mCAAoB,OAOP;AACpB,+FAR6B,6BAAc,OAQ7B;AACd,iGAT6C,+BAAgB,OAS7C;AAChB,8FAV+D,4BAAa,OAU/D;AATf,+CAA0D;AAY1D;;;;GAIG;AACH,SAAgB,8BAA8B,CAAC,EAAqB;IAClE,IAAA,mCAAuB,EAAC,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,EAAqB,EACrB,KAAa,EACb,OAAuC;IAEvC,MAAM,SAAS,GAAG,IAAA,yBAAc,EAAC,EAAE,EAAE;QACnC,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,UAAU;QAC3C,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;QAC5B,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;KAC7B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAkE,EAAE,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;QACjE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA6C,CAAC;QAChI,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,2BAA2B;IAC7B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}