@hailer/mcp 1.2.1 → 2.0.0-beta.3

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 (768) hide show
  1. package/.claude/agents/agent-hailer-helper.md +118 -0
  2. package/.claude/commands/app-squad.md +16 -110
  3. package/.claude/commands/debug-squad.md +13 -290
  4. package/.claude/commands/publish.md +2 -2
  5. package/.claude/commands/review-squad.md +17 -139
  6. package/.claude/skills/create-and-publish-app/SKILL.md +105 -151
  7. package/.claude/skills/hailer-app-builder/SKILL.md +2 -2
  8. package/.claude/skills/hailer-ui-guide/SKILL.md +265 -0
  9. package/.env.example +50 -1
  10. package/CLAUDE.md +138 -10
  11. package/dist/app.d.ts.map +1 -1
  12. package/dist/app.js +3 -0
  13. package/dist/app.js.map +1 -1
  14. package/dist/bot/bot-manager.d.ts +9 -6
  15. package/dist/bot/bot-manager.d.ts.map +1 -1
  16. package/dist/bot/bot-manager.js +142 -31
  17. package/dist/bot/bot-manager.js.map +1 -1
  18. package/dist/bot/bot.d.ts +59 -16
  19. package/dist/bot/bot.d.ts.map +1 -1
  20. package/dist/bot/bot.js +889 -142
  21. package/dist/bot/bot.js.map +1 -1
  22. package/dist/bot/operation-logger.d.ts.map +1 -1
  23. package/dist/bot/operation-logger.js +24 -12
  24. package/dist/bot/operation-logger.js.map +1 -1
  25. package/dist/bot/services/bot-permissions.d.ts +2 -2
  26. package/dist/bot/services/bot-permissions.d.ts.map +1 -1
  27. package/dist/bot/services/bot-permissions.js +28 -9
  28. package/dist/bot/services/bot-permissions.js.map +1 -1
  29. package/dist/bot/services/conversation-manager.d.ts +23 -23
  30. package/dist/bot/services/conversation-manager.d.ts.map +1 -1
  31. package/dist/bot/services/conversation-manager.js +52 -49
  32. package/dist/bot/services/conversation-manager.js.map +1 -1
  33. package/dist/bot/services/helper-prompt.d.ts +8 -0
  34. package/dist/bot/services/helper-prompt.d.ts.map +1 -0
  35. package/dist/bot/services/helper-prompt.js +177 -0
  36. package/dist/bot/services/helper-prompt.js.map +1 -0
  37. package/dist/bot/services/message-classifier.d.ts +16 -16
  38. package/dist/bot/services/message-classifier.d.ts.map +1 -1
  39. package/dist/bot/services/message-classifier.js +55 -49
  40. package/dist/bot/services/message-classifier.js.map +1 -1
  41. package/dist/bot/services/message-formatter.d.ts +38 -38
  42. package/dist/bot/services/message-formatter.d.ts.map +1 -1
  43. package/dist/bot/services/message-formatter.js +81 -74
  44. package/dist/bot/services/message-formatter.js.map +1 -1
  45. package/dist/bot/services/permission-guard.d.ts.map +1 -1
  46. package/dist/bot/services/permission-guard.js +20 -10
  47. package/dist/bot/services/permission-guard.js.map +1 -1
  48. package/dist/bot/services/signal-router.d.ts.map +1 -1
  49. package/dist/bot/services/signal-router.js +11 -6
  50. package/dist/bot/services/signal-router.js.map +1 -1
  51. package/dist/bot/services/system-prompt.d.ts +14 -0
  52. package/dist/bot/services/system-prompt.d.ts.map +1 -1
  53. package/dist/bot/services/system-prompt.js +179 -4
  54. package/dist/bot/services/system-prompt.js.map +1 -1
  55. package/dist/bot/services/token-billing.d.ts +23 -23
  56. package/dist/bot/services/token-billing.d.ts.map +1 -1
  57. package/dist/bot/services/token-billing.js +51 -36
  58. package/dist/bot/services/token-billing.js.map +1 -1
  59. package/dist/bot/services/types.d.ts +3 -1
  60. package/dist/bot/services/types.d.ts.map +1 -1
  61. package/dist/bot/services/typing-indicator.d.ts +8 -8
  62. package/dist/bot/services/typing-indicator.d.ts.map +1 -1
  63. package/dist/bot/services/typing-indicator.js +12 -10
  64. package/dist/bot/services/typing-indicator.js.map +1 -1
  65. package/dist/bot/services/workspace-refresh.d.ts +3 -3
  66. package/dist/bot/services/workspace-refresh.d.ts.map +1 -1
  67. package/dist/bot/services/workspace-refresh.js +23 -13
  68. package/dist/bot/services/workspace-refresh.js.map +1 -1
  69. package/dist/bot/tool-executor.d.ts +10 -6
  70. package/dist/bot/tool-executor.d.ts.map +1 -1
  71. package/dist/bot/tool-executor.js +12 -6
  72. package/dist/bot/tool-executor.js.map +1 -1
  73. package/dist/bot/workspace-overview.d.ts.map +1 -1
  74. package/dist/bot/workspace-overview.js +6 -3
  75. package/dist/bot/workspace-overview.js.map +1 -1
  76. package/dist/bot-config/activity-error.d.ts +47 -0
  77. package/dist/bot-config/activity-error.d.ts.map +1 -0
  78. package/dist/bot-config/activity-error.js +67 -0
  79. package/dist/bot-config/activity-error.js.map +1 -0
  80. package/dist/bot-config/context.d.ts +4 -4
  81. package/dist/bot-config/context.d.ts.map +1 -1
  82. package/dist/bot-config/context.js +18 -14
  83. package/dist/bot-config/context.js.map +1 -1
  84. package/dist/bot-config/events.d.ts +45 -0
  85. package/dist/bot-config/events.d.ts.map +1 -0
  86. package/dist/bot-config/events.js +51 -0
  87. package/dist/bot-config/events.js.map +1 -0
  88. package/dist/bot-config/index.d.ts +3 -0
  89. package/dist/bot-config/index.d.ts.map +1 -1
  90. package/dist/bot-config/index.js +8 -1
  91. package/dist/bot-config/index.js.map +1 -1
  92. package/dist/bot-config/loader.d.ts +3 -0
  93. package/dist/bot-config/loader.d.ts.map +1 -1
  94. package/dist/bot-config/loader.js +45 -20
  95. package/dist/bot-config/loader.js.map +1 -1
  96. package/dist/bot-config/persistence.js.map +1 -1
  97. package/dist/bot-config/reconciler.d.ts +11 -0
  98. package/dist/bot-config/reconciler.d.ts.map +1 -0
  99. package/dist/bot-config/reconciler.js +121 -0
  100. package/dist/bot-config/reconciler.js.map +1 -0
  101. package/dist/bot-config/state.d.ts.map +1 -1
  102. package/dist/bot-config/state.js.map +1 -1
  103. package/dist/bot-config/types.d.ts +32 -0
  104. package/dist/bot-config/types.d.ts.map +1 -1
  105. package/dist/bot-config/webhooks.d.ts.map +1 -1
  106. package/dist/bot-config/webhooks.js.map +1 -1
  107. package/dist/bot-config/workflow-installer.d.ts +37 -0
  108. package/dist/bot-config/workflow-installer.d.ts.map +1 -0
  109. package/dist/bot-config/workflow-installer.js +346 -0
  110. package/dist/bot-config/workflow-installer.js.map +1 -0
  111. package/dist/cli.d.ts.map +1 -1
  112. package/dist/cli.js +54 -0
  113. package/dist/cli.js.map +1 -1
  114. package/dist/config.d.ts +23 -19
  115. package/dist/config.d.ts.map +1 -1
  116. package/dist/config.js +65 -27
  117. package/dist/config.js.map +1 -1
  118. package/dist/core.d.ts +6 -4
  119. package/dist/core.d.ts.map +1 -1
  120. package/dist/core.js +11 -16
  121. package/dist/core.js.map +1 -1
  122. package/dist/lib/logger.d.ts.map +1 -1
  123. package/dist/lib/logger.js +7 -4
  124. package/dist/lib/logger.js.map +1 -1
  125. package/dist/lib/request-logger.d.ts +19 -19
  126. package/dist/lib/request-logger.d.ts.map +1 -1
  127. package/dist/lib/request-logger.js +19 -19
  128. package/dist/lib/request-logger.js.map +1 -1
  129. package/dist/mcp/UserContextCache.d.ts +28 -22
  130. package/dist/mcp/UserContextCache.d.ts.map +1 -1
  131. package/dist/mcp/UserContextCache.js +23 -23
  132. package/dist/mcp/UserContextCache.js.map +1 -1
  133. package/dist/mcp/auth.js.map +1 -1
  134. package/dist/mcp/hailer-clients.d.ts +5 -4
  135. package/dist/mcp/hailer-clients.d.ts.map +1 -1
  136. package/dist/mcp/hailer-clients.js +61 -27
  137. package/dist/mcp/hailer-clients.js.map +1 -1
  138. package/dist/mcp/hailer-rpc.d.ts +40 -0
  139. package/dist/mcp/hailer-rpc.d.ts.map +1 -0
  140. package/dist/mcp/hailer-rpc.js +43 -0
  141. package/dist/mcp/hailer-rpc.js.map +1 -0
  142. package/dist/mcp/publish-auth-injector.d.ts +22 -0
  143. package/dist/mcp/publish-auth-injector.d.ts.map +1 -0
  144. package/dist/mcp/publish-auth-injector.js +100 -0
  145. package/dist/mcp/publish-auth-injector.js.map +1 -0
  146. package/dist/mcp/session-store.d.ts +16 -16
  147. package/dist/mcp/session-store.d.ts.map +1 -1
  148. package/dist/mcp/session-store.js +16 -16
  149. package/dist/mcp/session-store.js.map +1 -1
  150. package/dist/mcp/tool-profiles.d.ts +69 -0
  151. package/dist/mcp/tool-profiles.d.ts.map +1 -0
  152. package/dist/mcp/tool-profiles.js +176 -0
  153. package/dist/mcp/tool-profiles.js.map +1 -0
  154. package/dist/mcp/tool-registry.d.ts +16 -0
  155. package/dist/mcp/tool-registry.d.ts.map +1 -1
  156. package/dist/mcp/tool-registry.js +91 -39
  157. package/dist/mcp/tool-registry.js.map +1 -1
  158. package/dist/mcp/tools/activity.d.ts.map +1 -1
  159. package/dist/mcp/tools/activity.js +398 -198
  160. package/dist/mcp/tools/activity.js.map +1 -1
  161. package/dist/mcp/tools/aliases.d.ts +11 -0
  162. package/dist/mcp/tools/aliases.d.ts.map +1 -0
  163. package/dist/mcp/tools/aliases.js +176 -0
  164. package/dist/mcp/tools/aliases.js.map +1 -0
  165. package/dist/mcp/tools/app-core.d.ts +6 -8
  166. package/dist/mcp/tools/app-core.d.ts.map +1 -1
  167. package/dist/mcp/tools/app-core.js +355 -254
  168. package/dist/mcp/tools/app-core.js.map +1 -1
  169. package/dist/mcp/tools/app-marketplace.d.ts +8 -16
  170. package/dist/mcp/tools/app-marketplace.d.ts.map +1 -1
  171. package/dist/mcp/tools/app-marketplace.js +604 -930
  172. package/dist/mcp/tools/app-marketplace.js.map +1 -1
  173. package/dist/mcp/tools/app.d.ts +4 -7
  174. package/dist/mcp/tools/app.d.ts.map +1 -1
  175. package/dist/mcp/tools/app.js +4 -7
  176. package/dist/mcp/tools/app.js.map +1 -1
  177. package/dist/mcp/tools/bot-self.d.ts +21 -0
  178. package/dist/mcp/tools/bot-self.d.ts.map +1 -0
  179. package/dist/mcp/tools/bot-self.js +174 -0
  180. package/dist/mcp/tools/bot-self.js.map +1 -0
  181. package/dist/mcp/tools/calendar.d.ts +21 -0
  182. package/dist/mcp/tools/calendar.d.ts.map +1 -0
  183. package/dist/mcp/tools/calendar.js +741 -0
  184. package/dist/mcp/tools/calendar.js.map +1 -0
  185. package/dist/mcp/tools/company.d.ts.map +1 -1
  186. package/dist/mcp/tools/company.js +2 -1
  187. package/dist/mcp/tools/company.js.map +1 -1
  188. package/dist/mcp/tools/date.js.map +1 -1
  189. package/dist/mcp/tools/discussion.d.ts +23 -3
  190. package/dist/mcp/tools/discussion.d.ts.map +1 -1
  191. package/dist/mcp/tools/discussion.js +417 -534
  192. package/dist/mcp/tools/discussion.js.map +1 -1
  193. package/dist/mcp/tools/file.d.ts.map +1 -1
  194. package/dist/mcp/tools/file.js +18 -16
  195. package/dist/mcp/tools/file.js.map +1 -1
  196. package/dist/mcp/tools/index.js +4 -4
  197. package/dist/mcp/tools/index.js.map +1 -1
  198. package/dist/mcp/tools/insight.d.ts +7 -5
  199. package/dist/mcp/tools/insight.d.ts.map +1 -1
  200. package/dist/mcp/tools/insight.js +419 -477
  201. package/dist/mcp/tools/insight.js.map +1 -1
  202. package/dist/mcp/tools/user.d.ts.map +1 -1
  203. package/dist/mcp/tools/user.js +15 -13
  204. package/dist/mcp/tools/user.js.map +1 -1
  205. package/dist/mcp/tools/workflow-permissions.d.ts +2 -4
  206. package/dist/mcp/tools/workflow-permissions.d.ts.map +1 -1
  207. package/dist/mcp/tools/workflow-permissions.js +88 -97
  208. package/dist/mcp/tools/workflow-permissions.js.map +1 -1
  209. package/dist/mcp/tools/workflow.d.ts +2 -7
  210. package/dist/mcp/tools/workflow.d.ts.map +1 -1
  211. package/dist/mcp/tools/workflow.js +817 -850
  212. package/dist/mcp/tools/workflow.js.map +1 -1
  213. package/dist/mcp/utils/api-errors.d.ts.map +1 -1
  214. package/dist/mcp/utils/api-errors.js +2 -2
  215. package/dist/mcp/utils/api-errors.js.map +1 -1
  216. package/dist/mcp/utils/data-transformers.d.ts.map +1 -1
  217. package/dist/mcp/utils/data-transformers.js +8 -4
  218. package/dist/mcp/utils/data-transformers.js.map +1 -1
  219. package/dist/mcp/utils/file-upload.d.ts.map +1 -1
  220. package/dist/mcp/utils/file-upload.js +1 -1
  221. package/dist/mcp/utils/file-upload.js.map +1 -1
  222. package/dist/mcp/utils/hailer-api-client.d.ts +81 -81
  223. package/dist/mcp/utils/hailer-api-client.d.ts.map +1 -1
  224. package/dist/mcp/utils/hailer-api-client.js +103 -101
  225. package/dist/mcp/utils/hailer-api-client.js.map +1 -1
  226. package/dist/mcp/utils/index.d.ts.map +1 -1
  227. package/dist/mcp/utils/index.js.map +1 -1
  228. package/dist/mcp/utils/logger.d.ts.map +1 -1
  229. package/dist/mcp/utils/logger.js.map +1 -1
  230. package/dist/mcp/utils/response-builder.d.ts.map +1 -1
  231. package/dist/mcp/utils/response-builder.js +8 -4
  232. package/dist/mcp/utils/response-builder.js.map +1 -1
  233. package/dist/mcp/utils/role-utils.d.ts.map +1 -1
  234. package/dist/mcp/utils/role-utils.js +6 -3
  235. package/dist/mcp/utils/role-utils.js.map +1 -1
  236. package/dist/mcp/utils/tool-helpers.d.ts.map +1 -1
  237. package/dist/mcp/utils/tool-helpers.js +2 -2
  238. package/dist/mcp/utils/tool-helpers.js.map +1 -1
  239. package/dist/mcp/utils/types.d.ts +1 -1
  240. package/dist/mcp/utils/types.d.ts.map +1 -1
  241. package/dist/mcp/utils/types.js.map +1 -1
  242. package/dist/mcp/webhook-handler.d.ts +43 -8
  243. package/dist/mcp/webhook-handler.d.ts.map +1 -1
  244. package/dist/mcp/webhook-handler.js +861 -116
  245. package/dist/mcp/webhook-handler.js.map +1 -1
  246. package/dist/mcp/workspace-admin-store.d.ts +49 -0
  247. package/dist/mcp/workspace-admin-store.d.ts.map +1 -0
  248. package/dist/mcp/workspace-admin-store.js +168 -0
  249. package/dist/mcp/workspace-admin-store.js.map +1 -0
  250. package/dist/mcp/workspace-cache.d.ts +2 -2
  251. package/dist/mcp/workspace-cache.d.ts.map +1 -1
  252. package/dist/mcp/workspace-cache.js +9 -5
  253. package/dist/mcp/workspace-cache.js.map +1 -1
  254. package/dist/mcp-server.d.ts +26 -11
  255. package/dist/mcp-server.d.ts.map +1 -1
  256. package/dist/mcp-server.js +360 -36
  257. package/dist/mcp-server.js.map +1 -1
  258. package/dist/plugins/vipunen/client.d.ts +41 -41
  259. package/dist/plugins/vipunen/client.d.ts.map +1 -1
  260. package/dist/plugins/vipunen/client.js +53 -48
  261. package/dist/plugins/vipunen/client.js.map +1 -1
  262. package/dist/plugins/vipunen/index.js.map +1 -1
  263. package/dist/plugins/vipunen/tools.d.ts.map +1 -1
  264. package/dist/plugins/vipunen/tools.js +6 -3
  265. package/dist/plugins/vipunen/tools.js.map +1 -1
  266. package/dist/public-chat/graduate.d.ts +29 -0
  267. package/dist/public-chat/graduate.d.ts.map +1 -0
  268. package/dist/public-chat/graduate.js +593 -0
  269. package/dist/public-chat/graduate.js.map +1 -0
  270. package/dist/public-chat/handler.d.ts +12 -0
  271. package/dist/public-chat/handler.d.ts.map +1 -0
  272. package/dist/public-chat/handler.js +179 -0
  273. package/dist/public-chat/handler.js.map +1 -0
  274. package/dist/public-chat/index.d.ts +16 -0
  275. package/dist/public-chat/index.d.ts.map +1 -0
  276. package/dist/public-chat/index.js +74 -0
  277. package/dist/public-chat/index.js.map +1 -0
  278. package/dist/public-chat/knowledge.d.ts +3 -0
  279. package/dist/public-chat/knowledge.d.ts.map +1 -0
  280. package/dist/public-chat/knowledge.js +1339 -0
  281. package/dist/public-chat/knowledge.js.map +1 -0
  282. package/dist/public-chat/rate-limit.d.ts +16 -0
  283. package/dist/public-chat/rate-limit.d.ts.map +1 -0
  284. package/dist/public-chat/rate-limit.js +51 -0
  285. package/dist/public-chat/rate-limit.js.map +1 -0
  286. package/dist/public-chat/session-store.d.ts +41 -0
  287. package/dist/public-chat/session-store.d.ts.map +1 -0
  288. package/dist/public-chat/session-store.js +95 -0
  289. package/dist/public-chat/session-store.js.map +1 -0
  290. package/dist/public-chat/studio-prewarm.d.ts +61 -0
  291. package/dist/public-chat/studio-prewarm.d.ts.map +1 -0
  292. package/dist/public-chat/studio-prewarm.js +162 -0
  293. package/dist/public-chat/studio-prewarm.js.map +1 -0
  294. package/dist/public-chat/system-prompt.d.ts +22 -0
  295. package/dist/public-chat/system-prompt.d.ts.map +1 -0
  296. package/dist/public-chat/system-prompt.js +428 -0
  297. package/dist/public-chat/system-prompt.js.map +1 -0
  298. package/package.json +14 -7
  299. package/scripts/build-public-chat-knowledge.py +101 -0
  300. package/scripts/probe-mcp-pricing.ts +52 -0
  301. package/scripts/smoke-public-chat-live.ts +148 -0
  302. package/scripts/smoke-public-chat.ts +110 -0
  303. package/.claude/CLAUDE.md +0 -126
  304. package/.claude/commands/audit-squad.md +0 -158
  305. package/.claude/commands/cleanup-squad.md +0 -98
  306. package/.claude/commands/config-squad.md +0 -106
  307. package/.claude/commands/crud-squad.md +0 -87
  308. package/.claude/commands/data-squad.md +0 -97
  309. package/.claude/commands/doc-squad.md +0 -65
  310. package/.claude/commands/help.md +0 -29
  311. package/.claude/commands/help:agents.md +0 -182
  312. package/.claude/commands/help:commands.md +0 -78
  313. package/.claude/commands/help:faq.md +0 -79
  314. package/.claude/commands/help:plugins.md +0 -50
  315. package/.claude/commands/help:skills.md +0 -87
  316. package/.claude/commands/help:tools.md +0 -75
  317. package/.claude/commands/hotfix-squad.md +0 -112
  318. package/.claude/commands/integration-squad.md +0 -82
  319. package/.claude/commands/janitor-squad.md +0 -167
  320. package/.claude/commands/onboard-squad.md +0 -130
  321. package/.claude/commands/swarm.md +0 -210
  322. package/.claude/commands/tool-builder.md +0 -39
  323. package/.claude/skills/publish-hailer-app/SKILL.md +0 -280
  324. package/dist/CLAUDE.md +0 -370
  325. package/dist/agents/bot-manager.d.ts +0 -48
  326. package/dist/agents/bot-manager.d.ts.map +0 -1
  327. package/dist/agents/bot-manager.js +0 -254
  328. package/dist/agents/bot-manager.js.map +0 -1
  329. package/dist/agents/bug-fixer/ai.d.ts +0 -80
  330. package/dist/agents/bug-fixer/ai.d.ts.map +0 -1
  331. package/dist/agents/bug-fixer/ai.js +0 -466
  332. package/dist/agents/bug-fixer/ai.js.map +0 -1
  333. package/dist/agents/bug-fixer/bot.d.ts +0 -92
  334. package/dist/agents/bug-fixer/bot.d.ts.map +0 -1
  335. package/dist/agents/bug-fixer/bot.js +0 -687
  336. package/dist/agents/bug-fixer/bot.js.map +0 -1
  337. package/dist/agents/bug-fixer/config.d.ts +0 -21
  338. package/dist/agents/bug-fixer/config.d.ts.map +0 -1
  339. package/dist/agents/bug-fixer/config.js +0 -218
  340. package/dist/agents/bug-fixer/config.js.map +0 -1
  341. package/dist/agents/bug-fixer/files.d.ts +0 -67
  342. package/dist/agents/bug-fixer/files.d.ts.map +0 -1
  343. package/dist/agents/bug-fixer/files.js +0 -386
  344. package/dist/agents/bug-fixer/files.js.map +0 -1
  345. package/dist/agents/bug-fixer/git.d.ts +0 -48
  346. package/dist/agents/bug-fixer/git.d.ts.map +0 -1
  347. package/dist/agents/bug-fixer/git.js +0 -298
  348. package/dist/agents/bug-fixer/git.js.map +0 -1
  349. package/dist/agents/bug-fixer/index.d.ts +0 -103
  350. package/dist/agents/bug-fixer/index.d.ts.map +0 -1
  351. package/dist/agents/bug-fixer/index.js +0 -262
  352. package/dist/agents/bug-fixer/index.js.map +0 -1
  353. package/dist/agents/bug-fixer/lsp.d.ts +0 -113
  354. package/dist/agents/bug-fixer/lsp.d.ts.map +0 -1
  355. package/dist/agents/bug-fixer/lsp.js +0 -485
  356. package/dist/agents/bug-fixer/lsp.js.map +0 -1
  357. package/dist/agents/bug-fixer/monitor.d.ts +0 -123
  358. package/dist/agents/bug-fixer/monitor.d.ts.map +0 -1
  359. package/dist/agents/bug-fixer/monitor.js +0 -629
  360. package/dist/agents/bug-fixer/monitor.js.map +0 -1
  361. package/dist/agents/bug-fixer/prompt.d.ts +0 -5
  362. package/dist/agents/bug-fixer/prompt.d.ts.map +0 -1
  363. package/dist/agents/bug-fixer/prompt.js +0 -94
  364. package/dist/agents/bug-fixer/prompt.js.map +0 -1
  365. package/dist/agents/bug-fixer/registries/pending-classification.d.ts +0 -28
  366. package/dist/agents/bug-fixer/registries/pending-classification.d.ts.map +0 -1
  367. package/dist/agents/bug-fixer/registries/pending-classification.js +0 -50
  368. package/dist/agents/bug-fixer/registries/pending-classification.js.map +0 -1
  369. package/dist/agents/bug-fixer/registries/pending-fix.d.ts +0 -33
  370. package/dist/agents/bug-fixer/registries/pending-fix.d.ts.map +0 -1
  371. package/dist/agents/bug-fixer/registries/pending-fix.js +0 -64
  372. package/dist/agents/bug-fixer/registries/pending-fix.js.map +0 -1
  373. package/dist/agents/bug-fixer/registries/pending.d.ts +0 -27
  374. package/dist/agents/bug-fixer/registries/pending.d.ts.map +0 -1
  375. package/dist/agents/bug-fixer/registries/pending.js +0 -49
  376. package/dist/agents/bug-fixer/registries/pending.js.map +0 -1
  377. package/dist/agents/bug-fixer/specialist-daemon.d.ts +0 -88
  378. package/dist/agents/bug-fixer/specialist-daemon.d.ts.map +0 -1
  379. package/dist/agents/bug-fixer/specialist-daemon.js +0 -431
  380. package/dist/agents/bug-fixer/specialist-daemon.js.map +0 -1
  381. package/dist/agents/bug-fixer/specialist.d.ts +0 -47
  382. package/dist/agents/bug-fixer/specialist.d.ts.map +0 -1
  383. package/dist/agents/bug-fixer/specialist.js +0 -327
  384. package/dist/agents/bug-fixer/specialist.js.map +0 -1
  385. package/dist/agents/bug-fixer/types.d.ts +0 -123
  386. package/dist/agents/bug-fixer/types.d.ts.map +0 -1
  387. package/dist/agents/bug-fixer/types.js +0 -9
  388. package/dist/agents/bug-fixer/types.js.map +0 -1
  389. package/dist/agents/factory.d.ts +0 -172
  390. package/dist/agents/factory.d.ts.map +0 -1
  391. package/dist/agents/factory.js +0 -706
  392. package/dist/agents/factory.js.map +0 -1
  393. package/dist/agents/hailer-expert/index.d.ts +0 -8
  394. package/dist/agents/hailer-expert/index.d.ts.map +0 -1
  395. package/dist/agents/hailer-expert/index.js +0 -14
  396. package/dist/agents/hailer-expert/index.js.map +0 -1
  397. package/dist/agents/hal/daemon.d.ts +0 -174
  398. package/dist/agents/hal/daemon.d.ts.map +0 -1
  399. package/dist/agents/hal/daemon.js +0 -1385
  400. package/dist/agents/hal/daemon.js.map +0 -1
  401. package/dist/agents/hal/definitions.d.ts +0 -42
  402. package/dist/agents/hal/definitions.d.ts.map +0 -1
  403. package/dist/agents/hal/definitions.js +0 -300
  404. package/dist/agents/hal/definitions.js.map +0 -1
  405. package/dist/agents/hal/index.d.ts +0 -3
  406. package/dist/agents/hal/index.d.ts.map +0 -1
  407. package/dist/agents/hal/index.js +0 -8
  408. package/dist/agents/hal/index.js.map +0 -1
  409. package/dist/agents/index.d.ts +0 -18
  410. package/dist/agents/index.d.ts.map +0 -1
  411. package/dist/agents/index.js +0 -48
  412. package/dist/agents/index.js.map +0 -1
  413. package/dist/agents/shared/base.d.ts +0 -253
  414. package/dist/agents/shared/base.d.ts.map +0 -1
  415. package/dist/agents/shared/base.js +0 -1122
  416. package/dist/agents/shared/base.js.map +0 -1
  417. package/dist/agents/shared/schemas/action-schema.d.ts +0 -62
  418. package/dist/agents/shared/schemas/action-schema.d.ts.map +0 -1
  419. package/dist/agents/shared/schemas/action-schema.js +0 -483
  420. package/dist/agents/shared/schemas/action-schema.js.map +0 -1
  421. package/dist/agents/shared/services/agent-registry.d.ts +0 -108
  422. package/dist/agents/shared/services/agent-registry.d.ts.map +0 -1
  423. package/dist/agents/shared/services/agent-registry.js +0 -469
  424. package/dist/agents/shared/services/agent-registry.js.map +0 -1
  425. package/dist/agents/shared/services/conversation-manager.d.ts +0 -57
  426. package/dist/agents/shared/services/conversation-manager.d.ts.map +0 -1
  427. package/dist/agents/shared/services/conversation-manager.js +0 -168
  428. package/dist/agents/shared/services/conversation-manager.js.map +0 -1
  429. package/dist/agents/shared/services/mcp-client.d.ts +0 -56
  430. package/dist/agents/shared/services/mcp-client.d.ts.map +0 -1
  431. package/dist/agents/shared/services/mcp-client.js +0 -124
  432. package/dist/agents/shared/services/mcp-client.js.map +0 -1
  433. package/dist/agents/shared/services/message-classifier.d.ts +0 -37
  434. package/dist/agents/shared/services/message-classifier.d.ts.map +0 -1
  435. package/dist/agents/shared/services/message-classifier.js +0 -203
  436. package/dist/agents/shared/services/message-classifier.js.map +0 -1
  437. package/dist/agents/shared/services/message-formatter.d.ts +0 -89
  438. package/dist/agents/shared/services/message-formatter.d.ts.map +0 -1
  439. package/dist/agents/shared/services/message-formatter.js +0 -390
  440. package/dist/agents/shared/services/message-formatter.js.map +0 -1
  441. package/dist/agents/shared/services/session-logger.d.ts +0 -162
  442. package/dist/agents/shared/services/session-logger.d.ts.map +0 -1
  443. package/dist/agents/shared/services/session-logger.js +0 -724
  444. package/dist/agents/shared/services/session-logger.js.map +0 -1
  445. package/dist/agents/shared/services/structured-output-executor.d.ts +0 -88
  446. package/dist/agents/shared/services/structured-output-executor.d.ts.map +0 -1
  447. package/dist/agents/shared/services/structured-output-executor.js +0 -296
  448. package/dist/agents/shared/services/structured-output-executor.js.map +0 -1
  449. package/dist/agents/shared/services/token-billing.d.ts +0 -72
  450. package/dist/agents/shared/services/token-billing.d.ts.map +0 -1
  451. package/dist/agents/shared/services/token-billing.js +0 -198
  452. package/dist/agents/shared/services/token-billing.js.map +0 -1
  453. package/dist/agents/shared/services/tool-executor.d.ts +0 -43
  454. package/dist/agents/shared/services/tool-executor.d.ts.map +0 -1
  455. package/dist/agents/shared/services/tool-executor.js +0 -175
  456. package/dist/agents/shared/services/tool-executor.js.map +0 -1
  457. package/dist/agents/shared/services/typing-indicator.d.ts +0 -24
  458. package/dist/agents/shared/services/typing-indicator.d.ts.map +0 -1
  459. package/dist/agents/shared/services/typing-indicator.js +0 -54
  460. package/dist/agents/shared/services/typing-indicator.js.map +0 -1
  461. package/dist/agents/shared/services/workspace-schema-cache.d.ts +0 -122
  462. package/dist/agents/shared/services/workspace-schema-cache.d.ts.map +0 -1
  463. package/dist/agents/shared/services/workspace-schema-cache.js +0 -507
  464. package/dist/agents/shared/services/workspace-schema-cache.js.map +0 -1
  465. package/dist/agents/shared/specialist.d.ts +0 -91
  466. package/dist/agents/shared/specialist.d.ts.map +0 -1
  467. package/dist/agents/shared/specialist.js +0 -399
  468. package/dist/agents/shared/specialist.js.map +0 -1
  469. package/dist/agents/shared/tool-schema-loader.d.ts +0 -65
  470. package/dist/agents/shared/tool-schema-loader.d.ts.map +0 -1
  471. package/dist/agents/shared/tool-schema-loader.js +0 -238
  472. package/dist/agents/shared/tool-schema-loader.js.map +0 -1
  473. package/dist/agents/shared/types.d.ts +0 -190
  474. package/dist/agents/shared/types.d.ts.map +0 -1
  475. package/dist/agents/shared/types.js +0 -13
  476. package/dist/agents/shared/types.js.map +0 -1
  477. package/dist/bot/bot-config.d.ts +0 -37
  478. package/dist/bot/bot-config.d.ts.map +0 -1
  479. package/dist/bot/bot-config.js +0 -219
  480. package/dist/bot/bot-config.js.map +0 -1
  481. package/dist/bot/services/__tests__/permission-guard.test.d.ts +0 -2
  482. package/dist/bot/services/__tests__/permission-guard.test.d.ts.map +0 -1
  483. package/dist/bot/services/__tests__/permission-guard.test.js +0 -357
  484. package/dist/bot/services/__tests__/permission-guard.test.js.map +0 -1
  485. package/dist/bot/services/session-logger.d.ts +0 -162
  486. package/dist/bot/services/session-logger.d.ts.map +0 -1
  487. package/dist/bot/services/session-logger.js +0 -724
  488. package/dist/bot/services/session-logger.js.map +0 -1
  489. package/dist/bot/services/workspace-schema-cache.d.ts +0 -122
  490. package/dist/bot/services/workspace-schema-cache.d.ts.map +0 -1
  491. package/dist/bot/services/workspace-schema-cache.js +0 -506
  492. package/dist/bot/services/workspace-schema-cache.js.map +0 -1
  493. package/dist/bot-config/tools.d.ts +0 -28
  494. package/dist/bot-config/tools.d.ts.map +0 -1
  495. package/dist/bot-config/tools.js +0 -279
  496. package/dist/bot-config/tools.js.map +0 -1
  497. package/dist/client/agents/base.d.ts +0 -207
  498. package/dist/client/agents/base.d.ts.map +0 -1
  499. package/dist/client/agents/base.js +0 -744
  500. package/dist/client/agents/base.js.map +0 -1
  501. package/dist/client/agents/definitions.d.ts +0 -53
  502. package/dist/client/agents/definitions.d.ts.map +0 -1
  503. package/dist/client/agents/definitions.js +0 -263
  504. package/dist/client/agents/definitions.js.map +0 -1
  505. package/dist/client/agents/orchestrator.d.ts +0 -141
  506. package/dist/client/agents/orchestrator.d.ts.map +0 -1
  507. package/dist/client/agents/orchestrator.js +0 -1062
  508. package/dist/client/agents/orchestrator.js.map +0 -1
  509. package/dist/client/agents/specialist.d.ts +0 -86
  510. package/dist/client/agents/specialist.d.ts.map +0 -1
  511. package/dist/client/agents/specialist.js +0 -340
  512. package/dist/client/agents/specialist.js.map +0 -1
  513. package/dist/client/bot-entrypoint.d.ts +0 -7
  514. package/dist/client/bot-entrypoint.d.ts.map +0 -1
  515. package/dist/client/bot-entrypoint.js +0 -103
  516. package/dist/client/bot-entrypoint.js.map +0 -1
  517. package/dist/client/bot-manager.d.ts +0 -44
  518. package/dist/client/bot-manager.d.ts.map +0 -1
  519. package/dist/client/bot-manager.js +0 -173
  520. package/dist/client/bot-manager.js.map +0 -1
  521. package/dist/client/bot-runner.d.ts +0 -35
  522. package/dist/client/bot-runner.d.ts.map +0 -1
  523. package/dist/client/bot-runner.js +0 -188
  524. package/dist/client/bot-runner.js.map +0 -1
  525. package/dist/client/chat-agent-daemon.d.ts +0 -464
  526. package/dist/client/chat-agent-daemon.d.ts.map +0 -1
  527. package/dist/client/chat-agent-daemon.js +0 -1774
  528. package/dist/client/chat-agent-daemon.js.map +0 -1
  529. package/dist/client/daemon-factory.d.ts +0 -106
  530. package/dist/client/daemon-factory.d.ts.map +0 -1
  531. package/dist/client/daemon-factory.js +0 -301
  532. package/dist/client/daemon-factory.js.map +0 -1
  533. package/dist/client/factory.d.ts +0 -111
  534. package/dist/client/factory.d.ts.map +0 -1
  535. package/dist/client/factory.js +0 -314
  536. package/dist/client/factory.js.map +0 -1
  537. package/dist/client/index.d.ts +0 -17
  538. package/dist/client/index.d.ts.map +0 -1
  539. package/dist/client/index.js +0 -38
  540. package/dist/client/index.js.map +0 -1
  541. package/dist/client/multi-bot-manager.d.ts +0 -42
  542. package/dist/client/multi-bot-manager.d.ts.map +0 -1
  543. package/dist/client/multi-bot-manager.js +0 -161
  544. package/dist/client/multi-bot-manager.js.map +0 -1
  545. package/dist/client/orchestrator-daemon.d.ts +0 -87
  546. package/dist/client/orchestrator-daemon.d.ts.map +0 -1
  547. package/dist/client/orchestrator-daemon.js +0 -444
  548. package/dist/client/orchestrator-daemon.js.map +0 -1
  549. package/dist/client/server.d.ts +0 -8
  550. package/dist/client/server.d.ts.map +0 -1
  551. package/dist/client/server.js +0 -251
  552. package/dist/client/server.js.map +0 -1
  553. package/dist/client/services/agent-registry.d.ts +0 -108
  554. package/dist/client/services/agent-registry.d.ts.map +0 -1
  555. package/dist/client/services/agent-registry.js +0 -630
  556. package/dist/client/services/agent-registry.js.map +0 -1
  557. package/dist/client/services/conversation-manager.d.ts +0 -50
  558. package/dist/client/services/conversation-manager.d.ts.map +0 -1
  559. package/dist/client/services/conversation-manager.js +0 -136
  560. package/dist/client/services/conversation-manager.js.map +0 -1
  561. package/dist/client/services/mcp-client.d.ts +0 -48
  562. package/dist/client/services/mcp-client.d.ts.map +0 -1
  563. package/dist/client/services/mcp-client.js +0 -105
  564. package/dist/client/services/mcp-client.js.map +0 -1
  565. package/dist/client/services/message-classifier.d.ts +0 -37
  566. package/dist/client/services/message-classifier.d.ts.map +0 -1
  567. package/dist/client/services/message-classifier.js +0 -187
  568. package/dist/client/services/message-classifier.js.map +0 -1
  569. package/dist/client/services/message-formatter.d.ts +0 -84
  570. package/dist/client/services/message-formatter.d.ts.map +0 -1
  571. package/dist/client/services/message-formatter.js +0 -353
  572. package/dist/client/services/message-formatter.js.map +0 -1
  573. package/dist/client/services/session-logger.d.ts +0 -106
  574. package/dist/client/services/session-logger.d.ts.map +0 -1
  575. package/dist/client/services/session-logger.js +0 -446
  576. package/dist/client/services/session-logger.js.map +0 -1
  577. package/dist/client/services/tool-executor.d.ts +0 -41
  578. package/dist/client/services/tool-executor.d.ts.map +0 -1
  579. package/dist/client/services/tool-executor.js +0 -169
  580. package/dist/client/services/tool-executor.js.map +0 -1
  581. package/dist/client/services/workspace-schema-cache.d.ts +0 -149
  582. package/dist/client/services/workspace-schema-cache.d.ts.map +0 -1
  583. package/dist/client/services/workspace-schema-cache.js +0 -732
  584. package/dist/client/services/workspace-schema-cache.js.map +0 -1
  585. package/dist/client/specialist-daemon.d.ts +0 -77
  586. package/dist/client/specialist-daemon.d.ts.map +0 -1
  587. package/dist/client/specialist-daemon.js +0 -197
  588. package/dist/client/specialist-daemon.js.map +0 -1
  589. package/dist/client/specialists.d.ts +0 -53
  590. package/dist/client/specialists.d.ts.map +0 -1
  591. package/dist/client/specialists.js +0 -178
  592. package/dist/client/specialists.js.map +0 -1
  593. package/dist/client/tool-schema-loader.d.ts +0 -62
  594. package/dist/client/tool-schema-loader.d.ts.map +0 -1
  595. package/dist/client/tool-schema-loader.js +0 -232
  596. package/dist/client/tool-schema-loader.js.map +0 -1
  597. package/dist/client/types.d.ts +0 -327
  598. package/dist/client/types.d.ts.map +0 -1
  599. package/dist/client/types.js +0 -121
  600. package/dist/client/types.js.map +0 -1
  601. package/dist/commands/seed-config.d.ts +0 -9
  602. package/dist/commands/seed-config.d.ts.map +0 -1
  603. package/dist/commands/seed-config.js +0 -377
  604. package/dist/commands/seed-config.js.map +0 -1
  605. package/dist/commands/setup.d.ts +0 -11
  606. package/dist/commands/setup.d.ts.map +0 -1
  607. package/dist/commands/setup.js +0 -320
  608. package/dist/commands/setup.js.map +0 -1
  609. package/dist/lib/discussion-lock.d.ts +0 -42
  610. package/dist/lib/discussion-lock.d.ts.map +0 -1
  611. package/dist/lib/discussion-lock.js +0 -110
  612. package/dist/lib/discussion-lock.js.map +0 -1
  613. package/dist/mcp/signal-handler.d.ts +0 -82
  614. package/dist/mcp/signal-handler.d.ts.map +0 -1
  615. package/dist/mcp/signal-handler.js +0 -406
  616. package/dist/mcp/signal-handler.js.map +0 -1
  617. package/dist/mcp/tools/__tests__/discussion-forward.test.d.ts +0 -2
  618. package/dist/mcp/tools/__tests__/discussion-forward.test.d.ts.map +0 -1
  619. package/dist/mcp/tools/__tests__/discussion-forward.test.js +0 -218
  620. package/dist/mcp/tools/__tests__/discussion-forward.test.js.map +0 -1
  621. package/dist/mcp/tools/app-member.d.ts +0 -14
  622. package/dist/mcp/tools/app-member.d.ts.map +0 -1
  623. package/dist/mcp/tools/app-member.js +0 -195
  624. package/dist/mcp/tools/app-member.js.map +0 -1
  625. package/dist/mcp/tools/app-scaffold.d.ts +0 -14
  626. package/dist/mcp/tools/app-scaffold.d.ts.map +0 -1
  627. package/dist/mcp/tools/app-scaffold.js +0 -581
  628. package/dist/mcp/tools/app-scaffold.js.map +0 -1
  629. package/dist/mcp/tools/bot-config/constants.d.ts +0 -23
  630. package/dist/mcp/tools/bot-config/constants.d.ts.map +0 -1
  631. package/dist/mcp/tools/bot-config/constants.js +0 -94
  632. package/dist/mcp/tools/bot-config/constants.js.map +0 -1
  633. package/dist/mcp/tools/bot-config/core.d.ts +0 -253
  634. package/dist/mcp/tools/bot-config/core.d.ts.map +0 -1
  635. package/dist/mcp/tools/bot-config/core.js +0 -2456
  636. package/dist/mcp/tools/bot-config/core.js.map +0 -1
  637. package/dist/mcp/tools/bot-config/index.d.ts +0 -10
  638. package/dist/mcp/tools/bot-config/index.d.ts.map +0 -1
  639. package/dist/mcp/tools/bot-config/index.js +0 -59
  640. package/dist/mcp/tools/bot-config/index.js.map +0 -1
  641. package/dist/mcp/tools/bot-config/tools.d.ts +0 -7
  642. package/dist/mcp/tools/bot-config/tools.d.ts.map +0 -1
  643. package/dist/mcp/tools/bot-config/tools.js +0 -15
  644. package/dist/mcp/tools/bot-config/tools.js.map +0 -1
  645. package/dist/mcp/tools/bot-config/types.d.ts +0 -50
  646. package/dist/mcp/tools/bot-config/types.d.ts.map +0 -1
  647. package/dist/mcp/tools/bot-config/types.js +0 -6
  648. package/dist/mcp/tools/bot-config/types.js.map +0 -1
  649. package/dist/mcp/tools/bug-fixer-tools.d.ts +0 -45
  650. package/dist/mcp/tools/bug-fixer-tools.d.ts.map +0 -1
  651. package/dist/mcp/tools/bug-fixer-tools.js +0 -1096
  652. package/dist/mcp/tools/bug-fixer-tools.js.map +0 -1
  653. package/dist/mcp/tools/document.d.ts +0 -11
  654. package/dist/mcp/tools/document.d.ts.map +0 -1
  655. package/dist/mcp/tools/document.js +0 -741
  656. package/dist/mcp/tools/document.js.map +0 -1
  657. package/dist/mcp/tools/investigate.d.ts +0 -9
  658. package/dist/mcp/tools/investigate.d.ts.map +0 -1
  659. package/dist/mcp/tools/investigate.js +0 -254
  660. package/dist/mcp/tools/investigate.js.map +0 -1
  661. package/dist/mcp/utils/pagination.d.ts +0 -40
  662. package/dist/mcp/utils/pagination.d.ts.map +0 -1
  663. package/dist/mcp/utils/pagination.js +0 -55
  664. package/dist/mcp/utils/pagination.js.map +0 -1
  665. package/dist/modules/bug-reports/bug-config.d.ts +0 -25
  666. package/dist/modules/bug-reports/bug-config.d.ts.map +0 -1
  667. package/dist/modules/bug-reports/bug-config.js +0 -187
  668. package/dist/modules/bug-reports/bug-config.js.map +0 -1
  669. package/dist/modules/bug-reports/bug-monitor.d.ts +0 -108
  670. package/dist/modules/bug-reports/bug-monitor.d.ts.map +0 -1
  671. package/dist/modules/bug-reports/bug-monitor.js +0 -510
  672. package/dist/modules/bug-reports/bug-monitor.js.map +0 -1
  673. package/dist/modules/bug-reports/giuseppe-agent.d.ts +0 -58
  674. package/dist/modules/bug-reports/giuseppe-agent.d.ts.map +0 -1
  675. package/dist/modules/bug-reports/giuseppe-agent.js +0 -467
  676. package/dist/modules/bug-reports/giuseppe-agent.js.map +0 -1
  677. package/dist/modules/bug-reports/giuseppe-ai.d.ts +0 -83
  678. package/dist/modules/bug-reports/giuseppe-ai.d.ts.map +0 -1
  679. package/dist/modules/bug-reports/giuseppe-ai.js +0 -466
  680. package/dist/modules/bug-reports/giuseppe-ai.js.map +0 -1
  681. package/dist/modules/bug-reports/giuseppe-bot.d.ts +0 -110
  682. package/dist/modules/bug-reports/giuseppe-bot.d.ts.map +0 -1
  683. package/dist/modules/bug-reports/giuseppe-bot.js +0 -804
  684. package/dist/modules/bug-reports/giuseppe-bot.js.map +0 -1
  685. package/dist/modules/bug-reports/giuseppe-daemon.d.ts +0 -80
  686. package/dist/modules/bug-reports/giuseppe-daemon.d.ts.map +0 -1
  687. package/dist/modules/bug-reports/giuseppe-daemon.js +0 -617
  688. package/dist/modules/bug-reports/giuseppe-daemon.js.map +0 -1
  689. package/dist/modules/bug-reports/giuseppe-files.d.ts +0 -64
  690. package/dist/modules/bug-reports/giuseppe-files.d.ts.map +0 -1
  691. package/dist/modules/bug-reports/giuseppe-files.js +0 -375
  692. package/dist/modules/bug-reports/giuseppe-files.js.map +0 -1
  693. package/dist/modules/bug-reports/giuseppe-git.d.ts +0 -48
  694. package/dist/modules/bug-reports/giuseppe-git.d.ts.map +0 -1
  695. package/dist/modules/bug-reports/giuseppe-git.js +0 -298
  696. package/dist/modules/bug-reports/giuseppe-git.js.map +0 -1
  697. package/dist/modules/bug-reports/giuseppe-lsp.d.ts +0 -113
  698. package/dist/modules/bug-reports/giuseppe-lsp.d.ts.map +0 -1
  699. package/dist/modules/bug-reports/giuseppe-lsp.js +0 -485
  700. package/dist/modules/bug-reports/giuseppe-lsp.js.map +0 -1
  701. package/dist/modules/bug-reports/giuseppe-prompt.d.ts +0 -5
  702. package/dist/modules/bug-reports/giuseppe-prompt.d.ts.map +0 -1
  703. package/dist/modules/bug-reports/giuseppe-prompt.js +0 -94
  704. package/dist/modules/bug-reports/giuseppe-prompt.js.map +0 -1
  705. package/dist/modules/bug-reports/index.d.ts +0 -77
  706. package/dist/modules/bug-reports/index.d.ts.map +0 -1
  707. package/dist/modules/bug-reports/index.js +0 -215
  708. package/dist/modules/bug-reports/index.js.map +0 -1
  709. package/dist/modules/bug-reports/pending-classification-registry.d.ts +0 -28
  710. package/dist/modules/bug-reports/pending-classification-registry.d.ts.map +0 -1
  711. package/dist/modules/bug-reports/pending-classification-registry.js +0 -50
  712. package/dist/modules/bug-reports/pending-classification-registry.js.map +0 -1
  713. package/dist/modules/bug-reports/pending-fix-registry.d.ts +0 -30
  714. package/dist/modules/bug-reports/pending-fix-registry.d.ts.map +0 -1
  715. package/dist/modules/bug-reports/pending-fix-registry.js +0 -42
  716. package/dist/modules/bug-reports/pending-fix-registry.js.map +0 -1
  717. package/dist/modules/bug-reports/pending-registry.d.ts +0 -27
  718. package/dist/modules/bug-reports/pending-registry.d.ts.map +0 -1
  719. package/dist/modules/bug-reports/pending-registry.js +0 -49
  720. package/dist/modules/bug-reports/pending-registry.js.map +0 -1
  721. package/dist/modules/bug-reports/types.d.ts +0 -123
  722. package/dist/modules/bug-reports/types.d.ts.map +0 -1
  723. package/dist/modules/bug-reports/types.js +0 -9
  724. package/dist/modules/bug-reports/types.js.map +0 -1
  725. package/dist/plugins/bug-fixer/index.d.ts +0 -2
  726. package/dist/plugins/bug-fixer/index.d.ts.map +0 -1
  727. package/dist/plugins/bug-fixer/index.js +0 -18
  728. package/dist/plugins/bug-fixer/index.js.map +0 -1
  729. package/dist/plugins/bug-fixer/tools.d.ts +0 -45
  730. package/dist/plugins/bug-fixer/tools.d.ts.map +0 -1
  731. package/dist/plugins/bug-fixer/tools.js +0 -1096
  732. package/dist/plugins/bug-fixer/tools.js.map +0 -1
  733. package/dist/plugins/vipunen/__tests__/tools.test.d.ts +0 -10
  734. package/dist/plugins/vipunen/__tests__/tools.test.d.ts.map +0 -1
  735. package/dist/plugins/vipunen/__tests__/tools.test.js +0 -646
  736. package/dist/plugins/vipunen/__tests__/tools.test.js.map +0 -1
  737. package/dist/routes/agents.d.ts +0 -44
  738. package/dist/routes/agents.d.ts.map +0 -1
  739. package/dist/routes/agents.js +0 -311
  740. package/dist/routes/agents.js.map +0 -1
  741. package/dist/services/agent-credential-store.d.ts +0 -73
  742. package/dist/services/agent-credential-store.d.ts.map +0 -1
  743. package/dist/services/agent-credential-store.js +0 -212
  744. package/dist/services/agent-credential-store.js.map +0 -1
  745. package/dist/stdio-server.d.ts +0 -14
  746. package/dist/stdio-server.d.ts.map +0 -1
  747. package/dist/stdio-server.js +0 -101
  748. package/dist/stdio-server.js.map +0 -1
  749. package/dist/workspace/context.d.ts +0 -148
  750. package/dist/workspace/context.d.ts.map +0 -1
  751. package/dist/workspace/context.js +0 -339
  752. package/dist/workspace/context.js.map +0 -1
  753. package/dist/workspace/credentials.d.ts +0 -55
  754. package/dist/workspace/credentials.d.ts.map +0 -1
  755. package/dist/workspace/credentials.js +0 -239
  756. package/dist/workspace/credentials.js.map +0 -1
  757. package/dist/workspace/index.d.ts +0 -21
  758. package/dist/workspace/index.d.ts.map +0 -1
  759. package/dist/workspace/index.js +0 -45
  760. package/dist/workspace/index.js.map +0 -1
  761. package/dist/workspace/loader.d.ts +0 -27
  762. package/dist/workspace/loader.d.ts.map +0 -1
  763. package/dist/workspace/loader.js +0 -222
  764. package/dist/workspace/loader.js.map +0 -1
  765. package/dist/workspace/schema.d.ts +0 -37
  766. package/dist/workspace/schema.d.ts.map +0 -1
  767. package/dist/workspace/schema.js +0 -192
  768. package/dist/workspace/schema.js.map +0 -1
