@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,198 @@
1
+ "use strict";
2
+ /**
3
+ * Token Billing Service
4
+ *
5
+ * Handles real-time token burning per workspace with balance checks at session start.
6
+ *
7
+ * Workspace Isolation:
8
+ * - Each workspace has its own token balance (managed by Hailer backend)
9
+ * - Balance check and burn calls include workspaceId for correct routing
10
+ *
11
+ * Behavior:
12
+ * - Check balance when new session starts -> reject if negative for that workspace
13
+ * - Burn tokens after each LLM API call -> real-time, charges correct workspace
14
+ * - Allow balance to go negative during active session -> don't interrupt
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.TokenBillingService = void 0;
18
+ // ================================================================================
19
+ // PRICING CONSTANTS
20
+ // ================================================================================
21
+ // Claude Haiku 4.5 pricing (Oct 2025)
22
+ // https://www.anthropic.com/claude/haiku
23
+ const HAIKU_PRICING = {
24
+ inputPerMillion: 1.00, // $1.00 per 1M input tokens
25
+ outputPerMillion: 5.00, // $5.00 per 1M output tokens
26
+ cacheWritePerMillion: 1.25, // $1.25 per 1M cache write tokens (1.25x input)
27
+ cacheReadPerMillion: 0.10, // $0.10 per 1M cache read tokens (0.1x input)
28
+ };
29
+ // Output-normalized weights (for backend compatibility)
30
+ // Backend expects output-equivalent tokens, not input-equivalent
31
+ const OUTPUT_WEIGHTS = {
32
+ input: HAIKU_PRICING.inputPerMillion / HAIKU_PRICING.outputPerMillion, // 0.20
33
+ output: 1.0, // 1.00
34
+ cacheWrite: HAIKU_PRICING.cacheWritePerMillion / HAIKU_PRICING.outputPerMillion, // 0.25
35
+ cacheRead: HAIKU_PRICING.cacheReadPerMillion / HAIKU_PRICING.outputPerMillion, // 0.02
36
+ };
37
+ // ================================================================================
38
+ // SERVICE
39
+ // ================================================================================
40
+ class TokenBillingService {
41
+ logger;
42
+ hailerClient = null;
43
+ balanceCache = new Map();
44
+ static CACHE_TTL_MS = 60_000; // 60 seconds
45
+ constructor(logger, hailerClient) {
46
+ this.logger = logger;
47
+ this.hailerClient = hailerClient || null;
48
+ }
49
+ /**
50
+ * Invalidate cached balance for a workspace
51
+ * Call this after write operations that cost tokens
52
+ */
53
+ invalidateCache(workspaceId) {
54
+ this.balanceCache.delete(workspaceId);
55
+ this.logger.debug("Balance cache invalidated", { workspaceId });
56
+ }
57
+ /**
58
+ * Check workspace balance before starting a new session
59
+ * Returns balance info - caller decides whether to reject
60
+ *
61
+ * Error handling: On network failure, returns a default "OK" response
62
+ * to allow graceful degradation (don't block users due to billing errors)
63
+ */
64
+ async checkBalance(workspaceId) {
65
+ if (!this.hailerClient) {
66
+ this.logger.warn("Balance check skipped - no Hailer client");
67
+ // Allow processing when we can't check balance (graceful degradation)
68
+ return { workspaceId, balance: 999, isNegative: false, hasBalance: true };
69
+ }
70
+ // Check cache first
71
+ const cached = this.balanceCache.get(workspaceId);
72
+ if (cached && Date.now() - cached.timestamp < TokenBillingService.CACHE_TTL_MS) {
73
+ const balance = cached.balance;
74
+ const cacheAge = Math.round((Date.now() - cached.timestamp) / 1000);
75
+ // Determine status
76
+ let status;
77
+ if (balance < 0) {
78
+ status = '❌ NEGATIVE - SHOULD NOT RESPOND';
79
+ }
80
+ else if (balance === 0) {
81
+ status = '❌ EMPTY - SHOULD NOT RESPOND';
82
+ }
83
+ else if (balance < 5) {
84
+ status = '⚠️ LOW';
85
+ }
86
+ else {
87
+ status = '✅ OK';
88
+ }
89
+ this.logger.debug(`💰 BALANCE CHECK (CACHED) | ${workspaceId} | ${balance} tokens | ${status}`);
90
+ return {
91
+ workspaceId,
92
+ balance,
93
+ isNegative: balance < 0,
94
+ hasBalance: balance > 0,
95
+ };
96
+ }
97
+ // Cache miss or stale - fetch from backend
98
+ try {
99
+ const result = await this.hailerClient.request('v3.mcp.getTokenBalance', [workspaceId]);
100
+ const balance = typeof result?.balance === "number" ? result.balance :
101
+ typeof result === "number" ? result : 0;
102
+ const lastUpdated = result?.lastUpdated ? new Date(result.lastUpdated).toISOString() : 'N/A';
103
+ // Cache the result
104
+ this.balanceCache.set(workspaceId, { balance, timestamp: Date.now() });
105
+ // Determine status
106
+ let status;
107
+ if (balance < 0) {
108
+ status = '❌ NEGATIVE - SHOULD NOT RESPOND';
109
+ }
110
+ else if (balance === 0) {
111
+ status = '❌ EMPTY - SHOULD NOT RESPOND';
112
+ }
113
+ else if (balance < 5) {
114
+ status = '⚠️ LOW';
115
+ }
116
+ else {
117
+ status = '✅ OK';
118
+ }
119
+ this.logger.debug(`💰 BALANCE CHECK | ${workspaceId} | ${balance} tokens | ${status}`);
120
+ return {
121
+ workspaceId,
122
+ balance,
123
+ isNegative: balance < 0,
124
+ hasBalance: balance > 0,
125
+ };
126
+ }
127
+ catch (error) {
128
+ this.logger.warn(`❌ BALANCE CHECK FAILED | ${workspaceId} | ${error instanceof Error ? error.message : String(error)}`);
129
+ return { workspaceId, balance: 0, isNegative: false, hasBalance: false };
130
+ }
131
+ }
132
+ /**
133
+ * Burn tokens after LLM API call - fire and forget
134
+ * Does not block the response pipeline
135
+ *
136
+ * Error handling: Logs errors but does not throw
137
+ */
138
+ async burnTokens(payload) {
139
+ // Fire and forget - don't await in caller
140
+ this.burnTokensInternal(payload).catch((error) => {
141
+ this.logger.error("Token burn failed", {
142
+ workspaceId: payload.workspaceId,
143
+ error: error instanceof Error ? error.message : String(error),
144
+ });
145
+ });
146
+ }
147
+ /**
148
+ * Internal burn implementation with proper error handling
149
+ */
150
+ async burnTokensInternal(payload) {
151
+ if (!this.hailerClient) {
152
+ this.logger.warn("Token burn skipped - no Hailer client");
153
+ return;
154
+ }
155
+ // Calculate output-normalized tokens (what backend expects)
156
+ const normalizedTokens = Math.round(payload.inputTokens * OUTPUT_WEIGHTS.input +
157
+ payload.outputTokens * OUTPUT_WEIGHTS.output +
158
+ payload.cacheCreationTokens * OUTPUT_WEIGHTS.cacheWrite +
159
+ payload.cacheReadTokens * OUTPUT_WEIGHTS.cacheRead);
160
+ try {
161
+ const result = await this.hailerClient.request('v3.mcp.deductTokens', [{
162
+ mcpToken: 'hL9xK2mNpQrS4tVwY6zA8bCD',
163
+ workspaceId: payload.workspaceId,
164
+ tokenAmount: normalizedTokens,
165
+ model: 'claude-haiku',
166
+ meta: {
167
+ operation: 'chat'
168
+ }
169
+ }]);
170
+ // Cache the new balance from response
171
+ if (result?.newBalance !== undefined) {
172
+ this.balanceCache.set(payload.workspaceId, {
173
+ balance: result.newBalance,
174
+ timestamp: Date.now()
175
+ });
176
+ }
177
+ this.logger.debug(`🔥 TOKEN DEDUCTION | ${payload.workspaceId} | ${normalizedTokens} tokens | $${payload.costUsd.toFixed(6)} | balance: ${result?.newBalance ?? 'N/A'}`);
178
+ }
179
+ catch (error) {
180
+ this.logger.warn(`❌ TOKEN DEDUCTION FAILED | ${payload.workspaceId} | ${normalizedTokens} tokens | ${error instanceof Error ? error.message : String(error)}`);
181
+ }
182
+ }
183
+ /**
184
+ * Calculate cost in USD based on token counts
185
+ * Uses Claude Haiku 4.5 pricing
186
+ */
187
+ calculateCost(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens) {
188
+ const inputCost = (inputTokens / 1_000_000) * HAIKU_PRICING.inputPerMillion;
189
+ const outputCost = (outputTokens / 1_000_000) * HAIKU_PRICING.outputPerMillion;
190
+ const cacheWriteCost = (cacheCreationTokens / 1_000_000) * HAIKU_PRICING.cacheWritePerMillion;
191
+ const cacheReadCost = (cacheReadTokens / 1_000_000) * HAIKU_PRICING.cacheReadPerMillion;
192
+ const totalCost = inputCost + outputCost + cacheWriteCost + cacheReadCost;
193
+ // Round to 8 decimal places to avoid floating point issues
194
+ return Math.round(totalCost * 100_000_000) / 100_000_000;
195
+ }
196
+ }
197
+ exports.TokenBillingService = TokenBillingService;
198
+ //# sourceMappingURL=token-billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-billing.js","sourceRoot":"","sources":["../../../../src/agents/shared/services/token-billing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Tool Executor Service
3
+ *
4
+ * Handles MCP tool execution:
5
+ * - Executes tool calls from LLM
6
+ * - Tracks write operations
7
+ * - Extracts write details for logging
8
+ */
9
+ import Anthropic from "@anthropic-ai/sdk";
10
+ import { Logger } from "../../../lib/logger";
11
+ import { McpClientService } from "./mcp-client";
12
+ import { TokenBillingService } from "./token-billing";
13
+ import { WriteDetail, ActivitySession, ToolInput, McpToolResult } from "../../shared/types";
14
+ export interface ToolExecutionResult {
15
+ type: "tool_result";
16
+ tool_use_id: string;
17
+ content: string;
18
+ is_error?: boolean;
19
+ }
20
+ export interface ToolExecutionContext {
21
+ session?: ActivitySession;
22
+ preprocessToolInput?: (toolName: string, input: ToolInput) => ToolInput;
23
+ }
24
+ export declare class ToolExecutor {
25
+ private mcpClient;
26
+ private logger;
27
+ private tokenBilling?;
28
+ private static WRITE_TOOLS;
29
+ constructor(mcpClient: McpClientService, logger: Logger, tokenBilling?: TokenBillingService | undefined);
30
+ /**
31
+ * Check if a tool is a write operation
32
+ */
33
+ isWriteTool(toolName: string): boolean;
34
+ /**
35
+ * Execute a list of tool calls and return results
36
+ */
37
+ executeTools(toolUseBlocks: Anthropic.ToolUseBlock[], context?: ToolExecutionContext): Promise<ToolExecutionResult[]>;
38
+ /**
39
+ * Extract details about a write operation for logging
40
+ */
41
+ extractWriteDetail(toolName: string, input: ToolInput, result: McpToolResult): WriteDetail | null;
42
+ }
43
+ //# sourceMappingURL=tool-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../../../src/agents/shared/services/tool-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE5F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,SAAS,CAAC;CACzE;AAED,qBAAa,YAAY;IAsBrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY,CAAC;IAtBvB,OAAO,CAAC,MAAM,CAAC,WAAW,CAiBvB;gBAGO,SAAS,EAAE,gBAAgB,EAC3B,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,mBAAmB,YAAA;IAG5C;;OAEG;IACI,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACU,YAAY,CACvB,aAAa,EAAE,SAAS,CAAC,YAAY,EAAE,EACvC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAkEjC;;OAEG;IACI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,IAAI;CAmEzG"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ /**
3
+ * Tool Executor Service
4
+ *
5
+ * Handles MCP tool execution:
6
+ * - Executes tool calls from LLM
7
+ * - Tracks write operations
8
+ * - Extracts write details for logging
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ToolExecutor = void 0;
12
+ class ToolExecutor {
13
+ mcpClient;
14
+ logger;
15
+ tokenBilling;
16
+ // Tools that modify data in Hailer (vs read-only tools)
17
+ static WRITE_TOOLS = new Set([
18
+ "create_activity",
19
+ "update_activity",
20
+ "add_discussion_message",
21
+ "invite_discussion_members",
22
+ "join_discussion",
23
+ "create_insight",
24
+ "update_insight",
25
+ "remove_insight",
26
+ "create_app",
27
+ "update_app",
28
+ "remove_app",
29
+ "install_workflow",
30
+ "remove_workflow",
31
+ "update_workflow_field",
32
+ "update_workflow_phase",
33
+ "upload_files",
34
+ ]);
35
+ constructor(mcpClient, logger, tokenBilling) {
36
+ this.mcpClient = mcpClient;
37
+ this.logger = logger;
38
+ this.tokenBilling = tokenBilling;
39
+ }
40
+ /**
41
+ * Check if a tool is a write operation
42
+ */
43
+ isWriteTool(toolName) {
44
+ return ToolExecutor.WRITE_TOOLS.has(toolName);
45
+ }
46
+ /**
47
+ * Execute a list of tool calls and return results
48
+ */
49
+ async executeTools(toolUseBlocks, context = {}) {
50
+ const { session, preprocessToolInput } = context;
51
+ const toolResults = [];
52
+ for (const toolUse of toolUseBlocks) {
53
+ this.logger.info("Executing tool", { tool: toolUse.name });
54
+ // Track tool call in session
55
+ if (session) {
56
+ session.metrics.toolCalls++;
57
+ session.actions.push(`Tool: ${toolUse.name}`);
58
+ session.lastActivityTime = Date.now();
59
+ }
60
+ try {
61
+ // Load full schema if needed (uses service's cache)
62
+ await this.mcpClient.loadToolSchemaIfNeeded(toolUse.name);
63
+ // Allow preprocessing of tool input (cast from Anthropic's unknown type)
64
+ const rawInput = toolUse.input;
65
+ const toolInput = preprocessToolInput
66
+ ? preprocessToolInput(toolUse.name, rawInput)
67
+ : rawInput;
68
+ const result = await this.mcpClient.callMcpTool(toolUse.name, toolInput);
69
+ const resultContent = JSON.stringify(result?.content || {});
70
+ // Track write operations for session logging
71
+ if (session && this.isWriteTool(toolUse.name)) {
72
+ session.metrics.writeOperations++;
73
+ const writeDetail = this.extractWriteDetail(toolUse.name, toolInput, result);
74
+ if (writeDetail) {
75
+ session.writeDetails.push(writeDetail);
76
+ }
77
+ // Invalidate balance cache after write ops (they cost tokens)
78
+ if (this.tokenBilling && session.workspaceId) {
79
+ this.tokenBilling.invalidateCache(session.workspaceId);
80
+ }
81
+ }
82
+ toolResults.push({
83
+ type: "tool_result",
84
+ tool_use_id: toolUse.id,
85
+ content: resultContent,
86
+ });
87
+ }
88
+ catch (error) {
89
+ const errorMessage = error instanceof Error ? error.message : String(error);
90
+ this.logger.warn("Tool execution failed", {
91
+ tool: toolUse.name,
92
+ error: errorMessage,
93
+ });
94
+ toolResults.push({
95
+ type: "tool_result",
96
+ tool_use_id: toolUse.id,
97
+ content: `Error: ${errorMessage}`,
98
+ is_error: true,
99
+ });
100
+ }
101
+ }
102
+ return toolResults;
103
+ }
104
+ /**
105
+ * Extract details about a write operation for logging
106
+ */
107
+ extractWriteDetail(toolName, input, result) {
108
+ try {
109
+ const resultText = result?.content?.[0]?.text || "";
110
+ // Extract activity ID from result if present
111
+ const idMatch = resultText.match(/"_id":\s*"([a-f0-9]{24})"/i) ||
112
+ resultText.match(/`([a-f0-9]{24})`/);
113
+ const targetId = idMatch?.[1] || input.activityId || input.discussionId;
114
+ switch (toolName) {
115
+ case "create_activity":
116
+ return {
117
+ tool: toolName,
118
+ what: `Created activity "${input.name || 'unnamed'}"`,
119
+ targetId,
120
+ };
121
+ case "update_activity": {
122
+ const fieldCount = input.fields ? Object.keys(input.fields).length : 0;
123
+ return {
124
+ tool: toolName,
125
+ what: `Updated ${fieldCount} field(s)${input.name ? ` on "${input.name}"` : ''}`,
126
+ targetId: input.activityId,
127
+ };
128
+ }
129
+ case "add_discussion_message": {
130
+ const msgPreview = input.content?.substring(0, 50) || "";
131
+ return {
132
+ tool: toolName,
133
+ what: `Posted message: "${msgPreview}${msgPreview.length >= 50 ? '...' : ''}"`,
134
+ targetId: input.discussionId,
135
+ };
136
+ }
137
+ case "invite_discussion_members":
138
+ return {
139
+ tool: toolName,
140
+ what: `Invited ${input.userIds?.length || 0} member(s) to discussion`,
141
+ targetId: input.discussionId,
142
+ };
143
+ case "join_discussion":
144
+ return {
145
+ tool: toolName,
146
+ what: input.inviteUserId ? "Invited user to discussion" : "Joined discussion",
147
+ targetId: input.activityId || input.discussionId,
148
+ };
149
+ case "create_insight":
150
+ return {
151
+ tool: toolName,
152
+ what: `Created insight "${input.name || 'unnamed'}"`,
153
+ targetId,
154
+ };
155
+ case "update_insight":
156
+ return {
157
+ tool: toolName,
158
+ what: `Updated insight`,
159
+ targetId: input.insightId,
160
+ };
161
+ default:
162
+ return {
163
+ tool: toolName,
164
+ what: `Executed ${toolName}`,
165
+ targetId,
166
+ };
167
+ }
168
+ }
169
+ catch {
170
+ return null;
171
+ }
172
+ }
173
+ }
174
+ exports.ToolExecutor = ToolExecutor;
175
+ //# sourceMappingURL=tool-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../../../src/agents/shared/services/tool-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Typing Indicator Service
3
+ * Manages typing indicator state with auto-refresh for Hailer discussions
4
+ */
5
+ import { BotClient } from "../../bot-manager";
6
+ import { Logger } from "../../../lib/logger";
7
+ export declare class TypingIndicatorService {
8
+ private botClient;
9
+ private logger;
10
+ private static TYPING_REFRESH_MS;
11
+ private typingInterval;
12
+ private typingDiscussionId;
13
+ constructor(botClient: BotClient, logger: Logger);
14
+ /**
15
+ * Start typing indicator with auto-refresh interval
16
+ */
17
+ start(discussionId: string): void;
18
+ /**
19
+ * Stop typing indicator and clear refresh interval
20
+ */
21
+ stop(): void;
22
+ private sendSignal;
23
+ }
24
+ //# sourceMappingURL=typing-indicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator.d.ts","sourceRoot":"","sources":["../../../../src/agents/shared/services/typing-indicator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,qBAAa,sBAAsB;IAM/B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAQ;IACxC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,kBAAkB,CAAuB;gBAGvC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM;IAGxB;;OAEG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAYjC;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ,OAAO,CAAC,UAAU;CAQnB"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Typing Indicator Service
4
+ * Manages typing indicator state with auto-refresh for Hailer discussions
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TypingIndicatorService = void 0;
8
+ class TypingIndicatorService {
9
+ botClient;
10
+ logger;
11
+ static TYPING_REFRESH_MS = 3000;
12
+ typingInterval = null;
13
+ typingDiscussionId = null;
14
+ constructor(botClient, logger) {
15
+ this.botClient = botClient;
16
+ this.logger = logger;
17
+ }
18
+ /**
19
+ * Start typing indicator with auto-refresh interval
20
+ */
21
+ start(discussionId) {
22
+ this.stop();
23
+ this.typingDiscussionId = discussionId;
24
+ this.sendSignal(discussionId, true);
25
+ this.typingInterval = setInterval(() => {
26
+ if (this.typingDiscussionId) {
27
+ this.sendSignal(this.typingDiscussionId, true);
28
+ }
29
+ }, TypingIndicatorService.TYPING_REFRESH_MS);
30
+ }
31
+ /**
32
+ * Stop typing indicator and clear refresh interval
33
+ */
34
+ stop() {
35
+ if (this.typingInterval) {
36
+ clearInterval(this.typingInterval);
37
+ this.typingInterval = null;
38
+ }
39
+ if (this.typingDiscussionId) {
40
+ this.sendSignal(this.typingDiscussionId, false);
41
+ this.typingDiscussionId = null;
42
+ }
43
+ }
44
+ sendSignal(discussionId, isTyping) {
45
+ this.botClient.client.socket.request("messenger.set_discussion_typing_state", [
46
+ discussionId,
47
+ isTyping
48
+ ]).catch((error) => {
49
+ this.logger.debug("Typing indicator failed", { discussionId, isTyping, error: error?.message });
50
+ });
51
+ }
52
+ }
53
+ exports.TypingIndicatorService = TypingIndicatorService;
54
+ //# sourceMappingURL=typing-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator.js","sourceRoot":"","sources":["../../../../src/agents/shared/services/typing-indicator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH,MAAa,sBAAsB;IAMvB;IACA;IANF,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,cAAc,GAA0B,IAAI,CAAC;IAC7C,kBAAkB,GAAkB,IAAI,CAAC;IAEjD,YACU,SAAoB,EACpB,MAAc;QADd,cAAS,GAAT,SAAS,CAAW;QACpB,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,YAAoB;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAEpC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,YAAoB,EAAE,QAAiB;QACxD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,uCAAuC,EAAE;YAC5E,YAAY;YACZ,QAAQ;SACT,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;IACL,CAAC;;AA9CH,wDA+CC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Workspace Schema Cache Service
3
+ *
4
+ * Dynamically discovers and caches workflow schemas per workspace.
5
+ * Replaces hardcoded workflow/field IDs with runtime lookup.
6
+ *
7
+ * WORKSPACE ISOLATION: Each workspace gets its own workflow IDs.
8
+ * Never use hardcoded IDs - always lookup via this cache.
9
+ *
10
+ * On bot startup:
11
+ * 1. Check memory cache first
12
+ * 2. If cache miss: Query list_workflows to find AI Agent workflows by name
13
+ * 3. If missing, install them from marketplace
14
+ * 4. Query get_workflow_schema to get field IDs
15
+ * 5. Store in memory cache for session duration
16
+ */
17
+ import { Logger } from "../../../lib/logger";
18
+ import { McpToolCallback } from "../../shared/types";
19
+ /** Cached workflow schema */
20
+ export interface WorkflowSchema {
21
+ workflowId: string;
22
+ name: string;
23
+ phases: Record<string, string>;
24
+ fields: Record<string, string>;
25
+ }
26
+ /** Per-workspace cache */
27
+ export interface WorkspaceSchemas {
28
+ workspaceId: string;
29
+ sessionLog?: WorkflowSchema;
30
+ agentDirectory?: WorkflowSchema;
31
+ positions?: WorkflowSchema;
32
+ teams?: WorkflowSchema;
33
+ toolRegistry?: WorkflowSchema;
34
+ mcpConfig?: WorkflowSchema;
35
+ initialized: boolean;
36
+ }
37
+ export declare class WorkspaceSchemaCacheService {
38
+ private logger;
39
+ private callMcpTool;
40
+ private cache;
41
+ constructor(logger: Logger, callMcpTool: McpToolCallback);
42
+ /**
43
+ * Initialize schema cache for a workspace
44
+ * Call this on bot startup after connecting to Hailer
45
+ *
46
+ * Set SKIP_SCHEMA_DISCOVERY=true to skip API calls on startup.
47
+ * HAL can discover workflows on-demand via MCP tools when needed.
48
+ */
49
+ initializeForWorkspace(workspaceId: string): Promise<WorkspaceSchemas>;
50
+ /**
51
+ * Get cached schemas for a workspace
52
+ */
53
+ getSchemas(workspaceId: string): WorkspaceSchemas | undefined;
54
+ /**
55
+ * Get Session Log schema for a workspace
56
+ */
57
+ getSessionLogSchema(workspaceId: string): WorkflowSchema | undefined;
58
+ /**
59
+ * Get Agent Directory schema for a workspace
60
+ */
61
+ getAgentDirectorySchema(workspaceId: string): WorkflowSchema | undefined;
62
+ /**
63
+ * Get Positions schema for a workspace
64
+ */
65
+ getPositionsSchema(workspaceId: string): WorkflowSchema | undefined;
66
+ /**
67
+ * Get Teams schema for a workspace
68
+ */
69
+ getTeamsSchema(workspaceId: string): WorkflowSchema | undefined;
70
+ /**
71
+ * Get Tool Registry schema for a workspace
72
+ */
73
+ getToolRegistrySchema(workspaceId: string): WorkflowSchema | undefined;
74
+ /**
75
+ * Get MCP Config schema for a workspace
76
+ */
77
+ getMcpConfigSchema(workspaceId: string): WorkflowSchema | undefined;
78
+ /**
79
+ * Check if a workspace has the AI Agent template installed
80
+ */
81
+ hasAgentTemplate(workspaceId: string): boolean;
82
+ /**
83
+ * Check if workflow name matches a pattern (case insensitive, ignores emojis)
84
+ */
85
+ private matchesPattern;
86
+ /**
87
+ * Map workflow list to schema slots (using pattern matching)
88
+ */
89
+ private mapWorkflowsToSchemas;
90
+ /**
91
+ * Load detailed schemas (phases, fields) for all found workflows
92
+ */
93
+ private loadDetailedSchemas;
94
+ /**
95
+ * Install AI Agent template from marketplace
96
+ */
97
+ private installAgentTemplate;
98
+ /**
99
+ * Parse workflows from list_workflows response
100
+ * Handles both raw JSON and markdown-wrapped JSON responses
101
+ */
102
+ private parseWorkflows;
103
+ /**
104
+ * Load detailed workflow schema (phases and fields) for an existing schema
105
+ */
106
+ private loadWorkflowSchemaDetails;
107
+ /**
108
+ * Parse phases from list_workflow_phases response
109
+ * Format: 1. **PhaseName**\n - Phase ID: `phaseId`
110
+ */
111
+ private parsePhases;
112
+ /**
113
+ * Parse fields from get_workflow_schema response
114
+ * Stores fields by both label and key for flexible lookup
115
+ */
116
+ private parseFields;
117
+ /**
118
+ * Clear cache for a workspace (memory cache only)
119
+ */
120
+ clearCache(workspaceId?: string): void;
121
+ }
122
+ //# sourceMappingURL=workspace-schema-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-schema-cache.d.ts","sourceRoot":"","sources":["../../../../src/agents/shared/services/workspace-schema-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAgBrD,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,0BAA0B;AAC1B,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,2BAA2B;IAIpC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IAJrB,OAAO,CAAC,KAAK,CAA4C;gBAG/C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,eAAe;IAGtC;;;;;;OAMG;IACU,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+FnF;;OAEG;IACI,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIpE;;OAEG;IACI,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3E;;OAEG;IACI,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI/E;;OAEG;IACI,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI1E;;OAEG;IACI,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAItE;;OAEG;IACI,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7E;;OAEG;IACI,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI1E;;OAEG;IACI,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKrD;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA6B7B;;OAEG;YACW,mBAAmB;IASjC;;OAEG;YACW,oBAAoB;IAmElC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAoDtB;;OAEG;YACW,yBAAyB;IAwDvC;;;OAGG;IACH,OAAO,CAAC,WAAW;IAoCnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA0DnB;;OAEG;IACI,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;CAS9C"}