agentstudio 0.3.0 → 0.3.1

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 (1362) hide show
  1. package/.dockerignore +53 -0
  2. package/.mcp.json +8 -0
  3. package/CLAUDE.md +359 -0
  4. package/DOCKER.md +270 -0
  5. package/Dockerfile +42 -0
  6. package/JSONL_TOOLS_README.md +301 -0
  7. package/LICENSE +603 -0
  8. package/QUICKSTART.md +253 -0
  9. package/README.md +176 -24
  10. package/README.zh-CN.md +200 -0
  11. package/SOLUTION_SUMMARY.md +249 -0
  12. package/backend/comprehensive-session-check.js +142 -0
  13. package/backend/debug-sessions.js +60 -0
  14. package/backend/docs/chat-clean-1.svg +1 -0
  15. package/backend/docs/chat-clean.md +60 -0
  16. package/backend/docs/chat-comprehensive-1.svg +1 -0
  17. package/backend/docs/chat-comprehensive.md +166 -0
  18. package/backend/docs/chat_api_sequence_diagram.md +58 -0
  19. package/backend/docs/command-detection-logic.md +306 -0
  20. package/backend/docs/command-detection-sequence.md +186 -0
  21. package/backend/eslint.config.js +25 -0
  22. package/backend/package.json +103 -0
  23. package/backend/scripts/README.md +156 -0
  24. package/backend/scripts/fix-project-names.js +113 -0
  25. package/backend/scripts/migrate-projects.js +159 -0
  26. package/backend/src/bin/agentstudio.ts +318 -0
  27. package/backend/src/bin/serviceManager.ts +469 -0
  28. package/backend/src/config/index.ts +184 -0
  29. package/backend/src/config/paths.ts +105 -0
  30. package/backend/src/config/sdkConfig.ts +126 -0
  31. package/backend/src/index.ts +434 -0
  32. package/backend/src/jobs/taskTimeoutMonitor.ts +106 -0
  33. package/backend/src/middleware/a2aAuth.ts +159 -0
  34. package/backend/src/middleware/auth.ts +39 -0
  35. package/backend/src/middleware/httpsOnly.ts +205 -0
  36. package/backend/src/middleware/rateLimiting.ts +130 -0
  37. package/backend/src/routes/__tests__/a2a.integration.test.ts +377 -0
  38. package/backend/src/routes/__tests__/a2a.test.ts +677 -0
  39. package/backend/src/routes/__tests__/agents.test.ts +327 -0
  40. package/backend/src/routes/__tests__/sessions.test.ts +345 -0
  41. package/backend/src/routes/a2a.streaming.test.ts +185 -0
  42. package/backend/src/routes/a2a.ts +840 -0
  43. package/backend/src/routes/a2aManagement.ts +545 -0
  44. package/backend/src/routes/agents.ts +1176 -0
  45. package/backend/src/routes/auth.ts +151 -0
  46. package/backend/src/routes/cloudflareTunnel.ts +306 -0
  47. package/backend/src/routes/commands.ts +524 -0
  48. package/backend/src/routes/config.ts +193 -0
  49. package/backend/src/routes/files.ts +375 -0
  50. package/backend/src/routes/mcp.ts +866 -0
  51. package/backend/src/routes/mcpAdmin.ts +369 -0
  52. package/backend/src/routes/mcpAdminManagement.ts +338 -0
  53. package/backend/src/routes/media.ts +140 -0
  54. package/backend/src/routes/mediaAuth.ts +150 -0
  55. package/backend/src/routes/network.ts +68 -0
  56. package/backend/src/routes/plugins.ts +368 -0
  57. package/backend/src/routes/projects.ts +1100 -0
  58. package/backend/src/routes/scheduledTasks.ts +442 -0
  59. package/backend/src/routes/sessions.ts +1054 -0
  60. package/backend/src/routes/settings.ts +552 -0
  61. package/backend/src/routes/skills.ts +319 -0
  62. package/backend/src/routes/slack.ts +193 -0
  63. package/backend/src/routes/slides.ts +166 -0
  64. package/backend/src/routes/subagents.ts +366 -0
  65. package/backend/src/routes/taskExecutor.ts +243 -0
  66. package/backend/src/routes/tunnel.ts +317 -0
  67. package/backend/src/routes/version.ts +239 -0
  68. package/backend/src/schemas/a2a.ts +352 -0
  69. package/backend/src/services/__tests__/pluginInstaller.test.ts +316 -0
  70. package/backend/src/services/__tests__/pluginParser.test.ts +285 -0
  71. package/backend/src/services/__tests__/pluginPaths.test.ts +212 -0
  72. package/backend/src/services/__tests__/pluginScanner.test.ts +287 -0
  73. package/backend/src/services/__tests__/pluginSymlink.test.ts +340 -0
  74. package/backend/src/services/__tests__/projectMetadataStorage.test.ts +158 -0
  75. package/backend/src/services/__tests__/sessionConcurrency.test.ts +132 -0
  76. package/backend/src/services/__tests__/slackAIService.test.ts +561 -0
  77. package/backend/src/services/__tests__/slackThreadMapper.test.ts +228 -0
  78. package/backend/src/services/a2a/__tests__/a2aClientTool.integration.test.ts +347 -0
  79. package/backend/src/services/a2a/__tests__/a2aClientTool.test.ts +710 -0
  80. package/backend/src/services/a2a/__tests__/a2aConfigService.test.ts +526 -0
  81. package/backend/src/services/a2a/__tests__/a2aConfigServicePath.test.ts +55 -0
  82. package/backend/src/services/a2a/__tests__/a2aSdkMcp.test.ts +254 -0
  83. package/backend/src/services/a2a/__tests__/agentCardService.test.ts +357 -0
  84. package/backend/src/services/a2a/__tests__/apiKeyService.test.ts +378 -0
  85. package/backend/src/services/a2a/__tests__/buildQueryOptionsIntegration.test.ts +41 -0
  86. package/backend/src/services/a2a/__tests__/dynamic_config_verification.test.ts +71 -0
  87. package/backend/src/services/a2a/__tests__/integrateA2AMcpServer.test.ts +97 -0
  88. package/backend/src/services/a2a/__tests__/taskManager.integration.test.ts +417 -0
  89. package/backend/src/services/a2a/__tests__/taskManager.test.ts +511 -0
  90. package/backend/src/services/a2a/__tests__/webhookService.test.ts +258 -0
  91. package/backend/src/services/a2a/a2aClientTool.ts +723 -0
  92. package/backend/src/services/a2a/a2aConfigService.ts +194 -0
  93. package/backend/src/services/a2a/a2aHistoryService.ts +111 -0
  94. package/backend/src/services/a2a/a2aIntegration.ts +40 -0
  95. package/backend/src/services/a2a/a2aQueryService.ts +275 -0
  96. package/backend/src/services/a2a/a2aSdkMcp.ts +208 -0
  97. package/backend/src/services/a2a/a2aStreamEvents.ts +166 -0
  98. package/backend/src/services/a2a/agentCardService.ts +256 -0
  99. package/backend/src/services/a2a/agentMappingService.ts +202 -0
  100. package/backend/src/services/a2a/apiKeyService.ts +361 -0
  101. package/backend/src/services/a2a/taskCleanup.ts +199 -0
  102. package/backend/src/services/a2a/taskManager.ts +327 -0
  103. package/backend/src/services/a2a/webhookService.ts +161 -0
  104. package/backend/src/services/agentStorage.ts +506 -0
  105. package/backend/src/services/askUserQuestion/askUserQuestionIntegration.ts +68 -0
  106. package/backend/src/services/askUserQuestion/askUserQuestionMcp.ts +173 -0
  107. package/backend/src/services/askUserQuestion/index.ts +48 -0
  108. package/backend/src/services/askUserQuestion/init.ts +53 -0
  109. package/backend/src/services/askUserQuestion/notificationChannel.ts +218 -0
  110. package/backend/src/services/askUserQuestion/slackNotificationChannel.ts +150 -0
  111. package/backend/src/services/askUserQuestion/sseNotificationChannel.ts +102 -0
  112. package/backend/src/services/askUserQuestion/userInputRegistry.ts +307 -0
  113. package/backend/src/services/claudeSession.ts +421 -0
  114. package/backend/src/services/claudeVersionStorage.ts +389 -0
  115. package/backend/src/services/mcpAdmin/__tests__/adminApiKeyService.test.ts +385 -0
  116. package/backend/src/services/mcpAdmin/__tests__/mcpAdminRoutes.test.ts +356 -0
  117. package/backend/src/services/mcpAdmin/__tests__/mcpAdminServer.test.ts +541 -0
  118. package/backend/src/services/mcpAdmin/__tests__/providerTools.test.ts +347 -0
  119. package/backend/src/services/mcpAdmin/__tests__/tools.test.ts +463 -0
  120. package/backend/src/services/mcpAdmin/adminApiKeyService.ts +329 -0
  121. package/backend/src/services/mcpAdmin/index.ts +19 -0
  122. package/backend/src/services/mcpAdmin/mcpAdminServer.ts +318 -0
  123. package/backend/src/services/mcpAdmin/tools/agentTools.ts +390 -0
  124. package/backend/src/services/mcpAdmin/tools/index.ts +29 -0
  125. package/backend/src/services/mcpAdmin/tools/mcpServerTools.ts +368 -0
  126. package/backend/src/services/mcpAdmin/tools/projectTools.ts +415 -0
  127. package/backend/src/services/mcpAdmin/tools/providerTools.ts +649 -0
  128. package/backend/src/services/mcpAdmin/tools/systemTools.ts +254 -0
  129. package/backend/src/services/mcpAdmin/types.ts +155 -0
  130. package/backend/src/services/messageQueue.ts +80 -0
  131. package/backend/src/services/pluginInstaller.ts +329 -0
  132. package/backend/src/services/pluginParser.ts +441 -0
  133. package/backend/src/services/pluginPaths.ts +270 -0
  134. package/backend/src/services/pluginScanner.ts +245 -0
  135. package/backend/src/services/pluginSymlink.ts +241 -0
  136. package/backend/src/services/projectMetadataStorage.ts +871 -0
  137. package/backend/src/services/scheduledTaskStorage.ts +377 -0
  138. package/backend/src/services/schedulerService.ts +668 -0
  139. package/backend/src/services/sessionManager.ts +738 -0
  140. package/backend/src/services/skillStorage.ts +521 -0
  141. package/backend/src/services/slackAIService.ts +1395 -0
  142. package/backend/src/services/slackClient.ts +110 -0
  143. package/backend/src/services/slackSessionLock.ts +364 -0
  144. package/backend/src/services/slackThreadMapper.ts +170 -0
  145. package/backend/src/services/taskExecutor/BuiltinExecutor.ts +611 -0
  146. package/backend/src/services/taskExecutor/__tests__/a2a-tasks.test.ts +382 -0
  147. package/backend/src/services/taskExecutor/__tests__/e2e-workflows.test.ts +528 -0
  148. package/backend/src/services/taskExecutor/__tests__/error-handling.test.ts +458 -0
  149. package/backend/src/services/taskExecutor/__tests__/stress.test.ts +400 -0
  150. package/backend/src/services/taskExecutor/__tests__/taskExecutor.integration.test.ts +240 -0
  151. package/backend/src/services/taskExecutor/__tests__/timeout-cancellation.test.ts +384 -0
  152. package/backend/src/services/taskExecutor/index.ts +168 -0
  153. package/backend/src/services/taskExecutor/taskWorker.ts +222 -0
  154. package/backend/src/services/taskExecutor/types.ts +179 -0
  155. package/backend/src/services/telemetry.ts +234 -0
  156. package/backend/src/services/tunnelService.ts +614 -0
  157. package/backend/src/types/a2a.ts +372 -0
  158. package/backend/src/types/agents.ts +161 -0
  159. package/backend/src/types/claude-history.ts +81 -0
  160. package/backend/src/types/claude-versions.ts +39 -0
  161. package/backend/src/types/commands.ts +63 -0
  162. package/backend/src/types/plugins.ts +157 -0
  163. package/backend/src/types/projects.ts +64 -0
  164. package/backend/src/types/scheduledTasks.ts +214 -0
  165. package/backend/src/types/skills.ts +130 -0
  166. package/backend/src/types/slack.ts +112 -0
  167. package/backend/src/types/streaming.ts +13 -0
  168. package/backend/src/types/subagents.ts +29 -0
  169. package/backend/src/utils/__tests__/claudeUtils.test.ts +312 -0
  170. package/backend/src/utils/__tests__/configResolver.test.ts +255 -0
  171. package/backend/src/utils/__tests__/sessionUtils.test.ts +384 -0
  172. package/backend/src/utils/agentCardCache.ts +245 -0
  173. package/backend/src/utils/claudeUtils.ts +377 -0
  174. package/backend/src/utils/configResolver.ts +175 -0
  175. package/backend/src/utils/fileUtils.ts +5 -0
  176. package/backend/src/utils/jwt.ts +104 -0
  177. package/backend/src/utils/networkUtils.ts +68 -0
  178. package/backend/src/utils/sessionUtils.ts +303 -0
  179. package/backend/tsconfig.json +25 -0
  180. package/backend/vitest.config.ts +29 -0
  181. package/docker-compose.traefik.yml +59 -0
  182. package/docker-compose.yml +38 -0
  183. package/docker-entrypoint.sh +30 -0
  184. package/docs/CLOUDFLARE_TUNNEL.md +233 -0
  185. package/docs/CLOUDFLARE_TUNNEL_ARCHITECTURE.md +406 -0
  186. package/docs/LAVS-IMPLEMENTATION.md +1973 -0
  187. package/docs/LAVS-SPEC.md +951 -0
  188. package/docs/QUICK_START_CLOUDFLARE_TUNNEL.md +304 -0
  189. package/docs/SCHEDULER_CONTROL.md +142 -0
  190. package/docs/SCHEDULER_STATUS_DISPLAY.md +86 -0
  191. package/docs/USER_MANUAL.md +1726 -0
  192. package/docs/USER_MANUAL_EN.md +1408 -0
  193. package/docs/VERSION_COMPATIBILITY.md +616 -0
  194. package/docs/api/a2a-endpoints.md +891 -0
  195. package/docs/guides/unified-task-executor-summary.md +365 -0
  196. package/docs/guides/unified-task-executor.md +304 -0
  197. package/docs/screenshots/01-homepage.png +0 -0
  198. package/docs/screenshots/02-dashboard.png +0 -0
  199. package/docs/screenshots/03-projects.png +0 -0
  200. package/docs/screenshots/04-agents.png +0 -0
  201. package/docs/screenshots/05-mcp-services.png +0 -0
  202. package/docs/screenshots/06-commands.png +0 -0
  203. package/docs/screenshots/07-chat.png +0 -0
  204. package/docs/screenshots/08-skills.png +0 -0
  205. package/docs/screenshots/09-settings.png +0 -0
  206. package/docs/screenshots/10-suppliers.png +0 -0
  207. package/docs/screenshots/11-plugins.png +0 -0
  208. package/docs/screenshots/agent-create-dialog.png +0 -0
  209. package/docs/screenshots/agent-edit-dialog.png +0 -0
  210. package/docs/screenshots/agent-list-overview.png +0 -0
  211. package/docs/screenshots/agent-tools-selection.png +0 -0
  212. package/docs/screenshots/agents-management.png +0 -0
  213. package/docs/screenshots/auto-compacted-session.png +0 -0
  214. package/docs/screenshots/chat-interface.png +0 -0
  215. package/docs/screenshots/chat-session-debug.png +0 -0
  216. package/docs/screenshots/chat-session-history.png +0 -0
  217. package/docs/screenshots/chat-tools-selection.png +0 -0
  218. package/docs/screenshots/commands-create-dialog.png +0 -0
  219. package/docs/screenshots/commands-overview.png +0 -0
  220. package/docs/screenshots/create-project-dialog.png +0 -0
  221. package/docs/screenshots/dashboard-overview.png +0 -0
  222. package/docs/screenshots/file-browser-interface.png +0 -0
  223. package/docs/screenshots/import-project-dialog.png +0 -0
  224. package/docs/screenshots/mcp-add-service-dialog.png +0 -0
  225. package/docs/screenshots/mcp-admin-settings.png +0 -0
  226. package/docs/screenshots/mcp-import-claude-code.png +0 -0
  227. package/docs/screenshots/mcp-list-overview.png +0 -0
  228. package/docs/screenshots/mcp-services-page.png +0 -0
  229. package/docs/screenshots/password-management-modal.png +0 -0
  230. package/docs/screenshots/plugins-add-market.png +0 -0
  231. package/docs/screenshots/plugins-browse.png +0 -0
  232. package/docs/screenshots/plugins-overview.png +0 -0
  233. package/docs/screenshots/ppt-editor-chat-interface.png +0 -0
  234. package/docs/screenshots/project-commands-dialog.png +0 -0
  235. package/docs/screenshots/project-list-overview.png +0 -0
  236. package/docs/screenshots/project-memory-dialog.png +0 -0
  237. package/docs/screenshots/project-settings-dialog.png +0 -0
  238. package/docs/screenshots/project-subagent-dialog.png +0 -0
  239. package/docs/screenshots/projects-management.png +0 -0
  240. package/docs/screenshots/projects-overview.png +0 -0
  241. package/docs/screenshots/scheduled-tasks-create-dialog.png +0 -0
  242. package/docs/screenshots/scheduled-tasks-execution-history.png +0 -0
  243. package/docs/screenshots/scheduled-tasks-overview.png +0 -0
  244. package/docs/screenshots/session-display-issue.png +0 -0
  245. package/docs/screenshots/session-messages-fix.png +0 -0
  246. package/docs/screenshots/session-messages-loaded.png +0 -0
  247. package/docs/screenshots/settings-general.png +0 -0
  248. package/docs/screenshots/settings-memory.png +0 -0
  249. package/docs/screenshots/skills-create-dialog.png +0 -0
  250. package/docs/screenshots/skills-list-overview.png +0 -0
  251. package/docs/screenshots/skills-view-detail.png +0 -0
  252. package/docs/screenshots/slide-preview-after-fix.png +0 -0
  253. package/docs/screenshots/storybook-basetool-full.png +0 -0
  254. package/docs/screenshots/storybook-fixed.png +0 -0
  255. package/docs/screenshots/storybook-tasktool.png +0 -0
  256. package/docs/screenshots/supplier-add-dialog.png +0 -0
  257. package/docs/screenshots/supplier-edit-dialog.png +0 -0
  258. package/docs/screenshots/suppliers-overview.png +0 -0
  259. package/docs/screenshots/telemetry-settings.png +0 -0
  260. package/docs/screenshots/version-management-page.png +0 -0
  261. package/docs-site/.vitepress/cache/deps/@theme_index.js +275 -0
  262. package/docs-site/.vitepress/cache/deps/@theme_index.js.map +7 -0
  263. package/docs-site/.vitepress/cache/deps/_metadata.json +58 -0
  264. package/docs-site/.vitepress/cache/deps/chunk-CN42XFKG.js +12824 -0
  265. package/docs-site/.vitepress/cache/deps/chunk-CN42XFKG.js.map +7 -0
  266. package/docs-site/.vitepress/cache/deps/chunk-Y3A3J5YD.js +9719 -0
  267. package/docs-site/.vitepress/cache/deps/chunk-Y3A3J5YD.js.map +7 -0
  268. package/docs-site/.vitepress/cache/deps/package.json +3 -0
  269. package/docs-site/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  270. package/docs-site/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  271. package/docs-site/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
  272. package/docs-site/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  273. package/docs-site/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +1352 -0
  274. package/docs-site/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
  275. package/docs-site/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +1665 -0
  276. package/docs-site/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +7 -0
  277. package/docs-site/.vitepress/cache/deps/vitepress___minisearch.js +1813 -0
  278. package/docs-site/.vitepress/cache/deps/vitepress___minisearch.js.map +7 -0
  279. package/docs-site/.vitepress/cache/deps/vue.js +347 -0
  280. package/docs-site/.vitepress/cache/deps/vue.js.map +7 -0
  281. package/docs-site/src/.vitepress/cache/deps/_metadata.json +52 -0
  282. package/docs-site/src/.vitepress/cache/deps/chunk-CN42XFKG.js +12824 -0
  283. package/docs-site/src/.vitepress/cache/deps/chunk-CN42XFKG.js.map +7 -0
  284. package/docs-site/src/.vitepress/cache/deps/chunk-Y3A3J5YD.js +9719 -0
  285. package/docs-site/src/.vitepress/cache/deps/chunk-Y3A3J5YD.js.map +7 -0
  286. package/docs-site/src/.vitepress/cache/deps/package.json +3 -0
  287. package/docs-site/src/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  288. package/docs-site/src/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  289. package/docs-site/src/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
  290. package/docs-site/src/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  291. package/docs-site/src/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +1352 -0
  292. package/docs-site/src/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
  293. package/docs-site/src/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +1665 -0
  294. package/docs-site/src/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +7 -0
  295. package/docs-site/src/.vitepress/cache/deps/vitepress___minisearch.js +1813 -0
  296. package/docs-site/src/.vitepress/cache/deps/vitepress___minisearch.js.map +7 -0
  297. package/docs-site/src/.vitepress/cache/deps/vue.js +347 -0
  298. package/docs-site/src/.vitepress/cache/deps/vue.js.map +7 -0
  299. package/frontend/.storybook/main.ts +22 -0
  300. package/frontend/.storybook/preview.ts +27 -0
  301. package/frontend/.storybook/vitest.setup.ts +7 -0
  302. package/frontend/README.md +69 -0
  303. package/frontend/components.json +17 -0
  304. package/frontend/eslint.config.js +26 -0
  305. package/frontend/index.html +62 -0
  306. package/frontend/package-lock.json +7922 -0
  307. package/frontend/package.json +90 -0
  308. package/frontend/pnpm-lock.yaml +4714 -0
  309. package/frontend/postcss.config.js +6 -0
  310. package/frontend/scripts/extract-chinese.js +146 -0
  311. package/frontend/src/App.css +42 -0
  312. package/frontend/src/App.tsx +201 -0
  313. package/frontend/src/__tests__/smoke.test.tsx +15 -0
  314. package/frontend/src/agents/README.md +136 -0
  315. package/frontend/src/agents/chat/index.ts +17 -0
  316. package/frontend/src/agents/registry.ts +22 -0
  317. package/frontend/src/agents/slides/components/SlidePreview.tsx +287 -0
  318. package/frontend/src/agents/slides/components/SlidePreviewPanel.tsx +120 -0
  319. package/frontend/src/agents/slides/hooks/useSlides.ts +245 -0
  320. package/frontend/src/agents/slides/index.ts +17 -0
  321. package/frontend/src/agents/slides/stores/useSlidesStore.ts +56 -0
  322. package/frontend/src/agents/types.ts +18 -0
  323. package/frontend/src/api/skills.ts +184 -0
  324. package/frontend/src/assets/react.svg +1 -0
  325. package/frontend/src/components/AgentChatPanel.tsx +901 -0
  326. package/frontend/src/components/ApiSettingsModal.tsx +267 -0
  327. package/frontend/src/components/BackendOnboardingWizard.tsx +255 -0
  328. package/frontend/src/components/BackendServiceSwitcher.tsx +356 -0
  329. package/frontend/src/components/CSVPreview.tsx +465 -0
  330. package/frontend/src/components/ChatMessageRenderer.tsx +279 -0
  331. package/frontend/src/components/CommandForm.tsx +560 -0
  332. package/frontend/src/components/CommandSelector.tsx +218 -0
  333. package/frontend/src/components/CompactSummary.tsx +52 -0
  334. package/frontend/src/components/ConfirmDialog.tsx +69 -0
  335. package/frontend/src/components/DiffViewer.css +78 -0
  336. package/frontend/src/components/DiffViewer.tsx +89 -0
  337. package/frontend/src/components/EnvVarsConfig.tsx +113 -0
  338. package/frontend/src/components/ErrorBoundary.tsx +100 -0
  339. package/frontend/src/components/ErrorMessage.tsx +197 -0
  340. package/frontend/src/components/FileBrowser.tsx +480 -0
  341. package/frontend/src/components/FileContentViewer.tsx +155 -0
  342. package/frontend/src/components/FileExplorer/FileIcon.tsx +32 -0
  343. package/frontend/src/components/FileExplorer/FilePreview.tsx +130 -0
  344. package/frontend/src/components/FileExplorer/FileTabs.tsx +104 -0
  345. package/frontend/src/components/FileExplorer/FileTreeToolbar.tsx +30 -0
  346. package/frontend/src/components/FileExplorer/ImagePreview.tsx +86 -0
  347. package/frontend/src/components/FileExplorer/REFACTOR_SUMMARY.md +117 -0
  348. package/frontend/src/components/FileExplorer/TabDropdown.tsx +59 -0
  349. package/frontend/src/components/FileExplorer/TreeNode.tsx +73 -0
  350. package/frontend/src/components/FileExplorer/constants.ts +16 -0
  351. package/frontend/src/components/FileExplorer/fileTypes.ts +156 -0
  352. package/frontend/src/components/FileExplorer/hooks/index.ts +2 -0
  353. package/frontend/src/components/FileExplorer/hooks/useFileTabs.ts +120 -0
  354. package/frontend/src/components/FileExplorer/hooks/useLazyFileTree.ts +260 -0
  355. package/frontend/src/components/FileExplorer/index.ts +15 -0
  356. package/frontend/src/components/FileExplorer.tsx +1124 -0
  357. package/frontend/src/components/FloatingToggle.tsx +66 -0
  358. package/frontend/src/components/ImagePreview.tsx +369 -0
  359. package/frontend/src/components/JSONLPreview.tsx +421 -0
  360. package/frontend/src/components/LanguageSwitcher.tsx +32 -0
  361. package/frontend/src/components/Layout.tsx +57 -0
  362. package/frontend/src/components/MarkdownMessage.tsx +136 -0
  363. package/frontend/src/components/McpStatusModal.tsx +272 -0
  364. package/frontend/src/components/MermaidDiagram.tsx +423 -0
  365. package/frontend/src/components/MobileChatInput.tsx +158 -0
  366. package/frontend/src/components/MobileChatToolbar.tsx +164 -0
  367. package/frontend/src/components/MobileNavigation.tsx +101 -0
  368. package/frontend/src/components/MobileSettingsModal.tsx +272 -0
  369. package/frontend/src/components/MobileSidebar.tsx +56 -0
  370. package/frontend/src/components/PanelToggle.tsx +69 -0
  371. package/frontend/src/components/ProjectA2AModal.tsx +1430 -0
  372. package/frontend/src/components/ProjectCommandsModal.tsx +453 -0
  373. package/frontend/src/components/ProjectMemoryModal.tsx +178 -0
  374. package/frontend/src/components/ProjectSelector.tsx +498 -0
  375. package/frontend/src/components/ProjectSettingsModal.tsx +210 -0
  376. package/frontend/src/components/ProjectSubAgentsModal.tsx +421 -0
  377. package/frontend/src/components/ProjectTable.tsx +387 -0
  378. package/frontend/src/components/ProtectedRoute.tsx +123 -0
  379. package/frontend/src/components/RecentActivity.tsx +145 -0
  380. package/frontend/src/components/ResponsiveTable.tsx +164 -0
  381. package/frontend/src/components/RightPanelHeader.tsx +87 -0
  382. package/frontend/src/components/RightPanelWrapper.tsx +74 -0
  383. package/frontend/src/components/ScheduledTaskEditor.tsx +718 -0
  384. package/frontend/src/components/ServiceManagementModal.tsx +794 -0
  385. package/frontend/src/components/ServiceStatusIndicator.tsx +334 -0
  386. package/frontend/src/components/SessionsDashboard.tsx +295 -0
  387. package/frontend/src/components/SessionsDropdown.tsx +168 -0
  388. package/frontend/src/components/SettingsDropdown.tsx +236 -0
  389. package/frontend/src/components/SettingsLayout.tsx +16 -0
  390. package/frontend/src/components/Sidebar.tsx +283 -0
  391. package/frontend/src/components/SplitLayout.tsx +261 -0
  392. package/frontend/src/components/SubagentForm.tsx +468 -0
  393. package/frontend/src/components/SwipeActions.tsx +413 -0
  394. package/frontend/src/components/SystemPromptEditor.tsx +126 -0
  395. package/frontend/src/components/TaskExecutionHistory.tsx +373 -0
  396. package/frontend/src/components/TelemetryProvider.tsx +157 -0
  397. package/frontend/src/components/ToolUsage.tsx +34 -0
  398. package/frontend/src/components/ToolsList.tsx +86 -0
  399. package/frontend/src/components/UnifiedToolSelector.tsx +508 -0
  400. package/frontend/src/components/UpdateNotification.tsx +105 -0
  401. package/frontend/src/components/agentChat/AgentChatInput.tsx +249 -0
  402. package/frontend/src/components/agentChat/AgentChatMobileInput.tsx +266 -0
  403. package/frontend/src/components/agentChat/AgentCommandSelector.tsx +226 -0
  404. package/frontend/src/components/agentChat/AgentInputArea.tsx +573 -0
  405. package/frontend/src/components/agentChat/ChatMessageList.tsx +125 -0
  406. package/frontend/src/components/agentChat/index.ts +7 -0
  407. package/frontend/src/components/onboarding/BackendDetectingStep.tsx +42 -0
  408. package/frontend/src/components/onboarding/BackendFoundStep.tsx +75 -0
  409. package/frontend/src/components/onboarding/BackendNotFoundStep.tsx +249 -0
  410. package/frontend/src/components/onboarding/OnboardingCompleteStep.tsx +90 -0
  411. package/frontend/src/components/onboarding/WelcomeStep.tsx +93 -0
  412. package/frontend/src/components/plugins/AddMarketplaceModal.tsx +186 -0
  413. package/frontend/src/components/plugins/BrowsePluginsTab.tsx +262 -0
  414. package/frontend/src/components/plugins/InstalledPluginsTab.tsx +246 -0
  415. package/frontend/src/components/plugins/MarketplacesTab.tsx +168 -0
  416. package/frontend/src/components/plugins/PluginDetailModal.tsx +307 -0
  417. package/frontend/src/components/settings/version/ClaudeVersionForm.tsx +266 -0
  418. package/frontend/src/components/settings/version/ClaudeVersionList.tsx +61 -0
  419. package/frontend/src/components/settings/version/EnvironmentVariablesSection.tsx +173 -0
  420. package/frontend/src/components/settings/version/ModelConfigSection.tsx +129 -0
  421. package/frontend/src/components/settings/version/VersionListItem.tsx +133 -0
  422. package/frontend/src/components/settings/version/VersionTemplateSelector.tsx +53 -0
  423. package/frontend/src/components/skills/CreateSkillModal.tsx +702 -0
  424. package/frontend/src/components/skills/SkillDetailModal.tsx +180 -0
  425. package/frontend/src/components/skills/SkillFileBrowserModal.tsx +67 -0
  426. package/frontend/src/components/skills/SkillPreview.tsx +150 -0
  427. package/frontend/src/components/skills/SkillsPage.tsx +329 -0
  428. package/frontend/src/components/skills/index.ts +4 -0
  429. package/frontend/src/components/tools/A2ACallTool.tsx +733 -0
  430. package/frontend/src/components/tools/AskUserQuestionTool.stories.tsx +223 -0
  431. package/frontend/src/components/tools/AskUserQuestionTool.tsx +546 -0
  432. package/frontend/src/components/tools/BaseToolComponent.stories.tsx +316 -0
  433. package/frontend/src/components/tools/BaseToolComponent.tsx +226 -0
  434. package/frontend/src/components/tools/BashOutputTool.stories.tsx +106 -0
  435. package/frontend/src/components/tools/BashOutputTool.tsx +198 -0
  436. package/frontend/src/components/tools/BashTool.stories.tsx +163 -0
  437. package/frontend/src/components/tools/BashTool.tsx +80 -0
  438. package/frontend/src/components/tools/EditTool.stories.tsx +109 -0
  439. package/frontend/src/components/tools/EditTool.tsx +60 -0
  440. package/frontend/src/components/tools/ExitPlanModeTool.stories.tsx +118 -0
  441. package/frontend/src/components/tools/ExitPlanModeTool.tsx +34 -0
  442. package/frontend/src/components/tools/GlobTool.stories.tsx +122 -0
  443. package/frontend/src/components/tools/GlobTool.tsx +50 -0
  444. package/frontend/src/components/tools/GrepTool.stories.tsx +125 -0
  445. package/frontend/src/components/tools/GrepTool.tsx +87 -0
  446. package/frontend/src/components/tools/KillBashTool.stories.tsx +120 -0
  447. package/frontend/src/components/tools/KillBashTool.tsx +112 -0
  448. package/frontend/src/components/tools/LSTool.stories.tsx +132 -0
  449. package/frontend/src/components/tools/LSTool.tsx +41 -0
  450. package/frontend/src/components/tools/ListMcpResourcesTool.stories.tsx +125 -0
  451. package/frontend/src/components/tools/ListMcpResourcesTool.tsx +84 -0
  452. package/frontend/src/components/tools/McpTool.stories.tsx +140 -0
  453. package/frontend/src/components/tools/McpTool.tsx +266 -0
  454. package/frontend/src/components/tools/MultiEditTool.stories.tsx +127 -0
  455. package/frontend/src/components/tools/MultiEditTool.tsx +59 -0
  456. package/frontend/src/components/tools/NotebookEditTool.stories.tsx +137 -0
  457. package/frontend/src/components/tools/NotebookEditTool.tsx +57 -0
  458. package/frontend/src/components/tools/NotebookReadTool.stories.tsx +134 -0
  459. package/frontend/src/components/tools/NotebookReadTool.tsx +25 -0
  460. package/frontend/src/components/tools/README.md +677 -0
  461. package/frontend/src/components/tools/ReadMcpResourceTool.stories.tsx +125 -0
  462. package/frontend/src/components/tools/ReadMcpResourceTool.tsx +126 -0
  463. package/frontend/src/components/tools/ReadTool.stories.tsx +116 -0
  464. package/frontend/src/components/tools/ReadTool.tsx +37 -0
  465. package/frontend/src/components/tools/SkillTool.tsx +91 -0
  466. package/frontend/src/components/tools/SubAgentMessageFlow.tsx +172 -0
  467. package/frontend/src/components/tools/TaskTool.stories.tsx +483 -0
  468. package/frontend/src/components/tools/TaskTool.tsx +199 -0
  469. package/frontend/src/components/tools/TimeMachineTool.stories.tsx +254 -0
  470. package/frontend/src/components/tools/TimeMachineTool.tsx +126 -0
  471. package/frontend/src/components/tools/TodoWriteTool.stories.tsx +128 -0
  472. package/frontend/src/components/tools/TodoWriteTool.tsx +74 -0
  473. package/frontend/src/components/tools/ToolRenderer.stories.tsx +460 -0
  474. package/frontend/src/components/tools/ToolRenderer.tsx +147 -0
  475. package/frontend/src/components/tools/WebFetchTool.stories.tsx +114 -0
  476. package/frontend/src/components/tools/WebFetchTool.tsx +50 -0
  477. package/frontend/src/components/tools/WebSearchTool.stories.tsx +124 -0
  478. package/frontend/src/components/tools/WebSearchTool.tsx +67 -0
  479. package/frontend/src/components/tools/WriteTool.stories.tsx +115 -0
  480. package/frontend/src/components/tools/WriteTool.tsx +41 -0
  481. package/frontend/src/components/tools/__mocks__/toolTestData.ts +557 -0
  482. package/frontend/src/components/tools/customMcpTools.tsx +17 -0
  483. package/frontend/src/components/tools/index.stories.tsx +107 -0
  484. package/frontend/src/components/tools/index.ts +24 -0
  485. package/frontend/src/components/tools/mcpUtils.ts +27 -0
  486. package/frontend/src/components/tools/sdk-types.ts +327 -0
  487. package/frontend/src/components/tools/types.ts +218 -0
  488. package/frontend/src/components/ui/Button.tsx +39 -0
  489. package/frontend/src/components/ui/Input.tsx +24 -0
  490. package/frontend/src/components/ui/Textarea.tsx +23 -0
  491. package/frontend/src/components/ui/VersionInfo.tsx +116 -0
  492. package/frontend/src/components/ui/dialog.tsx +90 -0
  493. package/frontend/src/components/ui/index.ts +4 -0
  494. package/frontend/src/components/ui/label.tsx +19 -0
  495. package/frontend/src/components/ui/select.tsx +121 -0
  496. package/frontend/src/components/ui/table.tsx +117 -0
  497. package/frontend/src/components/ui/tabs.tsx +124 -0
  498. package/frontend/src/components/ui/toast.tsx +127 -0
  499. package/frontend/src/components/ui/toaster.tsx +33 -0
  500. package/frontend/src/contexts/MobileContext.tsx +109 -0
  501. package/frontend/src/hooks/__tests__/useAIStreamHandler.test.ts +1198 -0
  502. package/frontend/src/hooks/agentChat/index.ts +10 -0
  503. package/frontend/src/hooks/agentChat/useAIStreamHandler.ts +1594 -0
  504. package/frontend/src/hooks/agentChat/useClaudeVersionManager.ts +99 -0
  505. package/frontend/src/hooks/agentChat/useCommandCompletion.ts +253 -0
  506. package/frontend/src/hooks/agentChat/useImageUpload.ts +176 -0
  507. package/frontend/src/hooks/agentChat/useMessageSender.ts +391 -0
  508. package/frontend/src/hooks/agentChat/useScrollManagement.ts +66 -0
  509. package/frontend/src/hooks/agentChat/useSessionManager.ts +110 -0
  510. package/frontend/src/hooks/agentChat/useToolSelector.ts +82 -0
  511. package/frontend/src/hooks/agentChat/useUIState.ts +103 -0
  512. package/frontend/src/hooks/index.ts +3 -0
  513. package/frontend/src/hooks/use-toast.ts +194 -0
  514. package/frontend/src/hooks/useA2AConfig.ts +224 -0
  515. package/frontend/src/hooks/useA2AManagement.ts +456 -0
  516. package/frontend/src/hooks/useAI.ts +264 -0
  517. package/frontend/src/hooks/useAgents.ts +411 -0
  518. package/frontend/src/hooks/useApiBase.ts +31 -0
  519. package/frontend/src/hooks/useAuth.ts +454 -0
  520. package/frontend/src/hooks/useBackendServices.ts +58 -0
  521. package/frontend/src/hooks/useClaudeVersions.ts +128 -0
  522. package/frontend/src/hooks/useCommands.ts +312 -0
  523. package/frontend/src/hooks/useDashboardStats.ts +61 -0
  524. package/frontend/src/hooks/useFileSystem.ts +349 -0
  525. package/frontend/src/hooks/useFiles.ts +80 -0
  526. package/frontend/src/hooks/useMarketplaces.ts +120 -0
  527. package/frontend/src/hooks/useMobile.tsx +110 -0
  528. package/frontend/src/hooks/usePlugins.ts +239 -0
  529. package/frontend/src/hooks/useProjects.ts +45 -0
  530. package/frontend/src/hooks/useResponsiveSettings.tsx +22 -0
  531. package/frontend/src/hooks/useScheduledTasks.ts +483 -0
  532. package/frontend/src/hooks/useSessionHeartbeat.ts +173 -0
  533. package/frontend/src/hooks/useSessionHeartbeatOnSuccess.ts +80 -0
  534. package/frontend/src/hooks/useSessions.ts +96 -0
  535. package/frontend/src/hooks/useSkills.ts +197 -0
  536. package/frontend/src/hooks/useSubagents.ts +274 -0
  537. package/frontend/src/hooks/useTabNotification.ts +155 -0
  538. package/frontend/src/hooks/useVersionCheck.ts +164 -0
  539. package/frontend/src/i18n/index.ts +66 -0
  540. package/frontend/src/i18n/locales/en-US/agents.json +85 -0
  541. package/frontend/src/i18n/locales/en-US/common.json +155 -0
  542. package/frontend/src/i18n/locales/en-US/components.json +1197 -0
  543. package/frontend/src/i18n/locales/en-US/errors.json +56 -0
  544. package/frontend/src/i18n/locales/en-US/home.json +27 -0
  545. package/frontend/src/i18n/locales/en-US/onboarding.json +122 -0
  546. package/frontend/src/i18n/locales/en-US/pages.json +1409 -0
  547. package/frontend/src/i18n/locales/en-US/skills.json +120 -0
  548. package/frontend/src/i18n/locales/zh-CN/agents.json +85 -0
  549. package/frontend/src/i18n/locales/zh-CN/common.json +155 -0
  550. package/frontend/src/i18n/locales/zh-CN/components.json +1199 -0
  551. package/frontend/src/i18n/locales/zh-CN/errors.json +56 -0
  552. package/frontend/src/i18n/locales/zh-CN/home.json +27 -0
  553. package/frontend/src/i18n/locales/zh-CN/onboarding.json +122 -0
  554. package/frontend/src/i18n/locales/zh-CN/pages.json +1540 -0
  555. package/frontend/src/i18n/locales/zh-CN/pages.json.tmp +0 -0
  556. package/frontend/src/i18n/locales/zh-CN/pages_new.json +0 -0
  557. package/frontend/src/i18n/locales/zh-CN/skills.json +120 -0
  558. package/frontend/src/i18n/types.ts +19 -0
  559. package/frontend/src/index.css +112 -0
  560. package/frontend/src/lib/authFetch.ts +183 -0
  561. package/frontend/src/lib/config.ts +120 -0
  562. package/frontend/src/lib/utils.ts +6 -0
  563. package/frontend/src/main.tsx +13 -0
  564. package/frontend/src/pages/AgentsPage.tsx +781 -0
  565. package/frontend/src/pages/AnalyticsPage.tsx +363 -0
  566. package/frontend/src/pages/ChatPage.tsx +286 -0
  567. package/frontend/src/pages/CommandsPage.tsx +445 -0
  568. package/frontend/src/pages/DashboardPage.tsx +519 -0
  569. package/frontend/src/pages/HomePage.tsx +223 -0
  570. package/frontend/src/pages/LandingPage.tsx +607 -0
  571. package/frontend/src/pages/LoginPage.tsx +510 -0
  572. package/frontend/src/pages/McpPage.tsx +1049 -0
  573. package/frontend/src/pages/PluginsPage.tsx +98 -0
  574. package/frontend/src/pages/ProjectSettings/A2AConfigTab.tsx +468 -0
  575. package/frontend/src/pages/ProjectsPage.tsx +818 -0
  576. package/frontend/src/pages/ScheduledTasksPage.tsx +574 -0
  577. package/frontend/src/pages/SkillsPage.tsx +6 -0
  578. package/frontend/src/pages/ToastTestPage.tsx +33 -0
  579. package/frontend/src/pages/index.ts +3 -0
  580. package/frontend/src/pages/settings/ApiSettingsPage.tsx +240 -0
  581. package/frontend/src/pages/settings/CloudflareTunnelPage.tsx +730 -0
  582. package/frontend/src/pages/settings/GeneralSettingsPage.tsx +456 -0
  583. package/frontend/src/pages/settings/McpAdminSettingsPage.tsx +1088 -0
  584. package/frontend/src/pages/settings/MemorySettingsPage.tsx +153 -0
  585. package/frontend/src/pages/settings/SubagentsPage.tsx +412 -0
  586. package/frontend/src/pages/settings/SystemInfoPage.tsx +268 -0
  587. package/frontend/src/pages/settings/TelemetrySettingsPage.tsx +175 -0
  588. package/frontend/src/pages/settings/VersionSettingsPage.tsx +366 -0
  589. package/frontend/src/pages/settings/WebSocketTunnelPage.tsx +1578 -0
  590. package/frontend/src/stores/authStore.ts +99 -0
  591. package/frontend/src/stores/useAgentStore.ts +426 -0
  592. package/frontend/src/stores/useSubAgentStore.ts +207 -0
  593. package/frontend/src/styles/mobile.css +156 -0
  594. package/frontend/src/test/setup.ts +64 -0
  595. package/frontend/src/types/agents.ts +109 -0
  596. package/frontend/src/types/backendServices.ts +20 -0
  597. package/frontend/src/types/claude-versions.ts +45 -0
  598. package/frontend/src/types/commands.ts +63 -0
  599. package/frontend/src/types/index.ts +171 -0
  600. package/frontend/src/types/plugins.ts +128 -0
  601. package/frontend/src/types/scheduledTasks.ts +140 -0
  602. package/frontend/src/types/skills.ts +161 -0
  603. package/frontend/src/types/subagents.ts +48 -0
  604. package/frontend/src/types/versionTemplates.ts +270 -0
  605. package/frontend/src/utils/authHelpers.ts +89 -0
  606. package/frontend/src/utils/backendServiceStorage.ts +100 -0
  607. package/frontend/src/utils/commandFormatter.ts +100 -0
  608. package/frontend/src/utils/commandGenerator.ts +72 -0
  609. package/frontend/src/utils/commandHandler.ts +205 -0
  610. package/frontend/src/utils/dateFormat.ts +35 -0
  611. package/frontend/src/utils/eventBus.ts +53 -0
  612. package/frontend/src/utils/index.ts +34 -0
  613. package/frontend/src/utils/onboardingStorage.ts +40 -0
  614. package/frontend/src/utils/smartNavigation.ts +244 -0
  615. package/frontend/src/utils/streamReader.ts +32 -0
  616. package/frontend/src/utils/systemCommands.ts +49 -0
  617. package/frontend/src/utils/tabManager.ts +816 -0
  618. package/frontend/src/utils/toast.ts +49 -0
  619. package/frontend/src/utils/toolMapping.ts +83 -0
  620. package/frontend/src/vite-env.d.ts +3 -0
  621. package/frontend/tailwind.config.js +119 -0
  622. package/frontend/tsconfig.app.json +33 -0
  623. package/frontend/tsconfig.json +7 -0
  624. package/frontend/tsconfig.node.json +25 -0
  625. package/frontend/vite.config.ts +73 -0
  626. package/frontend/vitest.config.ts +39 -0
  627. package/frontend/vitest.shims.d.ts +1 -0
  628. package/nginx.conf +153 -0
  629. package/package.json +38 -49
  630. package/pnpm-workspace.yaml +3 -0
  631. package/scripts/API_KEY_GENERATION_README.md +181 -0
  632. package/scripts/README-nginx.md +327 -0
  633. package/scripts/README.md +259 -0
  634. package/scripts/build-complete.js +98 -0
  635. package/scripts/build-npm.js +251 -0
  636. package/scripts/check-system.sh +153 -0
  637. package/scripts/cloudflare_tunnel.py +292 -0
  638. package/scripts/deploy-feature.sh +265 -0
  639. package/scripts/generate-api-key.ts +59 -0
  640. package/scripts/install-linux.sh +1507 -0
  641. package/scripts/install-macos.sh +1194 -0
  642. package/scripts/remote-install.sh +244 -0
  643. package/scripts/remove-feature.sh +214 -0
  644. package/scripts/remove.sh +390 -0
  645. package/scripts/requirements.txt +1 -0
  646. package/scripts/restore.sh +331 -0
  647. package/scripts/setup-nginx-ssl.sh +242 -0
  648. package/scripts/setup_nginx.sh +110 -0
  649. package/scripts/windows-install-simple.bat +277 -0
  650. package/scripts/windows-install.ps1 +620 -0
  651. package/tsconfig.json +30 -0
  652. package/vercel.json +44 -0
  653. package/bin/agentstudio.d.ts +0 -3
  654. package/bin/agentstudio.d.ts.map +0 -1
  655. package/bin/agentstudio.js +0 -327
  656. package/bin/agentstudio.js.map +0 -1
  657. package/bin/serviceManager.d.ts +0 -16
  658. package/bin/serviceManager.d.ts.map +0 -1
  659. package/bin/serviceManager.js +0 -434
  660. package/bin/serviceManager.js.map +0 -1
  661. package/config/index.d.ts +0 -74
  662. package/config/index.d.ts.map +0 -1
  663. package/config/index.js +0 -166
  664. package/config/index.js.map +0 -1
  665. package/config/paths.d.ts +0 -81
  666. package/config/paths.d.ts.map +0 -1
  667. package/config/paths.js +0 -98
  668. package/config/paths.js.map +0 -1
  669. package/index.d.ts +0 -4
  670. package/index.d.ts.map +0 -1
  671. package/index.js +0 -425
  672. package/index.js.map +0 -1
  673. package/jobs/taskTimeoutMonitor.d.ts +0 -25
  674. package/jobs/taskTimeoutMonitor.d.ts.map +0 -1
  675. package/jobs/taskTimeoutMonitor.js +0 -94
  676. package/jobs/taskTimeoutMonitor.js.map +0 -1
  677. package/middleware/a2aAuth.d.ts +0 -38
  678. package/middleware/a2aAuth.d.ts.map +0 -1
  679. package/middleware/a2aAuth.js +0 -134
  680. package/middleware/a2aAuth.js.map +0 -1
  681. package/middleware/auth.d.ts +0 -9
  682. package/middleware/auth.d.ts.map +0 -1
  683. package/middleware/auth.js +0 -35
  684. package/middleware/auth.js.map +0 -1
  685. package/middleware/httpsOnly.d.ts +0 -75
  686. package/middleware/httpsOnly.d.ts.map +0 -1
  687. package/middleware/httpsOnly.js +0 -189
  688. package/middleware/httpsOnly.js.map +0 -1
  689. package/middleware/rateLimiting.d.ts +0 -37
  690. package/middleware/rateLimiting.d.ts.map +0 -1
  691. package/middleware/rateLimiting.js +0 -118
  692. package/middleware/rateLimiting.js.map +0 -1
  693. package/public/assets/AgentsPage-Cl2yOPj5.js +0 -10
  694. package/public/assets/Button-DPVn3zDJ.js +0 -1
  695. package/public/assets/ChatPage-BAslLt2l.js +0 -471
  696. package/public/assets/ChatPage-BvQmXfcP.css +0 -1
  697. package/public/assets/CommandForm-C8RL-p7h.js +0 -7
  698. package/public/assets/CommandsPage-DakxsAcv.js +0 -1
  699. package/public/assets/DashboardPage-Dz5tihOs.js +0 -1
  700. package/public/assets/FileBrowser-BXtVLz8h.js +0 -6
  701. package/public/assets/FileExplorer-DFQ7ynXa.js +0 -1
  702. package/public/assets/GeneralSettingsPage-CWWgquA9.js +0 -1
  703. package/public/assets/LandingPage-BDKkpXK0.js +0 -1
  704. package/public/assets/LoginPage-1PbdWrXW.js +0 -16
  705. package/public/assets/McpAdminSettingsPage-BlTO82W3.js +0 -7
  706. package/public/assets/McpPage-Bix7CnMS.js +0 -20
  707. package/public/assets/MemorySettingsPage-Dzq3vCns.js +0 -1
  708. package/public/assets/PluginsPage-oYSGDv3z.js +0 -1
  709. package/public/assets/ProjectSelector-Bp1q7dra.js +0 -1
  710. package/public/assets/ProjectsPage-BKpI8KE2.js +0 -21
  711. package/public/assets/ScheduledTasksPage-D2rYw_Qf.js +0 -1
  712. package/public/assets/SettingsLayout-CfmsuehF.js +0 -1
  713. package/public/assets/SkillsPage-D01PYcoW.js +0 -18
  714. package/public/assets/SubagentForm-CSRBsxUE.js +0 -7
  715. package/public/assets/SubagentsPage-CDaYnbfn.js +0 -1
  716. package/public/assets/SystemInfoPage-DAeYkq91.js +0 -1
  717. package/public/assets/TelemetrySettingsPage-BPuPqJPR.js +0 -1
  718. package/public/assets/ToastTestPage-DkZ9D943.js +0 -1
  719. package/public/assets/ToolsList-Ci2lqPin.js +0 -1
  720. package/public/assets/UnifiedToolSelector-CKjY_qjS.js +0 -1
  721. package/public/assets/VersionSettingsPage-DHUbqInQ.js +0 -5
  722. package/public/assets/WebSocketTunnelPage-BGeVdEp8.js +0 -1
  723. package/public/assets/_basePickBy-BFNUdIR5.js +0 -1
  724. package/public/assets/_baseUniq-DP62Yq8R.js +0 -1
  725. package/public/assets/agents-DG431Wop.js +0 -1
  726. package/public/assets/agents-DwCY2K8p.css +0 -1
  727. package/public/assets/arc-CkNwuwWZ.js +0 -1
  728. package/public/assets/architectureDiagram-VXUJARFQ-7Ky7pc6T.js +0 -36
  729. package/public/assets/blockDiagram-VD42YOAC-Ax8FYBYm.js +0 -122
  730. package/public/assets/c4Diagram-YG6GDRKO-CyNR39OO.js +0 -10
  731. package/public/assets/channel-BKv1iINC.js +0 -1
  732. package/public/assets/chunk-4BX2VUAB-zM0Al_rU.js +0 -1
  733. package/public/assets/chunk-55IACEB6-CCDkr_yY.js +0 -1
  734. package/public/assets/chunk-B4BG7PRW-yOb-P7Po.js +0 -165
  735. package/public/assets/chunk-DI55MBZ5-zGH8m4eb.js +0 -220
  736. package/public/assets/chunk-FMBD7UC4-DI1MjWfw.js +0 -15
  737. package/public/assets/chunk-QN33PNHL-C_FDNT8n.js +0 -1
  738. package/public/assets/chunk-QZHKN3VN-V_K-gce9.js +0 -1
  739. package/public/assets/chunk-TZMSLE5B-BnNBbkNq.js +0 -1
  740. package/public/assets/classDiagram-2ON5EDUG-DWylXt6j.js +0 -1
  741. package/public/assets/classDiagram-v2-WZHVMYZB-DWylXt6j.js +0 -1
  742. package/public/assets/clone-BnTQiQb4.js +0 -1
  743. package/public/assets/cose-bilkent-S5V4N54A-DrNb0vKp.js +0 -1
  744. package/public/assets/cytoscape.esm-DtBltrT8.js +0 -331
  745. package/public/assets/dagre-6UL2VRFP-CtKFNLmb.js +0 -4
  746. package/public/assets/data-structures-C0h9Oap1.js +0 -27
  747. package/public/assets/dateFormat-CXa8VnEC.js +0 -1
  748. package/public/assets/defaultLocale-C4B-KCzX.js +0 -1
  749. package/public/assets/diagram-PSM6KHXK-DpQfOKt-.js +0 -24
  750. package/public/assets/diagram-QEK2KX5R-DscZmfZJ.js +0 -43
  751. package/public/assets/diagram-S2PKOQOG-UbEZAQ1u.js +0 -24
  752. package/public/assets/erDiagram-Q2GNP2WA-mmTcLBrY.js +0 -60
  753. package/public/assets/flowDiagram-NV44I4VS-BsIXhV1w.js +0 -162
  754. package/public/assets/ganttDiagram-LVOFAZNH-CaHkiTYy.js +0 -267
  755. package/public/assets/gitGraphDiagram-NY62KEGX-B-ctMH3l.js +0 -65
  756. package/public/assets/graph-CtuWuGCI.js +0 -1
  757. package/public/assets/index-D9bAK8SN.js +0 -297
  758. package/public/assets/index-DBxcQY5U.css +0 -1
  759. package/public/assets/infoDiagram-F6ZHWCRC-DMsG_8YD.js +0 -2
  760. package/public/assets/init-Gi6I4Gst.js +0 -1
  761. package/public/assets/journeyDiagram-XKPGCS4Q-XnBAE0k9.js +0 -139
  762. package/public/assets/kanban-definition-3W4ZIXB7-DY1J_CQA.js +0 -89
  763. package/public/assets/katex-qrhCpa0F.js +0 -261
  764. package/public/assets/layout-BBAqRBns.js +0 -1
  765. package/public/assets/linear-DXGOqRyX.js +0 -1
  766. package/public/assets/mindmap-definition-VGOIOE7T-D8LYlQnr.js +0 -68
  767. package/public/assets/monaco-editor-DHKm5-VF.js +0 -19
  768. package/public/assets/ordinal-Cboi1Yqb.js +0 -1
  769. package/public/assets/pieDiagram-ADFJNKIX-DqZw-HeQ.js +0 -30
  770. package/public/assets/quadrantDiagram-AYHSOK5B-CfjEkg6d.js +0 -7
  771. package/public/assets/requirementDiagram-UZGBJVZJ-CEbDefgn.js +0 -64
  772. package/public/assets/sankeyDiagram-TZEHDZUN-DOU4OJks.js +0 -10
  773. package/public/assets/sequenceDiagram-WL72ISMW-BmjWQ4oi.js +0 -145
  774. package/public/assets/stateDiagram-FKZM4ZOC-C7lI7uz2.js +0 -1
  775. package/public/assets/stateDiagram-v2-4FDKWEC3-C8Eo5YFb.js +0 -1
  776. package/public/assets/syntax-highlighting-CnREyncB.js +0 -24
  777. package/public/assets/table-F592JIUY.js +0 -1
  778. package/public/assets/timeline-definition-IT6M3QCI-BltidY3A.js +0 -61
  779. package/public/assets/tools-C0JOzoE_.js +0 -1
  780. package/public/assets/treemap-KMMF4GRG-CXskbtZo.js +0 -128
  781. package/public/assets/ui-components-CRCmgMKc.js +0 -646
  782. package/public/assets/useAgents-Bp5Ry-Dk.js +0 -2
  783. package/public/assets/useClaudeVersions-DYM2HCGW.js +0 -1
  784. package/public/assets/useCommands-B0s3JzZs.js +0 -1
  785. package/public/assets/useProjects-DuCnMeYt.js +0 -1
  786. package/public/assets/useSessions-EknKfdIv.js +0 -1
  787. package/public/assets/xychartDiagram-PRI3JC2R-Bk3p1DGz.js +0 -7
  788. package/public/index.html +0 -70
  789. package/routes/__tests__/a2a.integration.test.d.ts +0 -11
  790. package/routes/__tests__/a2a.integration.test.d.ts.map +0 -1
  791. package/routes/__tests__/a2a.integration.test.js +0 -314
  792. package/routes/__tests__/a2a.integration.test.js.map +0 -1
  793. package/routes/__tests__/a2a.test.d.ts +0 -6
  794. package/routes/__tests__/a2a.test.d.ts.map +0 -1
  795. package/routes/__tests__/a2a.test.js +0 -622
  796. package/routes/__tests__/a2a.test.js.map +0 -1
  797. package/routes/__tests__/agents.test.d.ts +0 -6
  798. package/routes/__tests__/agents.test.d.ts.map +0 -1
  799. package/routes/__tests__/agents.test.js +0 -315
  800. package/routes/__tests__/agents.test.js.map +0 -1
  801. package/routes/__tests__/sessions.test.d.ts +0 -7
  802. package/routes/__tests__/sessions.test.d.ts.map +0 -1
  803. package/routes/__tests__/sessions.test.js +0 -330
  804. package/routes/__tests__/sessions.test.js.map +0 -1
  805. package/routes/a2a.d.ts +0 -18
  806. package/routes/a2a.d.ts.map +0 -1
  807. package/routes/a2a.js +0 -718
  808. package/routes/a2a.js.map +0 -1
  809. package/routes/a2a.streaming.test.d.ts +0 -2
  810. package/routes/a2a.streaming.test.d.ts.map +0 -1
  811. package/routes/a2a.streaming.test.js +0 -167
  812. package/routes/a2a.streaming.test.js.map +0 -1
  813. package/routes/a2aManagement.d.ts +0 -21
  814. package/routes/a2aManagement.d.ts.map +0 -1
  815. package/routes/a2aManagement.js +0 -466
  816. package/routes/a2aManagement.js.map +0 -1
  817. package/routes/agents.d.ts +0 -4
  818. package/routes/agents.d.ts.map +0 -1
  819. package/routes/agents.js +0 -1026
  820. package/routes/agents.js.map +0 -1
  821. package/routes/auth.d.ts +0 -4
  822. package/routes/auth.d.ts.map +0 -1
  823. package/routes/auth.js +0 -135
  824. package/routes/auth.js.map +0 -1
  825. package/routes/cloudflareTunnel.d.ts +0 -4
  826. package/routes/cloudflareTunnel.d.ts.map +0 -1
  827. package/routes/cloudflareTunnel.js +0 -250
  828. package/routes/cloudflareTunnel.js.map +0 -1
  829. package/routes/commands.d.ts +0 -4
  830. package/routes/commands.d.ts.map +0 -1
  831. package/routes/commands.js +0 -479
  832. package/routes/commands.js.map +0 -1
  833. package/routes/config.d.ts +0 -4
  834. package/routes/config.d.ts.map +0 -1
  835. package/routes/config.js +0 -211
  836. package/routes/config.js.map +0 -1
  837. package/routes/files.d.ts +0 -4
  838. package/routes/files.d.ts.map +0 -1
  839. package/routes/files.js +0 -361
  840. package/routes/files.js.map +0 -1
  841. package/routes/mcp.d.ts +0 -26
  842. package/routes/mcp.d.ts.map +0 -1
  843. package/routes/mcp.js +0 -796
  844. package/routes/mcp.js.map +0 -1
  845. package/routes/mcpAdmin.d.ts +0 -16
  846. package/routes/mcpAdmin.d.ts.map +0 -1
  847. package/routes/mcpAdmin.js +0 -308
  848. package/routes/mcpAdmin.js.map +0 -1
  849. package/routes/mcpAdminManagement.d.ts +0 -17
  850. package/routes/mcpAdminManagement.d.ts.map +0 -1
  851. package/routes/mcpAdminManagement.js +0 -345
  852. package/routes/mcpAdminManagement.js.map +0 -1
  853. package/routes/media.d.ts +0 -5
  854. package/routes/media.d.ts.map +0 -1
  855. package/routes/media.js +0 -127
  856. package/routes/media.js.map +0 -1
  857. package/routes/mediaAuth.d.ts +0 -8
  858. package/routes/mediaAuth.d.ts.map +0 -1
  859. package/routes/mediaAuth.js +0 -136
  860. package/routes/mediaAuth.js.map +0 -1
  861. package/routes/network.d.ts +0 -9
  862. package/routes/network.d.ts.map +0 -1
  863. package/routes/network.js +0 -60
  864. package/routes/network.js.map +0 -1
  865. package/routes/plugins.d.ts +0 -4
  866. package/routes/plugins.d.ts.map +0 -1
  867. package/routes/plugins.js +0 -339
  868. package/routes/plugins.js.map +0 -1
  869. package/routes/projects.d.ts +0 -4
  870. package/routes/projects.d.ts.map +0 -1
  871. package/routes/projects.js +0 -1000
  872. package/routes/projects.js.map +0 -1
  873. package/routes/scheduledTasks.d.ts +0 -9
  874. package/routes/scheduledTasks.d.ts.map +0 -1
  875. package/routes/scheduledTasks.js +0 -386
  876. package/routes/scheduledTasks.js.map +0 -1
  877. package/routes/sessions.d.ts +0 -4
  878. package/routes/sessions.d.ts.map +0 -1
  879. package/routes/sessions.js +0 -966
  880. package/routes/sessions.js.map +0 -1
  881. package/routes/settings.d.ts +0 -4
  882. package/routes/settings.d.ts.map +0 -1
  883. package/routes/settings.js +0 -499
  884. package/routes/settings.js.map +0 -1
  885. package/routes/skills.d.ts +0 -4
  886. package/routes/skills.d.ts.map +0 -1
  887. package/routes/skills.js +0 -272
  888. package/routes/skills.js.map +0 -1
  889. package/routes/slack.d.ts +0 -10
  890. package/routes/slack.d.ts.map +0 -1
  891. package/routes/slack.js +0 -189
  892. package/routes/slack.js.map +0 -1
  893. package/routes/slides.d.ts +0 -4
  894. package/routes/slides.d.ts.map +0 -1
  895. package/routes/slides.js +0 -148
  896. package/routes/slides.js.map +0 -1
  897. package/routes/subagents.d.ts +0 -4
  898. package/routes/subagents.d.ts.map +0 -1
  899. package/routes/subagents.js +0 -331
  900. package/routes/subagents.js.map +0 -1
  901. package/routes/taskExecutor.d.ts +0 -9
  902. package/routes/taskExecutor.d.ts.map +0 -1
  903. package/routes/taskExecutor.js +0 -224
  904. package/routes/taskExecutor.js.map +0 -1
  905. package/routes/tunnel.d.ts +0 -10
  906. package/routes/tunnel.d.ts.map +0 -1
  907. package/routes/tunnel.js +0 -296
  908. package/routes/tunnel.js.map +0 -1
  909. package/routes/version.d.ts +0 -4
  910. package/routes/version.d.ts.map +0 -1
  911. package/routes/version.js +0 -216
  912. package/routes/version.js.map +0 -1
  913. package/schemas/a2a.d.ts +0 -946
  914. package/schemas/a2a.d.ts.map +0 -1
  915. package/schemas/a2a.js +0 -316
  916. package/schemas/a2a.js.map +0 -1
  917. package/scripts/postinstall.js +0 -10
  918. package/services/__tests__/pluginInstaller.test.d.ts +0 -5
  919. package/services/__tests__/pluginInstaller.test.d.ts.map +0 -1
  920. package/services/__tests__/pluginInstaller.test.js +0 -290
  921. package/services/__tests__/pluginInstaller.test.js.map +0 -1
  922. package/services/__tests__/pluginParser.test.d.ts +0 -5
  923. package/services/__tests__/pluginParser.test.d.ts.map +0 -1
  924. package/services/__tests__/pluginParser.test.js +0 -272
  925. package/services/__tests__/pluginParser.test.js.map +0 -1
  926. package/services/__tests__/pluginPaths.test.d.ts +0 -5
  927. package/services/__tests__/pluginPaths.test.d.ts.map +0 -1
  928. package/services/__tests__/pluginPaths.test.js +0 -221
  929. package/services/__tests__/pluginPaths.test.js.map +0 -1
  930. package/services/__tests__/pluginScanner.test.d.ts +0 -5
  931. package/services/__tests__/pluginScanner.test.d.ts.map +0 -1
  932. package/services/__tests__/pluginScanner.test.js +0 -272
  933. package/services/__tests__/pluginScanner.test.js.map +0 -1
  934. package/services/__tests__/pluginSymlink.test.d.ts +0 -5
  935. package/services/__tests__/pluginSymlink.test.d.ts.map +0 -1
  936. package/services/__tests__/pluginSymlink.test.js +0 -318
  937. package/services/__tests__/pluginSymlink.test.js.map +0 -1
  938. package/services/__tests__/projectMetadataStorage.test.d.ts +0 -5
  939. package/services/__tests__/projectMetadataStorage.test.d.ts.map +0 -1
  940. package/services/__tests__/projectMetadataStorage.test.js +0 -154
  941. package/services/__tests__/projectMetadataStorage.test.js.map +0 -1
  942. package/services/__tests__/sessionConcurrency.test.d.ts +0 -7
  943. package/services/__tests__/sessionConcurrency.test.d.ts.map +0 -1
  944. package/services/__tests__/sessionConcurrency.test.js +0 -110
  945. package/services/__tests__/sessionConcurrency.test.js.map +0 -1
  946. package/services/__tests__/slackAIService.test.d.ts +0 -5
  947. package/services/__tests__/slackAIService.test.d.ts.map +0 -1
  948. package/services/__tests__/slackAIService.test.js +0 -479
  949. package/services/__tests__/slackAIService.test.js.map +0 -1
  950. package/services/__tests__/slackThreadMapper.test.d.ts +0 -5
  951. package/services/__tests__/slackThreadMapper.test.d.ts.map +0 -1
  952. package/services/__tests__/slackThreadMapper.test.js +0 -194
  953. package/services/__tests__/slackThreadMapper.test.js.map +0 -1
  954. package/services/a2a/__tests__/a2aClientTool.integration.test.d.ts +0 -6
  955. package/services/a2a/__tests__/a2aClientTool.integration.test.d.ts.map +0 -1
  956. package/services/a2a/__tests__/a2aClientTool.integration.test.js +0 -264
  957. package/services/a2a/__tests__/a2aClientTool.integration.test.js.map +0 -1
  958. package/services/a2a/__tests__/a2aClientTool.test.d.ts +0 -6
  959. package/services/a2a/__tests__/a2aClientTool.test.d.ts.map +0 -1
  960. package/services/a2a/__tests__/a2aClientTool.test.js +0 -592
  961. package/services/a2a/__tests__/a2aClientTool.test.js.map +0 -1
  962. package/services/a2a/__tests__/a2aConfigService.test.d.ts +0 -6
  963. package/services/a2a/__tests__/a2aConfigService.test.d.ts.map +0 -1
  964. package/services/a2a/__tests__/a2aConfigService.test.js +0 -431
  965. package/services/a2a/__tests__/a2aConfigService.test.js.map +0 -1
  966. package/services/a2a/__tests__/a2aConfigServicePath.test.d.ts +0 -2
  967. package/services/a2a/__tests__/a2aConfigServicePath.test.d.ts.map +0 -1
  968. package/services/a2a/__tests__/a2aConfigServicePath.test.js +0 -49
  969. package/services/a2a/__tests__/a2aConfigServicePath.test.js.map +0 -1
  970. package/services/a2a/__tests__/a2aSdkMcp.test.d.ts +0 -10
  971. package/services/a2a/__tests__/a2aSdkMcp.test.d.ts.map +0 -1
  972. package/services/a2a/__tests__/a2aSdkMcp.test.js +0 -239
  973. package/services/a2a/__tests__/a2aSdkMcp.test.js.map +0 -1
  974. package/services/a2a/__tests__/agentCardService.test.d.ts +0 -6
  975. package/services/a2a/__tests__/agentCardService.test.d.ts.map +0 -1
  976. package/services/a2a/__tests__/agentCardService.test.js +0 -292
  977. package/services/a2a/__tests__/agentCardService.test.js.map +0 -1
  978. package/services/a2a/__tests__/apiKeyService.test.d.ts +0 -6
  979. package/services/a2a/__tests__/apiKeyService.test.d.ts.map +0 -1
  980. package/services/a2a/__tests__/apiKeyService.test.js +0 -284
  981. package/services/a2a/__tests__/apiKeyService.test.js.map +0 -1
  982. package/services/a2a/__tests__/buildQueryOptionsIntegration.test.d.ts +0 -2
  983. package/services/a2a/__tests__/buildQueryOptionsIntegration.test.d.ts.map +0 -1
  984. package/services/a2a/__tests__/buildQueryOptionsIntegration.test.js +0 -70
  985. package/services/a2a/__tests__/buildQueryOptionsIntegration.test.js.map +0 -1
  986. package/services/a2a/__tests__/dynamic_config_verification.test.d.ts +0 -2
  987. package/services/a2a/__tests__/dynamic_config_verification.test.d.ts.map +0 -1
  988. package/services/a2a/__tests__/dynamic_config_verification.test.js +0 -67
  989. package/services/a2a/__tests__/dynamic_config_verification.test.js.map +0 -1
  990. package/services/a2a/__tests__/integrateA2AMcpServer.test.d.ts +0 -2
  991. package/services/a2a/__tests__/integrateA2AMcpServer.test.d.ts.map +0 -1
  992. package/services/a2a/__tests__/integrateA2AMcpServer.test.js +0 -112
  993. package/services/a2a/__tests__/integrateA2AMcpServer.test.js.map +0 -1
  994. package/services/a2a/__tests__/taskManager.integration.test.d.ts +0 -7
  995. package/services/a2a/__tests__/taskManager.integration.test.d.ts.map +0 -1
  996. package/services/a2a/__tests__/taskManager.integration.test.js +0 -346
  997. package/services/a2a/__tests__/taskManager.integration.test.js.map +0 -1
  998. package/services/a2a/__tests__/taskManager.test.d.ts +0 -7
  999. package/services/a2a/__tests__/taskManager.test.d.ts.map +0 -1
  1000. package/services/a2a/__tests__/taskManager.test.js +0 -423
  1001. package/services/a2a/__tests__/taskManager.test.js.map +0 -1
  1002. package/services/a2a/__tests__/webhookService.test.d.ts +0 -6
  1003. package/services/a2a/__tests__/webhookService.test.d.ts.map +0 -1
  1004. package/services/a2a/__tests__/webhookService.test.js +0 -196
  1005. package/services/a2a/__tests__/webhookService.test.js.map +0 -1
  1006. package/services/a2a/a2aClientTool.d.ts +0 -73
  1007. package/services/a2a/a2aClientTool.d.ts.map +0 -1
  1008. package/services/a2a/a2aClientTool.js +0 -595
  1009. package/services/a2a/a2aClientTool.js.map +0 -1
  1010. package/services/a2a/a2aConfigService.d.ts +0 -50
  1011. package/services/a2a/a2aConfigService.d.ts.map +0 -1
  1012. package/services/a2a/a2aConfigService.js +0 -186
  1013. package/services/a2a/a2aConfigService.js.map +0 -1
  1014. package/services/a2a/a2aHistoryService.d.ts +0 -32
  1015. package/services/a2a/a2aHistoryService.d.ts.map +0 -1
  1016. package/services/a2a/a2aHistoryService.js +0 -108
  1017. package/services/a2a/a2aHistoryService.js.map +0 -1
  1018. package/services/a2a/a2aIntegration.d.ts +0 -10
  1019. package/services/a2a/a2aIntegration.d.ts.map +0 -1
  1020. package/services/a2a/a2aIntegration.js +0 -42
  1021. package/services/a2a/a2aIntegration.js.map +0 -1
  1022. package/services/a2a/a2aQueryService.d.ts +0 -71
  1023. package/services/a2a/a2aQueryService.d.ts.map +0 -1
  1024. package/services/a2a/a2aQueryService.js +0 -209
  1025. package/services/a2a/a2aQueryService.js.map +0 -1
  1026. package/services/a2a/a2aSdkMcp.d.ts +0 -52
  1027. package/services/a2a/a2aSdkMcp.d.ts.map +0 -1
  1028. package/services/a2a/a2aSdkMcp.js +0 -188
  1029. package/services/a2a/a2aSdkMcp.js.map +0 -1
  1030. package/services/a2a/a2aStreamEvents.d.ts +0 -94
  1031. package/services/a2a/a2aStreamEvents.d.ts.map +0 -1
  1032. package/services/a2a/a2aStreamEvents.js +0 -92
  1033. package/services/a2a/a2aStreamEvents.js.map +0 -1
  1034. package/services/a2a/agentCardService.d.ts +0 -34
  1035. package/services/a2a/agentCardService.d.ts.map +0 -1
  1036. package/services/a2a/agentCardService.js +0 -228
  1037. package/services/a2a/agentCardService.js.map +0 -1
  1038. package/services/a2a/agentMappingService.d.ts +0 -53
  1039. package/services/a2a/agentMappingService.d.ts.map +0 -1
  1040. package/services/a2a/agentMappingService.js +0 -185
  1041. package/services/a2a/agentMappingService.js.map +0 -1
  1042. package/services/a2a/apiKeyService.d.ts +0 -101
  1043. package/services/a2a/apiKeyService.d.ts.map +0 -1
  1044. package/services/a2a/apiKeyService.js +0 -314
  1045. package/services/a2a/apiKeyService.js.map +0 -1
  1046. package/services/a2a/taskCleanup.d.ts +0 -30
  1047. package/services/a2a/taskCleanup.d.ts.map +0 -1
  1048. package/services/a2a/taskCleanup.js +0 -184
  1049. package/services/a2a/taskCleanup.js.map +0 -1
  1050. package/services/a2a/taskManager.d.ts +0 -87
  1051. package/services/a2a/taskManager.d.ts.map +0 -1
  1052. package/services/a2a/taskManager.js +0 -265
  1053. package/services/a2a/taskManager.js.map +0 -1
  1054. package/services/a2a/webhookService.d.ts +0 -30
  1055. package/services/a2a/webhookService.d.ts.map +0 -1
  1056. package/services/a2a/webhookService.js +0 -113
  1057. package/services/a2a/webhookService.js.map +0 -1
  1058. package/services/agentStorage.d.ts +0 -27
  1059. package/services/agentStorage.d.ts.map +0 -1
  1060. package/services/agentStorage.js +0 -487
  1061. package/services/agentStorage.js.map +0 -1
  1062. package/services/askUserQuestion/askUserQuestionIntegration.d.ts +0 -24
  1063. package/services/askUserQuestion/askUserQuestionIntegration.d.ts.map +0 -1
  1064. package/services/askUserQuestion/askUserQuestionIntegration.js +0 -52
  1065. package/services/askUserQuestion/askUserQuestionIntegration.js.map +0 -1
  1066. package/services/askUserQuestion/askUserQuestionMcp.d.ts +0 -103
  1067. package/services/askUserQuestion/askUserQuestionMcp.d.ts.map +0 -1
  1068. package/services/askUserQuestion/askUserQuestionMcp.js +0 -129
  1069. package/services/askUserQuestion/askUserQuestionMcp.js.map +0 -1
  1070. package/services/askUserQuestion/index.d.ts +0 -13
  1071. package/services/askUserQuestion/index.d.ts.map +0 -1
  1072. package/services/askUserQuestion/index.js +0 -35
  1073. package/services/askUserQuestion/index.js.map +0 -1
  1074. package/services/askUserQuestion/init.d.ts +0 -17
  1075. package/services/askUserQuestion/init.d.ts.map +0 -1
  1076. package/services/askUserQuestion/init.js +0 -47
  1077. package/services/askUserQuestion/init.js.map +0 -1
  1078. package/services/askUserQuestion/notificationChannel.d.ts +0 -97
  1079. package/services/askUserQuestion/notificationChannel.d.ts.map +0 -1
  1080. package/services/askUserQuestion/notificationChannel.js +0 -147
  1081. package/services/askUserQuestion/notificationChannel.js.map +0 -1
  1082. package/services/askUserQuestion/slackNotificationChannel.d.ts +0 -35
  1083. package/services/askUserQuestion/slackNotificationChannel.d.ts.map +0 -1
  1084. package/services/askUserQuestion/slackNotificationChannel.js +0 -129
  1085. package/services/askUserQuestion/slackNotificationChannel.js.map +0 -1
  1086. package/services/askUserQuestion/sseNotificationChannel.d.ts +0 -36
  1087. package/services/askUserQuestion/sseNotificationChannel.d.ts.map +0 -1
  1088. package/services/askUserQuestion/sseNotificationChannel.js +0 -88
  1089. package/services/askUserQuestion/sseNotificationChannel.js.map +0 -1
  1090. package/services/askUserQuestion/userInputRegistry.d.ts +0 -107
  1091. package/services/askUserQuestion/userInputRegistry.d.ts.map +0 -1
  1092. package/services/askUserQuestion/userInputRegistry.js +0 -253
  1093. package/services/askUserQuestion/userInputRegistry.js.map +0 -1
  1094. package/services/claudeSession.d.ts +0 -113
  1095. package/services/claudeSession.d.ts.map +0 -1
  1096. package/services/claudeSession.js +0 -375
  1097. package/services/claudeSession.js.map +0 -1
  1098. package/services/claudeVersionStorage.d.ts +0 -20
  1099. package/services/claudeVersionStorage.d.ts.map +0 -1
  1100. package/services/claudeVersionStorage.js +0 -331
  1101. package/services/claudeVersionStorage.js.map +0 -1
  1102. package/services/mcpAdmin/__tests__/adminApiKeyService.test.d.ts +0 -5
  1103. package/services/mcpAdmin/__tests__/adminApiKeyService.test.d.ts.map +0 -1
  1104. package/services/mcpAdmin/__tests__/adminApiKeyService.test.js +0 -289
  1105. package/services/mcpAdmin/__tests__/adminApiKeyService.test.js.map +0 -1
  1106. package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.d.ts +0 -5
  1107. package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.d.ts.map +0 -1
  1108. package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.js +0 -345
  1109. package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.js.map +0 -1
  1110. package/services/mcpAdmin/__tests__/mcpAdminServer.test.d.ts +0 -5
  1111. package/services/mcpAdmin/__tests__/mcpAdminServer.test.d.ts.map +0 -1
  1112. package/services/mcpAdmin/__tests__/mcpAdminServer.test.js +0 -453
  1113. package/services/mcpAdmin/__tests__/mcpAdminServer.test.js.map +0 -1
  1114. package/services/mcpAdmin/__tests__/providerTools.test.d.ts +0 -7
  1115. package/services/mcpAdmin/__tests__/providerTools.test.d.ts.map +0 -1
  1116. package/services/mcpAdmin/__tests__/providerTools.test.js +0 -258
  1117. package/services/mcpAdmin/__tests__/providerTools.test.js.map +0 -1
  1118. package/services/mcpAdmin/__tests__/tools.test.d.ts +0 -5
  1119. package/services/mcpAdmin/__tests__/tools.test.d.ts.map +0 -1
  1120. package/services/mcpAdmin/__tests__/tools.test.js +0 -389
  1121. package/services/mcpAdmin/__tests__/tools.test.js.map +0 -1
  1122. package/services/mcpAdmin/adminApiKeyService.d.ts +0 -61
  1123. package/services/mcpAdmin/adminApiKeyService.d.ts.map +0 -1
  1124. package/services/mcpAdmin/adminApiKeyService.js +0 -270
  1125. package/services/mcpAdmin/adminApiKeyService.js.map +0 -1
  1126. package/services/mcpAdmin/index.d.ts +0 -10
  1127. package/services/mcpAdmin/index.d.ts.map +0 -1
  1128. package/services/mcpAdmin/index.js +0 -43
  1129. package/services/mcpAdmin/index.js.map +0 -1
  1130. package/services/mcpAdmin/mcpAdminServer.d.ts +0 -76
  1131. package/services/mcpAdmin/mcpAdminServer.d.ts.map +0 -1
  1132. package/services/mcpAdmin/mcpAdminServer.js +0 -243
  1133. package/services/mcpAdmin/mcpAdminServer.js.map +0 -1
  1134. package/services/mcpAdmin/tools/agentTools.d.ts +0 -27
  1135. package/services/mcpAdmin/tools/agentTools.d.ts.map +0 -1
  1136. package/services/mcpAdmin/tools/agentTools.js +0 -352
  1137. package/services/mcpAdmin/tools/agentTools.js.map +0 -1
  1138. package/services/mcpAdmin/tools/index.d.ts +0 -16
  1139. package/services/mcpAdmin/tools/index.d.ts.map +0 -1
  1140. package/services/mcpAdmin/tools/index.js +0 -34
  1141. package/services/mcpAdmin/tools/index.js.map +0 -1
  1142. package/services/mcpAdmin/tools/mcpServerTools.d.ts +0 -27
  1143. package/services/mcpAdmin/tools/mcpServerTools.d.ts.map +0 -1
  1144. package/services/mcpAdmin/tools/mcpServerTools.js +0 -334
  1145. package/services/mcpAdmin/tools/mcpServerTools.js.map +0 -1
  1146. package/services/mcpAdmin/tools/projectTools.d.ts +0 -27
  1147. package/services/mcpAdmin/tools/projectTools.d.ts.map +0 -1
  1148. package/services/mcpAdmin/tools/projectTools.js +0 -382
  1149. package/services/mcpAdmin/tools/projectTools.js.map +0 -1
  1150. package/services/mcpAdmin/tools/providerTools.d.ts +0 -40
  1151. package/services/mcpAdmin/tools/providerTools.d.ts.map +0 -1
  1152. package/services/mcpAdmin/tools/providerTools.js +0 -581
  1153. package/services/mcpAdmin/tools/providerTools.js.map +0 -1
  1154. package/services/mcpAdmin/tools/systemTools.d.ts +0 -23
  1155. package/services/mcpAdmin/tools/systemTools.d.ts.map +0 -1
  1156. package/services/mcpAdmin/tools/systemTools.js +0 -241
  1157. package/services/mcpAdmin/tools/systemTools.js.map +0 -1
  1158. package/services/mcpAdmin/types.d.ts +0 -124
  1159. package/services/mcpAdmin/types.d.ts.map +0 -1
  1160. package/services/mcpAdmin/types.js +0 -18
  1161. package/services/mcpAdmin/types.js.map +0 -1
  1162. package/services/messageQueue.d.ts +0 -31
  1163. package/services/messageQueue.d.ts.map +0 -1
  1164. package/services/messageQueue.js +0 -80
  1165. package/services/messageQueue.js.map +0 -1
  1166. package/services/pluginInstaller.d.ts +0 -58
  1167. package/services/pluginInstaller.d.ts.map +0 -1
  1168. package/services/pluginInstaller.js +0 -321
  1169. package/services/pluginInstaller.js.map +0 -1
  1170. package/services/pluginParser.d.ts +0 -45
  1171. package/services/pluginParser.d.ts.map +0 -1
  1172. package/services/pluginParser.js +0 -437
  1173. package/services/pluginParser.js.map +0 -1
  1174. package/services/pluginPaths.d.ts +0 -80
  1175. package/services/pluginPaths.d.ts.map +0 -1
  1176. package/services/pluginPaths.js +0 -274
  1177. package/services/pluginPaths.js.map +0 -1
  1178. package/services/pluginScanner.d.ts +0 -36
  1179. package/services/pluginScanner.d.ts.map +0 -1
  1180. package/services/pluginScanner.js +0 -251
  1181. package/services/pluginScanner.js.map +0 -1
  1182. package/services/pluginSymlink.d.ts +0 -54
  1183. package/services/pluginSymlink.d.ts.map +0 -1
  1184. package/services/pluginSymlink.js +0 -223
  1185. package/services/pluginSymlink.js.map +0 -1
  1186. package/services/projectMetadataStorage.d.ts +0 -121
  1187. package/services/projectMetadataStorage.d.ts.map +0 -1
  1188. package/services/projectMetadataStorage.js +0 -810
  1189. package/services/projectMetadataStorage.js.map +0 -1
  1190. package/services/scheduledTaskStorage.d.ts +0 -63
  1191. package/services/scheduledTaskStorage.d.ts.map +0 -1
  1192. package/services/scheduledTaskStorage.js +0 -351
  1193. package/services/scheduledTaskStorage.js.map +0 -1
  1194. package/services/schedulerService.d.ts +0 -91
  1195. package/services/schedulerService.d.ts.map +0 -1
  1196. package/services/schedulerService.js +0 -590
  1197. package/services/schedulerService.js.map +0 -1
  1198. package/services/sessionManager.d.ts +0 -176
  1199. package/services/sessionManager.d.ts.map +0 -1
  1200. package/services/sessionManager.js +0 -647
  1201. package/services/sessionManager.js.map +0 -1
  1202. package/services/skillStorage.d.ts +0 -60
  1203. package/services/skillStorage.d.ts.map +0 -1
  1204. package/services/skillStorage.js +0 -398
  1205. package/services/skillStorage.js.map +0 -1
  1206. package/services/slackAIService.d.ts +0 -81
  1207. package/services/slackAIService.d.ts.map +0 -1
  1208. package/services/slackAIService.js +0 -1137
  1209. package/services/slackAIService.js.map +0 -1
  1210. package/services/slackClient.d.ts +0 -46
  1211. package/services/slackClient.d.ts.map +0 -1
  1212. package/services/slackClient.js +0 -85
  1213. package/services/slackClient.js.map +0 -1
  1214. package/services/slackSessionLock.d.ts +0 -79
  1215. package/services/slackSessionLock.d.ts.map +0 -1
  1216. package/services/slackSessionLock.js +0 -353
  1217. package/services/slackSessionLock.js.map +0 -1
  1218. package/services/slackThreadMapper.d.ts +0 -57
  1219. package/services/slackThreadMapper.d.ts.map +0 -1
  1220. package/services/slackThreadMapper.js +0 -140
  1221. package/services/slackThreadMapper.js.map +0 -1
  1222. package/services/taskExecutor/BuiltinExecutor.d.ts +0 -44
  1223. package/services/taskExecutor/BuiltinExecutor.d.ts.map +0 -1
  1224. package/services/taskExecutor/BuiltinExecutor.js +0 -513
  1225. package/services/taskExecutor/BuiltinExecutor.js.map +0 -1
  1226. package/services/taskExecutor/__tests__/a2a-tasks.test.d.ts +0 -7
  1227. package/services/taskExecutor/__tests__/a2a-tasks.test.d.ts.map +0 -1
  1228. package/services/taskExecutor/__tests__/a2a-tasks.test.js +0 -328
  1229. package/services/taskExecutor/__tests__/a2a-tasks.test.js.map +0 -1
  1230. package/services/taskExecutor/__tests__/e2e-workflows.test.d.ts +0 -7
  1231. package/services/taskExecutor/__tests__/e2e-workflows.test.d.ts.map +0 -1
  1232. package/services/taskExecutor/__tests__/e2e-workflows.test.js +0 -446
  1233. package/services/taskExecutor/__tests__/e2e-workflows.test.js.map +0 -1
  1234. package/services/taskExecutor/__tests__/error-handling.test.d.ts +0 -7
  1235. package/services/taskExecutor/__tests__/error-handling.test.d.ts.map +0 -1
  1236. package/services/taskExecutor/__tests__/error-handling.test.js +0 -387
  1237. package/services/taskExecutor/__tests__/error-handling.test.js.map +0 -1
  1238. package/services/taskExecutor/__tests__/stress.test.d.ts +0 -7
  1239. package/services/taskExecutor/__tests__/stress.test.d.ts.map +0 -1
  1240. package/services/taskExecutor/__tests__/stress.test.js +0 -329
  1241. package/services/taskExecutor/__tests__/stress.test.js.map +0 -1
  1242. package/services/taskExecutor/__tests__/taskExecutor.integration.test.d.ts +0 -7
  1243. package/services/taskExecutor/__tests__/taskExecutor.integration.test.d.ts.map +0 -1
  1244. package/services/taskExecutor/__tests__/taskExecutor.integration.test.js +0 -205
  1245. package/services/taskExecutor/__tests__/taskExecutor.integration.test.js.map +0 -1
  1246. package/services/taskExecutor/__tests__/timeout-cancellation.test.d.ts +0 -7
  1247. package/services/taskExecutor/__tests__/timeout-cancellation.test.d.ts.map +0 -1
  1248. package/services/taskExecutor/__tests__/timeout-cancellation.test.js +0 -319
  1249. package/services/taskExecutor/__tests__/timeout-cancellation.test.js.map +0 -1
  1250. package/services/taskExecutor/index.d.ts +0 -40
  1251. package/services/taskExecutor/index.d.ts.map +0 -1
  1252. package/services/taskExecutor/index.js +0 -166
  1253. package/services/taskExecutor/index.js.map +0 -1
  1254. package/services/taskExecutor/taskWorker.d.ts +0 -11
  1255. package/services/taskExecutor/taskWorker.d.ts.map +0 -1
  1256. package/services/taskExecutor/taskWorker.js +0 -171
  1257. package/services/taskExecutor/taskWorker.js.map +0 -1
  1258. package/services/taskExecutor/types.d.ts +0 -145
  1259. package/services/taskExecutor/types.d.ts.map +0 -1
  1260. package/services/taskExecutor/types.js +0 -9
  1261. package/services/taskExecutor/types.js.map +0 -1
  1262. package/services/telemetry.d.ts +0 -40
  1263. package/services/telemetry.d.ts.map +0 -1
  1264. package/services/telemetry.js +0 -245
  1265. package/services/telemetry.js.map +0 -1
  1266. package/services/tunnelService.d.ts +0 -165
  1267. package/services/tunnelService.d.ts.map +0 -1
  1268. package/services/tunnelService.js +0 -493
  1269. package/services/tunnelService.js.map +0 -1
  1270. package/types/a2a.d.ts +0 -293
  1271. package/types/a2a.d.ts.map +0 -1
  1272. package/types/a2a.js +0 -23
  1273. package/types/a2a.js.map +0 -1
  1274. package/types/agents.d.ts +0 -94
  1275. package/types/agents.d.ts.map +0 -1
  1276. package/types/agents.js +0 -45
  1277. package/types/agents.js.map +0 -1
  1278. package/types/claude-history.d.ts +0 -62
  1279. package/types/claude-history.d.ts.map +0 -1
  1280. package/types/claude-history.js +0 -4
  1281. package/types/claude-history.js.map +0 -1
  1282. package/types/claude-versions.d.ts +0 -36
  1283. package/types/claude-versions.d.ts.map +0 -1
  1284. package/types/claude-versions.js +0 -3
  1285. package/types/claude-versions.js.map +0 -1
  1286. package/types/commands.d.ts +0 -50
  1287. package/types/commands.d.ts.map +0 -1
  1288. package/types/commands.js +0 -23
  1289. package/types/commands.js.map +0 -1
  1290. package/types/plugins.d.ts +0 -144
  1291. package/types/plugins.d.ts.map +0 -1
  1292. package/types/plugins.js +0 -8
  1293. package/types/plugins.js.map +0 -1
  1294. package/types/projects.d.ts +0 -46
  1295. package/types/projects.d.ts.map +0 -1
  1296. package/types/projects.js +0 -4
  1297. package/types/projects.js.map +0 -1
  1298. package/types/scheduledTasks.d.ts +0 -168
  1299. package/types/scheduledTasks.d.ts.map +0 -1
  1300. package/types/scheduledTasks.js +0 -17
  1301. package/types/scheduledTasks.js.map +0 -1
  1302. package/types/skills.d.ts +0 -91
  1303. package/types/skills.d.ts.map +0 -1
  1304. package/types/skills.js +0 -6
  1305. package/types/skills.js.map +0 -1
  1306. package/types/slack.d.ts +0 -97
  1307. package/types/slack.d.ts.map +0 -1
  1308. package/types/slack.js +0 -8
  1309. package/types/slack.js.map +0 -1
  1310. package/types/streaming.d.ts +0 -12
  1311. package/types/streaming.d.ts.map +0 -1
  1312. package/types/streaming.js +0 -8
  1313. package/types/streaming.js.map +0 -1
  1314. package/types/subagents.d.ts +0 -26
  1315. package/types/subagents.d.ts.map +0 -1
  1316. package/types/subagents.js +0 -3
  1317. package/types/subagents.js.map +0 -1
  1318. package/utils/__tests__/claudeUtils.test.d.ts +0 -5
  1319. package/utils/__tests__/claudeUtils.test.d.ts.map +0 -1
  1320. package/utils/__tests__/claudeUtils.test.js +0 -283
  1321. package/utils/__tests__/claudeUtils.test.js.map +0 -1
  1322. package/utils/__tests__/configResolver.test.d.ts +0 -7
  1323. package/utils/__tests__/configResolver.test.d.ts.map +0 -1
  1324. package/utils/__tests__/configResolver.test.js +0 -211
  1325. package/utils/__tests__/configResolver.test.js.map +0 -1
  1326. package/utils/__tests__/sessionUtils.test.d.ts +0 -5
  1327. package/utils/__tests__/sessionUtils.test.d.ts.map +0 -1
  1328. package/utils/__tests__/sessionUtils.test.js +0 -296
  1329. package/utils/__tests__/sessionUtils.test.js.map +0 -1
  1330. package/utils/agentCardCache.d.ts +0 -93
  1331. package/utils/agentCardCache.d.ts.map +0 -1
  1332. package/utils/agentCardCache.js +0 -212
  1333. package/utils/agentCardCache.js.map +0 -1
  1334. package/utils/claudeUtils.d.ts +0 -55
  1335. package/utils/claudeUtils.d.ts.map +0 -1
  1336. package/utils/claudeUtils.js +0 -355
  1337. package/utils/claudeUtils.js.map +0 -1
  1338. package/utils/configResolver.d.ts +0 -57
  1339. package/utils/configResolver.d.ts.map +0 -1
  1340. package/utils/configResolver.js +0 -130
  1341. package/utils/configResolver.js.map +0 -1
  1342. package/utils/fileUtils.d.ts +0 -2
  1343. package/utils/fileUtils.d.ts.map +0 -1
  1344. package/utils/fileUtils.js +0 -11
  1345. package/utils/fileUtils.js.map +0 -1
  1346. package/utils/jwt.d.ts +0 -30
  1347. package/utils/jwt.d.ts.map +0 -1
  1348. package/utils/jwt.js +0 -95
  1349. package/utils/jwt.js.map +0 -1
  1350. package/utils/networkUtils.d.ts +0 -25
  1351. package/utils/networkUtils.d.ts.map +0 -1
  1352. package/utils/networkUtils.js +0 -65
  1353. package/utils/networkUtils.js.map +0 -1
  1354. package/utils/sessionUtils.d.ts +0 -67
  1355. package/utils/sessionUtils.d.ts.map +0 -1
  1356. package/utils/sessionUtils.js +0 -296
  1357. package/utils/sessionUtils.js.map +0 -1
  1358. /package/{public → frontend/public}/cc-studio.png +0 -0
  1359. /package/{public → frontend/public}/screenshot-chat.png +0 -0
  1360. /package/{public → frontend/public}/screenshot-mcp.png +0 -0
  1361. /package/{public → frontend/public}/vite.svg +0 -0
  1362. /package/{public → frontend/public}/wechat-qr-code.png +0 -0
