@hailer/mcp 1.1.16 → 1.1.17-beta.0

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 (313) hide show
  1. package/.claude/CLAUDE.md +117 -320
  2. package/.claude/commands/app-squad.md +86 -90
  3. package/.claude/commands/audit-squad.md +19 -19
  4. package/.claude/commands/autoplan.md +3 -3
  5. package/.claude/commands/cleanup-squad.md +16 -16
  6. package/.claude/commands/config-squad.md +30 -30
  7. package/.claude/commands/crud-squad.md +23 -23
  8. package/.claude/commands/data-squad.md +21 -21
  9. package/.claude/commands/debug-squad.md +44 -44
  10. package/.claude/commands/doc-squad.md +16 -16
  11. package/.claude/commands/help:agents.md +130 -99
  12. package/.claude/commands/help:commands.md +15 -15
  13. package/.claude/commands/help:faq.md +17 -17
  14. package/.claude/commands/help:plugins.md +1 -1
  15. package/.claude/commands/help:skills.md +18 -24
  16. package/.claude/commands/hotfix-squad.md +22 -22
  17. package/.claude/commands/integration-squad.md +22 -22
  18. package/.claude/commands/janitor-squad.md +31 -31
  19. package/.claude/commands/learn-auto.md +5 -5
  20. package/.claude/commands/learn.md +12 -20
  21. package/.claude/commands/onboard-squad.md +39 -49
  22. package/.claude/commands/plan-workspace.md +2 -2
  23. package/.claude/commands/publish.md +32 -37
  24. package/.claude/commands/review-squad.md +27 -27
  25. package/.claude/commands/stats.md +26 -12
  26. package/.claude/commands/swarm.md +25 -25
  27. package/.claude/skills/chrome-mcp-reference/SKILL.md +5 -0
  28. package/.claude/skills/hailer-api-client/SKILL.md +55 -16
  29. package/.claude/skills/hailer-app-builder/SKILL.md +4 -270
  30. package/.claude/skills/hailer-apps-pictures/SKILL.md +3 -3
  31. package/.claude/skills/hailer-design-system/SKILL.md +96 -4
  32. package/.claude/skills/hailer-monolith-automations/SKILL.md +138 -116
  33. package/.claude/skills/hailer-permissions-system/SKILL.md +6 -9
  34. package/.claude/skills/hailer-project-protocol/SKILL.md +20 -110
  35. package/.claude/skills/integration-patterns/SKILL.md +6 -6
  36. package/.claude/skills/lsp-setup/SKILL.md +8 -9
  37. package/.claude/skills/sdk-activity-patterns/SKILL.md +238 -0
  38. package/.claude/skills/{SDK-document-templates → sdk-document-templates}/SKILL.md +13 -340
  39. package/.claude/skills/{SDK-function-fields → sdk-function-fields}/SKILL.md +8 -40
  40. package/.claude/skills/{SDK-insight-queries → sdk-insight-queries}/SKILL.md +114 -392
  41. package/.claude/skills/{SDK-ws-config-skill → sdk-ws-config-skill}/SKILL.md +79 -310
  42. package/.claude/skills/zapier-hailer-patterns/SKILL.md +84 -361
  43. package/.opencode/package-lock.json +117 -0
  44. package/CLAUDE.md +5 -358
  45. package/dist/app.d.ts.map +1 -1
  46. package/dist/app.js +10 -127
  47. package/dist/app.js.map +1 -1
  48. package/dist/bot/bot-manager.d.ts +3 -14
  49. package/dist/bot/bot-manager.d.ts.map +1 -1
  50. package/dist/bot/bot-manager.js +13 -4
  51. package/dist/bot/bot-manager.js.map +1 -1
  52. package/dist/bot/bot.d.ts +23 -102
  53. package/dist/bot/bot.d.ts.map +1 -1
  54. package/dist/bot/bot.js +356 -1212
  55. package/dist/bot/bot.js.map +1 -1
  56. package/dist/bot/services/bot-permissions.d.ts +50 -0
  57. package/dist/bot/services/bot-permissions.d.ts.map +1 -0
  58. package/dist/bot/services/bot-permissions.js +198 -0
  59. package/dist/bot/services/bot-permissions.js.map +1 -0
  60. package/dist/bot/services/index.d.ts +4 -2
  61. package/dist/bot/services/index.d.ts.map +1 -1
  62. package/dist/bot/services/index.js +10 -5
  63. package/dist/bot/services/index.js.map +1 -1
  64. package/dist/bot/services/message-classifier.d.ts +1 -1
  65. package/dist/bot/services/message-classifier.d.ts.map +1 -1
  66. package/dist/bot/services/message-classifier.js.map +1 -1
  67. package/dist/bot/services/signal-router.d.ts +32 -0
  68. package/dist/bot/services/signal-router.d.ts.map +1 -0
  69. package/dist/bot/services/signal-router.js +132 -0
  70. package/dist/bot/services/signal-router.js.map +1 -0
  71. package/dist/bot/services/system-prompt.d.ts +12 -0
  72. package/dist/bot/services/system-prompt.d.ts.map +1 -0
  73. package/dist/bot/services/system-prompt.js +93 -0
  74. package/dist/bot/services/system-prompt.js.map +1 -0
  75. package/dist/bot/services/types.d.ts +7 -34
  76. package/dist/bot/services/types.d.ts.map +1 -1
  77. package/dist/bot/services/types.js +0 -3
  78. package/dist/bot/services/types.js.map +1 -1
  79. package/dist/bot/services/workspace-refresh.d.ts +47 -0
  80. package/dist/bot/services/workspace-refresh.d.ts.map +1 -0
  81. package/dist/bot/services/workspace-refresh.js +154 -0
  82. package/dist/bot/services/workspace-refresh.js.map +1 -0
  83. package/dist/bot-config/constants.d.ts +0 -36
  84. package/dist/bot-config/constants.d.ts.map +1 -1
  85. package/dist/bot-config/constants.js +1 -76
  86. package/dist/bot-config/constants.js.map +1 -1
  87. package/dist/bot-config/context.d.ts +2 -42
  88. package/dist/bot-config/context.d.ts.map +1 -1
  89. package/dist/bot-config/context.js +13 -134
  90. package/dist/bot-config/context.js.map +1 -1
  91. package/dist/bot-config/index.d.ts +6 -15
  92. package/dist/bot-config/index.d.ts.map +1 -1
  93. package/dist/bot-config/index.js +5 -80
  94. package/dist/bot-config/index.js.map +1 -1
  95. package/dist/bot-config/loader.d.ts +16 -4
  96. package/dist/bot-config/loader.d.ts.map +1 -1
  97. package/dist/bot-config/loader.js +187 -96
  98. package/dist/bot-config/loader.js.map +1 -1
  99. package/dist/bot-config/persistence.d.ts +1 -52
  100. package/dist/bot-config/persistence.d.ts.map +1 -1
  101. package/dist/bot-config/persistence.js +3 -213
  102. package/dist/bot-config/persistence.js.map +1 -1
  103. package/dist/bot-config/state.d.ts +0 -41
  104. package/dist/bot-config/state.d.ts.map +1 -1
  105. package/dist/bot-config/state.js +0 -151
  106. package/dist/bot-config/state.js.map +1 -1
  107. package/dist/bot-config/tools.d.ts +1 -1
  108. package/dist/bot-config/tools.js +27 -27
  109. package/dist/bot-config/tools.js.map +1 -1
  110. package/dist/bot-config/types.d.ts +39 -32
  111. package/dist/bot-config/types.d.ts.map +1 -1
  112. package/dist/bot-config/types.js +0 -3
  113. package/dist/bot-config/types.js.map +1 -1
  114. package/dist/bot-config/webhooks.d.ts +0 -4
  115. package/dist/bot-config/webhooks.d.ts.map +1 -1
  116. package/dist/bot-config/webhooks.js +0 -13
  117. package/dist/bot-config/webhooks.js.map +1 -1
  118. package/dist/commands/seed-config.js +16 -31
  119. package/dist/commands/seed-config.js.map +1 -1
  120. package/dist/config.d.ts +0 -9
  121. package/dist/config.d.ts.map +1 -1
  122. package/dist/config.js +0 -15
  123. package/dist/config.js.map +1 -1
  124. package/dist/mcp/hailer-clients.js +2 -2
  125. package/dist/mcp/hailer-clients.js.map +1 -1
  126. package/dist/mcp/tool-registry.d.ts +10 -115
  127. package/dist/mcp/tool-registry.d.ts.map +1 -1
  128. package/dist/mcp/tool-registry.js +39 -363
  129. package/dist/mcp/tool-registry.js.map +1 -1
  130. package/dist/mcp/tools/activity.d.ts +3 -0
  131. package/dist/mcp/tools/activity.d.ts.map +1 -1
  132. package/dist/mcp/tools/activity.js +8 -1
  133. package/dist/mcp/tools/activity.js.map +1 -1
  134. package/dist/mcp/tools/app-core.d.ts +3 -0
  135. package/dist/mcp/tools/app-core.d.ts.map +1 -1
  136. package/dist/mcp/tools/app-core.js +9 -2
  137. package/dist/mcp/tools/app-core.js.map +1 -1
  138. package/dist/mcp/tools/app-marketplace.d.ts +3 -0
  139. package/dist/mcp/tools/app-marketplace.d.ts.map +1 -1
  140. package/dist/mcp/tools/app-marketplace.js +13 -1
  141. package/dist/mcp/tools/app-marketplace.js.map +1 -1
  142. package/dist/mcp/tools/app-member.d.ts +3 -0
  143. package/dist/mcp/tools/app-member.d.ts.map +1 -1
  144. package/dist/mcp/tools/app-member.js +6 -1
  145. package/dist/mcp/tools/app-member.js.map +1 -1
  146. package/dist/mcp/tools/app-scaffold.d.ts +3 -0
  147. package/dist/mcp/tools/app-scaffold.d.ts.map +1 -1
  148. package/dist/mcp/tools/app-scaffold.js +15 -11
  149. package/dist/mcp/tools/app-scaffold.js.map +1 -1
  150. package/dist/mcp/tools/company.d.ts +3 -0
  151. package/dist/mcp/tools/company.d.ts.map +1 -1
  152. package/dist/mcp/tools/company.js +5 -1
  153. package/dist/mcp/tools/company.js.map +1 -1
  154. package/dist/mcp/tools/discussion.d.ts +3 -0
  155. package/dist/mcp/tools/discussion.d.ts.map +1 -1
  156. package/dist/mcp/tools/discussion.js +13 -2
  157. package/dist/mcp/tools/discussion.js.map +1 -1
  158. package/dist/mcp/tools/file.d.ts +3 -0
  159. package/dist/mcp/tools/file.d.ts.map +1 -1
  160. package/dist/mcp/tools/file.js +6 -1
  161. package/dist/mcp/tools/file.js.map +1 -1
  162. package/dist/mcp/tools/index.d.ts +7 -0
  163. package/dist/mcp/tools/index.d.ts.map +1 -0
  164. package/dist/mcp/tools/index.js +34 -0
  165. package/dist/mcp/tools/index.js.map +1 -0
  166. package/dist/mcp/tools/insight.d.ts +3 -0
  167. package/dist/mcp/tools/insight.d.ts.map +1 -1
  168. package/dist/mcp/tools/insight.js +18 -8
  169. package/dist/mcp/tools/insight.js.map +1 -1
  170. package/dist/mcp/tools/user.d.ts +3 -0
  171. package/dist/mcp/tools/user.d.ts.map +1 -1
  172. package/dist/mcp/tools/user.js +6 -1
  173. package/dist/mcp/tools/user.js.map +1 -1
  174. package/dist/mcp/tools/workflow-permissions.d.ts +3 -0
  175. package/dist/mcp/tools/workflow-permissions.d.ts.map +1 -1
  176. package/dist/mcp/tools/workflow-permissions.js +8 -1
  177. package/dist/mcp/tools/workflow-permissions.js.map +1 -1
  178. package/dist/mcp/tools/workflow.d.ts +3 -0
  179. package/dist/mcp/tools/workflow.d.ts.map +1 -1
  180. package/dist/mcp/tools/workflow.js +29 -28
  181. package/dist/mcp/tools/workflow.js.map +1 -1
  182. package/dist/mcp/utils/index.d.ts +4 -11
  183. package/dist/mcp/utils/index.d.ts.map +1 -1
  184. package/dist/mcp/utils/index.js +5 -36
  185. package/dist/mcp/utils/index.js.map +1 -1
  186. package/dist/mcp/utils/role-utils.d.ts +0 -32
  187. package/dist/mcp/utils/role-utils.d.ts.map +1 -1
  188. package/dist/mcp/utils/role-utils.js +0 -73
  189. package/dist/mcp/utils/role-utils.js.map +1 -1
  190. package/dist/mcp/utils/tool-helpers.d.ts +0 -25
  191. package/dist/mcp/utils/tool-helpers.d.ts.map +1 -1
  192. package/dist/mcp/utils/tool-helpers.js +0 -34
  193. package/dist/mcp/utils/tool-helpers.js.map +1 -1
  194. package/dist/mcp/webhook-handler.d.ts +4 -34
  195. package/dist/mcp/webhook-handler.d.ts.map +1 -1
  196. package/dist/mcp/webhook-handler.js +57 -74
  197. package/dist/mcp/webhook-handler.js.map +1 -1
  198. package/dist/mcp-server.d.ts.map +1 -1
  199. package/dist/mcp-server.js +3 -78
  200. package/dist/mcp-server.js.map +1 -1
  201. package/package.json +1 -2
  202. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  203. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  204. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  205. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  206. package/.claude/agents/agent-code-simplifier.md +0 -53
  207. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  208. package/.claude/agents/agent-giuseppe-app-builder.md +0 -208
  209. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  210. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  211. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  212. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  213. package/.claude/agents/agent-ivan-monolith.md +0 -154
  214. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  215. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  216. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  217. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  218. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  219. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  220. package/.claude/agents/agent-permissions-handler.md +0 -208
  221. package/.claude/agents/agent-simple-writer.md +0 -48
  222. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  223. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  224. package/.claude/agents/agent-ui-designer.md +0 -100
  225. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  226. package/.claude/agents/agent-web-search.md +0 -55
  227. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  228. package/.claude/agents/agent-zara-zapier.md +0 -159
  229. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  230. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  231. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  232. package/.claude/skills/agent-structure/SKILL.md +0 -98
  233. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  234. package/.claude/skills/frontend-design/SKILL.md +0 -254
  235. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  236. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  237. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  238. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  239. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  240. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  241. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  242. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  243. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  244. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  245. package/.claude/skills/json-only-output/SKILL.md +0 -72
  246. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  247. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  248. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  249. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  250. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  251. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  252. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  253. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  254. package/.opencode/agent/agent-code-simplifier.md +0 -31
  255. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  256. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  257. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  258. package/.opencode/agent/agent-helga-workflow-config.md +0 -204
  259. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  260. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  261. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  262. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  263. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  264. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  265. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  266. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  267. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  268. package/.opencode/agent/agent-permissions-handler.md +0 -50
  269. package/.opencode/agent/agent-simple-writer.md +0 -45
  270. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  271. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  272. package/.opencode/agent/agent-ui-designer.md +0 -56
  273. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  274. package/.opencode/agent/agent-web-search.md +0 -42
  275. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  276. package/.opencode/agent/agent-zara-zapier.md +0 -53
  277. package/.opencode/commands/app-squad.md +0 -135
  278. package/.opencode/commands/audit-squad.md +0 -158
  279. package/.opencode/commands/autoplan.md +0 -563
  280. package/.opencode/commands/cleanup-squad.md +0 -98
  281. package/.opencode/commands/config-squad.md +0 -106
  282. package/.opencode/commands/crud-squad.md +0 -87
  283. package/.opencode/commands/data-squad.md +0 -97
  284. package/.opencode/commands/debug-squad.md +0 -303
  285. package/.opencode/commands/doc-squad.md +0 -65
  286. package/.opencode/commands/handoff.md +0 -137
  287. package/.opencode/commands/health.md +0 -49
  288. package/.opencode/commands/help-agents.md +0 -151
  289. package/.opencode/commands/help-commands.md +0 -32
  290. package/.opencode/commands/help-faq.md +0 -29
  291. package/.opencode/commands/help-plugins.md +0 -28
  292. package/.opencode/commands/help-skills.md +0 -7
  293. package/.opencode/commands/help-tools.md +0 -40
  294. package/.opencode/commands/help.md +0 -28
  295. package/.opencode/commands/hotfix-squad.md +0 -112
  296. package/.opencode/commands/integration-squad.md +0 -82
  297. package/.opencode/commands/janitor-squad.md +0 -167
  298. package/.opencode/commands/learn-auto.md +0 -120
  299. package/.opencode/commands/learn.md +0 -120
  300. package/.opencode/commands/mcp-list.md +0 -27
  301. package/.opencode/commands/onboard-squad.md +0 -140
  302. package/.opencode/commands/plan-workspace.md +0 -732
  303. package/.opencode/commands/prd.md +0 -131
  304. package/.opencode/commands/project-status.md +0 -82
  305. package/.opencode/commands/publish.md +0 -138
  306. package/.opencode/commands/recap.md +0 -69
  307. package/.opencode/commands/restore.md +0 -64
  308. package/.opencode/commands/review-squad.md +0 -152
  309. package/.opencode/commands/save.md +0 -24
  310. package/.opencode/commands/stats.md +0 -19
  311. package/.opencode/commands/swarm.md +0 -210
  312. package/.opencode/commands/tool-builder.md +0 -39
  313. package/.opencode/commands/ws-pull.md +0 -44
