@hailer/mcp 1.1.15 → 1.1.16

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 (544) hide show
  1. package/dist/agents/bot-manager.d.ts +48 -0
  2. package/dist/agents/bot-manager.d.ts.map +1 -0
  3. package/dist/agents/bot-manager.js +254 -0
  4. package/dist/agents/bot-manager.js.map +1 -0
  5. package/dist/agents/bug-fixer/ai.d.ts +80 -0
  6. package/dist/agents/bug-fixer/ai.d.ts.map +1 -0
  7. package/dist/agents/bug-fixer/ai.js +466 -0
  8. package/dist/agents/bug-fixer/ai.js.map +1 -0
  9. package/dist/agents/bug-fixer/bot.d.ts +92 -0
  10. package/dist/agents/bug-fixer/bot.d.ts.map +1 -0
  11. package/dist/agents/bug-fixer/bot.js +687 -0
  12. package/dist/agents/bug-fixer/bot.js.map +1 -0
  13. package/dist/agents/bug-fixer/config.d.ts +21 -0
  14. package/dist/agents/bug-fixer/config.d.ts.map +1 -0
  15. package/dist/agents/bug-fixer/config.js +218 -0
  16. package/dist/agents/bug-fixer/config.js.map +1 -0
  17. package/dist/agents/bug-fixer/files.d.ts +67 -0
  18. package/dist/agents/bug-fixer/files.d.ts.map +1 -0
  19. package/dist/agents/bug-fixer/files.js +386 -0
  20. package/dist/agents/bug-fixer/files.js.map +1 -0
  21. package/dist/agents/bug-fixer/git.d.ts +48 -0
  22. package/dist/agents/bug-fixer/git.d.ts.map +1 -0
  23. package/dist/agents/bug-fixer/git.js +298 -0
  24. package/dist/agents/bug-fixer/git.js.map +1 -0
  25. package/dist/agents/bug-fixer/index.d.ts +103 -0
  26. package/dist/agents/bug-fixer/index.d.ts.map +1 -0
  27. package/dist/agents/bug-fixer/index.js +262 -0
  28. package/dist/agents/bug-fixer/index.js.map +1 -0
  29. package/dist/agents/bug-fixer/lsp.d.ts +113 -0
  30. package/dist/agents/bug-fixer/lsp.d.ts.map +1 -0
  31. package/dist/agents/bug-fixer/lsp.js +485 -0
  32. package/dist/agents/bug-fixer/lsp.js.map +1 -0
  33. package/dist/agents/bug-fixer/monitor.d.ts +123 -0
  34. package/dist/agents/bug-fixer/monitor.d.ts.map +1 -0
  35. package/dist/agents/bug-fixer/monitor.js +629 -0
  36. package/dist/agents/bug-fixer/monitor.js.map +1 -0
  37. package/dist/agents/bug-fixer/prompt.d.ts +5 -0
  38. package/dist/agents/bug-fixer/prompt.d.ts.map +1 -0
  39. package/dist/agents/bug-fixer/prompt.js +94 -0
  40. package/dist/agents/bug-fixer/prompt.js.map +1 -0
  41. package/dist/agents/bug-fixer/registries/pending-classification.d.ts +28 -0
  42. package/dist/agents/bug-fixer/registries/pending-classification.d.ts.map +1 -0
  43. package/dist/agents/bug-fixer/registries/pending-classification.js +50 -0
  44. package/dist/agents/bug-fixer/registries/pending-classification.js.map +1 -0
  45. package/dist/agents/bug-fixer/registries/pending-fix.d.ts +33 -0
  46. package/dist/agents/bug-fixer/registries/pending-fix.d.ts.map +1 -0
  47. package/dist/agents/bug-fixer/registries/pending-fix.js +64 -0
  48. package/dist/agents/bug-fixer/registries/pending-fix.js.map +1 -0
  49. package/dist/agents/bug-fixer/registries/pending.d.ts +27 -0
  50. package/dist/agents/bug-fixer/registries/pending.d.ts.map +1 -0
  51. package/dist/agents/bug-fixer/registries/pending.js +49 -0
  52. package/dist/agents/bug-fixer/registries/pending.js.map +1 -0
  53. package/dist/agents/bug-fixer/specialist-daemon.d.ts +88 -0
  54. package/dist/agents/bug-fixer/specialist-daemon.d.ts.map +1 -0
  55. package/dist/agents/bug-fixer/specialist-daemon.js +431 -0
  56. package/dist/agents/bug-fixer/specialist-daemon.js.map +1 -0
  57. package/dist/agents/bug-fixer/specialist.d.ts +47 -0
  58. package/dist/agents/bug-fixer/specialist.d.ts.map +1 -0
  59. package/dist/agents/bug-fixer/specialist.js +327 -0
  60. package/dist/agents/bug-fixer/specialist.js.map +1 -0
  61. package/dist/agents/bug-fixer/types.d.ts +123 -0
  62. package/dist/agents/bug-fixer/types.d.ts.map +1 -0
  63. package/dist/agents/bug-fixer/types.js +9 -0
  64. package/dist/agents/bug-fixer/types.js.map +1 -0
  65. package/dist/agents/factory.d.ts +172 -0
  66. package/dist/agents/factory.d.ts.map +1 -0
  67. package/dist/agents/factory.js +706 -0
  68. package/dist/agents/factory.js.map +1 -0
  69. package/dist/agents/hailer-expert/index.d.ts +8 -0
  70. package/dist/agents/hailer-expert/index.d.ts.map +1 -0
  71. package/dist/agents/hailer-expert/index.js +14 -0
  72. package/dist/agents/hailer-expert/index.js.map +1 -0
  73. package/dist/agents/hal/daemon.d.ts +174 -0
  74. package/dist/agents/hal/daemon.d.ts.map +1 -0
  75. package/dist/agents/hal/daemon.js +1385 -0
  76. package/dist/agents/hal/daemon.js.map +1 -0
  77. package/dist/agents/hal/definitions.d.ts +42 -0
  78. package/dist/agents/hal/definitions.d.ts.map +1 -0
  79. package/dist/agents/hal/definitions.js +300 -0
  80. package/dist/agents/hal/definitions.js.map +1 -0
  81. package/dist/agents/hal/index.d.ts +3 -0
  82. package/dist/agents/hal/index.d.ts.map +1 -0
  83. package/dist/agents/hal/index.js +8 -0
  84. package/dist/agents/hal/index.js.map +1 -0
  85. package/dist/agents/index.d.ts +18 -0
  86. package/dist/agents/index.d.ts.map +1 -0
  87. package/dist/agents/index.js +48 -0
  88. package/dist/agents/index.js.map +1 -0
  89. package/dist/agents/shared/base.d.ts +253 -0
  90. package/dist/agents/shared/base.d.ts.map +1 -0
  91. package/dist/agents/shared/base.js +1122 -0
  92. package/dist/agents/shared/base.js.map +1 -0
  93. package/dist/agents/shared/schemas/action-schema.d.ts +62 -0
  94. package/dist/agents/shared/schemas/action-schema.d.ts.map +1 -0
  95. package/dist/agents/shared/schemas/action-schema.js +483 -0
  96. package/dist/agents/shared/schemas/action-schema.js.map +1 -0
  97. package/dist/agents/shared/services/agent-registry.d.ts +108 -0
  98. package/dist/agents/shared/services/agent-registry.d.ts.map +1 -0
  99. package/dist/agents/shared/services/agent-registry.js +469 -0
  100. package/dist/agents/shared/services/agent-registry.js.map +1 -0
  101. package/dist/agents/shared/services/conversation-manager.d.ts +57 -0
  102. package/dist/agents/shared/services/conversation-manager.d.ts.map +1 -0
  103. package/dist/agents/shared/services/conversation-manager.js +168 -0
  104. package/dist/agents/shared/services/conversation-manager.js.map +1 -0
  105. package/dist/agents/shared/services/mcp-client.d.ts +56 -0
  106. package/dist/agents/shared/services/mcp-client.d.ts.map +1 -0
  107. package/dist/agents/shared/services/mcp-client.js +124 -0
  108. package/dist/agents/shared/services/mcp-client.js.map +1 -0
  109. package/dist/agents/shared/services/message-classifier.d.ts +37 -0
  110. package/dist/agents/shared/services/message-classifier.d.ts.map +1 -0
  111. package/dist/agents/shared/services/message-classifier.js +203 -0
  112. package/dist/agents/shared/services/message-classifier.js.map +1 -0
  113. package/dist/agents/shared/services/message-formatter.d.ts +89 -0
  114. package/dist/agents/shared/services/message-formatter.d.ts.map +1 -0
  115. package/dist/agents/shared/services/message-formatter.js +390 -0
  116. package/dist/agents/shared/services/message-formatter.js.map +1 -0
  117. package/dist/agents/shared/services/session-logger.d.ts +162 -0
  118. package/dist/agents/shared/services/session-logger.d.ts.map +1 -0
  119. package/dist/agents/shared/services/session-logger.js +724 -0
  120. package/dist/agents/shared/services/session-logger.js.map +1 -0
  121. package/dist/agents/shared/services/structured-output-executor.d.ts +88 -0
  122. package/dist/agents/shared/services/structured-output-executor.d.ts.map +1 -0
  123. package/dist/agents/shared/services/structured-output-executor.js +296 -0
  124. package/dist/agents/shared/services/structured-output-executor.js.map +1 -0
  125. package/dist/agents/shared/services/token-billing.d.ts +72 -0
  126. package/dist/agents/shared/services/token-billing.d.ts.map +1 -0
  127. package/dist/agents/shared/services/token-billing.js +198 -0
  128. package/dist/agents/shared/services/token-billing.js.map +1 -0
  129. package/dist/agents/shared/services/tool-executor.d.ts +43 -0
  130. package/dist/agents/shared/services/tool-executor.d.ts.map +1 -0
  131. package/dist/agents/shared/services/tool-executor.js +175 -0
  132. package/dist/agents/shared/services/tool-executor.js.map +1 -0
  133. package/dist/agents/shared/services/typing-indicator.d.ts +24 -0
  134. package/dist/agents/shared/services/typing-indicator.d.ts.map +1 -0
  135. package/dist/agents/shared/services/typing-indicator.js +54 -0
  136. package/dist/agents/shared/services/typing-indicator.js.map +1 -0
  137. package/dist/agents/shared/services/workspace-schema-cache.d.ts +122 -0
  138. package/dist/agents/shared/services/workspace-schema-cache.d.ts.map +1 -0
  139. package/dist/agents/shared/services/workspace-schema-cache.js +507 -0
  140. package/dist/agents/shared/services/workspace-schema-cache.js.map +1 -0
  141. package/dist/agents/shared/specialist.d.ts +91 -0
  142. package/dist/agents/shared/specialist.d.ts.map +1 -0
  143. package/dist/agents/shared/specialist.js +399 -0
  144. package/dist/agents/shared/specialist.js.map +1 -0
  145. package/dist/agents/shared/tool-schema-loader.d.ts +65 -0
  146. package/dist/agents/shared/tool-schema-loader.d.ts.map +1 -0
  147. package/dist/agents/shared/tool-schema-loader.js +238 -0
  148. package/dist/agents/shared/tool-schema-loader.js.map +1 -0
  149. package/dist/agents/shared/types.d.ts +190 -0
  150. package/dist/agents/shared/types.d.ts.map +1 -0
  151. package/dist/agents/shared/types.js +13 -0
  152. package/dist/agents/shared/types.js.map +1 -0
  153. package/dist/app.d.ts.map +1 -0
  154. package/dist/app.js.map +1 -0
  155. package/dist/bot/bot-config.d.ts.map +1 -0
  156. package/dist/bot/bot-config.js.map +1 -0
  157. package/dist/bot/bot-manager.d.ts.map +1 -0
  158. package/dist/bot/bot-manager.js.map +1 -0
  159. package/dist/bot/bot.d.ts.map +1 -0
  160. package/dist/bot/bot.js.map +1 -0
  161. package/dist/bot/operation-logger.d.ts.map +1 -0
  162. package/dist/bot/operation-logger.js.map +1 -0
  163. package/dist/bot/services/__tests__/permission-guard.test.d.ts +2 -0
  164. package/dist/bot/services/__tests__/permission-guard.test.d.ts.map +1 -0
  165. package/dist/bot/services/__tests__/permission-guard.test.js +357 -0
  166. package/dist/bot/services/__tests__/permission-guard.test.js.map +1 -0
  167. package/dist/bot/services/conversation-manager.d.ts.map +1 -0
  168. package/dist/bot/services/conversation-manager.js.map +1 -0
  169. package/dist/bot/services/index.d.ts.map +1 -0
  170. package/dist/bot/services/index.js.map +1 -0
  171. package/dist/bot/services/message-classifier.d.ts.map +1 -0
  172. package/dist/bot/services/message-classifier.js.map +1 -0
  173. package/dist/bot/services/message-formatter.d.ts.map +1 -0
  174. package/dist/bot/services/message-formatter.js.map +1 -0
  175. package/dist/bot/services/permission-guard.d.ts.map +1 -0
  176. package/dist/bot/services/permission-guard.js.map +1 -0
  177. package/dist/bot/services/session-logger.d.ts.map +1 -0
  178. package/dist/bot/services/session-logger.js.map +1 -0
  179. package/dist/bot/services/token-billing.d.ts.map +1 -0
  180. package/dist/bot/services/token-billing.js.map +1 -0
  181. package/dist/bot/services/types.d.ts.map +1 -0
  182. package/dist/bot/services/types.js.map +1 -0
  183. package/dist/bot/services/typing-indicator.d.ts.map +1 -0
  184. package/dist/bot/services/typing-indicator.js.map +1 -0
  185. package/dist/bot/services/workspace-schema-cache.d.ts.map +1 -0
  186. package/dist/bot/services/workspace-schema-cache.js.map +1 -0
  187. package/dist/bot/tool-executor.d.ts.map +1 -0
  188. package/dist/bot/tool-executor.js.map +1 -0
  189. package/dist/bot/workspace-overview.d.ts.map +1 -0
  190. package/dist/bot/workspace-overview.js.map +1 -0
  191. package/dist/bot-config/constants.d.ts +42 -0
  192. package/dist/bot-config/constants.d.ts.map +1 -0
  193. package/dist/bot-config/constants.js +118 -0
  194. package/dist/bot-config/constants.js.map +1 -0
  195. package/dist/bot-config/context.d.ts +157 -0
  196. package/dist/bot-config/context.d.ts.map +1 -0
  197. package/dist/bot-config/context.js +475 -0
  198. package/dist/bot-config/context.js.map +1 -0
  199. package/dist/bot-config/index.d.ts +21 -0
  200. package/dist/bot-config/index.d.ts.map +1 -0
  201. package/dist/bot-config/index.js +104 -0
  202. package/dist/bot-config/index.js.map +1 -0
  203. package/dist/bot-config/loader.d.ts +28 -0
  204. package/dist/bot-config/loader.d.ts.map +1 -0
  205. package/dist/bot-config/loader.js +194 -0
  206. package/dist/bot-config/loader.js.map +1 -0
  207. package/dist/bot-config/persistence.d.ts +68 -0
  208. package/dist/bot-config/persistence.d.ts.map +1 -0
  209. package/dist/bot-config/persistence.js +261 -0
  210. package/dist/bot-config/persistence.js.map +1 -0
  211. package/dist/bot-config/state.d.ts +56 -0
  212. package/dist/bot-config/state.d.ts.map +1 -0
  213. package/dist/bot-config/state.js +197 -0
  214. package/dist/bot-config/state.js.map +1 -0
  215. package/dist/bot-config/tools.d.ts +28 -0
  216. package/dist/bot-config/tools.d.ts.map +1 -0
  217. package/dist/bot-config/tools.js +279 -0
  218. package/dist/bot-config/tools.js.map +1 -0
  219. package/dist/bot-config/types.d.ts +45 -0
  220. package/dist/bot-config/types.d.ts.map +1 -0
  221. package/dist/bot-config/types.js +9 -0
  222. package/dist/bot-config/types.js.map +1 -0
  223. package/dist/bot-config/webhooks.d.ts +27 -0
  224. package/dist/bot-config/webhooks.d.ts.map +1 -0
  225. package/dist/bot-config/webhooks.js +212 -0
  226. package/dist/bot-config/webhooks.js.map +1 -0
  227. package/dist/cli.d.ts.map +1 -0
  228. package/dist/cli.js.map +1 -0
  229. package/dist/client/agents/base.d.ts +207 -0
  230. package/dist/client/agents/base.d.ts.map +1 -0
  231. package/dist/client/agents/base.js +744 -0
  232. package/dist/client/agents/base.js.map +1 -0
  233. package/dist/client/agents/definitions.d.ts +53 -0
  234. package/dist/client/agents/definitions.d.ts.map +1 -0
  235. package/dist/client/agents/definitions.js +263 -0
  236. package/dist/client/agents/definitions.js.map +1 -0
  237. package/dist/client/agents/orchestrator.d.ts +141 -0
  238. package/dist/client/agents/orchestrator.d.ts.map +1 -0
  239. package/dist/client/agents/orchestrator.js +1062 -0
  240. package/dist/client/agents/orchestrator.js.map +1 -0
  241. package/dist/client/agents/specialist.d.ts +86 -0
  242. package/dist/client/agents/specialist.d.ts.map +1 -0
  243. package/dist/client/agents/specialist.js +340 -0
  244. package/dist/client/agents/specialist.js.map +1 -0
  245. package/dist/client/bot-entrypoint.d.ts +7 -0
  246. package/dist/client/bot-entrypoint.d.ts.map +1 -0
  247. package/dist/client/bot-entrypoint.js +103 -0
  248. package/dist/client/bot-entrypoint.js.map +1 -0
  249. package/dist/client/bot-manager.d.ts +44 -0
  250. package/dist/client/bot-manager.d.ts.map +1 -0
  251. package/dist/client/bot-manager.js +173 -0
  252. package/dist/client/bot-manager.js.map +1 -0
  253. package/dist/client/bot-runner.d.ts +35 -0
  254. package/dist/client/bot-runner.d.ts.map +1 -0
  255. package/dist/client/bot-runner.js +188 -0
  256. package/dist/client/bot-runner.js.map +1 -0
  257. package/dist/client/chat-agent-daemon.d.ts +464 -0
  258. package/dist/client/chat-agent-daemon.d.ts.map +1 -0
  259. package/dist/client/chat-agent-daemon.js +1774 -0
  260. package/dist/client/chat-agent-daemon.js.map +1 -0
  261. package/dist/client/daemon-factory.d.ts +106 -0
  262. package/dist/client/daemon-factory.d.ts.map +1 -0
  263. package/dist/client/daemon-factory.js +301 -0
  264. package/dist/client/daemon-factory.js.map +1 -0
  265. package/dist/client/factory.d.ts +111 -0
  266. package/dist/client/factory.d.ts.map +1 -0
  267. package/dist/client/factory.js +314 -0
  268. package/dist/client/factory.js.map +1 -0
  269. package/dist/client/index.d.ts +17 -0
  270. package/dist/client/index.d.ts.map +1 -0
  271. package/dist/client/index.js +38 -0
  272. package/dist/client/index.js.map +1 -0
  273. package/dist/client/multi-bot-manager.d.ts +42 -0
  274. package/dist/client/multi-bot-manager.d.ts.map +1 -0
  275. package/dist/client/multi-bot-manager.js +161 -0
  276. package/dist/client/multi-bot-manager.js.map +1 -0
  277. package/dist/client/orchestrator-daemon.d.ts +87 -0
  278. package/dist/client/orchestrator-daemon.d.ts.map +1 -0
  279. package/dist/client/orchestrator-daemon.js +444 -0
  280. package/dist/client/orchestrator-daemon.js.map +1 -0
  281. package/dist/client/server.d.ts +8 -0
  282. package/dist/client/server.d.ts.map +1 -0
  283. package/dist/client/server.js +251 -0
  284. package/dist/client/server.js.map +1 -0
  285. package/dist/client/services/agent-registry.d.ts +108 -0
  286. package/dist/client/services/agent-registry.d.ts.map +1 -0
  287. package/dist/client/services/agent-registry.js +630 -0
  288. package/dist/client/services/agent-registry.js.map +1 -0
  289. package/dist/client/services/conversation-manager.d.ts +50 -0
  290. package/dist/client/services/conversation-manager.d.ts.map +1 -0
  291. package/dist/client/services/conversation-manager.js +136 -0
  292. package/dist/client/services/conversation-manager.js.map +1 -0
  293. package/dist/client/services/mcp-client.d.ts +48 -0
  294. package/dist/client/services/mcp-client.d.ts.map +1 -0
  295. package/dist/client/services/mcp-client.js +105 -0
  296. package/dist/client/services/mcp-client.js.map +1 -0
  297. package/dist/client/services/message-classifier.d.ts +37 -0
  298. package/dist/client/services/message-classifier.d.ts.map +1 -0
  299. package/dist/client/services/message-classifier.js +187 -0
  300. package/dist/client/services/message-classifier.js.map +1 -0
  301. package/dist/client/services/message-formatter.d.ts +84 -0
  302. package/dist/client/services/message-formatter.d.ts.map +1 -0
  303. package/dist/client/services/message-formatter.js +353 -0
  304. package/dist/client/services/message-formatter.js.map +1 -0
  305. package/dist/client/services/session-logger.d.ts +106 -0
  306. package/dist/client/services/session-logger.d.ts.map +1 -0
  307. package/dist/client/services/session-logger.js +446 -0
  308. package/dist/client/services/session-logger.js.map +1 -0
  309. package/dist/client/services/tool-executor.d.ts +41 -0
  310. package/dist/client/services/tool-executor.d.ts.map +1 -0
  311. package/dist/client/services/tool-executor.js +169 -0
  312. package/dist/client/services/tool-executor.js.map +1 -0
  313. package/dist/client/services/workspace-schema-cache.d.ts +149 -0
  314. package/dist/client/services/workspace-schema-cache.d.ts.map +1 -0
  315. package/dist/client/services/workspace-schema-cache.js +732 -0
  316. package/dist/client/services/workspace-schema-cache.js.map +1 -0
  317. package/dist/client/specialist-daemon.d.ts +77 -0
  318. package/dist/client/specialist-daemon.d.ts.map +1 -0
  319. package/dist/client/specialist-daemon.js +197 -0
  320. package/dist/client/specialist-daemon.js.map +1 -0
  321. package/dist/client/specialists.d.ts +53 -0
  322. package/dist/client/specialists.d.ts.map +1 -0
  323. package/dist/client/specialists.js +178 -0
  324. package/dist/client/specialists.js.map +1 -0
  325. package/dist/client/tool-schema-loader.d.ts +62 -0
  326. package/dist/client/tool-schema-loader.d.ts.map +1 -0
  327. package/dist/client/tool-schema-loader.js +232 -0
  328. package/dist/client/tool-schema-loader.js.map +1 -0
  329. package/dist/client/types.d.ts +327 -0
  330. package/dist/client/types.d.ts.map +1 -0
  331. package/dist/client/types.js +121 -0
  332. package/dist/client/types.js.map +1 -0
  333. package/dist/commands/seed-config.d.ts +9 -0
  334. package/dist/commands/seed-config.d.ts.map +1 -0
  335. package/dist/commands/seed-config.js +392 -0
  336. package/dist/commands/seed-config.js.map +1 -0
  337. package/dist/commands/setup.d.ts +11 -0
  338. package/dist/commands/setup.d.ts.map +1 -0
  339. package/dist/commands/setup.js +320 -0
  340. package/dist/commands/setup.js.map +1 -0
  341. package/dist/config.d.ts.map +1 -0
  342. package/dist/config.js.map +1 -0
  343. package/dist/core.d.ts.map +1 -0
  344. package/dist/core.js.map +1 -0
  345. package/dist/lib/discussion-lock.d.ts.map +1 -0
  346. package/dist/lib/discussion-lock.js.map +1 -0
  347. package/dist/lib/logger.d.ts.map +1 -0
  348. package/dist/lib/logger.js.map +1 -0
  349. package/dist/lib/request-logger.d.ts.map +1 -0
  350. package/dist/lib/request-logger.js.map +1 -0
  351. package/dist/mcp/UserContextCache.d.ts.map +1 -0
  352. package/dist/mcp/UserContextCache.js.map +1 -0
  353. package/dist/mcp/auth.d.ts.map +1 -0
  354. package/dist/mcp/auth.js.map +1 -0
  355. package/dist/mcp/hailer-clients.d.ts.map +1 -0
  356. package/dist/mcp/hailer-clients.js.map +1 -0
  357. package/dist/mcp/session-store.d.ts.map +1 -0
  358. package/dist/mcp/session-store.js.map +1 -0
  359. package/dist/mcp/signal-handler.d.ts.map +1 -0
  360. package/dist/mcp/signal-handler.js.map +1 -0
  361. package/dist/mcp/tool-registry.d.ts.map +1 -0
  362. package/dist/mcp/tool-registry.js.map +1 -0
  363. package/dist/mcp/tools/__tests__/discussion-forward.test.d.ts +2 -0
  364. package/dist/mcp/tools/__tests__/discussion-forward.test.d.ts.map +1 -0
  365. package/dist/mcp/tools/__tests__/discussion-forward.test.js +218 -0
  366. package/dist/mcp/tools/__tests__/discussion-forward.test.js.map +1 -0
  367. package/dist/mcp/tools/activity.d.ts.map +1 -0
  368. package/dist/mcp/tools/activity.js.map +1 -0
  369. package/dist/mcp/tools/app-core.d.ts.map +1 -0
  370. package/dist/mcp/tools/app-core.js.map +1 -0
  371. package/dist/mcp/tools/app-marketplace.d.ts.map +1 -0
  372. package/dist/mcp/tools/app-marketplace.js.map +1 -0
  373. package/dist/mcp/tools/app-member.d.ts.map +1 -0
  374. package/dist/mcp/tools/app-member.js.map +1 -0
  375. package/dist/mcp/tools/app-scaffold.d.ts.map +1 -0
  376. package/dist/mcp/tools/app-scaffold.js.map +1 -0
  377. package/dist/mcp/tools/app.d.ts.map +1 -0
  378. package/dist/mcp/tools/app.js.map +1 -0
  379. package/dist/mcp/tools/bot-config/constants.d.ts.map +1 -0
  380. package/dist/mcp/tools/bot-config/constants.js.map +1 -0
  381. package/dist/mcp/tools/bot-config/core.d.ts.map +1 -0
  382. package/dist/mcp/tools/bot-config/core.js.map +1 -0
  383. package/dist/mcp/tools/bot-config/index.d.ts.map +1 -0
  384. package/dist/mcp/tools/bot-config/index.js.map +1 -0
  385. package/dist/mcp/tools/bot-config/tools.d.ts.map +1 -0
  386. package/dist/mcp/tools/bot-config/tools.js.map +1 -0
  387. package/dist/mcp/tools/bot-config/types.d.ts.map +1 -0
  388. package/dist/mcp/tools/bot-config/types.js.map +1 -0
  389. package/dist/mcp/tools/bug-fixer-tools.d.ts.map +1 -0
  390. package/dist/mcp/tools/bug-fixer-tools.js.map +1 -0
  391. package/dist/mcp/tools/company.d.ts.map +1 -0
  392. package/dist/mcp/tools/company.js.map +1 -0
  393. package/dist/mcp/tools/discussion.d.ts.map +1 -0
  394. package/dist/mcp/tools/discussion.js.map +1 -0
  395. package/dist/mcp/tools/document.d.ts.map +1 -0
  396. package/dist/mcp/tools/document.js.map +1 -0
  397. package/dist/mcp/tools/file.d.ts.map +1 -0
  398. package/dist/mcp/tools/file.js.map +1 -0
  399. package/dist/mcp/tools/insight.d.ts.map +1 -0
  400. package/dist/mcp/tools/insight.js.map +1 -0
  401. package/dist/mcp/tools/investigate.d.ts.map +1 -0
  402. package/dist/mcp/tools/investigate.js.map +1 -0
  403. package/dist/mcp/tools/user.d.ts.map +1 -0
  404. package/dist/mcp/tools/user.js.map +1 -0
  405. package/dist/mcp/tools/workflow-permissions.d.ts.map +1 -0
  406. package/dist/mcp/tools/workflow-permissions.js.map +1 -0
  407. package/dist/mcp/tools/workflow.d.ts.map +1 -0
  408. package/dist/mcp/tools/workflow.js.map +1 -0
  409. package/dist/mcp/utils/api-errors.d.ts.map +1 -0
  410. package/dist/mcp/utils/api-errors.js.map +1 -0
  411. package/dist/mcp/utils/data-transformers.d.ts.map +1 -0
  412. package/dist/mcp/utils/data-transformers.js.map +1 -0
  413. package/dist/mcp/utils/file-upload.d.ts.map +1 -0
  414. package/dist/mcp/utils/file-upload.js.map +1 -0
  415. package/dist/mcp/utils/hailer-api-client.d.ts.map +1 -0
  416. package/dist/mcp/utils/hailer-api-client.js.map +1 -0
  417. package/dist/mcp/utils/index.d.ts.map +1 -0
  418. package/dist/mcp/utils/index.js.map +1 -0
  419. package/dist/mcp/utils/logger.d.ts.map +1 -0
  420. package/dist/mcp/utils/logger.js.map +1 -0
  421. package/dist/mcp/utils/pagination.d.ts.map +1 -0
  422. package/dist/mcp/utils/pagination.js.map +1 -0
  423. package/dist/mcp/utils/response-builder.d.ts.map +1 -0
  424. package/dist/mcp/utils/response-builder.js.map +1 -0
  425. package/dist/mcp/utils/role-utils.d.ts.map +1 -0
  426. package/dist/mcp/utils/role-utils.js.map +1 -0
  427. package/dist/mcp/utils/tool-helpers.d.ts.map +1 -0
  428. package/dist/mcp/utils/tool-helpers.js.map +1 -0
  429. package/dist/mcp/utils/types.d.ts.map +1 -0
  430. package/dist/mcp/utils/types.js.map +1 -0
  431. package/dist/mcp/webhook-handler.d.ts.map +1 -0
  432. package/dist/mcp/webhook-handler.js.map +1 -0
  433. package/dist/mcp/workspace-cache.d.ts.map +1 -0
  434. package/dist/mcp/workspace-cache.js.map +1 -0
  435. package/dist/mcp-server.d.ts.map +1 -0
  436. package/dist/mcp-server.js.map +1 -0
  437. package/dist/modules/bug-reports/bug-config.d.ts +25 -0
  438. package/dist/modules/bug-reports/bug-config.d.ts.map +1 -0
  439. package/dist/modules/bug-reports/bug-config.js +187 -0
  440. package/dist/modules/bug-reports/bug-config.js.map +1 -0
  441. package/dist/modules/bug-reports/bug-monitor.d.ts +108 -0
  442. package/dist/modules/bug-reports/bug-monitor.d.ts.map +1 -0
  443. package/dist/modules/bug-reports/bug-monitor.js +510 -0
  444. package/dist/modules/bug-reports/bug-monitor.js.map +1 -0
  445. package/dist/modules/bug-reports/giuseppe-agent.d.ts +58 -0
  446. package/dist/modules/bug-reports/giuseppe-agent.d.ts.map +1 -0
  447. package/dist/modules/bug-reports/giuseppe-agent.js +467 -0
  448. package/dist/modules/bug-reports/giuseppe-agent.js.map +1 -0
  449. package/dist/modules/bug-reports/giuseppe-ai.d.ts +83 -0
  450. package/dist/modules/bug-reports/giuseppe-ai.d.ts.map +1 -0
  451. package/dist/modules/bug-reports/giuseppe-ai.js +466 -0
  452. package/dist/modules/bug-reports/giuseppe-ai.js.map +1 -0
  453. package/dist/modules/bug-reports/giuseppe-bot.d.ts +110 -0
  454. package/dist/modules/bug-reports/giuseppe-bot.d.ts.map +1 -0
  455. package/dist/modules/bug-reports/giuseppe-bot.js +804 -0
  456. package/dist/modules/bug-reports/giuseppe-bot.js.map +1 -0
  457. package/dist/modules/bug-reports/giuseppe-daemon.d.ts +80 -0
  458. package/dist/modules/bug-reports/giuseppe-daemon.d.ts.map +1 -0
  459. package/dist/modules/bug-reports/giuseppe-daemon.js +617 -0
  460. package/dist/modules/bug-reports/giuseppe-daemon.js.map +1 -0
  461. package/dist/modules/bug-reports/giuseppe-files.d.ts +64 -0
  462. package/dist/modules/bug-reports/giuseppe-files.d.ts.map +1 -0
  463. package/dist/modules/bug-reports/giuseppe-files.js +375 -0
  464. package/dist/modules/bug-reports/giuseppe-files.js.map +1 -0
  465. package/dist/modules/bug-reports/giuseppe-git.d.ts +48 -0
  466. package/dist/modules/bug-reports/giuseppe-git.d.ts.map +1 -0
  467. package/dist/modules/bug-reports/giuseppe-git.js +298 -0
  468. package/dist/modules/bug-reports/giuseppe-git.js.map +1 -0
  469. package/dist/modules/bug-reports/giuseppe-lsp.d.ts +113 -0
  470. package/dist/modules/bug-reports/giuseppe-lsp.d.ts.map +1 -0
  471. package/dist/modules/bug-reports/giuseppe-lsp.js +485 -0
  472. package/dist/modules/bug-reports/giuseppe-lsp.js.map +1 -0
  473. package/dist/modules/bug-reports/giuseppe-prompt.d.ts +5 -0
  474. package/dist/modules/bug-reports/giuseppe-prompt.d.ts.map +1 -0
  475. package/dist/modules/bug-reports/giuseppe-prompt.js +94 -0
  476. package/dist/modules/bug-reports/giuseppe-prompt.js.map +1 -0
  477. package/dist/modules/bug-reports/index.d.ts +77 -0
  478. package/dist/modules/bug-reports/index.d.ts.map +1 -0
  479. package/dist/modules/bug-reports/index.js +215 -0
  480. package/dist/modules/bug-reports/index.js.map +1 -0
  481. package/dist/modules/bug-reports/pending-classification-registry.d.ts +28 -0
  482. package/dist/modules/bug-reports/pending-classification-registry.d.ts.map +1 -0
  483. package/dist/modules/bug-reports/pending-classification-registry.js +50 -0
  484. package/dist/modules/bug-reports/pending-classification-registry.js.map +1 -0
  485. package/dist/modules/bug-reports/pending-fix-registry.d.ts +30 -0
  486. package/dist/modules/bug-reports/pending-fix-registry.d.ts.map +1 -0
  487. package/dist/modules/bug-reports/pending-fix-registry.js +42 -0
  488. package/dist/modules/bug-reports/pending-fix-registry.js.map +1 -0
  489. package/dist/modules/bug-reports/pending-registry.d.ts +27 -0
  490. package/dist/modules/bug-reports/pending-registry.d.ts.map +1 -0
  491. package/dist/modules/bug-reports/pending-registry.js +49 -0
  492. package/dist/modules/bug-reports/pending-registry.js.map +1 -0
  493. package/dist/modules/bug-reports/types.d.ts +123 -0
  494. package/dist/modules/bug-reports/types.d.ts.map +1 -0
  495. package/dist/modules/bug-reports/types.js +9 -0
  496. package/dist/modules/bug-reports/types.js.map +1 -0
  497. package/dist/plugins/bug-fixer/index.d.ts.map +1 -0
  498. package/dist/plugins/bug-fixer/index.js.map +1 -0
  499. package/dist/plugins/bug-fixer/tools.d.ts.map +1 -0
  500. package/dist/plugins/bug-fixer/tools.js.map +1 -0
  501. package/dist/plugins/vipunen/__tests__/tools.test.d.ts +10 -0
  502. package/dist/plugins/vipunen/__tests__/tools.test.d.ts.map +1 -0
  503. package/dist/plugins/vipunen/__tests__/tools.test.js +646 -0
  504. package/dist/plugins/vipunen/__tests__/tools.test.js.map +1 -0
  505. package/dist/plugins/vipunen/client.d.ts.map +1 -0
  506. package/dist/plugins/vipunen/client.js.map +1 -0
  507. package/dist/plugins/vipunen/index.d.ts.map +1 -0
  508. package/dist/plugins/vipunen/index.js.map +1 -0
  509. package/dist/plugins/vipunen/tools.d.ts.map +1 -0
  510. package/dist/plugins/vipunen/tools.js.map +1 -0
  511. package/dist/routes/agents.d.ts +44 -0
  512. package/dist/routes/agents.d.ts.map +1 -0
  513. package/dist/routes/agents.js +311 -0
  514. package/dist/routes/agents.js.map +1 -0
  515. package/dist/services/agent-credential-store.d.ts +73 -0
  516. package/dist/services/agent-credential-store.d.ts.map +1 -0
  517. package/dist/services/agent-credential-store.js +212 -0
  518. package/dist/services/agent-credential-store.js.map +1 -0
  519. package/dist/stdio-server.d.ts.map +1 -0
  520. package/dist/stdio-server.js.map +1 -0
  521. package/dist/workspace/context.d.ts +148 -0
  522. package/dist/workspace/context.d.ts.map +1 -0
  523. package/dist/workspace/context.js +339 -0
  524. package/dist/workspace/context.js.map +1 -0
  525. package/dist/workspace/credentials.d.ts +55 -0
  526. package/dist/workspace/credentials.d.ts.map +1 -0
  527. package/dist/workspace/credentials.js +239 -0
  528. package/dist/workspace/credentials.js.map +1 -0
  529. package/dist/workspace/index.d.ts +21 -0
  530. package/dist/workspace/index.d.ts.map +1 -0
  531. package/dist/workspace/index.js +45 -0
  532. package/dist/workspace/index.js.map +1 -0
  533. package/dist/workspace/loader.d.ts +27 -0
  534. package/dist/workspace/loader.d.ts.map +1 -0
  535. package/dist/workspace/loader.js +222 -0
  536. package/dist/workspace/loader.js.map +1 -0
  537. package/dist/workspace/schema.d.ts +37 -0
  538. package/dist/workspace/schema.d.ts.map +1 -0
  539. package/dist/workspace/schema.js +192 -0
  540. package/dist/workspace/schema.js.map +1 -0
  541. package/package.json +13 -1
  542. package/.claude/.context-watchdog.json +0 -1
  543. package/.claude/.session-checked +0 -1
  544. package/test-billing-server.js +0 -136
