argustack 0.2.0 → 0.3.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 (546) hide show
  1. package/README.md +31 -115
  2. package/dist/adapters/board/board-sync.js +2 -2
  3. package/dist/adapters/board/board-sync.js.map +1 -1
  4. package/dist/adapters/board/md-parser.js +3 -3
  5. package/dist/adapters/board/md-parser.js.map +1 -1
  6. package/dist/adapters/board/skill-discovery.js +2 -2
  7. package/dist/adapters/board/skill-discovery.js.map +1 -1
  8. package/dist/adapters/board/skill-runner.js +2 -2
  9. package/dist/adapters/board/skill-runner.js.map +1 -1
  10. package/dist/adapters/board/store.d.ts.map +1 -1
  11. package/dist/adapters/board/store.js +11 -11
  12. package/dist/adapters/board/store.js.map +1 -1
  13. package/dist/adapters/csv/mapper.js +11 -11
  14. package/dist/adapters/csv/mapper.js.map +1 -1
  15. package/dist/adapters/csv/parser.d.ts.map +1 -1
  16. package/dist/adapters/csv/parser.js +8 -7
  17. package/dist/adapters/csv/parser.js.map +1 -1
  18. package/dist/adapters/csv/provider.js +4 -4
  19. package/dist/adapters/csv/provider.js.map +1 -1
  20. package/dist/adapters/db/client.js +2 -2
  21. package/dist/adapters/db/client.js.map +1 -1
  22. package/dist/adapters/db/index.js +1 -0
  23. package/dist/adapters/db/index.js.map +1 -1
  24. package/dist/adapters/db/mapper.js +1 -1
  25. package/dist/adapters/db/mapper.js.map +1 -1
  26. package/dist/adapters/db/provider.js +4 -4
  27. package/dist/adapters/db/provider.js.map +1 -1
  28. package/dist/adapters/db/sql-validator.js +2 -2
  29. package/dist/adapters/db/sql-validator.js.map +1 -1
  30. package/dist/adapters/docker/cli-docker-control.d.ts +13 -0
  31. package/dist/adapters/docker/cli-docker-control.d.ts.map +1 -0
  32. package/dist/adapters/docker/cli-docker-control.js +70 -0
  33. package/dist/adapters/docker/cli-docker-control.js.map +1 -0
  34. package/dist/adapters/docker/index.d.ts +2 -0
  35. package/dist/adapters/docker/index.d.ts.map +1 -0
  36. package/dist/adapters/docker/index.js +2 -0
  37. package/dist/adapters/docker/index.js.map +1 -0
  38. package/dist/adapters/git/mapper.js +1 -1
  39. package/dist/adapters/git/mapper.js.map +1 -1
  40. package/dist/adapters/git/provider.js +4 -4
  41. package/dist/adapters/git/provider.js.map +1 -1
  42. package/dist/adapters/github/mapper.js +3 -3
  43. package/dist/adapters/github/mapper.js.map +1 -1
  44. package/dist/adapters/github/provider.d.ts.map +1 -1
  45. package/dist/adapters/github/provider.js +2 -2
  46. package/dist/adapters/github/provider.js.map +1 -1
  47. package/dist/adapters/jira/mapper.js +4 -4
  48. package/dist/adapters/jira/mapper.js.map +1 -1
  49. package/dist/adapters/jira/provider.js +8 -8
  50. package/dist/adapters/jira/provider.js.map +1 -1
  51. package/dist/adapters/jira-proxy/client.js +4 -4
  52. package/dist/adapters/jira-proxy/client.js.map +1 -1
  53. package/dist/adapters/jira-proxy/config-loader.d.ts +9 -0
  54. package/dist/adapters/jira-proxy/config-loader.d.ts.map +1 -1
  55. package/dist/adapters/jira-proxy/config-loader.js +26 -3
  56. package/dist/adapters/jira-proxy/config-loader.js.map +1 -1
  57. package/dist/adapters/jira-proxy/index.d.ts +1 -1
  58. package/dist/adapters/jira-proxy/index.d.ts.map +1 -1
  59. package/dist/adapters/jira-proxy/index.js +1 -1
  60. package/dist/adapters/jira-proxy/index.js.map +1 -1
  61. package/dist/adapters/jira-proxy/mapper.js +2 -2
  62. package/dist/adapters/jira-proxy/mapper.js.map +1 -1
  63. package/dist/adapters/jira-proxy/provider.d.ts.map +1 -1
  64. package/dist/adapters/jira-proxy/provider.js +19 -8
  65. package/dist/adapters/jira-proxy/provider.js.map +1 -1
  66. package/dist/adapters/lmstudio/embedding-provider.js +4 -4
  67. package/dist/adapters/lmstudio/embedding-provider.js.map +1 -1
  68. package/dist/adapters/lsp/jsonrpc.js +1 -1
  69. package/dist/adapters/lsp/jsonrpc.js.map +1 -1
  70. package/dist/adapters/lsp/typescript-lsp.js +7 -7
  71. package/dist/adapters/lsp/typescript-lsp.js.map +1 -1
  72. package/dist/adapters/neo4j/client.js +2 -2
  73. package/dist/adapters/neo4j/client.js.map +1 -1
  74. package/dist/adapters/neo4j/graph-store.js +3 -3
  75. package/dist/adapters/neo4j/graph-store.js.map +1 -1
  76. package/dist/adapters/neo4j/mapper.js +4 -4
  77. package/dist/adapters/neo4j/mapper.js.map +1 -1
  78. package/dist/adapters/ollama/chat-llm.d.ts +24 -0
  79. package/dist/adapters/ollama/chat-llm.d.ts.map +1 -0
  80. package/dist/adapters/ollama/chat-llm.js +53 -0
  81. package/dist/adapters/ollama/chat-llm.js.map +1 -0
  82. package/dist/adapters/ollama/embedding-provider.d.ts +30 -0
  83. package/dist/adapters/ollama/embedding-provider.d.ts.map +1 -0
  84. package/dist/adapters/ollama/embedding-provider.js +124 -0
  85. package/dist/adapters/ollama/embedding-provider.js.map +1 -0
  86. package/dist/adapters/ollama/http-ollama-control.d.ts +24 -0
  87. package/dist/adapters/ollama/http-ollama-control.d.ts.map +1 -0
  88. package/dist/adapters/ollama/http-ollama-control.js +224 -0
  89. package/dist/adapters/ollama/http-ollama-control.js.map +1 -0
  90. package/dist/adapters/ollama/index.d.ts +6 -0
  91. package/dist/adapters/ollama/index.d.ts.map +1 -0
  92. package/dist/adapters/ollama/index.js +4 -0
  93. package/dist/adapters/ollama/index.js.map +1 -0
  94. package/dist/adapters/platform/index.d.ts +2 -0
  95. package/dist/adapters/platform/index.d.ts.map +1 -0
  96. package/dist/adapters/platform/index.js +2 -0
  97. package/dist/adapters/platform/index.js.map +1 -0
  98. package/dist/adapters/platform/node-platform-probe.d.ts +9 -0
  99. package/dist/adapters/platform/node-platform-probe.d.ts.map +1 -0
  100. package/dist/adapters/platform/node-platform-probe.js +88 -0
  101. package/dist/adapters/platform/node-platform-probe.js.map +1 -0
  102. package/dist/adapters/postgres/code-meta.js +13 -13
  103. package/dist/adapters/postgres/code-meta.js.map +1 -1
  104. package/dist/adapters/postgres/index.d.ts +2 -0
  105. package/dist/adapters/postgres/index.d.ts.map +1 -1
  106. package/dist/adapters/postgres/index.js +2 -0
  107. package/dist/adapters/postgres/index.js.map +1 -1
  108. package/dist/adapters/postgres/migrate-helpers.d.ts +43 -0
  109. package/dist/adapters/postgres/migrate-helpers.d.ts.map +1 -0
  110. package/dist/adapters/postgres/migrate-helpers.js +136 -0
  111. package/dist/adapters/postgres/migrate-helpers.js.map +1 -0
  112. package/dist/adapters/postgres/readiness-probe.d.ts +22 -0
  113. package/dist/adapters/postgres/readiness-probe.d.ts.map +1 -0
  114. package/dist/adapters/postgres/readiness-probe.js +47 -0
  115. package/dist/adapters/postgres/readiness-probe.js.map +1 -0
  116. package/dist/adapters/postgres/schema.d.ts +11 -1
  117. package/dist/adapters/postgres/schema.d.ts.map +1 -1
  118. package/dist/adapters/postgres/schema.js +159 -113
  119. package/dist/adapters/postgres/schema.js.map +1 -1
  120. package/dist/adapters/postgres/storage-commits.d.ts +13 -0
  121. package/dist/adapters/postgres/storage-commits.d.ts.map +1 -0
  122. package/dist/adapters/postgres/storage-commits.js +63 -0
  123. package/dist/adapters/postgres/storage-commits.js.map +1 -0
  124. package/dist/adapters/postgres/storage-dbschema.d.ts +14 -0
  125. package/dist/adapters/postgres/storage-dbschema.d.ts.map +1 -0
  126. package/dist/adapters/postgres/storage-dbschema.js +63 -0
  127. package/dist/adapters/postgres/storage-dbschema.js.map +1 -0
  128. package/dist/adapters/postgres/storage-graph.d.ts +18 -0
  129. package/dist/adapters/postgres/storage-graph.d.ts.map +1 -0
  130. package/dist/adapters/postgres/storage-graph.js +127 -0
  131. package/dist/adapters/postgres/storage-graph.js.map +1 -0
  132. package/dist/adapters/postgres/storage-issues.d.ts +26 -0
  133. package/dist/adapters/postgres/storage-issues.d.ts.map +1 -0
  134. package/dist/adapters/postgres/storage-issues.js +233 -0
  135. package/dist/adapters/postgres/storage-issues.js.map +1 -0
  136. package/dist/adapters/postgres/storage-prs.d.ts +15 -0
  137. package/dist/adapters/postgres/storage-prs.d.ts.map +1 -0
  138. package/dist/adapters/postgres/storage-prs.js +142 -0
  139. package/dist/adapters/postgres/storage-prs.js.map +1 -0
  140. package/dist/adapters/postgres/storage-query.d.ts +26 -0
  141. package/dist/adapters/postgres/storage-query.d.ts.map +1 -0
  142. package/dist/adapters/postgres/storage-query.js +74 -0
  143. package/dist/adapters/postgres/storage-query.js.map +1 -0
  144. package/dist/adapters/postgres/storage-search.d.ts +18 -0
  145. package/dist/adapters/postgres/storage-search.d.ts.map +1 -0
  146. package/dist/adapters/postgres/storage-search.js +90 -0
  147. package/dist/adapters/postgres/storage-search.js.map +1 -0
  148. package/dist/adapters/postgres/storage.d.ts +47 -31
  149. package/dist/adapters/postgres/storage.d.ts.map +1 -1
  150. package/dist/adapters/postgres/storage.js +86 -602
  151. package/dist/adapters/postgres/storage.js.map +1 -1
  152. package/dist/adapters/postgres/workspace-store.d.ts +26 -0
  153. package/dist/adapters/postgres/workspace-store.d.ts.map +1 -0
  154. package/dist/adapters/postgres/workspace-store.js +94 -0
  155. package/dist/adapters/postgres/workspace-store.js.map +1 -0
  156. package/dist/adapters/qdrant/client.js +1 -1
  157. package/dist/adapters/qdrant/client.js.map +1 -1
  158. package/dist/adapters/qdrant/mapper.d.ts.map +1 -1
  159. package/dist/adapters/qdrant/mapper.js +11 -4
  160. package/dist/adapters/qdrant/mapper.js.map +1 -1
  161. package/dist/adapters/qdrant/vector-store.d.ts +1 -0
  162. package/dist/adapters/qdrant/vector-store.d.ts.map +1 -1
  163. package/dist/adapters/qdrant/vector-store.js +40 -10
  164. package/dist/adapters/qdrant/vector-store.js.map +1 -1
  165. package/dist/adapters/tree-sitter/parser.d.ts.map +1 -1
  166. package/dist/adapters/tree-sitter/parser.js +12 -12
  167. package/dist/adapters/tree-sitter/parser.js.map +1 -1
  168. package/dist/adapters/voyage/embedding-provider.js +2 -2
  169. package/dist/adapters/voyage/embedding-provider.js.map +1 -1
  170. package/dist/cli/add/code.d.ts +3 -0
  171. package/dist/cli/add/code.d.ts.map +1 -0
  172. package/dist/cli/add/code.js +97 -0
  173. package/dist/cli/add/code.js.map +1 -0
  174. package/dist/cli/add/csv.d.ts +3 -0
  175. package/dist/cli/add/csv.d.ts.map +1 -0
  176. package/dist/cli/add/csv.js +26 -0
  177. package/dist/cli/add/csv.js.map +1 -0
  178. package/dist/cli/add/db.d.ts +3 -0
  179. package/dist/cli/add/db.d.ts.map +1 -0
  180. package/dist/cli/add/db.js +46 -0
  181. package/dist/cli/add/db.js.map +1 -0
  182. package/dist/cli/add/git.d.ts +3 -0
  183. package/dist/cli/add/git.d.ts.map +1 -0
  184. package/dist/cli/add/git.js +26 -0
  185. package/dist/cli/add/git.js.map +1 -0
  186. package/dist/cli/add/github.d.ts +3 -0
  187. package/dist/cli/add/github.d.ts.map +1 -0
  188. package/dist/cli/add/github.js +32 -0
  189. package/dist/cli/add/github.js.map +1 -0
  190. package/dist/cli/add/index.d.ts +3 -0
  191. package/dist/cli/add/index.d.ts.map +1 -0
  192. package/dist/cli/add/index.js +18 -0
  193. package/dist/cli/add/index.js.map +1 -0
  194. package/dist/cli/add/jira.d.ts +3 -0
  195. package/dist/cli/add/jira.d.ts.map +1 -0
  196. package/dist/cli/add/jira.js +45 -0
  197. package/dist/cli/add/jira.js.map +1 -0
  198. package/dist/cli/add/shared.d.ts +31 -0
  199. package/dist/cli/add/shared.d.ts.map +1 -0
  200. package/dist/cli/add/shared.js +102 -0
  201. package/dist/cli/add/shared.js.map +1 -0
  202. package/dist/cli/board-server.js +1 -1
  203. package/dist/cli/board-server.js.map +1 -1
  204. package/dist/cli/board.d.ts.map +1 -1
  205. package/dist/cli/board.js +11 -12
  206. package/dist/cli/board.js.map +1 -1
  207. package/dist/cli/code.d.ts.map +1 -1
  208. package/dist/cli/code.js +95 -193
  209. package/dist/cli/code.js.map +1 -1
  210. package/dist/cli/embed.d.ts.map +1 -1
  211. package/dist/cli/embed.js +21 -26
  212. package/dist/cli/embed.js.map +1 -1
  213. package/dist/cli/graph.d.ts.map +1 -1
  214. package/dist/cli/graph.js +37 -55
  215. package/dist/cli/graph.js.map +1 -1
  216. package/dist/cli/index.js +28 -25
  217. package/dist/cli/index.js.map +1 -1
  218. package/dist/cli/init/cleanup.d.ts +11 -0
  219. package/dist/cli/init/cleanup.d.ts.map +1 -0
  220. package/dist/cli/init/cleanup.js +39 -0
  221. package/dist/cli/init/cleanup.js.map +1 -0
  222. package/dist/cli/init/generators.js +27 -27
  223. package/dist/cli/init/generators.js.map +1 -1
  224. package/dist/cli/init/index.d.ts +0 -10
  225. package/dist/cli/init/index.d.ts.map +1 -1
  226. package/dist/cli/init/index.js +386 -354
  227. package/dist/cli/init/index.js.map +1 -1
  228. package/dist/cli/init/presenter.d.ts +30 -0
  229. package/dist/cli/init/presenter.d.ts.map +1 -0
  230. package/dist/cli/init/presenter.js +152 -0
  231. package/dist/cli/init/presenter.js.map +1 -0
  232. package/dist/cli/init/prompts.d.ts +28 -0
  233. package/dist/cli/init/prompts.d.ts.map +1 -0
  234. package/dist/cli/init/prompts.js +110 -0
  235. package/dist/cli/init/prompts.js.map +1 -0
  236. package/dist/cli/init/setup-csv.js +2 -2
  237. package/dist/cli/init/setup-csv.js.map +1 -1
  238. package/dist/cli/init/setup-db.d.ts.map +1 -1
  239. package/dist/cli/init/setup-db.js +17 -14
  240. package/dist/cli/init/setup-db.js.map +1 -1
  241. package/dist/cli/init/setup-git.js +16 -16
  242. package/dist/cli/init/setup-git.js.map +1 -1
  243. package/dist/cli/init/setup-github.d.ts.map +1 -1
  244. package/dist/cli/init/setup-github.js +7 -5
  245. package/dist/cli/init/setup-github.js.map +1 -1
  246. package/dist/cli/init/setup-jira.d.ts.map +1 -1
  247. package/dist/cli/init/setup-jira.js +11 -9
  248. package/dist/cli/init/setup-jira.js.map +1 -1
  249. package/dist/cli/init/types.d.ts +4 -0
  250. package/dist/cli/init/types.d.ts.map +1 -1
  251. package/dist/cli/init/types.js +4 -4
  252. package/dist/cli/init/types.js.map +1 -1
  253. package/dist/cli/mcp-install.d.ts +1 -1
  254. package/dist/cli/mcp-install.d.ts.map +1 -1
  255. package/dist/cli/mcp-install.js +10 -24
  256. package/dist/cli/mcp-install.js.map +1 -1
  257. package/dist/cli/migrate-to-hub-impl.d.ts +51 -0
  258. package/dist/cli/migrate-to-hub-impl.d.ts.map +1 -0
  259. package/dist/cli/migrate-to-hub-impl.js +171 -0
  260. package/dist/cli/migrate-to-hub-impl.js.map +1 -0
  261. package/dist/cli/migrate-to-hub.d.ts +3 -0
  262. package/dist/cli/migrate-to-hub.d.ts.map +1 -0
  263. package/dist/cli/migrate-to-hub.js +90 -0
  264. package/dist/cli/migrate-to-hub.js.map +1 -0
  265. package/dist/cli/push.d.ts.map +1 -1
  266. package/dist/cli/push.js +62 -65
  267. package/dist/cli/push.js.map +1 -1
  268. package/dist/cli/sources.d.ts +0 -7
  269. package/dist/cli/sources.d.ts.map +1 -1
  270. package/dist/cli/sources.js +47 -112
  271. package/dist/cli/sources.js.map +1 -1
  272. package/dist/cli/status.d.ts +0 -3
  273. package/dist/cli/status.d.ts.map +1 -1
  274. package/dist/cli/status.js +95 -70
  275. package/dist/cli/status.js.map +1 -1
  276. package/dist/cli/sync.d.ts +0 -10
  277. package/dist/cli/sync.d.ts.map +1 -1
  278. package/dist/cli/sync.js +186 -317
  279. package/dist/cli/sync.js.map +1 -1
  280. package/dist/cli/workspace/add.d.ts +3 -0
  281. package/dist/cli/workspace/add.d.ts.map +1 -0
  282. package/dist/cli/workspace/add.js +38 -0
  283. package/dist/cli/workspace/add.js.map +1 -0
  284. package/dist/cli/workspace/index.d.ts +3 -0
  285. package/dist/cli/workspace/index.d.ts.map +1 -0
  286. package/dist/cli/workspace/index.js +16 -0
  287. package/dist/cli/workspace/index.js.map +1 -0
  288. package/dist/cli/workspace/info.d.ts +3 -0
  289. package/dist/cli/workspace/info.d.ts.map +1 -0
  290. package/dist/cli/workspace/info.js +69 -0
  291. package/dist/cli/workspace/info.js.map +1 -0
  292. package/dist/cli/workspace/list.d.ts +3 -0
  293. package/dist/cli/workspace/list.d.ts.map +1 -0
  294. package/dist/cli/workspace/list.js +36 -0
  295. package/dist/cli/workspace/list.js.map +1 -0
  296. package/dist/cli/workspace/remove.d.ts +3 -0
  297. package/dist/cli/workspace/remove.d.ts.map +1 -0
  298. package/dist/cli/workspace/remove.js +43 -0
  299. package/dist/cli/workspace/remove.js.map +1 -0
  300. package/dist/cli/workspace/shared.d.ts +7 -0
  301. package/dist/cli/workspace/shared.d.ts.map +1 -0
  302. package/dist/cli/workspace/shared.js +17 -0
  303. package/dist/cli/workspace/shared.js.map +1 -0
  304. package/dist/cli/workspace/use.d.ts +3 -0
  305. package/dist/cli/workspace/use.d.ts.map +1 -0
  306. package/dist/cli/workspace/use.js +27 -0
  307. package/dist/cli/workspace/use.js.map +1 -0
  308. package/dist/code-intel/file-discovery.js +3 -3
  309. package/dist/code-intel/file-discovery.js.map +1 -1
  310. package/dist/code-intel/indexer.js +8 -8
  311. package/dist/code-intel/indexer.js.map +1 -1
  312. package/dist/code-intel/lsp-resolver.js +5 -5
  313. package/dist/code-intel/lsp-resolver.js.map +1 -1
  314. package/dist/code-intel/ranker.d.ts +14 -0
  315. package/dist/code-intel/ranker.d.ts.map +1 -1
  316. package/dist/code-intel/ranker.js +54 -0
  317. package/dist/code-intel/ranker.js.map +1 -1
  318. package/dist/code-intel/resolver.js +4 -4
  319. package/dist/code-intel/resolver.js.map +1 -1
  320. package/dist/code-intel/tsconfig-paths.js +2 -2
  321. package/dist/code-intel/tsconfig-paths.js.map +1 -1
  322. package/dist/code-intel/watcher.js +4 -4
  323. package/dist/code-intel/watcher.js.map +1 -1
  324. package/dist/core/board/board-column.value-object.js +1 -1
  325. package/dist/core/board/board-column.value-object.js.map +1 -1
  326. package/dist/core/board/pipeline.value-object.js +1 -1
  327. package/dist/core/board/pipeline.value-object.js.map +1 -1
  328. package/dist/core/board/skill-execution.entity.js +1 -1
  329. package/dist/core/board/skill-execution.entity.js.map +1 -1
  330. package/dist/core/board/task-title.value-object.js +1 -1
  331. package/dist/core/board/task-title.value-object.js.map +1 -1
  332. package/dist/core/ports/chat-llm.d.ts +36 -0
  333. package/dist/core/ports/chat-llm.d.ts.map +1 -0
  334. package/dist/core/ports/chat-llm.js +2 -0
  335. package/dist/core/ports/chat-llm.js.map +1 -0
  336. package/dist/core/ports/code-meta.d.ts +4 -0
  337. package/dist/core/ports/code-meta.d.ts.map +1 -1
  338. package/dist/core/ports/code-vector-store.d.ts +5 -0
  339. package/dist/core/ports/code-vector-store.d.ts.map +1 -1
  340. package/dist/core/ports/docker-control.d.ts +44 -0
  341. package/dist/core/ports/docker-control.d.ts.map +1 -0
  342. package/dist/core/ports/docker-control.js +8 -0
  343. package/dist/core/ports/docker-control.js.map +1 -0
  344. package/dist/core/ports/hub-readiness-probe.d.ts +22 -0
  345. package/dist/core/ports/hub-readiness-probe.d.ts.map +1 -0
  346. package/dist/core/ports/hub-readiness-probe.js +2 -0
  347. package/dist/core/ports/hub-readiness-probe.js.map +1 -0
  348. package/dist/core/ports/index.d.ts +4 -0
  349. package/dist/core/ports/index.d.ts.map +1 -1
  350. package/dist/core/ports/ollama-control.d.ts +61 -0
  351. package/dist/core/ports/ollama-control.d.ts.map +1 -0
  352. package/dist/core/ports/ollama-control.js +7 -0
  353. package/dist/core/ports/ollama-control.js.map +1 -0
  354. package/dist/core/ports/platform-probe.d.ts +47 -0
  355. package/dist/core/ports/platform-probe.d.ts.map +1 -0
  356. package/dist/core/ports/platform-probe.js +8 -0
  357. package/dist/core/ports/platform-probe.js.map +1 -0
  358. package/dist/core/ports/storage.d.ts +62 -29
  359. package/dist/core/ports/storage.d.ts.map +1 -1
  360. package/dist/core/ports/workspace-store.d.ts +52 -0
  361. package/dist/core/ports/workspace-store.d.ts.map +1 -0
  362. package/dist/core/ports/workspace-store.js +2 -0
  363. package/dist/core/ports/workspace-store.js.map +1 -0
  364. package/dist/core/types/index.d.ts +2 -0
  365. package/dist/core/types/index.d.ts.map +1 -1
  366. package/dist/core/types/init.d.ts +29 -0
  367. package/dist/core/types/init.d.ts.map +1 -0
  368. package/dist/core/types/init.js +2 -0
  369. package/dist/core/types/init.js.map +1 -0
  370. package/dist/core/types/workspace.d.ts +78 -0
  371. package/dist/core/types/workspace.d.ts.map +1 -0
  372. package/dist/core/types/workspace.js +2 -0
  373. package/dist/core/types/workspace.js.map +1 -0
  374. package/dist/mcp/helpers.d.ts +121 -30
  375. package/dist/mcp/helpers.d.ts.map +1 -1
  376. package/dist/mcp/helpers.js +240 -264
  377. package/dist/mcp/helpers.js.map +1 -1
  378. package/dist/mcp/server.d.ts.map +1 -1
  379. package/dist/mcp/server.js +43 -5
  380. package/dist/mcp/server.js.map +1 -1
  381. package/dist/mcp/tools/code-graph.d.ts.map +1 -1
  382. package/dist/mcp/tools/code-graph.js +109 -74
  383. package/dist/mcp/tools/code-graph.js.map +1 -1
  384. package/dist/mcp/tools/code-hybrid.d.ts.map +1 -1
  385. package/dist/mcp/tools/code-hybrid.js +75 -51
  386. package/dist/mcp/tools/code-hybrid.js.map +1 -1
  387. package/dist/mcp/tools/code-search.d.ts.map +1 -1
  388. package/dist/mcp/tools/code-search.js +32 -32
  389. package/dist/mcp/tools/code-search.js.map +1 -1
  390. package/dist/mcp/tools/database.d.ts.map +1 -1
  391. package/dist/mcp/tools/database.js +86 -97
  392. package/dist/mcp/tools/database.js.map +1 -1
  393. package/dist/mcp/tools/estimate.d.ts.map +1 -1
  394. package/dist/mcp/tools/estimate.js +106 -82
  395. package/dist/mcp/tools/estimate.js.map +1 -1
  396. package/dist/mcp/tools/graph.d.ts.map +1 -1
  397. package/dist/mcp/tools/graph.js +142 -157
  398. package/dist/mcp/tools/graph.js.map +1 -1
  399. package/dist/mcp/tools/issue.d.ts.map +1 -1
  400. package/dist/mcp/tools/issue.js +172 -172
  401. package/dist/mcp/tools/issue.js.map +1 -1
  402. package/dist/mcp/tools/push.d.ts.map +1 -1
  403. package/dist/mcp/tools/push.js +70 -100
  404. package/dist/mcp/tools/push.js.map +1 -1
  405. package/dist/mcp/tools/query.d.ts.map +1 -1
  406. package/dist/mcp/tools/query.js +187 -246
  407. package/dist/mcp/tools/query.js.map +1 -1
  408. package/dist/mcp/tools/search.d.ts.map +1 -1
  409. package/dist/mcp/tools/search.js +25 -22
  410. package/dist/mcp/tools/search.js.map +1 -1
  411. package/dist/mcp/tools/workspace.d.ts.map +1 -1
  412. package/dist/mcp/tools/workspace.js +120 -73
  413. package/dist/mcp/tools/workspace.js.map +1 -1
  414. package/dist/use-cases/build-graph.d.ts +1 -1
  415. package/dist/use-cases/build-graph.d.ts.map +1 -1
  416. package/dist/use-cases/build-graph.js +63 -50
  417. package/dist/use-cases/build-graph.js.map +1 -1
  418. package/dist/use-cases/code-search.d.ts +29 -5
  419. package/dist/use-cases/code-search.d.ts.map +1 -1
  420. package/dist/use-cases/code-search.js +98 -9
  421. package/dist/use-cases/code-search.js.map +1 -1
  422. package/dist/use-cases/embed.d.ts +1 -1
  423. package/dist/use-cases/embed.d.ts.map +1 -1
  424. package/dist/use-cases/embed.js +5 -5
  425. package/dist/use-cases/embed.js.map +1 -1
  426. package/dist/use-cases/index-code.js +2 -2
  427. package/dist/use-cases/index-code.js.map +1 -1
  428. package/dist/use-cases/init/bootstrap-hub.d.ts +55 -0
  429. package/dist/use-cases/init/bootstrap-hub.d.ts.map +1 -0
  430. package/dist/use-cases/init/bootstrap-hub.js +116 -0
  431. package/dist/use-cases/init/bootstrap-hub.js.map +1 -0
  432. package/dist/use-cases/init/check-dims-conflict.d.ts +33 -0
  433. package/dist/use-cases/init/check-dims-conflict.d.ts.map +1 -0
  434. package/dist/use-cases/init/check-dims-conflict.js +39 -0
  435. package/dist/use-cases/init/check-dims-conflict.js.map +1 -0
  436. package/dist/use-cases/init/check-hub-exists.d.ts +23 -0
  437. package/dist/use-cases/init/check-hub-exists.d.ts.map +1 -0
  438. package/dist/use-cases/init/check-hub-exists.js +39 -0
  439. package/dist/use-cases/init/check-hub-exists.js.map +1 -0
  440. package/dist/use-cases/init/check-ports.d.ts +18 -0
  441. package/dist/use-cases/init/check-ports.d.ts.map +1 -0
  442. package/dist/use-cases/init/check-ports.js +25 -0
  443. package/dist/use-cases/init/check-ports.js.map +1 -0
  444. package/dist/use-cases/init/check-versions.d.ts +37 -0
  445. package/dist/use-cases/init/check-versions.d.ts.map +1 -0
  446. package/dist/use-cases/init/check-versions.js +50 -0
  447. package/dist/use-cases/init/check-versions.js.map +1 -0
  448. package/dist/use-cases/init/clear-stale-active.d.ts +20 -0
  449. package/dist/use-cases/init/clear-stale-active.d.ts.map +1 -0
  450. package/dist/use-cases/init/clear-stale-active.js +26 -0
  451. package/dist/use-cases/init/clear-stale-active.js.map +1 -0
  452. package/dist/use-cases/init/ensure-embedding-model.d.ts +20 -0
  453. package/dist/use-cases/init/ensure-embedding-model.d.ts.map +1 -0
  454. package/dist/use-cases/init/ensure-embedding-model.js +24 -0
  455. package/dist/use-cases/init/ensure-embedding-model.js.map +1 -0
  456. package/dist/use-cases/init/ensure-ollama-running.d.ts +19 -0
  457. package/dist/use-cases/init/ensure-ollama-running.d.ts.map +1 -0
  458. package/dist/use-cases/init/ensure-ollama-running.js +24 -0
  459. package/dist/use-cases/init/ensure-ollama-running.js.map +1 -0
  460. package/dist/use-cases/init/health-check-existing-llm.d.ts +25 -0
  461. package/dist/use-cases/init/health-check-existing-llm.d.ts.map +1 -0
  462. package/dist/use-cases/init/health-check-existing-llm.js +42 -0
  463. package/dist/use-cases/init/health-check-existing-llm.js.map +1 -0
  464. package/dist/use-cases/init/install-ollama.d.ts +27 -0
  465. package/dist/use-cases/init/install-ollama.d.ts.map +1 -0
  466. package/dist/use-cases/init/install-ollama.js +51 -0
  467. package/dist/use-cases/init/install-ollama.js.map +1 -0
  468. package/dist/use-cases/init/probe-llm.d.ts +32 -0
  469. package/dist/use-cases/init/probe-llm.d.ts.map +1 -0
  470. package/dist/use-cases/init/probe-llm.js +42 -0
  471. package/dist/use-cases/init/probe-llm.js.map +1 -0
  472. package/dist/use-cases/init/resolve-hub-ports.d.ts +46 -0
  473. package/dist/use-cases/init/resolve-hub-ports.d.ts.map +1 -0
  474. package/dist/use-cases/init/resolve-hub-ports.js +77 -0
  475. package/dist/use-cases/init/resolve-hub-ports.js.map +1 -0
  476. package/dist/use-cases/init/validate-workspace-name.d.ts +26 -0
  477. package/dist/use-cases/init/validate-workspace-name.d.ts.map +1 -0
  478. package/dist/use-cases/init/validate-workspace-name.js +39 -0
  479. package/dist/use-cases/init/validate-workspace-name.js.map +1 -0
  480. package/dist/use-cases/init/wait-for-docker.d.ts +16 -0
  481. package/dist/use-cases/init/wait-for-docker.d.ts.map +1 -0
  482. package/dist/use-cases/init/wait-for-docker.js +16 -0
  483. package/dist/use-cases/init/wait-for-docker.js.map +1 -0
  484. package/dist/use-cases/init/write-config-env.d.ts +32 -0
  485. package/dist/use-cases/init/write-config-env.d.ts.map +1 -0
  486. package/dist/use-cases/init/write-config-env.js +118 -0
  487. package/dist/use-cases/init/write-config-env.js.map +1 -0
  488. package/dist/use-cases/move-task.js +2 -2
  489. package/dist/use-cases/move-task.js.map +1 -1
  490. package/dist/use-cases/pull-db.d.ts +1 -1
  491. package/dist/use-cases/pull-db.d.ts.map +1 -1
  492. package/dist/use-cases/pull-db.js +3 -3
  493. package/dist/use-cases/pull-db.js.map +1 -1
  494. package/dist/use-cases/pull-git.d.ts +1 -1
  495. package/dist/use-cases/pull-git.d.ts.map +1 -1
  496. package/dist/use-cases/pull-git.js +5 -5
  497. package/dist/use-cases/pull-git.js.map +1 -1
  498. package/dist/use-cases/pull-github.d.ts +1 -1
  499. package/dist/use-cases/pull-github.d.ts.map +1 -1
  500. package/dist/use-cases/pull-github.js +6 -6
  501. package/dist/use-cases/pull-github.js.map +1 -1
  502. package/dist/use-cases/pull.d.ts +1 -1
  503. package/dist/use-cases/pull.d.ts.map +1 -1
  504. package/dist/use-cases/pull.js +6 -6
  505. package/dist/use-cases/pull.js.map +1 -1
  506. package/dist/use-cases/push.d.ts +2 -2
  507. package/dist/use-cases/push.d.ts.map +1 -1
  508. package/dist/use-cases/push.js +8 -8
  509. package/dist/use-cases/push.js.map +1 -1
  510. package/dist/use-cases/register-code-project.d.ts +8 -0
  511. package/dist/use-cases/register-code-project.d.ts.map +1 -1
  512. package/dist/use-cases/register-code-project.js +8 -0
  513. package/dist/use-cases/register-code-project.js.map +1 -1
  514. package/dist/use-cases/watch-code.js +1 -1
  515. package/dist/use-cases/watch-code.js.map +1 -1
  516. package/dist/workspace/active-workspace.d.ts +26 -0
  517. package/dist/workspace/active-workspace.d.ts.map +1 -0
  518. package/dist/workspace/active-workspace.js +69 -0
  519. package/dist/workspace/active-workspace.js.map +1 -0
  520. package/dist/workspace/adf.d.ts.map +1 -1
  521. package/dist/workspace/adf.js +20 -19
  522. package/dist/workspace/adf.js.map +1 -1
  523. package/dist/workspace/config.d.ts +11 -0
  524. package/dist/workspace/config.d.ts.map +1 -1
  525. package/dist/workspace/config.js +76 -22
  526. package/dist/workspace/config.js.map +1 -1
  527. package/dist/workspace/hub-config.d.ts +74 -0
  528. package/dist/workspace/hub-config.d.ts.map +1 -0
  529. package/dist/workspace/hub-config.js +164 -0
  530. package/dist/workspace/hub-config.js.map +1 -0
  531. package/dist/workspace/registry.d.ts +23 -3
  532. package/dist/workspace/registry.d.ts.map +1 -1
  533. package/dist/workspace/registry.js +32 -14
  534. package/dist/workspace/registry.js.map +1 -1
  535. package/dist/workspace/resolver.d.ts +20 -18
  536. package/dist/workspace/resolver.d.ts.map +1 -1
  537. package/dist/workspace/resolver.js +100 -59
  538. package/dist/workspace/resolver.js.map +1 -1
  539. package/package.json +4 -2
  540. package/templates/hub-config.env +65 -0
  541. package/templates/hub-docker-compose.yml +88 -0
  542. package/templates/migrate-to-hub.sql +90 -0
  543. package/dist/cli/workspaces.d.ts +0 -3
  544. package/dist/cli/workspaces.d.ts.map +0 -1
  545. package/dist/cli/workspaces.js +0 -34
  546. package/dist/cli/workspaces.js.map +0 -1