@@ -1,45 +0,0 @@
1
- ---
2
- name: agent-yevgeni-discussions
3
- description: Handles Hailer discussions - reading, posting, membership.
4
- model: haiku
5
- tools: mcp__hailer__list_my_discussions, mcp__hailer__fetch_discussion_messages, mcp__hailer__fetch_previous_discussion_messages, mcp__hailer__add_discussion_message, mcp__hailer__join_discussion, mcp__hailer__leave_discussion, mcp__hailer__invite_discussion_members, mcp__hailer__get_activity_from_discussion, mcp__hailer__search_workspace_users
6
- skills:
7
- - optional-parameters
8
- ---
9
-
10
- <identity>
11
- I am Yevgeni. I protect master's communications. Few words, all action. Output JSON. Full stop.
12
- </identity>
13
-
14
- <handles>
15
- - Read discussion threads
16
- - Post messages
17
- - Invite/remove members
18
- - Find activity from discussion ID
19
- - List all discussions
20
- </handles>
21
-
22
- <skills>
23
- Core skills are auto-injected by SubagentStart hook — already in your context.
24
- </skills>
25
-
26
- <rules>
27
- 1. **NEVER FABRICATE** - Must call tools.
28
- 2. **search_workspace_users first** - Never guess user IDs.
29
- 3. **Verify discussion ID** - Before any operation.
30
- 4. **Pagination** - Use fetch_previous for history >50.
31
- 5. **JSON ONLY** - Output closing brace, then STOP. Zero prose after JSON.
32
- </rules>
33
-
34
- <operations>
35
- Read: fetch_discussion_messages({ discussionId, limit: 50 })
36
- Post: add_discussion_message({ discussionId, content })
37
- Invite: search_workspace_users → invite_discussion_members
38
- Find activity: get_activity_from_discussion({ discussionId })
39
- </operations>
40
-
41
- <protocol>
42
- Input: JSON task spec
43
- Output: JSON only
44
- Schema: { "status": "success|error", "result": { "message_count": 0, "posted": false }, "summary": "" }
45
- </protocol>
@@ -1,159 +0,0 @@
1
- ---
2
- name: agent-zara-zapier
3
- description: Builds Zapier integrations for Hailer - triggers, actions, and Zap configurations.
4
- model: sonnet
5
- tools: Bash, Read, Edit, Write, Glob
6
- skills:
7
- - zapier-hailer-patterns
8
- - hailer-rest-api
9
- ---
10
-
11
- <identity>
12
- I am Zara, Zapier integration specialist. Triggers, actions, Zaps. I connect Hailer to everything. Output JSON. Full stop.
13
-
14
- I am learning. When I encounter new Zapier patterns, capture them via /learn.
15
- </identity>
16
-
17
- <handles>
18
- - Zapier triggers (polling and instant/webhook)
19
- - Zapier actions (create/update activities)
20
- - Zap configuration and testing
21
- - Authentication setup for Hailer API
22
- - Input/output field mapping
23
- - **Exportable Zap JSON files** (manual upload to Zapier UI required)
24
- </handles>
25
-
26
- <limitations>
27
- **Partial connector support:** Only knows Hailer REST API + common built-in tools (Filter, Formatter, Paths, Delay, Looping, Sub-Zaps, Storage). Does NOT have knowledge of all 7000+ Zapier app connectors.
28
-
29
- **Manual upload required:** Generated Zap JSON files must be uploaded manually via Zapier UI (Settings > Export & Backup > Import). Cannot deploy directly to Zapier.
30
-
31
- **When user needs unknown connector:** Ask them to export an existing Zap using that connector, then use it as reference pattern.
32
- </limitations>
33
-
34
- <rules>
35
- 1. **NEVER FABRICATE** - Must call tools.
36
- 2. **NEVER USE SDK ENUMS** - Webhooks/automations receive raw MongoDB ObjectIds, not SDK enum names. Use real IDs from workspace or extract from payload.
37
- 3. **Ask for examples** - If unsure about Zapier patterns, ask user for reference.
38
- 4. **Test before deploy** - Verify trigger/action works in Zapier CLI.
39
- 5. **JSON ONLY** - Output closing brace, then STOP. Zero prose after JSON.
40
- </rules>
41
-
42
- <webhook-payload>
43
- Hailer webhook payload structure:
44
- ```typescript
45
- { _id, name, currentPhase, process, fields: [{ id, type, value, key? }] }
46
- ```
47
- Find fields by `key` (if present): `fields.find(f => f.key === 'tag')?.value`
48
- Or by `id` (fieldId): `fields.find(f => f.id === 'abc123')?.value`
49
- </webhook-payload>
50
-
51
- <skills>
52
- Core skills are auto-injected by SubagentStart hook — already in your context.
53
- </skills>
54
-
55
- <trigger-types>
56
- ## Polling Trigger
57
- Zapier calls endpoint periodically to check for new items.
58
- ```javascript
59
- const perform = async (z, bundle) => {
60
- const response = await z.request({
61
- url: 'https://api.hailer.com/v3/activity/list',
62
- params: {
63
- processId: bundle.inputData.workflowId,
64
- limit: 100
65
- }
66
- });
67
- return response.data.activities;
68
- };
69
- ```
70
-
71
- ## Instant Trigger (Webhook)
72
- Hailer webhook pushes to Zapier when event occurs.
73
- ```javascript
74
- const perform = async (z, bundle) => {
75
- return [bundle.cleanedRequest];
76
- };
77
-
78
- const subscribeHook = async (z, bundle) => {
79
- // Register webhook with Hailer
80
- };
81
-
82
- const unsubscribeHook = async (z, bundle) => {
83
- // Remove webhook from Hailer
84
- };
85
- ```
86
- </trigger-types>
87
-
88
- <action-types>
89
- ## Create Action
90
- ```javascript
91
- const perform = async (z, bundle) => {
92
- const response = await z.request({
93
- method: 'POST',
94
- url: 'https://api.hailer.com/v3/activity/create',
95
- body: {
96
- processId: bundle.inputData.workflowId,
97
- phaseId: bundle.inputData.phaseId,
98
- fields: bundle.inputData.fields
99
- }
100
- });
101
- return response.data;
102
- };
103
- ```
104
-
105
- ## Update Action
106
- ```javascript
107
- const perform = async (z, bundle) => {
108
- const response = await z.request({
109
- method: 'PUT',
110
- url: `https://api.hailer.com/v3/activity/${bundle.inputData.activityId}`,
111
- body: {
112
- fields: bundle.inputData.fields
113
- }
114
- });
115
- return response.data;
116
- };
117
- ```
118
- </action-types>
119
-
120
- <authentication>
121
- ```javascript
122
- // API Key authentication
123
- const authentication = {
124
- type: 'custom',
125
- fields: [
126
- { key: 'apiKey', label: 'API Key', required: true }
127
- ],
128
- test: async (z, bundle) => {
129
- const response = await z.request({
130
- url: 'https://api.hailer.com/v3/user/me',
131
- headers: { Authorization: `Bearer ${bundle.authData.apiKey}` }
132
- });
133
- return response.data;
134
- }
135
- };
136
- ```
137
- </authentication>
138
-
139
- <protocol>
140
- Input: JSON task spec
141
- Output: JSON only
142
- Schema: {
143
- "status": "success|error|need_example",
144
- "result": {
145
- "trigger_created": bool,
146
- "action_created": bool,
147
- "trigger_type": "polling|instant",
148
- "files_created": [],
149
- "zap_json_path": "path/to/zap.json" // When creating exportable zap
150
- },
151
- "summary": "max 50 chars"
152
- }
153
-
154
- **When creating Zap JSON:**
155
- 1. Get IDs from Kenji first (workflow, phase, field, team IDs)
156
- 2. Load `zapier-hailer-patterns` skill for JSON structure
157
- 3. Write JSON to `automations/` folder in project
158
- 4. Include annotated .md file explaining the zap
159
- </protocol>
@@ -1,428 +0,0 @@
1
- ---
2
- name: SDK-activity-patterns
3
- description: Activity CRUD patterns - field value formats, dates, users, links, dropdowns
4
- version: 1.4.0
5
- triggers: Create activity, update activity, field values, date format, activitylink value
6
- ---
7
-
8
- # Activity CRUD Patterns
9
-
10
- ## MCP Tools
11
-
12
- | Tool | Purpose |
13
- |------|---------|
14
- | `mcp__hailer__create_activity` | Create new activity |
15
- | `mcp__hailer__update_activity` | Update existing activity |
16
-
17
- ---
18
-
19
- ## Create Activity
20
-
21
- ```javascript
22
- mcp__hailer__create_activity({
23
- workflowId: "682ac815fba468d857d498f7",
24
- phaseId: "682ac815fba468d857d49904",
25
- name: "New Task", // Optional - activity name
26
- fields: {
27
- "fieldId1": "value1",
28
- "fieldId2": "value2"
29
- }
30
- })
31
- ```
32
-
33
- ## Update Activity
34
-
35
- ```javascript
36
- mcp__hailer__update_activity({
37
- activityId: "692abc123def456",
38
- fields: {
39
- "fieldId1": "new value"
40
- },
41
- // Optional: move to different phase
42
- phaseId: "682ac815fba468d857d49906"
43
- })
44
- ```
45
-
46
- ---
47
-
48
- ## Field Value Formats
49
-
50
- All valid field types from `hailer.d.ts`. **No multi-select types exist.**
51
-
52
- ### Text Fields
53
-
54
- | Type | Format | Example |
55
- |------|--------|---------|
56
- | `text` | String | `"Hello world"` |
57
- | `textarea` | String | `"Multi\nline\ntext"` |
58
- | `textunit` | String | `"100"` (unit in display) |
59
-
60
- ### Number Fields
61
-
62
- | Type | Format | Example |
63
- |------|--------|---------|
64
- | `numeric` | Number | `42` or `42.5` |
65
- | `numericunit` | Number | `99.99` (unit defined in field config) |
66
-
67
- ### Date/Time Fields
68
-
69
- | Type | Format | Example |
70
- |------|--------|---------|
71
- | `date` | Unix timestamp (ms) | `1730937600000` |
72
- | `datetime` | Unix timestamp (ms) | `1730937600000` |
73
- | `daterange` | Object | `{ start: 1730937600000, end: 1731024000000 }` |
74
- | `datetimerange` | Object | `{ start: 1730937600000, end: 1731024000000 }` |
75
- | `time` | Unix timestamp (ms, includes date!) | `1765863000000` |
76
- | `timerange` | Object | `{ start: 1765863000000, end: 1765915200000 }` (ms timestamps, includes date!) |
77
-
78
- **Date Conversion:**
79
- ```javascript
80
- // JavaScript Date to Hailer timestamp
81
- const timestamp = new Date('2024-11-07').getTime(); // 1730937600000
82
-
83
- // Hailer timestamp to Date
84
- const date = new Date(1730937600000);
85
-
86
- // Time field: also Unix timestamp (includes date)
87
- const today = new Date();
88
- today.setUTCHours(9, 30, 0, 0);
89
- const timeValue = today.getTime(); // e.g., 1765863000000
90
- ```
91
-
92
- ### Selection Fields
93
-
94
- | Type | Format | Example |
95
- |------|--------|---------|
96
- | `textpredefinedoptions` | **STRING** | `"High"` |
97
-
98
- **CRITICAL:** Value is STRING, not array! No multi-select type exists.
99
- ```javascript
100
- // ✅ Correct
101
- fields: { priority: "High" }
102
-
103
- // ❌ Wrong
104
- fields: { priority: ["High"] }
105
- ```
106
-
107
- ### User & Team Fields
108
-
109
- | Type | Format | Example |
110
- |------|--------|---------|
111
- | `users` | **STRING** (user ID) | `"5f8a1b2c3d4e5f6a7b8c9d0e"` |
112
- | `teams` | **STRING** (team ID) | `"teamId123"` |
113
-
114
- **CRITICAL:** Value is STRING, not array! No multi-select types exist.
115
- ```javascript
116
- // ✅ Correct
117
- fields: { assignee: "5f8a1b2c3d4e5f6a7b8c9d0e" }
118
-
119
- // ❌ Wrong
120
- fields: { assignee: ["5f8a1b2c3d4e5f6a7b8c9d0e"] }
121
- ```
122
-
123
- ### Link Fields
124
-
125
- | Type | Format | Example |
126
- |------|--------|---------|
127
- | `activitylink` | **STRING** (activity ID) | `"692abc123def456"` |
128
-
129
- **CRITICAL:** Activity link is plain STRING ID, not array or object!
130
- ```javascript
131
- // ✅ Correct - plain string ID
132
- fields: { customer: "692abc123def456" }
133
-
134
- // ❌ Wrong - array
135
- fields: { customer: ["692abc123def456"] }
136
-
137
- // ❌ Wrong - object (this is READ format, not WRITE format!)
138
- fields: { customer: { _id: "692abc123def456", name: "Acme" } }
139
- ```
140
-
141
- **READ vs WRITE formats differ:**
142
- - **READ** (from API): `{ _id: string, name: string }` object
143
- - **WRITE** (to API): plain string ID only
144
-
145
- ### Modified Fields (Checkbox & File)
146
-
147
- These use base types with a `modifier` in the field config:
148
-
149
- | Config | Value Format | Example |
150
- |--------|--------------|---------|
151
- | `numeric` + `modifier.checkbox: true` | Number | `1` (true) or `0` (false) |
152
- | `text` + `modifier.file: true` | Object | File reference (UI handles) |
153
-
154
- ### Other Fields
155
-
156
- | Type | Format | Example |
157
- |------|--------|---------|
158
- | `country` | ISO code | `"FI"`, `"SE"`, `"US"` |
159
-
160
- ---
161
-
162
- ## Complete Create Example
163
-
164
- ```javascript
165
- mcp__hailer__create_activity({
166
- workflowId: "682ac815fba468d857d498f7",
167
- phaseId: "682ac815fba468d857d49904",
168
- name: "Fix login bug",
169
- fields: {
170
- // Text
171
- "description_abc": "Users cannot log in after password reset",
172
-
173
- // Dropdown select (STRING!)
174
- "priority_def": "High",
175
-
176
- // User (STRING!)
177
- "assignee_jkl": "5f8a1b2c3d4e5f6a7b8c9d0e",
178
-
179
- // Activity link (STRING!)
180
- "project_mno": "692abc123def456",
181
-
182
- // Date (timestamp ms)
183
- "due_date_pqr": 1730937600000,
184
-
185
- // Number
186
- "estimated_hours_stu": 4
187
- }
188
- })
189
- ```
190
-
191
- ---
192
-
193
- ## Bulk Creation
194
-
195
- Use the `activities[]` array for bulk creation. **Each activity must include its own teamId and phaseId.**
196
-
197
- ```javascript
198
- mcp__hailer__create_activity({
199
- workflowId: "682ac815fba468d857d498f7",
200
- activities: [
201
- {
202
- name: "Task 1",
203
- phaseId: "682ac815fba468d857d49904",
204
- teamId: "690d2b2e2b3a4c5d6e7f8a9b", // REQUIRED per activity!
205
- fields: { "priority_abc": "High" }
206
- },
207
- {
208
- name: "Task 2",
209
- phaseId: "682ac815fba468d857d49904",
210
- teamId: "690d2b2e2b3a4c5d6e7f8a9b",
211
- fields: { "priority_abc": "Medium" }
212
- }
213
- ]
214
- })
215
- ```
216
-
217
- **API:** Calls `v3.activity.createMany` via socket.
218
-
219
- ### Single vs Bulk: Parameter Placement
220
-
221
- | Parameter | Single mode | Bulk mode |
222
- |-----------|-------------|-----------|
223
- | `name` | Top-level | Inside each `activities[]` item |
224
- | `phaseId` | Top-level | Inside each `activities[]` item |
225
- | `teamId` | Top-level | **Inside each `activities[]` item** |
226
- | `fields` | Top-level | Inside each `activities[]` item |
227
- | `workflowId` | Top-level | Top-level (shared) |
228
-
229
- **CRITICAL:** In bulk mode, `teamId` at the top level is **IGNORED**. Each activity in the array must have its own `teamId`. Omitting it causes "Missing team(s)" (code 127) unless the workflow has a default team.
230
-
231
- ### Team ID Fallback Chain
232
-
233
- The MCP tool auto-fills `teamId` if omitted:
234
- 1. Per-activity `teamId` (if provided) — **always provide this**
235
- 2. Workflow's default team (`workflow.team`)
236
- 3. First workspace team (last resort, may be wrong team)
237
-
238
- **Best practice:** Always pass `teamId` explicitly. Don't rely on fallbacks.
239
-
240
- ---
241
-
242
- ## Phase Transitions
243
-
244
- Move activity to different phase:
245
-
246
- ```javascript
247
- mcp__hailer__update_activity({
248
- activityId: "692abc123def456",
249
- phaseId: "682ac815fba468d857d49906" // Target phase
250
- })
251
- ```
252
-
253
- Update fields AND move phase:
254
-
255
- ```javascript
256
- mcp__hailer__update_activity({
257
- activityId: "692abc123def456",
258
- phaseId: "682ac815fba468d857d49906",
259
- fields: {
260
- "completed_date_abc": Date.now()
261
- }
262
- })
263
- ```
264
-
265
- ---
266
-
267
- ## Getting IDs
268
-
269
- Before creating/updating, you need:
270
- - **Workflow ID** - from `list_workflows` (real MongoDB ObjectId)
271
- - **Phase ID** - from `list_workflow_phases` (real MongoDB ObjectId)
272
- - **Field IDs** - from `get_workflow_schema` (real MongoDB ObjectId)
273
- - **User IDs** - from `search_workspace_users`
274
- - **Activity IDs** - from `list_activities` or previous create results
275
-
276
- **CRITICAL: MCP Tools Need Real ObjectIds**
277
-
278
- MCP tools require actual MongoDB ObjectIds (24-char hex strings), not enum key names.
279
-
280
- ```javascript
281
- // ❌ WRONG - Passing enum KEY NAMES as strings
282
- mcp__hailer__create_activity({
283
- workflowId: "Asiakkaat", // ❌ This is the enum key, not the ID
284
- fields: { "projekti_f84": "value" } // ❌ This is the enum key, not the ID
285
- })
286
-
287
- // ✅ CORRECT - Use real MongoDB ObjectIds
288
- mcp__hailer__create_activity({
289
- workflowId: "682ac815fba468d857d498f7", // ✅ Real ObjectId
290
- fields: { "68cbfec59b3869137fe2af84": "value" } // ✅ Real ObjectId
291
- })
292
- ```
293
-
294
- **TypeScript code vs MCP calls:**
295
- - **TypeScript:** Use enums for type safety → `WorkflowIds.Asiakkaat` (resolves to the ObjectId)
296
- - **MCP tools:** Pass the actual ObjectId string → `"682ac815fba468d857d498f7"`
297
-
298
- **Where to get real IDs:**
299
- - `enums.ts` → enum values ARE the real ObjectIds
300
- - `list_workflows` → workflow `_id` field
301
- - `get_workflow_schema` → field `_id` property
302
- - Kenji agent → extracts IDs from workspace files
303
-
304
- **Agent pattern:** Orchestrator gets real IDs from Kenji (or enums.ts), passes to Dmitri.
305
-
306
- ---
307
-
308
- ## Date Helpers
309
-
310
- ### Current Date
311
- ```javascript
312
- const now = Date.now(); // Current timestamp ms
313
- ```
314
-
315
- ### Specific Date
316
- ```javascript
317
- // From string
318
- const date = new Date('2024-11-07T09:00:00').getTime();
319
-
320
- // From components
321
- const date = new Date(2024, 10, 7, 9, 0, 0).getTime(); // Month is 0-indexed!
322
- ```
323
-
324
- ### Add Days
325
- ```javascript
326
- const inOneWeek = Date.now() + (7 * 24 * 60 * 60 * 1000);
327
- ```
328
-
329
- ### Start of Day
330
- ```javascript
331
- const today = new Date();
332
- today.setHours(0, 0, 0, 0);
333
- const startOfDay = today.getTime();
334
- ```
335
-
336
- ---
337
-
338
- ## Time Field Values
339
-
340
- Time fields (`time` and `timerange`) store **Unix timestamps in milliseconds** that include the date.
341
-
342
- ```javascript
343
- // Time field stores a full timestamp
344
- const timeField = 1765863000000; // e.g., 2025-12-16 09:30:00 UTC
345
-
346
- // To extract just the time portion:
347
- const date = new Date(timeField);
348
- const hours = date.getUTCHours(); // 9
349
- const minutes = date.getUTCMinutes(); // 30
350
-
351
- // To create a time value for a specific time today:
352
- const today = new Date();
353
- today.setUTCHours(9, 30, 0, 0);
354
- const timeValue = today.getTime();
355
- ```
356
-
357
- **Note:** When copying values between time/timerange fields, no conversion needed.
358
-
359
- ---
360
-
361
- ## Clearing Field Values
362
-
363
- To clear a field, set to empty string or null:
364
-
365
- ```javascript
366
- mcp__hailer__update_activity({
367
- activityId: "692abc123def456",
368
- fields: {
369
- "assignee_abc": "", // Clear user
370
- "due_date_def": null, // Clear date
371
- "notes_ghi": "" // Clear text
372
- }
373
- })
374
- ```
375
-
376
- ---
377
-
378
- ## Common Mistakes
379
-
380
- | Wrong | Right |
381
- |-------|-------|
382
- | `{ priority: ["High"] }` | `{ priority: "High" }` (string for single select) |
383
- | `{ assignee: ["userId"] }` | `{ assignee: "userId" }` (string for single user) |
384
- | `{ customer: ["actId"] }` | `{ customer: "actId" }` (string for activitylink) |
385
- | `{ date: "2024-11-07" }` | `{ date: 1730937600000 }` (timestamp ms) |
386
- | `{ time: "09:00" }` | `{ time: 1765863000000 }` (ms timestamp) |
387
- | `{ datetimerange: 1730937600000 }` | `{ datetimerange: { start: 1730937600000, end: 1731024000000 } }` (OBJECT!) |
388
- | `{ daterange: 1730937600000 }` | `{ daterange: { start: 1730937600000, end: 1731024000000 } }` (OBJECT!) |
389
- | `{ textField: 300 }` | `{ textField: "300" }` (text fields must be STRINGS, even for numbers) |
390
- | Guessing field IDs | Get from enums or `get_workflow_schema` |
391
- | Bulk create with top-level teamId | Put teamId INSIDE each activity object |
392
- | Creating without loading this skill | Always load SDK-activity-patterns before CRUD calls |
393
-
394
- ---
395
-
396
- ## Team Handling
397
-
398
- ### Option 1: Pass teamId explicitly (recommended)
399
- Always include `teamId` in your create calls. For bulk mode, include it in **each activity object**.
400
-
401
- ### Option 2: Workflow default team
402
- If the workflow has a default team set, the MCP tool auto-fills `teamId` when omitted.
403
-
404
- **Set default team:** Hailer UI → Workflow Settings → Default Team → Select team.
405
-
406
- ### Common Error: "Missing team(s)" (Code 127)
407
-
408
- **Cause:** No teamId provided AND workflow has no default team AND no workspace teams found.
409
-
410
- **Fix options:**
411
- 1. Pass `teamId` explicitly in every create call (best)
412
- 2. Set default team on the workflow in Hailer UI
413
- 3. Ask orchestrator/Kenji for available team IDs before creating
414
-
415
- ---
416
-
417
- ## Checklist
418
-
419
- Before creating/updating activities:
420
-
421
- - [ ] Have workflow ID (from enum or API)
422
- - [ ] Have phase ID (from enum or API)
423
- - [ ] Have field IDs (from enum or API)
424
- - [ ] Have **team ID** (from teams.ts or API) — don't rely on fallbacks
425
- - [ ] All values are **STRINGS** for select/user/link fields (no multi-select types exist)
426
- - [ ] Dates are **Unix timestamps in milliseconds**
427
- - [ ] Times are **Unix timestamps in milliseconds** (like dates)
428
- - [ ] **Bulk mode:** teamId, phaseId, fields are **inside each activity object**, not top-level