@hailer/mcp 1.1.11 → 1.1.13

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 (252) hide show
  1. package/dist/app.js +18 -5
  2. package/dist/bot/bot-config.d.ts +12 -1
  3. package/dist/bot/bot-config.js +98 -14
  4. package/dist/bot/bot-manager.d.ts +13 -3
  5. package/dist/bot/bot-manager.js +80 -25
  6. package/dist/bot/bot.d.ts +46 -0
  7. package/dist/bot/bot.js +542 -166
  8. package/dist/bot/services/message-classifier.js +17 -0
  9. package/dist/bot/services/permission-guard.d.ts +52 -0
  10. package/dist/bot/services/permission-guard.js +149 -0
  11. package/dist/bot/services/types.d.ts +5 -0
  12. package/dist/bot/services/typing-indicator.d.ts +6 -1
  13. package/dist/bot/services/typing-indicator.js +19 -3
  14. package/dist/config.d.ts +6 -1
  15. package/dist/config.js +43 -0
  16. package/dist/core.js +3 -6
  17. package/dist/mcp/UserContextCache.d.ts +5 -0
  18. package/dist/mcp/UserContextCache.js +51 -19
  19. package/dist/mcp/hailer-clients.d.ts +19 -1
  20. package/dist/mcp/hailer-clients.js +157 -20
  21. package/dist/mcp/session-store.d.ts +68 -0
  22. package/dist/mcp/session-store.js +169 -0
  23. package/dist/mcp/signal-handler.js +12 -12
  24. package/dist/mcp/tool-registry.d.ts +17 -4
  25. package/dist/mcp/tool-registry.js +37 -7
  26. package/dist/mcp/tools/activity.js +99 -7
  27. package/dist/mcp/tools/app-scaffold.js +304 -336
  28. package/dist/mcp/tools/company.d.ts +9 -0
  29. package/dist/mcp/tools/company.js +88 -0
  30. package/dist/mcp/tools/discussion.js +68 -0
  31. package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
  32. package/dist/mcp/tools/workflow-permissions.js +204 -0
  33. package/dist/mcp/tools/workflow.js +57 -18
  34. package/dist/mcp/utils/index.d.ts +2 -0
  35. package/dist/mcp/utils/index.js +12 -1
  36. package/dist/mcp/utils/role-utils.d.ts +74 -0
  37. package/dist/mcp/utils/role-utils.js +151 -0
  38. package/dist/mcp/utils/types.d.ts +43 -1
  39. package/dist/mcp/utils/types.js +14 -0
  40. package/dist/mcp/webhook-handler.d.ts +6 -0
  41. package/dist/mcp/webhook-handler.js +11 -0
  42. package/dist/mcp-server.d.ts +23 -2
  43. package/dist/mcp-server.js +639 -111
  44. package/dist/plugins/vipunen/client.d.ts +150 -0
  45. package/dist/plugins/vipunen/client.js +535 -0
  46. package/dist/plugins/vipunen/config/schema-config.json +19 -0
  47. package/dist/plugins/vipunen/config/schema-doc.json +22 -0
  48. package/dist/plugins/vipunen/index.d.ts +41 -0
  49. package/dist/plugins/vipunen/index.js +88 -0
  50. package/dist/plugins/vipunen/tools.d.ts +26 -0
  51. package/dist/plugins/vipunen/tools.js +501 -0
  52. package/package.json +2 -1
  53. package/.claude/.context-watchdog.json +0 -1
  54. package/.claude/.session-checked +0 -1
  55. package/.claude/CLAUDE.md +0 -370
  56. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  57. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  58. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  59. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  60. package/.claude/agents/agent-code-simplifier.md +0 -53
  61. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  62. package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
  63. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  64. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  65. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  66. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  67. package/.claude/agents/agent-ivan-monolith.md +0 -154
  68. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  69. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  70. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  71. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  72. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  73. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  74. package/.claude/agents/agent-permissions-handler.md +0 -208
  75. package/.claude/agents/agent-simple-writer.md +0 -48
  76. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  77. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  78. package/.claude/agents/agent-ui-designer.md +0 -100
  79. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  80. package/.claude/agents/agent-web-search.md +0 -55
  81. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  82. package/.claude/agents/agent-zara-zapier.md +0 -159
  83. package/.claude/commands/app-squad.md +0 -135
  84. package/.claude/commands/audit-squad.md +0 -158
  85. package/.claude/commands/autoplan.md +0 -563
  86. package/.claude/commands/cleanup-squad.md +0 -98
  87. package/.claude/commands/config-squad.md +0 -106
  88. package/.claude/commands/crud-squad.md +0 -87
  89. package/.claude/commands/data-squad.md +0 -97
  90. package/.claude/commands/debug-squad.md +0 -303
  91. package/.claude/commands/doc-squad.md +0 -65
  92. package/.claude/commands/handoff.md +0 -137
  93. package/.claude/commands/health.md +0 -49
  94. package/.claude/commands/help.md +0 -29
  95. package/.claude/commands/help:agents.md +0 -151
  96. package/.claude/commands/help:commands.md +0 -78
  97. package/.claude/commands/help:faq.md +0 -79
  98. package/.claude/commands/help:plugins.md +0 -50
  99. package/.claude/commands/help:skills.md +0 -93
  100. package/.claude/commands/help:tools.md +0 -75
  101. package/.claude/commands/hotfix-squad.md +0 -112
  102. package/.claude/commands/integration-squad.md +0 -82
  103. package/.claude/commands/janitor-squad.md +0 -167
  104. package/.claude/commands/learn-auto.md +0 -120
  105. package/.claude/commands/learn.md +0 -120
  106. package/.claude/commands/mcp-list.md +0 -27
  107. package/.claude/commands/onboard-squad.md +0 -140
  108. package/.claude/commands/plan-workspace.md +0 -732
  109. package/.claude/commands/prd.md +0 -130
  110. package/.claude/commands/project-status.md +0 -82
  111. package/.claude/commands/publish.md +0 -138
  112. package/.claude/commands/recap.md +0 -69
  113. package/.claude/commands/restore.md +0 -64
  114. package/.claude/commands/review-squad.md +0 -152
  115. package/.claude/commands/save.md +0 -24
  116. package/.claude/commands/stats.md +0 -19
  117. package/.claude/commands/swarm.md +0 -210
  118. package/.claude/commands/tool-builder.md +0 -39
  119. package/.claude/commands/ws-pull.md +0 -44
  120. package/.claude/hooks/_shared-memory.cjs +0 -305
  121. package/.claude/hooks/_utils.cjs +0 -108
  122. package/.claude/hooks/agent-failure-detector.cjs +0 -383
  123. package/.claude/hooks/agent-usage-logger.cjs +0 -204
  124. package/.claude/hooks/app-edit-guard.cjs +0 -494
  125. package/.claude/hooks/auto-learn.cjs +0 -304
  126. package/.claude/hooks/bash-guard.cjs +0 -272
  127. package/.claude/hooks/builder-mode-manager.cjs +0 -354
  128. package/.claude/hooks/bulk-activity-guard.cjs +0 -271
  129. package/.claude/hooks/context-watchdog.cjs +0 -230
  130. package/.claude/hooks/delegation-reminder.cjs +0 -465
  131. package/.claude/hooks/design-system-lint.cjs +0 -271
  132. package/.claude/hooks/post-scaffold-hook.cjs +0 -181
  133. package/.claude/hooks/prompt-guard.cjs +0 -354
  134. package/.claude/hooks/publish-template-guard.cjs +0 -147
  135. package/.claude/hooks/session-start.cjs +0 -35
  136. package/.claude/hooks/shared-memory-writer.cjs +0 -147
  137. package/.claude/hooks/skill-injector.cjs +0 -140
  138. package/.claude/hooks/skill-usage-logger.cjs +0 -258
  139. package/.claude/hooks/src-edit-guard.cjs +0 -240
  140. package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
  141. package/.claude/settings.json +0 -257
  142. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  143. package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
  144. package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
  145. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  146. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  147. package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
  148. package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
  149. package/.claude/skills/agent-structure/SKILL.md +0 -98
  150. package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
  151. package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
  152. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  153. package/.claude/skills/frontend-design/SKILL.md +0 -254
  154. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  155. package/.claude/skills/hailer-api-client/SKILL.md +0 -518
  156. package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
  157. package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
  158. package/.claude/skills/hailer-design-system/SKILL.md +0 -235
  159. package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
  160. package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
  161. package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
  162. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  163. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  164. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  165. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  166. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  167. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  168. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  169. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  170. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  171. package/.claude/skills/integration-patterns/SKILL.md +0 -421
  172. package/.claude/skills/json-only-output/SKILL.md +0 -72
  173. package/.claude/skills/lsp-setup/SKILL.md +0 -160
  174. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  175. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  176. package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
  177. package/.claude/skills/testing-patterns/SKILL.md +0 -630
  178. package/.claude/skills/tool-builder/SKILL.md +0 -250
  179. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  180. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  181. package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
  182. package/.hailer-mcp-port +0 -1
  183. package/.mcp.json +0 -13
  184. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  185. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  186. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  187. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  188. package/.opencode/agent/agent-code-simplifier.md +0 -31
  189. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  190. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  191. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  192. package/.opencode/agent/agent-helga-workflow-config.md +0 -204
  193. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  194. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  195. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  196. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  197. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  198. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  199. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  200. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  201. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  202. package/.opencode/agent/agent-permissions-handler.md +0 -50
  203. package/.opencode/agent/agent-simple-writer.md +0 -45
  204. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  205. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  206. package/.opencode/agent/agent-ui-designer.md +0 -56
  207. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  208. package/.opencode/agent/agent-web-search.md +0 -42
  209. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  210. package/.opencode/agent/agent-zara-zapier.md +0 -53
  211. package/.opencode/commands/app-squad.md +0 -135
  212. package/.opencode/commands/audit-squad.md +0 -158
  213. package/.opencode/commands/autoplan.md +0 -563
  214. package/.opencode/commands/cleanup-squad.md +0 -98
  215. package/.opencode/commands/config-squad.md +0 -106
  216. package/.opencode/commands/crud-squad.md +0 -87
  217. package/.opencode/commands/data-squad.md +0 -97
  218. package/.opencode/commands/debug-squad.md +0 -303
  219. package/.opencode/commands/doc-squad.md +0 -65
  220. package/.opencode/commands/handoff.md +0 -137
  221. package/.opencode/commands/health.md +0 -49
  222. package/.opencode/commands/help-agents.md +0 -151
  223. package/.opencode/commands/help-commands.md +0 -32
  224. package/.opencode/commands/help-faq.md +0 -29
  225. package/.opencode/commands/help-plugins.md +0 -28
  226. package/.opencode/commands/help-skills.md +0 -7
  227. package/.opencode/commands/help-tools.md +0 -40
  228. package/.opencode/commands/help.md +0 -28
  229. package/.opencode/commands/hotfix-squad.md +0 -112
  230. package/.opencode/commands/integration-squad.md +0 -82
  231. package/.opencode/commands/janitor-squad.md +0 -167
  232. package/.opencode/commands/learn-auto.md +0 -120
  233. package/.opencode/commands/learn.md +0 -120
  234. package/.opencode/commands/mcp-list.md +0 -27
  235. package/.opencode/commands/onboard-squad.md +0 -140
  236. package/.opencode/commands/plan-workspace.md +0 -732
  237. package/.opencode/commands/prd.md +0 -131
  238. package/.opencode/commands/project-status.md +0 -82
  239. package/.opencode/commands/publish.md +0 -138
  240. package/.opencode/commands/recap.md +0 -69
  241. package/.opencode/commands/restore.md +0 -64
  242. package/.opencode/commands/review-squad.md +0 -152
  243. package/.opencode/commands/save.md +0 -24
  244. package/.opencode/commands/stats.md +0 -19
  245. package/.opencode/commands/swarm.md +0 -210
  246. package/.opencode/commands/tool-builder.md +0 -39
  247. package/.opencode/commands/ws-pull.md +0 -44
  248. package/.opencode/opencode.json +0 -21
  249. package/inbox/failures.log +0 -1
  250. package/inbox/usage.jsonl +0 -4
  251. package/scripts/postinstall.cjs +0 -64
  252. package/scripts/test-hal-tools.ts +0 -154