@@ -0,0 +1,1395 @@
1
+ /**
2
+ * Slack AI Service
3
+ *
4
+ * Adapts AgentStudio's AI architecture for Slack
5
+ * Reuses sessionManager, AgentStorage, and Claude Code SDK
6
+ * WITHOUT modifying existing SSE implementation
7
+ */
8
+
9
+ import * as path from 'path';
10
+ import * as fs from 'fs';
11
+ import { sessionManager } from './sessionManager.js';
12
+ import { AgentStorage } from './agentStorage.js';
13
+ import { slackThreadMapper } from './slackThreadMapper.js';
14
+ import { slackSessionLock } from './slackSessionLock.js';
15
+ import { SlackClient } from './slackClient.js';
16
+ import { ProjectMetadataStorage } from './projectMetadataStorage.js';
17
+ import { getSlackConfig } from '../config/index.js';
18
+ import type { SlackMessageEvent, SlackAppMentionEvent, ProjectParseResult, SlackFile } from '../types/slack.js';
19
+ import type { ProjectWithAgentInfo } from '../types/projects.js';
20
+ import { buildQueryOptions, getDefaultClaudeVersionEnv } from '../utils/claudeUtils.js';
21
+ import { getDefaultVersionId, getVersionByIdInternal } from './claudeVersionStorage.js';
22
+ import { buildUserMessageContent } from '../utils/sessionUtils.js';
23
+
24
+ /**
25
+ * Slack messages - Extracted for easier localization
26
+ */
27
+ const SLACK_MESSAGES = {
28
+ // Status messages
29
+ THINKING: '🤔 正在思考...',
30
+ THINKING_WITH_AGENT: (agentName: string, projectInfo: string) =>
31
+ `🤔 ${agentName}${projectInfo} 正在思考...`,
32
+ THINKING_LABEL: '💭 **思考中...**',
33
+ COMPLETED: '✅ 完成',
34
+ SESSION_BUSY: (agentName: string) =>
35
+ `🚦 ${agentName} 正在处理其他消息,请稍后再试...`,
36
+
37
+ // Error messages
38
+ ERROR_GENERIC: '❌ 处理请求时发生错误,请稍后重试',
39
+ ERROR_WITH_MESSAGE: (message: string) =>
40
+ `❌ 错误: ${message}`,
41
+ ERROR_PROCESSING: (message: string) =>
42
+ `❌ 处理消息时发生错误: ${message}`,
43
+ UNKNOWN_ERROR: '未知错误',
44
+
45
+ // Project messages
46
+ PROJECT_MULTIPLE_MATCHES: (projectList: string) =>
47
+ `🎯 **找到多个匹配的项目,请选择:**\n\n${projectList}\n\n📝 **使用方法:**\n• 指定目录名:\`proj:目录名\`\n• 或指定完整路径:\`proj:/完整/路径\``,
48
+ PROJECT_NOT_FOUND: (identifier: string, sampleProjects: string, moreCount: number) =>
49
+ `❌ **未找到项目 "${identifier}"**\n\n📂 **可用项目:**\n${sampleProjects}${moreCount > 0 ? `\n... 还有 ${moreCount} 个项目` : ''}\n\n💡 **提示:** 使用项目目录名或完整路径来指定项目`,
50
+ PROJECT_INFO: (projectName: string) => ` 在项目 ${projectName} 中`,
51
+
52
+ // Agent messages
53
+ AGENT_NOT_FOUND: (agentId: string) => `❌ Agent **${agentId}** not found.`,
54
+ AGENT_DISABLED: (agentName: string) => `⚠️ Agent **${agentName}** is currently disabled.`,
55
+ SELECT_AGENT: (agentsList: string) =>
56
+ `🤖 **请选择你想要使用的AI助手:**\n\n${agentsList}\n\n📝 **使用方法:**\n• 直接提及:\`@机器人 ppt-editor 请帮我创建幻灯片\`\n• 或使用别名:\`@机器人 ppt 请帮我创建幻灯片\`\n• 通用对话:\`@机器人 general 随便聊聊\``,
57
+ };
58
+
59
+ /**
60
+ * Parse agent from message text
61
+ * Supports agent mention, agent name, or agent ID
62
+ */
63
+ function parseAgentFromMessage(text: string, allAgents: any[]): { agentId: string; cleanText: string } | null {
64
+ // Remove the bot mention if present
65
+ const cleanText = text.replace(/<@[A-Z0-9]+>/g, '').trim();
66
+
67
+ // Check for agent mention format: @agent-name or agent-name
68
+ const agentMentionMatch = cleanText.match(/^@?([a-zA-Z0-9\-_]+)\s+(.+)/);
69
+ if (agentMentionMatch) {
70
+ const potentialAgentId = agentMentionMatch[1];
71
+ const remainingText = agentMentionMatch[2].trim();
72
+
73
+ // First try exact match with agent ID
74
+ let agent = allAgents.find(a => a.id.toLowerCase() === potentialAgentId.toLowerCase());
75
+
76
+ // Then try name match
77
+ if (!agent) {
78
+ agent = allAgents.find(a => a.name.toLowerCase().includes(potentialAgentId.toLowerCase()) ||
79
+ potentialAgentId.toLowerCase().includes(a.name.toLowerCase()));
80
+ }
81
+
82
+ // Finally try to match with common aliases
83
+ if (!agent) {
84
+ const aliases: { [key: string]: string } = {
85
+ 'ppt': 'ppt-editor',
86
+ 'slides': 'ppt-editor',
87
+ 'presentation': 'ppt-editor',
88
+ 'powerpoint': 'ppt-editor',
89
+ 'code': 'code-assistant',
90
+ 'coding': 'code-assistant',
91
+ 'developer': 'code-assistant',
92
+ 'programmer': 'code-assistant',
93
+ 'document': 'document-writer',
94
+ 'docs': 'document-writer',
95
+ 'writing': 'document-writer',
96
+ 'writer': 'document-writer',
97
+ 'general': 'general-chat',
98
+ 'chat': 'general-chat',
99
+ 'assistant': 'general-chat',
100
+ 'help': 'general-chat'
101
+ };
102
+
103
+ const aliasId = aliases[potentialAgentId.toLowerCase()];
104
+ if (aliasId) {
105
+ agent = allAgents.find(a => a.id === aliasId);
106
+ }
107
+ }
108
+
109
+ if (agent && agent.enabled) {
110
+ return { agentId: agent.id, cleanText: remainingText };
111
+ }
112
+ }
113
+
114
+ return null;
115
+ }
116
+
117
+ /**
118
+ * Parse project specification from message text
119
+ * Supports proj:project-name format
120
+ */
121
+ function parseProjectFromMessage(text: string): ProjectParseResult | null {
122
+ // Check for project specification format: proj:project-name
123
+ // The pattern can appear anywhere in the text
124
+ const projectMatch = text.match(/proj:([^\s]+)/i);
125
+ if (projectMatch) {
126
+ const projectIdentifier = projectMatch[1];
127
+ // Remove the project specification from the text
128
+ const cleanText = text.replace(/proj:[^\s]+/gi, '').trim();
129
+ return { projectIdentifier, cleanText };
130
+ }
131
+
132
+ return null;
133
+ }
134
+
135
+ /**
136
+ * Match project identifier against available projects
137
+ * Priority order: exact path match -> exact directory name match (prefer home paths) -> basename match -> partial match
138
+ */
139
+ function matchProject(
140
+ identifier: string,
141
+ allProjects: ProjectWithAgentInfo[]
142
+ ): { matches: ProjectWithAgentInfo[]; isExactMatch: boolean } {
143
+ const identifierLower = identifier.toLowerCase();
144
+
145
+ // Priority 1: Exact path match (full path or real path)
146
+ const exactPathMatches = allProjects.filter(project =>
147
+ project.path.toLowerCase() === identifierLower ||
148
+ project.realPath?.toLowerCase() === identifierLower
149
+ );
150
+
151
+ if (exactPathMatches.length > 0) {
152
+ return { matches: exactPathMatches, isExactMatch: true };
153
+ }
154
+
155
+ // Priority 2: Exact directory name match
156
+ const exactDirMatches = allProjects.filter(project =>
157
+ project.dirName.toLowerCase() === identifierLower
158
+ );
159
+
160
+ if (exactDirMatches.length > 0) {
161
+ // If multiple exact directory matches, prioritize by:
162
+ // 1. Home directory paths (containing /home/ or ~)
163
+ // 2. More recently accessed
164
+ const prioritizedMatches = exactDirMatches.sort((a, b) => {
165
+ const aIsHome = a.path.includes('/home/') || a.path.includes('~');
166
+ const bIsHome = b.path.includes('/home/') || b.path.includes('~');
167
+
168
+ if (aIsHome && !bIsHome) return -1;
169
+ if (!aIsHome && bIsHome) return 1;
170
+
171
+ // If both have same home priority, sort by last accessed
172
+ return new Date(b.lastAccessed).getTime() - new Date(a.lastAccessed).getTime();
173
+ });
174
+
175
+ return { matches: prioritizedMatches, isExactMatch: true };
176
+ }
177
+
178
+ // Priority 3: Basename match (match against the last component of paths)
179
+ const basenameMatches = allProjects.filter(project => {
180
+ const pathBasename = path.basename(project.path).toLowerCase();
181
+ const realPathBasename = project.realPath ? path.basename(project.realPath).toLowerCase() : '';
182
+
183
+ return pathBasename === identifierLower || realPathBasename === identifierLower;
184
+ });
185
+
186
+ if (basenameMatches.length > 0) {
187
+ // Prioritize basename matches the same way
188
+ const prioritizedMatches = basenameMatches.sort((a, b) => {
189
+ const aIsHome = a.path.includes('/home/') || a.path.includes('~');
190
+ const bIsHome = b.path.includes('/home/') || b.path.includes('~');
191
+
192
+ if (aIsHome && !bIsHome) return -1;
193
+ if (!aIsHome && bIsHome) return 1;
194
+
195
+ return new Date(b.lastAccessed).getTime() - new Date(a.lastAccessed).getTime();
196
+ });
197
+
198
+ return { matches: prioritizedMatches, isExactMatch: true };
199
+ }
200
+
201
+ // Priority 4: Partial matches (only if no exact matches found)
202
+ // This matches identifier as a substring of directory names
203
+ const partialDirMatches = allProjects.filter(project =>
204
+ project.dirName.toLowerCase().includes(identifierLower) ||
205
+ identifierLower.includes(project.dirName.toLowerCase())
206
+ );
207
+
208
+ // Priority 5: Partial basename matches
209
+ const partialBasenameMatches = allProjects.filter(project => {
210
+ const pathBasename = path.basename(project.path).toLowerCase();
211
+ const realPathBasename = project.realPath ? path.basename(project.realPath).toLowerCase() : '';
212
+
213
+ return pathBasename.includes(identifierLower) ||
214
+ identifierLower.includes(pathBasename) ||
215
+ realPathBasename.includes(identifierLower) ||
216
+ identifierLower.includes(realPathBasename);
217
+ });
218
+
219
+ // Combine all partial matches and remove duplicates, then prioritize
220
+ const allPartialMatches = [...new Set([...partialDirMatches, ...partialBasenameMatches])];
221
+
222
+ const prioritizedPartialMatches = allPartialMatches.sort((a, b) => {
223
+ const aIsHome = a.path.includes('/home/') || a.path.includes('~');
224
+ const bIsHome = b.path.includes('/home/') || b.path.includes('~');
225
+
226
+ if (aIsHome && !bIsHome) return -1;
227
+ if (!aIsHome && bIsHome) return 1;
228
+
229
+ return new Date(b.lastAccessed).getTime() - new Date(a.lastAccessed).getTime();
230
+ });
231
+
232
+ return { matches: prioritizedPartialMatches, isExactMatch: false };
233
+ }
234
+
235
+ /**
236
+ * Create project selection message for multiple matches
237
+ */
238
+ function createProjectSelectionMessage(matches: ProjectWithAgentInfo[]): string {
239
+ const projectList = matches.map((project, index) => {
240
+ const pathInfo = project.realPath ? ` (${project.realPath})` : '';
241
+ return `${index + 1}. **${project.name}** (\`${project.dirName}\`${pathInfo})`;
242
+ }).join('\n');
243
+
244
+ return SLACK_MESSAGES.PROJECT_MULTIPLE_MATCHES(projectList);
245
+ }
246
+
247
+ /**
248
+ * Create project not found message
249
+ */
250
+ function createProjectNotFoundMessage(identifier: string, availableProjects: ProjectWithAgentInfo[]): string {
251
+ const sampleProjects = availableProjects.slice(0, 5).map(project =>
252
+ `• \`${project.dirName}\` - ${project.name}`
253
+ ).join('\n');
254
+ const moreCount = availableProjects.length > 5 ? availableProjects.length - 5 : 0;
255
+
256
+ return SLACK_MESSAGES.PROJECT_NOT_FOUND(identifier, sampleProjects, moreCount);
257
+ }
258
+
259
+ /**
260
+ * Get available agents list for Slack response
261
+ */
262
+ function getAvailableAgentsList(allAgents: any[]): string {
263
+ const enabledAgents = allAgents.filter(a => a.enabled);
264
+ return enabledAgents.map(agent => `• **${agent.name}** (\`${agent.id}\`) - ${agent.description}`).join('\n');
265
+ }
266
+
267
+ /**
268
+ * Message context containing all parsed information
269
+ */
270
+ interface MessageContext {
271
+ threadTs: string;
272
+ isNewThread: boolean;
273
+ agentId: string;
274
+ agent: any;
275
+ selectedProject: ProjectWithAgentInfo | null;
276
+ cleanText: string;
277
+ }
278
+
279
+ /**
280
+ * Claude version configuration
281
+ */
282
+ interface ClaudeVersionConfig {
283
+ versionId?: string;
284
+ model?: string;
285
+ env: Record<string, string> | null;
286
+ }
287
+
288
+ /**
289
+ * Slack AI Service - Main adapter class
290
+ */
291
+ export class SlackAIService {
292
+ private slackClient: SlackClient;
293
+ private agentStorage: AgentStorage;
294
+ private projectStorage: ProjectMetadataStorage;
295
+ private defaultAgentId: string;
296
+ private defaultProjectPath: string | null = null;
297
+
298
+ constructor(botToken: string, defaultAgentId: string = 'general-chat') {
299
+ this.slackClient = new SlackClient(botToken);
300
+ this.agentStorage = new AgentStorage();
301
+ this.projectStorage = new ProjectMetadataStorage();
302
+ this.defaultAgentId = defaultAgentId;
303
+ }
304
+
305
+ /**
306
+ * Get or create default project for Slack
307
+ */
308
+ private async getDefaultProject(): Promise<ProjectWithAgentInfo | null> {
309
+ // Check if already cached
310
+ if (this.defaultProjectPath) {
311
+ const allProjects = this.projectStorage.getAllProjects();
312
+ const cachedProject = allProjects.find(p =>
313
+ p.realPath === this.defaultProjectPath || p.path === this.defaultProjectPath
314
+ );
315
+ if (cachedProject) {
316
+ return cachedProject;
317
+ }
318
+ }
319
+
320
+ // Priority 1: Check configuration (from env or config.json)
321
+ const { defaultProject: envProjectPath } = await getSlackConfig();
322
+ if (envProjectPath) {
323
+ console.log(`📂 Found SLACK_DEFAULT_PROJECT config: ${envProjectPath}`);
324
+
325
+ // Check if this path exists in projects
326
+ const allProjects = this.projectStorage.getAllProjects();
327
+ const envProject = allProjects.find(p =>
328
+ p.realPath === envProjectPath || p.path === envProjectPath
329
+ );
330
+
331
+ if (envProject) {
332
+ this.defaultProjectPath = envProject.realPath || envProject.path;
333
+ console.log(`✅ Using default project from config: ${envProject.name}`);
334
+ return envProject;
335
+ } else {
336
+ console.warn(`⚠️ SLACK_DEFAULT_PROJECT path not found in projects: ${envProjectPath}`);
337
+ }
338
+ }
339
+
340
+ // Priority 2: Use or create slack-app project in claude-code-projects
341
+ const homeDir = require('os').homedir();
342
+ const projectsDir = path.join(homeDir, 'claude-code-projects');
343
+ const slackAppPath = path.join(projectsDir, 'slack-app');
344
+
345
+ // Ensure claude-code-projects directory exists
346
+ if (!fs.existsSync(projectsDir)) {
347
+ console.log(`📁 Creating claude-code-projects directory: ${projectsDir}`);
348
+ fs.mkdirSync(projectsDir, { recursive: true });
349
+ }
350
+
351
+ // Ensure slack-app directory exists
352
+ if (!fs.existsSync(slackAppPath)) {
353
+ console.log(`📁 Creating default Slack project: ${slackAppPath}`);
354
+ fs.mkdirSync(slackAppPath, { recursive: true });
355
+
356
+ // Create a README.md to explain this directory
357
+ const readmePath = path.join(slackAppPath, 'README.md');
358
+ const readmeContent = `# Slack App Default Project
359
+
360
+ This is the default project directory for Slack App interactions.
361
+
362
+ When you chat with the AI in Slack without specifying a project (using \`proj:\`),
363
+ this directory will be used as the working directory.
364
+
365
+ ## Customizing the Default Project
366
+
367
+ You can change the default project by:
368
+
369
+ 1. **Environment Variable**: Set \`SLACK_DEFAULT_PROJECT\` to your desired project path
370
+ \`\`\`bash
371
+ export SLACK_DEFAULT_PROJECT=/path/to/your/project
372
+ \`\`\`
373
+
374
+ 2. **Specify in Message**: Use \`proj:project-name\` in your Slack message
375
+ \`\`\`
376
+ @bot proj:my-project help me with this code
377
+ \`\`\`
378
+
379
+ ## Project Structure
380
+
381
+ Feel free to organize your files here as needed. This directory is managed by AgentStudio.
382
+ `;
383
+ fs.writeFileSync(readmePath, readmeContent, 'utf-8');
384
+ console.log(`📝 Created README.md in ${slackAppPath}`);
385
+ }
386
+
387
+ // Check if slack-app exists in projects metadata
388
+ const allProjects = this.projectStorage.getAllProjects();
389
+ let slackAppProject = allProjects.find(p =>
390
+ p.realPath === slackAppPath || p.path === slackAppPath || p.dirName === 'slack-app'
391
+ );
392
+
393
+ if (!slackAppProject) {
394
+ // Project directory exists but not in metadata, it will be picked up on next scan
395
+ // For now, create a minimal project info
396
+ console.log(`🔄 Slack-app directory exists but not in metadata, will be picked up on next scan`);
397
+
398
+ // Try to get it from storage (in case it was just added)
399
+ const metadata = this.projectStorage.getProjectMetadata(slackAppPath);
400
+
401
+ if (metadata) {
402
+ // Construct a minimal project info
403
+ slackAppProject = {
404
+ id: metadata.id,
405
+ name: metadata.name || 'Slack App',
406
+ description: metadata.description || 'Default project for Slack interactions',
407
+ path: slackAppPath,
408
+ realPath: slackAppPath,
409
+ dirName: 'slack-app',
410
+ createdAt: metadata.createdAt,
411
+ lastAccessed: metadata.lastAccessed,
412
+ agents: [],
413
+ defaultAgent: metadata.defaultAgent || '',
414
+ defaultAgentName: '',
415
+ defaultAgentIcon: '',
416
+ tags: metadata.tags || [],
417
+ metadata: metadata.metadata || {}
418
+ };
419
+ }
420
+ }
421
+
422
+ if (!slackAppProject) {
423
+ console.error(`❌ Failed to create or find slack-app project`);
424
+ return null;
425
+ }
426
+
427
+ this.defaultProjectPath = slackAppProject.realPath || slackAppProject.path;
428
+ console.log(`✅ Using default Slack project: ${slackAppProject.name} at ${this.defaultProjectPath}`);
429
+
430
+ return slackAppProject;
431
+ }
432
+
433
+ /**
434
+ * Parse and validate message context
435
+ */
436
+ private async parseMessageContext(
437
+ event: SlackMessageEvent | SlackAppMentionEvent
438
+ ): Promise<MessageContext | null> {
439
+ const threadTs = event.thread_ts || event.ts;
440
+ const isNewThread = !event.thread_ts;
441
+
442
+ // Get all available agents and projects
443
+ const allAgents = this.agentStorage.getAllAgents();
444
+ const enabledAgents = allAgents.filter((agent: any) => agent.enabled);
445
+ const allProjects = this.projectStorage.getAllProjects();
446
+
447
+ // Parse agent from message
448
+ const agentSelection = parseAgentFromMessage(event.text, enabledAgents);
449
+
450
+ // Start with the cleaned text from agent parsing (if available)
451
+ let cleanText = agentSelection ? agentSelection.cleanText : event.text;
452
+
453
+ // Check if this thread already has a session with project info
454
+ const existingSessionId = slackThreadMapper.getSessionId(threadTs, event.channel);
455
+ const existingMapping = existingSessionId
456
+ ? slackThreadMapper.getThreadForSession(existingSessionId)
457
+ : null;
458
+ const hasExistingProject = existingMapping && existingMapping.projectPath;
459
+
460
+ // Parse project from message
461
+ // Parse for: new threads OR threads without existing project
462
+ let selectedProject: ProjectWithAgentInfo | null = null;
463
+
464
+ if (isNewThread || !hasExistingProject) {
465
+ // Parse project from the already-cleaned text
466
+ const projectSelection = parseProjectFromMessage(cleanText);
467
+ if (projectSelection) {
468
+ console.log(`🎯 Found project specification: ${projectSelection.projectIdentifier}`);
469
+
470
+ // Match project against available projects
471
+ const projectMatch = matchProject(projectSelection.projectIdentifier, allProjects);
472
+
473
+ if (projectMatch.matches.length === 0) {
474
+ // No projects found
475
+ const errorMessage = createProjectNotFoundMessage(projectSelection.projectIdentifier, allProjects);
476
+ await this.slackClient.postMessage({
477
+ channel: event.channel,
478
+ text: errorMessage,
479
+ thread_ts: threadTs
480
+ });
481
+ return null;
482
+ } else if (projectMatch.matches.length > 1 && !projectMatch.isExactMatch) {
483
+ // Multiple partial matches found - ask user to be more specific
484
+ const selectionMessage = createProjectSelectionMessage(projectMatch.matches);
485
+ await this.slackClient.postMessage({
486
+ channel: event.channel,
487
+ text: selectionMessage,
488
+ thread_ts: threadTs
489
+ });
490
+ return null;
491
+ } else {
492
+ // Single match found, or multiple exact matches (already prioritized)
493
+ selectedProject = projectMatch.matches[0];
494
+ console.log(`✅ Selected project: ${selectedProject.name} (${selectedProject.dirName}) - Path: ${selectedProject.realPath || selectedProject.path}`);
495
+
496
+ // If there were multiple exact matches, log this for debugging
497
+ if (projectMatch.matches.length > 1) {
498
+ console.log(`📝 Note: Found ${projectMatch.matches.length} exact matches, selected the highest priority one`);
499
+ }
500
+ }
501
+
502
+ // Update cleanText with project specification removed
503
+ cleanText = projectSelection.cleanText;
504
+ } else {
505
+ // No project specified, use default project
506
+ console.log(`📂 No project specified, using default project`);
507
+ selectedProject = await this.getDefaultProject();
508
+
509
+ if (selectedProject) {
510
+ console.log(`✅ Using default project: ${selectedProject.name} at ${selectedProject.realPath || selectedProject.path}`);
511
+ } else {
512
+ console.warn(`⚠️ Failed to get default project`);
513
+ }
514
+ }
515
+ } else {
516
+ // Thread already has a project, use it from existing mapping
517
+ if (existingMapping && existingMapping.projectPath) {
518
+ console.log(`♻️ Reusing project from existing thread: ${existingMapping.projectPath}`);
519
+ // Find the project in allProjects
520
+ const existingProject = allProjects.find(p =>
521
+ p.realPath === existingMapping.projectPath ||
522
+ p.path === existingMapping.projectPath
523
+ );
524
+ if (existingProject) {
525
+ selectedProject = existingProject;
526
+ console.log(`✅ Found existing project: ${existingProject.name} (${existingProject.dirName})`);
527
+ } else {
528
+ console.warn(`⚠️ Existing project path not found in projects list: ${existingMapping.projectPath}`);
529
+ }
530
+ }
531
+ }
532
+
533
+ // Determine agent to use
534
+ let agentId: string;
535
+ if (agentSelection) {
536
+ agentId = agentSelection.agentId;
537
+ console.log(`🎯 Selected agent: ${agentId} from message`);
538
+ } else {
539
+ // Try to get agent from existing session
540
+ const sessionId = slackThreadMapper.getSessionId(threadTs, event.channel);
541
+ if (sessionId) {
542
+ const existingSession = sessionManager.getSession(sessionId);
543
+ if (existingSession) {
544
+ agentId = existingSession.getAgentId();
545
+ console.log(`♻️ Reusing agent from existing session: ${agentId}`);
546
+ } else {
547
+ agentId = this.defaultAgentId;
548
+ }
549
+ } else {
550
+ agentId = this.defaultAgentId;
551
+ }
552
+
553
+ // Validate default agent
554
+ const defaultAgent = this.agentStorage.getAgent(agentId);
555
+ if (!defaultAgent || !defaultAgent.enabled) {
556
+ // Show available agents list
557
+ const agentsList = getAvailableAgentsList(allAgents);
558
+ await this.slackClient.postMessage({
559
+ channel: event.channel,
560
+ text: SLACK_MESSAGES.SELECT_AGENT(agentsList),
561
+ thread_ts: threadTs
562
+ });
563
+ return null;
564
+ }
565
+
566
+ console.log(`🔧 Using default agent: ${agentId}`);
567
+ }
568
+
569
+ // Get and validate agent
570
+ const agent = this.agentStorage.getAgent(agentId);
571
+ if (!agent) {
572
+ await this.slackClient.postMessage({
573
+ channel: event.channel,
574
+ text: SLACK_MESSAGES.AGENT_NOT_FOUND(agentId),
575
+ thread_ts: threadTs
576
+ });
577
+ return null;
578
+ }
579
+
580
+ if (!agent.enabled) {
581
+ await this.slackClient.postMessage({
582
+ channel: event.channel,
583
+ text: SLACK_MESSAGES.AGENT_DISABLED(agent.name),
584
+ thread_ts: threadTs
585
+ });
586
+ return null;
587
+ }
588
+
589
+ return {
590
+ threadTs,
591
+ isNewThread,
592
+ agentId,
593
+ agent,
594
+ selectedProject,
595
+ cleanText
596
+ };
597
+ }
598
+
599
+ /**
600
+ * Process Slack files and convert to image format for Claude
601
+ */
602
+ private async processSlackFiles(files: SlackFile[]): Promise<any[]> {
603
+ const images: any[] = [];
604
+
605
+ // Filter for image files only
606
+ const imageFiles = files.filter(file =>
607
+ file.mimetype.startsWith('image/')
608
+ );
609
+
610
+ if (imageFiles.length === 0) {
611
+ return images;
612
+ }
613
+
614
+ console.log(`📷 Processing ${imageFiles.length} image(s) from Slack`);
615
+
616
+ for (const file of imageFiles) {
617
+ try {
618
+ console.log(`📥 Downloading image: ${file.name} (${file.mimetype}, ${file.size} bytes)`);
619
+
620
+ // Download file from Slack
621
+ const fileData = await this.slackClient.downloadFile(file.url_private_download);
622
+
623
+ // Convert to base64
624
+ const base64Data = fileData.toString('base64');
625
+
626
+ images.push({
627
+ id: file.id,
628
+ mediaType: file.mimetype,
629
+ filename: file.name,
630
+ data: base64Data
631
+ });
632
+
633
+ console.log(`✅ Successfully processed image: ${file.name}`);
634
+ } catch (error) {
635
+ console.error(`❌ Failed to process image ${file.name}:`, error);
636
+ // Continue processing other images
637
+ }
638
+ }
639
+
640
+ return images;
641
+ }
642
+
643
+ /**
644
+ * Get default Claude version configuration
645
+ */
646
+ private async getClaudeVersionConfig(): Promise<ClaudeVersionConfig> {
647
+ try {
648
+ const defaultVersionId = await getDefaultVersionId();
649
+ if (defaultVersionId) {
650
+ const defaultVersion = await getVersionByIdInternal(defaultVersionId);
651
+ if (defaultVersion) {
652
+ const model = defaultVersion.models && defaultVersion.models.length > 0
653
+ ? defaultVersion.models[0].id
654
+ : undefined;
655
+
656
+ console.log(`🎯 Using default Claude version: ${defaultVersion.alias}${model ? ` with model: ${model}` : ''}`);
657
+
658
+ return {
659
+ versionId: defaultVersion.id,
660
+ model,
661
+ env: defaultVersion.environmentVariables || null
662
+ };
663
+ }
664
+ }
665
+ } catch (error) {
666
+ console.error('Failed to get default Claude version:', error);
667
+ }
668
+
669
+ return { env: null };
670
+ }
671
+
672
+ /**
673
+ * Acquire session lock or send busy message
674
+ */
675
+ private async acquireSessionLock(
676
+ sessionId: string,
677
+ event: SlackMessageEvent | SlackAppMentionEvent,
678
+ threadTs: string,
679
+ agentId: string,
680
+ placeholderTs: string,
681
+ agentDisplayName: string
682
+ ): Promise<boolean> {
683
+ const lockStatus = slackSessionLock.isSessionLocked(sessionId, true);
684
+
685
+ if (lockStatus.locked) {
686
+ console.log(`⚠️ Session ${sessionId} is locked (${lockStatus.reason}), returning busy message`);
687
+
688
+ await this.slackClient.updateMessage({
689
+ channel: event.channel,
690
+ ts: placeholderTs,
691
+ text: SLACK_MESSAGES.SESSION_BUSY(agentDisplayName)
692
+ });
693
+
694
+ return false;
695
+ }
696
+
697
+ const lockAcquired = slackSessionLock.tryAcquireLock(sessionId, {
698
+ sessionId,
699
+ threadTs,
700
+ channel: event.channel,
701
+ agentId
702
+ });
703
+
704
+ if (!lockAcquired) {
705
+ console.log(`⚠️ Failed to acquire lock for session ${sessionId}, returning busy message`);
706
+
707
+ await this.slackClient.updateMessage({
708
+ channel: event.channel,
709
+ ts: placeholderTs,
710
+ text: SLACK_MESSAGES.SESSION_BUSY(agentDisplayName)
711
+ });
712
+
713
+ return false;
714
+ }
715
+
716
+ console.log(`🔒 Acquired lock for session ${sessionId}`);
717
+ return true;
718
+ }
719
+
720
+ /**
721
+ * Format tool call for display
722
+ */
723
+ private formatToolCall(toolName: string, input: any): string {
724
+ if (!input || typeof input !== 'object') {
725
+ return `🔧 ${toolName}()`;
726
+ }
727
+
728
+ // Define large content parameters that should always be hidden
729
+ const largeContentParams: { [key: string]: string[] } = {
730
+ 'Write': ['content', 'contents'],
731
+ 'write': ['content', 'contents'],
732
+ 'search_replace': ['old_string', 'new_string']
733
+ };
734
+
735
+ // Determine threshold for "large" content
736
+ const largeContentThreshold = 50; // chars
737
+
738
+ // Extract key parameters (limit to avoid too long output)
739
+ const params: string[] = [];
740
+ const keys = Object.keys(input);
741
+
742
+ // Check if this tool has large content parameters
743
+ const largeParams = largeContentParams[toolName] || [];
744
+
745
+ // Filter out large content params if they exceed threshold
746
+ const displayKeys: string[] = [];
747
+ for (const key of keys) {
748
+ if (largeParams.includes(key)) {
749
+ // Check if this parameter is large
750
+ const value = input[key];
751
+ if (typeof value === 'string') {
752
+ // If content is large (multi-line or long), skip it from display
753
+ if (value.length > largeContentThreshold || value.includes('\n')) {
754
+ continue; // Skip this parameter, will show in summary
755
+ }
756
+ }
757
+ }
758
+ displayKeys.push(key);
759
+ if (displayKeys.length >= 3) break; // Limit to 3 displayed params
760
+ }
761
+
762
+ // Format the displayed parameters
763
+ for (const key of displayKeys) {
764
+ let value = input[key];
765
+
766
+ // Simplify long values
767
+ if (typeof value === 'string') {
768
+ if (value.length > 50) {
769
+ value = value.substring(0, 47) + '...';
770
+ }
771
+ value = `"${value}"`;
772
+ } else if (typeof value === 'object') {
773
+ const jsonStr = JSON.stringify(value);
774
+ if (jsonStr.length > 50) {
775
+ value = jsonStr.substring(0, 47) + '...';
776
+ } else {
777
+ value = jsonStr;
778
+ }
779
+ }
780
+
781
+ params.push(`${key}=${value}`);
782
+ }
783
+
784
+ // Add summary for hidden large params
785
+ const hiddenLargeParams: string[] = [];
786
+ if (toolName === 'Write' || toolName === 'write') {
787
+ if (input.content && displayKeys.indexOf('content') === -1) {
788
+ hiddenLargeParams.push(`content: ${input.content.length} chars`);
789
+ }
790
+ if (input.contents && displayKeys.indexOf('contents') === -1) {
791
+ hiddenLargeParams.push(`contents: ${input.contents.length} chars`);
792
+ }
793
+ }
794
+ if (toolName === 'search_replace') {
795
+ if (input.old_string && displayKeys.indexOf('old_string') === -1) {
796
+ hiddenLargeParams.push(`old: ${input.old_string.length} chars`);
797
+ }
798
+ if (input.new_string && displayKeys.indexOf('new_string') === -1) {
799
+ hiddenLargeParams.push(`new: ${input.new_string.length} chars`);
800
+ }
801
+ }
802
+
803
+ const moreParamsInfo = hiddenLargeParams.length > 0
804
+ ? `, ${hiddenLargeParams.join(', ')}`
805
+ : (Object.keys(input).length > displayKeys.length ? ', ...' : '');
806
+
807
+ return `🔧 ${toolName}(${params.join(', ')}${moreParamsInfo})`;
808
+ }
809
+
810
+ /**
811
+ * Build status message from current state
812
+ */
813
+ private buildStatusMessage(
814
+ thinkingContent: string,
815
+ fullResponse: string
816
+ ): string {
817
+ let statusText = '';
818
+
819
+ // Add thinking content if exists
820
+ if (thinkingContent) {
821
+ statusText += `💭 **思考中...**\n${thinkingContent}\n\n`;
822
+ }
823
+
824
+ // Add response text (which now includes tool calls in order)
825
+ if (fullResponse) {
826
+ statusText += fullResponse;
827
+ }
828
+
829
+ // If nothing to show yet, keep the thinking message
830
+ if (!statusText.trim()) {
831
+ statusText = SLACK_MESSAGES.THINKING;
832
+ }
833
+
834
+ // Debug log
835
+ console.log('📄 Building status message:', {
836
+ hasThinking: !!thinkingContent,
837
+ hasResponse: !!fullResponse,
838
+ statusTextLength: statusText.length
839
+ });
840
+
841
+ return statusText;
842
+ }
843
+
844
+ /**
845
+ * Create Slack message updater with throttling
846
+ */
847
+ private createSlackMessageUpdater(
848
+ event: SlackMessageEvent | SlackAppMentionEvent,
849
+ placeholderTs: string,
850
+ stateRef: {
851
+ lastUpdateTime: number;
852
+ pendingUpdate: boolean;
853
+ thinkingContent: string;
854
+ fullResponse: string;
855
+ },
856
+ updateThrottleMs: number = 1000
857
+ ) {
858
+ return async (force: boolean = false) => {
859
+ const now = Date.now();
860
+
861
+ // Throttle updates unless forced
862
+ if (!force && now - stateRef.lastUpdateTime < updateThrottleMs) {
863
+ stateRef.pendingUpdate = true;
864
+ return;
865
+ }
866
+
867
+ stateRef.pendingUpdate = false;
868
+ stateRef.lastUpdateTime = now;
869
+
870
+ const statusText = this.buildStatusMessage(
871
+ stateRef.thinkingContent,
872
+ stateRef.fullResponse
873
+ );
874
+
875
+ try {
876
+ await this.slackClient.updateMessage({
877
+ channel: event.channel,
878
+ ts: placeholderTs,
879
+ text: statusText
880
+ });
881
+ } catch (error) {
882
+ console.error('❌ Failed to update Slack message:', error);
883
+ }
884
+ };
885
+ }
886
+
887
+ /**
888
+ * Handle Claude init message
889
+ */
890
+ private handleInitMessage(
891
+ sdkMessage: any,
892
+ claudeSession: any,
893
+ event: SlackMessageEvent | SlackAppMentionEvent,
894
+ threadTs: string,
895
+ agentId: string,
896
+ selectedProject: ProjectWithAgentInfo | null,
897
+ configSnapshot?: any
898
+ ): void {
899
+ if (sdkMessage.type === 'system' && sdkMessage.subtype === 'init' && sdkMessage.session_id) {
900
+ const newSessionId = sdkMessage.session_id;
901
+ claudeSession.setClaudeSessionId(newSessionId);
902
+ sessionManager.confirmSessionId(claudeSession, newSessionId, configSnapshot);
903
+
904
+ // Update mapping with project information
905
+ slackThreadMapper.setMapping({
906
+ threadTs,
907
+ channel: event.channel,
908
+ sessionId: newSessionId,
909
+ agentId,
910
+ projectId: selectedProject?.dirName,
911
+ projectPath: selectedProject?.realPath || selectedProject?.path
912
+ });
913
+
914
+ console.log(`✅ Session confirmed: ${newSessionId} for thread: ${threadTs}`);
915
+ }
916
+ }
917
+
918
+ /**
919
+ * Handle Claude thinking message
920
+ */
921
+ private handleThinkingMessage(
922
+ sdkMessage: any,
923
+ stateRef: { thinkingContent: string }
924
+ ): boolean {
925
+ if (sdkMessage.type === 'assistant' && sdkMessage.subtype === 'thinking') {
926
+ if (sdkMessage.thinking || sdkMessage.text) {
927
+ const thinkingText = sdkMessage.thinking || sdkMessage.text;
928
+ stateRef.thinkingContent = thinkingText;
929
+ console.log(`💭 Thinking: ${thinkingText.substring(0, 100)}...`);
930
+ return true; // Trigger update
931
+ }
932
+ }
933
+ return false;
934
+ }
935
+
936
+ /**
937
+ * Extract text from assistant message
938
+ */
939
+ private extractTextFromAssistantMessage(sdkMessage: any): string {
940
+ let newText = '';
941
+
942
+ // Extract text from message.content array (standard Claude SDK format)
943
+ if (sdkMessage.message?.content && Array.isArray(sdkMessage.message.content)) {
944
+ for (const block of sdkMessage.message.content) {
945
+ if (block.type === 'text' && block.text) {
946
+ newText += block.text;
947
+ }
948
+ }
949
+ }
950
+ // Fallback: Try other formats
951
+ else if (sdkMessage.subtype === 'text' && sdkMessage.text) {
952
+ newText = sdkMessage.text;
953
+ } else if (sdkMessage.message && typeof sdkMessage.message === 'string') {
954
+ newText = sdkMessage.message;
955
+ } else if (sdkMessage.content) {
956
+ if (Array.isArray(sdkMessage.content)) {
957
+ for (const block of sdkMessage.content) {
958
+ if (block.type === 'text' && block.text) {
959
+ newText += block.text;
960
+ }
961
+ }
962
+ } else if (typeof sdkMessage.content === 'string') {
963
+ newText = sdkMessage.content;
964
+ }
965
+ }
966
+
967
+ return newText;
968
+ }
969
+
970
+ /**
971
+ * Handle Claude assistant message
972
+ */
973
+ private handleAssistantMessage(
974
+ sdkMessage: any,
975
+ stateRef: { fullResponse: string; thinkingContent: string }
976
+ ): boolean {
977
+ if (sdkMessage.type === 'assistant' && sdkMessage.subtype !== 'thinking') {
978
+ console.log('🔍 Assistant message details:', JSON.stringify({
979
+ type: sdkMessage.type,
980
+ subtype: sdkMessage.subtype,
981
+ hasContent: !!(sdkMessage.content || sdkMessage.message?.content),
982
+ contentLength: sdkMessage.content?.length || sdkMessage.message?.content?.length || 0
983
+ }, null, 2));
984
+
985
+ const newText = this.extractTextFromAssistantMessage(sdkMessage);
986
+
987
+ if (newText) {
988
+ stateRef.fullResponse += newText;
989
+ // Clear thinking when actual response starts
990
+ if (stateRef.thinkingContent) {
991
+ stateRef.thinkingContent = '';
992
+ }
993
+ return true; // Trigger update
994
+ }
995
+ }
996
+ return false;
997
+ }
998
+
999
+ /**
1000
+ * Handle Claude tool use message
1001
+ * Appends tool calls to fullResponse in chronological order
1002
+ */
1003
+ private handleToolUseMessage(
1004
+ sdkMessage: any,
1005
+ stateRef: { fullResponse: string; thinkingContent: string }
1006
+ ): boolean {
1007
+ // Log full message for debugging
1008
+ console.log('🔍 Checking for tool_use message:', JSON.stringify({
1009
+ type: sdkMessage.type,
1010
+ subtype: sdkMessage.subtype,
1011
+ hasToolUse: !!sdkMessage.tool_use,
1012
+ hasToolName: !!sdkMessage.tool_use?.name,
1013
+ fullMessage: sdkMessage
1014
+ }, null, 2));
1015
+
1016
+ if (sdkMessage.type === 'tool_use' && sdkMessage.subtype === 'start') {
1017
+ const toolName = sdkMessage.tool_use?.name || 'unknown';
1018
+ const toolInput = sdkMessage.tool_use?.input || {};
1019
+
1020
+ const formattedTool = this.formatToolCall(toolName, toolInput);
1021
+
1022
+ // Append to fullResponse to maintain chronological order
1023
+ stateRef.fullResponse += `${stateRef.fullResponse ? '\n' : ''}${formattedTool}\n`;
1024
+
1025
+ // Clear thinking when tool starts
1026
+ if (stateRef.thinkingContent) {
1027
+ stateRef.thinkingContent = '';
1028
+ }
1029
+
1030
+ console.log(`🔧 Tool started: ${toolName}, formatted: ${formattedTool}`);
1031
+ console.log(`📝 Current fullResponse: ${stateRef.fullResponse}`);
1032
+ return true; // Trigger update
1033
+ }
1034
+
1035
+ // Also check for assistant message with tool_use content
1036
+ if (sdkMessage.type === 'assistant' && sdkMessage.message?.content) {
1037
+ const content = sdkMessage.message.content;
1038
+ if (Array.isArray(content)) {
1039
+ for (const block of content) {
1040
+ if (block.type === 'tool_use') {
1041
+ const toolName = block.name || 'unknown';
1042
+ const toolInput = block.input || {};
1043
+
1044
+ const formattedTool = this.formatToolCall(toolName, toolInput);
1045
+
1046
+ // Append to fullResponse to maintain chronological order
1047
+ stateRef.fullResponse += `${stateRef.fullResponse ? '\n' : ''}${formattedTool}\n`;
1048
+
1049
+ // Clear thinking when tool starts
1050
+ if (stateRef.thinkingContent) {
1051
+ stateRef.thinkingContent = '';
1052
+ }
1053
+
1054
+ console.log(`🔧 Tool found in assistant content: ${toolName}, formatted: ${formattedTool}`);
1055
+ console.log(`📝 Current fullResponse: ${stateRef.fullResponse}`);
1056
+ return true; // Trigger update
1057
+ }
1058
+ }
1059
+ }
1060
+ }
1061
+
1062
+ return false;
1063
+ }
1064
+
1065
+ /**
1066
+ * Process Claude response and collect text with real-time updates
1067
+ */
1068
+ private async processClaudeResponse(
1069
+ claudeSession: any,
1070
+ userMessage: any,
1071
+ event: SlackMessageEvent | SlackAppMentionEvent,
1072
+ threadTs: string,
1073
+ agentId: string,
1074
+ selectedProject: ProjectWithAgentInfo | null,
1075
+ placeholderTs: string,
1076
+ configSnapshot?: any
1077
+ ): Promise<{ fullResponse: string; toolUsageInfo: string; hasError: boolean }> {
1078
+ const stateRef = {
1079
+ fullResponse: '',
1080
+ thinkingContent: '',
1081
+ lastUpdateTime: 0,
1082
+ pendingUpdate: false
1083
+ };
1084
+
1085
+ let hasError = false;
1086
+ let isResponseComplete = false;
1087
+ const updateThrottleMs = 1000;
1088
+
1089
+ // Create update handler
1090
+ const updateSlackMessage = this.createSlackMessageUpdater(
1091
+ event,
1092
+ placeholderTs,
1093
+ stateRef,
1094
+ updateThrottleMs
1095
+ );
1096
+
1097
+ return new Promise((resolve) => {
1098
+ let timeoutId: NodeJS.Timeout;
1099
+ let updateIntervalId: NodeJS.Timeout;
1100
+
1101
+ // Set up periodic update check for pending updates
1102
+ updateIntervalId = setInterval(() => {
1103
+ if (stateRef.pendingUpdate && !isResponseComplete) {
1104
+ updateSlackMessage(false);
1105
+ }
1106
+ }, updateThrottleMs);
1107
+
1108
+ claudeSession.sendMessage(userMessage, async (sdkMessage: any) => {
1109
+ console.log(`📦 Received SDK message type: ${sdkMessage.type}, subtype: ${sdkMessage.subtype}`);
1110
+
1111
+ // Clear any existing timeout
1112
+ if (timeoutId) {
1113
+ clearTimeout(timeoutId);
1114
+ }
1115
+
1116
+ // Set a new timeout in case we don't get a result event
1117
+ timeoutId = setTimeout(() => {
1118
+ if (!isResponseComplete) {
1119
+ console.log('⏰ Response timeout, treating as complete');
1120
+ isResponseComplete = true;
1121
+ clearInterval(updateIntervalId);
1122
+ resolve({
1123
+ fullResponse: stateRef.fullResponse,
1124
+ toolUsageInfo: '', // No longer used, kept for interface compatibility
1125
+ hasError
1126
+ });
1127
+ }
1128
+ }, 30000); // 30 second timeout
1129
+
1130
+ // Handle init message
1131
+ this.handleInitMessage(sdkMessage, claudeSession, event, threadTs, agentId, selectedProject, configSnapshot);
1132
+
1133
+ // Handle thinking and trigger update if needed
1134
+ if (this.handleThinkingMessage(sdkMessage, stateRef)) {
1135
+ await updateSlackMessage(false);
1136
+ }
1137
+
1138
+ // Handle assistant message and trigger update if needed
1139
+ if (this.handleAssistantMessage(sdkMessage, stateRef)) {
1140
+ await updateSlackMessage(false);
1141
+ }
1142
+
1143
+ // Handle tool use and trigger update if needed
1144
+ if (this.handleToolUseMessage(sdkMessage, stateRef)) {
1145
+ await updateSlackMessage(false);
1146
+ }
1147
+
1148
+ // Handle errors
1149
+ if (sdkMessage.type === 'error') {
1150
+ hasError = true;
1151
+ console.error('❌ Claude error:', sdkMessage.error || sdkMessage.message);
1152
+ isResponseComplete = true;
1153
+ clearTimeout(timeoutId);
1154
+ clearInterval(updateIntervalId);
1155
+
1156
+ // Final update with error
1157
+ await updateSlackMessage(true);
1158
+
1159
+ resolve({
1160
+ fullResponse: stateRef.fullResponse,
1161
+ toolUsageInfo: '', // No longer used, kept for interface compatibility
1162
+ hasError
1163
+ });
1164
+ }
1165
+
1166
+ // Check for completion
1167
+ if (sdkMessage.type === 'result') {
1168
+ console.log('✅ AI response completed');
1169
+ isResponseComplete = true;
1170
+ clearTimeout(timeoutId);
1171
+ clearInterval(updateIntervalId);
1172
+
1173
+ // Final update
1174
+ await updateSlackMessage(true);
1175
+
1176
+ resolve({
1177
+ fullResponse: stateRef.fullResponse,
1178
+ toolUsageInfo: '', // No longer used, kept for interface compatibility
1179
+ hasError
1180
+ });
1181
+ }
1182
+ }).catch((error: unknown) => {
1183
+ console.error('❌ Error in sendMessage:', error);
1184
+ hasError = true;
1185
+ isResponseComplete = true;
1186
+
1187
+ if (timeoutId) {
1188
+ clearTimeout(timeoutId);
1189
+ }
1190
+ if (updateIntervalId) {
1191
+ clearInterval(updateIntervalId);
1192
+ }
1193
+
1194
+ resolve({
1195
+ fullResponse: stateRef.fullResponse,
1196
+ toolUsageInfo: '', // No longer used, kept for interface compatibility
1197
+ hasError: true
1198
+ });
1199
+ });
1200
+ });
1201
+ }
1202
+
1203
+ /**
1204
+ * Handle incoming Slack message
1205
+ */
1206
+ async handleMessage(event: SlackMessageEvent | SlackAppMentionEvent): Promise<void> {
1207
+ try {
1208
+ console.log('📨 Received Slack message:', {
1209
+ channel: event.channel,
1210
+ user: event.user,
1211
+ text: event.text.substring(0, 50),
1212
+ thread_ts: event.thread_ts || event.ts
1213
+ });
1214
+
1215
+ // Step 1: Parse and validate message context (agent, project, etc.)
1216
+ const context = await this.parseMessageContext(event);
1217
+ if (!context) {
1218
+ return; // Early exit if parsing failed (error message already sent)
1219
+ }
1220
+
1221
+ const { threadTs, agentId, agent, selectedProject, cleanText } = context;
1222
+
1223
+ // Step 2: Send "thinking" placeholder message
1224
+ const agentDisplayName = agent.ui.icon ? `${agent.ui.icon} ${agent.name}` : agent.name;
1225
+ const projectInfo = selectedProject ? SLACK_MESSAGES.PROJECT_INFO(selectedProject.name) : '';
1226
+ const placeholderMsg = await this.slackClient.postMessage({
1227
+ channel: event.channel,
1228
+ text: SLACK_MESSAGES.THINKING_WITH_AGENT(agentDisplayName, projectInfo),
1229
+ thread_ts: threadTs
1230
+ });
1231
+
1232
+ console.log(`📍 Posted placeholder message: ${placeholderMsg.ts}`);
1233
+ if (selectedProject) {
1234
+ console.log(`📂 Working in project: ${selectedProject.name} (${selectedProject.dirName}) - Path: ${selectedProject.realPath || selectedProject.path}`);
1235
+ }
1236
+
1237
+ // Step 3: Get Claude version configuration
1238
+ const claudeConfig = await this.getClaudeVersionConfig();
1239
+
1240
+ // Step 4: Build query options with all necessary configurations
1241
+ const projectPath = selectedProject ? (selectedProject.realPath || selectedProject.path) : undefined;
1242
+ const { queryOptions } = await buildQueryOptions(
1243
+ agent,
1244
+ selectedProject?.realPath || selectedProject?.path,
1245
+ undefined, // mcpTools
1246
+ undefined, // permissionMode
1247
+ claudeConfig.model,
1248
+ claudeConfig.versionId,
1249
+ claudeConfig.env || undefined // defaultEnv
1250
+ );
1251
+
1252
+
1253
+
1254
+ // Slack uses block-based streaming (no partial messages)
1255
+ queryOptions.includePartialMessages = false;
1256
+
1257
+ // 构建配置快照用于检测配置变化
1258
+ const configSnapshot = {
1259
+ model: claudeConfig.model,
1260
+ claudeVersionId: claudeConfig.versionId,
1261
+ permissionMode: queryOptions.permissionMode,
1262
+ mcpTools: [],
1263
+ allowedTools: agent.allowedTools
1264
+ .filter((tool: any) => tool.enabled)
1265
+ .map((tool: any) => tool.name)
1266
+ };
1267
+
1268
+ // Step 5: Get or create Claude session
1269
+ const sessionId = slackThreadMapper.getSessionId(threadTs, event.channel);
1270
+ let claudeSession = sessionId ? sessionManager.getSession(sessionId) : null;
1271
+
1272
+ if (!claudeSession) {
1273
+ claudeSession = sessionManager.createNewSession(agentId, queryOptions, undefined, claudeConfig.versionId, claudeConfig.model, configSnapshot);
1274
+ console.log(`🆕 Created new Claude session for Slack thread: ${threadTs}`);
1275
+ } else {
1276
+ console.log(`♻️ Reusing existing Claude session: ${sessionId}`);
1277
+
1278
+ // 检查配置是否变化
1279
+ if (sessionId && configSnapshot) {
1280
+ const configChanged = sessionManager.hasConfigChanged(sessionId, configSnapshot);
1281
+ if (configChanged) {
1282
+ console.log(`🔄 Config changed for Slack session ${sessionId}, removing old session and creating new one`);
1283
+ await sessionManager.removeSession(sessionId);
1284
+ claudeSession = sessionManager.createNewSession(agentId, queryOptions, undefined, claudeConfig.versionId, claudeConfig.model, configSnapshot);
1285
+ console.log(`🆕 Created new Claude session due to config change for Slack thread: ${threadTs}`);
1286
+ }
1287
+ }
1288
+ }
1289
+
1290
+ // Step 6: Acquire session lock
1291
+ const finalSessionId = claudeSession.getClaudeSessionId() || sessionId;
1292
+ let lockAcquired = false;
1293
+
1294
+ if (finalSessionId) {
1295
+ lockAcquired = await this.acquireSessionLock(
1296
+ finalSessionId,
1297
+ event,
1298
+ threadTs,
1299
+ agentId,
1300
+ placeholderMsg.ts,
1301
+ agentDisplayName
1302
+ );
1303
+
1304
+ if (!lockAcquired) {
1305
+ return; // Lock acquisition failed, busy message already sent
1306
+ }
1307
+ }
1308
+
1309
+ try {
1310
+ // Step 7: Process images if present
1311
+ let images: any[] = [];
1312
+ if (event.files && event.files.length > 0) {
1313
+ images = await this.processSlackFiles(event.files);
1314
+
1315
+ if (images.length > 0) {
1316
+ console.log(`📸 Processed ${images.length} image(s) for Claude`);
1317
+ }
1318
+ }
1319
+
1320
+ // Step 8: Build user message with images support
1321
+ const userMessage = await buildUserMessageContent(
1322
+ cleanText,
1323
+ images.length > 0 ? images : undefined,
1324
+ claudeConfig.model,
1325
+ projectPath,
1326
+ claudeConfig.versionId
1327
+ );
1328
+
1329
+ // Step 9: Process Claude response with real-time updates
1330
+ const { fullResponse, toolUsageInfo, hasError } = await this.processClaudeResponse(
1331
+ claudeSession,
1332
+ userMessage,
1333
+ event,
1334
+ threadTs,
1335
+ agentId,
1336
+ selectedProject,
1337
+ placeholderMsg.ts, // Pass placeholder message timestamp for real-time updates
1338
+ configSnapshot // Pass config snapshot for session confirmation
1339
+ );
1340
+
1341
+ // Step 10: Update Slack message with final response
1342
+ let finalText = fullResponse || SLACK_MESSAGES.COMPLETED;
1343
+
1344
+ if (toolUsageInfo) {
1345
+ finalText += `\n\n${toolUsageInfo}`;
1346
+ }
1347
+
1348
+ if (hasError) {
1349
+ finalText = SLACK_MESSAGES.ERROR_GENERIC;
1350
+ }
1351
+
1352
+ await this.slackClient.updateMessage({
1353
+ channel: event.channel,
1354
+ ts: placeholderMsg.ts,
1355
+ text: finalText
1356
+ });
1357
+
1358
+ console.log(`✅ Updated Slack message with AI response (${fullResponse.length} chars)`);
1359
+
1360
+ } catch (error) {
1361
+ console.error('❌ Error during Claude processing:', error);
1362
+
1363
+ await this.slackClient.updateMessage({
1364
+ channel: event.channel,
1365
+ ts: placeholderMsg.ts,
1366
+ text: SLACK_MESSAGES.ERROR_WITH_MESSAGE(error instanceof Error ? error.message : SLACK_MESSAGES.UNKNOWN_ERROR)
1367
+ });
1368
+ } finally {
1369
+ // Step 11: Release session lock
1370
+ if (finalSessionId && lockAcquired) {
1371
+ const released = slackSessionLock.releaseLock(finalSessionId);
1372
+ if (released) {
1373
+ console.log(`🔓 Released lock for session ${finalSessionId}`);
1374
+ } else {
1375
+ console.log(`⚠️ Failed to release lock for session ${finalSessionId}`);
1376
+ }
1377
+ }
1378
+ }
1379
+
1380
+ } catch (error) {
1381
+ console.error('❌ Error handling Slack message:', error);
1382
+
1383
+ // Try to send error message to Slack
1384
+ try {
1385
+ await this.slackClient.postMessage({
1386
+ channel: event.channel,
1387
+ text: SLACK_MESSAGES.ERROR_PROCESSING(error instanceof Error ? error.message : SLACK_MESSAGES.UNKNOWN_ERROR),
1388
+ thread_ts: event.thread_ts || event.ts
1389
+ });
1390
+ } catch (sendError) {
1391
+ console.error('❌ Failed to send error message to Slack:', sendError);
1392
+ }
1393
+ }
1394
+ }
1395
+ }