@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.
- package/.claude/CLAUDE.md +117 -320
- package/.claude/commands/app-squad.md +86 -90
- package/.claude/commands/audit-squad.md +19 -19
- package/.claude/commands/autoplan.md +3 -3
- package/.claude/commands/cleanup-squad.md +16 -16
- package/.claude/commands/config-squad.md +30 -30
- package/.claude/commands/crud-squad.md +23 -23
- package/.claude/commands/data-squad.md +21 -21
- package/.claude/commands/debug-squad.md +44 -44
- package/.claude/commands/doc-squad.md +16 -16
- package/.claude/commands/help:agents.md +130 -99
- package/.claude/commands/help:commands.md +15 -15
- package/.claude/commands/help:faq.md +17 -17
- package/.claude/commands/help:plugins.md +1 -1
- package/.claude/commands/help:skills.md +18 -24
- package/.claude/commands/hotfix-squad.md +22 -22
- package/.claude/commands/integration-squad.md +22 -22
- package/.claude/commands/janitor-squad.md +31 -31
- package/.claude/commands/learn-auto.md +5 -5
- package/.claude/commands/learn.md +12 -20
- package/.claude/commands/onboard-squad.md +39 -49
- package/.claude/commands/plan-workspace.md +2 -2
- package/.claude/commands/publish.md +32 -37
- package/.claude/commands/review-squad.md +27 -27
- package/.claude/commands/stats.md +26 -12
- package/.claude/commands/swarm.md +25 -25
- package/.claude/skills/chrome-mcp-reference/SKILL.md +5 -0
- package/.claude/skills/hailer-api-client/SKILL.md +55 -16
- package/.claude/skills/hailer-app-builder/SKILL.md +4 -270
- package/.claude/skills/hailer-apps-pictures/SKILL.md +3 -3
- package/.claude/skills/hailer-design-system/SKILL.md +96 -4
- package/.claude/skills/hailer-monolith-automations/SKILL.md +138 -116
- package/.claude/skills/hailer-permissions-system/SKILL.md +6 -9
- package/.claude/skills/hailer-project-protocol/SKILL.md +20 -110
- package/.claude/skills/integration-patterns/SKILL.md +6 -6
- package/.claude/skills/lsp-setup/SKILL.md +8 -9
- package/.claude/skills/sdk-activity-patterns/SKILL.md +238 -0
- package/.claude/skills/{SDK-document-templates → sdk-document-templates}/SKILL.md +13 -340
- package/.claude/skills/{SDK-function-fields → sdk-function-fields}/SKILL.md +8 -40
- package/.claude/skills/{SDK-insight-queries → sdk-insight-queries}/SKILL.md +114 -392
- package/.claude/skills/{SDK-ws-config-skill → sdk-ws-config-skill}/SKILL.md +79 -310
- package/.claude/skills/zapier-hailer-patterns/SKILL.md +84 -361
- package/.opencode/package-lock.json +117 -0
- package/CLAUDE.md +5 -358
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -127
- package/dist/app.js.map +1 -1
- package/dist/bot/bot-manager.d.ts +3 -14
- package/dist/bot/bot-manager.d.ts.map +1 -1
- package/dist/bot/bot-manager.js +13 -4
- package/dist/bot/bot-manager.js.map +1 -1
- package/dist/bot/bot.d.ts +23 -102
- package/dist/bot/bot.d.ts.map +1 -1
- package/dist/bot/bot.js +356 -1212
- package/dist/bot/bot.js.map +1 -1
- package/dist/bot/services/bot-permissions.d.ts +50 -0
- package/dist/bot/services/bot-permissions.d.ts.map +1 -0
- package/dist/bot/services/bot-permissions.js +198 -0
- package/dist/bot/services/bot-permissions.js.map +1 -0
- package/dist/bot/services/index.d.ts +4 -2
- package/dist/bot/services/index.d.ts.map +1 -1
- package/dist/bot/services/index.js +10 -5
- package/dist/bot/services/index.js.map +1 -1
- package/dist/bot/services/message-classifier.d.ts +1 -1
- package/dist/bot/services/message-classifier.d.ts.map +1 -1
- package/dist/bot/services/message-classifier.js.map +1 -1
- package/dist/bot/services/signal-router.d.ts +32 -0
- package/dist/bot/services/signal-router.d.ts.map +1 -0
- package/dist/bot/services/signal-router.js +132 -0
- package/dist/bot/services/signal-router.js.map +1 -0
- package/dist/bot/services/system-prompt.d.ts +12 -0
- package/dist/bot/services/system-prompt.d.ts.map +1 -0
- package/dist/bot/services/system-prompt.js +93 -0
- package/dist/bot/services/system-prompt.js.map +1 -0
- package/dist/bot/services/types.d.ts +7 -34
- package/dist/bot/services/types.d.ts.map +1 -1
- package/dist/bot/services/types.js +0 -3
- package/dist/bot/services/types.js.map +1 -1
- package/dist/bot/services/workspace-refresh.d.ts +47 -0
- package/dist/bot/services/workspace-refresh.d.ts.map +1 -0
- package/dist/bot/services/workspace-refresh.js +154 -0
- package/dist/bot/services/workspace-refresh.js.map +1 -0
- package/dist/bot-config/constants.d.ts +0 -36
- package/dist/bot-config/constants.d.ts.map +1 -1
- package/dist/bot-config/constants.js +1 -76
- package/dist/bot-config/constants.js.map +1 -1
- package/dist/bot-config/context.d.ts +2 -42
- package/dist/bot-config/context.d.ts.map +1 -1
- package/dist/bot-config/context.js +13 -134
- package/dist/bot-config/context.js.map +1 -1
- package/dist/bot-config/index.d.ts +6 -15
- package/dist/bot-config/index.d.ts.map +1 -1
- package/dist/bot-config/index.js +5 -80
- package/dist/bot-config/index.js.map +1 -1
- package/dist/bot-config/loader.d.ts +16 -4
- package/dist/bot-config/loader.d.ts.map +1 -1
- package/dist/bot-config/loader.js +187 -96
- package/dist/bot-config/loader.js.map +1 -1
- package/dist/bot-config/persistence.d.ts +1 -52
- package/dist/bot-config/persistence.d.ts.map +1 -1
- package/dist/bot-config/persistence.js +3 -213
- package/dist/bot-config/persistence.js.map +1 -1
- package/dist/bot-config/state.d.ts +0 -41
- package/dist/bot-config/state.d.ts.map +1 -1
- package/dist/bot-config/state.js +0 -151
- package/dist/bot-config/state.js.map +1 -1
- package/dist/bot-config/tools.d.ts +1 -1
- package/dist/bot-config/tools.js +27 -27
- package/dist/bot-config/tools.js.map +1 -1
- package/dist/bot-config/types.d.ts +39 -32
- package/dist/bot-config/types.d.ts.map +1 -1
- package/dist/bot-config/types.js +0 -3
- package/dist/bot-config/types.js.map +1 -1
- package/dist/bot-config/webhooks.d.ts +0 -4
- package/dist/bot-config/webhooks.d.ts.map +1 -1
- package/dist/bot-config/webhooks.js +0 -13
- package/dist/bot-config/webhooks.js.map +1 -1
- package/dist/commands/seed-config.js +16 -31
- package/dist/commands/seed-config.js.map +1 -1
- package/dist/config.d.ts +0 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -15
- package/dist/config.js.map +1 -1
- package/dist/mcp/hailer-clients.js +2 -2
- package/dist/mcp/hailer-clients.js.map +1 -1
- package/dist/mcp/tool-registry.d.ts +10 -115
- package/dist/mcp/tool-registry.d.ts.map +1 -1
- package/dist/mcp/tool-registry.js +39 -363
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/mcp/tools/activity.d.ts +3 -0
- package/dist/mcp/tools/activity.d.ts.map +1 -1
- package/dist/mcp/tools/activity.js +8 -1
- package/dist/mcp/tools/activity.js.map +1 -1
- package/dist/mcp/tools/app-core.d.ts +3 -0
- package/dist/mcp/tools/app-core.d.ts.map +1 -1
- package/dist/mcp/tools/app-core.js +9 -2
- package/dist/mcp/tools/app-core.js.map +1 -1
- package/dist/mcp/tools/app-marketplace.d.ts +3 -0
- package/dist/mcp/tools/app-marketplace.d.ts.map +1 -1
- package/dist/mcp/tools/app-marketplace.js +13 -1
- package/dist/mcp/tools/app-marketplace.js.map +1 -1
- package/dist/mcp/tools/app-member.d.ts +3 -0
- package/dist/mcp/tools/app-member.d.ts.map +1 -1
- package/dist/mcp/tools/app-member.js +6 -1
- package/dist/mcp/tools/app-member.js.map +1 -1
- package/dist/mcp/tools/app-scaffold.d.ts +3 -0
- package/dist/mcp/tools/app-scaffold.d.ts.map +1 -1
- package/dist/mcp/tools/app-scaffold.js +15 -11
- package/dist/mcp/tools/app-scaffold.js.map +1 -1
- package/dist/mcp/tools/company.d.ts +3 -0
- package/dist/mcp/tools/company.d.ts.map +1 -1
- package/dist/mcp/tools/company.js +5 -1
- package/dist/mcp/tools/company.js.map +1 -1
- package/dist/mcp/tools/discussion.d.ts +3 -0
- package/dist/mcp/tools/discussion.d.ts.map +1 -1
- package/dist/mcp/tools/discussion.js +13 -2
- package/dist/mcp/tools/discussion.js.map +1 -1
- package/dist/mcp/tools/file.d.ts +3 -0
- package/dist/mcp/tools/file.d.ts.map +1 -1
- package/dist/mcp/tools/file.js +6 -1
- package/dist/mcp/tools/file.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +7 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +34 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/insight.d.ts +3 -0
- package/dist/mcp/tools/insight.d.ts.map +1 -1
- package/dist/mcp/tools/insight.js +18 -8
- package/dist/mcp/tools/insight.js.map +1 -1
- package/dist/mcp/tools/user.d.ts +3 -0
- package/dist/mcp/tools/user.d.ts.map +1 -1
- package/dist/mcp/tools/user.js +6 -1
- package/dist/mcp/tools/user.js.map +1 -1
- package/dist/mcp/tools/workflow-permissions.d.ts +3 -0
- package/dist/mcp/tools/workflow-permissions.d.ts.map +1 -1
- package/dist/mcp/tools/workflow-permissions.js +8 -1
- package/dist/mcp/tools/workflow-permissions.js.map +1 -1
- package/dist/mcp/tools/workflow.d.ts +3 -0
- package/dist/mcp/tools/workflow.d.ts.map +1 -1
- package/dist/mcp/tools/workflow.js +29 -28
- package/dist/mcp/tools/workflow.js.map +1 -1
- package/dist/mcp/utils/index.d.ts +4 -11
- package/dist/mcp/utils/index.d.ts.map +1 -1
- package/dist/mcp/utils/index.js +5 -36
- package/dist/mcp/utils/index.js.map +1 -1
- package/dist/mcp/utils/role-utils.d.ts +0 -32
- package/dist/mcp/utils/role-utils.d.ts.map +1 -1
- package/dist/mcp/utils/role-utils.js +0 -73
- package/dist/mcp/utils/role-utils.js.map +1 -1
- package/dist/mcp/utils/tool-helpers.d.ts +0 -25
- package/dist/mcp/utils/tool-helpers.d.ts.map +1 -1
- package/dist/mcp/utils/tool-helpers.js +0 -34
- package/dist/mcp/utils/tool-helpers.js.map +1 -1
- package/dist/mcp/webhook-handler.d.ts +4 -34
- package/dist/mcp/webhook-handler.d.ts.map +1 -1
- package/dist/mcp/webhook-handler.js +57 -74
- package/dist/mcp/webhook-handler.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +3 -78
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -2
- package/.claude/agents/agent-ada-skill-builder.md +0 -94
- package/.claude/agents/agent-alejandro-function-fields.md +0 -342
- package/.claude/agents/agent-bjorn-config-audit.md +0 -103
- package/.claude/agents/agent-builder-agent-creator.md +0 -130
- package/.claude/agents/agent-code-simplifier.md +0 -53
- package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
- package/.claude/agents/agent-giuseppe-app-builder.md +0 -208
- package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
- package/.claude/agents/agent-helga-workflow-config.md +0 -204
- package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
- package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
- package/.claude/agents/agent-ivan-monolith.md +0 -154
- package/.claude/agents/agent-kenji-data-reader.md +0 -86
- package/.claude/agents/agent-lars-code-inspector.md +0 -102
- package/.claude/agents/agent-marco-mockup-builder.md +0 -110
- package/.claude/agents/agent-marcus-api-documenter.md +0 -323
- package/.claude/agents/agent-marketplace-publisher.md +0 -280
- package/.claude/agents/agent-marketplace-reviewer.md +0 -309
- package/.claude/agents/agent-permissions-handler.md +0 -208
- package/.claude/agents/agent-simple-writer.md +0 -48
- package/.claude/agents/agent-svetlana-code-review.md +0 -171
- package/.claude/agents/agent-tanya-test-runner.md +0 -333
- package/.claude/agents/agent-ui-designer.md +0 -100
- package/.claude/agents/agent-viktor-sql-insights.md +0 -212
- package/.claude/agents/agent-web-search.md +0 -55
- package/.claude/agents/agent-yevgeni-discussions.md +0 -45
- package/.claude/agents/agent-zara-zapier.md +0 -159
- package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
- package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
- package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
- package/.claude/skills/agent-structure/SKILL.md +0 -98
- package/.claude/skills/delegation-routing/SKILL.md +0 -202
- package/.claude/skills/frontend-design/SKILL.md +0 -254
- package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
- package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
- package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
- package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
- package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
- package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
- package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
- package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
- package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
- package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
- package/.claude/skills/json-only-output/SKILL.md +0 -72
- package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
- package/.claude/skills/optional-parameters/SKILL.md +0 -72
- package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
- package/.claude/skills/tool-response-verification/SKILL.md +0 -92
- package/.opencode/agent/agent-ada-skill-builder.md +0 -35
- package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
- package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
- package/.opencode/agent/agent-builder-agent-creator.md +0 -39
- package/.opencode/agent/agent-code-simplifier.md +0 -31
- package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
- package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
- package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
- package/.opencode/agent/agent-helga-workflow-config.md +0 -204
- package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
- package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
- package/.opencode/agent/agent-ivan-monolith.md +0 -46
- package/.opencode/agent/agent-kenji-data-reader.md +0 -53
- package/.opencode/agent/agent-lars-code-inspector.md +0 -28
- package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
- package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
- package/.opencode/agent/agent-marketplace-publisher.md +0 -44
- package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
- package/.opencode/agent/agent-permissions-handler.md +0 -50
- package/.opencode/agent/agent-simple-writer.md +0 -45
- package/.opencode/agent/agent-svetlana-code-review.md +0 -39
- package/.opencode/agent/agent-tanya-test-runner.md +0 -57
- package/.opencode/agent/agent-ui-designer.md +0 -56
- package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
- package/.opencode/agent/agent-web-search.md +0 -42
- package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
- package/.opencode/agent/agent-zara-zapier.md +0 -53
- package/.opencode/commands/app-squad.md +0 -135
- package/.opencode/commands/audit-squad.md +0 -158
- package/.opencode/commands/autoplan.md +0 -563
- package/.opencode/commands/cleanup-squad.md +0 -98
- package/.opencode/commands/config-squad.md +0 -106
- package/.opencode/commands/crud-squad.md +0 -87
- package/.opencode/commands/data-squad.md +0 -97
- package/.opencode/commands/debug-squad.md +0 -303
- package/.opencode/commands/doc-squad.md +0 -65
- package/.opencode/commands/handoff.md +0 -137
- package/.opencode/commands/health.md +0 -49
- package/.opencode/commands/help-agents.md +0 -151
- package/.opencode/commands/help-commands.md +0 -32
- package/.opencode/commands/help-faq.md +0 -29
- package/.opencode/commands/help-plugins.md +0 -28
- package/.opencode/commands/help-skills.md +0 -7
- package/.opencode/commands/help-tools.md +0 -40
- package/.opencode/commands/help.md +0 -28
- package/.opencode/commands/hotfix-squad.md +0 -112
- package/.opencode/commands/integration-squad.md +0 -82
- package/.opencode/commands/janitor-squad.md +0 -167
- package/.opencode/commands/learn-auto.md +0 -120
- package/.opencode/commands/learn.md +0 -120
- package/.opencode/commands/mcp-list.md +0 -27
- package/.opencode/commands/onboard-squad.md +0 -140
- package/.opencode/commands/plan-workspace.md +0 -732
- package/.opencode/commands/prd.md +0 -131
- package/.opencode/commands/project-status.md +0 -82
- package/.opencode/commands/publish.md +0 -138
- package/.opencode/commands/recap.md +0 -69
- package/.opencode/commands/restore.md +0 -64
- package/.opencode/commands/review-squad.md +0 -152
- package/.opencode/commands/save.md +0 -24
- package/.opencode/commands/stats.md +0 -19
- package/.opencode/commands/swarm.md +0 -210
- package/.opencode/commands/tool-builder.md +0 -39
- 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
|