@gzoo/cortex 0.5.9

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 (377) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/CLAUDE.md +180 -0
  3. package/CONTRIBUTING.md +52 -0
  4. package/LICENSE +21 -0
  5. package/README.md +259 -0
  6. package/dist/cortex-mcp.mjs +3153 -0
  7. package/dist/cortex.mjs +8213 -0
  8. package/icon.png +0 -0
  9. package/logo.png +0 -0
  10. package/package.json +86 -0
  11. package/packages/cli/dist/commands/config.d.ts +4 -0
  12. package/packages/cli/dist/commands/config.d.ts.map +1 -0
  13. package/packages/cli/dist/commands/config.js +419 -0
  14. package/packages/cli/dist/commands/config.js.map +1 -0
  15. package/packages/cli/dist/commands/contradictions.d.ts +3 -0
  16. package/packages/cli/dist/commands/contradictions.d.ts.map +1 -0
  17. package/packages/cli/dist/commands/contradictions.js +74 -0
  18. package/packages/cli/dist/commands/contradictions.js.map +1 -0
  19. package/packages/cli/dist/commands/costs.d.ts +3 -0
  20. package/packages/cli/dist/commands/costs.d.ts.map +1 -0
  21. package/packages/cli/dist/commands/costs.js +168 -0
  22. package/packages/cli/dist/commands/costs.js.map +1 -0
  23. package/packages/cli/dist/commands/db.d.ts +3 -0
  24. package/packages/cli/dist/commands/db.d.ts.map +1 -0
  25. package/packages/cli/dist/commands/db.js +139 -0
  26. package/packages/cli/dist/commands/db.js.map +1 -0
  27. package/packages/cli/dist/commands/find.d.ts +3 -0
  28. package/packages/cli/dist/commands/find.d.ts.map +1 -0
  29. package/packages/cli/dist/commands/find.js +139 -0
  30. package/packages/cli/dist/commands/find.js.map +1 -0
  31. package/packages/cli/dist/commands/ingest.d.ts +3 -0
  32. package/packages/cli/dist/commands/ingest.d.ts.map +1 -0
  33. package/packages/cli/dist/commands/ingest.js +179 -0
  34. package/packages/cli/dist/commands/ingest.js.map +1 -0
  35. package/packages/cli/dist/commands/init.d.ts +3 -0
  36. package/packages/cli/dist/commands/init.d.ts.map +1 -0
  37. package/packages/cli/dist/commands/init.js +285 -0
  38. package/packages/cli/dist/commands/init.js.map +1 -0
  39. package/packages/cli/dist/commands/mcp.d.ts +3 -0
  40. package/packages/cli/dist/commands/mcp.d.ts.map +1 -0
  41. package/packages/cli/dist/commands/mcp.js +65 -0
  42. package/packages/cli/dist/commands/mcp.js.map +1 -0
  43. package/packages/cli/dist/commands/models.d.ts +3 -0
  44. package/packages/cli/dist/commands/models.d.ts.map +1 -0
  45. package/packages/cli/dist/commands/models.js +245 -0
  46. package/packages/cli/dist/commands/models.js.map +1 -0
  47. package/packages/cli/dist/commands/privacy.d.ts +3 -0
  48. package/packages/cli/dist/commands/privacy.d.ts.map +1 -0
  49. package/packages/cli/dist/commands/privacy.js +140 -0
  50. package/packages/cli/dist/commands/privacy.js.map +1 -0
  51. package/packages/cli/dist/commands/projects.d.ts +3 -0
  52. package/packages/cli/dist/commands/projects.d.ts.map +1 -0
  53. package/packages/cli/dist/commands/projects.js +142 -0
  54. package/packages/cli/dist/commands/projects.js.map +1 -0
  55. package/packages/cli/dist/commands/query.d.ts +3 -0
  56. package/packages/cli/dist/commands/query.d.ts.map +1 -0
  57. package/packages/cli/dist/commands/query.js +153 -0
  58. package/packages/cli/dist/commands/query.js.map +1 -0
  59. package/packages/cli/dist/commands/report.d.ts +3 -0
  60. package/packages/cli/dist/commands/report.d.ts.map +1 -0
  61. package/packages/cli/dist/commands/report.js +144 -0
  62. package/packages/cli/dist/commands/report.js.map +1 -0
  63. package/packages/cli/dist/commands/resolve.d.ts +3 -0
  64. package/packages/cli/dist/commands/resolve.d.ts.map +1 -0
  65. package/packages/cli/dist/commands/resolve.js +119 -0
  66. package/packages/cli/dist/commands/resolve.js.map +1 -0
  67. package/packages/cli/dist/commands/serve.d.ts +3 -0
  68. package/packages/cli/dist/commands/serve.d.ts.map +1 -0
  69. package/packages/cli/dist/commands/serve.js +108 -0
  70. package/packages/cli/dist/commands/serve.js.map +1 -0
  71. package/packages/cli/dist/commands/status.d.ts +3 -0
  72. package/packages/cli/dist/commands/status.d.ts.map +1 -0
  73. package/packages/cli/dist/commands/status.js +230 -0
  74. package/packages/cli/dist/commands/status.js.map +1 -0
  75. package/packages/cli/dist/commands/stop.d.ts +5 -0
  76. package/packages/cli/dist/commands/stop.d.ts.map +1 -0
  77. package/packages/cli/dist/commands/stop.js +80 -0
  78. package/packages/cli/dist/commands/stop.js.map +1 -0
  79. package/packages/cli/dist/commands/watch.d.ts +3 -0
  80. package/packages/cli/dist/commands/watch.d.ts.map +1 -0
  81. package/packages/cli/dist/commands/watch.js +235 -0
  82. package/packages/cli/dist/commands/watch.js.map +1 -0
  83. package/packages/cli/dist/index.d.ts +9 -0
  84. package/packages/cli/dist/index.d.ts.map +1 -0
  85. package/packages/cli/dist/index.js +68 -0
  86. package/packages/cli/dist/index.js.map +1 -0
  87. package/packages/cli/package.json +37 -0
  88. package/packages/cli/tsconfig.json +16 -0
  89. package/packages/core/dist/config/loader.d.ts +11 -0
  90. package/packages/core/dist/config/loader.d.ts.map +1 -0
  91. package/packages/core/dist/config/loader.js +133 -0
  92. package/packages/core/dist/config/loader.js.map +1 -0
  93. package/packages/core/dist/config/project-registry.d.ts +71 -0
  94. package/packages/core/dist/config/project-registry.d.ts.map +1 -0
  95. package/packages/core/dist/config/project-registry.js +89 -0
  96. package/packages/core/dist/config/project-registry.js.map +1 -0
  97. package/packages/core/dist/config/schema.d.ts +909 -0
  98. package/packages/core/dist/config/schema.d.ts.map +1 -0
  99. package/packages/core/dist/config/schema.js +125 -0
  100. package/packages/core/dist/config/schema.js.map +1 -0
  101. package/packages/core/dist/errors/cortex-error.d.ts +58 -0
  102. package/packages/core/dist/errors/cortex-error.d.ts.map +1 -0
  103. package/packages/core/dist/errors/cortex-error.js +68 -0
  104. package/packages/core/dist/errors/cortex-error.js.map +1 -0
  105. package/packages/core/dist/events/event-bus.d.ts +10 -0
  106. package/packages/core/dist/events/event-bus.d.ts.map +1 -0
  107. package/packages/core/dist/events/event-bus.js +42 -0
  108. package/packages/core/dist/events/event-bus.js.map +1 -0
  109. package/packages/core/dist/index.d.ts +8 -0
  110. package/packages/core/dist/index.d.ts.map +1 -0
  111. package/packages/core/dist/index.js +22 -0
  112. package/packages/core/dist/index.js.map +1 -0
  113. package/packages/core/dist/logger.d.ts +16 -0
  114. package/packages/core/dist/logger.d.ts.map +1 -0
  115. package/packages/core/dist/logger.js +57 -0
  116. package/packages/core/dist/logger.js.map +1 -0
  117. package/packages/core/dist/types/config.d.ts +107 -0
  118. package/packages/core/dist/types/config.d.ts.map +1 -0
  119. package/packages/core/dist/types/config.js +2 -0
  120. package/packages/core/dist/types/config.js.map +1 -0
  121. package/packages/core/dist/types/entity.d.ts +35 -0
  122. package/packages/core/dist/types/entity.d.ts.map +1 -0
  123. package/packages/core/dist/types/entity.js +2 -0
  124. package/packages/core/dist/types/entity.js.map +1 -0
  125. package/packages/core/dist/types/events.d.ts +76 -0
  126. package/packages/core/dist/types/events.d.ts.map +1 -0
  127. package/packages/core/dist/types/events.js +2 -0
  128. package/packages/core/dist/types/events.js.map +1 -0
  129. package/packages/core/dist/types/file.d.ts +15 -0
  130. package/packages/core/dist/types/file.d.ts.map +1 -0
  131. package/packages/core/dist/types/file.js +2 -0
  132. package/packages/core/dist/types/file.js.map +1 -0
  133. package/packages/core/dist/types/graph.d.ts +93 -0
  134. package/packages/core/dist/types/graph.d.ts.map +1 -0
  135. package/packages/core/dist/types/graph.js +2 -0
  136. package/packages/core/dist/types/graph.js.map +1 -0
  137. package/packages/core/dist/types/index.d.ts +10 -0
  138. package/packages/core/dist/types/index.d.ts.map +1 -0
  139. package/packages/core/dist/types/index.js +2 -0
  140. package/packages/core/dist/types/index.js.map +1 -0
  141. package/packages/core/dist/types/llm.d.ts +95 -0
  142. package/packages/core/dist/types/llm.d.ts.map +1 -0
  143. package/packages/core/dist/types/llm.js +10 -0
  144. package/packages/core/dist/types/llm.js.map +1 -0
  145. package/packages/core/dist/types/project.d.ts +11 -0
  146. package/packages/core/dist/types/project.d.ts.map +1 -0
  147. package/packages/core/dist/types/project.js +2 -0
  148. package/packages/core/dist/types/project.js.map +1 -0
  149. package/packages/core/dist/types/relationship.d.ts +26 -0
  150. package/packages/core/dist/types/relationship.d.ts.map +1 -0
  151. package/packages/core/dist/types/relationship.js +2 -0
  152. package/packages/core/dist/types/relationship.js.map +1 -0
  153. package/packages/core/package.json +22 -0
  154. package/packages/core/tsconfig.json +9 -0
  155. package/packages/graph/dist/index.d.ts +4 -0
  156. package/packages/graph/dist/index.d.ts.map +1 -0
  157. package/packages/graph/dist/index.js +4 -0
  158. package/packages/graph/dist/index.js.map +1 -0
  159. package/packages/graph/dist/migrations/001-initial.d.ts +4 -0
  160. package/packages/graph/dist/migrations/001-initial.d.ts.map +1 -0
  161. package/packages/graph/dist/migrations/001-initial.js +134 -0
  162. package/packages/graph/dist/migrations/001-initial.js.map +1 -0
  163. package/packages/graph/dist/query-engine.d.ts +35 -0
  164. package/packages/graph/dist/query-engine.d.ts.map +1 -0
  165. package/packages/graph/dist/query-engine.js +185 -0
  166. package/packages/graph/dist/query-engine.js.map +1 -0
  167. package/packages/graph/dist/sqlite-store.d.ts +125 -0
  168. package/packages/graph/dist/sqlite-store.d.ts.map +1 -0
  169. package/packages/graph/dist/sqlite-store.js +632 -0
  170. package/packages/graph/dist/sqlite-store.js.map +1 -0
  171. package/packages/graph/dist/vector-store.d.ts +27 -0
  172. package/packages/graph/dist/vector-store.d.ts.map +1 -0
  173. package/packages/graph/dist/vector-store.js +85 -0
  174. package/packages/graph/dist/vector-store.js.map +1 -0
  175. package/packages/graph/package.json +27 -0
  176. package/packages/graph/tsconfig.json +12 -0
  177. package/packages/ingest/dist/chunker.d.ts +21 -0
  178. package/packages/ingest/dist/chunker.d.ts.map +1 -0
  179. package/packages/ingest/dist/chunker.js +118 -0
  180. package/packages/ingest/dist/chunker.js.map +1 -0
  181. package/packages/ingest/dist/index.d.ts +11 -0
  182. package/packages/ingest/dist/index.d.ts.map +1 -0
  183. package/packages/ingest/dist/index.js +14 -0
  184. package/packages/ingest/dist/index.js.map +1 -0
  185. package/packages/ingest/dist/parsers/conversation.d.ts +10 -0
  186. package/packages/ingest/dist/parsers/conversation.d.ts.map +1 -0
  187. package/packages/ingest/dist/parsers/conversation.js +150 -0
  188. package/packages/ingest/dist/parsers/conversation.js.map +1 -0
  189. package/packages/ingest/dist/parsers/index.d.ts +11 -0
  190. package/packages/ingest/dist/parsers/index.d.ts.map +1 -0
  191. package/packages/ingest/dist/parsers/index.js +42 -0
  192. package/packages/ingest/dist/parsers/index.js.map +1 -0
  193. package/packages/ingest/dist/parsers/json-parser.d.ts +6 -0
  194. package/packages/ingest/dist/parsers/json-parser.d.ts.map +1 -0
  195. package/packages/ingest/dist/parsers/json-parser.js +114 -0
  196. package/packages/ingest/dist/parsers/json-parser.js.map +1 -0
  197. package/packages/ingest/dist/parsers/markdown.d.ts +6 -0
  198. package/packages/ingest/dist/parsers/markdown.d.ts.map +1 -0
  199. package/packages/ingest/dist/parsers/markdown.js +116 -0
  200. package/packages/ingest/dist/parsers/markdown.js.map +1 -0
  201. package/packages/ingest/dist/parsers/types.d.ts +18 -0
  202. package/packages/ingest/dist/parsers/types.d.ts.map +1 -0
  203. package/packages/ingest/dist/parsers/types.js +2 -0
  204. package/packages/ingest/dist/parsers/types.js.map +1 -0
  205. package/packages/ingest/dist/parsers/typescript.d.ts +11 -0
  206. package/packages/ingest/dist/parsers/typescript.d.ts.map +1 -0
  207. package/packages/ingest/dist/parsers/typescript.js +197 -0
  208. package/packages/ingest/dist/parsers/typescript.js.map +1 -0
  209. package/packages/ingest/dist/parsers/yaml-parser.d.ts +6 -0
  210. package/packages/ingest/dist/parsers/yaml-parser.d.ts.map +1 -0
  211. package/packages/ingest/dist/parsers/yaml-parser.js +52 -0
  212. package/packages/ingest/dist/parsers/yaml-parser.js.map +1 -0
  213. package/packages/ingest/dist/pipeline.d.ts +30 -0
  214. package/packages/ingest/dist/pipeline.d.ts.map +1 -0
  215. package/packages/ingest/dist/pipeline.js +311 -0
  216. package/packages/ingest/dist/pipeline.js.map +1 -0
  217. package/packages/ingest/dist/post-ingest.d.ts +25 -0
  218. package/packages/ingest/dist/post-ingest.d.ts.map +1 -0
  219. package/packages/ingest/dist/post-ingest.js +171 -0
  220. package/packages/ingest/dist/post-ingest.js.map +1 -0
  221. package/packages/ingest/dist/watcher.d.ts +26 -0
  222. package/packages/ingest/dist/watcher.d.ts.map +1 -0
  223. package/packages/ingest/dist/watcher.js +142 -0
  224. package/packages/ingest/dist/watcher.js.map +1 -0
  225. package/packages/ingest/package.json +30 -0
  226. package/packages/ingest/tsconfig.json +14 -0
  227. package/packages/llm/dist/cache.d.ts +26 -0
  228. package/packages/llm/dist/cache.d.ts.map +1 -0
  229. package/packages/llm/dist/cache.js +60 -0
  230. package/packages/llm/dist/cache.js.map +1 -0
  231. package/packages/llm/dist/index.d.ts +15 -0
  232. package/packages/llm/dist/index.d.ts.map +1 -0
  233. package/packages/llm/dist/index.js +19 -0
  234. package/packages/llm/dist/index.js.map +1 -0
  235. package/packages/llm/dist/output-parser.d.ts +4 -0
  236. package/packages/llm/dist/output-parser.d.ts.map +1 -0
  237. package/packages/llm/dist/output-parser.js +207 -0
  238. package/packages/llm/dist/output-parser.js.map +1 -0
  239. package/packages/llm/dist/prompts/context-ranking.d.ts +33 -0
  240. package/packages/llm/dist/prompts/context-ranking.d.ts.map +1 -0
  241. package/packages/llm/dist/prompts/context-ranking.js +30 -0
  242. package/packages/llm/dist/prompts/context-ranking.js.map +1 -0
  243. package/packages/llm/dist/prompts/contradiction-detection.d.ts +46 -0
  244. package/packages/llm/dist/prompts/contradiction-detection.d.ts.map +1 -0
  245. package/packages/llm/dist/prompts/contradiction-detection.js +45 -0
  246. package/packages/llm/dist/prompts/contradiction-detection.js.map +1 -0
  247. package/packages/llm/dist/prompts/conversational-query.d.ts +29 -0
  248. package/packages/llm/dist/prompts/conversational-query.d.ts.map +1 -0
  249. package/packages/llm/dist/prompts/conversational-query.js +34 -0
  250. package/packages/llm/dist/prompts/conversational-query.js.map +1 -0
  251. package/packages/llm/dist/prompts/entity-extraction.d.ts +67 -0
  252. package/packages/llm/dist/prompts/entity-extraction.d.ts.map +1 -0
  253. package/packages/llm/dist/prompts/entity-extraction.js +76 -0
  254. package/packages/llm/dist/prompts/entity-extraction.js.map +1 -0
  255. package/packages/llm/dist/prompts/follow-up-generation.d.ts +25 -0
  256. package/packages/llm/dist/prompts/follow-up-generation.d.ts.map +1 -0
  257. package/packages/llm/dist/prompts/follow-up-generation.js +25 -0
  258. package/packages/llm/dist/prompts/follow-up-generation.js.map +1 -0
  259. package/packages/llm/dist/prompts/merge-detection.d.ts +41 -0
  260. package/packages/llm/dist/prompts/merge-detection.d.ts.map +1 -0
  261. package/packages/llm/dist/prompts/merge-detection.js +31 -0
  262. package/packages/llm/dist/prompts/merge-detection.js.map +1 -0
  263. package/packages/llm/dist/prompts/relationship-inference.d.ts +60 -0
  264. package/packages/llm/dist/prompts/relationship-inference.d.ts.map +1 -0
  265. package/packages/llm/dist/prompts/relationship-inference.js +66 -0
  266. package/packages/llm/dist/prompts/relationship-inference.js.map +1 -0
  267. package/packages/llm/dist/providers/anthropic.d.ts +39 -0
  268. package/packages/llm/dist/providers/anthropic.d.ts.map +1 -0
  269. package/packages/llm/dist/providers/anthropic.js +157 -0
  270. package/packages/llm/dist/providers/anthropic.js.map +1 -0
  271. package/packages/llm/dist/providers/ollama.d.ts +52 -0
  272. package/packages/llm/dist/providers/ollama.d.ts.map +1 -0
  273. package/packages/llm/dist/providers/ollama.js +297 -0
  274. package/packages/llm/dist/providers/ollama.js.map +1 -0
  275. package/packages/llm/dist/providers/openai-compatible.d.ts +40 -0
  276. package/packages/llm/dist/providers/openai-compatible.d.ts.map +1 -0
  277. package/packages/llm/dist/providers/openai-compatible.js +164 -0
  278. package/packages/llm/dist/providers/openai-compatible.js.map +1 -0
  279. package/packages/llm/dist/router.d.ts +87 -0
  280. package/packages/llm/dist/router.d.ts.map +1 -0
  281. package/packages/llm/dist/router.js +399 -0
  282. package/packages/llm/dist/router.js.map +1 -0
  283. package/packages/llm/dist/token-tracker.d.ts +24 -0
  284. package/packages/llm/dist/token-tracker.d.ts.map +1 -0
  285. package/packages/llm/dist/token-tracker.js +114 -0
  286. package/packages/llm/dist/token-tracker.js.map +1 -0
  287. package/packages/llm/package.json +25 -0
  288. package/packages/llm/tsconfig.json +12 -0
  289. package/packages/mcp/dist/index.d.ts +10 -0
  290. package/packages/mcp/dist/index.d.ts.map +1 -0
  291. package/packages/mcp/dist/index.js +33 -0
  292. package/packages/mcp/dist/index.js.map +1 -0
  293. package/packages/mcp/dist/server.d.ts +5 -0
  294. package/packages/mcp/dist/server.d.ts.map +1 -0
  295. package/packages/mcp/dist/server.js +87 -0
  296. package/packages/mcp/dist/server.js.map +1 -0
  297. package/packages/mcp/dist/store-factory.d.ts +8 -0
  298. package/packages/mcp/dist/store-factory.d.ts.map +1 -0
  299. package/packages/mcp/dist/store-factory.js +24 -0
  300. package/packages/mcp/dist/store-factory.js.map +1 -0
  301. package/packages/mcp/dist/tools/contradictions.d.ts +14 -0
  302. package/packages/mcp/dist/tools/contradictions.d.ts.map +1 -0
  303. package/packages/mcp/dist/tools/contradictions.js +33 -0
  304. package/packages/mcp/dist/tools/contradictions.js.map +1 -0
  305. package/packages/mcp/dist/tools/find.d.ts +37 -0
  306. package/packages/mcp/dist/tools/find.d.ts.map +1 -0
  307. package/packages/mcp/dist/tools/find.js +52 -0
  308. package/packages/mcp/dist/tools/find.js.map +1 -0
  309. package/packages/mcp/dist/tools/projects.d.ts +16 -0
  310. package/packages/mcp/dist/tools/projects.d.ts.map +1 -0
  311. package/packages/mcp/dist/tools/projects.js +17 -0
  312. package/packages/mcp/dist/tools/projects.js.map +1 -0
  313. package/packages/mcp/dist/tools/query.d.ts +20 -0
  314. package/packages/mcp/dist/tools/query.d.ts.map +1 -0
  315. package/packages/mcp/dist/tools/query.js +65 -0
  316. package/packages/mcp/dist/tools/query.js.map +1 -0
  317. package/packages/mcp/dist/tools/status.d.ts +15 -0
  318. package/packages/mcp/dist/tools/status.d.ts.map +1 -0
  319. package/packages/mcp/dist/tools/status.js +17 -0
  320. package/packages/mcp/dist/tools/status.js.map +1 -0
  321. package/packages/mcp/package.json +27 -0
  322. package/packages/mcp/tsconfig.json +14 -0
  323. package/packages/server/dist/index.d.ts +17 -0
  324. package/packages/server/dist/index.d.ts.map +1 -0
  325. package/packages/server/dist/index.js +170 -0
  326. package/packages/server/dist/index.js.map +1 -0
  327. package/packages/server/dist/middleware/auth.d.ts +9 -0
  328. package/packages/server/dist/middleware/auth.d.ts.map +1 -0
  329. package/packages/server/dist/middleware/auth.js +94 -0
  330. package/packages/server/dist/middleware/auth.js.map +1 -0
  331. package/packages/server/dist/routes/contradictions.d.ts +4 -0
  332. package/packages/server/dist/routes/contradictions.d.ts.map +1 -0
  333. package/packages/server/dist/routes/contradictions.js +63 -0
  334. package/packages/server/dist/routes/contradictions.js.map +1 -0
  335. package/packages/server/dist/routes/entities.d.ts +4 -0
  336. package/packages/server/dist/routes/entities.d.ts.map +1 -0
  337. package/packages/server/dist/routes/entities.js +61 -0
  338. package/packages/server/dist/routes/entities.js.map +1 -0
  339. package/packages/server/dist/routes/projects.d.ts +4 -0
  340. package/packages/server/dist/routes/projects.d.ts.map +1 -0
  341. package/packages/server/dist/routes/projects.js +35 -0
  342. package/packages/server/dist/routes/projects.js.map +1 -0
  343. package/packages/server/dist/routes/query.d.ts +4 -0
  344. package/packages/server/dist/routes/query.d.ts.map +1 -0
  345. package/packages/server/dist/routes/query.js +93 -0
  346. package/packages/server/dist/routes/query.js.map +1 -0
  347. package/packages/server/dist/routes/relationships.d.ts +4 -0
  348. package/packages/server/dist/routes/relationships.d.ts.map +1 -0
  349. package/packages/server/dist/routes/relationships.js +52 -0
  350. package/packages/server/dist/routes/relationships.js.map +1 -0
  351. package/packages/server/dist/routes/status.d.ts +4 -0
  352. package/packages/server/dist/routes/status.d.ts.map +1 -0
  353. package/packages/server/dist/routes/status.js +85 -0
  354. package/packages/server/dist/routes/status.js.map +1 -0
  355. package/packages/server/dist/ws/event-relay.d.ts +10 -0
  356. package/packages/server/dist/ws/event-relay.d.ts.map +1 -0
  357. package/packages/server/dist/ws/event-relay.js +83 -0
  358. package/packages/server/dist/ws/event-relay.js.map +1 -0
  359. package/packages/server/package.json +32 -0
  360. package/packages/server/tsconfig.json +15 -0
  361. package/packages/web/dist/assets/index-Bxjfq4I0.css +1 -0
  362. package/packages/web/dist/assets/index-MqwNS5FD.js +248 -0
  363. package/packages/web/dist/assets/index-MqwNS5FD.js.map +1 -0
  364. package/packages/web/dist/cortex-icon.svg +9 -0
  365. package/packages/web/dist/icon.png +0 -0
  366. package/packages/web/dist/index.html +14 -0
  367. package/packages/web/dist/logo.png +0 -0
  368. package/packages/web/index.html +13 -0
  369. package/packages/web/package.json +34 -0
  370. package/packages/web/public/cortex-icon.svg +9 -0
  371. package/packages/web/public/icon.png +0 -0
  372. package/packages/web/public/logo.png +0 -0
  373. package/packages/web/tsconfig.json +22 -0
  374. package/packages/web/vite.config.ts +20 -0
  375. package/tsconfig.base.json +18 -0
  376. package/tsconfig.json +12 -0
  377. package/vitest.config.ts +14 -0