@@ -98,7 +98,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
98
98
  let malformatFilterErrorMessage = undefined;
99
99
  for (const [fieldId, filterConfig] of Object.entries(mcpToolActivityListFilters)) {
100
100
  switch (filterConfig.operator) {
101
- case "text_search":
101
+ case 'text_search':
102
102
  if (filterConfig.value !== undefined) {
103
103
  apiActivityFilters.and.push({ [fieldId]: { textSearch: filterConfig.value } });
104
104
  }
@@ -106,7 +106,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
106
106
  malformatFilterErrorMessage = 'text_search filter requires a value';
107
107
  }
108
108
  break;
109
- case "equals":
109
+ case 'equals':
110
110
  if (filterConfig.value !== undefined) {
111
111
  apiActivityFilters.and.push({ [fieldId]: { equalTo: filterConfig.value } });
112
112
  }
@@ -114,7 +114,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
114
114
  malformatFilterErrorMessage = 'equals filter requires a value';
115
115
  }
116
116
  break;
117
- case "not_equals":
117
+ case 'not_equals':
118
118
  if (filterConfig.value !== undefined) {
119
119
  apiActivityFilters.and.push({ [fieldId]: { notEqualTo: filterConfig.value } });
120
120
  }
@@ -122,7 +122,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
122
122
  malformatFilterErrorMessage = 'not_equals filter requires a value';
