zyflow 0.6.4

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 (705) hide show
  1. package/.claude-flow/metrics/agent-metrics.json +1 -0
  2. package/.claude-flow/metrics/performance.json +87 -0
  3. package/.claude-flow/metrics/system-metrics.json +4370 -0
  4. package/.claude-flow/metrics/task-metrics.json +10 -0
  5. package/.claude-plugin/marketplace.json +18 -0
  6. package/.claude-plugin/plugin.json +17 -0
  7. package/.gitleaks.toml +69 -0
  8. package/.hive-mind/config/queens.json +59 -0
  9. package/.hive-mind/config/workers.json +72 -0
  10. package/.hive-mind/config.json +111 -0
  11. package/.hive-mind/hive.db +0 -0
  12. package/.hive-mind/hive.db-shm +0 -0
  13. package/.hive-mind/hive.db-wal +0 -0
  14. package/.leann/indexes/zyflow/documents.ids.txt +2078 -0
  15. package/.leann/indexes/zyflow/documents.index +0 -0
  16. package/.leann/indexes/zyflow/documents.leann.meta.json +25 -0
  17. package/.leann/indexes/zyflow/documents.leann.passages.idx +0 -0
  18. package/.leann/indexes/zyflow/documents.leann.passages.jsonl +2078 -0
  19. package/.mcp.json +41 -0
  20. package/.moai-backups/20260126_231508/.mcp.json +11 -0
  21. package/.moai-backups/20260126_231508/backup_metadata.json +34 -0
  22. package/.moai-backups/20260129_145438/.mcp.json +41 -0
  23. package/.moai-backups/20260129_145438/backup_metadata.json +53 -0
  24. package/.moai-backups/20260129_145504/.mcp.json +41 -0
  25. package/.moai-backups/20260129_145504/backup_metadata.json +20 -0
  26. package/.moai-backups/20260201_140004/.mcp.json +41 -0
  27. package/.moai-backups/20260201_140004/backup_metadata.json +51 -0
  28. package/.moai-backups/backup/.mcp.json +12 -0
  29. package/.moai-backups/settings-backup/settings.local.json +61 -0
  30. package/.pre-commit-config.yaml +74 -0
  31. package/.prettierignore +3 -0
  32. package/.prettierrc +7 -0
  33. package/.scannerwork/.sonar_lock +0 -0
  34. package/.scannerwork/report-task.txt +6 -0
  35. package/.serena/project.yml +105 -0
  36. package/.shadcn-admin-ref/.env.example +1 -0
  37. package/.shadcn-admin-ref/.prettierignore +18 -0
  38. package/.shadcn-admin-ref/.prettierrc +50 -0
  39. package/.shadcn-admin-ref/LICENSE +21 -0
  40. package/.shadcn-admin-ref/components.json +21 -0
  41. package/.shadcn-admin-ref/cz.yaml +7 -0
  42. package/.shadcn-admin-ref/eslint.config.js +59 -0
  43. package/.shadcn-admin-ref/index.html +80 -0
  44. package/.shadcn-admin-ref/knip.config.ts +8 -0
  45. package/.shadcn-admin-ref/netlify.toml +4 -0
  46. package/.shadcn-admin-ref/package.json +83 -0
  47. package/.shadcn-admin-ref/public/images/favicon.png +0 -0
  48. package/.shadcn-admin-ref/public/images/favicon.svg +4 -0
  49. package/.shadcn-admin-ref/public/images/favicon_light.png +0 -0
  50. package/.shadcn-admin-ref/public/images/favicon_light.svg +1 -0
  51. package/.shadcn-admin-ref/public/images/shadcn-admin.png +0 -0
  52. package/.shadcn-admin-ref/src/assets/brand-icons/icon-discord.tsx +28 -0
  53. package/.shadcn-admin-ref/src/assets/brand-icons/icon-docker.tsx +33 -0
  54. package/.shadcn-admin-ref/src/assets/brand-icons/icon-facebook.tsx +25 -0
  55. package/.shadcn-admin-ref/src/assets/brand-icons/icon-figma.tsx +27 -0
  56. package/.shadcn-admin-ref/src/assets/brand-icons/icon-github.tsx +25 -0
  57. package/.shadcn-admin-ref/src/assets/brand-icons/icon-gitlab.tsx +25 -0
  58. package/.shadcn-admin-ref/src/assets/brand-icons/icon-gmail.tsx +28 -0
  59. package/.shadcn-admin-ref/src/assets/brand-icons/icon-medium.tsx +30 -0
  60. package/.shadcn-admin-ref/src/assets/brand-icons/icon-notion.tsx +28 -0
  61. package/.shadcn-admin-ref/src/assets/brand-icons/icon-skype.tsx +26 -0
  62. package/.shadcn-admin-ref/src/assets/brand-icons/icon-slack.tsx +28 -0
  63. package/.shadcn-admin-ref/src/assets/brand-icons/icon-stripe.tsx +25 -0
  64. package/.shadcn-admin-ref/src/assets/brand-icons/icon-telegram.tsx +25 -0
  65. package/.shadcn-admin-ref/src/assets/brand-icons/icon-trello.tsx +27 -0
  66. package/.shadcn-admin-ref/src/assets/brand-icons/icon-whatsapp.tsx +26 -0
  67. package/.shadcn-admin-ref/src/assets/brand-icons/icon-zoom.tsx +26 -0
  68. package/.shadcn-admin-ref/src/assets/brand-icons/index.ts +16 -0
  69. package/.shadcn-admin-ref/src/assets/clerk-full-logo.tsx +41 -0
  70. package/.shadcn-admin-ref/src/assets/clerk-logo.tsx +23 -0
  71. package/.shadcn-admin-ref/src/assets/custom/icon-dir.tsx +110 -0
  72. package/.shadcn-admin-ref/src/assets/custom/icon-layout-compact.tsx +131 -0
  73. package/.shadcn-admin-ref/src/assets/custom/icon-layout-default.tsx +124 -0
  74. package/.shadcn-admin-ref/src/assets/custom/icon-layout-full.tsx +100 -0
  75. package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-floating.tsx +82 -0
  76. package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-inset.tsx +58 -0
  77. package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-sidebar.tsx +53 -0
  78. package/.shadcn-admin-ref/src/assets/custom/icon-theme-dark.tsx +79 -0
  79. package/.shadcn-admin-ref/src/assets/custom/icon-theme-light.tsx +78 -0
  80. package/.shadcn-admin-ref/src/assets/custom/icon-theme-system.tsx +116 -0
  81. package/.shadcn-admin-ref/src/assets/logo.tsx +24 -0
  82. package/.shadcn-admin-ref/src/components/coming-soon.tsx +16 -0
  83. package/.shadcn-admin-ref/src/components/command-menu.tsx +91 -0
  84. package/.shadcn-admin-ref/src/components/config-drawer.tsx +354 -0
  85. package/.shadcn-admin-ref/src/components/confirm-dialog.tsx +67 -0
  86. package/.shadcn-admin-ref/src/components/data-table/bulk-actions.tsx +213 -0
  87. package/.shadcn-admin-ref/src/components/data-table/column-header.tsx +74 -0
  88. package/.shadcn-admin-ref/src/components/data-table/faceted-filter.tsx +146 -0
  89. package/.shadcn-admin-ref/src/components/data-table/index.ts +6 -0
  90. package/.shadcn-admin-ref/src/components/data-table/pagination.tsx +130 -0
  91. package/.shadcn-admin-ref/src/components/data-table/toolbar.tsx +85 -0
  92. package/.shadcn-admin-ref/src/components/data-table/view-options.tsx +56 -0
  93. package/.shadcn-admin-ref/src/components/date-picker.tsx +51 -0
  94. package/.shadcn-admin-ref/src/components/layout/app-sidebar.tsx +37 -0
  95. package/.shadcn-admin-ref/src/components/layout/app-title.tsx +64 -0
  96. package/.shadcn-admin-ref/src/components/layout/authenticated-layout.tsx +42 -0
  97. package/.shadcn-admin-ref/src/components/layout/data/sidebar-data.ts +205 -0
  98. package/.shadcn-admin-ref/src/components/layout/header.tsx +50 -0
  99. package/.shadcn-admin-ref/src/components/layout/main.tsx +27 -0
  100. package/.shadcn-admin-ref/src/components/layout/nav-group.tsx +185 -0
  101. package/.shadcn-admin-ref/src/components/layout/nav-user.tsx +124 -0
  102. package/.shadcn-admin-ref/src/components/layout/team-switcher.tsx +86 -0
  103. package/.shadcn-admin-ref/src/components/layout/top-nav.tsx +67 -0
  104. package/.shadcn-admin-ref/src/components/layout/types.ts +44 -0
  105. package/.shadcn-admin-ref/src/components/learn-more.tsx +44 -0
  106. package/.shadcn-admin-ref/src/components/long-text.tsx +84 -0
  107. package/.shadcn-admin-ref/src/components/navigation-progress.tsx +25 -0
  108. package/.shadcn-admin-ref/src/components/password-input.tsx +42 -0
  109. package/.shadcn-admin-ref/src/components/profile-dropdown.tsx +75 -0
  110. package/.shadcn-admin-ref/src/components/search.tsx +37 -0
  111. package/.shadcn-admin-ref/src/components/select-dropdown.tsx +62 -0
  112. package/.shadcn-admin-ref/src/components/sign-out-dialog.tsx +38 -0
  113. package/.shadcn-admin-ref/src/components/skip-to-main.tsx +10 -0
  114. package/.shadcn-admin-ref/src/components/theme-switch.tsx +58 -0
  115. package/.shadcn-admin-ref/src/components/ui/alert-dialog.tsx +154 -0
  116. package/.shadcn-admin-ref/src/components/ui/alert.tsx +65 -0
  117. package/.shadcn-admin-ref/src/components/ui/avatar.tsx +50 -0
  118. package/.shadcn-admin-ref/src/components/ui/badge.tsx +45 -0
  119. package/.shadcn-admin-ref/src/components/ui/button.tsx +58 -0
  120. package/.shadcn-admin-ref/src/components/ui/calendar.tsx +210 -0
  121. package/.shadcn-admin-ref/src/components/ui/card.tsx +91 -0
  122. package/.shadcn-admin-ref/src/components/ui/checkbox.tsx +29 -0
  123. package/.shadcn-admin-ref/src/components/ui/collapsible.tsx +31 -0
  124. package/.shadcn-admin-ref/src/components/ui/command.tsx +181 -0
  125. package/.shadcn-admin-ref/src/components/ui/dialog.tsx +142 -0
  126. package/.shadcn-admin-ref/src/components/ui/dropdown-menu.tsx +254 -0
  127. package/.shadcn-admin-ref/src/components/ui/form.tsx +164 -0
  128. package/.shadcn-admin-ref/src/components/ui/input-otp.tsx +74 -0
  129. package/.shadcn-admin-ref/src/components/ui/input.tsx +20 -0
  130. package/.shadcn-admin-ref/src/components/ui/label.tsx +23 -0
  131. package/.shadcn-admin-ref/src/components/ui/popover.tsx +45 -0
  132. package/.shadcn-admin-ref/src/components/ui/radio-group.tsx +42 -0
  133. package/.shadcn-admin-ref/src/components/ui/scroll-area.tsx +65 -0
  134. package/.shadcn-admin-ref/src/components/ui/select.tsx +182 -0
  135. package/.shadcn-admin-ref/src/components/ui/separator.tsx +25 -0
  136. package/.shadcn-admin-ref/src/components/ui/sheet.tsx +136 -0
  137. package/.shadcn-admin-ref/src/components/ui/sidebar.tsx +728 -0
  138. package/.shadcn-admin-ref/src/components/ui/skeleton.tsx +13 -0
  139. package/.shadcn-admin-ref/src/components/ui/sonner.tsx +21 -0
  140. package/.shadcn-admin-ref/src/components/ui/switch.tsx +28 -0
  141. package/.shadcn-admin-ref/src/components/ui/table.tsx +113 -0
  142. package/.shadcn-admin-ref/src/components/ui/tabs.tsx +63 -0
  143. package/.shadcn-admin-ref/src/components/ui/textarea.tsx +17 -0
  144. package/.shadcn-admin-ref/src/components/ui/tooltip.tsx +60 -0
  145. package/.shadcn-admin-ref/src/config/fonts.ts +19 -0
  146. package/.shadcn-admin-ref/src/context/direction-provider.tsx +61 -0
  147. package/.shadcn-admin-ref/src/context/font-provider.tsx +58 -0
  148. package/.shadcn-admin-ref/src/context/layout-provider.tsx +85 -0
  149. package/.shadcn-admin-ref/src/context/search-provider.tsx +46 -0
  150. package/.shadcn-admin-ref/src/context/theme-provider.tsx +110 -0
  151. package/.shadcn-admin-ref/src/features/apps/data/apps.tsx +110 -0
  152. package/.shadcn-admin-ref/src/features/apps/index.tsx +179 -0
  153. package/.shadcn-admin-ref/src/features/auth/auth-layout.tsx +19 -0
  154. package/.shadcn-admin-ref/src/features/auth/forgot-password/components/forgot-password-form.tsx +82 -0
  155. package/.shadcn-admin-ref/src/features/auth/forgot-password/index.tsx +44 -0
  156. package/.shadcn-admin-ref/src/features/auth/otp/components/otp-form.tsx +100 -0
  157. package/.shadcn-admin-ref/src/features/auth/otp/index.tsx +44 -0
  158. package/.shadcn-admin-ref/src/features/auth/sign-in/assets/dashboard-dark.png +0 -0
  159. package/.shadcn-admin-ref/src/features/auth/sign-in/assets/dashboard-light.png +0 -0
  160. package/.shadcn-admin-ref/src/features/auth/sign-in/components/user-auth-form.tsx +150 -0
  161. package/.shadcn-admin-ref/src/features/auth/sign-in/index.tsx +51 -0
  162. package/.shadcn-admin-ref/src/features/auth/sign-in/sign-in-2.tsx +69 -0
  163. package/.shadcn-admin-ref/src/features/auth/sign-up/components/sign-up-form.tsx +143 -0
  164. package/.shadcn-admin-ref/src/features/auth/sign-up/index.tsx +57 -0
  165. package/.shadcn-admin-ref/src/features/chats/components/new-chat.tsx +127 -0
  166. package/.shadcn-admin-ref/src/features/chats/data/chat-types.ts +4 -0
  167. package/.shadcn-admin-ref/src/features/chats/data/convo.json +309 -0
  168. package/.shadcn-admin-ref/src/features/chats/index.tsx +349 -0
  169. package/.shadcn-admin-ref/src/features/dashboard/components/analytics-chart.tsx +77 -0
  170. package/.shadcn-admin-ref/src/features/dashboard/components/analytics.tsx +189 -0
  171. package/.shadcn-admin-ref/src/features/dashboard/components/overview.tsx +82 -0
  172. package/.shadcn-admin-ref/src/features/dashboard/components/recent-sales.tsx +83 -0
  173. package/.shadcn-admin-ref/src/features/dashboard/index.tsx +220 -0
  174. package/.shadcn-admin-ref/src/features/errors/forbidden.tsx +25 -0
  175. package/.shadcn-admin-ref/src/features/errors/general-error.tsx +36 -0
  176. package/.shadcn-admin-ref/src/features/errors/maintenance-error.tsx +19 -0
  177. package/.shadcn-admin-ref/src/features/errors/not-found-error.tsx +25 -0
  178. package/.shadcn-admin-ref/src/features/errors/unauthorized-error.tsx +25 -0
  179. package/.shadcn-admin-ref/src/features/settings/account/account-form.tsx +173 -0
  180. package/.shadcn-admin-ref/src/features/settings/account/index.tsx +14 -0
  181. package/.shadcn-admin-ref/src/features/settings/appearance/appearance-form.tsx +162 -0
  182. package/.shadcn-admin-ref/src/features/settings/appearance/index.tsx +14 -0
  183. package/.shadcn-admin-ref/src/features/settings/components/content-section.tsx +22 -0
  184. package/.shadcn-admin-ref/src/features/settings/components/sidebar-nav.tsx +84 -0
  185. package/.shadcn-admin-ref/src/features/settings/display/display-form.tsx +121 -0
  186. package/.shadcn-admin-ref/src/features/settings/display/index.tsx +13 -0
  187. package/.shadcn-admin-ref/src/features/settings/index.tsx +74 -0
  188. package/.shadcn-admin-ref/src/features/settings/notifications/index.tsx +13 -0
  189. package/.shadcn-admin-ref/src/features/settings/notifications/notifications-form.tsx +220 -0
  190. package/.shadcn-admin-ref/src/features/settings/profile/index.tsx +13 -0
  191. package/.shadcn-admin-ref/src/features/settings/profile/profile-form.tsx +177 -0
  192. package/.shadcn-admin-ref/src/features/tasks/components/data-table-bulk-actions.tsx +193 -0
  193. package/.shadcn-admin-ref/src/features/tasks/components/data-table-row-actions.tsx +83 -0
  194. package/.shadcn-admin-ref/src/features/tasks/components/tasks-columns.tsx +123 -0
  195. package/.shadcn-admin-ref/src/features/tasks/components/tasks-dialogs.tsx +72 -0
  196. package/.shadcn-admin-ref/src/features/tasks/components/tasks-import-dialog.tsx +110 -0
  197. package/.shadcn-admin-ref/src/features/tasks/components/tasks-multi-delete-dialog.tsx +95 -0
  198. package/.shadcn-admin-ref/src/features/tasks/components/tasks-mutate-drawer.tsx +212 -0
  199. package/.shadcn-admin-ref/src/features/tasks/components/tasks-primary-buttons.tsx +21 -0
  200. package/.shadcn-admin-ref/src/features/tasks/components/tasks-provider.tsx +36 -0
  201. package/.shadcn-admin-ref/src/features/tasks/components/tasks-table.tsx +197 -0
  202. package/.shadcn-admin-ref/src/features/tasks/data/data.tsx +77 -0
  203. package/.shadcn-admin-ref/src/features/tasks/data/schema.ts +13 -0
  204. package/.shadcn-admin-ref/src/features/tasks/data/tasks.ts +29 -0
  205. package/.shadcn-admin-ref/src/features/tasks/index.tsx +41 -0
  206. package/.shadcn-admin-ref/src/features/users/components/data-table-bulk-actions.tsx +139 -0
  207. package/.shadcn-admin-ref/src/features/users/components/data-table-row-actions.tsx +63 -0
  208. package/.shadcn-admin-ref/src/features/users/components/users-action-dialog.tsx +326 -0
  209. package/.shadcn-admin-ref/src/features/users/components/users-columns.tsx +138 -0
  210. package/.shadcn-admin-ref/src/features/users/components/users-delete-dialog.tsx +81 -0
  211. package/.shadcn-admin-ref/src/features/users/components/users-dialogs.tsx +51 -0
  212. package/.shadcn-admin-ref/src/features/users/components/users-invite-dialog.tsx +150 -0
  213. package/.shadcn-admin-ref/src/features/users/components/users-multi-delete-dialog.tsx +95 -0
  214. package/.shadcn-admin-ref/src/features/users/components/users-primary-buttons.tsx +21 -0
  215. package/.shadcn-admin-ref/src/features/users/components/users-provider.tsx +36 -0
  216. package/.shadcn-admin-ref/src/features/users/components/users-table.tsx +194 -0
  217. package/.shadcn-admin-ref/src/features/users/data/data.ts +35 -0
  218. package/.shadcn-admin-ref/src/features/users/data/schema.ts +32 -0
  219. package/.shadcn-admin-ref/src/features/users/data/users.ts +33 -0
  220. package/.shadcn-admin-ref/src/features/users/index.tsx +47 -0
  221. package/.shadcn-admin-ref/src/hooks/use-dialog-state.tsx +18 -0
  222. package/.shadcn-admin-ref/src/hooks/use-mobile.tsx +19 -0
  223. package/.shadcn-admin-ref/src/hooks/use-table-url-state.ts +219 -0
  224. package/.shadcn-admin-ref/src/lib/cookies.ts +43 -0
  225. package/.shadcn-admin-ref/src/lib/handle-server-error.ts +24 -0
  226. package/.shadcn-admin-ref/src/lib/show-submitted-data.tsx +15 -0
  227. package/.shadcn-admin-ref/src/lib/utils.ts +60 -0
  228. package/.shadcn-admin-ref/src/main.tsx +107 -0
  229. package/.shadcn-admin-ref/src/routeTree.gen.ts +719 -0
  230. package/.shadcn-admin-ref/src/routes/(auth)/forgot-password.tsx +6 -0
  231. package/.shadcn-admin-ref/src/routes/(auth)/otp.tsx +6 -0
  232. package/.shadcn-admin-ref/src/routes/(auth)/sign-in-2.tsx +6 -0
  233. package/.shadcn-admin-ref/src/routes/(auth)/sign-in.tsx +12 -0
  234. package/.shadcn-admin-ref/src/routes/(auth)/sign-up.tsx +6 -0
  235. package/.shadcn-admin-ref/src/routes/(errors)/401.tsx +6 -0
  236. package/.shadcn-admin-ref/src/routes/(errors)/403.tsx +6 -0
  237. package/.shadcn-admin-ref/src/routes/(errors)/404.tsx +6 -0
  238. package/.shadcn-admin-ref/src/routes/(errors)/500.tsx +6 -0
  239. package/.shadcn-admin-ref/src/routes/(errors)/503.tsx +6 -0
  240. package/.shadcn-admin-ref/src/routes/__root.tsx +30 -0
  241. package/.shadcn-admin-ref/src/routes/_authenticated/apps/index.tsx +17 -0
  242. package/.shadcn-admin-ref/src/routes/_authenticated/chats/index.tsx +6 -0
  243. package/.shadcn-admin-ref/src/routes/_authenticated/errors/$error.tsx +45 -0
  244. package/.shadcn-admin-ref/src/routes/_authenticated/help-center/index.tsx +6 -0
  245. package/.shadcn-admin-ref/src/routes/_authenticated/index.tsx +6 -0
  246. package/.shadcn-admin-ref/src/routes/_authenticated/route.tsx +6 -0
  247. package/.shadcn-admin-ref/src/routes/_authenticated/settings/account.tsx +6 -0
  248. package/.shadcn-admin-ref/src/routes/_authenticated/settings/appearance.tsx +6 -0
  249. package/.shadcn-admin-ref/src/routes/_authenticated/settings/display.tsx +6 -0
  250. package/.shadcn-admin-ref/src/routes/_authenticated/settings/index.tsx +6 -0
  251. package/.shadcn-admin-ref/src/routes/_authenticated/settings/notifications.tsx +6 -0
  252. package/.shadcn-admin-ref/src/routes/_authenticated/settings/route.tsx +6 -0
  253. package/.shadcn-admin-ref/src/routes/_authenticated/tasks/index.tsx +23 -0
  254. package/.shadcn-admin-ref/src/routes/_authenticated/users/index.tsx +32 -0
  255. package/.shadcn-admin-ref/src/routes/clerk/(auth)/route.tsx +60 -0
  256. package/.shadcn-admin-ref/src/routes/clerk/(auth)/sign-in.tsx +14 -0
  257. package/.shadcn-admin-ref/src/routes/clerk/(auth)/sign-up.tsx +9 -0
  258. package/.shadcn-admin-ref/src/routes/clerk/_authenticated/route.tsx +6 -0
  259. package/.shadcn-admin-ref/src/routes/clerk/_authenticated/user-management.tsx +184 -0
  260. package/.shadcn-admin-ref/src/routes/clerk/route.tsx +135 -0
  261. package/.shadcn-admin-ref/src/stores/auth-store.ts +53 -0
  262. package/.shadcn-admin-ref/src/styles/index.css +87 -0
  263. package/.shadcn-admin-ref/src/styles/theme.css +102 -0
  264. package/.shadcn-admin-ref/src/tanstack-table.d.ts +10 -0
  265. package/.shadcn-admin-ref/src/vite-env.d.ts +1 -0
  266. package/.swarm/memory.db +0 -0
  267. package/.swarm/memory.db-shm +0 -0
  268. package/.swarm/memory.db-wal +0 -0
  269. package/.zyflow/cli-settings.json +30 -0
  270. package/.zyflow/db.sqlite +0 -0
  271. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491505852.json +10 -0
  272. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491622627.json +10 -0
  273. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491794652.json +10 -0
  274. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491890392.json +10 -0
  275. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494002879.json +10 -0
  276. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494183887.json +10 -0
  277. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494342052.json +10 -0
  278. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494387244.json +10 -0
  279. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494387245.json +10 -0
  280. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494606176.json +10 -0
  281. package/.zyflow/logs/add-gitdiagram-integration/1633-1765495967542.json +16 -0
  282. package/.zyflow/logs/add-gitdiagram-integration/1633-1765495967629.json +16 -0
  283. package/.zyflow/logs/add-gitdiagram-integration/1633-1765497861143.json +16 -0
  284. package/.zyflow/logs/add-gitdiagram-integration/1633-1765497861870.json +20 -0
  285. package/.zyflow/logs/add-gitdiagram-integration/1633-1765498021377.json +18 -0
  286. package/.zyflow/logs/add-gitdiagram-integration/1633-1765498021660.json +18 -0
  287. package/.zyflow/logs/add-gitdiagram-integration/1633-1765503255525.json +13 -0
  288. package/.zyflow/logs/add-gitdiagram-integration/1633-1765503256018.json +13 -0
  289. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504009102.json +16 -0
  290. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504492051.json +18 -0
  291. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504946437.json +16 -0
  292. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504946640.json +16 -0
  293. package/.zyflow/logs/add-gitdiagram-integration/1634-1765505950215.json +16 -0
  294. package/.zyflow/logs/add-gitdiagram-integration/1634-1765505950948.json +18 -0
  295. package/.zyflow/logs/add-gitdiagram-integration/1635-1765505971712.json +18 -0
  296. package/.zyflow/logs/add-gitdiagram-integration/1635-1765505971976.json +18 -0
  297. package/.zyflow/logs/add-gitdiagram-integration/1636-1765505986208.json +18 -0
  298. package/.zyflow/logs/add-gitdiagram-integration/1636-1765505986620.json +16 -0
  299. package/.zyflow/logs/integrate-claude-flow/3580-1765996816612.json +10 -0
  300. package/.zyflow/logs/integrate-claude-flow/3580-1766014825819.json +10 -0
  301. package/.zyflow/logs/integrate-claude-flow/3580-1766015183794.json +12 -0
  302. package/.zyflow/logs/integrate-claude-flow/3580-1766015474608.json +12 -0
  303. package/.zyflow/logs/integrate-claude-flow/3581-1766016502824.json +63 -0
  304. package/.zyflow/logs/integrate-claude-flow/3581-1766016576008.json +60 -0
  305. package/.zyflow/logs/integrate-claude-flow/3582-1766022737754.json +110 -0
  306. package/.zyflow/logs/integrate-claude-flow/3582-1766022809327.json +135 -0
  307. package/.zyflow/sessions.json +242 -0
  308. package/.zyflow/settings.json +6 -0
  309. package/.zyflow/tasks.db +0 -0
  310. package/.zyflow/tasks.db-shm +0 -0
  311. package/.zyflow/tasks.db-wal +0 -0
  312. package/.zyflow/zyflow.sqlite +0 -0
  313. package/Dockerfile +82 -0
  314. package/LICENSE +21 -0
  315. package/README.md +506 -0
  316. package/claude-flow +34 -0
  317. package/components.json +21 -0
  318. package/config/ports.ts +28 -0
  319. package/docker-compose.yml +52 -0
  320. package/eslint.config.js +34 -0
  321. package/index.html +19 -0
  322. package/logs/mcp-error.log +55 -0
  323. package/logs/mcp-out.log +0 -0
  324. package/logs/pm2-error.log +0 -0
  325. package/logs/pm2-out.log +265 -0
  326. package/logs/py-error.log +22 -0
  327. package/logs/py-out.log +0 -0
  328. package/logs/server-error.log +11000 -0
  329. package/logs/server-out.log +8117 -0
  330. package/logs/vite-error.log +404 -0
  331. package/logs/vite-out.log +311 -0
  332. package/mcp-server/agent-tools.ts +375 -0
  333. package/mcp-server/cli-models.ts +193 -0
  334. package/mcp-server/context.ts +110 -0
  335. package/mcp-server/diagram-tools.ts +341 -0
  336. package/mcp-server/index.ts +2014 -0
  337. package/mcp-server/integration-tools.ts +909 -0
  338. package/mcp-server/moai-spec-tools.ts +416 -0
  339. package/mcp-server/parser.ts +422 -0
  340. package/mcp-server/post-task-runner.ts +253 -0
  341. package/mcp-server/post-task-types.ts +426 -0
  342. package/mcp-server/quarantine-manager.ts +479 -0
  343. package/mcp-server/report-generator.ts +386 -0
  344. package/mcp-server/task-tools.ts +619 -0
  345. package/mcp-server/trigger-config.ts +288 -0
  346. package/mcp-server/trigger-router.ts +305 -0
  347. package/mcp-server/triggers/event-listener.ts +331 -0
  348. package/mcp-server/triggers/git-hooks.ts +283 -0
  349. package/mcp-server/triggers/scheduler.ts +289 -0
  350. package/mcp-server/types.ts +55 -0
  351. package/memory/claude-flow@alpha-data.json +5 -0
  352. package/nginx/zyflow.conf +144 -0
  353. package/openspec/config.yaml +78 -0
  354. package/openspec-backup.tar.gz +0 -0
  355. package/package.json +154 -0
  356. package/packages/gitdiagram-core/.claude-flow/metrics/agent-metrics.json +1 -0
  357. package/packages/gitdiagram-core/.claude-flow/metrics/performance.json +87 -0
  358. package/packages/gitdiagram-core/.claude-flow/metrics/task-metrics.json +10 -0
  359. package/packages/gitdiagram-core/package.json +41 -0
  360. package/packages/gitdiagram-core/src/file-tree.ts +272 -0
  361. package/packages/gitdiagram-core/src/generator.ts +283 -0
  362. package/packages/gitdiagram-core/src/index.ts +78 -0
  363. package/packages/gitdiagram-core/src/llm-adapter.ts +235 -0
  364. package/packages/gitdiagram-core/src/mermaid-utils.ts +304 -0
  365. package/packages/gitdiagram-core/src/prompts.ts +281 -0
  366. package/packages/zyflow-parser/package.json +34 -0
  367. package/packages/zyflow-parser/src/index.ts +26 -0
  368. package/packages/zyflow-parser/src/moai-parser.ts +603 -0
  369. package/packages/zyflow-parser/src/moai-types.ts +110 -0
  370. package/packages/zyflow-remote-plugin/.claude-flow/metrics/agent-metrics.json +1 -0
  371. package/packages/zyflow-remote-plugin/.claude-flow/metrics/performance.json +87 -0
  372. package/packages/zyflow-remote-plugin/.claude-flow/metrics/task-metrics.json +10 -0
  373. package/packages/zyflow-remote-plugin/package.json +31 -0
  374. package/packages/zyflow-remote-plugin/src/index.ts +71 -0
  375. package/packages/zyflow-remote-plugin/src/remote-config.ts +232 -0
  376. package/packages/zyflow-remote-plugin/src/router.ts +535 -0
  377. package/packages/zyflow-remote-plugin/src/ssh-config-parser.ts +123 -0
  378. package/packages/zyflow-remote-plugin/src/ssh-manager.ts +598 -0
  379. package/packages/zyflow-remote-plugin/src/types.ts +149 -0
  380. package/plugin/manifest.json +26 -0
  381. package/plugin/package.json +13 -0
  382. package/public/favicon.svg +4 -0
  383. package/server/adk/agents/error-analyzer.ts +223 -0
  384. package/server/adk/agents/fix-generator.ts +187 -0
  385. package/server/adk/agents/pr-agent.ts +264 -0
  386. package/server/adk/agents/validator.ts +187 -0
  387. package/server/adk/config.ts +43 -0
  388. package/server/adk/index.ts +69 -0
  389. package/server/adk/integration.ts +297 -0
  390. package/server/adk/orchestrator.ts +405 -0
  391. package/server/adk/tools/build-tools.ts +290 -0
  392. package/server/adk/tools/file-tools.ts +351 -0
  393. package/server/adk/tools/git-tools.ts +280 -0
  394. package/server/adk/tools/github-tools.ts +249 -0
  395. package/server/agents/agent-monitor.ts +416 -0
  396. package/server/agents/alert-integration.ts +312 -0
  397. package/server/agents/error-analyzer.ts +472 -0
  398. package/server/agents/error-detector.ts +442 -0
  399. package/server/agents/fix-generator.ts +421 -0
  400. package/server/agents/fix-validator.ts +428 -0
  401. package/server/agents/merge-policy.ts +362 -0
  402. package/server/agents/pr-workflow.ts +476 -0
  403. package/server/agents/prompts/error-analysis.ts +393 -0
  404. package/server/ai/gemini-client.ts +499 -0
  405. package/server/ai/index.ts +317 -0
  406. package/server/ai/types.ts +137 -0
  407. package/server/app.ts +3693 -0
  408. package/server/archive-manager.ts +604 -0
  409. package/server/backlog/index.ts +7 -0
  410. package/server/backlog/migration.ts +331 -0
  411. package/server/backlog/parser.ts +323 -0
  412. package/server/backlog/sync.ts +325 -0
  413. package/server/change-log.ts +868 -0
  414. package/server/claude-flow/index.ts +12 -0
  415. package/server/claude-flow/prompt-builder.ts +407 -0
  416. package/server/claude-flow/types.ts +33 -0
  417. package/server/cli-adapter/index.ts +11 -0
  418. package/server/cli-adapter/process-manager.ts +612 -0
  419. package/server/cli-adapter/profile-manager.ts +286 -0
  420. package/server/cli-adapter/routes.ts +561 -0
  421. package/server/cli-adapter/types.ts +226 -0
  422. package/server/config.d.ts +18 -0
  423. package/server/config.js +79 -0
  424. package/server/config.ts +262 -0
  425. package/server/flow-sync.ts +543 -0
  426. package/server/git/change-workflow.ts +446 -0
  427. package/server/git/commands.ts +370 -0
  428. package/server/git/github.ts +247 -0
  429. package/server/git/index.ts +1202 -0
  430. package/server/git/status.ts +322 -0
  431. package/server/index.ts +136 -0
  432. package/server/integrations/crypto.ts +142 -0
  433. package/server/integrations/db/client.ts +169 -0
  434. package/server/integrations/db/schema.ts +167 -0
  435. package/server/integrations/env-parser.ts +365 -0
  436. package/server/integrations/index.ts +101 -0
  437. package/server/integrations/keychain.ts +239 -0
  438. package/server/integrations/local/file-utils.ts +383 -0
  439. package/server/integrations/local/index.ts +64 -0
  440. package/server/integrations/local/resolver.ts +439 -0
  441. package/server/integrations/local/types.ts +122 -0
  442. package/server/integrations/routes.ts +1100 -0
  443. package/server/integrations/service-patterns.ts +771 -0
  444. package/server/integrations/services/accounts.ts +356 -0
  445. package/server/integrations/services/env-import.ts +279 -0
  446. package/server/integrations/services/projects.ts +552 -0
  447. package/server/integrations/services/system-import.ts +1110 -0
  448. package/server/migrations/ears-generator.ts +491 -0
  449. package/server/migrations/gherkin-generator.ts +605 -0
  450. package/server/migrations/index.ts +73 -0
  451. package/server/migrations/migrate-spec-format.ts +492 -0
  452. package/server/migrations/openspec-parser.ts +542 -0
  453. package/server/migrations/tag-generator.ts +474 -0
  454. package/server/moai-specs.ts +487 -0
  455. package/server/moai-watcher.ts +145 -0
  456. package/server/parser-debug.ts +37 -0
  457. package/server/parser-utils.ts +316 -0
  458. package/server/parser.d.ts +17 -0
  459. package/server/parser.js +221 -0
  460. package/server/parser.ts +342 -0
  461. package/server/remote-watcher.ts +367 -0
  462. package/server/replay-engine.ts +915 -0
  463. package/server/routes/alerts.ts +1028 -0
  464. package/server/routes/changes.ts +812 -0
  465. package/server/routes/docs.ts +898 -0
  466. package/server/routes/flow.ts +2814 -0
  467. package/server/routes/global-chat.ts +162 -0
  468. package/server/routes/leann.ts +327 -0
  469. package/server/routes/projects.ts +1282 -0
  470. package/server/routes/search.ts +266 -0
  471. package/server/routes/specs.ts +482 -0
  472. package/server/routes/webhooks.ts +579 -0
  473. package/server/server/parser.js +265 -0
  474. package/server/services/githubActionsPoller.ts +797 -0
  475. package/server/services/slackNotifier.ts +476 -0
  476. package/server/src/types/index.js +1 -0
  477. package/server/sync-tasks.ts +741 -0
  478. package/server/tasks/cli/commands.ts +269 -0
  479. package/server/tasks/cli/index.ts +152 -0
  480. package/server/tasks/core/search.ts +81 -0
  481. package/server/tasks/core/task.ts +307 -0
  482. package/server/tasks/db/client.ts +1008 -0
  483. package/server/tasks/db/schema.ts +572 -0
  484. package/server/tasks/index.ts +24 -0
  485. package/server/tasks.db +0 -0
  486. package/server/types/archive.ts +136 -0
  487. package/server/types/change-log.ts +643 -0
  488. package/server/types/spec.ts +188 -0
  489. package/server/unified-spec-scanner.ts +753 -0
  490. package/server/utils/crypto.ts +179 -0
  491. package/server/utils/webhook-verify.ts +216 -0
  492. package/server/watcher.ts +132 -0
  493. package/server/websocket.ts +99 -0
  494. package/server-output.log +6 -0
  495. package/sonar-project.properties +18 -0
  496. package/src/App.tsx +386 -0
  497. package/src/api/client.ts +346 -0
  498. package/src/api/error-interceptor.ts +366 -0
  499. package/src/api/errors.ts +123 -0
  500. package/src/api/flow.ts +233 -0
  501. package/src/api/offline-queue.ts +351 -0
  502. package/src/api/retry-logic.ts +233 -0
  503. package/src/components/OfflineModeBanner.tsx +159 -0
  504. package/src/components/SSEStatusIndicator.tsx +194 -0
  505. package/src/components/agent/AgentChat.tsx +243 -0
  506. package/src/components/agent/AgentPage.tsx +182 -0
  507. package/src/components/agent/AgentSidebar.tsx +231 -0
  508. package/src/components/agent/index.ts +7 -0
  509. package/src/components/alerts/AlertCenter.tsx +239 -0
  510. package/src/components/alerts/AlertDashboard.tsx +211 -0
  511. package/src/components/alerts/AlertDetail.tsx +474 -0
  512. package/src/components/alerts/AlertList.tsx +113 -0
  513. package/src/components/alerts/AlertSettings.tsx +336 -0
  514. package/src/components/alerts/index.ts +5 -0
  515. package/src/components/chat/ChatPanel.tsx +642 -0
  516. package/src/components/chat/index.ts +1 -0
  517. package/src/components/cli/AddCustomCLIDialog.tsx +210 -0
  518. package/src/components/cli/CLISelector.tsx +187 -0
  519. package/src/components/cli/index.ts +8 -0
  520. package/src/components/dashboard/ArchivedChangeList.tsx +102 -0
  521. package/src/components/dashboard/ArchivedChangeViewer.tsx +184 -0
  522. package/src/components/dashboard/ArchivedChangesPage.tsx +31 -0
  523. package/src/components/dashboard/ChangeList.tsx +86 -0
  524. package/src/components/dashboard/ThemeToggle.tsx +33 -0
  525. package/src/components/diagram/DiagramViewer.tsx +256 -0
  526. package/src/components/diagram/MermaidRenderer.tsx +163 -0
  527. package/src/components/diagram/ProjectDiagramTab.tsx +161 -0
  528. package/src/components/diagram/index.ts +13 -0
  529. package/src/components/errors/ErrorBoundary.tsx +276 -0
  530. package/src/components/errors/ErrorFallback.tsx +198 -0
  531. package/src/components/errors/ErrorToast.tsx +221 -0
  532. package/src/components/flow/BacklogView.tsx +1142 -0
  533. package/src/components/flow/ChangeDetail.tsx +475 -0
  534. package/src/components/flow/ChangeItem.tsx +230 -0
  535. package/src/components/flow/ChangeList.tsx +92 -0
  536. package/src/components/flow/ExecutionHistoryDialog.tsx +224 -0
  537. package/src/components/flow/FlowContent.tsx +212 -0
  538. package/src/components/flow/FlowPage.tsx +9 -0
  539. package/src/components/flow/PipelineBar.tsx +214 -0
  540. package/src/components/flow/ProjectDashboard.tsx +222 -0
  541. package/src/components/flow/SpecDetail.tsx +138 -0
  542. package/src/components/flow/SpecDetailTabs.tsx +176 -0
  543. package/src/components/flow/SpecItem.tsx +93 -0
  544. package/src/components/flow/SpecProgressBar.tsx +47 -0
  545. package/src/components/flow/StageContent.tsx +620 -0
  546. package/src/components/flow/StandaloneTasks.tsx +960 -0
  547. package/src/components/flow/TaskExecutionDialog.tsx +1204 -0
  548. package/src/components/flow/index.ts +9 -0
  549. package/src/components/flow/task-execution/AgentSlider.tsx +37 -0
  550. package/src/components/flow/task-execution/ConsensusSettings.tsx +129 -0
  551. package/src/components/flow/task-execution/ExecutionOutput.tsx +398 -0
  552. package/src/components/flow/task-execution/ModelSelector.tsx +134 -0
  553. package/src/components/flow/task-execution/ProviderSelector.tsx +137 -0
  554. package/src/components/flow/task-execution/RecommendationBanner.tsx +71 -0
  555. package/src/components/flow/task-execution/StatusBadge.tsx +43 -0
  556. package/src/components/flow/task-execution/StrategySelector.tsx +48 -0
  557. package/src/components/flow/task-execution/SwarmSummary.tsx +55 -0
  558. package/src/components/flow/task-execution/index.ts +14 -0
  559. package/src/components/flow/task-execution/types.ts +56 -0
  560. package/src/components/git/ChangeWorkflowDialog.tsx +582 -0
  561. package/src/components/git/ConflictResolutionDialog.tsx +398 -0
  562. package/src/components/git/GitBranchSelector.tsx +212 -0
  563. package/src/components/git/GitCommitDialog.tsx +254 -0
  564. package/src/components/git/GitStatusBadge.tsx +148 -0
  565. package/src/components/git/GitSyncButton.tsx +128 -0
  566. package/src/components/git/RemoteStatusBanner.tsx +143 -0
  567. package/src/components/git/index.ts +9 -0
  568. package/src/components/integrations/EnvImportDialog.tsx +524 -0
  569. package/src/components/integrations/EnvironmentDialog.tsx +227 -0
  570. package/src/components/integrations/IntegrationBadges.tsx +91 -0
  571. package/src/components/integrations/IntegrationsSettings.tsx +55 -0
  572. package/src/components/integrations/ProjectIntegrations.tsx +481 -0
  573. package/src/components/integrations/ServiceAccountDialog.tsx +422 -0
  574. package/src/components/integrations/ServiceAccountList.tsx +305 -0
  575. package/src/components/integrations/SystemImportDialog.tsx +436 -0
  576. package/src/components/integrations/TestAccountDialog.tsx +162 -0
  577. package/src/components/integrations/index.ts +6 -0
  578. package/src/components/layout/AppSidebar.tsx +284 -0
  579. package/src/components/layout/FlowSidebar.tsx +435 -0
  580. package/src/components/layout/GlobalCommandPalette.tsx +410 -0
  581. package/src/components/layout/MenuBar.tsx +227 -0
  582. package/src/components/layout/StatusBar.tsx +226 -0
  583. package/src/components/monitoring/ErrorDashboard.tsx +274 -0
  584. package/src/components/monitoring/ErrorDetailPanel.tsx +200 -0
  585. package/src/components/monitoring/ErrorFilters.tsx +219 -0
  586. package/src/components/monitoring/ErrorHistoryList.tsx +141 -0
  587. package/src/components/monitoring/ErrorStats.tsx +249 -0
  588. package/src/components/remote/RemoteFileBrowser.tsx +249 -0
  589. package/src/components/remote/RemoteServerDialog.tsx +234 -0
  590. package/src/components/remote/RemoteServerList.tsx +366 -0
  591. package/src/components/remote/index.ts +7 -0
  592. package/src/components/settings/CLISettings.tsx +522 -0
  593. package/src/components/settings/CustomCLIDialog.tsx +548 -0
  594. package/src/components/settings/IntegrationsSettings.tsx +51 -0
  595. package/src/components/settings/ProjectSettings.tsx +441 -0
  596. package/src/components/settings/ProjectsSettings.tsx +541 -0
  597. package/src/components/settings/SearchSettings.tsx +272 -0
  598. package/src/components/settings/SettingsPage.tsx +68 -0
  599. package/src/components/settings/index.ts +5 -0
  600. package/src/components/swarm/ExecutionPanel.tsx +284 -0
  601. package/src/components/swarm/LogViewer.tsx +196 -0
  602. package/src/components/swarm/ProgressIndicator.tsx +111 -0
  603. package/src/components/swarm/index.ts +3 -0
  604. package/src/components/tasks/ArchiveTable.tsx +203 -0
  605. package/src/components/tasks/KanbanBoard.tsx +264 -0
  606. package/src/components/tasks/TaskCard.tsx +138 -0
  607. package/src/components/tasks/TaskColumn.tsx +81 -0
  608. package/src/components/tasks/TaskDialog.tsx +274 -0
  609. package/src/components/tasks/index.ts +5 -0
  610. package/src/components/tasks/types.ts +43 -0
  611. package/src/components/ui/alert-dialog.tsx +154 -0
  612. package/src/components/ui/alert.tsx +65 -0
  613. package/src/components/ui/badge.tsx +45 -0
  614. package/src/components/ui/button.tsx +58 -0
  615. package/src/components/ui/card.tsx +91 -0
  616. package/src/components/ui/checkbox.tsx +29 -0
  617. package/src/components/ui/collapsible.tsx +31 -0
  618. package/src/components/ui/command.tsx +184 -0
  619. package/src/components/ui/confirm-dialog.tsx +55 -0
  620. package/src/components/ui/dialog.tsx +142 -0
  621. package/src/components/ui/dropdown-menu.tsx +254 -0
  622. package/src/components/ui/input.tsx +20 -0
  623. package/src/components/ui/label.tsx +22 -0
  624. package/src/components/ui/markdown.tsx +100 -0
  625. package/src/components/ui/progress.tsx +27 -0
  626. package/src/components/ui/resizable-sidebar.tsx +156 -0
  627. package/src/components/ui/resizable.tsx +54 -0
  628. package/src/components/ui/right-resizable-sidebar.tsx +158 -0
  629. package/src/components/ui/scroll-area.tsx +64 -0
  630. package/src/components/ui/select.tsx +185 -0
  631. package/src/components/ui/separator.tsx +25 -0
  632. package/src/components/ui/sheet.tsx +136 -0
  633. package/src/components/ui/sidebar.tsx +726 -0
  634. package/src/components/ui/skeleton.tsx +13 -0
  635. package/src/components/ui/slider.tsx +56 -0
  636. package/src/components/ui/switch.tsx +29 -0
  637. package/src/components/ui/table.tsx +113 -0
  638. package/src/components/ui/tabs.tsx +63 -0
  639. package/src/components/ui/textarea.tsx +17 -0
  640. package/src/components/ui/tooltip.tsx +60 -0
  641. package/src/config/api.ts +83 -0
  642. package/src/constants/error-codes.ts +255 -0
  643. package/src/constants/stages.ts +27 -0
  644. package/src/context/ErrorContext.tsx +185 -0
  645. package/src/context/theme-provider.tsx +63 -0
  646. package/src/hooks/use-mobile.tsx +19 -0
  647. package/src/hooks/useAI.ts +206 -0
  648. package/src/hooks/useAgentSession.ts +431 -0
  649. package/src/hooks/useAlerts.ts +935 -0
  650. package/src/hooks/useArchivedChanges.ts +39 -0
  651. package/src/hooks/useAsyncError.ts +45 -0
  652. package/src/hooks/useChangeGit.ts +727 -0
  653. package/src/hooks/useChanges.ts +20 -0
  654. package/src/hooks/useClaude.ts +130 -0
  655. package/src/hooks/useDocs.ts +182 -0
  656. package/src/hooks/useErrorDashboard.ts +243 -0
  657. package/src/hooks/useErrorHandler.ts +150 -0
  658. package/src/hooks/useExecutionHistory.ts +55 -0
  659. package/src/hooks/useFlowChanges.ts +850 -0
  660. package/src/hooks/useFlowItems.ts +205 -0
  661. package/src/hooks/useGit.ts +427 -0
  662. package/src/hooks/useHideCompletedSpecs.ts +15 -0
  663. package/src/hooks/useInstance.ts +40 -0
  664. package/src/hooks/useIntegrations.ts +737 -0
  665. package/src/hooks/useLeannStatus.ts +93 -0
  666. package/src/hooks/useNetworkStatus.ts +167 -0
  667. package/src/hooks/useProjects.ts +353 -0
  668. package/src/hooks/useRemoteServers.ts +383 -0
  669. package/src/hooks/useSSEConnection.ts +346 -0
  670. package/src/hooks/useSpecs.ts +39 -0
  671. package/src/hooks/useSwarm.ts +462 -0
  672. package/src/hooks/useTasks.ts +137 -0
  673. package/src/hooks/useURLSync.ts +122 -0
  674. package/src/hooks/useWebSocket.ts +262 -0
  675. package/src/lib/utils.ts +121 -0
  676. package/src/main.tsx +22 -0
  677. package/src/stores/errorStore.ts +301 -0
  678. package/src/stores/offlineStore.ts +266 -0
  679. package/src/stores/sseStore.ts +247 -0
  680. package/src/stores/useHideCompletedStore.ts +21 -0
  681. package/src/styles/index.css +87 -0
  682. package/src/styles/theme.css +102 -0
  683. package/src/types/ai.ts +191 -0
  684. package/src/types/errors.ts +253 -0
  685. package/src/types/flow.ts +382 -0
  686. package/src/types/index.ts +614 -0
  687. package/src/utils/error-logger.ts +399 -0
  688. package/src/utils/error-statistics.ts +305 -0
  689. package/src/utils/logger.ts +280 -0
  690. package/src/utils/task-routing.ts +795 -0
  691. package/src/vite-env.d.ts +1 -0
  692. package/test-results/.last-run.json +4 -0
  693. package/tmp/check-docker-final.ts +48 -0
  694. package/tmp/check-docker-tasks.ts +58 -0
  695. package/tmp/check-docker-tasks2.ts +48 -0
  696. package/tmp/check-docker-tasks3.ts +42 -0
  697. package/tmp/check-mobile-tasks.ts +57 -0
  698. package/tmp/check-zywiki-tasks.ts +49 -0
  699. package/tmp/sync-mobile.ts +11 -0
  700. package/tmp/sync-zywiki.ts +68 -0
  701. package/tmp/test-docker-parser.ts +15 -0
  702. package/tmp/test-mobile-parser.ts +28 -0
  703. package/tmp/test-parser.ts +27 -0
  704. package/tmp/test-unnumbered.ts +35 -0
  705. package/zyflow.db +0 -0