@@ -0,0 +1,687 @@
1
+ "use strict";
2
+ /**
3
+ * Bug Reports Module - Bug Fixer Bot
4
+ *
5
+ * Autonomous app fixer that:
6
+ * 1. Analyzes bug reports
7
+ * 2. Finds app project code
8
+ * 3. Generates fixes using Claude
9
+ * 4. Tests locally
10
+ * 5. Publishes to production
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BugFixerBot = void 0;
14
+ const child_process_1 = require("child_process");
15
+ const logger_1 = require("../../lib/logger");
16
+ const pending_fix_1 = require("./registries/pending-fix");
17
+ const pending_classification_1 = require("./registries/pending-classification");
18
+ const app_scaffold_1 = require("../../mcp/tools/app-scaffold");
19
+ // Import extracted modules
20
+ const ai_1 = require("./ai");
21
+ const git_1 = require("./git");
22
+ const files_1 = require("./files");
23
+ const lsp_1 = require("./lsp");
24
+ const logger = (0, logger_1.createLogger)({ component: 'bug-fixer-bot' });
25
+ class BugFixerBot {
26
+ userContext;
27
+ config;
28
+ monitor;
29
+ ai;
30
+ git;
31
+ files;
32
+ lsp;
33
+ appsRegistry = new Map();
34
+ schemaCache = null;
35
+ constructor(userContext, config, monitor, schemaCache) {
36
+ this.userContext = userContext;
37
+ this.config = config;
38
+ this.monitor = monitor;
39
+ // Initialize extracted modules
40
+ const apiKey = config.anthropicApiKey || process.env.ANTHROPIC_API_KEY;
41
+ this.ai = new ai_1.BugFixerAI(apiKey);
42
+ this.git = new git_1.BugFixerGit();
43
+ this.files = new files_1.BugFixerFiles(process.env.DEV_APPS_PATH, process.env.DEV_APPS_PATHS);
44
+ this.lsp = new lsp_1.BugFixerLsp();
45
+ this.schemaCache = schemaCache || null;
46
+ // Load apps registry from config
47
+ if (config.appsRegistry) {
48
+ for (const [appId, entry] of Object.entries(config.appsRegistry)) {
49
+ this.appsRegistry.set(appId, entry);
50
+ }
51
+ }
52
+ }
53
+ /**
54
+ * Set schema cache for dynamic workflow discovery
55
+ */
56
+ setSchemaCache(cache) {
57
+ this.schemaCache = cache;
58
+ }
59
+ /**
60
+ * Create a session log entry using dynamic schema discovery
61
+ * Links to the bug report for traceability
62
+ */
63
+ async createSessionLogEntry(title, summary, bugActivityId, metadata) {
64
+ try {
65
+ const { hailer, workspaceCache } = this.userContext;
66
+ const workspaceId = workspaceCache.currentWorkspace._id;
67
+ // Get Session Log schema dynamically
68
+ const schema = this.schemaCache?.getSessionLogSchema(workspaceId);
69
+ if (!schema) {
70
+ logger.warn('Session Log workflow not found in workspace - skipping session log', { workspaceId });
71
+ return null;
72
+ }
73
+ // Get field IDs from schema
74
+ const contextSummaryFieldId = schema.fields["contextSummary"] || schema.fields["Context summary"];
75
+ const linkedWorkFieldId = schema.fields["linkedWork"] || schema.fields["Most relevant link to work"];
76
+ const headlineFieldId = schema.fields["headline"];
77
+ const topicsFieldId = schema.fields["topics"];
78
+ const outcomeFieldId = schema.fields["outcome"];
79
+ // Get phase ID (try "active" first, then first available)
80
+ const phaseId = schema.phases["active"] || Object.values(schema.phases)[0];
81
+ if (!phaseId) {
82
+ logger.warn('No phase found in Session Log workflow');
83
+ return null;
84
+ }
85
+ // Build fields object
86
+ const fields = {};
87
+ if (contextSummaryFieldId) {
88
+ fields[contextSummaryFieldId] = summary;
89
+ }
90
+ if (linkedWorkFieldId && bugActivityId) {
91
+ fields[linkedWorkFieldId] = bugActivityId;
92
+ }
93
+ if (headlineFieldId && metadata?.headline) {
94
+ fields[headlineFieldId] = metadata.headline;
95
+ }
96
+ if (topicsFieldId && metadata?.topics) {
97
+ fields[topicsFieldId] = metadata.topics;
98
+ }
99
+ if (outcomeFieldId && metadata?.outcome) {
100
+ fields[outcomeFieldId] = metadata.outcome;
101
+ }
102
+ // Create activity
103
+ const activities = [{
104
+ name: title,
105
+ phaseId,
106
+ fields
107
+ }];
108
+ const result = await hailer.createActivities(schema.workflowId, activities);
109
+ // Result is array of created activity IDs
110
+ const createdId = result?.[0];
111
+ if (createdId) {
112
+ logger.info('Created session log entry', {
113
+ logId: createdId,
114
+ title,
115
+ linkedBugId: bugActivityId,
116
+ workflowId: schema.workflowId
117
+ });
118
+ return createdId;
119
+ }
120
+ return null;
121
+ }
122
+ catch (error) {
123
+ logger.warn('Failed to create session log entry', {
124
+ title,
125
+ bugActivityId,
126
+ error: error instanceof Error ? error.message : String(error)
127
+ });
128
+ return null;
129
+ }
130
+ }
131
+ /**
132
+ * Check if this bug was already classified by looking for classification message in discussion
133
+ */
134
+ async wasAlreadyClassified(bug) {
135
+ if (!bug.discussionId)
136
+ return false;
137
+ try {
138
+ const { hailer } = this.userContext;
139
+ const result = await hailer.fetchDiscussionMessages(bug.discussionId, 20);
140
+ const messages = result?.messages || [];
141
+ // Check if any message contains our classification pattern
142
+ return messages.some((msg) => {
143
+ const content = msg.content || msg.msg || msg.message || '';
144
+ return content.includes('**Classification:') && content.includes('Reply **"fix it"**');
145
+ });
146
+ }
147
+ catch (error) {
148
+ logger.debug('Failed to check classification history', { bugId: bug.id, error });
149
+ return false;
150
+ }
151
+ }
152
+ /**
153
+ * Handle a new bug - main entry point
154
+ */
155
+ async handleBug(bug) {
156
+ logger.info('Bug Fixer analyzing report', {
157
+ bugId: bug.id,
158
+ bugName: bug.name,
159
+ appId: bug.appId
160
+ });
161
+ const result = {
162
+ success: false,
163
+ summary: '',
164
+ log: []
165
+ };
166
+ // Check if already classified (e.g., after server restart)
167
+ const alreadyClassified = await this.wasAlreadyClassified(bug);
168
+ if (alreadyClassified) {
169
+ logger.info('Bug already classified, skipping re-classification', { bugId: bug.id });
170
+ // Re-register in pending registry for message watching (in case server restarted)
171
+ if (bug.discussionId) {
172
+ // Just register with unknown classification - we're waiting for user response
173
+ pending_classification_1.pendingClassificationRegistry.register({
174
+ discussionId: bug.discussionId,
175
+ bugId: bug.id,
176
+ bugName: bug.name,
177
+ appId: bug.appId,
178
+ appName: bug.appName,
179
+ classification: 'unclear', // Unknown at this point
180
+ reason: 'Previously classified',
181
+ timestamp: Date.now(),
182
+ bug
183
+ });
184
+ this.monitor.watchDiscussion(bug.discussionId);
185
+ }
186
+ return {
187
+ success: false,
188
+ summary: 'Already classified - awaiting confirmation'
189
+ };
190
+ }
191
+ try {
192
+ // 0. Join the bug's discussion so we can post updates
193
+ await this.joinBugDiscussion(bug.id);
194
+ // 1. Classify the report first
195
+ const { classification, reason } = await this.ai.classifyReport(bug);
196
+ result.log?.push(`Classification: ${classification} - ${reason}`);
197
+ // 2. Post classification and ask for confirmation
198
+ const classificationEmoji = classification === 'bug' ? '🐛' : classification === 'feature_request' ? '✨' : '❓';
199
+ const classificationLabel = classification === 'bug' ? 'Bug' : classification === 'feature_request' ? 'Feature Request' : 'Unclear';
200
+ const confirmMessage = [
201
+ `${classificationEmoji} **Classification: ${classificationLabel}**`,
202
+ '',
203
+ `**Reason:** ${reason}`,
204
+ '',
205
+ classification === 'bug'
206
+ ? `This looks like a bug I can try to fix.\n\n👉 Reply **"fix it"** to proceed with auto-fix.\n👉 Reply **"not a bug"** if this is actually a feature request.`
207
+ : `This looks like a feature request, not a bug.\n\n👉 Reply **"fix it"** if you still want me to try.\n👉 Reply **"not a bug"** to confirm and close.`
208
+ ].join('\n');
209
+ await this.reportProgress(bug, confirmMessage);
210
+ // 3. Store pending classification and wait for user response
211
+ if (bug.discussionId) {
212
+ pending_classification_1.pendingClassificationRegistry.register({
213
+ discussionId: bug.discussionId,
214
+ bugId: bug.id,
215
+ bugName: bug.name,
216
+ appId: bug.appId,
217
+ appName: bug.appName,
218
+ classification,
219
+ reason,
220
+ timestamp: Date.now(),
221
+ bug
222
+ });
223
+ logger.info('Stored pending classification', {
224
+ discussionId: bug.discussionId,
225
+ bugId: bug.id,
226
+ classification,
227
+ pendingClassificationsSize: pending_classification_1.pendingClassificationRegistry.size
228
+ });
229
+ this.monitor.watchDiscussion(bug.discussionId);
230
+ }
231
+ result.summary = `Classified as ${classificationLabel} - awaiting confirmation`;
232
+ result.log?.push('Waiting for user to confirm with "fix it"');
233
+ return result;
234
+ }
235
+ catch (error) {
236
+ const errorMessage = error instanceof Error ? error.message : String(error);
237
+ logger.error('Classification failed', { bugId: bug.id, error: errorMessage });
238
+ result.summary = `Classification error: ${errorMessage}`;
239
+ return result;
240
+ }
241
+ }
242
+ /**
243
+ * Continue with bug fix after user confirms
244
+ */
245
+ async proceedWithFix(bug) {
246
+ logger.info('Bug Fixer proceeding with fix', {
247
+ bugId: bug.id,
248
+ bugName: bug.name,
249
+ appId: bug.appId
250
+ });
251
+ const result = {
252
+ success: false,
253
+ summary: '',
254
+ log: []
255
+ };
256
+ try {
257
+ // 1. Find app project
258
+ const app = await this.files.findAppProject(bug, this.appsRegistry);
259
+ if (!app) {
260
+ result.summary = `Could not find app project for appId: ${bug.appId}`;
261
+ result.log?.push('App project not found');
262
+ await this.reportProgress(bug, `❌ ${result.summary}`);
263
+ return result;
264
+ }
265
+ result.log?.push(`Found app project: ${app.projectPath}`);
266
+ await this.reportProgress(bug, `📁 Found app project: ${app.name}`);
267
+ // 1.5. Run LSP analysis to understand current codebase state
268
+ const preAnalysis = await this.lsp.analyzeProject(app.projectPath);
269
+ if (preAnalysis.issues.length > 0) {
270
+ result.log?.push(`Pre-fix LSP: ${preAnalysis.summary}`);
271
+ await this.reportProgress(bug, `🔎 Codebase analysis: ${preAnalysis.summary}`);
272
+ }
273
+ // 2. Analyze and generate fix
274
+ const allFiles = await this.files.scanSourceFiles(app.projectPath);
275
+ const fixPlan = await this.ai.analyzeAndPlanFix(bug, app, allFiles, (paths) => this.files.readSelectedFiles(app.projectPath, paths));
276
+ if (!fixPlan) {
277
+ result.summary = 'Could not generate fix plan';
278
+ result.log?.push('Fix plan generation failed');
279
+ await this.reportProgress(bug, '❌ Could not analyze bug - manual review needed');
280
+ return result;
281
+ }
282
+ result.log?.push(`Fix plan: ${fixPlan.analysis}`);
283
+ await this.reportProgress(bug, `🔍 Analysis: ${fixPlan.analysis}\n🔧 Root cause: ${fixPlan.rootCause}`);
284
+ // 3. Move to "In Progress"
285
+ await this.monitor.moveBugToPhase(bug.id, 'inProgress');
286
+ // 4. Apply fixes and build (with retry on any failure)
287
+ const MAX_RETRIES = 3;
288
+ let currentFixPlan = fixPlan;
289
+ let fixSuccess = false;
290
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
291
+ // Try to apply the fix
292
+ const applyResult = await this.files.applyFixes(app, currentFixPlan.fix.files);
293
+ if (!applyResult.success) {
294
+ // Apply failed - likely search string not found
295
+ result.log?.push(`Apply failed (attempt ${attempt}): ${applyResult.error}`);
296
+ await this.reportProgress(bug, `❌ Apply failed (attempt ${attempt}/${MAX_RETRIES}): ${applyResult.error}`);
297
+ if (attempt < MAX_RETRIES) {
298
+ await this.reportProgress(bug, `🔄 Re-reading file and generating new fix...`);
299
+ // Re-read the current state of files that need to be modified
300
+ const filePaths = currentFixPlan.fix.files.map(f => f.path);
301
+ const currentFiles = await this.files.readSelectedFiles(app.projectPath, filePaths);
302
+ // Re-generate fix with current file state
303
+ const retryFix = await this.ai.retryFixFromApplyError(bug, currentFixPlan, applyResult.error || 'Unknown error', currentFiles, attempt);
304
+ if (!retryFix) {
305
+ result.log?.push('Could not generate retry fix');
306
+ await this.reportProgress(bug, `❌ Could not generate corrected fix`);
307
+ break;
308
+ }
309
+ currentFixPlan = retryFix;
310
+ continue; // Try applying again
311
+ }
312
+ break;
313
+ }
314
+ // Apply succeeded - now build
315
+ result.filesModified = [...new Set([...(result.filesModified || []), ...applyResult.files])];
316
+ result.log?.push(`Modified ${applyResult.files.length} file(s)`);
317
+ await this.reportProgress(bug, `✏️ Applied fixes to ${applyResult.files.length} file(s)`);
318
+ const buildResult = await this.buildAndTest(app);
319
+ if (buildResult.success) {
320
+ // Run LSP analysis to check for remaining issues
321
+ const lspResult = await this.lsp.validateFix(app.projectPath);
322
+ if (!lspResult.valid) {
323
+ result.log?.push(`LSP found ${lspResult.errors.length} issue(s)`);
324
+ await this.reportProgress(bug, `⚠️ Build passed but LSP found issues:\n${lspResult.errors.slice(0, 3).join('\n')}`);
325
+ }
326
+ fixSuccess = true;
327
+ result.log?.push(`Build successful (attempt ${attempt})`);
328
+ await this.reportProgress(bug, '✅ Build successful');
329
+ break;
330
+ }
331
+ // Build failed
332
+ result.log?.push(`Build failed (attempt ${attempt}): ${buildResult.error}`);
333
+ await this.reportProgress(bug, `❌ Build failed (attempt ${attempt}/${MAX_RETRIES}):\n\`\`\`\n${buildResult.error}\n\`\`\``);
334
+ if (attempt < MAX_RETRIES) {
335
+ await this.reportProgress(bug, `🔄 Analyzing error and retrying...`);
336
+ // Read the current state of files that were modified
337
+ const currentFiles = await this.files.readSelectedFiles(app.projectPath, currentFixPlan.fix.files.map(f => f.path));
338
+ const retryFix = await this.ai.retryFixFromError(bug, currentFixPlan, buildResult.error || 'Unknown error', currentFiles, attempt);
339
+ if (!retryFix) {
340
+ result.log?.push('Could not generate retry fix');
341
+ await this.reportProgress(bug, `❌ Could not generate corrected fix`);
342
+ break;
343
+ }
344
+ currentFixPlan = retryFix;
345
+ // Continue to next attempt - will apply the new fix
346
+ }
347
+ }
348
+ if (!fixSuccess) {
349
+ result.summary = `Fix failed after ${MAX_RETRIES} attempts`;
350
+ // Revert all changes
351
+ if (result.filesModified && result.filesModified.length > 0) {
352
+ await this.git.revertChanges(app, result.filesModified);
353
+ }
354
+ await this.reportProgress(bug, `❌ Could not fix bug after ${MAX_RETRIES} attempts. Changes reverted.`);
355
+ return result;
356
+ }
357
+ // 6. Commit changes
358
+ const commitResult = await this.git.commitChanges(app, bug);
359
+ if (commitResult.hash) {
360
+ result.commitHash = commitResult.hash;
361
+ result.log?.push(`Committed: ${commitResult.hash}`);
362
+ }
363
+ // 7. Stay in "In Progress" - will move to "Fixed" only after approval
364
+ // (already moved to inProgress in step 3)
365
+ // 8. Store pending fix and ask owner to test
366
+ if (bug.discussionId) {
367
+ pending_fix_1.pendingFixRegistry.register({
368
+ discussionId: bug.discussionId,
369
+ bugId: bug.id,
370
+ appId: bug.appId || app.name,
371
+ state: 'awaiting_test',
372
+ fixSummary: currentFixPlan.explanation,
373
+ timestamp: Date.now(),
374
+ bug,
375
+ app,
376
+ fixPlan: currentFixPlan,
377
+ filesModified: result.filesModified || [],
378
+ commitHash: result.commitHash
379
+ });
380
+ logger.info('Stored pending fix awaiting approval', { bugId: bug.id, discussionId: bug.discussionId });
381
+ // Start watching this discussion for approval messages
382
+ this.monitor.watchDiscussion(bug.discussionId);
383
+ }
384
+ result.success = true;
385
+ result.summary = `Fixed: ${currentFixPlan.explanation} (awaiting approval)`;
386
+ // Ask owner to test with clear magic words
387
+ await this.reportProgress(bug, `✅ **Bug Fixed!**
388
+
389
+ ${currentFixPlan.explanation}
390
+
391
+ **Files changed:** ${result.filesModified?.join(', ') || 'none'}
392
+
393
+ ---
394
+
395
+ 🧪 **Please test the fix locally**, then reply with:
396
+ - **\`approved\`** - to publish to production
397
+ - **\`denied\`** - if the fix doesn't work (I'll ask what's wrong)`);
398
+ return result;
399
+ }
400
+ catch (error) {
401
+ result.summary = `Error: ${error instanceof Error ? error.message : String(error)}`;
402
+ result.log?.push(`Exception: ${result.summary}`);
403
+ logger.error('Bug Fixer failed', { bugId: bug.id, error });
404
+ await this.reportProgress(bug, `❌ Bug Fixer encountered an error: ${result.summary}`);
405
+ return result;
406
+ }
407
+ }
408
+ /**
409
+ * Publish an approved fix to production
410
+ * Called by the approval callback when LLM triggers publish via tool
411
+ */
412
+ async publishApprovedFix(discussionId, pending) {
413
+ logger.info('Publishing approved fix', { discussionId, bugId: pending.bugId });
414
+ await this.sendDiscussionMessage(discussionId, `🚀 Publishing to production...`);
415
+ const publishResult = await this.publishApp(pending.app, pending.bug);
416
+ if (publishResult.success) {
417
+ // Move to Fixed phase (published successfully)
418
+ await this.monitor.moveBugToPhase(pending.bugId, 'fixed');
419
+ // Remove from pending and stop watching
420
+ pending_fix_1.pendingFixRegistry.unregister(discussionId);
421
+ this.monitor.unwatchDiscussion(discussionId);
422
+ // Log to Session Log - fix published
423
+ await this.createSessionLogEntry(`Bug Fixer: Published fix for ${pending.bug.name}`, [
424
+ `**Bug Report:** ${pending.bug.name}`,
425
+ `**App:** ${pending.app.name}`,
426
+ `**Version:** ${publishResult.version || 'latest'}`,
427
+ `**Files changed:** ${pending.filesModified.join(', ') || 'none'}`,
428
+ '',
429
+ `**Fix summary:** ${pending.fixPlan.explanation}`,
430
+ '',
431
+ `Fix has been tested, approved, and published to production.`
432
+ ].join('\n'), pending.bugId, {
433
+ headline: `Fixed bug in ${pending.app.name}: ${pending.bug.name.substring(0, 40)}`,
434
+ topics: 'bug, fix, publish, app',
435
+ outcome: 'resolved'
436
+ });
437
+ await this.sendDiscussionMessage(discussionId, `✅ **Published to production!** v${publishResult.version || 'latest'}\n\nBug marked as Fixed. Thank you for testing!`);
438
+ logger.info('Fix published', { bugId: pending.bugId, version: publishResult.version });
439
+ return { success: true, version: publishResult.version };
440
+ }
441
+ else {
442
+ await this.sendDiscussionMessage(discussionId, `❌ Publish failed: ${publishResult.error}\n\nPlease try publishing manually or contact support.`);
443
+ return { success: false, error: publishResult.error };
444
+ }
445
+ }
446
+ /**
447
+ * Handle explanation after denial - retry the fix
448
+ */
449
+ async handleExplanationAndRetry(discussionId, pending, explanation) {
450
+ logger.info('Received explanation, retrying fix', {
451
+ discussionId,
452
+ bugId: pending.bugId,
453
+ explanation: explanation.substring(0, 100)
454
+ });
455
+ await this.sendDiscussionMessage(discussionId, `🔄 Got it. Analyzing your feedback and generating a new fix...`);
456
+ // Revert previous changes first
457
+ if (pending.filesModified.length > 0) {
458
+ await this.git.revertChanges(pending.app, pending.filesModified);
459
+ await this.sendDiscussionMessage(discussionId, `↩️ Reverted previous changes`);
460
+ }
461
+ // Get file list from git (fast, accurate)
462
+ let allSourceFiles = await this.git.getSourceFilesFromGit(pending.app.projectPath);
463
+ if (allSourceFiles.length === 0) {
464
+ // Fallback to directory scan if git fails
465
+ allSourceFiles = await this.files.scanSourceFiles(pending.app.projectPath);
466
+ }
467
+ // Search for relevant files based on feedback keywords
468
+ const relevantFiles = await this.files.findRelevantFiles(pending.app.projectPath, explanation, pending.bug);
469
+ // Always include files from previous fix
470
+ const previousFixFiles = pending.fixPlan.fix.files.map(f => f.path);
471
+ // Combine all relevant files (deduplicated)
472
+ const filesToRead = [...new Set([
473
+ ...previousFixFiles,
474
+ ...relevantFiles,
475
+ 'src/App.tsx' // Always include main app file
476
+ ])].filter(f => allSourceFiles.includes(f));
477
+ const currentFiles = await this.files.readSelectedFiles(pending.app.projectPath, filesToRead);
478
+ // Generate new fix based on feedback
479
+ const retryFix = await this.ai.retryFixWithFeedback(pending.bug, pending.fixPlan, explanation, allSourceFiles, currentFiles);
480
+ if (!retryFix) {
481
+ await this.sendDiscussionMessage(discussionId, `❌ Could not generate a new fix based on your feedback. Please provide more details or contact support.`);
482
+ // Reset state to allow another try
483
+ pending_fix_1.pendingFixRegistry.updateState(discussionId, 'awaiting_explanation');
484
+ return { approved: false, published: false, error: 'Could not generate retry fix' };
485
+ }
486
+ // Apply the new fix
487
+ const applyResult = await this.files.applyFixes(pending.app, retryFix.fix.files);
488
+ if (!applyResult.success) {
489
+ await this.sendDiscussionMessage(discussionId, `❌ Failed to apply new fix: ${applyResult.error}\n\nPlease provide more details about the issue.`);
490
+ pending_fix_1.pendingFixRegistry.updateState(discussionId, 'awaiting_explanation');
491
+ return { approved: false, published: false, error: applyResult.error };
492
+ }
493
+ // Build and test
494
+ const buildResult = await this.buildAndTest(pending.app);
495
+ if (!buildResult.success) {
496
+ await this.sendDiscussionMessage(discussionId, `❌ Build failed:\n\`\`\`\n${buildResult.error}\n\`\`\`\n\nI'll need to try a different approach. What exactly is broken?`);
497
+ // Revert and ask again
498
+ await this.git.revertChanges(pending.app, applyResult.files);
499
+ pending_fix_1.pendingFixRegistry.updateState(discussionId, 'awaiting_explanation');
500
+ return { approved: false, published: false, error: buildResult.error };
501
+ }
502
+ // Success! Update pending fix and ask for approval again
503
+ pending.fixPlan = retryFix;
504
+ pending.filesModified = applyResult.files;
505
+ pending_fix_1.pendingFixRegistry.updateState(discussionId, 'awaiting_test');
506
+ await this.sendDiscussionMessage(discussionId, `✅ **New fix applied!**
507
+
508
+ ${retryFix.explanation}
509
+
510
+ **Files changed:** ${applyResult.files.join(', ')}
511
+
512
+ ---
513
+
514
+ 🧪 **Please test again**, then reply with:
515
+ - **\`approved\`** - to publish to production
516
+ - **\`denied\`** - if still not working`);
517
+ return { approved: false, published: false, retrying: true };
518
+ }
519
+ /**
520
+ * Check if there's a pending fix for a discussion
521
+ */
522
+ hasPendingFix(discussionId) {
523
+ return pending_fix_1.pendingFixRegistry.has(discussionId);
524
+ }
525
+ /**
526
+ * Retry a pending fix with explanation from HAL
527
+ * Called by HAL after gathering info through conversation
528
+ */
529
+ async retryWithExplanation(discussionId, explanation) {
530
+ const pending = pending_fix_1.pendingFixRegistry.get(discussionId);
531
+ if (!pending) {
532
+ logger.warn('No pending fix found for retry', { discussionId });
533
+ return false;
534
+ }
535
+ logger.info('HAL triggered retry with explanation', {
536
+ discussionId,
537
+ bugId: pending.bugId,
538
+ explanationLength: explanation.length
539
+ });
540
+ // Update registry state
541
+ pending_fix_1.pendingFixRegistry.updateState(discussionId, 'awaiting_explanation');
542
+ // Trigger the retry
543
+ const result = await this.handleExplanationAndRetry(discussionId, pending, explanation);
544
+ // Update registry state based on result
545
+ if (result.retrying) {
546
+ pending_fix_1.pendingFixRegistry.updateState(discussionId, 'awaiting_test');
547
+ }
548
+ return result.retrying || false;
549
+ }
550
+ /**
551
+ * Helper to send a message to a discussion
552
+ */
553
+ async sendDiscussionMessage(discussionId, message) {
554
+ try {
555
+ const { hailer } = this.userContext;
556
+ await hailer.sendDiscussionMessage(discussionId, message);
557
+ }
558
+ catch (error) {
559
+ logger.warn('Failed to send discussion message', { discussionId, error });
560
+ }
561
+ }
562
+ /**
563
+ * Build and test the app
564
+ */
565
+ async buildAndTest(app) {
566
+ return new Promise((resolve) => {
567
+ const child = (0, child_process_1.spawn)('npm', ['run', 'build'], {
568
+ cwd: app.projectPath,
569
+ shell: true
570
+ });
571
+ let stdout = '';
572
+ let stderr = '';
573
+ child.stdout.on('data', (data) => {
574
+ stdout += data.toString();
575
+ });
576
+ child.stderr.on('data', (data) => {
577
+ stderr += data.toString();
578
+ });
579
+ child.on('close', (code) => {
580
+ if (code === 0) {
581
+ resolve({ success: true });
582
+ }
583
+ else {
584
+ // TypeScript errors often go to stdout, combine both
585
+ const allOutput = stdout + '\n' + stderr;
586
+ // Extract just the error lines (look for .tsx/.ts errors)
587
+ const errorLines = allOutput.split('\n')
588
+ .filter(line => line.includes('error TS') || line.includes('Error:') || line.includes('error:'))
589
+ .slice(0, 10)
590
+ .join('\n');
591
+ resolve({ success: false, error: errorLines || allOutput.slice(-1000) });
592
+ }
593
+ });
594
+ child.on('error', (error) => {
595
+ resolve({ success: false, error: error.message });
596
+ });
597
+ // Timeout after 2 minutes
598
+ setTimeout(() => {
599
+ child.kill();
600
+ resolve({ success: false, error: 'Build timeout' });
601
+ }, 120000);
602
+ });
603
+ }
604
+ /**
605
+ * Join a bug's discussion using the activity ID (not discussion ID)
606
+ * For activity discussions, we must use joinActivityDiscussion
607
+ */
608
+ async joinBugDiscussion(activityId) {
609
+ try {
610
+ const { hailer } = this.userContext;
611
+ await hailer.joinActivityDiscussion(activityId);
612
+ logger.info('Joined bug discussion', { activityId });
613
+ }
614
+ catch (error) {
615
+ // Might already be a member, that's OK
616
+ logger.debug('Could not join bug discussion (may already be member)', { activityId, error });
617
+ }
618
+ }
619
+ /**
620
+ * Publish app to production using expect script (same as MCP tool)
621
+ */
622
+ async publishApp(app, bug) {
623
+ try {
624
+ // Bump patch version before publishing (bug fix = patch)
625
+ const versionBump = await this.git.bumpPatchVersion(app.projectPath);
626
+ const version = versionBump?.newVersion || '1.0.0';
627
+ if (versionBump) {
628
+ logger.info('Version bumped for bug fix', {
629
+ oldVersion: versionBump.oldVersion,
630
+ newVersion: versionBump.newVersion,
631
+ bugId: bug.id
632
+ });
633
+ // Stage and commit the version bump
634
+ await this.git.commitVersionBump(app.projectPath, version);
635
+ }
636
+ logger.info('Publishing app via MCP tool', {
637
+ projectPath: app.projectPath,
638
+ version
639
+ });
640
+ // Use the MCP publish_hailer_app tool directly
641
+ const result = await app_scaffold_1.publishHailerAppTool.execute({
642
+ projectDirectory: app.projectPath,
643
+ publishToMarket: false
644
+ }, this.userContext);
645
+ // Parse the result
646
+ const text = result.content?.[0]?.type === 'text' ? result.content[0].text : '';
647
+ if (text.includes('✅') || text.includes('Successfully') || text.includes('Published')) {
648
+ logger.info('App published successfully', { version });
649
+ // Push to git after successful publish
650
+ await this.git.push(app.projectPath);
651
+ // Create and push version tag (persists version history across code resets)
652
+ this.git.createVersionTag(app.projectPath, version);
653
+ return { success: true, version };
654
+ }
655
+ else {
656
+ // Extract error message from response
657
+ const errorMatch = text.match(/❌.*?(?:\n|$)/)?.[0] || text.substring(0, 200);
658
+ logger.error('Publish failed', { error: errorMatch });
659
+ return { success: false, error: errorMatch };
660
+ }
661
+ }
662
+ catch (error) {
663
+ const errorMessage = error instanceof Error ? error.message : String(error);
664
+ logger.error('Publish exception', { error: errorMessage });
665
+ return {
666
+ success: false,
667
+ error: errorMessage
668
+ };
669
+ }
670
+ }
671
+ /**
672
+ * Report progress to bug discussion
673
+ */
674
+ async reportProgress(bug, message) {
675
+ if (!bug.discussionId)
676
+ return;
677
+ try {
678
+ const { hailer } = this.userContext;
679
+ await hailer.sendDiscussionMessage(bug.discussionId, message);
680
+ }
681
+ catch (error) {
682
+ logger.warn('Failed to report progress', { bugId: bug.id, error });
683
+ }
684
+ }
685
+ }
686
+ exports.BugFixerBot = BugFixerBot;
687
+ //# sourceMappingURL=bot.js.map