123
123
  }
124
124
  break;
125
- case "contains":
125
+ case 'contains':
126
126
  if (filterConfig.value !== undefined) {
127
127
  apiActivityFilters.and.push({ [fieldId]: { contains: filterConfig.value } });
128
128
  }
@@ -130,7 +130,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
130
130
  malformatFilterErrorMessage = 'contains filter requires a value';
131
131
  }
132
132
  break;
133
- case "greater_than":
133
+ case 'greater_than':
134
134
  if (filterConfig.value !== undefined && typeof filterConfig.value === 'number') {
135
135
  apiActivityFilters.and.push({ [fieldId]: { greaterThan: filterConfig.value } });
136
136
  }
@@ -138,7 +138,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
138
138
  malformatFilterErrorMessage = 'greater_than filter requires a numeric value';
139
139
  }
140
140
  break;
141
- case "greater_than_or_equal":
141
+ case 'greater_than_or_equal':
142
142
  if (filterConfig.value !== undefined && typeof filterConfig.value === 'number') {
143
143
  apiActivityFilters.and.push({ [fieldId]: { greaterThanOrEqual: filterConfig.value } });
144
144
  }
@@ -146,7 +146,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
146
146
  malformatFilterErrorMessage = 'greater_than_or_equal filter requires a numeric value';