@@ -1,648 +1,132 @@
1
1
  import { createPool } from './connection.js';
2
2
  import { ensureSchema } from './schema.js';
3
- import { adfToMarkdown } from '../../workspace/adf.js';
4
3
  import { PostgresCodeMetaStore } from './code-meta.js';
4
+ import { PostgresIssueStorage } from './storage-issues.js';
5
+ import { PostgresCommitStorage } from './storage-commits.js';
6
+ import { PostgresPullRequestStorage } from './storage-prs.js';
7
+ import { PostgresSearchStorage } from './storage-search.js';
8
+ import { PostgresDbSchemaStorage } from './storage-dbschema.js';
9
+ import { PostgresGraphStorage } from './storage-graph.js';
10
+ import { PostgresQueryStorage } from './storage-query.js';
5
11
  /**
6
- * PostgreSQL adapter — implements IStorage + ICodeMetaStore (via base class).
12
+ * PostgreSQL adapter — implements {@link IStorage} + {@link ICodeMetaStore}
13
+ * (via the {@link PostgresCodeMetaStore} base class).
7
14
  *
8
- * Uses UPSERT (ON CONFLICT) so re-pulling is safe and idempotent.
15
+ * Composition over inheritance: this class is a thin orchestrator that
16
+ * holds one specialized storage module per aggregate
17
+ * (`storage-issues`, `storage-commits`, etc.) and delegates every
18
+ * `IStorage` method to the matching module. Each module owns the SQL
19
+ * for one table family and stays under the 900-line architectural
20
+ * file-size cap.
21
+ *
22
+ * Every public method is scoped by `workspaceId` as the first
23
+ * parameter and binds it to the tenant `workspace_id` column.
9
24
  */
