@mcp-graph-workflow/mcp-graph 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/api/middleware/error-handler.d.ts +3 -0
  4. package/dist/api/middleware/error-handler.d.ts.map +1 -0
  5. package/dist/api/middleware/error-handler.js +48 -0
  6. package/dist/api/middleware/error-handler.js.map +1 -0
  7. package/dist/api/middleware/request-logger.d.ts +6 -0
  8. package/dist/api/middleware/request-logger.d.ts.map +1 -0
  9. package/dist/api/middleware/request-logger.js +19 -0
  10. package/dist/api/middleware/request-logger.js.map +1 -0
  11. package/dist/api/middleware/validate.d.ts +5 -0
  12. package/dist/api/middleware/validate.d.ts.map +1 -0
  13. package/dist/api/middleware/validate.js +23 -0
  14. package/dist/api/middleware/validate.js.map +1 -0
  15. package/dist/api/router.d.ts +11 -0
  16. package/dist/api/router.d.ts.map +1 -0
  17. package/dist/api/router.js +51 -0
  18. package/dist/api/router.js.map +1 -0
  19. package/dist/api/routes/benchmark.d.ts +4 -0
  20. package/dist/api/routes/benchmark.d.ts.map +1 -0
  21. package/dist/api/routes/benchmark.js +86 -0
  22. package/dist/api/routes/benchmark.js.map +1 -0
  23. package/dist/api/routes/capture.d.ts +3 -0
  24. package/dist/api/routes/capture.d.ts.map +1 -0
  25. package/dist/api/routes/capture.js +31 -0
  26. package/dist/api/routes/capture.js.map +1 -0
  27. package/dist/api/routes/context.d.ts +4 -0
  28. package/dist/api/routes/context.d.ts.map +1 -0
  29. package/dist/api/routes/context.js +25 -0
  30. package/dist/api/routes/context.js.map +1 -0
  31. package/dist/api/routes/docs-cache.d.ts +4 -0
  32. package/dist/api/routes/docs-cache.d.ts.map +1 -0
  33. package/dist/api/routes/docs-cache.js +79 -0
  34. package/dist/api/routes/docs-cache.js.map +1 -0
  35. package/dist/api/routes/edges.d.ts +4 -0
  36. package/dist/api/routes/edges.d.ts.map +1 -0
  37. package/dist/api/routes/edges.js +50 -0
  38. package/dist/api/routes/edges.js.map +1 -0
  39. package/dist/api/routes/events.d.ts +4 -0
  40. package/dist/api/routes/events.d.ts.map +1 -0
  41. package/dist/api/routes/events.js +37 -0
  42. package/dist/api/routes/events.js.map +1 -0
  43. package/dist/api/routes/gitnexus.d.ts +12 -0
  44. package/dist/api/routes/gitnexus.d.ts.map +1 -0
  45. package/dist/api/routes/gitnexus.js +162 -0
  46. package/dist/api/routes/gitnexus.js.map +1 -0
  47. package/dist/api/routes/graph.d.ts +4 -0
  48. package/dist/api/routes/graph.d.ts.map +1 -0
  49. package/dist/api/routes/graph.js +39 -0
  50. package/dist/api/routes/graph.js.map +1 -0
  51. package/dist/api/routes/import.d.ts +4 -0
  52. package/dist/api/routes/import.d.ts.map +1 -0
  53. package/dist/api/routes/import.js +92 -0
  54. package/dist/api/routes/import.js.map +1 -0
  55. package/dist/api/routes/insights.d.ts +4 -0
  56. package/dist/api/routes/insights.d.ts.map +1 -0
  57. package/dist/api/routes/insights.js +40 -0
  58. package/dist/api/routes/insights.js.map +1 -0
  59. package/dist/api/routes/integrations.d.ts +4 -0
  60. package/dist/api/routes/integrations.d.ts.map +1 -0
  61. package/dist/api/routes/integrations.js +85 -0
  62. package/dist/api/routes/integrations.js.map +1 -0
  63. package/dist/api/routes/knowledge.d.ts +8 -0
  64. package/dist/api/routes/knowledge.d.ts.map +1 -0
  65. package/dist/api/routes/knowledge.js +144 -0
  66. package/dist/api/routes/knowledge.js.map +1 -0
  67. package/dist/api/routes/nodes.d.ts +4 -0
  68. package/dist/api/routes/nodes.d.ts.map +1 -0
  69. package/dist/api/routes/nodes.js +123 -0
  70. package/dist/api/routes/nodes.js.map +1 -0
  71. package/dist/api/routes/project.d.ts +4 -0
  72. package/dist/api/routes/project.d.ts.map +1 -0
  73. package/dist/api/routes/project.js +70 -0
  74. package/dist/api/routes/project.js.map +1 -0
  75. package/dist/api/routes/rag.d.ts +8 -0
  76. package/dist/api/routes/rag.d.ts.map +1 -0
  77. package/dist/api/routes/rag.js +70 -0
  78. package/dist/api/routes/rag.js.map +1 -0
  79. package/dist/api/routes/search.d.ts +4 -0
  80. package/dist/api/routes/search.d.ts.map +1 -0
  81. package/dist/api/routes/search.js +25 -0
  82. package/dist/api/routes/search.js.map +1 -0
  83. package/dist/api/routes/skills.d.ts +3 -0
  84. package/dist/api/routes/skills.d.ts.map +1 -0
  85. package/dist/api/routes/skills.js +16 -0
  86. package/dist/api/routes/skills.js.map +1 -0
  87. package/dist/api/routes/stats.d.ts +4 -0
  88. package/dist/api/routes/stats.d.ts.map +1 -0
  89. package/dist/api/routes/stats.js +14 -0
  90. package/dist/api/routes/stats.js.map +1 -0
  91. package/dist/cli/commands/import-cmd.d.ts +3 -0
  92. package/dist/cli/commands/import-cmd.d.ts.map +1 -0
  93. package/dist/cli/commands/import-cmd.js +38 -0
  94. package/dist/cli/commands/import-cmd.js.map +1 -0
  95. package/dist/cli/commands/index-cmd.d.ts +3 -0
  96. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  97. package/dist/cli/commands/index-cmd.js +50 -0
  98. package/dist/cli/commands/index-cmd.js.map +1 -0
  99. package/dist/cli/commands/init.d.ts +3 -0
  100. package/dist/cli/commands/init.d.ts.map +1 -0
  101. package/dist/cli/commands/init.js +24 -0
  102. package/dist/cli/commands/init.js.map +1 -0
  103. package/dist/cli/commands/serve.d.ts +3 -0
  104. package/dist/cli/commands/serve.d.ts.map +1 -0
  105. package/dist/cli/commands/serve.js +18 -0
  106. package/dist/cli/commands/serve.js.map +1 -0
  107. package/dist/cli/commands/stats.d.ts +3 -0
  108. package/dist/cli/commands/stats.d.ts.map +1 -0
  109. package/dist/cli/commands/stats.js +39 -0
  110. package/dist/cli/commands/stats.js.map +1 -0
  111. package/dist/cli/index.d.ts +3 -0
  112. package/dist/cli/index.d.ts.map +1 -0
  113. package/dist/cli/index.js +30 -0
  114. package/dist/cli/index.js.map +1 -0
  115. package/dist/core/capture/content-extractor.d.ts +21 -0
  116. package/dist/core/capture/content-extractor.d.ts.map +1 -0
  117. package/dist/core/capture/content-extractor.js +74 -0
  118. package/dist/core/capture/content-extractor.js.map +1 -0
  119. package/dist/core/capture/validate-runner.d.ts +28 -0
  120. package/dist/core/capture/validate-runner.d.ts.map +1 -0
  121. package/dist/core/capture/validate-runner.js +42 -0
  122. package/dist/core/capture/validate-runner.js.map +1 -0
  123. package/dist/core/capture/web-capture.d.ts +20 -0
  124. package/dist/core/capture/web-capture.d.ts.map +1 -0
  125. package/dist/core/capture/web-capture.js +51 -0
  126. package/dist/core/capture/web-capture.js.map +1 -0
  127. package/dist/core/config/ai-memory-generator.d.ts +14 -0
  128. package/dist/core/config/ai-memory-generator.d.ts.map +1 -0
  129. package/dist/core/config/ai-memory-generator.js +130 -0
  130. package/dist/core/config/ai-memory-generator.js.map +1 -0
  131. package/dist/core/config/config-loader.d.ts +3 -0
  132. package/dist/core/config/config-loader.d.ts.map +1 -0
  133. package/dist/core/config/config-loader.js +48 -0
  134. package/dist/core/config/config-loader.js.map +1 -0
  135. package/dist/core/config/config-schema.d.ts +12 -0
  136. package/dist/core/config/config-schema.d.ts.map +1 -0
  137. package/dist/core/config/config-schema.js +13 -0
  138. package/dist/core/config/config-schema.js.map +1 -0
  139. package/dist/core/context/bm25-compressor.d.ts +21 -0
  140. package/dist/core/context/bm25-compressor.d.ts.map +1 -0
  141. package/dist/core/context/bm25-compressor.js +87 -0
  142. package/dist/core/context/bm25-compressor.js.map +1 -0
  143. package/dist/core/context/compact-context.d.ts +56 -0
  144. package/dist/core/context/compact-context.d.ts.map +1 -0
  145. package/dist/core/context/compact-context.js +170 -0
  146. package/dist/core/context/compact-context.js.map +1 -0
  147. package/dist/core/context/context-assembler.d.ts +43 -0
  148. package/dist/core/context/context-assembler.d.ts.map +1 -0
  149. package/dist/core/context/context-assembler.js +113 -0
  150. package/dist/core/context/context-assembler.js.map +1 -0
  151. package/dist/core/context/rag-context.d.ts +44 -0
  152. package/dist/core/context/rag-context.d.ts.map +1 -0
  153. package/dist/core/context/rag-context.js +93 -0
  154. package/dist/core/context/rag-context.js.map +1 -0
  155. package/dist/core/context/tiered-context.d.ts +35 -0
  156. package/dist/core/context/tiered-context.d.ts.map +1 -0
  157. package/dist/core/context/tiered-context.js +92 -0
  158. package/dist/core/context/tiered-context.js.map +1 -0
  159. package/dist/core/context/token-estimator.d.ts +7 -0
  160. package/dist/core/context/token-estimator.d.ts.map +1 -0
  161. package/dist/core/context/token-estimator.js +9 -0
  162. package/dist/core/context/token-estimator.js.map +1 -0
  163. package/dist/core/docs/docs-cache-store.d.ts +24 -0
  164. package/dist/core/docs/docs-cache-store.d.ts.map +1 -0
  165. package/dist/core/docs/docs-cache-store.js +61 -0
  166. package/dist/core/docs/docs-cache-store.js.map +1 -0
  167. package/dist/core/docs/docs-syncer.d.ts +13 -0
  168. package/dist/core/docs/docs-syncer.d.ts.map +1 -0
  169. package/dist/core/docs/docs-syncer.js +38 -0
  170. package/dist/core/docs/docs-syncer.js.map +1 -0
  171. package/dist/core/docs/mcp-context7-fetcher.d.ts +17 -0
  172. package/dist/core/docs/mcp-context7-fetcher.d.ts.map +1 -0
  173. package/dist/core/docs/mcp-context7-fetcher.js +87 -0
  174. package/dist/core/docs/mcp-context7-fetcher.js.map +1 -0
  175. package/dist/core/docs/stack-detector.d.ts +21 -0
  176. package/dist/core/docs/stack-detector.d.ts.map +1 -0
  177. package/dist/core/docs/stack-detector.js +101 -0
  178. package/dist/core/docs/stack-detector.js.map +1 -0
  179. package/dist/core/events/event-bus.d.ts +26 -0
  180. package/dist/core/events/event-bus.d.ts.map +1 -0
  181. package/dist/core/events/event-bus.js +47 -0
  182. package/dist/core/events/event-bus.js.map +1 -0
  183. package/dist/core/events/event-types.d.ts +71 -0
  184. package/dist/core/events/event-types.d.ts.map +1 -0
  185. package/dist/core/events/event-types.js +2 -0
  186. package/dist/core/events/event-types.js.map +1 -0
  187. package/dist/core/graph/graph-indexes.d.ts +3 -0
  188. package/dist/core/graph/graph-indexes.d.ts.map +1 -0
  189. package/dist/core/graph/graph-indexes.js +28 -0
  190. package/dist/core/graph/graph-indexes.js.map +1 -0
  191. package/dist/core/graph/graph-types.d.ts +72 -0
  192. package/dist/core/graph/graph-types.d.ts.map +1 -0
  193. package/dist/core/graph/graph-types.js +2 -0
  194. package/dist/core/graph/graph-types.js.map +1 -0
  195. package/dist/core/graph/mermaid-export.d.ts +9 -0
  196. package/dist/core/graph/mermaid-export.d.ts.map +1 -0
  197. package/dist/core/graph/mermaid-export.js +80 -0
  198. package/dist/core/graph/mermaid-export.js.map +1 -0
  199. package/dist/core/importer/import-prd.d.ts +7 -0
  200. package/dist/core/importer/import-prd.d.ts.map +1 -0
  201. package/dist/core/importer/import-prd.js +7 -0
  202. package/dist/core/importer/import-prd.js.map +1 -0
  203. package/dist/core/importer/prd-to-graph.d.ts +18 -0
  204. package/dist/core/importer/prd-to-graph.d.ts.map +1 -0
  205. package/dist/core/importer/prd-to-graph.js +195 -0
  206. package/dist/core/importer/prd-to-graph.js.map +1 -0
  207. package/dist/core/insights/bottleneck-detector.d.ts +31 -0
  208. package/dist/core/insights/bottleneck-detector.d.ts.map +1 -0
  209. package/dist/core/insights/bottleneck-detector.js +84 -0
  210. package/dist/core/insights/bottleneck-detector.js.map +1 -0
  211. package/dist/core/insights/metrics-calculator.d.ts +31 -0
  212. package/dist/core/insights/metrics-calculator.d.ts.map +1 -0
  213. package/dist/core/insights/metrics-calculator.js +78 -0
  214. package/dist/core/insights/metrics-calculator.js.map +1 -0
  215. package/dist/core/insights/skill-recommender.d.ts +21 -0
  216. package/dist/core/insights/skill-recommender.d.ts.map +1 -0
  217. package/dist/core/insights/skill-recommender.js +129 -0
  218. package/dist/core/insights/skill-recommender.js.map +1 -0
  219. package/dist/core/integrations/enriched-context.d.ts +24 -0
  220. package/dist/core/integrations/enriched-context.d.ts.map +1 -0
  221. package/dist/core/integrations/enriched-context.js +89 -0
  222. package/dist/core/integrations/enriched-context.js.map +1 -0
  223. package/dist/core/integrations/gitnexus-launcher.d.ts +62 -0
  224. package/dist/core/integrations/gitnexus-launcher.d.ts.map +1 -0
  225. package/dist/core/integrations/gitnexus-launcher.js +241 -0
  226. package/dist/core/integrations/gitnexus-launcher.js.map +1 -0
  227. package/dist/core/integrations/gitnexus-queries.d.ts +55 -0
  228. package/dist/core/integrations/gitnexus-queries.d.ts.map +1 -0
  229. package/dist/core/integrations/gitnexus-queries.js +168 -0
  230. package/dist/core/integrations/gitnexus-queries.js.map +1 -0
  231. package/dist/core/integrations/integration-orchestrator.d.ts +51 -0
  232. package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -0
  233. package/dist/core/integrations/integration-orchestrator.js +118 -0
  234. package/dist/core/integrations/integration-orchestrator.js.map +1 -0
  235. package/dist/core/integrations/mcp-deps-installer.d.ts +21 -0
  236. package/dist/core/integrations/mcp-deps-installer.d.ts.map +1 -0
  237. package/dist/core/integrations/mcp-deps-installer.js +114 -0
  238. package/dist/core/integrations/mcp-deps-installer.js.map +1 -0
  239. package/dist/core/integrations/mcp-servers-config.d.ts +21 -0
  240. package/dist/core/integrations/mcp-servers-config.d.ts.map +1 -0
  241. package/dist/core/integrations/mcp-servers-config.js +58 -0
  242. package/dist/core/integrations/mcp-servers-config.js.map +1 -0
  243. package/dist/core/integrations/serena-reader.d.ts +18 -0
  244. package/dist/core/integrations/serena-reader.d.ts.map +1 -0
  245. package/dist/core/integrations/serena-reader.js +68 -0
  246. package/dist/core/integrations/serena-reader.js.map +1 -0
  247. package/dist/core/integrations/tool-status.d.ts +18 -0
  248. package/dist/core/integrations/tool-status.d.ts.map +1 -0
  249. package/dist/core/integrations/tool-status.js +97 -0
  250. package/dist/core/integrations/tool-status.js.map +1 -0
  251. package/dist/core/parser/classify.d.ts +31 -0
  252. package/dist/core/parser/classify.d.ts.map +1 -0
  253. package/dist/core/parser/classify.js +128 -0
  254. package/dist/core/parser/classify.js.map +1 -0
  255. package/dist/core/parser/extract.d.ts +21 -0
  256. package/dist/core/parser/extract.d.ts.map +1 -0
  257. package/dist/core/parser/extract.js +66 -0
  258. package/dist/core/parser/extract.js.map +1 -0
  259. package/dist/core/parser/file-reader.d.ts +13 -0
  260. package/dist/core/parser/file-reader.d.ts.map +1 -0
  261. package/dist/core/parser/file-reader.js +52 -0
  262. package/dist/core/parser/file-reader.js.map +1 -0
  263. package/dist/core/parser/normalize.d.ts +9 -0
  264. package/dist/core/parser/normalize.d.ts.map +1 -0
  265. package/dist/core/parser/normalize.js +22 -0
  266. package/dist/core/parser/normalize.js.map +1 -0
  267. package/dist/core/parser/read-file.d.ts +7 -0
  268. package/dist/core/parser/read-file.d.ts.map +1 -0
  269. package/dist/core/parser/read-file.js +17 -0
  270. package/dist/core/parser/read-file.js.map +1 -0
  271. package/dist/core/parser/read-html.d.ts +7 -0
  272. package/dist/core/parser/read-html.d.ts.map +1 -0
  273. package/dist/core/parser/read-html.js +51 -0
  274. package/dist/core/parser/read-html.js.map +1 -0
  275. package/dist/core/parser/read-pdf.d.ts +10 -0
  276. package/dist/core/parser/read-pdf.d.ts.map +1 -0
  277. package/dist/core/parser/read-pdf.js +16 -0
  278. package/dist/core/parser/read-pdf.js.map +1 -0
  279. package/dist/core/parser/segment.d.ts +13 -0
  280. package/dist/core/parser/segment.d.ts.map +1 -0
  281. package/dist/core/parser/segment.js +53 -0
  282. package/dist/core/parser/segment.js.map +1 -0
  283. package/dist/core/planner/decompose.d.ts +25 -0
  284. package/dist/core/planner/decompose.d.ts.map +1 -0
  285. package/dist/core/planner/decompose.js +100 -0
  286. package/dist/core/planner/decompose.js.map +1 -0
  287. package/dist/core/planner/dependency-chain.d.ts +20 -0
  288. package/dist/core/planner/dependency-chain.d.ts.map +1 -0
  289. package/dist/core/planner/dependency-chain.js +163 -0
  290. package/dist/core/planner/dependency-chain.js.map +1 -0
  291. package/dist/core/planner/enhanced-next.d.ts +25 -0
  292. package/dist/core/planner/enhanced-next.d.ts.map +1 -0
  293. package/dist/core/planner/enhanced-next.js +88 -0
  294. package/dist/core/planner/enhanced-next.js.map +1 -0
  295. package/dist/core/planner/lifecycle-phase.d.ts +21 -0
  296. package/dist/core/planner/lifecycle-phase.d.ts.map +1 -0
  297. package/dist/core/planner/lifecycle-phase.js +93 -0
  298. package/dist/core/planner/lifecycle-phase.js.map +1 -0
  299. package/dist/core/planner/next-task.d.ts +16 -0
  300. package/dist/core/planner/next-task.d.ts.map +1 -0
  301. package/dist/core/planner/next-task.js +146 -0
  302. package/dist/core/planner/next-task.js.map +1 -0
  303. package/dist/core/planner/planning-report.d.ts +38 -0
  304. package/dist/core/planner/planning-report.d.ts.map +1 -0
  305. package/dist/core/planner/planning-report.js +140 -0
  306. package/dist/core/planner/planning-report.js.map +1 -0
  307. package/dist/core/planner/velocity.d.ts +38 -0
  308. package/dist/core/planner/velocity.d.ts.map +1 -0
  309. package/dist/core/planner/velocity.js +92 -0
  310. package/dist/core/planner/velocity.js.map +1 -0
  311. package/dist/core/rag/capture-indexer.d.ts +16 -0
  312. package/dist/core/rag/capture-indexer.d.ts.map +1 -0
  313. package/dist/core/rag/capture-indexer.js +37 -0
  314. package/dist/core/rag/capture-indexer.js.map +1 -0
  315. package/dist/core/rag/chunk-text.d.ts +27 -0
  316. package/dist/core/rag/chunk-text.d.ts.map +1 -0
  317. package/dist/core/rag/chunk-text.js +112 -0
  318. package/dist/core/rag/chunk-text.js.map +1 -0
  319. package/dist/core/rag/docs-indexer.d.ts +18 -0
  320. package/dist/core/rag/docs-indexer.d.ts.map +1 -0
  321. package/dist/core/rag/docs-indexer.js +57 -0
  322. package/dist/core/rag/docs-indexer.js.map +1 -0
  323. package/dist/core/rag/embedding-store.d.ts +51 -0
  324. package/dist/core/rag/embedding-store.d.ts.map +1 -0
  325. package/dist/core/rag/embedding-store.js +134 -0
  326. package/dist/core/rag/embedding-store.js.map +1 -0
  327. package/dist/core/rag/rag-pipeline.d.ts +48 -0
  328. package/dist/core/rag/rag-pipeline.d.ts.map +1 -0
  329. package/dist/core/rag/rag-pipeline.js +276 -0
  330. package/dist/core/rag/rag-pipeline.js.map +1 -0
  331. package/dist/core/rag/serena-indexer.d.ts +16 -0
  332. package/dist/core/rag/serena-indexer.d.ts.map +1 -0
  333. package/dist/core/rag/serena-indexer.js +50 -0
  334. package/dist/core/rag/serena-indexer.js.map +1 -0
  335. package/dist/core/rag/serena-rag-query.d.ts +34 -0
  336. package/dist/core/rag/serena-rag-query.d.ts.map +1 -0
  337. package/dist/core/rag/serena-rag-query.js +83 -0
  338. package/dist/core/rag/serena-rag-query.js.map +1 -0
  339. package/dist/core/search/fts-search.d.ts +16 -0
  340. package/dist/core/search/fts-search.d.ts.map +1 -0
  341. package/dist/core/search/fts-search.js +62 -0
  342. package/dist/core/search/fts-search.js.map +1 -0
  343. package/dist/core/search/tfidf.d.ts +32 -0
  344. package/dist/core/search/tfidf.d.ts.map +1 -0
  345. package/dist/core/search/tfidf.js +67 -0
  346. package/dist/core/search/tfidf.js.map +1 -0
  347. package/dist/core/search/tokenizer.d.ts +9 -0
  348. package/dist/core/search/tokenizer.d.ts.map +1 -0
  349. package/dist/core/search/tokenizer.js +37 -0
  350. package/dist/core/search/tokenizer.js.map +1 -0
  351. package/dist/core/store/knowledge-store.d.ts +72 -0
  352. package/dist/core/store/knowledge-store.d.ts.map +1 -0
  353. package/dist/core/store/knowledge-store.js +166 -0
  354. package/dist/core/store/knowledge-store.js.map +1 -0
  355. package/dist/core/store/migrations.d.ts +4 -0
  356. package/dist/core/store/migrations.d.ts.map +1 -0
  357. package/dist/core/store/migrations.js +223 -0
  358. package/dist/core/store/migrations.js.map +1 -0
  359. package/dist/core/store/sqlite-store.d.ts +86 -0
  360. package/dist/core/store/sqlite-store.d.ts.map +1 -0
  361. package/dist/core/store/sqlite-store.js +707 -0
  362. package/dist/core/store/sqlite-store.js.map +1 -0
  363. package/dist/core/utils/constants.d.ts +10 -0
  364. package/dist/core/utils/constants.d.ts.map +1 -0
  365. package/dist/core/utils/constants.js +10 -0
  366. package/dist/core/utils/constants.js.map +1 -0
  367. package/dist/core/utils/errors.d.ts +20 -0
  368. package/dist/core/utils/errors.d.ts.map +1 -0
  369. package/dist/core/utils/errors.js +39 -0
  370. package/dist/core/utils/errors.js.map +1 -0
  371. package/dist/core/utils/fs.d.ts +2 -0
  372. package/dist/core/utils/fs.d.ts.map +1 -0
  373. package/dist/core/utils/fs.js +11 -0
  374. package/dist/core/utils/fs.js.map +1 -0
  375. package/dist/core/utils/id.d.ts +2 -0
  376. package/dist/core/utils/id.d.ts.map +1 -0
  377. package/dist/core/utils/id.js +6 -0
  378. package/dist/core/utils/id.js.map +1 -0
  379. package/dist/core/utils/logger.d.ts +8 -0
  380. package/dist/core/utils/logger.d.ts.map +1 -0
  381. package/dist/core/utils/logger.js +28 -0
  382. package/dist/core/utils/logger.js.map +1 -0
  383. package/dist/core/utils/platform.d.ts +18 -0
  384. package/dist/core/utils/platform.d.ts.map +1 -0
  385. package/dist/core/utils/platform.js +43 -0
  386. package/dist/core/utils/platform.js.map +1 -0
  387. package/dist/core/utils/time.d.ts +2 -0
  388. package/dist/core/utils/time.d.ts.map +1 -0
  389. package/dist/core/utils/time.js +4 -0
  390. package/dist/core/utils/time.js.map +1 -0
  391. package/dist/index.d.ts +10 -0
  392. package/dist/index.d.ts.map +1 -0
  393. package/dist/index.js +9 -0
  394. package/dist/index.js.map +1 -0
  395. package/dist/mcp/init-project.d.ts +2 -0
  396. package/dist/mcp/init-project.d.ts.map +1 -0
  397. package/dist/mcp/init-project.js +144 -0
  398. package/dist/mcp/init-project.js.map +1 -0
  399. package/dist/mcp/lifecycle-wrapper.d.ts +26 -0
  400. package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -0
  401. package/dist/mcp/lifecycle-wrapper.js +67 -0
  402. package/dist/mcp/lifecycle-wrapper.js.map +1 -0
  403. package/dist/mcp/server.d.ts +3 -0
  404. package/dist/mcp/server.d.ts.map +1 -0
  405. package/dist/mcp/server.js +73 -0
  406. package/dist/mcp/server.js.map +1 -0
  407. package/dist/mcp/stdio.d.ts +3 -0
  408. package/dist/mcp/stdio.d.ts.map +1 -0
  409. package/dist/mcp/stdio.js +20 -0
  410. package/dist/mcp/stdio.js.map +1 -0
  411. package/dist/mcp/tools/add-node.d.ts +4 -0
  412. package/dist/mcp/tools/add-node.d.ts.map +1 -0
  413. package/dist/mcp/tools/add-node.js +83 -0
  414. package/dist/mcp/tools/add-node.js.map +1 -0
  415. package/dist/mcp/tools/bulk-update-status.d.ts +4 -0
  416. package/dist/mcp/tools/bulk-update-status.d.ts.map +1 -0
  417. package/dist/mcp/tools/bulk-update-status.js +22 -0
  418. package/dist/mcp/tools/bulk-update-status.js.map +1 -0
  419. package/dist/mcp/tools/clone-node.d.ts +4 -0
  420. package/dist/mcp/tools/clone-node.d.ts.map +1 -0
  421. package/dist/mcp/tools/clone-node.js +111 -0
  422. package/dist/mcp/tools/clone-node.js.map +1 -0
  423. package/dist/mcp/tools/context.d.ts +4 -0
  424. package/dist/mcp/tools/context.d.ts.map +1 -0
  425. package/dist/mcp/tools/context.js +30 -0
  426. package/dist/mcp/tools/context.js.map +1 -0
  427. package/dist/mcp/tools/decompose.d.ts +4 -0
  428. package/dist/mcp/tools/decompose.d.ts.map +1 -0
  429. package/dist/mcp/tools/decompose.js +25 -0
  430. package/dist/mcp/tools/decompose.js.map +1 -0
  431. package/dist/mcp/tools/delete-node.d.ts +4 -0
  432. package/dist/mcp/tools/delete-node.d.ts.map +1 -0
  433. package/dist/mcp/tools/delete-node.js +29 -0
  434. package/dist/mcp/tools/delete-node.js.map +1 -0
  435. package/dist/mcp/tools/dependencies.d.ts +4 -0
  436. package/dist/mcp/tools/dependencies.d.ts.map +1 -0
  437. package/dist/mcp/tools/dependencies.js +47 -0
  438. package/dist/mcp/tools/dependencies.js.map +1 -0
  439. package/dist/mcp/tools/edge.d.ts +4 -0
  440. package/dist/mcp/tools/edge.d.ts.map +1 -0
  441. package/dist/mcp/tools/edge.js +140 -0
  442. package/dist/mcp/tools/edge.js.map +1 -0
  443. package/dist/mcp/tools/export.d.ts +4 -0
  444. package/dist/mcp/tools/export.d.ts.map +1 -0
  445. package/dist/mcp/tools/export.js +38 -0
  446. package/dist/mcp/tools/export.js.map +1 -0
  447. package/dist/mcp/tools/import-prd.d.ts +4 -0
  448. package/dist/mcp/tools/import-prd.d.ts.map +1 -0
  449. package/dist/mcp/tools/import-prd.js +81 -0
  450. package/dist/mcp/tools/import-prd.js.map +1 -0
  451. package/dist/mcp/tools/index.d.ts +4 -0
  452. package/dist/mcp/tools/index.d.ts.map +1 -0
  453. package/dist/mcp/tools/index.js +58 -0
  454. package/dist/mcp/tools/index.js.map +1 -0
  455. package/dist/mcp/tools/init.d.ts +4 -0
  456. package/dist/mcp/tools/init.d.ts.map +1 -0
  457. package/dist/mcp/tools/init.js +18 -0
  458. package/dist/mcp/tools/init.js.map +1 -0
  459. package/dist/mcp/tools/list.d.ts +4 -0
  460. package/dist/mcp/tools/list.d.ts.map +1 -0
  461. package/dist/mcp/tools/list.js +56 -0
  462. package/dist/mcp/tools/list.js.map +1 -0
  463. package/dist/mcp/tools/move-node.d.ts +4 -0
  464. package/dist/mcp/tools/move-node.d.ts.map +1 -0
  465. package/dist/mcp/tools/move-node.js +110 -0
  466. package/dist/mcp/tools/move-node.js.map +1 -0
  467. package/dist/mcp/tools/next.d.ts +4 -0
  468. package/dist/mcp/tools/next.d.ts.map +1 -0
  469. package/dist/mcp/tools/next.js +32 -0
  470. package/dist/mcp/tools/next.js.map +1 -0
  471. package/dist/mcp/tools/plan-sprint.d.ts +4 -0
  472. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -0
  473. package/dist/mcp/tools/plan-sprint.js +54 -0
  474. package/dist/mcp/tools/plan-sprint.js.map +1 -0
  475. package/dist/mcp/tools/rag-context.d.ts +4 -0
  476. package/dist/mcp/tools/rag-context.d.ts.map +1 -0
  477. package/dist/mcp/tools/rag-context.js +51 -0
  478. package/dist/mcp/tools/rag-context.js.map +1 -0
  479. package/dist/mcp/tools/reindex-knowledge.d.ts +4 -0
  480. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -0
  481. package/dist/mcp/tools/reindex-knowledge.js +49 -0
  482. package/dist/mcp/tools/reindex-knowledge.js.map +1 -0
  483. package/dist/mcp/tools/search.d.ts +4 -0
  484. package/dist/mcp/tools/search.d.ts.map +1 -0
  485. package/dist/mcp/tools/search.js +41 -0
  486. package/dist/mcp/tools/search.js.map +1 -0
  487. package/dist/mcp/tools/show.d.ts +4 -0
  488. package/dist/mcp/tools/show.d.ts.map +1 -0
  489. package/dist/mcp/tools/show.js +42 -0
  490. package/dist/mcp/tools/show.js.map +1 -0
  491. package/dist/mcp/tools/snapshot.d.ts +4 -0
  492. package/dist/mcp/tools/snapshot.d.ts.map +1 -0
  493. package/dist/mcp/tools/snapshot.js +45 -0
  494. package/dist/mcp/tools/snapshot.js.map +1 -0
  495. package/dist/mcp/tools/stats.d.ts +4 -0
  496. package/dist/mcp/tools/stats.d.ts.map +1 -0
  497. package/dist/mcp/tools/stats.js +46 -0
  498. package/dist/mcp/tools/stats.js.map +1 -0
  499. package/dist/mcp/tools/sync-stack-docs.d.ts +4 -0
  500. package/dist/mcp/tools/sync-stack-docs.d.ts.map +1 -0
  501. package/dist/mcp/tools/sync-stack-docs.js +77 -0
  502. package/dist/mcp/tools/sync-stack-docs.js.map +1 -0
  503. package/dist/mcp/tools/update-node.d.ts +4 -0
  504. package/dist/mcp/tools/update-node.d.ts.map +1 -0
  505. package/dist/mcp/tools/update-node.js +45 -0
  506. package/dist/mcp/tools/update-node.js.map +1 -0
  507. package/dist/mcp/tools/update-status.d.ts +4 -0
  508. package/dist/mcp/tools/update-status.d.ts.map +1 -0
  509. package/dist/mcp/tools/update-status.js +33 -0
  510. package/dist/mcp/tools/update-status.js.map +1 -0
  511. package/dist/mcp/tools/validate-task.d.ts +4 -0
  512. package/dist/mcp/tools/validate-task.d.ts.map +1 -0
  513. package/dist/mcp/tools/validate-task.js +57 -0
  514. package/dist/mcp/tools/validate-task.js.map +1 -0
  515. package/dist/mcp/tools/velocity.d.ts +4 -0
  516. package/dist/mcp/tools/velocity.d.ts.map +1 -0
  517. package/dist/mcp/tools/velocity.js +25 -0
  518. package/dist/mcp/tools/velocity.js.map +1 -0
  519. package/dist/schemas/edge.schema.d.ts +31 -0
  520. package/dist/schemas/edge.schema.d.ts.map +1 -0
  521. package/dist/schemas/edge.schema.js +16 -0
  522. package/dist/schemas/edge.schema.js.map +1 -0
  523. package/dist/schemas/graph.schema.d.ts +102 -0
  524. package/dist/schemas/graph.schema.d.ts.map +1 -0
  525. package/dist/schemas/graph.schema.js +28 -0
  526. package/dist/schemas/graph.schema.js.map +1 -0
  527. package/dist/schemas/knowledge.schema.d.ts +29 -0
  528. package/dist/schemas/knowledge.schema.d.ts.map +1 -0
  529. package/dist/schemas/knowledge.schema.js +17 -0
  530. package/dist/schemas/knowledge.schema.js.map +1 -0
  531. package/dist/schemas/node.schema.d.ts +80 -0
  532. package/dist/schemas/node.schema.d.ts.map +1 -0
  533. package/dist/schemas/node.schema.js +38 -0
  534. package/dist/schemas/node.schema.js.map +1 -0
  535. package/dist/web/dashboard/dist/assets/benchmark-tab-BTKW3REK.js +1 -0
  536. package/dist/web/dashboard/dist/assets/benchmark-tab-BhbUvjLM.js +1 -0
  537. package/dist/web/dashboard/dist/assets/benchmark-tab-CESZcCtO.js +1 -0
  538. package/dist/web/dashboard/dist/assets/benchmark-tab-D64Ala80.js +1 -0
  539. package/dist/web/dashboard/dist/assets/benchmark-tab-DJ7HyF-u.js +1 -0
  540. package/dist/web/dashboard/dist/assets/benchmark-tab-DVyzQZ2d.js +1 -0
  541. package/dist/web/dashboard/dist/assets/benchmark-tab-XUH7yQNv.js +1 -0
  542. package/dist/web/dashboard/dist/assets/benchmark-tab-ZfJu1pxc.js +1 -0
  543. package/dist/web/dashboard/dist/assets/constants-BIEJOBya.js +1 -0
  544. package/dist/web/dashboard/dist/assets/gitnexus-tab-BFHEXsJm.js +312 -0
  545. package/dist/web/dashboard/dist/assets/gitnexus-tab-Bbp91fom.js +312 -0
  546. package/dist/web/dashboard/dist/assets/gitnexus-tab-C3fPSzYi.js +312 -0
  547. package/dist/web/dashboard/dist/assets/gitnexus-tab-Cd0k8qk3.js +312 -0
  548. package/dist/web/dashboard/dist/assets/gitnexus-tab-ClNGphK5.js +312 -0
  549. package/dist/web/dashboard/dist/assets/gitnexus-tab-Cuc-KSII.js +312 -0
  550. package/dist/web/dashboard/dist/assets/gitnexus-tab-DEqMBSbC.css +1 -0
  551. package/dist/web/dashboard/dist/assets/gitnexus-tab-DEwJXSnD.js +312 -0
  552. package/dist/web/dashboard/dist/assets/gitnexus-tab-DOD7xwmm.js +312 -0
  553. package/dist/web/dashboard/dist/assets/graph-tab-AD7csRcc.js +1 -0
  554. package/dist/web/dashboard/dist/assets/graph-tab-BKyDCyHH.js +1 -0
  555. package/dist/web/dashboard/dist/assets/graph-tab-BUAkTto0.js +1 -0
  556. package/dist/web/dashboard/dist/assets/graph-tab-D0F0WJES.js +1 -0
  557. package/dist/web/dashboard/dist/assets/graph-tab-DA16nThT.js +1 -0
  558. package/dist/web/dashboard/dist/assets/graph-tab-DJknUhrl.js +1 -0
  559. package/dist/web/dashboard/dist/assets/graph-tab-DRPfelKw.js +1 -0
  560. package/dist/web/dashboard/dist/assets/graph-tab-lJ2rPS4Z.js +1 -0
  561. package/dist/web/dashboard/dist/assets/graph-utils-BN7tt0ZS.js +23 -0
  562. package/dist/web/dashboard/dist/assets/graph-utils-BTV1KGUM.js +23 -0
  563. package/dist/web/dashboard/dist/assets/graph-utils-BZV40eAE.css +1 -0
  564. package/dist/web/dashboard/dist/assets/graph-utils-BkfAOVJ9.js +23 -0
  565. package/dist/web/dashboard/dist/assets/graph-utils-Bo7cD1sx.js +23 -0
  566. package/dist/web/dashboard/dist/assets/graph-utils-CI4znRl5.js +23 -0
  567. package/dist/web/dashboard/dist/assets/graph-utils-DrCx5m7q.js +23 -0
  568. package/dist/web/dashboard/dist/assets/graph-utils-KQmzMFXM.js +23 -0
  569. package/dist/web/dashboard/dist/assets/graph-utils-M7iOhRI-.js +23 -0
  570. package/dist/web/dashboard/dist/assets/index-BGMP3W6f.css +1 -0
  571. package/dist/web/dashboard/dist/assets/index-BVXu3x9W.js +53 -0
  572. package/dist/web/dashboard/dist/assets/index-B_T9j86O.js +53 -0
  573. package/dist/web/dashboard/dist/assets/index-Bga9WW2A.css +1 -0
  574. package/dist/web/dashboard/dist/assets/index-BnLPCC8R.css +1 -0
  575. package/dist/web/dashboard/dist/assets/index-BonF71I0.js +53 -0
  576. package/dist/web/dashboard/dist/assets/index-CSyjxREL.js +53 -0
  577. package/dist/web/dashboard/dist/assets/index-CbUKe2Fv.js +53 -0
  578. package/dist/web/dashboard/dist/assets/index-D9i2aVjo.js +53 -0
  579. package/dist/web/dashboard/dist/assets/index-DzM6oBA3.js +53 -0
  580. package/dist/web/dashboard/dist/assets/index-IK005MzD.js +53 -0
  581. package/dist/web/dashboard/dist/assets/insights-tab-B9R3HsMU.js +1 -0
  582. package/dist/web/dashboard/dist/assets/insights-tab-BO_cxLyV.js +1 -0
  583. package/dist/web/dashboard/dist/assets/insights-tab-Brn6IMfQ.js +1 -0
  584. package/dist/web/dashboard/dist/assets/insights-tab-C6x-aJ8p.js +1 -0
  585. package/dist/web/dashboard/dist/assets/insights-tab-CWUU6eDi.js +1 -0
  586. package/dist/web/dashboard/dist/assets/insights-tab-CapL1jP-.js +1 -0
  587. package/dist/web/dashboard/dist/assets/insights-tab-CeWM6zgV.js +1 -0
  588. package/dist/web/dashboard/dist/assets/insights-tab-xQj5e61M.js +1 -0
  589. package/dist/web/dashboard/dist/assets/prd-backlog-tab-0oOO63rA.js +1 -0
  590. package/dist/web/dashboard/dist/assets/prd-backlog-tab-BcWoplsM.js +1 -0
  591. package/dist/web/dashboard/dist/assets/prd-backlog-tab-Bjj5KccG.js +1 -0
  592. package/dist/web/dashboard/dist/assets/prd-backlog-tab-C7cKQyup.js +1 -0
  593. package/dist/web/dashboard/dist/assets/prd-backlog-tab-CT4ja7Ay.js +1 -0
  594. package/dist/web/dashboard/dist/assets/prd-backlog-tab-CmPHHBDQ.js +1 -0
  595. package/dist/web/dashboard/dist/assets/prd-backlog-tab-DAHBiRO-.js +1 -0
  596. package/dist/web/dashboard/dist/assets/prd-backlog-tab-_jmBe3MU.js +1 -0
  597. package/dist/web/dashboard/dist/assets/serena-tab-BVyBTaHC.js +1 -0
  598. package/dist/web/dashboard/dist/assets/serena-tab-CVI1GGRk.js +1 -0
  599. package/dist/web/dashboard/dist/assets/serena-tab-D1ki2NjT.js +1 -0
  600. package/dist/web/dashboard/dist/assets/serena-tab-DRrRfjpO.js +1 -0
  601. package/dist/web/dashboard/dist/assets/serena-tab-DvYbwR4Z.js +1 -0
  602. package/dist/web/dashboard/dist/assets/serena-tab-DwiZ6Jm3.js +1 -0
  603. package/dist/web/dashboard/dist/assets/serena-tab-L6isY0iT.js +1 -0
  604. package/dist/web/dashboard/dist/assets/serena-tab-ba2n0AOh.js +1 -0
  605. package/dist/web/dashboard/dist/index.html +13 -0
  606. package/package.json +86 -0
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-CSyjxREL.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-KQmzMFXM.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-B_T9j86O.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-Bo7cD1sx.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-D9i2aVjo.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-M7iOhRI-.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-BVXu3x9W.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-BTV1KGUM.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-DzM6oBA3.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-CI4znRl5.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-BonF71I0.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-BN7tt0ZS.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-IK005MzD.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-DrCx5m7q.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
@@ -0,0 +1 @@
1
+ import{r as t,j as e,a as X}from"./index-CbUKe2Fv.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-BkfAOVJ9.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};