147
147
  }
148
148
  break;
149
- case "less_than":
149
+ case 'less_than':
150
150
  if (filterConfig.value !== undefined && typeof filterConfig.value === 'number') {
151
151
  apiActivityFilters.and.push({ [fieldId]: { lessThan: filterConfig.value } });
152
152
  }
@@ -154,7 +154,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
154
154
  malformatFilterErrorMessage = 'less_than filter requires a numeric value';
155
155
  }
156
156
  break;
157
- case "less_than_or_equal":
157
+ case 'less_than_or_equal':
158
158
  if (filterConfig.value !== undefined && typeof filterConfig.value === 'number') {
159
159
  apiActivityFilters.and.push({ [fieldId]: { lessThanOrEqual: filterConfig.value } });
160
160
  }
@@ -162,7 +162,7 @@ function convertActivityFilters(mcpToolActivityListFilters) {
162
162
  malformatFilterErrorMessage = 'less_than_or_equal filter requires a numeric value';
163
163
  }
164
164
  break;
165
- case "range":
165
+ case 'range':
166
166
  if (!filterConfig.start || !filterConfig.end) {
167
167
  malformatFilterErrorMessage = 'Incorrect filter format, either start or end not provided for range';
168
168
  break;
@@ -205,7 +205,7 @@ function formatActivityListResponseWithPagination(activityData, workflow, init,
205
205
  return {
206
206
  content: [
207
207
  {
208
- type: "text",
208
+ type: 'text',
209
209
  text: responseText,
210
210
  },
211
211
  ],
@@ -232,11 +232,13 @@ function formatFilteredActivityListResponse(activityData, workflow, init, args)
232
232
  for (const [fieldId, filter] of Object.entries(args.filters || {})) {
233
233
  const filterConfig = filter;
234
234
  responseText += `- Field \`${fieldId}\`: ${filterConfig.operator}`;
235
- if (filterConfig.value !== undefined)
235
+ if (filterConfig.value !== undefined) {
236
236
  responseText += ` = "${filterConfig.value}"`;
237
- if (filterConfig.start !== undefined)
237
+ }
238
+ if (filterConfig.start !== undefined) {
238
239
  responseText += ` from ${filterConfig.start} to ${filterConfig.end}`;
239
- responseText += "\n";
240
+ }
241
+ responseText += '\n';
240
242
  }
241
243
  if (args.search) {
242
244
  responseText += `- Text search: "${args.search}"\n`;
@@ -257,7 +259,7 @@ function formatFilteredActivityListResponse(activityData, workflow, init, args)
257
259
  responseText += `- Call get_workflow_schema to verify field IDs are correct\n`;
258
260
  responseText += `- Use list_activities without filters to see all activities`;
259
261
  return {
260
- content: [{ type: "text", text: responseText }],
262
+ content: [{ type: 'text', text: responseText }],
261
263
  };
262
264
  }
263
265
  responseText += `\n` + (0, index_1.formatActivityListResponse)(filteredActivities, workflow, undefined);
@@ -270,19 +272,164 @@ function formatFilteredActivityListResponse(activityData, workflow, init, args)
270
272
  return {
271
273
  content: [
272
274
  {
273
- type: "text",
275
+ type: 'text',
274
276
  text: responseText,
275
277
  },
276
278
  ],
277
279
  };
278
280
  }
281
+ /**
282
+ * countOnly fast path for list_activities — preserved verbatim from the retired
283
+ * count_activities tool. O(1): calls v3.activity.count, never fetches activities.
284
+ */
285
+ async function executeActivityCount(workflowId, context) {
286
+ logger.debug('Counting activities', {
287
+ workflowId,
288
+ apiKey: context.apiKey.substring(0, 8) + '...',
289
+ });
290
+ try {
291
+ // Get workflow name from cached data (matches by _id or key)
292
+ const workflow = (context.init.processes || []).find((proc) => proc._id === workflowId || proc.key === workflowId);
293
+ if (!workflow) {
294
+ return {
295
+ content: [{
296
+ type: 'text',
297
+ text: `āŒ Workflow "${workflowId}" not found`,
298
+ }],
299
+ };
300
+ }
301
+ logger.debug('Calling v3.activity.count', {
302
+ workflowId,
303
+ workflowName: workflow.name,
304
+ });
305
+ // Call v3.activity.count endpoint
306
+ // Returns object with phase IDs as keys and counts as values
307
+ const result = await context.hailer.request('v3.activity.count', [workflowId]);
308
+ logger.debug('Activity count retrieved', {
309
+ result: JSON.stringify(result),
310
+ });
311
+ // Sum all counts across phases
312
+ const count = Object.values(result).reduce((sum, phaseCount) => sum + phaseCount, 0);
313
+ let responseText = `šŸ”¢ **Activity Count for "${workflow.name}"**\n\n`;
314
+ responseText += `**Workflow ID:** \`${workflowId}\`\n`;
315
+ responseText += `**Total Activities:** ${count}\n\n`;
316
+ if (count === 0) {
317
+ responseText += `šŸ’” This workflow has no activities yet. Use \`create_activity\` to add one.\n`;
318
+ return {
319
+ content: [{ type: 'text', text: responseText }],
320
+ };
321
+ }
322
+ responseText += `šŸ’” **Next Steps:**\n`;
323
+ responseText += `- Use \`list_activities\` to see the activities\n`;
324
+ responseText += `- Use \`get_workflow_schema\` to see workflow structure\n`;
325
+ return {
326
+ content: [{ type: 'text', text: responseText }],
327
+ };
328
+ }
329
+ catch (error) {
330
+ if (!request_logger_1.RequestLogger.getCurrent()) {
331
+ logger.error('Error counting activities', error);
332
+ }
333
+ return {
334
+ content: [{
335
+ type: 'text',
336
+ text: `āŒ Error counting activities: ${error instanceof Error ? error.message : String(error)}\n\n**Tips:**\n` +
337
+ '- Check that workflow ID is valid (24 characters)\n- Use `list_workflows` to find workflow IDs',
338
+ }],
339
+ };
340
+ }
341
+ }
342
+ /**
343
+ * Validate the keys of a fields object against a workflow's field definitions.
344
+ * The server silently ignores unknown keys (e.g. field NAMES instead of IDs) and
345
+ * reports success — the #1 documented footgun — so we error out before the API call.
346
+ *
347
+ * ORDERING: in both create_activity and update_activity this runs AFTER the
348
+ * date/activitylink auto-fixups and immediately before the API call. The fixups
349
+ * rewrite values only, never keys, so the validated key set is identical either way.
350
+ *
351
+ * Accepts field IDs and field keys (the API resolves both).
352
+ * Returns error text for unknown keys, or undefined when all keys are known.
353
+ */
354
+ function validateFieldKeys(fields, workflowFields) {
355
+ const knownKeys = new Set();
356
+ const labelToId = new Map();
357
+ for (const [fieldId, fieldDef] of Object.entries(workflowFields)) {
358
+ const def = fieldDef;
359
+ knownKeys.add(fieldId);
360
+ if (def.key) {
361
+ knownKeys.add(def.key);
362
+ }
363
+ if (def.label) {
364
+ labelToId.set(String(def.label).toLowerCase(), fieldId);
365
+ }
366
+ }
367
+ const unknownKeys = Object.keys(fields).filter((key) => !knownKeys.has(key));
368
+ if (unknownKeys.length === 0) {
369
+ return undefined;
370
+ }
371
+ const lines = [];
372
+ let needsFieldList = false;
373
+ for (const key of unknownKeys) {
374
+ const labelMatchId = labelToId.get(key.toLowerCase());
375
+ if (labelMatchId) {
376
+ const label = workflowFields[labelMatchId].label;
377
+ lines.push(`Field "${key}" must be referenced by ID: use "${labelMatchId}" (label: "${label}")`);
378
+ continue;
379
+ }
380
+ lines.push(`Unknown field key "${key}".`);
381
+ needsFieldList = true;
382
+ }
383
+ if (needsFieldList) {
384
+ const available = Object.entries(workflowFields)
385
+ .slice(0, 20)
386
+ .map(([fid, def]) => `- "${fid}" (label: "${def.label || def.key || fid}")`);
387
+ lines.push('', 'Available field IDs:', ...available);
388
+ }
389
+ return lines.join('\n');
390
+ }
391
+ /**
392
+ * update_activity field-key validation: resolves the activity's workflow (the
393
+ * workflowId is not a tool param) via fetchActivityById → activity.process, then
394
+ * validates the fields object's keys. Fail-open on resolution problems (broken
395
+ * function fields, deleted activity, workflow missing from init) — those must not
396
+ * block updates; unknown keys in a resolved workflow still hard-error.
397
+ * Returns formatted error text, or undefined when valid or unresolvable.
398
+ */
399
+ async function validateUpdateFieldKeys(activityId, fields, context) {
400
+ if (Object.keys(fields).length === 0) {
401
+ return undefined;
402
+ }
403
+ let workflowFields;
404
+ try {
405
+ const activity = await context.hailer.fetchActivityById(activityId);
406
+ const workflow = context.init.processes?.find((proc) => proc._id === activity?.process);
407
+ workflowFields = workflow?.fields;
408
+ }
409
+ catch (error) {
410
+ logger.warn('Skipping field-key validation - could not resolve workflow for activity', {
411
+ activityId,
412
+ error: (0, tool_helpers_1.extractErrorMessage)(error),
413
+ });
414
+ return undefined;
415
+ }
416
+ if (!workflowFields) {
417
+ return undefined;
418
+ }
419
+ const keyError = validateFieldKeys(fields, workflowFields);
420
+ if (!keyError) {
421
+ return undefined;
422
+ }
423
+ return `āŒ Invalid field keys for activity ${activityId} — nothing was updated.\n\n${keyError}`;
424
+ }
279
425
  /** Auto-fix date fields: convert ISO date strings to Unix timestamps (ms).
280
426
  * If workspaceCache is available, only converts confirmed date/datetime/time fields.
281
427
  * If not available, converts any value matching ISO date format (safe — non-date fields won't have date strings). */
282
428
  function autoFixDateFields(fields, context) {
283
429
  for (const [fieldId, fieldValue] of Object.entries(fields)) {
284
- if (typeof fieldValue !== 'string' || !/^\d{4}-\d{2}-\d{2}/.test(fieldValue))
430
+ if (typeof fieldValue !== 'string' || !/^\d{4}-\d{2}-\d{2}/.test(fieldValue)) {
285
431
  continue;
432
+ }
286
433
  // Try to confirm field type from cache
287
434
  let fieldType;
288
435
  if (context.workspaceCache) {
@@ -297,15 +444,16 @@ function autoFixDateFields(fields, context) {
297
444
  // Convert if confirmed date type, OR if no cache (assume date — non-date fields won't have ISO date strings)
298
445
  if (!fieldType || fieldType === 'date' || fieldType === 'datetime' || fieldType === 'time') {
299
446
  const parsed = new Date(fieldValue.length === 10 ? fieldValue + 'T12:00:00' : fieldValue).getTime();
300
- if (!isNaN(parsed))
447
+ if (!isNaN(parsed)) {
301
448
  fields[fieldId] = parsed;
449
+ }
302
450
  }
303
451
  }
304
452
  }
305
453
  /** Build activity update object */
306
454
  function buildActivityUpdate(args, context) {
307
455
  let parsedFields = args.fields;
308
- if (typeof args.fields === "string") {
456
+ if (typeof args.fields === 'string') {
309
457
  try {
310
458
  parsedFields = JSON.parse(args.fields);
311
459
  }
@@ -314,25 +462,25 @@ function buildActivityUpdate(args, context) {
314
462
  }
315
463
  }
316
464
  // Auto-fix activitylink fields: if LLM passes an object instead of just the ID string
317
- if (parsedFields && typeof parsedFields === "object") {
465
+ if (parsedFields && typeof parsedFields === 'object') {
318
466
  for (const [fieldId, fieldValue] of Object.entries(parsedFields)) {
319
- if (fieldValue && typeof fieldValue === "object" && !Array.isArray(fieldValue)) {
467
+ if (fieldValue && typeof fieldValue === 'object' && !Array.isArray(fieldValue)) {
320
468
  const obj = fieldValue;
321
469
  let extractedId = null;
322
470
  // Case 1: {type: "activitylink", value: {_id: "...", name: "..."}}
323
- if (obj.type && obj.value && typeof obj.value === "object" && obj.value._id) {
471
+ if (obj.type && obj.value && typeof obj.value === 'object' && obj.value._id) {
324
472
  extractedId = obj.value._id;
325
473
  }
326
474
  // Case 2: {_id: "...", name: "..."}
327
- else if (obj._id && typeof obj._id === "string") {
475
+ if (!extractedId && obj._id && typeof obj._id === 'string') {
328
476
  extractedId = obj._id;
329
477
  }
330
478
  // Case 3: {value: "..."} where value is the ID string
331
- else if (obj.value && typeof obj.value === "string" && /^[a-f0-9]{24}$/i.test(obj.value)) {
479
+ if (!extractedId && obj.value && typeof obj.value === 'string' && /^[a-f0-9]{24}$/i.test(obj.value)) {
332
480
  extractedId = obj.value;
333
481
  }
334
482
  if (extractedId) {
335
- logger.warn("Auto-fixing activitylink field - extracting ID from object", {
483
+ logger.warn('Auto-fixing activitylink field - extracting ID from object', {
336
484
  fieldId,
337
485
  original: JSON.stringify(fieldValue),
338
486
  extracted: extractedId,
@@ -343,20 +491,21 @@ function buildActivityUpdate(args, context) {
343
491
  }
344
492
  }
345
493
  // Field-type aware validation and auto-fix
346
- if (parsedFields && typeof parsedFields === "object" && context.workspaceCache) {
494
+ if (parsedFields && typeof parsedFields === 'object' && context.workspaceCache) {
347
495
  autoFixDateFields(parsedFields, context);
348
496
  const invalidUsers = [];
349
497
  for (const [fieldId, fieldValue] of Object.entries(parsedFields)) {
350
498
  // Only check string values that look like IDs
351
- if (typeof fieldValue !== "string" || !/^[a-f0-9]{24}$/i.test(fieldValue)) {
499
+ if (typeof fieldValue !== 'string' || !/^[a-f0-9]{24}$/i.test(fieldValue)) {
352
500
  continue;
353
501
  }
354
502
  // Find the field definition to check its type
355
503
  let fieldType;
356
504
  for (const workflow of context.workspaceCache.rawInit.processes) {
357
505
  const workflowFields = workflow.fields;
358
- if (!workflowFields)
506
+ if (!workflowFields) {
359
507
  continue;
508
+ }
360
509
  const field = workflowFields[fieldId];
361
510
  if (field) {
362
511
  fieldType = field.type;
@@ -373,14 +522,14 @@ function buildActivityUpdate(args, context) {
373
522
  // Skip validation for 'activitylink' and other field types
374
523
  }
375
524
  if (invalidUsers.length > 0) {
376
- throw new Error(`Invalid user IDs in user fields: ${invalidUsers.join(", ")}. Use search_workspace_users to find valid user IDs.`);
525
+ throw new Error(`Invalid user IDs in user fields: ${invalidUsers.join(', ')}. Use search_workspace_users to find valid user IDs.`);
377
526
  }
378
527
  }
379
528
  return {
380
529
  _id: args.activityId,
381
530
  ...(args.name && { name: args.name }),
382
531
  ...(parsedFields &&
383
- typeof parsedFields === "object" && {
532
+ typeof parsedFields === 'object' && {
384
533
  fields: parsedFields,
385
534
  }),
386
535
  ...(args.phaseId && { phaseId: args.phaseId }),
@@ -391,22 +540,115 @@ function buildActivityUpdate(args, context) {
391
540
  */
392
541
  function formatUpdateActivityResponse(args, result) {
393
542
  const changesText = [
394
- args.name ? `- Name: "${args.name}"` : "",
395
- args.fields ? `- Fields: ${JSON.stringify(args.fields, null, 2)}` : "",
396
- args.phaseId ? `- Moved to phase: ${args.phaseId}` : "",
543
+ args.name ? `- Name: "${args.name}"` : '',
544
+ args.fields ? `- Fields: ${JSON.stringify(args.fields, null, 2)}` : '',
545
+ args.phaseId ? `- Moved to phase: ${args.phaseId}` : '',
397
546
  ]
398
547
  .filter(Boolean)
399
- .join("\n");
548
+ .join('\n');
400
549
  const responseText = `āœ… Successfully updated activity ${args.activityId}!\n\nšŸ“ Changes applied:\n${changesText}\n\nšŸ’” The activity has been updated in your Hailer workspace.\n\nAPI Response:\n${JSON.stringify(result, null, 2)}`;
401
550
  return {
402
551
  content: [
403
552
  {
404
- type: "text",
553
+ type: 'text',
405
554
  text: responseText,
406
555
  },
407
556
  ],
408
557
  };
409
558
  }
559
+ /** Bulk-mode body of update_activity — extracted so the per-item field-key validation keeps flat control flow. */
560
+ async function executeBulkUpdate(activities, context) {
561
+ logger.debug('Bulk update mode', {
562
+ activityCount: activities.length,
563
+ activities: JSON.stringify(activities, null, 2)
564
+ });
565
+ // Auto-fix common parameter name mistakes
566
+ for (const activity of activities) {
567
+ // Fix activityId -> _id
568
+ if (!activity._id && activity.activityId) {
569
+ logger.warn('Auto-fixing: activityId -> _id', { activityId: activity.activityId });
570
+ activity._id = activity.activityId;
571
+ delete activity.activityId;
572
+ }
573
+ // Fix fieldsAndValues -> fields
574
+ if (!activity.fields && activity.fieldsAndValues) {
575
+ logger.warn('Auto-fixing: fieldsAndValues -> fields', { activityId: activity._id });
576
+ activity.fields = activity.fieldsAndValues;
577
+ delete activity.fieldsAndValues;
578
+ }
579
+ }
580
+ // Validate that all activities have _id
581
+ const invalidActivities = activities.filter((act) => !act._id || typeof act._id !== 'string' || act._id.length < 24);
582
+ if (invalidActivities.length > 0) {
583
+ return {
584
+ content: [{
585
+ type: 'text',
586
+ text: `āŒ **Error: Invalid bulk update request**\n\nEach activity in the "activities" array MUST have a valid "_id" field (24-character activity ID).\n\n**What you sent:** ${JSON.stringify(activities, null, 2)}\n\n**Correct format:**\n\`\`\`json\n{\n "activities": [\n { "_id": "691ffe654217e9e8434e577c", "fields": { "fieldId": "value" } },\n { "_id": "691ffe654217e9e8434e5774", "name": "New Name" }\n ]\n}\n\`\`\`\n\n**Tip:** First use list_activities to get the activity IDs, then pass them in the _id field.`,
587
+ }],
588
+ };
589
+ }
590
+ // Build updates for each activity
591
+ const updates = activities.map((activity) => {
592
+ const activityUpdate = { _id: activity._id };
593
+ if (activity.name) {
594
+ activityUpdate.name = activity.name;
595
+ }
596
+ if (activity.fields) {
597
+ // Parse fields if string
598
+ const parsedFields = typeof activity.fields === 'string'
599
+ ? JSON.parse(activity.fields)
600
+ : activity.fields;
601
+ // Auto-fix activitylink fields: if LLM passes object with _id, extract just the ID
602
+ if (parsedFields && typeof parsedFields === 'object') {
603
+ for (const [fieldId, fieldValue] of Object.entries(parsedFields)) {
604
+ if (fieldValue &&
605
+ typeof fieldValue === 'object' &&
606
+ !Array.isArray(fieldValue) &&
607
+ '_id' in fieldValue &&
608
+ typeof fieldValue._id === 'string') {
609
+ logger.warn('Auto-fixing activitylink field in bulk mode', {
610
+ activityId: activity._id,
611
+ fieldId,
612
+ extracted: fieldValue._id,
613
+ });
614
+ parsedFields[fieldId] = fieldValue._id;
615
+ }
616
+ }
617
+ }
618
+ autoFixDateFields(parsedFields, context);
619
+ activityUpdate.fields = parsedFields;
620
+ }
621
+ return activityUpdate;
622
+ });
623
+ // Per-item field-key validation — runs AFTER the auto-fixups above
624
+ // (values only, keys unchanged; see validateFieldKeys). Resolves each
625
+ // activity's workflow first; unknown keys silently no-op server-side otherwise.
626
+ for (const update of updates) {
627
+ const keyError = update.fields ? await validateUpdateFieldKeys(update._id, update.fields, context) : undefined;
628
+ if (keyError) {
629
+ return {
630
+ content: [{ type: 'text', text: keyError }],
631
+ };
632
+ }
633
+ }
634
+ // Collect unique phase IDs (most activities will have the same phase)
635
+ const phaseIds = activities
636
+ .map((act) => act.phaseId)
637
+ .filter((pid) => pid);
638
+ const commonPhaseId = phaseIds.length > 0 ? phaseIds[0] : undefined;
639
+ // Call API with all updates
640
+ const options = commonPhaseId ? { phaseId: commonPhaseId } : undefined;
641
+ await context.hailer.updateActivities(updates, options);
642
+ // Format bulk response
643
+ return {
644
+ content: [
645
+ {
646
+ type: 'text',
647
+ text: `šŸŽ‰ Successfully updated ${activities.length} activities!\n\nšŸ“Š **Bulk Update Summary:**\n- **Total Updated**: ${activities.length} activities\n- **Status**: All activities updated successfully\n\nāœ… All activities have been updated in your Hailer workspace!`,
648
+ },
649
+ ],
650
+ };
651
+ }
410
652
  const listActivitiesDescription = `List activities (items/records/tasks) from a workflow phase.
411
653
 
412
654
  **Prerequisites:** You need workflowId, phaseId, and field IDs. Get them via:
@@ -416,18 +658,17 @@ const listActivitiesDescription = `List activities (items/records/tasks) from a
416
658
 
417
659
  **Required params:** workflowId, phaseId, fields[] (array of field IDs to return)
418
660
 
419
- **Example flow:** User says "show my tasks" →
420
- 1. list_workflows_minimal → find "Tasks" workflow
421
- 2. list_workflow_phases → find "Open" phase
422
- 3. get_workflow_schema → get field IDs
423
- 4. list_activities with those IDs`;
661
+ **Fast path:** \`countOnly: true\` returns only the workflow's total activity count (O(1), needs just workflowId — no phaseId/fields).`;
424
662
  exports.listActivitiesTool = {
425
663
  name: 'list_activities',
426
664
  group: tool_registry_1.ToolGroup.READ,
427
665
  description: listActivitiesDescription,
428
666
  schema: zod_1.z.object({
429
- workflowId: zod_1.z.string().describe("Workflow ID or key to list activities from"),
430
- phaseId: zod_1.z.string().describe("Phase ID or key to filter activities (required - use list_workflow_phases to get available phases)"),
667
+ workflowId: zod_1.z.string().describe('Workflow ID or key to list activities from'),
668
+ phaseId: zod_1.z.string().optional()
669
+ .describe('Phase ID or key to filter activities. Required unless countOnly=true. Use list_workflow_phases for phases'),
670
+ countOnly: zod_1.z.coerce.boolean().optional().default(false).describe('Fast path: return only the total activity count for the workflow (O(1) v3.activity.count). ' +
671
+ 'Needs just workflowId; phaseId/fields/filters are ignored.'),
431
672
  fields: zod_1.z.preprocess((val) => {
432
673
  if (typeof val === 'string') {
433
674
  try {
@@ -440,31 +681,35 @@ exports.listActivitiesTool = {
440
681
  }
441
682
  }
442
683
  return val;
443
- }, zod_1.z.array(zod_1.z.string()).optional()).describe("Array of field IDs or keys to return (use get_workflow_schema to see available fields). Select the fields needed for the task - use fewer fields for listings (name, status, etc.) and more fields when detailed information is required. If not provided, you must call get_workflow_schema first."),
684
+ }, zod_1.z.array(zod_1.z.string()).optional()).describe('Array of field IDs or keys to return (use get_workflow_schema to see available fields). Select the fields needed for the task - use fewer fields for listings (name, status, etc.) and more fields when detailed information is required. If not provided, you must call get_workflow_schema first.'),
444
685
  filters: zod_1.z.record(zod_1.z.object({
445
686
  operator: zod_1.z.enum([
446
- "text_search",
447
- "equals",
448
- "not_equals",
449
- "contains",
450
- "greater_than",
451
- "greater_than_or_equal",
452
- "less_than",
453
- "less_than_or_equal",
454
- "range",
455
- ]).describe("Filter operator: text_search for partial text match in field (BEST for filtering by text in relationship fields when you only have a name), equals for exact match (requires activity ID), range for date/number ranges, contains for partial text, comparison operators for numbers/dates"),
456
- value: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).optional().describe("Value to filter by - REQUIRED for text_search, equals, not_equals, contains, greater_than, less_than operators. NOT USED for range operator (use start/end instead). For text_search: use the text/name to search for. For equals: use the entity ID."),
687
+ 'text_search',
688
+ 'equals',
689
+ 'not_equals',
690
+ 'contains',
691
+ 'greater_than',
692
+ 'greater_than_or_equal',
693
+ 'less_than',
694
+ 'less_than_or_equal',
695
+ 'range',
696
+ ]).describe('Filter operator: text_search for partial text match in field (BEST for filtering by text in relationship fields when you only have a name), equals for exact match (requires activity ID), range for date/number ranges, contains for partial text, comparison operators for numbers/dates'),
697
+ value: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).optional().describe('Value to filter by - REQUIRED for text_search, equals, not_equals, contains, greater_than, less_than operators. NOT USED for range operator (use start/end instead). For text_search: use the text/name to search for. For equals: use the entity ID.'),
457
698
  start: zod_1.z.coerce.number().optional().describe("Start value - ONLY for range operator (NOT in 'value' field). Unix timestamp in milliseconds for date ranges. NOT nested in 'value'."),
458
699
  end: zod_1.z.coerce.number().optional().describe("End value - ONLY for range operator (NOT in 'value' field). Unix timestamp in milliseconds for date ranges. Example: for June 2025 date range, use end=1719791999000 directly here, NOT nested in 'value'."),
459
700
  })).optional().describe("Filter by field values. STRUCTURE: {\"fieldId\": {\"operator\": \"...\", \"value\": \"...\"}}. EXAMPLE: To find player named 'Harry Kane', use: {\"691ffdf84217e9e8434e5694\": {\"operator\": \"text_search\", \"value\": \"Harry Kane\"}}. WRONG: {\"playerName\": \"Harry Kane\"} or {\"fieldId\": \"Harry Kane\"}. Operators: text_search (partial text match), equals (exact ID match), range (use start/end instead of value)."),
460
- search: zod_1.z.string().optional().describe("Text search across activity content - USE FILTERS INSTEAD when possible for reliable results. Only use search for truly exploratory queries."),
461
- limit: zod_1.z.coerce.number().optional().default(50).describe("Maximum number of activities to return (default: 50, max: 20000)"),
462
- page: zod_1.z.coerce.number().optional().default(0).describe("Page number for pagination (0-based)"),
463
- sortBy: zod_1.z.enum(["name", "created", "updated", "priority"]).optional().default("updated").describe("Field to sort by"),
464
- sortOrder: zod_1.z.enum(["asc", "desc"]).optional().default("desc").describe("Sort direction"),
465
- includeStats: zod_1.z.coerce.boolean().optional().default(true).describe("Include total count and pagination metadata"),
701
+ search: zod_1.z.string().optional().describe('Text search across activity content - USE FILTERS INSTEAD when possible for reliable results. Only use search for truly exploratory queries.'),
702
+ limit: zod_1.z.coerce.number().optional().default(50).describe('Maximum number of activities to return (default: 50, max: 20000)'),
703
+ page: zod_1.z.coerce.number().optional().default(0).describe('Page number for pagination (0-based)'),
704
+ sortBy: zod_1.z.enum(['name', 'created', 'updated', 'priority']).optional().default('updated').describe('Field to sort by'),
705
+ sortOrder: zod_1.z.enum(['asc', 'desc']).optional().default('desc').describe('Sort direction'),
706
+ includeStats: zod_1.z.coerce.boolean().optional().default(true).describe('Include total count and pagination metadata'),
466
707
  }),
467
708
  async execute(args, context) {
709
+ // countOnly fast path — dispatches to the retired count_activities body (own error handling)
710
+ if (args.countOnly) {
711
+ return executeActivityCount(args.workflowId, context);
712
+ }
468
713
  try {
469
714
  const workflow = validateAndGetWorkflow(args.workflowId, context.init);
470
715
  const phaseId = await resolvePhaseForListing(workflow, args, context.init);
@@ -472,7 +717,7 @@ exports.listActivitiesTool = {
472
717
  return {
473
718
  content: [
474
719
  {
475
- type: "text",
720
+ type: 'text',
476
721
  text: `āŒ **Fields parameter required**: You must specify which fields to return to avoid huge responses.\n\n` +
477
722
  `šŸ“‹ **Next steps:**\n` +
478
723
  `1. Call \`get_workflow_schema\` with workflowId: "${args.workflowId}" and phaseId: "${phaseId}" to see available fields\n` +
@@ -502,7 +747,7 @@ exports.listActivitiesTool = {
502
747
  return {
503
748
  content: [
504
749
  {
505
- type: "text",
750
+ type: 'text',
506
751
  text: `āŒ **Filter Error:** ${filterErrorMessage}\n\n` +
507
752
  `šŸ’” **Valid operators:** equals, not_equals, contains, text_search, greater_than, less_than, range\n` +
508
753
  `šŸ“‹ Call \`get_workflow_schema\` to see available field IDs and types`,
@@ -542,12 +787,13 @@ exports.listActivitiesTool = {
542
787
  return response;
543
788
  }
544
789
  catch (error) {
545
- if (!request_logger_1.RequestLogger.getCurrent())
546
- logger.error("Failed to list activities", error);
790
+ if (!request_logger_1.RequestLogger.getCurrent()) {
791
+ logger.error('Failed to list activities', error);
792
+ }
547
793
  return {
548
794
  content: [
549
795
  {
550
- type: "text",
796
+ type: 'text',
551
797
  text: `āŒ Failed to list activities: ${(0, tool_helpers_1.extractErrorMessage)(error)}`,
552
798
  },
553
799
  ],
@@ -567,37 +813,38 @@ exports.showActivityByIdTool = {
567
813
  group: tool_registry_1.ToolGroup.READ,
568
814
  description: showActivityByIdDescription,
569
815
  schema: zod_1.z.object({
570
- activityId: zod_1.z.string().describe("Activity ID to load"),
816
+ activityId: zod_1.z.string().describe('Activity ID to load'),
571
817
  }),
572
818
  async execute(args, context) {
573
819
  // Validate: reject known non-activity ID patterns
574
820
  const id = args.activityId;
575
821
  if (!id || typeof id !== 'string' || id.length < 24) {
576
822
  return {
577
- content: [{ type: "text", text: `āŒ Invalid activity ID: "${id}". Activity IDs are 24-character hex strings from list_activities results. Do NOT use workflow IDs, field IDs, phase IDs, or discussion IDs.` }],
823
+ content: [{ type: 'text', text: `āŒ Invalid activity ID: "${id}". Activity IDs are 24-character hex strings from list_activities results. Do NOT use workflow IDs, field IDs, phase IDs, or discussion IDs.` }],
578
824
  };
579
825
  }
580
826
  try {
581
827
  const activity = await context.hailer.fetchActivityById(args.activityId);
582
- let responseText = `āœ… Loaded activity with ID "${activity._id}":\n\n${JSON.stringify(activity, null, 2)}`;
828
+ const responseText = `āœ… Loaded activity with ID "${activity._id}":\n\n${JSON.stringify(activity, null, 2)}`;
583
829
  return {
584
830
  content: [
585
831
  {
586
- type: "text",
832
+ type: 'text',
587
833
  text: responseText,
588
834
  },
589
835
  ],
590
836
  };
591
837
  }
592
838
  catch (error) {
593
- if (!request_logger_1.RequestLogger.getCurrent())
594
- logger.error("Failed to load activity", error, {
839
+ if (!request_logger_1.RequestLogger.getCurrent()) {
840
+ logger.error('Failed to load activity', error, {
595
841
  activityId: args.activityId,
596
842
  });
843
+ }
597
844
  return {
598
845
  content: [
599
846
  {
600
- type: "text",
847
+ type: 'text',
601
848
  text: `āŒ Failed to load activity "${args.activityId}": ${(0, tool_helpers_1.extractErrorMessage)(error)}\n\nāš ļø Make sure this is an ACTIVITY ID (from list_activities or activity._id), NOT a workflow ID, field ID, phase ID, or discussion ID.`,
602
849
  },
603
850
  ],
@@ -633,38 +880,38 @@ exports.createActivityTool = {
633
880
  schema: zod_1.z.object({
634
881
  workflowId: zod_1.z
635
882
  .string()
636
- .describe("The workflow ID or key where to create the activity/activities. Find this in any list_* tool results"),
883
+ .describe('The workflow ID or key where to create the activity/activities. Find this in any list_* tool results'),
637
884
  // BULK CREATION (optional - takes precedence over single parameters)
638
885
  activities: zod_1.z
639
886
  .array(zod_1.z.object({
640
- name: zod_1.z.string().min(1, "Activity name cannot be empty").describe("Activity name/title"),
641
- fields: zod_1.z.union([zod_1.z.record(zod_1.z.any()), zod_1.z.string()]).optional().describe("Custom field values (field keys or IDs)"),
642
- phaseId: zod_1.z.string().optional().describe("Phase ID or key for this activity"),
643
- teamId: zod_1.z.string().optional().describe("Team ID for this activity"),
644
- discussionId: zod_1.z.string().optional().describe("Link to existing discussion"),
645
- followerIds: zod_1.z.union([zod_1.z.array(zod_1.z.string()), zod_1.z.string()]).optional().describe("User IDs to invite"),
646
- fileIds: zod_1.z.union([zod_1.z.array(zod_1.z.string()), zod_1.z.string()]).optional().describe("File IDs to attach"),
887
+ name: zod_1.z.string().min(1, 'Activity name cannot be empty').describe('Activity name/title'),
888
+ fields: zod_1.z.union([zod_1.z.record(zod_1.z.any()), zod_1.z.string()]).optional().describe('Custom field values (field keys or IDs)'),
889
+ phaseId: zod_1.z.string().optional().describe('Phase ID or key for this activity'),
890
+ teamId: zod_1.z.string().optional().describe('Team ID for this activity'),
891
+ discussionId: zod_1.z.string().optional().describe('Link to existing discussion'),
892
+ followerIds: zod_1.z.union([zod_1.z.array(zod_1.z.string()), zod_1.z.string()]).optional().describe('User IDs to invite'),
893
+ fileIds: zod_1.z.union([zod_1.z.array(zod_1.z.string()), zod_1.z.string()]).optional().describe('File IDs to attach'),
647
894
  }))
648
895
  .optional()
649
- .describe("BULK: Array of activities. Example: [{\"name\": \"Task 1\", \"fields\": {...}}, {\"name\": \"Task 2\"}]. If provided, single parameters are ignored."),
896
+ .describe('BULK: Array of activities. Example: [{"name": "Task 1", "fields": {...}}, {"name": "Task 2"}]. If provided, single parameters are ignored.'),
650
897
  // SINGLE CREATION (used when 'activities' is not provided)
651
898
  name: zod_1.z
652
899
  .string()
653
- .min(1, "Activity name cannot be empty")
900
+ .min(1, 'Activity name cannot be empty')
654
901
  .optional()
655
902
  .describe("SINGLE: The activity name/title (e.g. 'šŸ¤– AI Analysis Bot', 'Customer Research Task')"),
656
903
  description: zod_1.z
657
904
  .string()
658
905
  .optional()
659
- .describe("SINGLE: Optional detailed description"),
906
+ .describe('SINGLE: Optional detailed description'),
660
907
  phaseId: zod_1.z
661
908
  .string()
662
909
  .optional()
663
- .describe("SINGLE: Optional phase/category ID or key. If not specified, uses the default phase"),
910
+ .describe('SINGLE: Optional phase/category ID or key. If not specified, uses the default phase'),
664
911
  teamId: zod_1.z
665
912
  .string()
666
913
  .optional()
667
- .describe("SINGLE: Optional team ID for team-specific activities"),
914
+ .describe('SINGLE: Optional team ID for team-specific activities'),
668
915
  fields: zod_1.z
669
916
  .union([zod_1.z.record(zod_1.z.any()), zod_1.z.string()])
670
917
  .optional()
@@ -672,20 +919,20 @@ exports.createActivityTool = {
672
919
  discussionId: zod_1.z
673
920
  .string()
674
921
  .optional()
675
- .describe("SINGLE: Optional discussion ID to link to existing conversation"),
922
+ .describe('SINGLE: Optional discussion ID to link to existing conversation'),
676
923
  followerIds: zod_1.z
677
924
  .union([zod_1.z.array(zod_1.z.string()), zod_1.z.string()])
678
925
  .optional()
679
- .describe("SINGLE: Optional array of user IDs to invite"),
926
+ .describe('SINGLE: Optional array of user IDs to invite'),
680
927
  fileIds: zod_1.z
681
928
  .union([zod_1.z.array(zod_1.z.string()), zod_1.z.string()])
682
929
  .optional()
683
- .describe("SINGLE: Optional array of file IDs to attach"),
930
+ .describe('SINGLE: Optional array of file IDs to attach'),
684
931
  }),
685
932
  async execute(args, context) {
686
933
  try {
687
934
  // DEBUG: Log raw input to diagnose LLM tool calling issues
688
- logger.debug("create_activity called", {
935
+ logger.debug('create_activity called', {
689
936
  hasName: !!args.name,
690
937
  hasActivities: !!args.activities,
691
938
  activitiesType: typeof args.activities,
@@ -701,7 +948,7 @@ exports.createActivityTool = {
701
948
  };
702
949
  if (activityData.fields) {
703
950
  let parsedFields = activityData.fields;
704
- if (typeof activityData.fields === "string" && activityData.fields.trim() !== "") {
951
+ if (typeof activityData.fields === 'string' && activityData.fields.trim() !== '') {
705
952
  try {
706
953
  parsedFields = JSON.parse(activityData.fields);
707
954
  }
@@ -710,22 +957,22 @@ exports.createActivityTool = {
710
957
  }
711
958
  }
712
959
  if (parsedFields &&
713
- typeof parsedFields === "object" &&
960
+ typeof parsedFields === 'object' &&
714
961
  Object.keys(parsedFields).length > 0) {
715
962
  autoFixDateFields(parsedFields, context);
716
963
  activity.fields = parsedFields;
717
964
  }
718
965
  }
719
- if (activityData.phaseId && activityData.phaseId.trim() !== "") {
966
+ if (activityData.phaseId && activityData.phaseId.trim() !== '') {
720
967
  activity.phaseId = activityData.phaseId;
721
968
  }
722
- if (activityData.teamId && activityData.teamId.trim() !== "") {
969
+ if (activityData.teamId && activityData.teamId.trim() !== '') {
723
970
  activity.teamId = activityData.teamId;
724
971
  }
725
972
  if (activityData.followerIds) {
726
973
  let parsedFollowerIds = activityData.followerIds;
727
- if (typeof activityData.followerIds === "string" &&
728
- activityData.followerIds.trim() !== "") {
974
+ if (typeof activityData.followerIds === 'string' &&
975
+ activityData.followerIds.trim() !== '') {
729
976
  try {
730
977
  parsedFollowerIds = JSON.parse(activityData.followerIds);
731
978
  }
@@ -744,7 +991,7 @@ exports.createActivityTool = {
744
991
  }
745
992
  }
746
993
  if (invalidUsers.length > 0) {
747
- throw new Error(`Invalid user IDs in followerIds: ${invalidUsers.join(", ")}. Use search_workspace_users to find valid user IDs.`);
994
+ throw new Error(`Invalid user IDs in followerIds: ${invalidUsers.join(', ')}. Use search_workspace_users to find valid user IDs.`);
748
995
  }
749
996
  }
750
997
  activity.followerIds = parsedFollowerIds;
@@ -752,8 +999,8 @@ exports.createActivityTool = {
752
999
  }
753
1000
  if (activityData.fileIds) {
754
1001
  let parsedFileIds = activityData.fileIds;
755
- if (typeof activityData.fileIds === "string" &&
756
- activityData.fileIds.trim() !== "") {
1002
+ if (typeof activityData.fileIds === 'string' &&
1003
+ activityData.fileIds.trim() !== '') {
757
1004
  try {
758
1005
  parsedFileIds = JSON.parse(activityData.fileIds);
759
1006
  }
@@ -791,7 +1038,7 @@ exports.createActivityTool = {
791
1038
  }
792
1039
  }
793
1040
  let activitiesToCreate;
794
- let options = {
1041
+ const options = {
795
1042
  returnDocument: true,
796
1043
  };
797
1044
  if (isBulk) {
@@ -810,7 +1057,7 @@ exports.createActivityTool = {
810
1057
  return activity;
811
1058
  });
812
1059
  // Check for common discussionId in bulk
813
- if (args.discussionId && args.discussionId.trim() !== "") {
1060
+ if (args.discussionId && args.discussionId.trim() !== '') {
814
1061
  options.discussionId = args.discussionId;
815
1062
  }
816
1063
  }
@@ -819,7 +1066,7 @@ exports.createActivityTool = {
819
1066
  if (!args.name) {
820
1067
  throw new Error("Either 'activities' array or 'name' parameter is required");
821
1068
  }
822
- logger.debug("Creating single activity", {
1069
+ logger.debug('Creating single activity', {
823
1070
  workflowId: args.workflowId,
824
1071
  name: args.name,
825
1072
  defaultTeamId: defaultTeamId,
@@ -830,12 +1077,29 @@ exports.createActivityTool = {
830
1077
  activity.teamId = defaultTeamId;
831
1078
  }
832
1079
  activitiesToCreate = [activity];
833
- if (args.discussionId && args.discussionId.trim() !== "") {
1080
+ if (args.discussionId && args.discussionId.trim() !== '') {
834
1081
  options.discussionId = args.discussionId;
835
1082
  }
836
1083
  }
1084
+ // Pre-validate field keys before API call — runs AFTER processActivity's
1085
+ // auto-fixups (values only, keys unchanged; see validateFieldKeys).
1086
+ // Unknown keys (e.g. field NAMES) silently no-op server-side.
1087
+ const workflow = context.init.processes?.find((proc) => proc._id === args.workflowId);
1088
+ const workflowFieldDefs = workflow?.fields;
1089
+ for (let i = 0; i < activitiesToCreate.length; i++) {
1090
+ const item = activitiesToCreate[i];
1091
+ const keyError = workflowFieldDefs && item.fields ? validateFieldKeys(item.fields, workflowFieldDefs) : undefined;
1092
+ if (keyError) {
1093
+ const itemName = item.name || `Activity ${i + 1}`;
1094
+ return {
1095
+ content: [{
1096
+ type: 'text',
1097
+ text: `āŒ Invalid field keys in "${itemName}" — nothing was created.\n\n${keyError}`,
1098
+ }],
1099
+ };
1100
+ }
1101
+ }
837
1102
  // Pre-validate required fields before API call
838
- const workflow = context.init.processes?.find((p) => p._id === args.workflowId);
839
1103
  if (workflow?.fields) {
840
1104
  const requiredFields = [];
841
1105
  for (const [fieldId, field] of Object.entries(workflow.fields)) {
@@ -864,7 +1128,7 @@ exports.createActivityTool = {
864
1128
  const fieldList = requiredFields.map(f => `- ${f.label} (key: ${f.key}, id: ${f.id})`).join('\n');
865
1129
  return {
866
1130
  content: [{
867
- type: "text",
1131
+ type: 'text',
868
1132
  text: `āŒ Missing required fields - cannot create activities.\n\n**Required fields for this workflow:**\n${fieldList}\n\n**Activities with missing fields:**\n${missingByActivity.map(m => `- ${m}`).join('\n')}\n\nšŸ’” Add the missing fields to each activity's \`fields\` object using either the field key or ID.`,
869
1133
  }],
870
1134
  };
@@ -891,7 +1155,7 @@ exports.createActivityTool = {
891
1155
  return {
892
1156
  content: [
893
1157
  {
894
- type: "text",
1158
+ type: 'text',
895
1159
  text: responseText,
896
1160
  },
897
1161
  ],
@@ -922,7 +1186,7 @@ exports.createActivityTool = {
922
1186
  return {
923
1187
  content: [
924
1188
  {
925
- type: "text",
1189
+ type: 'text',
926
1190
  text: responseText,
927
1191
  },
928
1192
  ],
@@ -930,11 +1194,12 @@ exports.createActivityTool = {
930
1194
  }
931
1195
  }
932
1196
  catch (error) {
933
- if (!request_logger_1.RequestLogger.getCurrent())
934
- logger.error("Failed to create activity/activities", error, {
1197
+ if (!request_logger_1.RequestLogger.getCurrent()) {
1198
+ logger.error('Failed to create activity/activities', error, {
935
1199
  workflowId: args.workflowId,
936
1200
  isBulk: !!(args.activities && args.activities.length > 0),
937
1201
  });
1202
+ }
938
1203
  const errorMessage = error instanceof Error
939
1204
  ? error.message
940
1205
  : (typeof error === 'object' && error !== null)
@@ -943,7 +1208,7 @@ exports.createActivityTool = {
943
1208
  return {
944
1209
  content: [
945
1210
  {
946
- type: "text",
1211
+ type: 'text',
947
1212
  text: `āŒ Error creating activity: ${errorMessage}\n\nšŸ’” Troubleshooting Tips:\n- Verify the workflowId exists and is accessible\n- Check that you have permission to create activities in this workflow\n- Ensure field IDs in the fields object match the workflow's field definitions\n- Use search_workspace_users to find valid user IDs for assignment\n- Verify user IDs in followerIds exist and are accessible`,
948
1213
  },
949
1214
  ],
@@ -976,9 +1241,9 @@ exports.updateActivityTool = {
976
1241
  schema: zod_1.z.object({
977
1242
  // BULK: Array of activities to update
978
1243
  activities: zod_1.z
979
- .preprocess((val) => (typeof val === "string" ? JSON.parse(val) : val), zod_1.z
1244
+ .preprocess((val) => (typeof val === 'string' ? JSON.parse(val) : val), zod_1.z
980
1245
  .array(zod_1.z.object({
981
- _id: zod_1.z.string().min(24, "Activity ID must be at least 24 characters"),
1246
+ _id: zod_1.z.string().min(24, 'Activity ID must be at least 24 characters'),
982
1247
  name: zod_1.z.string().optional(),
983
1248
  fields: zod_1.z.record(zod_1.z.any()).optional(),
984
1249
  phaseId: zod_1.z.string().optional(),
@@ -989,10 +1254,10 @@ exports.updateActivityTool = {
989
1254
  // SINGLE: Individual activity parameters
990
1255
  activityId: zod_1.z
991
1256
  .string()
992
- .min(24, "Activity ID must be at least 24 characters")
1257
+ .min(24, 'Activity ID must be at least 24 characters')
993
1258
  .optional()
994
- .describe("SINGLE: The unique ID of the activity to update (works for any workflow)"),
995
- name: zod_1.z.string().optional().describe("SINGLE: New activity title/name"),
1259
+ .describe('SINGLE: The unique ID of the activity to update (works for any workflow)'),
1260
+ name: zod_1.z.string().optional().describe('SINGLE: New activity title/name'),
996
1261
  fields: zod_1.z
997
1262
  .union([zod_1.z.record(zod_1.z.any()), zod_1.z.string()])
998
1263
  .optional()
@@ -1000,97 +1265,20 @@ exports.updateActivityTool = {
1000
1265
  phaseId: zod_1.z
1001
1266
  .string()
1002
1267
  .optional()
1003
- .describe("SINGLE: Optional phase ID or key to move the activity to"),
1268
+ .describe('SINGLE: Optional phase ID or key to move the activity to'),
1004
1269
  }),
1005
1270
  async execute(args, context) {
1006
1271
  try {
1007
1272
  // BULK MODE: Update multiple activities
1008
1273
  if (args.activities && Array.isArray(args.activities)) {
1009
- logger.debug("Bulk update mode", {
1010
- activityCount: args.activities.length,
1011
- activities: JSON.stringify(args.activities, null, 2)
1012
- });
1013
- // Auto-fix common parameter name mistakes
1014
- for (const activity of args.activities) {
1015
- // Fix activityId -> _id
1016
- if (!activity._id && activity.activityId) {
1017
- logger.warn("Auto-fixing: activityId -> _id", { activityId: activity.activityId });
1018
- activity._id = activity.activityId;
1019
- delete activity.activityId;
1020
- }
1021
- // Fix fieldsAndValues -> fields
1022
- if (!activity.fields && activity.fieldsAndValues) {
1023
- logger.warn("Auto-fixing: fieldsAndValues -> fields", { activityId: activity._id });
1024
- activity.fields = activity.fieldsAndValues;
1025
- delete activity.fieldsAndValues;
1026
- }
1027
- }
1028
- // Validate that all activities have _id
1029
- const invalidActivities = args.activities.filter((a) => !a._id || typeof a._id !== 'string' || a._id.length < 24);
1030
- if (invalidActivities.length > 0) {
1031
- return {
1032
- content: [{
1033
- type: "text",
1034
- text: `āŒ **Error: Invalid bulk update request**\n\nEach activity in the "activities" array MUST have a valid "_id" field (24-character activity ID).\n\n**What you sent:** ${JSON.stringify(args.activities, null, 2)}\n\n**Correct format:**\n\`\`\`json\n{\n "activities": [\n { "_id": "691ffe654217e9e8434e577c", "fields": { "fieldId": "value" } },\n { "_id": "691ffe654217e9e8434e5774", "name": "New Name" }\n ]\n}\n\`\`\`\n\n**Tip:** First use list_activities to get the activity IDs, then pass them in the _id field.`,
1035
- }],
1036
- };
1037
- }
1038
- // Build updates for each activity
1039
- const updates = args.activities.map((activity) => {
1040
- const activityUpdate = { _id: activity._id };
1041
- if (activity.name)
1042
- activityUpdate.name = activity.name;
1043
- if (activity.fields) {
1044
- // Parse fields if string
1045
- let parsedFields = typeof activity.fields === 'string'
1046
- ? JSON.parse(activity.fields)
1047
- : activity.fields;
1048
- // Auto-fix activitylink fields: if LLM passes object with _id, extract just the ID
1049
- if (parsedFields && typeof parsedFields === "object") {
1050
- for (const [fieldId, fieldValue] of Object.entries(parsedFields)) {
1051
- if (fieldValue &&
1052
- typeof fieldValue === "object" &&
1053
- !Array.isArray(fieldValue) &&
1054
- "_id" in fieldValue &&
1055
- typeof fieldValue._id === "string") {
1056
- logger.warn("Auto-fixing activitylink field in bulk mode", {
1057
- activityId: activity._id,
1058
- fieldId,
1059
- extracted: fieldValue._id,
1060
- });
1061
- parsedFields[fieldId] = fieldValue._id;
1062
- }
1063
- }
1064
- }
1065
- autoFixDateFields(parsedFields, context);
1066
- activityUpdate.fields = parsedFields;
1067
- }
1068
- return activityUpdate;
1069
- });
1070
- // Collect unique phase IDs (most activities will have the same phase)
1071
- const phaseIds = args.activities
1072
- .map((a) => a.phaseId)
1073
- .filter((p) => p);
1074
- const commonPhaseId = phaseIds.length > 0 ? phaseIds[0] : undefined;
1075
- // Call API with all updates
1076
- const options = commonPhaseId ? { phaseId: commonPhaseId } : undefined;
1077
- await context.hailer.updateActivities(updates, options);
1078
- // Format bulk response
1079
- return {
1080
- content: [
1081
- {
1082
- type: "text",
1083
- text: `šŸŽ‰ Successfully updated ${args.activities.length} activities!\n\nšŸ“Š **Bulk Update Summary:**\n- **Total Updated**: ${args.activities.length} activities\n- **Status**: All activities updated successfully\n\nāœ… All activities have been updated in your Hailer workspace!`,
1084
- },
1085
- ],
1086
- };
1274
+ return await executeBulkUpdate(args.activities, context);
1087
1275
  }
1088
1276
  // SINGLE MODE: Update one activity
1089
1277
  // Validate activityId is provided for single mode
1090
1278
  if (!args.activityId || typeof args.activityId !== 'string' || args.activityId.length < 24) {
1091
1279
  return {
1092
1280
  content: [{
1093
- type: "text",
1281
+ type: 'text',
1094
1282
  text: `āŒ **Error: Missing or invalid activityId**\n\nFor single activity updates, you must provide a valid "activityId" (24-character hex string).\n\n**What you sent:** activityId = ${JSON.stringify(args.activityId)}\n\n**Correct format:**\n\`\`\`json\n{\n "activityId": "691ffe654217e9e8434e577c",\n "name": "New Name",\n "fields": { "fieldId": "value" }\n}\n\`\`\`\n\n**For bulk updates (3+ activities), use:**\n\`\`\`json\n{\n "activities": [\n { "_id": "activity-id-1", "fields": {...} },\n { "_id": "activity-id-2", "name": "New Name" }\n ]\n}\n\`\`\`\n\n**Tip:** Use list_activities or show_activity_by_id to find activity IDs first.`,
1095
1283
  }],
1096
1284
  };
@@ -1099,32 +1287,44 @@ exports.updateActivityTool = {
1099
1287
  if (!args.name && !args.fields && !args.phaseId) {
1100
1288
  return {
1101
1289
  content: [{
1102
- type: "text",
1290
+ type: 'text',
1103
1291
  text: `āŒ **Error: No update data provided**\n\nYou called update_activity with activityId="${args.activityId}" but didn't provide any data to update.\n\n**You must provide at least one of:**\n- "name" - to update the activity name\n- "fields" - to update field values\n- "phaseId" - to move to a different phase\n\n**Example:**\n\`\`\`json\n{\n "activityId": "${args.activityId}",\n "fields": {\n "fieldId123": "new value"\n }\n}\n\`\`\``,
1104
1292
  }],
1105
1293
  };
1106
1294
  }
1107
- logger.debug("Single update mode", {
1295
+ logger.debug('Single update mode', {
1108
1296
  activityId: args.activityId,
1109
1297
  name: args.name,
1110
1298
  fields: JSON.stringify(args.fields, null, 2),
1111
1299
  phaseId: args.phaseId
1112
1300
  });
1113
1301
  const updates = buildActivityUpdate(args, context);
1302
+ // Field-key validation — runs AFTER buildActivityUpdate's auto-fixups
1303
+ // (values only, keys unchanged; see validateFieldKeys), right before the
1304
+ // API call. Unknown keys (e.g. field NAMES) silently no-op server-side.
1305
+ const singleKeyError = updates.fields
1306
+ ? await validateUpdateFieldKeys(args.activityId, updates.fields, context)
1307
+ : undefined;
1308
+ if (singleKeyError) {
1309
+ return {
1310
+ content: [{ type: 'text', text: singleKeyError }],
1311
+ };
1312
+ }
1114
1313
  const options = args.phaseId ? { phaseId: args.phaseId } : undefined;
1115
1314
  const result = await context.hailer.updateActivities([updates], options);
1116
1315
  return formatUpdateActivityResponse(args, result);
1117
1316
  }
1118
1317
  catch (error) {
1119
- if (!request_logger_1.RequestLogger.getCurrent())
1120
- logger.error("Failed to update activity", error, {
1318
+ if (!request_logger_1.RequestLogger.getCurrent()) {
1319
+ logger.error('Failed to update activity', error, {
1121
1320
  activityId: args.activityId || 'bulk',
1122
1321
  activityCount: args.activities?.length,
1123
1322
  });
1323
+ }
1124
1324
  return {
1125
1325
  content: [
1126
1326
  {
1127
- type: "text",
1327
+ type: 'text',
1128
1328
  text: `āŒ Error updating ${args.activities ? 'activities' : 'activity'}: ${error instanceof Error ? error.message : String(error)}`,
1129
1329
  },
1130
1330
  ],