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,416 @@
1
+ /**
2
+ * Agent Execution Monitoring
3
+ *
4
+ * 에이전트 실행 이력 추적 및 모니터링
5
+ * - 실행 이력 DB 저장
6
+ * - 성공/실패 메트릭
7
+ * - API 비용 추적
8
+ * - 대시보드용 데이터 제공
9
+ */
10
+
11
+ import Database from 'better-sqlite3'
12
+ import { join } from 'path'
13
+ import { homedir } from 'os'
14
+ import type { AutoFixResult } from './error-detector'
15
+
16
+ /**
17
+ * 틸드(~)를 홈 디렉토리로 확장
18
+ * Node.js는 셸과 달리 ~를 자동으로 확장하지 않음
19
+ */
20
+ function expandTilde(path: string): string {
21
+ if (path.startsWith('~')) {
22
+ return path.replace(/^~/, homedir())
23
+ }
24
+ return path
25
+ }
26
+
27
+ // DB 경로 (기존 tasks.db와 동일 위치)
28
+ function getDbPath(): string {
29
+ const dataDir = process.env.DATA_DIR
30
+ if (dataDir) {
31
+ return join(expandTilde(dataDir), 'agent-monitor.db')
32
+ }
33
+ return join(homedir(), '.zyflow', 'agent-monitor.db')
34
+ }
35
+
36
+ let db: Database.Database | null = null
37
+
38
+ /**
39
+ * DB 초기화
40
+ */
41
+ function getDb(): Database.Database {
42
+ if (!db) {
43
+ db = new Database(getDbPath())
44
+ initSchema()
45
+ }
46
+ return db
47
+ }
48
+
49
+ /**
50
+ * 스키마 초기화
51
+ */
52
+ function initSchema(): void {
53
+ const database = db!
54
+
55
+ database.exec(`
56
+ CREATE TABLE IF NOT EXISTS agent_runs (
57
+ id TEXT PRIMARY KEY,
58
+ alert_id TEXT NOT NULL,
59
+ source TEXT NOT NULL,
60
+ started_at TEXT NOT NULL,
61
+ completed_at TEXT,
62
+ duration_ms INTEGER,
63
+ success INTEGER NOT NULL DEFAULT 0,
64
+ error TEXT,
65
+ errors_found INTEGER DEFAULT 0,
66
+ errors_fixed INTEGER DEFAULT 0,
67
+ files_changed INTEGER DEFAULT 0,
68
+ confidence REAL DEFAULT 0,
69
+ pr_number INTEGER,
70
+ pr_url TEXT,
71
+ auto_merged INTEGER DEFAULT 0,
72
+
73
+ -- AI 비용 추적
74
+ prompt_tokens INTEGER DEFAULT 0,
75
+ completion_tokens INTEGER DEFAULT 0,
76
+ estimated_cost REAL DEFAULT 0
77
+ );
78
+
79
+ CREATE INDEX IF NOT EXISTS idx_agent_runs_alert ON agent_runs(alert_id);
80
+ CREATE INDEX IF NOT EXISTS idx_agent_runs_started ON agent_runs(started_at);
81
+ CREATE INDEX IF NOT EXISTS idx_agent_runs_success ON agent_runs(success);
82
+
83
+ CREATE TABLE IF NOT EXISTS agent_metrics (
84
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
85
+ metric_date TEXT NOT NULL,
86
+ total_runs INTEGER DEFAULT 0,
87
+ successful_runs INTEGER DEFAULT 0,
88
+ failed_runs INTEGER DEFAULT 0,
89
+ total_errors_found INTEGER DEFAULT 0,
90
+ total_errors_fixed INTEGER DEFAULT 0,
91
+ total_prs_created INTEGER DEFAULT 0,
92
+ total_auto_merged INTEGER DEFAULT 0,
93
+ avg_duration_ms INTEGER DEFAULT 0,
94
+ total_prompt_tokens INTEGER DEFAULT 0,
95
+ total_completion_tokens INTEGER DEFAULT 0,
96
+ total_estimated_cost REAL DEFAULT 0,
97
+
98
+ UNIQUE(metric_date)
99
+ );
100
+ `)
101
+ }
102
+
103
+ export interface AgentRun {
104
+ id: string
105
+ alertId: string
106
+ source: string
107
+ startedAt: string
108
+ completedAt?: string
109
+ durationMs?: number
110
+ success: boolean
111
+ error?: string
112
+ errorsFound: number
113
+ errorsFixed: number
114
+ filesChanged: number
115
+ confidence: number
116
+ prNumber?: number
117
+ prUrl?: string
118
+ autoMerged: boolean
119
+ promptTokens: number
120
+ completionTokens: number
121
+ estimatedCost: number
122
+ }
123
+
124
+ export interface DailyMetrics {
125
+ date: string
126
+ totalRuns: number
127
+ successfulRuns: number
128
+ failedRuns: number
129
+ successRate: number
130
+ totalErrorsFound: number
131
+ totalErrorsFixed: number
132
+ fixRate: number
133
+ totalPRsCreated: number
134
+ totalAutoMerged: number
135
+ avgDurationMs: number
136
+ totalPromptTokens: number
137
+ totalCompletionTokens: number
138
+ totalEstimatedCost: number
139
+ }
140
+
141
+ /**
142
+ * 실행 시작 기록
143
+ */
144
+ export function startRun(alertId: string, source: string): string {
145
+ const database = getDb()
146
+ const id = `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`
147
+
148
+ database.prepare(`
149
+ INSERT INTO agent_runs (id, alert_id, source, started_at, success)
150
+ VALUES (?, ?, ?, ?, 0)
151
+ `).run(id, alertId, source, new Date().toISOString())
152
+
153
+ return id
154
+ }
155
+
156
+ /**
157
+ * 실행 완료 기록
158
+ */
159
+ export function completeRun(runId: string, result: AutoFixResult): void {
160
+ const database = getDb()
161
+
162
+ const prNumber = result.workflowResult?.finalPR?.number
163
+ const prUrl = result.workflowResult?.finalPR?.url
164
+
165
+ database.prepare(`
166
+ UPDATE agent_runs SET
167
+ completed_at = ?,
168
+ duration_ms = ?,
169
+ success = ?,
170
+ error = ?,
171
+ errors_found = ?,
172
+ errors_fixed = ?,
173
+ files_changed = ?,
174
+ confidence = ?,
175
+ pr_number = ?,
176
+ pr_url = ?,
177
+ auto_merged = ?
178
+ WHERE id = ?
179
+ `).run(
180
+ new Date().toISOString(),
181
+ result.duration,
182
+ result.success ? 1 : 0,
183
+ result.error || null,
184
+ result.analysis?.summary.total || 0,
185
+ result.fixResult?.metadata.fixedCount || 0,
186
+ result.fixResult?.changes.length || 0,
187
+ result.fixResult?.metadata.confidence || 0,
188
+ prNumber || null,
189
+ prUrl || null,
190
+ result.mergeDecision?.shouldMerge ? 1 : 0,
191
+ runId
192
+ )
193
+
194
+ // 일별 메트릭 업데이트
195
+ updateDailyMetrics(result)
196
+ }
197
+
198
+ /**
199
+ * 일별 메트릭 업데이트
200
+ */
201
+ function updateDailyMetrics(result: AutoFixResult): void {
202
+ const database = getDb()
203
+ const today = new Date().toISOString().split('T')[0]
204
+
205
+ // UPSERT
206
+ database.prepare(`
207
+ INSERT INTO agent_metrics (
208
+ metric_date, total_runs, successful_runs, failed_runs,
209
+ total_errors_found, total_errors_fixed, total_prs_created,
210
+ total_auto_merged, avg_duration_ms
211
+ ) VALUES (?, 1, ?, ?, ?, ?, ?, ?, ?)
212
+ ON CONFLICT(metric_date) DO UPDATE SET
213
+ total_runs = total_runs + 1,
214
+ successful_runs = successful_runs + ?,
215
+ failed_runs = failed_runs + ?,
216
+ total_errors_found = total_errors_found + ?,
217
+ total_errors_fixed = total_errors_fixed + ?,
218
+ total_prs_created = total_prs_created + ?,
219
+ total_auto_merged = total_auto_merged + ?
220
+ `).run(
221
+ today,
222
+ result.success ? 1 : 0,
223
+ result.success ? 0 : 1,
224
+ result.analysis?.summary.total || 0,
225
+ result.fixResult?.metadata.fixedCount || 0,
226
+ result.workflowResult?.finalPR ? 1 : 0,
227
+ result.mergeDecision?.shouldMerge ? 1 : 0,
228
+ result.duration,
229
+ // ON CONFLICT 부분
230
+ result.success ? 1 : 0,
231
+ result.success ? 0 : 1,
232
+ result.analysis?.summary.total || 0,
233
+ result.fixResult?.metadata.fixedCount || 0,
234
+ result.workflowResult?.finalPR ? 1 : 0,
235
+ result.mergeDecision?.shouldMerge ? 1 : 0
236
+ )
237
+ }
238
+
239
+ /**
240
+ * AI 비용 기록
241
+ */
242
+ export function recordAICost(runId: string, promptTokens: number, completionTokens: number): void {
243
+ const database = getDb()
244
+
245
+ // Gemini 2.0 Flash 가격 (예상)
246
+ // Input: $0.075 per 1M tokens
247
+ // Output: $0.30 per 1M tokens
248
+ const estimatedCost = (promptTokens * 0.000000075) + (completionTokens * 0.0000003)
249
+
250
+ database.prepare(`
251
+ UPDATE agent_runs SET
252
+ prompt_tokens = prompt_tokens + ?,
253
+ completion_tokens = completion_tokens + ?,
254
+ estimated_cost = estimated_cost + ?
255
+ WHERE id = ?
256
+ `).run(promptTokens, completionTokens, estimatedCost, runId)
257
+
258
+ // 일별 메트릭도 업데이트
259
+ const today = new Date().toISOString().split('T')[0]
260
+ database.prepare(`
261
+ UPDATE agent_metrics SET
262
+ total_prompt_tokens = total_prompt_tokens + ?,
263
+ total_completion_tokens = total_completion_tokens + ?,
264
+ total_estimated_cost = total_estimated_cost + ?
265
+ WHERE metric_date = ?
266
+ `).run(promptTokens, completionTokens, estimatedCost, today)
267
+ }
268
+
269
+ /**
270
+ * 최근 실행 조회
271
+ */
272
+ export function getRecentRuns(limit = 20): AgentRun[] {
273
+ const database = getDb()
274
+
275
+ const rows = database.prepare(`
276
+ SELECT * FROM agent_runs
277
+ ORDER BY started_at DESC
278
+ LIMIT ?
279
+ `).all(limit) as Array<Record<string, unknown>>
280
+
281
+ return rows.map(rowToAgentRun)
282
+ }
283
+
284
+ /**
285
+ * 특정 알림의 실행 이력 조회
286
+ */
287
+ export function getRunsByAlert(alertId: string): AgentRun[] {
288
+ const database = getDb()
289
+
290
+ const rows = database.prepare(`
291
+ SELECT * FROM agent_runs
292
+ WHERE alert_id = ?
293
+ ORDER BY started_at DESC
294
+ `).all(alertId) as Array<Record<string, unknown>>
295
+
296
+ return rows.map(rowToAgentRun)
297
+ }
298
+
299
+ /**
300
+ * 일별 메트릭 조회
301
+ */
302
+ export function getDailyMetrics(days = 30): DailyMetrics[] {
303
+ const database = getDb()
304
+
305
+ const rows = database.prepare(`
306
+ SELECT * FROM agent_metrics
307
+ ORDER BY metric_date DESC
308
+ LIMIT ?
309
+ `).all(days) as Array<Record<string, unknown>>
310
+
311
+ return rows.map((row) => ({
312
+ date: row.metric_date as string,
313
+ totalRuns: row.total_runs as number,
314
+ successfulRuns: row.successful_runs as number,
315
+ failedRuns: row.failed_runs as number,
316
+ successRate: (row.total_runs as number) > 0
317
+ ? (row.successful_runs as number) / (row.total_runs as number)
318
+ : 0,
319
+ totalErrorsFound: row.total_errors_found as number,
320
+ totalErrorsFixed: row.total_errors_fixed as number,
321
+ fixRate: (row.total_errors_found as number) > 0
322
+ ? (row.total_errors_fixed as number) / (row.total_errors_found as number)
323
+ : 0,
324
+ totalPRsCreated: row.total_prs_created as number,
325
+ totalAutoMerged: row.total_auto_merged as number,
326
+ avgDurationMs: row.avg_duration_ms as number,
327
+ totalPromptTokens: row.total_prompt_tokens as number,
328
+ totalCompletionTokens: row.total_completion_tokens as number,
329
+ totalEstimatedCost: row.total_estimated_cost as number,
330
+ }))
331
+ }
332
+
333
+ /**
334
+ * 전체 통계
335
+ */
336
+ export function getOverallStats(): {
337
+ totalRuns: number
338
+ successRate: number
339
+ totalErrorsFound: number
340
+ totalErrorsFixed: number
341
+ fixRate: number
342
+ totalPRsCreated: number
343
+ autoMergeRate: number
344
+ avgDurationMs: number
345
+ totalCost: number
346
+ } {
347
+ const database = getDb()
348
+
349
+ const stats = database.prepare(`
350
+ SELECT
351
+ COUNT(*) as total_runs,
352
+ SUM(success) as successful_runs,
353
+ SUM(errors_found) as total_errors_found,
354
+ SUM(errors_fixed) as total_errors_fixed,
355
+ SUM(CASE WHEN pr_number IS NOT NULL THEN 1 ELSE 0 END) as total_prs,
356
+ SUM(auto_merged) as total_auto_merged,
357
+ AVG(duration_ms) as avg_duration,
358
+ SUM(estimated_cost) as total_cost
359
+ FROM agent_runs
360
+ `).get() as Record<string, unknown>
361
+
362
+ const totalRuns = (stats.total_runs as number) || 0
363
+ const successfulRuns = (stats.successful_runs as number) || 0
364
+ const totalErrorsFound = (stats.total_errors_found as number) || 0
365
+ const totalErrorsFixed = (stats.total_errors_fixed as number) || 0
366
+ const totalPRs = (stats.total_prs as number) || 0
367
+ const totalAutoMerged = (stats.total_auto_merged as number) || 0
368
+
369
+ return {
370
+ totalRuns,
371
+ successRate: totalRuns > 0 ? successfulRuns / totalRuns : 0,
372
+ totalErrorsFound,
373
+ totalErrorsFixed,
374
+ fixRate: totalErrorsFound > 0 ? totalErrorsFixed / totalErrorsFound : 0,
375
+ totalPRsCreated: totalPRs,
376
+ autoMergeRate: totalPRs > 0 ? totalAutoMerged / totalPRs : 0,
377
+ avgDurationMs: (stats.avg_duration as number) || 0,
378
+ totalCost: (stats.total_cost as number) || 0,
379
+ }
380
+ }
381
+
382
+ /**
383
+ * DB 행을 AgentRun으로 변환
384
+ */
385
+ function rowToAgentRun(row: Record<string, unknown>): AgentRun {
386
+ return {
387
+ id: row.id as string,
388
+ alertId: row.alert_id as string,
389
+ source: row.source as string,
390
+ startedAt: row.started_at as string,
391
+ completedAt: row.completed_at as string | undefined,
392
+ durationMs: row.duration_ms as number | undefined,
393
+ success: Boolean(row.success),
394
+ error: row.error as string | undefined,
395
+ errorsFound: row.errors_found as number,
396
+ errorsFixed: row.errors_fixed as number,
397
+ filesChanged: row.files_changed as number,
398
+ confidence: row.confidence as number,
399
+ prNumber: row.pr_number as number | undefined,
400
+ prUrl: row.pr_url as string | undefined,
401
+ autoMerged: Boolean(row.auto_merged),
402
+ promptTokens: row.prompt_tokens as number,
403
+ completionTokens: row.completion_tokens as number,
404
+ estimatedCost: row.estimated_cost as number,
405
+ }
406
+ }
407
+
408
+ /**
409
+ * DB 연결 종료
410
+ */
411
+ export function closeDb(): void {
412
+ if (db) {
413
+ db.close()
414
+ db = null
415
+ }
416
+ }
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Alert-Agent Integration
3
+ *
4
+ * 알림 시스템과 자동 수정 에이전트 연결
5
+ * - 알림 처리기 확장
6
+ * - 심각도 기반 자동 트리거
7
+ * - 상태 업데이트 플로우
8
+ * - 활동 로깅
9
+ */
10
+
11
+ import { triggerAutoFix, summarizeAutoFix, type AlertData, type AutoFixResult, type AutoFixOptions } from './error-detector'
12
+
13
+ // Alert 타입 정의 (routes/alerts.ts와 동일 구조)
14
+ export interface Alert {
15
+ id: string
16
+ project_id: string
17
+ source: 'github' | 'vercel' | 'sentry' | 'supabase' | 'custom'
18
+ severity: 'critical' | 'high' | 'medium' | 'low'
19
+ status: 'new' | 'in_progress' | 'resolved' | 'ignored'
20
+ title: string
21
+ message?: string
22
+ metadata?: Record<string, unknown>
23
+ data?: Record<string, unknown> // Raw webhook payload
24
+ created_at: number
25
+ updated_at: number
26
+ }
27
+
28
+ export interface AgentConfig {
29
+ enabled: boolean
30
+ githubToken: string
31
+ triggerOnSeverity: ('critical' | 'high' | 'medium')[]
32
+ autoMergeEnabled: boolean
33
+ dryRunMode: boolean
34
+ maxConcurrentRuns: number
35
+ }
36
+
37
+ // 기본 설정
38
+ const DEFAULT_CONFIG: AgentConfig = {
39
+ enabled: true,
40
+ githubToken: process.env.GITHUB_TOKEN || '',
41
+ triggerOnSeverity: ['critical', 'high'],
42
+ autoMergeEnabled: true,
43
+ dryRunMode: false,
44
+ maxConcurrentRuns: 3,
45
+ }
46
+
47
+ // 현재 실행 중인 작업 추적
48
+ const runningJobs = new Map<string, Promise<AutoFixResult>>()
49
+
50
+ // 실행 이력
51
+ const executionHistory: Array<{
52
+ alertId: string
53
+ result: AutoFixResult
54
+ timestamp: string
55
+ }> = []
56
+
57
+ /**
58
+ * 알림 처리 후 자동 수정 트리거
59
+ */
60
+ export async function processAlertForAutoFix(
61
+ alert: Alert,
62
+ projectPath: string,
63
+ repository?: { owner: string; repo: string; branch: string },
64
+ config: Partial<AgentConfig> = {}
65
+ ): Promise<AutoFixResult | null> {
66
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config }
67
+
68
+ // 에이전트 비활성화 체크
69
+ if (!mergedConfig.enabled) {
70
+ console.log(`[Agent] Disabled, skipping alert ${alert.id}`)
71
+ return null
72
+ }
73
+
74
+ // GitHub 토큰 체크
75
+ if (!mergedConfig.githubToken) {
76
+ console.log(`[Agent] No GitHub token configured, skipping alert ${alert.id}`)
77
+ return null
78
+ }
79
+
80
+ // 심각도 체크
81
+ if (!mergedConfig.triggerOnSeverity.includes(alert.severity as 'critical' | 'high' | 'medium')) {
82
+ console.log(`[Agent] Severity ${alert.severity} not in trigger list, skipping alert ${alert.id}`)
83
+ return null
84
+ }
85
+
86
+ // 동시 실행 제한 체크
87
+ if (runningJobs.size >= mergedConfig.maxConcurrentRuns) {
88
+ console.log(`[Agent] Max concurrent runs reached (${runningJobs.size}), queueing alert ${alert.id}`)
89
+ // TODO: 큐에 추가
90
+ return null
91
+ }
92
+
93
+ // 이미 실행 중인지 체크
94
+ if (runningJobs.has(alert.id)) {
95
+ console.log(`[Agent] Already processing alert ${alert.id}`)
96
+ return null
97
+ }
98
+
99
+ // 알림 데이터 변환
100
+ const alertData: AlertData = {
101
+ id: alert.id,
102
+ source: alert.source as AlertData['source'],
103
+ subtype: extractSubtype(alert),
104
+ title: alert.title,
105
+ rawPayload: alert.data || alert.metadata || {},
106
+ projectPath,
107
+ projectId: alert.project_id || 'default',
108
+ projectName: alert.project_id, // For Slack notification routing
109
+ repository,
110
+ }
111
+
112
+ // 옵션 설정
113
+ const options: AutoFixOptions = {
114
+ dryRun: mergedConfig.dryRunMode,
115
+ skipValidation: false,
116
+ forceManual: !mergedConfig.autoMergeEnabled,
117
+ maxErrors: 10,
118
+ }
119
+
120
+ // 자동 수정 실행
121
+ console.log(`[Agent] Starting auto-fix for alert ${alert.id}`)
122
+ const job = triggerAutoFix(alertData, mergedConfig.githubToken, options)
123
+ runningJobs.set(alert.id, job)
124
+
125
+ try {
126
+ const result = await job
127
+
128
+ // 이력 저장
129
+ executionHistory.push({
130
+ alertId: alert.id,
131
+ result,
132
+ timestamp: new Date().toISOString(),
133
+ })
134
+
135
+ // 이력 크기 제한 (최근 100개만 유지)
136
+ while (executionHistory.length > 100) {
137
+ executionHistory.shift()
138
+ }
139
+
140
+ console.log(`[Agent] Completed: ${summarizeAutoFix(result)}`)
141
+ return result
142
+ } finally {
143
+ runningJobs.delete(alert.id)
144
+ }
145
+ }
146
+
147
+ /**
148
+ * 알림에서 subtype 추출
149
+ */
150
+ function extractSubtype(alert: Alert): string | undefined {
151
+ const data = alert.data as Record<string, unknown> | undefined
152
+
153
+ if (alert.source === 'supabase' && data?.type) {
154
+ return String(data.type)
155
+ }
156
+
157
+ if (alert.source === 'github' && data?.action) {
158
+ return String(data.action)
159
+ }
160
+
161
+ return undefined
162
+ }
163
+
164
+ /**
165
+ * 현재 실행 중인 작업 조회
166
+ */
167
+ export function getRunningJobs(): string[] {
168
+ return Array.from(runningJobs.keys())
169
+ }
170
+
171
+ /**
172
+ * 실행 이력 조회
173
+ */
174
+ export function getExecutionHistory(limit = 20): typeof executionHistory {
175
+ return executionHistory.slice(-limit)
176
+ }
177
+
178
+ /**
179
+ * 에이전트 통계
180
+ */
181
+ export function getAgentStats(): {
182
+ running: number
183
+ completed: number
184
+ successful: number
185
+ failed: number
186
+ averageDuration: number
187
+ } {
188
+ const completed = executionHistory.length
189
+ const successful = executionHistory.filter((e) => e.result.success).length
190
+ const failed = completed - successful
191
+ const totalDuration = executionHistory.reduce((sum, e) => sum + e.result.duration, 0)
192
+
193
+ return {
194
+ running: runningJobs.size,
195
+ completed,
196
+ successful,
197
+ failed,
198
+ averageDuration: completed > 0 ? Math.round(totalDuration / completed) : 0,
199
+ }
200
+ }
201
+
202
+ /**
203
+ * 수동 트리거
204
+ */
205
+ export async function manualTrigger(
206
+ alertId: string,
207
+ projectPath: string,
208
+ repository: { owner: string; repo: string; branch: string },
209
+ config: Partial<AgentConfig> = {}
210
+ ): Promise<AutoFixResult> {
211
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config }
212
+
213
+ const alertData: AlertData = {
214
+ id: alertId,
215
+ source: 'github', // 기본값
216
+ title: 'Manual trigger',
217
+ rawPayload: {},
218
+ projectPath,
219
+ projectId: 'manual',
220
+ repository,
221
+ }
222
+
223
+ return triggerAutoFix(alertData, mergedConfig.githubToken, {
224
+ dryRun: mergedConfig.dryRunMode,
225
+ forceManual: !mergedConfig.autoMergeEnabled,
226
+ })
227
+ }
228
+
229
+ /**
230
+ * Webhook에서 자동 수정 트리거 (Express 라우터용)
231
+ */
232
+ export async function handleWebhookForAutoFix(
233
+ source: AlertData['source'],
234
+ payload: unknown,
235
+ projectPath: string,
236
+ repository: { owner: string; repo: string; branch: string },
237
+ githubToken: string
238
+ ): Promise<AutoFixResult | null> {
239
+ // 알림 ID 생성
240
+ const alertId = `${source}-${Date.now()}`
241
+
242
+ const alertData: AlertData = {
243
+ id: alertId,
244
+ source,
245
+ title: extractTitle(source, payload as Record<string, unknown>),
246
+ rawPayload: payload,
247
+ projectPath,
248
+ projectId: repository.repo,
249
+ repository,
250
+ }
251
+
252
+ // 심각도 확인 (webhook에서는 항상 트리거)
253
+ return triggerAutoFix(alertData, githubToken, {
254
+ dryRun: false,
255
+ forceManual: false,
256
+ maxErrors: 10,
257
+ })
258
+ }
259
+
260
+ /**
261
+ * Payload에서 제목 추출
262
+ */
263
+ function extractTitle(source: AlertData['source'], payload: Record<string, unknown>): string {
264
+ switch (source) {
265
+ case 'github':
266
+ if (payload.workflow_run) {
267
+ const run = payload.workflow_run as Record<string, unknown>
268
+ return `GitHub Actions: ${run.name} - ${run.conclusion}`
269
+ }
270
+ return 'GitHub Actions failure'
271
+
272
+ case 'vercel':
273
+ if (payload.deployment) {
274
+ const deployment = payload.deployment as Record<string, unknown>
275
+ return `Vercel: ${deployment.name} - ${deployment.state}`
276
+ }
277
+ return 'Vercel build failure'
278
+
279
+ case 'sentry':
280
+ return String(payload.title || 'Sentry issue')
281
+
282
+ case 'supabase':
283
+ return String(payload.message || 'Supabase alert')
284
+
285
+ default:
286
+ return 'Unknown alert'
287
+ }
288
+ }
289
+
290
+ /**
291
+ * 에이전트 상태 요약
292
+ */
293
+ export function getAgentStatusSummary(): string {
294
+ const stats = getAgentStats()
295
+ const running = getRunningJobs()
296
+
297
+ const lines = [
298
+ '=== Auto-Fix Agent Status ===',
299
+ `Running: ${stats.running}`,
300
+ `Completed: ${stats.completed}`,
301
+ `Success Rate: ${stats.completed > 0 ? ((stats.successful / stats.completed) * 100).toFixed(1) : 0}%`,
302
+ `Avg Duration: ${stats.averageDuration}ms`,
303
+ ]
304
+
305
+ if (running.length > 0) {
306
+ lines.push('')
307
+ lines.push('Currently Processing:')
308
+ running.forEach((id) => lines.push(` - ${id}`))
309
+ }
310
+
311
+ return lines.join('\n')
312
+ }