@@ -0,0 +1,935 @@
1
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
2
+ import type { ApiResponse } from '@/types'
3
+ import { API_ENDPOINTS } from '@/config/api'
4
+
5
+ const API_BASE = API_ENDPOINTS.base
6
+
7
+ // =============================================
8
+ // Alert Types
9
+ // =============================================
10
+
11
+ export type AlertSource = 'github' | 'vercel' | 'sentry' | 'supabase' | 'custom'
12
+ export type AlertSeverity = 'critical' | 'warning' | 'info'
13
+ export type AlertStatus = 'pending' | 'processing' | 'resolved' | 'ignored'
14
+
15
+ export interface AlertMetadata {
16
+ repo?: string
17
+ branch?: string
18
+ commit?: string
19
+ environment?: string
20
+ projectId?: string
21
+ }
22
+
23
+ export interface AlertAnalysis {
24
+ alertId: string
25
+ rootCause?: string
26
+ relatedFiles?: string[]
27
+ suggestedFix?: string
28
+ autoFixable: boolean
29
+ autoFixAction?: 'retry' | 'rollback' | 'patch'
30
+ confidence: number
31
+ similarAlerts?: string[]
32
+ documentation?: string
33
+ analyzedAt: string
34
+ }
35
+
36
+ export interface AlertResolution {
37
+ type: 'auto' | 'manual'
38
+ action: string
39
+ details?: string
40
+ prUrl?: string
41
+ }
42
+
43
+ export interface Alert {
44
+ id: string
45
+ source: AlertSource
46
+ type: string
47
+ severity: AlertSeverity
48
+ status: AlertStatus
49
+ title: string
50
+ summary?: string
51
+ external_url?: string
52
+ payload: string // JSON
53
+ metadata?: string // JSON
54
+ analysis?: string // JSON
55
+ resolution?: string // JSON
56
+ created_at: number
57
+ updated_at: number
58
+ resolved_at?: number
59
+ expires_at: number
60
+ }
61
+
62
+ export interface ActivityLog {
63
+ id: string
64
+ alert_id?: string
65
+ actor: 'system' | 'agent' | 'user'
66
+ action: string
67
+ description: string
68
+ metadata?: string // JSON
69
+ created_at: number
70
+ }
71
+
72
+ export interface WebhookConfig {
73
+ id: string
74
+ source: AlertSource
75
+ name: string
76
+ endpoint: string
77
+ secret?: string
78
+ enabled: boolean
79
+ rules?: string // JSON
80
+ project_ids?: string // JSON
81
+ created_at: number
82
+ updated_at: number
83
+ }
84
+
85
+ export interface NotificationConfig {
86
+ slack: {
87
+ webhookUrl?: string
88
+ channel?: string
89
+ enabled: boolean
90
+ }
91
+ rules: {
92
+ onCritical: boolean
93
+ onAutofix: boolean
94
+ onAll: boolean
95
+ }
96
+ }
97
+
98
+ export interface AlertStats {
99
+ total: number
100
+ bySeverity: Record<AlertSeverity, number>
101
+ bySource: Record<AlertSource, number>
102
+ byStatus: Record<AlertStatus, number>
103
+ }
104
+
105
+ // =============================================
106
+ // Alerts API Hooks
107
+ // =============================================
108
+
109
+ interface AlertsListData {
110
+ alerts: Alert[]
111
+ total: number
112
+ limit: number
113
+ offset: number
114
+ }
115
+
116
+ interface AlertsFilter {
117
+ source?: AlertSource
118
+ severity?: AlertSeverity
119
+ status?: AlertStatus
120
+ projectId?: string
121
+ limit?: number
122
+ offset?: number
123
+ }
124
+
125
+ export function useAlerts(filter?: AlertsFilter) {
126
+ const params = new URLSearchParams()
127
+ if (filter?.projectId) params.set('projectId', filter.projectId)
128
+ if (filter?.source) params.set('source', filter.source)
129
+ if (filter?.severity) params.set('severity', filter.severity)
130
+ if (filter?.status) params.set('status', filter.status)
131
+ if (filter?.limit) params.set('limit', String(filter.limit))
132
+ if (filter?.offset) params.set('offset', String(filter.offset))
133
+
134
+ const queryString = params.toString()
135
+
136
+ return useQuery({
137
+ queryKey: ['alerts', filter],
138
+ queryFn: async (): Promise<AlertsListData> => {
139
+ const url = queryString
140
+ ? `${API_BASE}/alerts?${queryString}`
141
+ : `${API_BASE}/alerts`
142
+ const res = await fetch(url)
143
+ const json: ApiResponse<AlertsListData> = await res.json()
144
+ if (!json.success) throw new Error(json.error)
145
+ return json.data!
146
+ },
147
+ staleTime: 10000, // 10초
148
+ refetchInterval: 30000, // 30초마다 자동 refetch
149
+ })
150
+ }
151
+
152
+ export function useAlert(alertId: string | null) {
153
+ return useQuery({
154
+ queryKey: ['alerts', alertId],
155
+ queryFn: async (): Promise<Alert | null> => {
156
+ if (!alertId) return null
157
+ const res = await fetch(`${API_BASE}/alerts/${alertId}`)
158
+ if (res.status === 404) return null
159
+ const json: ApiResponse<Alert> = await res.json()
160
+ if (!json.success) throw new Error(json.error)
161
+ return json.data ?? null
162
+ },
163
+ enabled: !!alertId,
164
+ })
165
+ }
166
+
167
+ export function useAlertStats(projectId?: string) {
168
+ const params = new URLSearchParams()
169
+ if (projectId) params.set('projectId', projectId)
170
+ const queryString = params.toString()
171
+
172
+ return useQuery({
173
+ queryKey: ['alerts', 'stats', projectId],
174
+ queryFn: async (): Promise<AlertStats> => {
175
+ const url = queryString
176
+ ? `${API_BASE}/alerts/stats?${queryString}`
177
+ : `${API_BASE}/alerts/stats`
178
+ const res = await fetch(url)
179
+ const json: ApiResponse<AlertStats> = await res.json()
180
+ if (!json.success) throw new Error(json.error)
181
+ return json.data!
182
+ },
183
+ staleTime: 10000,
184
+ refetchInterval: 30000,
185
+ })
186
+ }
187
+
188
+ export function useUpdateAlertStatus() {
189
+ const queryClient = useQueryClient()
190
+
191
+ return useMutation({
192
+ mutationFn: async ({ alertId, status }: { alertId: string; status: AlertStatus }) => {
193
+ const res = await fetch(`${API_BASE}/alerts/${alertId}`, {
194
+ method: 'PATCH',
195
+ headers: { 'Content-Type': 'application/json' },
196
+ body: JSON.stringify({ status }),
197
+ })
198
+ const json: ApiResponse<Alert> = await res.json()
199
+ if (!json.success) throw new Error(json.error)
200
+ return json.data!
201
+ },
202
+ onSuccess: (data) => {
203
+ queryClient.invalidateQueries({ queryKey: ['alerts'] })
204
+ queryClient.setQueryData(['alerts', data.id], data)
205
+ },
206
+ })
207
+ }
208
+
209
+ export function useIgnoreAlert() {
210
+ const queryClient = useQueryClient()
211
+
212
+ return useMutation({
213
+ mutationFn: async (alertId: string) => {
214
+ const res = await fetch(`${API_BASE}/alerts/${alertId}/ignore`, {
215
+ method: 'POST',
216
+ })
217
+ const json: ApiResponse<Alert> = await res.json()
218
+ if (!json.success) throw new Error(json.error)
219
+ return json.data!
220
+ },
221
+ onSuccess: (data) => {
222
+ queryClient.invalidateQueries({ queryKey: ['alerts'] })
223
+ queryClient.setQueryData(['alerts', data.id], data)
224
+ },
225
+ })
226
+ }
227
+
228
+ // 수동 분석 트리거
229
+ export function useAnalyzeAlert() {
230
+ const queryClient = useQueryClient()
231
+
232
+ return useMutation({
233
+ mutationFn: async (alertId: string) => {
234
+ const res = await fetch(`${API_BASE}/alerts/${alertId}/analyze`, {
235
+ method: 'POST',
236
+ })
237
+ const json: ApiResponse<{ alert: Alert; analysis: AlertAnalysis }> = await res.json()
238
+ if (!json.success) throw new Error(json.error)
239
+ return json.data!
240
+ },
241
+ onSuccess: (data) => {
242
+ // 개별 알림 캐시 먼저 업데이트
243
+ queryClient.setQueryData(['alerts', data.alert.id], data.alert)
244
+ // 모든 alerts 관련 쿼리 무효화 (리스트 포함)
245
+ queryClient.invalidateQueries({ queryKey: ['alerts'], exact: false })
246
+ },
247
+ })
248
+ }
249
+
250
+ // 전체 처리 워크플로우 트리거
251
+ export function useProcessAlert() {
252
+ const queryClient = useQueryClient()
253
+
254
+ return useMutation({
255
+ mutationFn: async (alertId: string) => {
256
+ const res = await fetch(`${API_BASE}/alerts/${alertId}/process`, {
257
+ method: 'POST',
258
+ })
259
+ const json: ApiResponse<{ alert: Alert; result: ProcessingResult }> = await res.json()
260
+ if (!json.success) throw new Error(json.error)
261
+ return json.data!
262
+ },
263
+ onSuccess: (data) => {
264
+ // 개별 알림 캐시 먼저 업데이트
265
+ queryClient.setQueryData(['alerts', data.alert.id], data.alert)
266
+ // 모든 alerts 관련 쿼리 무효화 (리스트 포함)
267
+ queryClient.invalidateQueries({ queryKey: ['alerts'], exact: false })
268
+ },
269
+ })
270
+ }
271
+
272
+ interface ProcessingResult {
273
+ alertId: string
274
+ analyzed: boolean
275
+ riskLevel?: 'low' | 'medium' | 'high'
276
+ autoFixAttempted: boolean
277
+ autoFixSuccess?: boolean
278
+ notificationSent: boolean
279
+ }
280
+
281
+ interface AgentFixResult {
282
+ success: boolean
283
+ sessionId?: string
284
+ error?: string
285
+ details?: string
286
+ }
287
+
288
+ export interface AgentFixProgress {
289
+ alertId: string
290
+ sessionId: string
291
+ status: 'running' | 'completed' | 'failed'
292
+ startedAt: string
293
+ endedAt?: string
294
+ output: string[]
295
+ error?: string
296
+ }
297
+
298
+ // Agent Fix 진행 상황 조회 (폴링용)
299
+ export function useAgentFixProgress(alertId: string | null, enabled: boolean = true) {
300
+ return useQuery({
301
+ queryKey: ['alerts', 'agent-fix-progress', alertId],
302
+ queryFn: async (): Promise<AgentFixProgress | null> => {
303
+ if (!alertId) return null
304
+ const res = await fetch(`${API_BASE}/alerts/${alertId}/agent-fix/progress`)
305
+ if (res.status === 404) return null
306
+ const json = await res.json() as ApiResponse<AgentFixProgress | { status: 'no_session'; message: string }>
307
+ if (!json.success) {
308
+ // 진행 중인 세션이 없으면 null 반환
309
+ if (json.error?.includes('No active') || json.error?.includes('not found')) {
310
+ return null
311
+ }
312
+ throw new Error(json.error)
313
+ }
314
+ // 세션이 없는 경우 null 반환
315
+ if (json.data && 'status' in json.data && (json.data as { status: string }).status === 'no_session') {
316
+ return null
317
+ }
318
+ return (json.data as AgentFixProgress) ?? null
319
+ },
320
+ enabled: !!alertId && enabled,
321
+ refetchInterval: (query) => {
322
+ // 진행 중일 때만 1초마다 폴링
323
+ if (query.state.data?.status === 'running') return 1000
324
+ return false
325
+ },
326
+ staleTime: 500,
327
+ })
328
+ }
329
+
330
+ // Agent Fix 실행
331
+ export function useAgentFix() {
332
+ const queryClient = useQueryClient()
333
+
334
+ return useMutation({
335
+ mutationFn: async (alertId: string) => {
336
+ const res = await fetch(`${API_BASE}/alerts/${alertId}/agent-fix`, {
337
+ method: 'POST',
338
+ })
339
+ const json: ApiResponse<{ alert: Alert; result: AgentFixResult }> = await res.json()
340
+ if (!json.success) throw new Error(json.error)
341
+ return json.data!
342
+ },
343
+ onSuccess: (data) => {
344
+ // 개별 알림 캐시 먼저 업데이트
345
+ queryClient.setQueryData(['alerts', data.alert.id], data.alert)
346
+ // 모든 alerts 관련 쿼리 무효화 (리스트 포함)
347
+ queryClient.invalidateQueries({ queryKey: ['alerts'], exact: false })
348
+ },
349
+ })
350
+ }
351
+
352
+ // =============================================
353
+ // Activity Logs API Hooks
354
+ // =============================================
355
+
356
+ interface ActivitiesFilter {
357
+ alertId?: string
358
+ actor?: 'system' | 'agent' | 'user'
359
+ limit?: number
360
+ offset?: number
361
+ }
362
+
363
+ export function useActivityLogs(filter?: ActivitiesFilter) {
364
+ const params = new URLSearchParams()
365
+ if (filter?.alertId) params.set('alertId', filter.alertId)
366
+ if (filter?.actor) params.set('actor', filter.actor)
367
+ if (filter?.limit) params.set('limit', String(filter.limit))
368
+ if (filter?.offset) params.set('offset', String(filter.offset))
369
+
370
+ const queryString = params.toString()
371
+
372
+ return useQuery({
373
+ queryKey: ['alerts', 'activities', filter],
374
+ queryFn: async (): Promise<ActivityLog[]> => {
375
+ const url = queryString
376
+ ? `${API_BASE}/alerts/activities?${queryString}`
377
+ : `${API_BASE}/alerts/activities`
378
+ const res = await fetch(url)
379
+ const json: ApiResponse<ActivityLog[]> = await res.json()
380
+ if (!json.success) throw new Error(json.error)
381
+ return json.data ?? []
382
+ },
383
+ staleTime: 10000,
384
+ })
385
+ }
386
+
387
+ // =============================================
388
+ // Webhook Config API Hooks
389
+ // =============================================
390
+
391
+ export function useWebhookConfigs() {
392
+ return useQuery({
393
+ queryKey: ['alerts', 'webhook-configs'],
394
+ queryFn: async (): Promise<WebhookConfig[]> => {
395
+ const res = await fetch(`${API_BASE}/alerts/webhook-configs`)
396
+ const json: ApiResponse<WebhookConfig[]> = await res.json()
397
+ if (!json.success) throw new Error(json.error)
398
+ return json.data ?? []
399
+ },
400
+ })
401
+ }
402
+
403
+ export function useCreateWebhookConfig() {
404
+ const queryClient = useQueryClient()
405
+
406
+ return useMutation({
407
+ mutationFn: async (data: { source: AlertSource; name: string; rules?: object; projectIds?: string[] }) => {
408
+ const res = await fetch(`${API_BASE}/alerts/webhook-configs`, {
409
+ method: 'POST',
410
+ headers: { 'Content-Type': 'application/json' },
411
+ body: JSON.stringify(data),
412
+ })
413
+ const json: ApiResponse<{ id: string; endpoint: string; secret: string }> = await res.json()
414
+ if (!json.success) throw new Error(json.error)
415
+ return json.data!
416
+ },
417
+ onSuccess: () => {
418
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'webhook-configs'] })
419
+ },
420
+ })
421
+ }
422
+
423
+ export function useUpdateWebhookConfig() {
424
+ const queryClient = useQueryClient()
425
+
426
+ return useMutation({
427
+ mutationFn: async ({ configId, ...data }: { configId: string; name?: string; enabled?: boolean; rules?: object; projectIds?: string[] }) => {
428
+ const res = await fetch(`${API_BASE}/alerts/webhook-configs/${configId}`, {
429
+ method: 'PATCH',
430
+ headers: { 'Content-Type': 'application/json' },
431
+ body: JSON.stringify(data),
432
+ })
433
+ const json: ApiResponse<WebhookConfig> = await res.json()
434
+ if (!json.success) throw new Error(json.error)
435
+ return json.data!
436
+ },
437
+ onSuccess: () => {
438
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'webhook-configs'] })
439
+ },
440
+ })
441
+ }
442
+
443
+ export function useDeleteWebhookConfig() {
444
+ const queryClient = useQueryClient()
445
+
446
+ return useMutation({
447
+ mutationFn: async (configId: string) => {
448
+ const res = await fetch(`${API_BASE}/alerts/webhook-configs/${configId}`, {
449
+ method: 'DELETE',
450
+ })
451
+ const json: ApiResponse<void> = await res.json()
452
+ if (!json.success) throw new Error(json.error)
453
+ },
454
+ onSuccess: () => {
455
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'webhook-configs'] })
456
+ },
457
+ })
458
+ }
459
+
460
+ export function useRegenerateWebhookSecret() {
461
+ const queryClient = useQueryClient()
462
+
463
+ return useMutation({
464
+ mutationFn: async (configId: string) => {
465
+ const res = await fetch(`${API_BASE}/alerts/webhook-configs/${configId}/regenerate-secret`, {
466
+ method: 'POST',
467
+ })
468
+ const json: ApiResponse<{ secret: string }> = await res.json()
469
+ if (!json.success) throw new Error(json.error)
470
+ return json.data!
471
+ },
472
+ onSuccess: () => {
473
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'webhook-configs'] })
474
+ },
475
+ })
476
+ }
477
+
478
+ // =============================================
479
+ // Notification Config API Hooks
480
+ // =============================================
481
+
482
+ export function useNotificationConfig() {
483
+ return useQuery({
484
+ queryKey: ['alerts', 'notification-config'],
485
+ queryFn: async (): Promise<NotificationConfig> => {
486
+ const res = await fetch(`${API_BASE}/alerts/notification-config`)
487
+ const json: ApiResponse<NotificationConfig> = await res.json()
488
+ if (!json.success) throw new Error(json.error)
489
+ return json.data!
490
+ },
491
+ })
492
+ }
493
+
494
+ export function useUpdateNotificationConfig() {
495
+ const queryClient = useQueryClient()
496
+
497
+ return useMutation({
498
+ mutationFn: async (data: Partial<NotificationConfig>) => {
499
+ const res = await fetch(`${API_BASE}/alerts/notification-config`, {
500
+ method: 'PATCH',
501
+ headers: { 'Content-Type': 'application/json' },
502
+ body: JSON.stringify(data),
503
+ })
504
+ const json: ApiResponse<void> = await res.json()
505
+ if (!json.success) throw new Error(json.error)
506
+ },
507
+ onSuccess: () => {
508
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'notification-config'] })
509
+ },
510
+ })
511
+ }
512
+
513
+ export function useTestSlackNotification() {
514
+ return useMutation({
515
+ mutationFn: async () => {
516
+ const res = await fetch(`${API_BASE}/alerts/notification-config/test`, {
517
+ method: 'POST',
518
+ })
519
+ const json: ApiResponse<void> = await res.json()
520
+ if (!json.success) throw new Error(json.error)
521
+ },
522
+ })
523
+ }
524
+
525
+ // =============================================
526
+ // Helper Functions
527
+ // =============================================
528
+
529
+ export function parseAlertMetadata(alert: Alert): AlertMetadata | null {
530
+ if (!alert.metadata) return null
531
+ try {
532
+ return JSON.parse(alert.metadata)
533
+ } catch {
534
+ return null
535
+ }
536
+ }
537
+
538
+ export function parseAlertAnalysis(alert: Alert): AlertAnalysis | null {
539
+ if (!alert.analysis) return null
540
+ try {
541
+ return JSON.parse(alert.analysis)
542
+ } catch {
543
+ return null
544
+ }
545
+ }
546
+
547
+ export function parseAlertResolution(alert: Alert): AlertResolution | null {
548
+ if (!alert.resolution) return null
549
+ try {
550
+ return JSON.parse(alert.resolution)
551
+ } catch {
552
+ return null
553
+ }
554
+ }
555
+
556
+ export function formatAlertTime(timestamp: number): string {
557
+ const now = Date.now()
558
+ const diff = now - timestamp
559
+
560
+ if (diff < 60000) return '방금 전'
561
+ if (diff < 3600000) return `${Math.floor(diff / 60000)}분 전`
562
+ if (diff < 86400000) return `${Math.floor(diff / 3600000)}시간 전`
563
+ return `${Math.floor(diff / 86400000)}일 전`
564
+ }
565
+
566
+ export function getSeverityColor(severity: AlertSeverity): string {
567
+ switch (severity) {
568
+ case 'critical':
569
+ return 'text-red-500'
570
+ case 'warning':
571
+ return 'text-yellow-500'
572
+ case 'info':
573
+ return 'text-blue-500'
574
+ default:
575
+ return 'text-gray-500'
576
+ }
577
+ }
578
+
579
+ export function getSeverityBgColor(severity: AlertSeverity): string {
580
+ switch (severity) {
581
+ case 'critical':
582
+ return 'bg-red-500/10'
583
+ case 'warning':
584
+ return 'bg-yellow-500/10'
585
+ case 'info':
586
+ return 'bg-blue-500/10'
587
+ default:
588
+ return 'bg-gray-500/10'
589
+ }
590
+ }
591
+
592
+ export function getSourceIcon(source: AlertSource): string {
593
+ switch (source) {
594
+ case 'github':
595
+ return '🐙'
596
+ case 'vercel':
597
+ return '▲'
598
+ case 'sentry':
599
+ return '🐛'
600
+ case 'supabase':
601
+ return '⚡'
602
+ default:
603
+ return '🔔'
604
+ }
605
+ }
606
+
607
+ export function getStatusBadgeClass(status: AlertStatus): string {
608
+ switch (status) {
609
+ case 'pending':
610
+ return 'bg-yellow-500/20 text-yellow-600'
611
+ case 'processing':
612
+ return 'bg-blue-500/20 text-blue-600'
613
+ case 'resolved':
614
+ return 'bg-green-500/20 text-green-600'
615
+ case 'ignored':
616
+ return 'bg-gray-500/20 text-gray-600'
617
+ default:
618
+ return 'bg-gray-500/20 text-gray-600'
619
+ }
620
+ }
621
+
622
+ // =============================================
623
+ // Phase 3: Dashboard & Advanced Stats Hooks
624
+ // =============================================
625
+
626
+ export interface DashboardStats {
627
+ todayAlerts: number
628
+ pendingAlerts: number
629
+ resolutionRate: number
630
+ autoFixRate: number
631
+ avgResolutionTimeHours: number | null
632
+ criticalToday: number
633
+ weekOverWeekChange: number
634
+ autoFixedCount: number
635
+ manualFixedCount: number
636
+ }
637
+
638
+ export interface TrendData {
639
+ date: string
640
+ totalCount: number
641
+ criticalCount: number
642
+ warningCount: number
643
+ infoCount: number
644
+ resolvedCount: number
645
+ ignoredCount: number
646
+ autoFixedCount: number
647
+ avgResolutionTime?: number
648
+ }
649
+
650
+ export interface AdvancedStats {
651
+ totalAlerts: number
652
+ resolvedAlerts: number
653
+ avgResolutionTime: number
654
+ autoFixRate: number
655
+ topPatterns: AlertPattern[]
656
+ sourceBreakdown: Record<string, number>
657
+ severityBreakdown: Record<string, number>
658
+ resolutionTimeBySource: Record<string, number>
659
+ }
660
+
661
+ export interface AlertPattern {
662
+ id: string
663
+ source: AlertSource
664
+ type: string
665
+ pattern_signature: string
666
+ pattern_keywords?: string
667
+ resolution_count: number
668
+ auto_fix_count: number
669
+ manual_fix_count: number
670
+ avg_resolution_time?: number
671
+ recommended_action?: string
672
+ recommended_fix?: string
673
+ success_rate?: number
674
+ created_at: number
675
+ updated_at: number
676
+ }
677
+
678
+ export interface SimilarAlert {
679
+ id: string
680
+ title: string
681
+ similarity: number
682
+ resolution?: string
683
+ resolvedAt?: number
684
+ }
685
+
686
+ // Dashboard Stats Hook
687
+ export function useDashboardStats() {
688
+ return useQuery({
689
+ queryKey: ['alerts', 'dashboard-stats'],
690
+ queryFn: async (): Promise<DashboardStats> => {
691
+ const res = await fetch(`${API_BASE}/alerts/dashboard-stats`)
692
+ const json: ApiResponse<DashboardStats> = await res.json()
693
+ if (!json.success) throw new Error(json.error)
694
+ return json.data!
695
+ },
696
+ staleTime: 30000, // 30초
697
+ refetchInterval: 60000, // 1분마다 refetch
698
+ })
699
+ }
700
+
701
+ // Trends Hook
702
+ export function useAlertTrends(days: number = 30, source?: AlertSource) {
703
+ return useQuery({
704
+ queryKey: ['alerts', 'trends', { days, source }],
705
+ queryFn: async (): Promise<TrendData[]> => {
706
+ const params = new URLSearchParams({ days: String(days) })
707
+ if (source) params.set('source', source)
708
+
709
+ const res = await fetch(`${API_BASE}/alerts/trends?${params}`)
710
+ const json: ApiResponse<TrendData[]> = await res.json()
711
+ if (!json.success) throw new Error(json.error)
712
+ return json.data ?? []
713
+ },
714
+ staleTime: 60000, // 1분
715
+ })
716
+ }
717
+
718
+ // Advanced Stats Hook
719
+ export function useAdvancedStats() {
720
+ return useQuery({
721
+ queryKey: ['alerts', 'advanced-stats'],
722
+ queryFn: async (): Promise<AdvancedStats> => {
723
+ const res = await fetch(`${API_BASE}/alerts/advanced-stats`)
724
+ const json: ApiResponse<AdvancedStats> = await res.json()
725
+ if (!json.success) throw new Error(json.error)
726
+ return json.data!
727
+ },
728
+ staleTime: 60000, // 1분
729
+ })
730
+ }
731
+
732
+ // Alert Patterns Hook
733
+ export function useAlertPatterns(source?: AlertSource, limit: number = 20) {
734
+ return useQuery({
735
+ queryKey: ['alerts', 'patterns', { source, limit }],
736
+ queryFn: async (): Promise<AlertPattern[]> => {
737
+ const params = new URLSearchParams({ limit: String(limit) })
738
+ if (source) params.set('source', source)
739
+
740
+ const res = await fetch(`${API_BASE}/alerts/patterns?${params}`)
741
+ const json: ApiResponse<AlertPattern[]> = await res.json()
742
+ if (!json.success) throw new Error(json.error)
743
+ return json.data ?? []
744
+ },
745
+ staleTime: 60000, // 1분
746
+ })
747
+ }
748
+
749
+ // Similar Alerts Hook
750
+ export function useSimilarAlerts(alertId: string | null) {
751
+ return useQuery({
752
+ queryKey: ['alerts', 'similar', alertId],
753
+ queryFn: async (): Promise<SimilarAlert[]> => {
754
+ if (!alertId) return []
755
+ const res = await fetch(`${API_BASE}/alerts/similar/${alertId}`)
756
+ const json: ApiResponse<SimilarAlert[]> = await res.json()
757
+ if (!json.success) throw new Error(json.error)
758
+ return json.data ?? []
759
+ },
760
+ enabled: !!alertId,
761
+ })
762
+ }
763
+
764
+ // Create PR Hook
765
+ export function useCreatePR() {
766
+ const queryClient = useQueryClient()
767
+
768
+ return useMutation({
769
+ mutationFn: async ({ alertId, patchContent }: { alertId: string; patchContent?: string }) => {
770
+ const res = await fetch(`${API_BASE}/alerts/${alertId}/create-pr`, {
771
+ method: 'POST',
772
+ headers: { 'Content-Type': 'application/json' },
773
+ body: JSON.stringify({ patchContent }),
774
+ })
775
+ const json: ApiResponse<{ success: boolean; prUrl?: string; prNumber?: number; error?: string }> = await res.json()
776
+ if (!json.success) throw new Error(json.error)
777
+ return json.data!
778
+ },
779
+ onSuccess: (data) => {
780
+ queryClient.invalidateQueries({ queryKey: ['alerts'] })
781
+ if (data.success) {
782
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'dashboard-stats'] })
783
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'patterns'] })
784
+ }
785
+ },
786
+ })
787
+ }
788
+
789
+ // Format time helpers
790
+ export function formatResolutionTime(ms: number | null | undefined): string {
791
+ if (!ms) return '-'
792
+ const hours = ms / 3600000
793
+ if (hours < 1) {
794
+ const minutes = Math.round(ms / 60000)
795
+ return `${minutes}분`
796
+ }
797
+ if (hours < 24) {
798
+ return `${Math.round(hours * 10) / 10}시간`
799
+ }
800
+ const days = Math.round(hours / 24 * 10) / 10
801
+ return `${days}일`
802
+ }
803
+
804
+ export function formatPercentage(value: number | null | undefined): string {
805
+ if (value === null || value === undefined) return '-'
806
+ return `${Math.round(value * 100)}%`
807
+ }
808
+
809
+ export function formatChange(value: number): { text: string; isPositive: boolean } {
810
+ const isPositive = value < 0 // Less alerts is positive
811
+ const text = value === 0 ? '변화 없음' : `${value > 0 ? '+' : ''}${value}%`
812
+ return { text, isPositive }
813
+ }
814
+
815
+ // =============================================
816
+ // GitHub Actions Sync Hooks
817
+ // =============================================
818
+
819
+ export interface GitHubAuthStatus {
820
+ authenticated: boolean
821
+ user?: string
822
+ method?: 'pat' | 'cli'
823
+ error?: string
824
+ }
825
+
826
+ export interface GitHubSyncResult {
827
+ success: boolean
828
+ newAlerts: number
829
+ skipped: number
830
+ errors: string[]
831
+ repo?: string
832
+ }
833
+
834
+ export interface PollerConfig {
835
+ enabled: boolean
836
+ intervalMs: number
837
+ repos: string[]
838
+ lastPolledAt?: number
839
+ isRunning: boolean
840
+ }
841
+
842
+ // Check gh CLI auth status
843
+ export function useGitHubAuthStatus() {
844
+ return useQuery({
845
+ queryKey: ['alerts', 'github', 'auth-status'],
846
+ queryFn: async (): Promise<GitHubAuthStatus> => {
847
+ const res = await fetch(`${API_BASE}/alerts/github/auth-status`)
848
+ const json: ApiResponse<GitHubAuthStatus> = await res.json()
849
+ if (!json.success) throw new Error(json.error)
850
+ return json.data!
851
+ },
852
+ staleTime: 60000, // 1분
853
+ })
854
+ }
855
+
856
+ // Sync GitHub Actions for a repo
857
+ export function useSyncGitHubActions() {
858
+ const queryClient = useQueryClient()
859
+
860
+ return useMutation({
861
+ mutationFn: async ({ repo, limit, projectId }: { repo?: string; limit?: number; projectId?: string } = {}) => {
862
+ const res = await fetch(`${API_BASE}/alerts/github/sync`, {
863
+ method: 'POST',
864
+ headers: { 'Content-Type': 'application/json' },
865
+ body: JSON.stringify({ repo, limit, projectId }),
866
+ })
867
+ const json: ApiResponse<GitHubSyncResult> = await res.json()
868
+ if (!json.success) throw new Error(json.error)
869
+ return json.data!
870
+ },
871
+ onSuccess: () => {
872
+ queryClient.invalidateQueries({ queryKey: ['alerts'] })
873
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'stats'] })
874
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'dashboard-stats'] })
875
+ },
876
+ })
877
+ }
878
+
879
+ // Sync all configured repos
880
+ export function useSyncAllGitHubActions() {
881
+ const queryClient = useQueryClient()
882
+
883
+ return useMutation({
884
+ mutationFn: async ({ repos, projectId }: { repos?: string[]; projectId?: string } = {}) => {
885
+ const res = await fetch(`${API_BASE}/alerts/github/sync-all`, {
886
+ method: 'POST',
887
+ headers: { 'Content-Type': 'application/json' },
888
+ body: JSON.stringify({ repos, projectId }),
889
+ })
890
+ const json: ApiResponse<{ results: GitHubSyncResult[]; totalNew: number; totalSkipped: number }> = await res.json()
891
+ if (!json.success) throw new Error(json.error)
892
+ return json.data!
893
+ },
894
+ onSuccess: () => {
895
+ queryClient.invalidateQueries({ queryKey: ['alerts'] })
896
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'stats'] })
897
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'dashboard-stats'] })
898
+ },
899
+ })
900
+ }
901
+
902
+ // Get poller configuration
903
+ export function usePollerConfig() {
904
+ return useQuery({
905
+ queryKey: ['alerts', 'github', 'poller-config'],
906
+ queryFn: async (): Promise<PollerConfig> => {
907
+ const res = await fetch(`${API_BASE}/alerts/github/poller-config`)
908
+ const json: ApiResponse<PollerConfig> = await res.json()
909
+ if (!json.success) throw new Error(json.error)
910
+ return json.data!
911
+ },
912
+ staleTime: 30000, // 30초
913
+ })
914
+ }
915
+
916
+ // Update poller configuration
917
+ export function useUpdatePollerConfig() {
918
+ const queryClient = useQueryClient()
919
+
920
+ return useMutation({
921
+ mutationFn: async (config: { enabled?: boolean; intervalMs?: number; repos?: string[] }) => {
922
+ const res = await fetch(`${API_BASE}/alerts/github/poller-config`, {
923
+ method: 'PATCH',
924
+ headers: { 'Content-Type': 'application/json' },
925
+ body: JSON.stringify(config),
926
+ })
927
+ const json: ApiResponse<PollerConfig> = await res.json()
928
+ if (!json.success) throw new Error(json.error)
929
+ return json.data!
930
+ },
931
+ onSuccess: () => {
932
+ queryClient.invalidateQueries({ queryKey: ['alerts', 'github', 'poller-config'] })
933
+ },
934
+ })
935
+ }