10
25
  export class PostgresStorage extends PostgresCodeMetaStore {
11
26
  name = 'PostgreSQL';
27
+ issues;
28
+ commits;
29
+ prs;
30
+ search;
31
+ dbSchema;
32
+ graph;
33
+ query;
12
34
  constructor(config) {
13
35
  super(createPool(config));
36
+ this.issues = new PostgresIssueStorage(this.pool);
37
+ this.commits = new PostgresCommitStorage(this.pool);
38
+ this.prs = new PostgresPullRequestStorage(this.pool);
39
+ this.search = new PostgresSearchStorage(this.pool);
40
+ this.dbSchema = new PostgresDbSchemaStorage(this.pool);
41
+ this.graph = new PostgresGraphStorage(this.pool);
42
+ this.query = new PostgresQueryStorage(this.pool);
14
43
  }
15
44
  async initialize() {
16
45
  await ensureSchema(this.pool);
17
46
  }
18
- async saveBatch(batch) {
19
- const client = await this.pool.connect();
20
- try {
21
- await client.query('BEGIN');
22
- for (const issue of batch.issues) {
23
- await client.query(`INSERT INTO issues (
24
- issue_key, issue_id, project_key, summary, description,
25
- issue_type, status, status_category, priority, resolution,
26
- assignee, assignee_id, reporter, reporter_id, created, updated, resolved,
27
- due_date, labels, components, fix_versions, parent_key,
28
- sprint, story_points, original_estimate, remaining_estimate, time_spent,
29
- custom_fields, raw_json, source, pulled_at,
30
- search_vector
31
- ) VALUES (
32
- $1, $2, $3, $4, $5,
33
- $6, $7, $8, $9, $10,
34
- $11, $12, $13, $14, $15, $16, $17,
35
- $18, $19, $20, $21, $22,
36
- $23, $24, $25, $26, $27,
37
- $28, $29, $30, NOW(),
38
- to_tsvector('english', $31)
39
- )
40
- ON CONFLICT (issue_key) DO UPDATE SET
41
- issue_id = EXCLUDED.issue_id,
42
- project_key = EXCLUDED.project_key,
43
- summary = EXCLUDED.summary,
44
- description = EXCLUDED.description,
45
- issue_type = EXCLUDED.issue_type,
46
- status = EXCLUDED.status,
47
- status_category = EXCLUDED.status_category,
48
- priority = EXCLUDED.priority,
49
- resolution = EXCLUDED.resolution,
50
- assignee = EXCLUDED.assignee,
51
- assignee_id = EXCLUDED.assignee_id,
52
- reporter = EXCLUDED.reporter,
53
- reporter_id = EXCLUDED.reporter_id,
54
- created = EXCLUDED.created,
55
- updated = EXCLUDED.updated,
56
- resolved = EXCLUDED.resolved,
57
- due_date = EXCLUDED.due_date,
58
- labels = EXCLUDED.labels,
59
- components = EXCLUDED.components,
60
- fix_versions = EXCLUDED.fix_versions,
61
- parent_key = EXCLUDED.parent_key,
62
- sprint = EXCLUDED.sprint,
63
- story_points = EXCLUDED.story_points,
64
- original_estimate = EXCLUDED.original_estimate,
65
- remaining_estimate = EXCLUDED.remaining_estimate,
66
- time_spent = EXCLUDED.time_spent,
67
- custom_fields = EXCLUDED.custom_fields,
68
- raw_json = EXCLUDED.raw_json,
69
- source = EXCLUDED.source,
70
- pulled_at = NOW(),
71
- search_vector = to_tsvector('english', coalesce(EXCLUDED.summary, '') || ' ' || coalesce(EXCLUDED.description, ''))
72
- `, [
73
- issue.key, issue.id, issue.projectKey, issue.summary, normalizeDescription(issue.description),
74
- issue.issueType, issue.status, issue.statusCategory, issue.priority, issue.resolution,
75
- issue.assignee, issue.assigneeId, issue.reporter, issue.reporterId, issue.created, issue.updated, issue.resolved,
76
- issue.dueDate, issue.labels, issue.components, issue.fixVersions, issue.parentKey,
77
- issue.sprint, issue.storyPoints, issue.originalEstimate, issue.remainingEstimate, issue.timeSpent,
78
- JSON.stringify(issue.customFields), JSON.stringify(issue.rawJson), issue.source ?? 'jira',
79
- [issue.summary, normalizeDescription(issue.description)].filter(Boolean).join(' '),
80
- ]);
81
- }
82
- const issueKeys = batch.issues.map((i) => i.key);
83
- if (issueKeys.length > 0) {
84
- const keysParam = issueKeys.map((_, i) => `$${i + 1}`).join(',');
85
- await client.query(`DELETE FROM issue_comments WHERE issue_key IN (${keysParam})`, issueKeys);
86
- await client.query(`DELETE FROM issue_changelogs WHERE issue_key IN (${keysParam})`, issueKeys);
87
- await client.query(`DELETE FROM issue_worklogs WHERE issue_key IN (${keysParam})`, issueKeys);
88
- await client.query(`DELETE FROM issue_links WHERE source_key IN (${keysParam})`, issueKeys);
89
- }
90
- for (const c of batch.comments) {
91
- await client.query(`INSERT INTO issue_comments (issue_key, comment_id, author, body, created, updated)
92
- VALUES ($1, $2, $3, $4, $5, $6)`, [c.issueKey, c.commentId, c.author, c.body, c.created, c.updated]);
93
- }
94
- for (const ch of batch.changelogs) {
95
- await client.query(`INSERT INTO issue_changelogs (issue_key, author, field, from_value, to_value, changed_at)
96
- VALUES ($1, $2, $3, $4, $5, $6)`, [ch.issueKey, ch.author, ch.field, ch.fromValue, ch.toValue, ch.changedAt]);
97
- }
98
- for (const w of batch.worklogs) {
99
- await client.query(`INSERT INTO issue_worklogs (issue_key, author, time_spent, time_spent_seconds, comment, started)
100
- VALUES ($1, $2, $3, $4, $5, $6)`, [w.issueKey, w.author, w.timeSpent, w.timeSpentSeconds, w.comment, w.started]);
101
- }
102
- for (const l of batch.links) {
103
- await client.query(`INSERT INTO issue_links (source_key, target_key, link_type, direction)
104
- VALUES ($1, $2, $3, $4)`, [l.sourceKey, l.targetKey, l.linkType, l.direction]);
105
- }
106
- await client.query('COMMIT');
107
- }
108
- catch (err) {
109
- await client.query('ROLLBACK');
110
- throw err;
111
- }
112
- finally {
113
- client.release();
114
- }
47
+ async saveBatch(workspaceId, batch) {
48
+ await this.issues.saveBatch(workspaceId, batch);
115
49
  }
116
- async saveCommitBatch(batch) {
117
- const client = await this.pool.connect();
118
- try {
119
- await client.query('BEGIN');
120
- for (const commit of batch.commits) {
121
- await client.query(`INSERT INTO commits (hash, message, author, email, committed_at, parents, repo_path, pulled_at, search_vector)
122
- VALUES ($1, $2, $3, $4, $5, $6::text[], $7, NOW(),
123
- to_tsvector('english', $8)
124
- )
125
- ON CONFLICT (hash) DO UPDATE SET
126
- message = EXCLUDED.message,
127
- author = EXCLUDED.author,
128
- email = EXCLUDED.email,
129
- committed_at = EXCLUDED.committed_at,
130
- parents = EXCLUDED.parents,
131
- repo_path = EXCLUDED.repo_path,
132
- pulled_at = NOW(),
133
- search_vector = to_tsvector('english', coalesce(EXCLUDED.message, '') || ' ' || coalesce(EXCLUDED.author, ''))`, [commit.hash, commit.message, commit.author, commit.email, commit.committedAt, commit.parents, commit.repoPath, `${commit.message || ''} ${commit.author || ''}`]);
134
- }
135
- const hashes = batch.commits.map((c) => c.hash);
136
- if (hashes.length > 0) {
137
- const hashesParam = hashes.map((_, i) => `$${i + 1}`).join(',');
138
- await client.query(`DELETE FROM commit_files WHERE commit_hash IN (${hashesParam})`, hashes);
139
- await client.query(`DELETE FROM commit_issue_refs WHERE commit_hash IN (${hashesParam})`, hashes);
140
- }
141
- for (const file of batch.files) {
142
- await client.query(`INSERT INTO commit_files (commit_hash, file_path, status, additions, deletions)
143
- VALUES ($1, $2, $3, $4, $5)`, [file.commitHash, file.filePath, file.status, file.additions, file.deletions]);
144
- }
145
- for (const ref of batch.issueRefs) {
146
- await client.query(`INSERT INTO commit_issue_refs (commit_hash, issue_key)
147
- VALUES ($1, $2)
148
- ON CONFLICT DO NOTHING`, [ref.commitHash, ref.issueKey]);
149
- }
150
- await client.query('COMMIT');
151
- }
152
- catch (err) {
153
- await client.query('ROLLBACK');
154
- throw err;
155
- }
156
- finally {
157
- client.release();
158
- }
50
+ async getLastUpdated(workspaceId, projectKey) {
51
+ return this.issues.getLastUpdated(workspaceId, projectKey);
159
52
  }
160
- async getLastCommitDate(repoPath) {
161
- const result = await this.pool.query(`SELECT MAX(committed_at) as last_date FROM commits WHERE repo_path = $1`, [repoPath]);
162
- return result.rows[0]?.last_date ?? null;
53
+ async getLocalIssues(workspaceId) {
54
+ return this.issues.getLocalIssues(workspaceId);
163
55
  }
164
- async getLastUpdated(projectKey) {
165
- const result = await this.pool.query(`SELECT MAX(updated) as last_updated FROM issues WHERE project_key = $1`, [projectKey]);
166
- const raw = result.rows[0]?.last_updated;
167
- if (!raw) {
168
- return null;
169
- }
170
- return new Date(raw).toISOString();
56
+ async updateIssueSource(workspaceId, issueKey, source) {
57
+ await this.issues.updateIssueSource(workspaceId, issueKey, source);
171
58
  }
172
- async saveGitHubBatch(batch) {
173
- const client = await this.pool.connect();
174
- try {
175
- await client.query('BEGIN');
176
- for (const pr of batch.pullRequests) {
177
- await client.query(`INSERT INTO pull_requests (
178
- number, repo_full_name, title, body, state, author,
179
- created_at, updated_at, merged_at, closed_at,
180
- merge_commit_sha, head_ref, base_ref,
181
- labels, reviewers, additions, deletions, changed_files,
182
- raw_json, pulled_at, search_vector
183
- ) VALUES (
184
- $1, $2, $3, $4, $5, $6,
185
- $7, $8, $9, $10,
186
- $11, $12, $13,
187
- $14::text[], $15::text[], $16, $17, $18,
188
- $19, NOW(),
189
- to_tsvector('english', $20)
190
- )
191
- ON CONFLICT (repo_full_name, number) DO UPDATE SET
192
- title = EXCLUDED.title,
193
- body = EXCLUDED.body,
194
- state = EXCLUDED.state,
195
- author = EXCLUDED.author,
196
- created_at = EXCLUDED.created_at,
197
- updated_at = EXCLUDED.updated_at,
198
- merged_at = EXCLUDED.merged_at,
199
- closed_at = EXCLUDED.closed_at,
200
- merge_commit_sha = EXCLUDED.merge_commit_sha,
201
- head_ref = EXCLUDED.head_ref,
202
- base_ref = EXCLUDED.base_ref,
203
- labels = EXCLUDED.labels,
204
- reviewers = EXCLUDED.reviewers,
205
- additions = EXCLUDED.additions,
206
- deletions = EXCLUDED.deletions,
207
- changed_files = EXCLUDED.changed_files,
208
- raw_json = EXCLUDED.raw_json,
209
- pulled_at = NOW(),
210
- search_vector = to_tsvector('english', coalesce(EXCLUDED.title, '') || ' ' || coalesce(EXCLUDED.body, ''))`, [
211
- pr.number, pr.repoFullName, pr.title, pr.body, pr.state, pr.author,
212
- pr.createdAt, pr.updatedAt, pr.mergedAt, pr.closedAt,
213
- pr.mergeCommitSha, pr.headRef, pr.baseRef,
214
- pr.labels, pr.reviewers, pr.additions, pr.deletions, pr.changedFiles,
215
- JSON.stringify(pr.rawJson),
216
- [pr.title, pr.body].filter(Boolean).join(' '),
217
- ]);
218
- }
219
- const prNumbers = batch.pullRequests.map((p) => p.number);
220
- const repoName = batch.pullRequests[0]?.repoFullName;
221
- if (prNumbers.length > 0 && repoName) {
222
- const prParams = prNumbers.map((_, i) => `$${i + 2}`).join(',');
223
- await client.query(`DELETE FROM pr_reviews WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
224
- await client.query(`DELETE FROM pr_comments WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
225
- await client.query(`DELETE FROM pr_files WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
226
- await client.query(`DELETE FROM pr_issue_refs WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
227
- }
228
- for (const r of batch.reviews) {
229
- await client.query(`INSERT INTO pr_reviews (pr_number, repo_full_name, review_id, reviewer, state, body, submitted_at)
230
- VALUES ($1, $2, $3, $4, $5, $6, $7)`, [r.prNumber, r.repoFullName, r.reviewId, r.reviewer, r.state, r.body, r.submittedAt]);
231
- }
232
- for (const c of batch.comments) {
233
- await client.query(`INSERT INTO pr_comments (pr_number, repo_full_name, comment_id, author, body, path, line, created_at, updated_at)
234
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, [c.prNumber, c.repoFullName, c.commentId, c.author, c.body, c.path, c.line, c.createdAt, c.updatedAt]);
235
- }
236
- for (const f of batch.files) {
237
- await client.query(`INSERT INTO pr_files (pr_number, repo_full_name, file_path, status, additions, deletions)
238
- VALUES ($1, $2, $3, $4, $5, $6)`, [f.prNumber, f.repoFullName, f.filePath, f.status, f.additions, f.deletions]);
239
- }
240
- for (const ref of batch.issueRefs) {
241
- await client.query(`INSERT INTO pr_issue_refs (pr_number, repo_full_name, issue_key)
242
- VALUES ($1, $2, $3)
243
- ON CONFLICT DO NOTHING`, [ref.prNumber, ref.repoFullName, ref.issueKey]);
244
- }
245
- await client.query('COMMIT');
246
- }
247
- catch (err) {
248
- await client.query('ROLLBACK');
249
- throw err;
250
- }
251
- finally {
252
- client.release();
253
- }
59
+ async updateIssueFields(workspaceId, issueKey, fields) {
60
+ await this.issues.updateIssueFields(workspaceId, issueKey, fields);
254
61
  }
255
- async saveReleases(releases) {
256
- const client = await this.pool.connect();
257
- try {
258
- await client.query('BEGIN');
259
- for (const rel of releases) {
260
- await client.query(`INSERT INTO releases (
261
- id, repo_full_name, tag_name, name, body, author,
262
- draft, prerelease, created_at, published_at,
263
- raw_json, pulled_at, search_vector
264
- ) VALUES (
265
- $1, $2, $3, $4, $5, $6,
266
- $7, $8, $9, $10,
267
- $11, NOW(),
268
- to_tsvector('english', $12)
269
- )
270
- ON CONFLICT (repo_full_name, id) DO UPDATE SET
271
- tag_name = EXCLUDED.tag_name,
272
- name = EXCLUDED.name,
273
- body = EXCLUDED.body,
274
- author = EXCLUDED.author,
275
- draft = EXCLUDED.draft,
276
- prerelease = EXCLUDED.prerelease,
277
- created_at = EXCLUDED.created_at,
278
- published_at = EXCLUDED.published_at,
279
- raw_json = EXCLUDED.raw_json,
280
- pulled_at = NOW(),
281
- search_vector = to_tsvector('english', coalesce(EXCLUDED.name, '') || ' ' || coalesce(EXCLUDED.body, '') || ' ' || coalesce(EXCLUDED.tag_name, ''))`, [
282
- rel.id, rel.repoFullName, rel.tagName, rel.name, rel.body, rel.author,
283
- rel.draft, rel.prerelease, rel.createdAt, rel.publishedAt,
284
- JSON.stringify(rel.rawJson),
285
- [rel.name, rel.body, rel.tagName].filter(Boolean).join(' '),
286
- ]);
287
- }
288
- await client.query('COMMIT');
289
- }
290
- catch (err) {
291
- await client.query('ROLLBACK');
292
- throw err;
293
- }
294
- finally {
295
- client.release();
296
- }
62
+ async getModifiedIssues(workspaceId) {
63
+ return this.issues.getModifiedIssues(workspaceId);
297
64
  }
298
- async getLastPrUpdated(repoFullName) {
299
- const result = await this.pool.query(`SELECT MAX(updated_at) as last_updated FROM pull_requests WHERE repo_full_name = $1`, [repoFullName]);
300
- return result.rows[0]?.last_updated ?? null;
65
+ async clearModifiedFlag(workspaceId, issueKey) {
66
+ await this.issues.clearModifiedFlag(workspaceId, issueKey);
301
67
  }
302
- async getUnembeddedIssueKeys(limit) {
303
- const result = await this.pool.query(`SELECT issue_key FROM issues WHERE embedding IS NULL ORDER BY updated DESC NULLS LAST LIMIT $1`, [limit]);
304
- return result.rows.map((r) => r.issue_key);
68
+ async saveCommitBatch(workspaceId, batch) {
69
+ await this.commits.saveCommitBatch(workspaceId, batch);
305
70
  }
306
- async saveEmbedding(issueKey, vector) {
307
- await this.pool.query(`UPDATE issues SET embedding = $1 WHERE issue_key = $2`, [`[${vector.join(',')}]`, issueKey]);
71
+ async getLastCommitDate(workspaceId, repoPath) {
72
+ return this.commits.getLastCommitDate(workspaceId, repoPath);
308
73
  }
309
- async semanticSearch(vector, limit, threshold) {
310
- const vectorStr = `[${vector.join(',')}]`;
311
- const thresholdClause = threshold !== undefined
312
- ? `AND 1 - (embedding <=> $1::vector) >= ${String(threshold)}`
313
- : '';
314
- const result = await this.pool.query(`SELECT issue_key, 1 - (embedding <=> $1::vector) AS similarity
315
- FROM issues
316
- WHERE embedding IS NOT NULL ${thresholdClause}
317
- ORDER BY embedding <=> $1::vector
318
- LIMIT $2`, [vectorStr, limit]);
319
- return result.rows.map((r) => ({
320
- issueKey: r.issue_key,
321
- similarity: r.similarity,
322
- }));
74
+ async saveGitHubBatch(workspaceId, batch) {
75
+ await this.prs.saveGitHubBatch(workspaceId, batch);
323
76
  }
324
- async hybridSearch(query, vector, limit, threshold) {
325
- const k = 60;
326
- const maxPerSource = limit * 2;
327
- const minSimilarity = threshold ?? 0.5;
328
- if (!vector) {
329
- const result = await this.pool.query(`SELECT issue_key,
330
- 1.0 / (${String(k)} + ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_vector, plainto_tsquery('english', $1)) DESC)) AS score,
331
- true AS in_text,
332
- false AS in_vector
333
- FROM issues
334
- WHERE search_vector @@ plainto_tsquery('english', $1)
335
- ORDER BY score DESC
336
- LIMIT $2`, [query, limit]);
337
- return result.rows.map((r) => ({
338
- issueKey: r.issue_key,
339
- score: r.score,
340
- source: 'text',
341
- }));
342
- }
343
- const vectorStr = `[${vector.join(',')}]`;
344
- const result = await this.pool.query(`WITH text_search AS (
345
- SELECT issue_key, ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_vector, plainto_tsquery('english', $1)) DESC) AS rank
346
- FROM issues
347
- WHERE search_vector @@ plainto_tsquery('english', $1)
348
- LIMIT $3
349
- ),
350
- vector_search AS (
351
- SELECT issue_key, ROW_NUMBER() OVER (ORDER BY embedding <=> $2::vector) AS rank
352
- FROM issues
353
- WHERE embedding IS NOT NULL
354
- AND 1 - (embedding <=> $2::vector) >= ${String(minSimilarity)}
355
- LIMIT $3
356
- )
357
- SELECT COALESCE(t.issue_key, v.issue_key) AS issue_key,
358
- 1.0 / (${String(k)} + COALESCE(t.rank, 1000)) + 1.0 / (${String(k)} + COALESCE(v.rank, 1000)) AS score,
359
- t.issue_key IS NOT NULL AS in_text,
360
- v.issue_key IS NOT NULL AS in_vector
361
- FROM text_search t
362
- FULL OUTER JOIN vector_search v ON t.issue_key = v.issue_key
363
- ORDER BY score DESC
364
- LIMIT $4`, [query, vectorStr, maxPerSource, limit]);
365
- return result.rows.map((r) => {
366
- let source;
367
- if (r.in_text && r.in_vector) {
368
- source = 'both';
369
- }
370
- else if (r.in_text) {
371
- source = 'text';
372
- }
373
- else {
374
- source = 'semantic';
375
- }
376
- return { issueKey: r.issue_key, score: r.score, source };
377
- });
77
+ async saveReleases(workspaceId, releases) {
78
+ await this.prs.saveReleases(workspaceId, releases);
378
79
  }
379
- async query(sql, params) {
380
- const result = await this.pool.query(sql, params);
381
- return { rows: result.rows };
80
+ async getLastPrUpdated(workspaceId, repoFullName) {
81
+ return this.prs.getLastPrUpdated(workspaceId, repoFullName);
382
82
  }
383
- async saveDbSchemaBatch(batch, sourceName) {
384
- const client = await this.pool.connect();
385
- try {
386
- await client.query('BEGIN');
387
- for (const table of batch.tables) {
388
- await client.query(`INSERT INTO db_tables (source_name, table_schema, table_name, row_count, size_bytes)
389
- VALUES ($1, $2, $3, $4, $5)
390
- ON CONFLICT (source_name, table_schema, table_name) DO UPDATE SET
391
- row_count = EXCLUDED.row_count,
392
- size_bytes = EXCLUDED.size_bytes,
393
- pulled_at = NOW()`, [sourceName, table.schema, table.name, table.rowCount, table.sizeBytes]);
394
- for (const col of table.columns) {
395
- await client.query(`INSERT INTO db_columns (source_name, table_schema, table_name, column_name, data_type, is_nullable, default_value, is_primary_key, ordinal_position)
396
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
397
- ON CONFLICT (source_name, table_schema, table_name, column_name) DO UPDATE SET
398
- data_type = EXCLUDED.data_type,
399
- is_nullable = EXCLUDED.is_nullable,
400
- default_value = EXCLUDED.default_value,
401
- is_primary_key = EXCLUDED.is_primary_key,
402
- ordinal_position = EXCLUDED.ordinal_position`, [sourceName, table.schema, table.name, col.name, col.dataType, col.nullable, col.defaultValue, col.isPrimaryKey, col.ordinalPosition]);
403
- }
404
- }
405
- for (const fk of batch.foreignKeys) {
406
- await client.query(`INSERT INTO db_foreign_keys (source_name, table_name, column_name, referenced_table, referenced_column)
407
- VALUES ($1, $2, $3, $4, $5)
408
- ON CONFLICT (source_name, table_name, column_name, referenced_table, referenced_column) DO NOTHING`, [sourceName, fk.tableName, fk.columnName, fk.referencedTable, fk.referencedColumn]);
409
- }
410
- for (const idx of batch.indexes) {
411
- await client.query(`INSERT INTO db_indexes (source_name, table_name, index_name, columns, is_unique, is_primary)
412
- VALUES ($1, $2, $3, $4, $5, $6)
413
- ON CONFLICT (source_name, table_name, index_name) DO UPDATE SET
414
- columns = EXCLUDED.columns,
415
- is_unique = EXCLUDED.is_unique,
416
- is_primary = EXCLUDED.is_primary`, [sourceName, idx.tableName, idx.indexName, idx.columns, idx.isUnique, idx.isPrimary]);
417
- }
418
- await client.query('COMMIT');
419
- }
420
- catch (err) {
421
- await client.query('ROLLBACK');
422
- throw err;
423
- }
424
- finally {
425
- client.release();
426
- }
83
+ async getUnembeddedIssueKeys(workspaceId, limit) {
84
+ return this.search.getUnembeddedIssueKeys(workspaceId, limit);
427
85
  }
428
- async deleteDbSchema(sourceName) {
429
- await this.pool.query('DELETE FROM db_indexes WHERE source_name = $1', [sourceName]);
430
- await this.pool.query('DELETE FROM db_foreign_keys WHERE source_name = $1', [sourceName]);
431
- await this.pool.query('DELETE FROM db_columns WHERE source_name = $1', [sourceName]);
432
- await this.pool.query('DELETE FROM db_tables WHERE source_name = $1', [sourceName]);
86
+ async saveEmbedding(workspaceId, issueKey, vector) {
87
+ await this.search.saveEmbedding(workspaceId, issueKey, vector);
433
88
  }
434
- async getLocalIssues() {
435
- const result = await this.pool.query(`SELECT * FROM issues WHERE source = 'local' ORDER BY created`);
436
- return result.rows.map((row) => this.mapRowToIssue(row));
89
+ async semanticSearch(workspaceId, vector, limit, threshold) {
90
+ return this.search.semanticSearch(workspaceId, vector, limit, threshold);
437
91
  }
438
- async updateIssueSource(issueKey, source) {
439
- await this.pool.query(`UPDATE issues SET source = $2 WHERE issue_key = $1`, [issueKey, source]);
92
+ async hybridSearch(workspaceId, query, vector, limit, threshold) {
93
+ return this.search.hybridSearch(workspaceId, query, vector, limit, threshold);
440
94
  }
441
- async updateIssueFields(issueKey, fields) {
442
- const fieldMap = {};
443
- if (fields.summary !== undefined) {
444
- fieldMap['summary'] = fields.summary;
445
- }
446
- if (fields.description !== undefined) {
447
- fieldMap['description'] = fields.description;
448
- }
449
- if (fields.status !== undefined) {
450
- fieldMap['status'] = fields.status;
451
- }
452
- if (fields.priority !== undefined) {
453
- fieldMap['priority'] = fields.priority;
454
- }
455
- if (fields.assignee !== undefined) {
456
- fieldMap['assignee'] = fields.assignee;
457
- }
458
- if (fields.labels !== undefined) {
459
- fieldMap['labels'] = fields.labels;
460
- }
461
- if (fields.components !== undefined) {
462
- fieldMap['components'] = fields.components;
463
- }
464
- if (fields.storyPoints !== undefined) {
465
- fieldMap['story_points'] = fields.storyPoints;
466
- }
467
- const keys = Object.keys(fieldMap);
468
- if (keys.length === 0) {
469
- return;
470
- }
471
- const setClauses = keys.map((col, i) => `${col} = $${String(i + 2)}`);
472
- setClauses.push('locally_modified = true', 'modified_at = NOW()');
473
- setClauses.push(`modified_fields = $${String(keys.length + 2)}`);
474
- const values = keys.map((col) => fieldMap[col]);
475
- values.push(keys);
476
- const sql = `UPDATE issues SET ${setClauses.join(', ')} WHERE issue_key = $1`;
477
- const result = await this.pool.query(sql, [issueKey, ...values]);
478
- if (result.rowCount === 0) {
479
- throw new Error(`Issue ${issueKey} not found in local database`);
480
- }
95
+ async saveDbSchemaBatch(workspaceId, batch, sourceName) {
96
+ await this.dbSchema.saveDbSchemaBatch(workspaceId, batch, sourceName);
481
97
  }
482
- async getModifiedIssues() {
483
- const result = await this.pool.query(`SELECT * FROM issues WHERE locally_modified = true ORDER BY modified_at`);
484
- return result.rows.map((row) => {
485
- const r = row;
486
- return {
487
- ...this.mapRowToIssue(r),
488
- modifiedFields: r['modified_fields'] ?? [],
489
- };
490
- });
98
+ async deleteDbSchema(workspaceId, sourceName) {
99
+ await this.dbSchema.deleteDbSchema(workspaceId, sourceName);
491
100
  }
492
- mapRowToIssue(row) {
493
- const str = (key) => typeof row[key] === 'string' ? row[key] : '';
494
- const strNull = (key) => typeof row[key] === 'string' ? row[key] : null;
495
- const numNull = (key) => typeof row[key] === 'number' ? row[key] : null;
496
- const arr = (key) => Array.isArray(row[key]) ? row[key] : [];
497
- return {
498
- key: str('issue_key'),
499
- id: str('issue_id'),
500
- projectKey: str('project_key'),
501
- summary: str('summary'),
502
- description: strNull('description'),
503
- issueType: strNull('issue_type'),
504
- status: strNull('status'),
505
- statusCategory: strNull('status_category'),
506
- priority: strNull('priority'),
507
- resolution: strNull('resolution'),
508
- assignee: strNull('assignee'),
509
- assigneeId: strNull('assignee_id'),
510
- reporter: strNull('reporter'),
511
- reporterId: strNull('reporter_id'),
512
- created: strNull('created'),
513
- updated: strNull('updated'),
514
- resolved: strNull('resolved'),
515
- dueDate: strNull('due_date'),
516
- labels: arr('labels'),
517
- components: arr('components'),
518
- fixVersions: arr('fix_versions'),
519
- parentKey: strNull('parent_key'),
520
- sprint: strNull('sprint'),
521
- storyPoints: numNull('story_points'),
522
- originalEstimate: numNull('original_estimate'),
523
- remainingEstimate: numNull('remaining_estimate'),
524
- timeSpent: numNull('time_spent'),
525
- customFields: row['custom_fields'] ?? {},
526
- rawJson: row['raw_json'] ?? {},
527
- source: row['source'] ?? 'jira',
528
- };
101
+ async saveGraphEntities(workspaceId, entities) {
102
+ await this.graph.saveGraphEntities(workspaceId, entities);
529
103
  }
530
- async clearModifiedFlag(issueKey) {
531
- await this.pool.query(`UPDATE issues SET locally_modified = false, modified_at = NULL WHERE issue_key = $1`, [issueKey]);
104
+ async saveGraphRelationships(workspaceId, rels) {
105
+ await this.graph.saveGraphRelationships(workspaceId, rels);
532
106
  }
533
- async saveGraphEntities(entities) {
534
- for (const entity of entities) {
535
- await this.pool.query(`INSERT INTO graph_entities (name, type, properties)
536
- VALUES ($1, $2, $3)
537
- ON CONFLICT (name, type) DO UPDATE SET properties = EXCLUDED.properties`, [entity.name, entity.type, JSON.stringify(entity.properties)]);
538
- }
107
+ async saveGraphObservation(workspaceId, entityId, content, author) {
108
+ await this.graph.saveGraphObservation(workspaceId, entityId, content, author);
539
109
  }
540
- async saveGraphRelationships(rels) {
541
- for (const rel of rels) {
542
- await this.pool.query(`INSERT INTO graph_relationships (source_id, target_id, type, weight, source, properties)
543
- VALUES ($1, $2, $3, $4, $5, $6)
544
- ON CONFLICT (source_id, target_id, type) DO UPDATE SET weight = EXCLUDED.weight, properties = EXCLUDED.properties`, [rel.sourceId, rel.targetId, rel.type, rel.weight, rel.source, JSON.stringify(rel.properties)]);
545
- }
110
+ async getObservations(workspaceId, entityId) {
111
+ return this.graph.getObservations(workspaceId, entityId);
546
112
  }
547
- async saveGraphObservation(entityId, content, author) {
548
- await this.pool.query(`INSERT INTO graph_observations (entity_id, content, author) VALUES ($1, $2, $3)`, [entityId, content, author]);
113
+ async queryGraph(workspaceId, entityName, depth) {
114
+ return this.graph.queryGraph(workspaceId, entityName, depth);
549
115
  }
550
- async getObservations(entityId) {
551
- const result = await this.pool.query(`SELECT id, entity_id, content, author, created_at FROM graph_observations WHERE entity_id = $1 ORDER BY created_at`, [entityId]);
552
- return result.rows.map((r) => ({
553
- id: r['id'],
554
- entityId: r['entity_id'],
555
- content: r['content'],
556
- author: r['author'],
557
- createdAt: r['created_at'],
558
- }));
116
+ async getGraphStats(workspaceId) {
117
+ return this.graph.getGraphStats(workspaceId);
559
118
  }
560
- async queryGraph(entityName, depth) {
561
- const result = await this.pool.query(`WITH RECURSIVE graph_walk AS (
562
- SELECT id, name, type, properties, 0 as depth
563
- FROM graph_entities WHERE name ILIKE $1
564
- UNION
565
- SELECT e.id, e.name, e.type, e.properties, gw.depth + 1
566
- FROM graph_walk gw
567
- JOIN graph_relationships r ON r.source_id = gw.id OR r.target_id = gw.id
568
- JOIN graph_entities e ON e.id = CASE WHEN r.source_id = gw.id THEN r.target_id ELSE r.source_id END
569
- WHERE gw.depth < $2
570
- )
571
- SELECT DISTINCT id, name, type, properties FROM graph_walk LIMIT 200`, [`%${entityName}%`, depth]);
572
- const entityIds = result.rows.map((r) => r['id']);
573
- const entities = result.rows.map((r) => ({
574
- id: r['id'],
575
- name: r['name'],
576
- type: r['type'],
577
- properties: r['properties'],
578
- }));
579
- let relationships = [];
580
- let observations = [];
581
- if (entityIds.length > 0) {
582
- const idList = entityIds.map((_, i) => `$${String(i + 1)}`).join(',');
583
- const relResult = await this.pool.query(`SELECT id, source_id, target_id, type, weight, source, properties
584
- FROM graph_relationships WHERE source_id IN (${idList}) OR target_id IN (${idList})`, entityIds);
585
- relationships = relResult.rows.map((r) => ({
586
- id: r['id'],
587
- sourceId: r['source_id'],
588
- targetId: r['target_id'],
589
- type: r['type'],
590
- weight: Number(r['weight']),
591
- source: r['source'],
592
- properties: r['properties'],
593
- }));
594
- const obsResult = await this.pool.query(`SELECT id, entity_id, content, author, created_at
595
- FROM graph_observations WHERE entity_id IN (${idList})`, entityIds);
596
- observations = obsResult.rows.map((r) => ({
597
- id: r['id'],
598
- entityId: r['entity_id'],
599
- content: r['content'],
600
- author: r['author'],
601
- createdAt: r['created_at'],
602
- }));
603
- }
604
- return { entities, relationships, observations };
119
+ async clearGraph(workspaceId) {
120
+ await this.graph.clearGraph(workspaceId);
605
121
  }
606
- async getGraphStats() {
607
- const entityResult = await this.pool.query(`SELECT type, COUNT(*) as cnt FROM graph_entities GROUP BY type`);
608
- const relResult = await this.pool.query(`SELECT type, COUNT(*) as cnt FROM graph_relationships GROUP BY type`);
609
- const obsResult = await this.pool.query(`SELECT COUNT(*) as cnt FROM graph_observations`);
610
- const byEntityType = {};
611
- let entityCount = 0;
612
- for (const row of entityResult.rows) {
613
- const count = Number(row['cnt']);
614
- byEntityType[row['type']] = count;
615
- entityCount += count;
616
- }
617
- const byRelationshipType = {};
618
- let relationshipCount = 0;
619
- for (const row of relResult.rows) {
620
- const count = Number(row['cnt']);
621
- byRelationshipType[row['type']] = count;
622
- relationshipCount += count;
623
- }
624
- const firstRow = obsResult.rows[0];
625
- const observationCount = Number(firstRow?.['cnt'] ?? 0);
626
- return { entityCount, relationshipCount, observationCount, byEntityType, byRelationshipType };
122
+ async queryForWorkspace(workspaceId, sql, params) {
123
+ return this.query.queryForWorkspace(workspaceId, sql, params);
627
124
  }
628
- async clearGraph() {
629
- await this.pool.query(`DELETE FROM graph_relationships WHERE source IN ('structural', 'auto')`);
630
- await this.pool.query(`DELETE FROM graph_entities WHERE id NOT IN (
631
- SELECT DISTINCT source_id FROM graph_relationships
632
- UNION SELECT DISTINCT target_id FROM graph_relationships
633
- ) AND id NOT IN (SELECT DISTINCT entity_id FROM graph_observations)`);
125
+ async rawQuery(sql, params) {
126
+ return this.query.rawQuery(sql, params);
634
127
  }
635
128
  async close() {
636
129
  await this.pool.end();
637
130
  }
638
131
  }
639
- function normalizeDescription(desc) {
640
- if (!desc) {
641
- return desc;
642
- }
643
- if (desc.startsWith('{"type":"doc"')) {
644
- return adfToMarkdown(desc);
645
- }
646
- return desc;
647
- }
648
132
  //# sourceMappingURL=storage.js.map