@@ -0,0 +1,17 @@
1
+ export async function handleListProjects(store) {
2
+ const projects = await store.listProjects();
3
+ return {
4
+ projects: projects.map((p) => ({
5
+ id: p.id,
6
+ name: p.name,
7
+ rootPath: p.rootPath,
8
+ privacyLevel: p.privacyLevel,
9
+ fileCount: p.fileCount,
10
+ entityCount: p.entityCount,
11
+ lastIngestedAt: p.lastIngestedAt,
12
+ createdAt: p.createdAt,
13
+ })),
14
+ total: projects.length,
15
+ };
16
+ }
17
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAkB;IACzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;IAC5C,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC;QACH,KAAK,EAAE,QAAQ,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { QueryEngine } from '@cortex/graph';
2
+ import type { Router } from '@cortex/llm';
3
+ export interface QueryCortexInput {
4
+ question: string;
5
+ projectId?: string;
6
+ }
7
+ export interface QueryCortexResult {
8
+ answer: string;
9
+ citations: Array<{
10
+ entityId: string;
11
+ entityType: string;
12
+ entityName: string;
13
+ sourceFile: string;
14
+ }>;
15
+ entityCount: number;
16
+ provider: string;
17
+ model: string;
18
+ }
19
+ export declare function handleQueryCortex(input: QueryCortexInput, queryEngine: QueryEngine, router: Router, store: import('@cortex/graph').SQLiteStore): Promise<QueryCortexResult>;
20
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,eAAe,EAAE,WAAW,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAkE5B"}
@@ -0,0 +1,65 @@
1
+ import { LLMTask } from '@cortex/core';
2
+ import { conversationalQueryPrompt } from '@cortex/llm';
3
+ export async function handleQueryCortex(input, queryEngine, router, store) {
4
+ const [context, graphStats, projects] = await Promise.all([
5
+ queryEngine.assembleContext(input.question, undefined, input.projectId),
6
+ store.getStats(),
7
+ store.listProjects(),
8
+ ]);
9
+ const graphSummary = [
10
+ `${graphStats.entityCount} entities, ${graphStats.relationshipCount} relationships, ${graphStats.fileCount} files indexed`,
11
+ projects.length > 0
12
+ ? `Projects: ${projects.map((p) => `${p.name} (${p.rootPath})`).join(', ')}`
13
+ : 'No projects configured.',
14
+ projects.some((p) => p.lastIngestedAt)
15
+ ? `Last ingested: ${projects.map((p) => p.lastIngestedAt).filter(Boolean).sort().pop()}`
16
+ : '',
17
+ ].filter(Boolean).join('\n');
18
+ if (context.entities.length === 0 && graphStats.entityCount === 0) {
19
+ return {
20
+ answer: 'No entities found. Make sure `cortex watch` has been run on your project files.',
21
+ citations: [],
22
+ entityCount: 0,
23
+ provider: 'none',
24
+ model: 'none',
25
+ };
26
+ }
27
+ const contextEntities = context.entities.map((e) => ({
28
+ id: e.id,
29
+ type: e.type,
30
+ name: e.name,
31
+ content: e.content,
32
+ sourceFile: e.sourceFile,
33
+ createdAt: e.createdAt,
34
+ relationships: context.relationships
35
+ .filter((r) => r.sourceEntityId === e.id)
36
+ .map((r) => ({ type: r.type, targetEntityId: r.targetEntityId })),
37
+ }));
38
+ const result = await router.complete({
39
+ systemPrompt: conversationalQueryPrompt.systemPrompt,
40
+ userPrompt: conversationalQueryPrompt.buildUserPrompt({
41
+ contextEntities,
42
+ userQuery: input.question,
43
+ graphSummary,
44
+ }),
45
+ promptId: conversationalQueryPrompt.PROMPT_ID,
46
+ promptVersion: conversationalQueryPrompt.PROMPT_VERSION,
47
+ task: LLMTask.CONVERSATIONAL_QUERY,
48
+ modelPreference: conversationalQueryPrompt.config.model,
49
+ temperature: conversationalQueryPrompt.config.temperature,
50
+ maxTokens: conversationalQueryPrompt.config.maxTokens,
51
+ });
52
+ return {
53
+ answer: result.content,
54
+ citations: context.entities.map((e) => ({
55
+ entityId: e.id,
56
+ entityType: e.type,
57
+ entityName: e.name,
58
+ sourceFile: e.sourceFile,
59
+ })),
60
+ entityCount: context.entities.length,
61
+ provider: result.provider,
62
+ model: result.model,
63
+ };
64
+ }
65
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SQLiteStore } from '@cortex/graph';
2
+ export interface GetStatusResult {
3
+ graph: {
4
+ entityCount: number;
5
+ relationshipCount: number;
6
+ fileCount: number;
7
+ projectCount: number;
8
+ contradictionCount: number;
9
+ dbSizeBytes: number;
10
+ };
11
+ ready: boolean;
12
+ hint?: string;
13
+ }
14
+ export declare function handleGetStatus(store: SQLiteStore): Promise<GetStatusResult>;
15
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAelF"}
@@ -0,0 +1,17 @@
1
+ export async function handleGetStatus(store) {
2
+ const stats = await store.getStats();
3
+ const ready = stats.entityCount > 0;
4
+ return {
5
+ graph: {
6
+ entityCount: stats.entityCount,
7
+ relationshipCount: stats.relationshipCount,
8
+ fileCount: stats.fileCount,
9
+ projectCount: stats.projectCount,
10
+ contradictionCount: stats.contradictionCount,
11
+ dbSizeBytes: stats.dbSizeBytes,
12
+ },
13
+ ready,
14
+ ...(!ready && { hint: 'No entities yet. Run `cortex watch` in your project directory to ingest files.' }),
15
+ };
16
+ }
17
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAkB;IACtD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;IACpC,OAAO;QACL,KAAK,EAAE;YACL,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B;QACD,KAAK;QACL,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,gFAAgF,EAAE,CAAC;KAC1G,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@cortex/mcp",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "cortex-mcp": "dist/index.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsc --build",
19
+ "dev": "tsc --build --watch"
20
+ },
21
+ "dependencies": {
22
+ "@cortex/core": "*",
23
+ "@cortex/graph": "*",
24
+ "@cortex/llm": "*",
25
+ "@modelcontextprotocol/sdk": "^1.17.0"
26
+ }
27
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src",
6
+ "composite": true
7
+ },
8
+ "include": ["src/**/*.ts"],
9
+ "references": [
10
+ { "path": "../core" },
11
+ { "path": "../graph" },
12
+ { "path": "../llm" }
13
+ ]
14
+ }
@@ -0,0 +1,17 @@
1
+ import { type CortexConfig } from '@cortex/core';
2
+ import { SQLiteStore, QueryEngine } from '@cortex/graph';
3
+ import { Router as LLMRouter } from '@cortex/llm';
4
+ export interface ServerOptions {
5
+ config: CortexConfig;
6
+ port?: number;
7
+ host?: string;
8
+ enableWatch?: boolean;
9
+ webDistPath?: string;
10
+ }
11
+ export interface ServerBundle {
12
+ store: SQLiteStore;
13
+ queryEngine: QueryEngine;
14
+ router: LLMRouter;
15
+ }
16
+ export declare function startServer(options: ServerOptions): Promise<void>;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAYlD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;CACnB;AAUD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiKvE"}
@@ -0,0 +1,170 @@
1
+ import express from 'express';
2
+ import { createServer } from 'node:http';
3
+ import { resolve } from 'node:path';
4
+ import cors from 'cors';
5
+ import { createLogger } from '@cortex/core';
6
+ import { SQLiteStore, QueryEngine, VectorStore } from '@cortex/graph';
7
+ import { Router as LLMRouter } from '@cortex/llm';
8
+ import { createEntityRoutes } from './routes/entities.js';
9
+ import { createRelationshipRoutes } from './routes/relationships.js';
10
+ import { createProjectRoutes } from './routes/projects.js';
11
+ import { createQueryRoutes } from './routes/query.js';
12
+ import { createContradictionRoutes } from './routes/contradictions.js';
13
+ import { createStatusRoutes } from './routes/status.js';
14
+ import { createEventRelay } from './ws/event-relay.js';
15
+ import { createAuthMiddleware } from './middleware/auth.js';
16
+ const logger = createLogger('server');
17
+ function createBundle(config) {
18
+ const store = new SQLiteStore({ dbPath: config.graph.dbPath, backupOnStartup: false });
19
+ const vectorStore = new VectorStore();
20
+ const queryEngine = new QueryEngine(store, vectorStore);
21
+ const router = new LLMRouter({ config });
22
+ return { store, queryEngine, router };
23
+ }
24
+ export async function startServer(options) {
25
+ const { config, enableWatch = true } = options;
26
+ const port = options.port ?? config.server?.port ?? 3710;
27
+ const host = options.host ?? config.server?.host ?? '127.0.0.1';
28
+ const bundle = createBundle(config);
29
+ const app = express();
30
+ const server = createServer(app);
31
+ // Middleware — CORS
32
+ const corsOrigin = config.server?.cors ?? [];
33
+ app.use(cors({
34
+ origin: (origin, callback) => {
35
+ // Allow requests with no origin (curl, server-to-server)
36
+ if (!origin)
37
+ return callback(null, true);
38
+ // Check explicit whitelist first
39
+ if (corsOrigin.includes(origin))
40
+ return callback(null, true);
41
+ // Allow any localhost/127.0.0.1 origin (any port)
42
+ if (/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) {
43
+ return callback(null, true);
44
+ }
45
+ callback(new Error('CORS not allowed'));
46
+ },
47
+ }));
48
+ app.use(express.json());
49
+ // Warn if non-localhost without auth
50
+ const isLocal = host === '127.0.0.1' || host === 'localhost' || host === '::1';
51
+ if (!isLocal && !config.server.auth.enabled) {
52
+ logger.warn('Server bound to non-localhost without auth enabled. ' +
53
+ 'Set server.auth.enabled=true and server.auth.token in config, ' +
54
+ 'or set CORTEX_SERVER_AUTH_TOKEN env var.');
55
+ }
56
+ // Simple in-memory rate limiter for LLM-backed endpoints
57
+ const rateLimitWindow = 60_000; // 1 minute
58
+ const rateLimitMax = 30; // max requests per window
59
+ const rateLimitMap = new Map();
60
+ const rateLimiter = (req, res, next) => {
61
+ const key = req.ip ?? 'unknown';
62
+ const now = Date.now();
63
+ const entry = rateLimitMap.get(key);
64
+ if (!entry || now >= entry.resetAt) {
65
+ rateLimitMap.set(key, { count: 1, resetAt: now + rateLimitWindow });
66
+ return next();
67
+ }
68
+ entry.count++;
69
+ if (entry.count > rateLimitMax) {
70
+ res.status(429).json({
71
+ success: false,
72
+ error: { code: 'RATE_LIMITED', message: 'Too many requests. Try again later.' },
73
+ });
74
+ return;
75
+ }
76
+ next();
77
+ };
78
+ // API routes
79
+ const api = express.Router();
80
+ api.use(createAuthMiddleware({ config, host }));
81
+ api.use('/entities', createEntityRoutes(bundle));
82
+ api.use('/relationships', createRelationshipRoutes(bundle));
83
+ api.use('/projects', createProjectRoutes(bundle));
84
+ api.use('/query', rateLimiter, createQueryRoutes(bundle));
85
+ api.use('/contradictions', createContradictionRoutes(bundle));
86
+ api.use('/', createStatusRoutes(bundle));
87
+ app.use('/api/v1', api);
88
+ // WebSocket event relay
89
+ const relay = createEventRelay(server, config, host);
90
+ logger.info('WebSocket relay attached', { path: '/ws' });
91
+ // Serve static web dashboard if available
92
+ if (options.webDistPath) {
93
+ const webDist = resolve(options.webDistPath);
94
+ app.use(express.static(webDist));
95
+ // SPA fallback: serve index.html for all non-API routes
96
+ app.get('*', (_req, res) => {
97
+ res.sendFile(resolve(webDist, 'index.html'));
98
+ });
99
+ logger.info('Serving web dashboard', { path: webDist });
100
+ }
101
+ // Start file watcher if enabled
102
+ if (enableWatch) {
103
+ try {
104
+ const { FileWatcher, IngestionPipeline } = await import('@cortex/ingest');
105
+ const projects = await bundle.store.listProjects();
106
+ if (projects.length > 0) {
107
+ for (const project of projects) {
108
+ const pipeline = new IngestionPipeline(bundle.router, bundle.store, {
109
+ projectId: project.id,
110
+ projectName: project.name,
111
+ projectRoot: project.rootPath,
112
+ maxFileSize: config.ingest.maxFileSize,
113
+ batchSize: config.ingest.batchSize,
114
+ projectPrivacyLevel: project.privacyLevel,
115
+ mergeConfidenceThreshold: 0.85,
116
+ });
117
+ const watcher = new FileWatcher({
118
+ dirs: [project.rootPath],
119
+ exclude: config.ingest.exclude,
120
+ fileTypes: config.ingest.fileTypes,
121
+ debounceMs: config.ingest.debounceMs,
122
+ followSymlinks: config.ingest.followSymlinks,
123
+ maxFileSize: config.ingest.maxFileSize,
124
+ ignoreInitial: true, // Don't re-ingest existing files on server start
125
+ });
126
+ watcher.onFileChange(async (filePath, changeType) => {
127
+ if (changeType === 'add' || changeType === 'change') {
128
+ await pipeline.ingestFile(filePath);
129
+ }
130
+ });
131
+ watcher.start();
132
+ logger.info('Watching project', { name: project.name, path: project.rootPath });
133
+ }
134
+ }
135
+ else {
136
+ logger.warn('No projects registered — file watcher not started. Run `cortex init` first.');
137
+ }
138
+ }
139
+ catch (err) {
140
+ logger.warn('File watcher failed to start', {
141
+ error: err instanceof Error ? err.message : String(err),
142
+ });
143
+ }
144
+ }
145
+ // Start listening
146
+ server.listen(port, host, () => {
147
+ logger.info(`Cortex server running at http://${host}:${port}`);
148
+ console.log(`\n Cortex server running at http://${host}:${port}`);
149
+ console.log(` API: http://${host}:${port}/api/v1`);
150
+ console.log(` WebSocket: ws://${host}:${port}/ws`);
151
+ if (options.webDistPath) {
152
+ console.log(` Dashboard: http://${host}:${port}/`);
153
+ }
154
+ if (enableWatch) {
155
+ console.log(` Watcher: active`);
156
+ }
157
+ console.log('');
158
+ });
159
+ // Graceful shutdown
160
+ const shutdown = () => {
161
+ logger.info('Shutting down...');
162
+ relay.close();
163
+ server.close();
164
+ bundle.store.close();
165
+ process.exit(0);
166
+ };
167
+ process.on('SIGINT', shutdown);
168
+ process.on('SIGTERM', shutdown);
169
+ }
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Request, Response, NextFunction } from 'express';
2
+ import { type CortexConfig } from '@cortex/core';
3
+ export interface AuthMiddlewareOptions {
4
+ config: CortexConfig;
5
+ host: string;
6
+ }
7
+ export declare function createAuthMiddleware(options: AuthMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => void;
8
+ export declare function validateWsToken(config: CortexConfig, host: string, url: string | undefined): boolean;
9
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,cAAc,CAAC;AAiB/D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAoE3D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAiBpG"}
@@ -0,0 +1,94 @@
1
+ import { timingSafeEqual } from 'node:crypto';
2
+ import { createLogger } from '@cortex/core';
3
+ const logger = createLogger('server:auth');
4
+ const LOCALHOST_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);
5
+ function isLocalhost(host) {
6
+ return LOCALHOST_HOSTS.has(host);
7
+ }
8
+ function safeEqual(a, b) {
9
+ const bufA = Buffer.from(a, 'utf-8');
10
+ const bufB = Buffer.from(b, 'utf-8');
11
+ if (bufA.length !== bufB.length)
12
+ return false;
13
+ return timingSafeEqual(bufA, bufB);
14
+ }
15
+ export function createAuthMiddleware(options) {
16
+ const { config, host } = options;
17
+ const authEnabled = config.server.auth.enabled;
18
+ const token = config.server.auth.token;
19
+ const isLocal = isLocalhost(host);
20
+ // Auth required if explicitly enabled OR if binding to non-localhost
21
+ const authRequired = authEnabled || !isLocal;
22
+ if (!authRequired) {
23
+ return (_req, _res, next) => next();
24
+ }
25
+ if (!token) {
26
+ logger.error('Auth is required but no token configured. All API requests will be rejected.');
27
+ return (_req, res, _next) => {
28
+ res.status(500).json({
29
+ success: false,
30
+ error: {
31
+ code: 'SERVER_AUTH_REQUIRED',
32
+ message: 'Server authentication is required but no token is configured.',
33
+ },
34
+ });
35
+ };
36
+ }
37
+ logger.info('API authentication enabled');
38
+ return (req, res, next) => {
39
+ const authHeader = req.headers.authorization;
40
+ if (!authHeader) {
41
+ res.status(401).json({
42
+ success: false,
43
+ error: {
44
+ code: 'SERVER_AUTH_REQUIRED',
45
+ message: 'Authentication required. Provide an Authorization: Bearer <token> header.',
46
+ },
47
+ });
48
+ return;
49
+ }
50
+ if (!authHeader.startsWith('Bearer ')) {
51
+ res.status(401).json({
52
+ success: false,
53
+ error: {
54
+ code: 'SERVER_AUTH_INVALID',
55
+ message: 'Invalid authorization format. Expected: Bearer <token>',
56
+ },
57
+ });
58
+ return;
59
+ }
60
+ const provided = authHeader.slice(7);
61
+ if (!safeEqual(provided, token)) {
62
+ res.status(401).json({
63
+ success: false,
64
+ error: {
65
+ code: 'SERVER_AUTH_INVALID',
66
+ message: 'Invalid authentication token.',
67
+ },
68
+ });
69
+ return;
70
+ }
71
+ next();
72
+ };
73
+ }
74
+ export function validateWsToken(config, host, url) {
75
+ const authEnabled = config.server.auth.enabled;
76
+ const token = config.server.auth.token;
77
+ const isLocal = isLocalhost(host);
78
+ const authRequired = authEnabled || !isLocal;
79
+ if (!authRequired)
80
+ return true;
81
+ if (!token)
82
+ return false;
83
+ try {
84
+ const params = new URL(url ?? '', 'http://localhost').searchParams;
85
+ const provided = params.get('token');
86
+ if (!provided)
87
+ return false;
88
+ return safeEqual(provided, token);
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import type { ServerBundle } from '../index.js';
3
+ export declare function createContradictionRoutes(bundle: ServerBundle): Router;
4
+ //# sourceMappingURL=contradictions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contradictions.d.ts","sourceRoot":"","sources":["../../src/routes/contradictions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiEtE"}
@@ -0,0 +1,63 @@
1
+ import { Router } from 'express';
2
+ import { createLogger } from '@cortex/core';
3
+ const logger = createLogger('server:contradictions');
4
+ export function createContradictionRoutes(bundle) {
5
+ const router = Router();
6
+ const { store } = bundle;
7
+ // GET /contradictions
8
+ router.get('/', async (req, res) => {
9
+ try {
10
+ const { status, severity, limit: rawLimit = '50' } = req.query;
11
+ const parsedLimit = Math.max(1, Math.min(Number(rawLimit) || 50, 500));
12
+ const contradictions = await store.findContradictions({
13
+ status: status,
14
+ limit: parsedLimit,
15
+ });
16
+ // Filter by severity client-side (store doesn't support severity filter)
17
+ const filtered = severity
18
+ ? contradictions.filter(c => c.severity === severity)
19
+ : contradictions;
20
+ // Enrich with entity names
21
+ const enriched = await Promise.all(filtered.map(async (c) => {
22
+ const entityA = await store.getEntity(c.entityIds[0]);
23
+ const entityB = await store.getEntity(c.entityIds[1]);
24
+ return {
25
+ ...c,
26
+ entityA: entityA ? { id: entityA.id, name: entityA.name, type: entityA.type, summary: entityA.summary } : null,
27
+ entityB: entityB ? { id: entityB.id, name: entityB.name, type: entityB.type, summary: entityB.summary } : null,
28
+ };
29
+ }));
30
+ res.json({ success: true, data: enriched, meta: { total: enriched.length } });
31
+ }
32
+ catch (err) {
33
+ logger.error('Request failed', { error: err instanceof Error ? err.message : String(err) });
34
+ res.status(500).json({ success: false, error: { code: 'SERVER_ERROR', message: 'Internal server error' } });
35
+ }
36
+ });
37
+ // POST /contradictions/:id/resolve
38
+ router.post('/:id/resolve', async (req, res) => {
39
+ try {
40
+ const { action } = req.body;
41
+ const validActions = ['supersede', 'dismiss', 'keep_old', 'both_valid'];
42
+ if (!action || !validActions.includes(action)) {
43
+ res.status(400).json({
44
+ success: false,
45
+ error: { code: 'BAD_REQUEST', message: `action must be one of: ${validActions.join(', ')}` },
46
+ });
47
+ return;
48
+ }
49
+ await store.updateContradiction(req.params.id, {
50
+ status: 'resolved',
51
+ resolvedAction: action,
52
+ resolvedAt: new Date().toISOString(),
53
+ });
54
+ res.json({ success: true, data: { id: req.params.id, status: 'resolved', action } });
55
+ }
56
+ catch (err) {
57
+ logger.error('Request failed', { error: err instanceof Error ? err.message : String(err) });
58
+ res.status(500).json({ success: false, error: { code: 'SERVER_ERROR', message: 'Internal server error' } });
59
+ }
60
+ });
61
+ return router;
62
+ }
63
+ //# sourceMappingURL=contradictions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contradictions.js","sourceRoot":"","sources":["../../src/routes/contradictions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import type { ServerBundle } from '../index.js';
3
+ export declare function createEntityRoutes(bundle: ServerBundle): Router;
4
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/routes/entities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA+D/D"}