@@ -78,15 +78,10 @@ var ToolGroup;
78
78
  */
79
79
  class ToolRegistry {
80
80
  tools = new Map();
81
+ _lazyGuard;
81
82
  enableNuclearTools;
82
83
  workspaceSchemas = new Map();
83
84
  workspaceSchemasLoaded = false;
84
- // Map tool names to their workspace schema files
85
- static TOOL_TO_SCHEMA_MAP = {
86
- 'create_activity': '_workspace.schema.json', // Generic workspace schema
87
- 'update_activity': '_workspace.schema.json',
88
- // Workflow-specific tools can be added dynamically
89
- };
90
85
  constructor(options = {}) {
91
86
  this.enableNuclearTools = options.enableNuclearTools ?? false;
92
87
  logger.debug('ToolRegistry instance created', {
@@ -163,6 +158,18 @@ class ToolRegistry {
163
158
  this.tools.set(tool.name, tool);
164
159
  logger.debug('Tool registered', { name: tool.name, group: tool.group });
165
160
  }
161
+ /**
162
+ * Get tool definitions filtered by contextType — single-pass, no secondary lookups
163
+ */
164
+ getToolDefinitionsByContextType(contextType) {
165
+ return Array.from(this.tools.values())
166
+ .filter(t => (t.contextType ?? 'hailer') === contextType)
167
+ .map(tool => ({
168
+ name: tool.name,
169
+ description: tool.description,
170
+ inputSchema: this.convertZodSchemaToJsonSchema(tool.schema)
171
+ }));
172
+ }
166
173
  /**
167
174
  * Get tool definitions with optional filtering
168
175
  *
@@ -276,7 +283,9 @@ class ToolRegistry {
276
283
  }
277
284
  logger.debug('Executing tool', {
278
285
  name,
279
- apiKey: context.apiKey.substring(0, 8) + '...'
286
+ auth: context?.apiKey
287
+ ? context.apiKey.substring(0, 8) + '...'
288
+ : `vipunen:${context?.group ?? 'unknown'}`
280
289
  });
281
290
  // Pre-transform for specific tools (fix common LLM mistakes before validation)
282
291
  let transformedArgs = args;
@@ -579,6 +588,27 @@ Then retry \`${name}\` with the correct format from the skill examples.` : `💡
579
588
  property.type = "string";
580
589
  }
581
590
  break;
591
+ case "ZodLazy":
592
+ // Unwrap lazy schema (used for recursive types like WhereFilter)
593
+ // Guard against infinite recursion from self-referencing schemas
594
+ if (!this._lazyGuard)
595
+ this._lazyGuard = new Set();
596
+ if (this._lazyGuard.has(unwrappedType)) {
597
+ property.type = "object";
598
+ break;
599
+ }
600
+ this._lazyGuard.add(unwrappedType);
601
+ if (unwrappedType._def?.getter) {
602
+ const resolved = unwrappedType._def.getter();
603
+ const lazyResult = this.convertZodTypeToJsonSchema(resolved);
604
+ this._lazyGuard.delete(unwrappedType);
605
+ if (property.description)
606
+ lazyResult.description = property.description;
607
+ return lazyResult;
608
+ }
609
+ this._lazyGuard.delete(unwrappedType);
610
+ property.type = "object";
611
+ break;
582
612
  default:
583
613
  property.type = "string";
584
614
  }
@@ -305,6 +305,46 @@ function formatFilteredActivityListResponse(activityData, workflow, init, args)
305
305
  ],
306
306
  };
307
307
  }
308
+ /**
309
+ * Auto-fix date fields: convert ISO date strings (e.g. "2026-03-11") to Unix timestamps (ms).
310
+ * LLMs often pass date strings instead of timestamps — this catches and converts them.
311
+ */
312
+ function autoFixDateFields(fields, context) {
313
+ if (!context.workspaceCache)
314
+ return;
315
+ for (const [fieldId, fieldValue] of Object.entries(fields)) {
316
+ // Only fix string values that look like ISO dates
317
+ if (typeof fieldValue !== 'string' || !/^\d{4}-\d{2}-\d{2}/.test(fieldValue))
318
+ continue;
319
+ // Check if this field is a date type
320
+ let fieldType;
321
+ for (const workflow of context.workspaceCache.rawInit.processes) {
322
+ const workflowFields = workflow.fields;
323
+ if (!workflowFields)
324
+ continue;
325
+ let field;
326
+ if (Array.isArray(workflowFields)) {
327
+ field = workflowFields.find((f) => f._id === fieldId || f.id === fieldId);
328
+ }
329
+ else if (typeof workflowFields === 'object') {
330
+ field = workflowFields[fieldId];
331
+ }
332
+ if (field) {
333
+ fieldType = field.type;
334
+ break;
335
+ }
336
+ }
337
+ if (fieldType === 'date') {
338
+ const parsed = new Date(fieldValue).getTime();
339
+ if (!isNaN(parsed)) {
340
+ logger.warn("Auto-fixing date field - converting ISO string to timestamp", {
341
+ fieldId, original: fieldValue, converted: parsed,
342
+ });
343
+ fields[fieldId] = parsed;
344
+ }
345
+ }
346
+ }
347
+ }
308
348
  /** Build activity update object */
309
349
  function buildActivityUpdate(args, context) {
310
350
  let parsedFields = args.fields;
@@ -345,8 +385,10 @@ function buildActivityUpdate(args, context) {
345
385
  }
346
386
  }
347
387
  }
348
- // Field-type aware validation: only validate user fields as users
388
+ // Field-type aware validation and auto-fix
349
389
  if (parsedFields && typeof parsedFields === "object" && context.workspaceCache) {
390
+ // Auto-fix date strings → timestamps
391
+ autoFixDateFields(parsedFields, context);
350
392
  const invalidUsers = [];
351
393
  for (const [fieldId, fieldValue] of Object.entries(parsedFields)) {
352
394
  // Only check string values that look like IDs
@@ -417,10 +459,24 @@ function formatUpdateActivityResponse(args, result) {
417
459
  ],
418
460
  };
419
461
  }
462
+ const listActivitiesDescription = `List activities (items/records/tasks) from a workflow phase.
463
+
464
+ **Prerequisites:** You need workflowId, phaseId, and field IDs. Get them via:
465
+ 1. \`list_workflows_minimal\` → workflowId
466
+ 2. \`list_workflow_phases\` → phaseId
467
+ 3. \`get_workflow_schema\` → field IDs for the \`fields\` parameter
468
+
469
+ **Required params:** workflowId, phaseId, fields[] (array of field IDs to return)
470
+
471
+ **Example flow:** User says "show my tasks" →
472
+ 1. list_workflows_minimal → find "Tasks" workflow
473
+ 2. list_workflow_phases → find "Open" phase
474
+ 3. get_workflow_schema → get field IDs
475
+ 4. list_activities with those IDs`;
420
476
  exports.listActivitiesTool = {
421
477
  name: 'list_activities',
422
478
  group: tool_registry_1.ToolGroup.READ,
423
- description: `List activities from workflow phase`,
479
+ description: listActivitiesDescription,
424
480
  schema: zod_1.z.object({
425
481
  workflowId: zod_1.z.string().describe("Workflow ID to list activities from"),
426
482
  phaseId: zod_1.z.string().describe("Phase ID to filter activities (required - use list_workflow_phases to get available phases)"),
@@ -560,10 +616,15 @@ exports.listActivitiesTool = {
560
616
  }
561
617
  },
562
618
  };
619
+ const showActivityByIdDescription = `Get full details of a single activity by its ID.
620
+
621
+ **When to use:** When you have an activity ID and need all its field values, or to verify an update worked.
622
+
623
+ **Returns:** Complete activity with all fields, current phase, timestamps, linked items.`;
563
624
  exports.showActivityByIdTool = {
564
625
  name: 'show_activity_by_id',
565
626
  group: tool_registry_1.ToolGroup.READ,
566
- description: `Get activity by ID`,
627
+ description: showActivityByIdDescription,
567
628
  schema: zod_1.z.object({
568
629
  activityId: zod_1.z.string().describe("Activity ID to load"),
569
630
  }),
@@ -599,11 +660,24 @@ exports.showActivityByIdTool = {
599
660
  // ============================================================================
600
661
  // TOOL 3: CREATE ACTIVITY
601
662
  // ============================================================================
602
- const createActivityDescription = `Create activity (single or bulk via activities array)
663
+ const createActivityDescription = `Create a new activity (item/record/task) in a workflow.
603
664
 
604
- **REQUIRED:** You MUST provide either 'name' (single) or 'activities' array (bulk). Calls with only workflowId will fail.
665
+ **Prerequisites:** Get IDs first via:
666
+ 1. \`list_workflows_minimal\` → workflowId
667
+ 2. \`list_workflow_phases\` → phaseId (use isInitial=true phase)
668
+ 3. \`get_workflow_schema\` → field IDs for the fields parameter
605
669
 
606
- **Date fields:** Use Unix timestamp (ms), NOT strings. Example: 1737158400000, not "2025-01-18"`;
670
+ **Required:** workflowId + (name OR activities[])
671
+ **Recommended:** phaseId (defaults to initial phase if omitted)
672
+
673
+ **Field value formats:**
674
+ - Text: \`"value"\`
675
+ - Number: \`42\`
676
+ - Date: Unix ms \`1730937600000\` (NOT "2025-01-18")
677
+ - Dropdown: exact option \`"High"\`
678
+ - User/Link: ID string \`"5f8a..."\`
679
+
680
+ **Bulk creation:** Use activities[] array instead of name/fields for multiple items.`;
607
681
  exports.createActivityTool = {
608
682
  name: 'create_activity',
609
683
  group: tool_registry_1.ToolGroup.WRITE,
@@ -691,6 +765,8 @@ exports.createActivityTool = {
691
765
  if (parsedFields &&
692
766
  typeof parsedFields === "object" &&
693
767
  Object.keys(parsedFields).length > 0) {
768
+ // Auto-fix date strings → timestamps
769
+ autoFixDateFields(parsedFields, context);
694
770
  activity.fields = parsedFields;
695
771
  }
696
772
  }
@@ -932,7 +1008,21 @@ exports.createActivityTool = {
932
1008
  // ============================================================================
933
1009
  // TOOL 4: UPDATE ACTIVITY
934
1010
  // ============================================================================
935
- const updateActivityDescription = `Update activity (single or bulk via activities array)`;
1011
+ const updateActivityDescription = `Update an existing activity - change fields or move to different phase.
1012
+
1013
+ **To update fields:** Get field IDs from \`get_workflow_schema\` first, then pass them in the fields object.
1014
+ **To change phase:** Get phase IDs from \`list_workflow_phases\`, pass target phaseId.
1015
+
1016
+ **Required:** activityId (for single) OR activities[] array (for bulk)
1017
+
1018
+ **Field value formats:**
1019
+ - Text: \`"value"\`
1020
+ - Number: \`42\`
1021
+ - Date: Unix ms \`1730937600000\` (NOT strings)
1022
+ - ActivityLink: just the ID string \`"abc123..."\` (NOT an object)
1023
+
1024
+ **Example - move to Done:** \`update_activity({ activityId: "...", phaseId: "done-phase-id" })\`
1025
+ **Example - update field:** \`update_activity({ activityId: "...", fields: { "fieldId": "new value" } })\``;
936
1026
  exports.updateActivityTool = {
937
1027
  name: 'update_activity',
938
1028
  group: tool_registry_1.ToolGroup.WRITE,
@@ -1026,6 +1116,8 @@ exports.updateActivityTool = {
1026
1116
  }
1027
1117
  }
1028
1118
  }
1119
+ // Auto-fix date strings → timestamps
1120
+ autoFixDateFields(parsedFields, context);
1029
1121
  activityUpdate.fields = parsedFields;
1030
1122
  }
1031
1123
  return activityUpdate;