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,1110 @@
1
+ /**
2
+ * 시스템 설정 Import 서비스
3
+ * Git Config, gh CLI, AWS credentials, GCloud 등에서 서비스 계정 정보를 가져옴
4
+ */
5
+
6
+ import { execSync } from 'child_process';
7
+ import { readFile, access, readdir } from 'fs/promises';
8
+ import { homedir } from 'os';
9
+ import { join } from 'path';
10
+ import { createServiceAccount, listServiceAccounts } from './accounts.js';
11
+ import type { ServiceType } from '../db/schema.js';
12
+ import { maskCredentialValue, type ExtendedServiceType, type EnvironmentHint } from '../service-patterns.js';
13
+
14
+ // =============================================
15
+ // 타입 정의
16
+ // =============================================
17
+
18
+ export interface SystemSource {
19
+ id: string;
20
+ name: string;
21
+ description: string;
22
+ icon: string;
23
+ available: boolean;
24
+ error?: string;
25
+ }
26
+
27
+ export interface DetectedSystemService {
28
+ type: ExtendedServiceType;
29
+ displayName: string;
30
+ source: string; // 'git-config', 'gh-cli', 'aws-credentials', 'gcloud', etc.
31
+ credentials: Record<string, string>; // 마스킹된 값
32
+ rawCredentials: Record<string, string>; // 원본 값 (내부용)
33
+ isComplete: boolean;
34
+ missingRequired: string[];
35
+ environment?: EnvironmentHint;
36
+ existingAccount?: {
37
+ id: string;
38
+ name: string;
39
+ };
40
+ }
41
+
42
+ export interface SystemScanResult {
43
+ sources: SystemSource[];
44
+ services: Omit<DetectedSystemService, 'rawCredentials'>[];
45
+ }
46
+
47
+ // 내부용 (rawCredentials 포함)
48
+ interface InternalScanResult {
49
+ sources: SystemSource[];
50
+ services: DetectedSystemService[];
51
+ }
52
+
53
+ // =============================================
54
+ // Git Config 스캔
55
+ // =============================================
56
+
57
+ interface GitConfigResult {
58
+ userName?: string;
59
+ userEmail?: string;
60
+ githubUsername?: string; // Remote URL에서 추출한 GitHub 사용자명
61
+ remoteUrl?: string;
62
+ scope: 'global' | 'local';
63
+ }
64
+
65
+ /**
66
+ * Git remote URL에서 GitHub 사용자명 추출
67
+ * 지원 형식:
68
+ * - git@github.com:username/repo.git
69
+ * - https://github.com/username/repo.git
70
+ * - https://username@github.com/username/repo.git
71
+ * - ssh://git@github.com/username/repo.git
72
+ */
73
+ function extractGitHubUsernameFromUrl(url: string): string | undefined {
74
+ if (!url) return undefined;
75
+
76
+ // SSH 형식: git@github.com:username/repo.git
77
+ const sshMatch = url.match(/git@github\.com:([^/]+)\//);
78
+ if (sshMatch) return sshMatch[1];
79
+
80
+ // SSH 형식 (ssh:// 프로토콜): ssh://git@github.com/username/repo.git
81
+ const sshProtocolMatch = url.match(/ssh:\/\/git@github\.com\/([^/]+)\//);
82
+ if (sshProtocolMatch) return sshProtocolMatch[1];
83
+
84
+ // HTTPS 형식 (인증 포함): https://username@github.com/...
85
+ const httpsAuthMatch = url.match(/https:\/\/([^@]+)@github\.com\//);
86
+ if (httpsAuthMatch) return httpsAuthMatch[1];
87
+
88
+ // HTTPS 형식: https://github.com/username/repo.git
89
+ const httpsMatch = url.match(/https:\/\/github\.com\/([^/]+)\//);
90
+ if (httpsMatch) return httpsMatch[1];
91
+
92
+ return undefined;
93
+ }
94
+
95
+ /**
96
+ * .git/config 파일에서 remote URL 파싱
97
+ */
98
+ async function parseGitConfigFile(gitConfigPath: string): Promise<{ remoteUrl?: string; githubUsername?: string }> {
99
+ try {
100
+ const content = await readFile(gitConfigPath, 'utf-8');
101
+
102
+ // [remote "origin"] 섹션에서 url 찾기
103
+ // eslint-disable-next-line no-useless-escape
104
+ const remoteMatch = content.match(/\[remote\s+"origin"\][^\[]*url\s*=\s*(.+)/m);
105
+ if (remoteMatch) {
106
+ const remoteUrl = remoteMatch[1].trim();
107
+ const githubUsername = extractGitHubUsernameFromUrl(remoteUrl);
108
+ return { remoteUrl, githubUsername };
109
+ }
110
+
111
+ // origin이 없으면 첫 번째 remote 사용
112
+ // eslint-disable-next-line no-useless-escape
113
+ const anyRemoteMatch = content.match(/\[remote\s+"[^"]+"\][^\[]*url\s*=\s*(.+)/m);
114
+ if (anyRemoteMatch) {
115
+ const remoteUrl = anyRemoteMatch[1].trim();
116
+ const githubUsername = extractGitHubUsernameFromUrl(remoteUrl);
117
+ return { remoteUrl, githubUsername };
118
+ }
119
+ } catch {
120
+ // 파일 읽기 실패
121
+ }
122
+
123
+ return {};
124
+ }
125
+
126
+ async function scanGitConfig(projectPath?: string): Promise<GitConfigResult | null> {
127
+ try {
128
+ // Global config
129
+ let userName: string | undefined;
130
+ let userEmail: string | undefined;
131
+ let githubUsername: string | undefined;
132
+ let remoteUrl: string | undefined;
133
+ let scope: 'global' | 'local' = 'global';
134
+
135
+ try {
136
+ userName = execSync('git config --global user.name', { encoding: 'utf-8' }).trim();
137
+ } catch {
138
+ // Not set
139
+ }
140
+
141
+ try {
142
+ userEmail = execSync('git config --global user.email', { encoding: 'utf-8' }).trim();
143
+ } catch {
144
+ // Not set
145
+ }
146
+
147
+ // Local config (if projectPath provided)
148
+ if (projectPath) {
149
+ try {
150
+ const localName = execSync('git config --local user.name', {
151
+ cwd: projectPath,
152
+ encoding: 'utf-8',
153
+ }).trim();
154
+ if (localName) {
155
+ userName = localName;
156
+ scope = 'local';
157
+ }
158
+ } catch {
159
+ // Not set or not a git repo
160
+ }
161
+
162
+ try {
163
+ const localEmail = execSync('git config --local user.email', {
164
+ cwd: projectPath,
165
+ encoding: 'utf-8',
166
+ }).trim();
167
+ if (localEmail) {
168
+ userEmail = localEmail;
169
+ scope = 'local';
170
+ }
171
+ } catch {
172
+ // Not set
173
+ }
174
+
175
+ // .git/config에서 remote URL 파싱하여 GitHub 사용자명 추출
176
+ const gitConfigPath = join(projectPath, '.git', 'config');
177
+ const { remoteUrl: parsedUrl, githubUsername: parsedUsername } = await parseGitConfigFile(gitConfigPath);
178
+ if (parsedUrl) {
179
+ remoteUrl = parsedUrl;
180
+ scope = 'local';
181
+ }
182
+ if (parsedUsername) {
183
+ githubUsername = parsedUsername;
184
+ }
185
+ }
186
+
187
+ // Global .gitconfig에서도 remote URL 추출 시도 (credential 관련)
188
+ if (!githubUsername) {
189
+ try {
190
+ // Git credential helper에서 저장된 username 시도
191
+ const credentialOutput = execSync('git config --global credential.https://github.com.username 2>/dev/null', {
192
+ encoding: 'utf-8',
193
+ }).trim();
194
+ if (credentialOutput) {
195
+ githubUsername = credentialOutput;
196
+ }
197
+ } catch {
198
+ // Not set
199
+ }
200
+ }
201
+
202
+ if (userName || userEmail || githubUsername) {
203
+ return { userName, userEmail, githubUsername, remoteUrl, scope };
204
+ }
205
+
206
+ return null;
207
+ } catch {
208
+ return null;
209
+ }
210
+ }
211
+
212
+ // =============================================
213
+ // gh CLI 스캔
214
+ // =============================================
215
+
216
+ interface GhCliResult {
217
+ authenticated: boolean;
218
+ user?: string;
219
+ token?: string;
220
+ scopes?: string[];
221
+ }
222
+
223
+ async function scanGhCli(): Promise<GhCliResult> {
224
+ try {
225
+ // Check if gh is installed and authenticated
226
+ const statusOutput = execSync('gh auth status 2>&1', { encoding: 'utf-8' });
227
+
228
+ // Extract username from output
229
+ const userMatch = statusOutput.match(/Logged in to github\.com account (\S+)/i) ||
230
+ statusOutput.match(/Logged in to github\.com as (\S+)/i);
231
+ const user = userMatch?.[1];
232
+
233
+ // Get token
234
+ let token: string | undefined;
235
+ try {
236
+ token = execSync('gh auth token', { encoding: 'utf-8' }).trim();
237
+ } catch {
238
+ // Token retrieval failed
239
+ }
240
+
241
+ // Get scopes
242
+ let scopes: string[] = [];
243
+ try {
244
+ const scopesOutput = execSync('gh auth status --show-token 2>&1', { encoding: 'utf-8' });
245
+ const scopeMatch = scopesOutput.match(/Token scopes: (.+)/);
246
+ if (scopeMatch) {
247
+ scopes = scopeMatch[1].split(',').map(s => s.trim());
248
+ }
249
+ } catch {
250
+ // Scopes not available
251
+ }
252
+
253
+ return {
254
+ authenticated: !!token,
255
+ user,
256
+ token,
257
+ scopes,
258
+ };
259
+ } catch {
260
+ return { authenticated: false };
261
+ }
262
+ }
263
+
264
+ // =============================================
265
+ // AWS Credentials 스캔
266
+ // =============================================
267
+
268
+ interface AwsCredentials {
269
+ profile: string;
270
+ accessKeyId?: string;
271
+ secretAccessKey?: string;
272
+ region?: string;
273
+ }
274
+
275
+ async function scanAwsCredentials(): Promise<AwsCredentials[]> {
276
+ const credentials: AwsCredentials[] = [];
277
+ const home = homedir();
278
+ const awsDir = join(home, '.aws');
279
+
280
+ try {
281
+ await access(awsDir);
282
+ } catch {
283
+ return credentials;
284
+ }
285
+
286
+ // Parse credentials file
287
+ try {
288
+ const credentialsPath = join(awsDir, 'credentials');
289
+ const content = await readFile(credentialsPath, 'utf-8');
290
+
291
+ let currentProfile = '';
292
+ const profiles: Map<string, AwsCredentials> = new Map();
293
+
294
+ for (const line of content.split('\n')) {
295
+ const trimmed = line.trim();
296
+
297
+ // Profile header
298
+ const profileMatch = trimmed.match(/^\[(.+)\]$/);
299
+ if (profileMatch) {
300
+ currentProfile = profileMatch[1];
301
+ profiles.set(currentProfile, { profile: currentProfile });
302
+ continue;
303
+ }
304
+
305
+ // Key-value pairs
306
+ if (currentProfile && trimmed.includes('=')) {
307
+ const [key, ...valueParts] = trimmed.split('=');
308
+ const value = valueParts.join('=').trim();
309
+ const profile = profiles.get(currentProfile);
310
+
311
+ if (profile) {
312
+ const keyLower = key.trim().toLowerCase();
313
+ if (keyLower === 'aws_access_key_id') {
314
+ profile.accessKeyId = value;
315
+ } else if (keyLower === 'aws_secret_access_key') {
316
+ profile.secretAccessKey = value;
317
+ }
318
+ }
319
+ }
320
+ }
321
+
322
+ credentials.push(...profiles.values());
323
+ } catch {
324
+ // Credentials file not found or unreadable
325
+ }
326
+
327
+ // Parse config file for regions
328
+ try {
329
+ const configPath = join(awsDir, 'config');
330
+ const content = await readFile(configPath, 'utf-8');
331
+
332
+ let currentProfile = '';
333
+
334
+ for (const line of content.split('\n')) {
335
+ const trimmed = line.trim();
336
+
337
+ // Profile header (format: [profile xxx] or [default])
338
+ const profileMatch = trimmed.match(/^\[(?:profile\s+)?(.+)\]$/);
339
+ if (profileMatch) {
340
+ currentProfile = profileMatch[1];
341
+ continue;
342
+ }
343
+
344
+ // Region
345
+ if (currentProfile && trimmed.startsWith('region')) {
346
+ const [, value] = trimmed.split('=');
347
+ const existing = credentials.find(c => c.profile === currentProfile);
348
+ if (existing) {
349
+ existing.region = value?.trim();
350
+ }
351
+ }
352
+ }
353
+ } catch {
354
+ // Config file not found
355
+ }
356
+
357
+ return credentials.filter(c => c.accessKeyId && c.secretAccessKey);
358
+ }
359
+
360
+ // =============================================
361
+ // GCloud 설정 스캔
362
+ // =============================================
363
+
364
+ interface GCloudConfig {
365
+ account?: string;
366
+ project?: string;
367
+ region?: string;
368
+ }
369
+
370
+ async function scanGCloudConfig(): Promise<GCloudConfig | null> {
371
+ try {
372
+ // Check if gcloud is installed
373
+ execSync('which gcloud', { encoding: 'utf-8' });
374
+
375
+ const config: GCloudConfig = {};
376
+
377
+ // Get current configuration
378
+ try {
379
+ const accountOutput = execSync('gcloud config get-value account 2>/dev/null', {
380
+ encoding: 'utf-8',
381
+ }).trim();
382
+ if (accountOutput && accountOutput !== '(unset)') {
383
+ config.account = accountOutput;
384
+ }
385
+ } catch {
386
+ // Not set
387
+ }
388
+
389
+ try {
390
+ const projectOutput = execSync('gcloud config get-value project 2>/dev/null', {
391
+ encoding: 'utf-8',
392
+ }).trim();
393
+ if (projectOutput && projectOutput !== '(unset)') {
394
+ config.project = projectOutput;
395
+ }
396
+ } catch {
397
+ // Not set
398
+ }
399
+
400
+ try {
401
+ const regionOutput = execSync('gcloud config get-value compute/region 2>/dev/null', {
402
+ encoding: 'utf-8',
403
+ }).trim();
404
+ if (regionOutput && regionOutput !== '(unset)') {
405
+ config.region = regionOutput;
406
+ }
407
+ } catch {
408
+ // Not set
409
+ }
410
+
411
+ if (config.account || config.project) {
412
+ return config;
413
+ }
414
+
415
+ return null;
416
+ } catch {
417
+ return null;
418
+ }
419
+ }
420
+
421
+ // =============================================
422
+ // Azure CLI 스캔
423
+ // =============================================
424
+
425
+ interface AzureConfig {
426
+ subscriptionId?: string;
427
+ subscriptionName?: string;
428
+ tenantId?: string;
429
+ userName?: string;
430
+ }
431
+
432
+ async function scanAzureCli(): Promise<AzureConfig | null> {
433
+ try {
434
+ // Check if az is installed and logged in
435
+ const accountOutput = execSync('az account show 2>/dev/null', {
436
+ encoding: 'utf-8',
437
+ });
438
+
439
+ const account = JSON.parse(accountOutput);
440
+
441
+ return {
442
+ subscriptionId: account.id,
443
+ subscriptionName: account.name,
444
+ tenantId: account.tenantId,
445
+ userName: account.user?.name,
446
+ };
447
+ } catch {
448
+ return null;
449
+ }
450
+ }
451
+
452
+ // =============================================
453
+ // npm/yarn 설정 스캔
454
+ // =============================================
455
+
456
+ interface NpmConfig {
457
+ registry?: string;
458
+ authToken?: string;
459
+ }
460
+
461
+ async function scanNpmConfig(): Promise<NpmConfig | null> {
462
+ const home = homedir();
463
+
464
+ try {
465
+ // Check .npmrc
466
+ const npmrcPath = join(home, '.npmrc');
467
+ const content = await readFile(npmrcPath, 'utf-8');
468
+
469
+ const config: NpmConfig = {};
470
+
471
+ for (const line of content.split('\n')) {
472
+ const trimmed = line.trim();
473
+ if (trimmed.startsWith('registry=')) {
474
+ config.registry = trimmed.split('=')[1];
475
+ }
476
+ if (trimmed.includes(':_authToken=')) {
477
+ config.authToken = trimmed.split(':_authToken=')[1];
478
+ }
479
+ }
480
+
481
+ if (config.registry || config.authToken) {
482
+ return config;
483
+ }
484
+ } catch {
485
+ // .npmrc not found
486
+ }
487
+
488
+ return null;
489
+ }
490
+
491
+ // =============================================
492
+ // Docker Hub 스캔
493
+ // =============================================
494
+
495
+ interface DockerConfig {
496
+ username?: string;
497
+ hasCredentials: boolean;
498
+ }
499
+
500
+ async function scanDockerConfig(): Promise<DockerConfig | null> {
501
+ const home = homedir();
502
+
503
+ try {
504
+ const configPath = join(home, '.docker', 'config.json');
505
+ const content = await readFile(configPath, 'utf-8');
506
+ const config = JSON.parse(content);
507
+
508
+ // Check for docker hub credentials
509
+ const auths = config.auths || {};
510
+ const dockerHubAuth = auths['https://index.docker.io/v1/'] || auths['docker.io'];
511
+
512
+ if (dockerHubAuth) {
513
+ // Try to decode username from auth (base64 encoded username:password)
514
+ let username: string | undefined;
515
+ if (dockerHubAuth.auth) {
516
+ try {
517
+ const decoded = Buffer.from(dockerHubAuth.auth, 'base64').toString('utf-8');
518
+ username = decoded.split(':')[0];
519
+ } catch {
520
+ // Decode failed
521
+ }
522
+ }
523
+
524
+ return {
525
+ username,
526
+ hasCredentials: true,
527
+ };
528
+ }
529
+ } catch {
530
+ // Docker config not found
531
+ }
532
+
533
+ return null;
534
+ }
535
+
536
+ // =============================================
537
+ // 전역 .env 파일 스캔
538
+ // =============================================
539
+
540
+ interface GlobalEnvResult {
541
+ files: string[];
542
+ variables: Map<string, { value: string; source: string }>;
543
+ }
544
+
545
+ // 전역 .env 파일 경로들
546
+ const GLOBAL_ENV_PATHS = [
547
+ '.env',
548
+ '.env.local',
549
+ '.env.global',
550
+ '.env.secrets',
551
+ '.secrets',
552
+ '.credentials',
553
+ ];
554
+
555
+ // 알려진 서비스 키 패턴
556
+ const SERVICE_KEY_PATTERNS: Record<string, { type: ExtendedServiceType; keys: string[] }> = {
557
+ github: {
558
+ type: 'github',
559
+ keys: ['GITHUB_TOKEN', 'GITHUB_ACCESS_TOKEN', 'GH_TOKEN', 'GITHUB_API_TOKEN', 'GITHUB_PAT', 'GITHUB_PERSONAL_ACCESS_TOKEN'],
560
+ },
561
+ supabase: {
562
+ type: 'supabase',
563
+ keys: ['SUPABASE_URL', 'SUPABASE_KEY', 'SUPABASE_ANON_KEY', 'SUPABASE_SERVICE_KEY', 'SUPABASE_SERVICE_ROLE_KEY'],
564
+ },
565
+ vercel: {
566
+ type: 'vercel',
567
+ keys: ['VERCEL_TOKEN', 'VERCEL_API_TOKEN', 'VERCEL_ACCESS_TOKEN'],
568
+ },
569
+ openai: {
570
+ type: 'openai',
571
+ keys: ['OPENAI_API_KEY', 'OPENAI_KEY'],
572
+ },
573
+ anthropic: {
574
+ type: 'anthropic',
575
+ keys: ['ANTHROPIC_API_KEY', 'CLAUDE_API_KEY'],
576
+ },
577
+ aws: {
578
+ type: 'aws',
579
+ keys: ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_REGION'],
580
+ },
581
+ stripe: {
582
+ type: 'stripe',
583
+ keys: ['STRIPE_SECRET_KEY', 'STRIPE_PUBLISHABLE_KEY', 'STRIPE_API_KEY'],
584
+ },
585
+ sentry: {
586
+ type: 'sentry',
587
+ keys: ['SENTRY_DSN', 'SENTRY_AUTH_TOKEN'],
588
+ },
589
+ };
590
+
591
+ async function scanGlobalEnvFiles(): Promise<GlobalEnvResult> {
592
+ const home = homedir();
593
+ const foundFiles: string[] = [];
594
+ const variables = new Map<string, { value: string; source: string }>();
595
+
596
+ for (const envFile of GLOBAL_ENV_PATHS) {
597
+ const filePath = join(home, envFile);
598
+ try {
599
+ const content = await readFile(filePath, 'utf-8');
600
+ foundFiles.push(envFile);
601
+
602
+ // 파싱
603
+ for (const line of content.split('\n')) {
604
+ const trimmed = line.trim();
605
+
606
+ // 주석이나 빈 줄 무시
607
+ if (!trimmed || trimmed.startsWith('#')) continue;
608
+
609
+ // key=value 파싱
610
+ const eqIndex = trimmed.indexOf('=');
611
+ if (eqIndex > 0) {
612
+ const key = trimmed.substring(0, eqIndex).trim();
613
+ let value = trimmed.substring(eqIndex + 1).trim();
614
+
615
+ // 따옴표 제거
616
+ if ((value.startsWith('"') && value.endsWith('"')) ||
617
+ (value.startsWith("'") && value.endsWith("'"))) {
618
+ value = value.slice(1, -1);
619
+ }
620
+
621
+ if (key && value) {
622
+ variables.set(key, { value, source: envFile });
623
+ }
624
+ }
625
+ }
626
+ } catch {
627
+ // 파일 없음
628
+ }
629
+ }
630
+
631
+ return { files: foundFiles, variables };
632
+ }
633
+
634
+ /**
635
+ * 전역 .env에서 서비스 감지
636
+ */
637
+ function detectServicesFromEnv(
638
+ variables: Map<string, { value: string; source: string }>
639
+ ): Array<{
640
+ type: ExtendedServiceType;
641
+ displayName: string;
642
+ credentials: Record<string, string>;
643
+ source: string;
644
+ }> {
645
+ const detected: Array<{
646
+ type: ExtendedServiceType;
647
+ displayName: string;
648
+ credentials: Record<string, string>;
649
+ source: string;
650
+ }> = [];
651
+
652
+ for (const [serviceName, config] of Object.entries(SERVICE_KEY_PATTERNS)) {
653
+ const foundCreds: Record<string, string> = {};
654
+ let source = '';
655
+
656
+ for (const key of config.keys) {
657
+ const variable = variables.get(key);
658
+ if (variable) {
659
+ // 키 이름을 간소화 (예: GITHUB_TOKEN -> token)
660
+ const simplifiedKey = key
661
+ .replace(new RegExp(`^${serviceName.toUpperCase()}_`, 'i'), '')
662
+ .toLowerCase()
663
+ .replace(/_/g, '');
664
+ foundCreds[simplifiedKey] = variable.value;
665
+ source = variable.source;
666
+ }
667
+ }
668
+
669
+ if (Object.keys(foundCreds).length > 0) {
670
+ detected.push({
671
+ type: config.type,
672
+ displayName: `${serviceName.charAt(0).toUpperCase() + serviceName.slice(1)} (from ~/${source})`,
673
+ credentials: foundCreds,
674
+ source: `global-env:${source}`,
675
+ });
676
+ }
677
+ }
678
+
679
+ return detected;
680
+ }
681
+
682
+ // =============================================
683
+ // 메인 스캔 함수
684
+ // =============================================
685
+
686
+ /**
687
+ * 시스템 설정에서 사용 가능한 서비스 감지
688
+ */
689
+ export async function scanSystemSources(projectPath?: string): Promise<InternalScanResult> {
690
+ const sources: SystemSource[] = [];
691
+ const services: DetectedSystemService[] = [];
692
+
693
+ // 1. Git Config
694
+ const gitConfig = await scanGitConfig(projectPath);
695
+ sources.push({
696
+ id: 'git-config',
697
+ name: 'Git Config',
698
+ description: gitConfig
699
+ ? `${gitConfig.scope === 'local' ? 'Local' : 'Global'}: ${gitConfig.userName || '(no name)'}`
700
+ : 'Git user configuration',
701
+ icon: 'git-branch',
702
+ available: !!gitConfig,
703
+ });
704
+
705
+ // 1.5 Git Remote (로컬 .git/config에서 GitHub 사용자명 추출)
706
+ if (gitConfig?.githubUsername && gitConfig.remoteUrl) {
707
+ sources.push({
708
+ id: 'git-remote',
709
+ name: 'Git Remote',
710
+ description: `GitHub: ${gitConfig.githubUsername}`,
711
+ icon: 'github',
712
+ available: true,
713
+ });
714
+ }
715
+
716
+ // 2. gh CLI
717
+ const ghCli = await scanGhCli();
718
+ sources.push({
719
+ id: 'gh-cli',
720
+ name: 'GitHub CLI',
721
+ description: ghCli.authenticated
722
+ ? `Authenticated as ${ghCli.user || 'unknown'}`
723
+ : 'Not authenticated',
724
+ icon: 'github',
725
+ available: ghCli.authenticated,
726
+ error: !ghCli.authenticated ? 'Run `gh auth login` to authenticate' : undefined,
727
+ });
728
+
729
+ // GitHub 서비스 생성 (gh CLI + git config + git remote 결합)
730
+ if (ghCli.authenticated && ghCli.token) {
731
+ const githubCredentials: Record<string, string> = {
732
+ token: ghCli.token,
733
+ };
734
+
735
+ // 우선순위: gh CLI user > git remote username > git config username
736
+ if (ghCli.user) {
737
+ githubCredentials.username = ghCli.user;
738
+ } else if (gitConfig?.githubUsername) {
739
+ githubCredentials.username = gitConfig.githubUsername;
740
+ } else if (gitConfig?.userName) {
741
+ githubCredentials.username = gitConfig.userName;
742
+ }
743
+
744
+ if (gitConfig?.userEmail) {
745
+ githubCredentials.email = gitConfig.userEmail;
746
+ }
747
+
748
+ const existingAccounts = await listServiceAccounts('github');
749
+ const existing = existingAccounts.find(a => a.credentials.username === githubCredentials.username);
750
+
751
+ services.push({
752
+ type: 'github',
753
+ displayName: 'GitHub',
754
+ source: 'gh-cli',
755
+ credentials: Object.fromEntries(
756
+ Object.entries(githubCredentials).map(([k, v]) => [k, maskCredentialValue(v)])
757
+ ),
758
+ rawCredentials: githubCredentials,
759
+ isComplete: !!(githubCredentials.token && githubCredentials.username),
760
+ missingRequired: [],
761
+ existingAccount: existing ? { id: existing.id, name: existing.name } : undefined,
762
+ });
763
+ } else if (gitConfig?.githubUsername) {
764
+ // .git/config remote URL에서 추출한 GitHub 사용자명 (토큰 없음)
765
+ const githubCredentials: Record<string, string> = {
766
+ username: gitConfig.githubUsername,
767
+ };
768
+ if (gitConfig.userEmail) githubCredentials.email = gitConfig.userEmail;
769
+ if (gitConfig.remoteUrl) githubCredentials.remoteUrl = gitConfig.remoteUrl;
770
+
771
+ services.push({
772
+ type: 'github',
773
+ displayName: `GitHub (${gitConfig.githubUsername})`,
774
+ source: 'git-remote',
775
+ credentials: Object.fromEntries(
776
+ Object.entries(githubCredentials).map(([k, v]) => [k, maskCredentialValue(v)])
777
+ ),
778
+ rawCredentials: githubCredentials,
779
+ isComplete: false,
780
+ missingRequired: ['token'],
781
+ });
782
+ } else if (gitConfig?.userName) {
783
+ // Git config만 있는 경우 (토큰 없음)
784
+ const githubCredentials: Record<string, string> = {};
785
+ if (gitConfig.userName) githubCredentials.username = gitConfig.userName;
786
+ if (gitConfig.userEmail) githubCredentials.email = gitConfig.userEmail;
787
+
788
+ services.push({
789
+ type: 'github',
790
+ displayName: 'GitHub (from Git Config)',
791
+ source: 'git-config',
792
+ credentials: Object.fromEntries(
793
+ Object.entries(githubCredentials).map(([k, v]) => [k, maskCredentialValue(v)])
794
+ ),
795
+ rawCredentials: githubCredentials,
796
+ isComplete: false,
797
+ missingRequired: ['token'],
798
+ });
799
+ }
800
+
801
+ // 3. AWS Credentials
802
+ const awsCredentials = await scanAwsCredentials();
803
+ sources.push({
804
+ id: 'aws-credentials',
805
+ name: 'AWS Credentials',
806
+ description: awsCredentials.length > 0
807
+ ? `${awsCredentials.length} profile(s) found`
808
+ : 'No profiles configured',
809
+ icon: 'cloud',
810
+ available: awsCredentials.length > 0,
811
+ });
812
+
813
+ for (const aws of awsCredentials) {
814
+ if (aws.accessKeyId && aws.secretAccessKey) {
815
+ const awsCreds: Record<string, string> = {
816
+ accessKeyId: aws.accessKeyId,
817
+ secretAccessKey: aws.secretAccessKey,
818
+ };
819
+ if (aws.region) awsCreds.region = aws.region;
820
+
821
+ const existingAccounts = await listServiceAccounts('custom');
822
+ const existing = existingAccounts.find(
823
+ a => a.metadata?.originalType === 'aws' && a.credentials.accessKeyId === maskCredentialValue(aws.accessKeyId!)
824
+ );
825
+
826
+ services.push({
827
+ type: 'aws',
828
+ displayName: `AWS (${aws.profile})`,
829
+ source: 'aws-credentials',
830
+ credentials: Object.fromEntries(
831
+ Object.entries(awsCreds).map(([k, v]) => [k, maskCredentialValue(v)])
832
+ ),
833
+ rawCredentials: awsCreds,
834
+ isComplete: true,
835
+ missingRequired: [],
836
+ existingAccount: existing ? { id: existing.id, name: existing.name } : undefined,
837
+ });
838
+ }
839
+ }
840
+
841
+ // 4. GCloud
842
+ const gcloudConfig = await scanGCloudConfig();
843
+ sources.push({
844
+ id: 'gcloud',
845
+ name: 'Google Cloud SDK',
846
+ description: gcloudConfig?.account
847
+ ? `Account: ${gcloudConfig.account}`
848
+ : 'Not configured',
849
+ icon: 'cloud',
850
+ available: !!gcloudConfig?.project,
851
+ });
852
+
853
+ if (gcloudConfig?.project) {
854
+ const gcpCreds: Record<string, string> = {
855
+ projectId: gcloudConfig.project,
856
+ };
857
+ if (gcloudConfig.region) gcpCreds.region = gcloudConfig.region;
858
+
859
+ services.push({
860
+ type: 'gcp',
861
+ displayName: 'Google Cloud',
862
+ source: 'gcloud',
863
+ credentials: gcpCreds,
864
+ rawCredentials: gcpCreds,
865
+ isComplete: true,
866
+ missingRequired: [],
867
+ });
868
+ }
869
+
870
+ // 5. Azure CLI
871
+ const azureConfig = await scanAzureCli();
872
+ sources.push({
873
+ id: 'azure-cli',
874
+ name: 'Azure CLI',
875
+ description: azureConfig?.subscriptionName
876
+ ? `Subscription: ${azureConfig.subscriptionName}`
877
+ : 'Not logged in',
878
+ icon: 'cloud',
879
+ available: !!azureConfig,
880
+ });
881
+
882
+ if (azureConfig?.subscriptionId) {
883
+ const azureCreds: Record<string, string> = {
884
+ subscriptionId: azureConfig.subscriptionId,
885
+ };
886
+ if (azureConfig.tenantId) azureCreds.tenantId = azureConfig.tenantId;
887
+
888
+ services.push({
889
+ type: 'azure',
890
+ displayName: 'Azure',
891
+ source: 'azure-cli',
892
+ credentials: azureCreds,
893
+ rawCredentials: azureCreds,
894
+ isComplete: true,
895
+ missingRequired: [],
896
+ });
897
+ }
898
+
899
+ // 6. Docker Hub
900
+ const dockerConfig = await scanDockerConfig();
901
+ sources.push({
902
+ id: 'docker',
903
+ name: 'Docker Hub',
904
+ description: dockerConfig?.username
905
+ ? `Logged in as ${dockerConfig.username}`
906
+ : 'Not logged in',
907
+ icon: 'package',
908
+ available: !!dockerConfig?.hasCredentials,
909
+ });
910
+
911
+ // 7. 전역 .env 파일
912
+ const globalEnv = await scanGlobalEnvFiles();
913
+ if (globalEnv.files.length > 0) {
914
+ sources.push({
915
+ id: 'global-env',
916
+ name: 'Global .env',
917
+ description: `~/${globalEnv.files.join(', ~/')}`,
918
+ icon: 'file-text',
919
+ available: true,
920
+ });
921
+
922
+ // 전역 .env에서 서비스 감지
923
+ const envServices = detectServicesFromEnv(globalEnv.variables);
924
+ for (const envService of envServices) {
925
+ // 이미 같은 타입의 서비스가 있는지 확인 (중복 방지)
926
+ const existingService = services.find(s => s.type === envService.type);
927
+ if (!existingService) {
928
+ services.push({
929
+ type: envService.type,
930
+ displayName: envService.displayName,
931
+ source: envService.source,
932
+ credentials: Object.fromEntries(
933
+ Object.entries(envService.credentials).map(([k, v]) => [k, maskCredentialValue(v)])
934
+ ),
935
+ rawCredentials: envService.credentials,
936
+ isComplete: true,
937
+ missingRequired: [],
938
+ });
939
+ }
940
+ }
941
+ }
942
+
943
+ return { sources, services };
944
+ }
945
+
946
+ /**
947
+ * 시스템 설정 스캔 (API용 - rawCredentials 제외)
948
+ */
949
+ export async function scanSystemSourcesForApi(projectPath?: string): Promise<SystemScanResult> {
950
+ const result = await scanSystemSources(projectPath);
951
+
952
+ return {
953
+ sources: result.sources,
954
+ services: result.services.map(({ rawCredentials, ...rest }) => rest),
955
+ };
956
+ }
957
+
958
+ // 스캔 결과 캐시
959
+ const systemScanCache = new Map<string, InternalScanResult>();
960
+
961
+ /**
962
+ * 스캔 결과 캐시 저장
963
+ */
964
+ export async function scanAndCacheSystemSources(projectPath?: string): Promise<SystemScanResult> {
965
+ const result = await scanSystemSources(projectPath);
966
+ const cacheKey = projectPath || '__global__';
967
+ systemScanCache.set(cacheKey, result);
968
+
969
+ return {
970
+ sources: result.sources,
971
+ services: result.services.map(({ rawCredentials, ...rest }) => rest),
972
+ };
973
+ }
974
+
975
+ // =============================================
976
+ // Import 함수
977
+ // =============================================
978
+
979
+ export interface SystemImportRequest {
980
+ services: Array<{
981
+ type: ExtendedServiceType;
982
+ source: string;
983
+ name: string;
984
+ }>;
985
+ }
986
+
987
+ export interface SystemImportResponse {
988
+ created: number;
989
+ updated: number;
990
+ skipped: number;
991
+ errors: Array<{
992
+ type: ExtendedServiceType;
993
+ source: string;
994
+ error: string;
995
+ }>;
996
+ accounts: Array<{
997
+ id: string;
998
+ type: string;
999
+ name: string;
1000
+ }>;
1001
+ }
1002
+
1003
+ /**
1004
+ * 시스템 설정에서 서비스 Import
1005
+ */
1006
+ export async function importSystemServices(
1007
+ request: SystemImportRequest,
1008
+ projectPath?: string
1009
+ ): Promise<SystemImportResponse> {
1010
+ const result: SystemImportResponse = {
1011
+ created: 0,
1012
+ updated: 0,
1013
+ skipped: 0,
1014
+ errors: [],
1015
+ accounts: [],
1016
+ };
1017
+
1018
+ const cacheKey = projectPath || '__global__';
1019
+ let cached = systemScanCache.get(cacheKey);
1020
+
1021
+ if (!cached) {
1022
+ cached = await scanSystemSources(projectPath);
1023
+ systemScanCache.set(cacheKey, cached);
1024
+ }
1025
+
1026
+ for (const req of request.services) {
1027
+ const service = cached.services.find(
1028
+ s => s.type === req.type && s.source === req.source
1029
+ );
1030
+
1031
+ if (!service) {
1032
+ result.errors.push({
1033
+ type: req.type,
1034
+ source: req.source,
1035
+ error: 'Service not found in scan results',
1036
+ });
1037
+ result.skipped++;
1038
+ continue;
1039
+ }
1040
+
1041
+ if (!service.isComplete) {
1042
+ result.errors.push({
1043
+ type: req.type,
1044
+ source: req.source,
1045
+ error: `Missing required credentials: ${service.missingRequired.join(', ')}`,
1046
+ });
1047
+ result.skipped++;
1048
+ continue;
1049
+ }
1050
+
1051
+ try {
1052
+ // Integration Hub 타입으로 매핑
1053
+ const hubType = mapToHubType(req.type);
1054
+
1055
+ // custom 타입인 경우 원본 타입을 metadata에 저장
1056
+ const metadata = hubType === 'custom' ? { originalType: req.type } : undefined;
1057
+
1058
+ const account = await createServiceAccount(
1059
+ hubType,
1060
+ req.name,
1061
+ service.rawCredentials,
1062
+ metadata
1063
+ );
1064
+
1065
+ result.created++;
1066
+ result.accounts.push({
1067
+ id: account.id,
1068
+ type: hubType,
1069
+ name: req.name,
1070
+ });
1071
+ } catch (error) {
1072
+ result.errors.push({
1073
+ type: req.type,
1074
+ source: req.source,
1075
+ error: (error as Error).message,
1076
+ });
1077
+ result.skipped++;
1078
+ }
1079
+ }
1080
+
1081
+ // 캐시 정리
1082
+ systemScanCache.delete(cacheKey);
1083
+
1084
+ return result;
1085
+ }
1086
+
1087
+ /**
1088
+ * ExtendedServiceType을 Hub 타입으로 매핑
1089
+ */
1090
+ function mapToHubType(type: ExtendedServiceType): ServiceType {
1091
+ const directMap: Record<string, ServiceType> = {
1092
+ github: 'github',
1093
+ supabase: 'supabase',
1094
+ vercel: 'vercel',
1095
+ sentry: 'sentry',
1096
+ };
1097
+ return directMap[type] || 'custom';
1098
+ }
1099
+
1100
+ /**
1101
+ * 캐시 정리
1102
+ */
1103
+ export function clearSystemScanCache(projectPath?: string): void {
1104
+ if (projectPath) {
1105
+ systemScanCache.delete(projectPath);
1106
+ systemScanCache.delete('__global__');
1107
+ } else {
1108
+ systemScanCache.clear();
1109
+ }
1110
+ }