@hailer/mcp 1.1.12 → 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 (271) hide show
  1. package/CHANGELOG.md +0 -7
  2. package/{.claude → dist}/CLAUDE.md +2 -2
  3. package/dist/app.js +18 -5
  4. package/dist/bot/bot-config.d.ts +10 -1
  5. package/dist/bot/bot-config.js +64 -3
  6. package/dist/bot/bot-manager.d.ts +2 -0
  7. package/dist/bot/bot-manager.js +9 -2
  8. package/dist/bot/bot.d.ts +33 -0
  9. package/dist/bot/bot.js +461 -160
  10. package/dist/bot/services/message-classifier.js +17 -0
  11. package/dist/bot/services/permission-guard.d.ts +52 -0
  12. package/dist/bot/services/permission-guard.js +149 -0
  13. package/dist/bot/services/types.d.ts +5 -0
  14. package/dist/bot/services/typing-indicator.d.ts +6 -1
  15. package/dist/bot/services/typing-indicator.js +19 -3
  16. package/dist/cli.js +0 -0
  17. package/dist/config.d.ts +6 -1
  18. package/dist/config.js +43 -0
  19. package/dist/core.js +3 -6
  20. package/dist/lib/discussion-lock.d.ts +42 -0
  21. package/dist/lib/discussion-lock.js +110 -0
  22. package/dist/mcp/UserContextCache.d.ts +5 -0
  23. package/dist/mcp/UserContextCache.js +51 -19
  24. package/dist/mcp/hailer-clients.d.ts +19 -1
  25. package/dist/mcp/hailer-clients.js +158 -24
  26. package/dist/mcp/session-store.d.ts +68 -0
  27. package/dist/mcp/session-store.js +169 -0
  28. package/dist/mcp/signal-handler.js +2 -0
  29. package/dist/mcp/tool-registry.d.ts +17 -4
  30. package/dist/mcp/tool-registry.js +37 -7
  31. package/dist/mcp/tools/activity.js +99 -7
  32. package/dist/mcp/tools/app-scaffold.js +304 -336
  33. package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
  34. package/dist/mcp/tools/bot-config/constants.js +94 -0
  35. package/dist/mcp/tools/bot-config/core.d.ts +253 -0
  36. package/dist/mcp/tools/bot-config/core.js +2456 -0
  37. package/dist/mcp/tools/bot-config/index.d.ts +10 -0
  38. package/dist/mcp/tools/bot-config/index.js +59 -0
  39. package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
  40. package/dist/mcp/tools/bot-config/tools.js +15 -0
  41. package/dist/mcp/tools/bot-config/types.d.ts +50 -0
  42. package/dist/mcp/tools/bot-config/types.js +6 -0
  43. package/dist/mcp/tools/bug-fixer-tools.d.ts +45 -0
  44. package/dist/mcp/tools/bug-fixer-tools.js +1096 -0
  45. package/dist/mcp/tools/company.d.ts +9 -0
  46. package/dist/mcp/tools/company.js +88 -0
  47. package/dist/mcp/tools/discussion.js +68 -0
  48. package/dist/mcp/tools/document.d.ts +11 -0
  49. package/dist/mcp/tools/document.js +741 -0
  50. package/dist/mcp/tools/investigate.d.ts +9 -0
  51. package/dist/mcp/tools/investigate.js +254 -0
  52. package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
  53. package/dist/mcp/tools/workflow-permissions.js +204 -0
  54. package/dist/mcp/tools/workflow.js +57 -18
  55. package/dist/mcp/utils/index.d.ts +2 -0
  56. package/dist/mcp/utils/index.js +12 -1
  57. package/dist/mcp/utils/role-utils.d.ts +74 -0
  58. package/dist/mcp/utils/role-utils.js +151 -0
  59. package/dist/mcp/utils/types.d.ts +43 -1
  60. package/dist/mcp/utils/types.js +14 -0
  61. package/dist/mcp/webhook-handler.d.ts +4 -0
  62. package/dist/mcp/webhook-handler.js +8 -0
  63. package/dist/mcp-server.d.ts +23 -2
  64. package/dist/mcp-server.js +639 -127
  65. package/dist/plugins/vipunen/client.d.ts +150 -0
  66. package/dist/plugins/vipunen/client.js +535 -0
  67. package/dist/plugins/vipunen/config/schema-config.json +19 -0
  68. package/dist/plugins/vipunen/config/schema-doc.json +22 -0
  69. package/dist/plugins/vipunen/index.d.ts +41 -0
  70. package/dist/plugins/vipunen/index.js +88 -0
  71. package/dist/plugins/vipunen/tools.d.ts +26 -0
  72. package/dist/plugins/vipunen/tools.js +501 -0
  73. package/dist/stdio-server.d.ts +14 -0
  74. package/dist/stdio-server.js +101 -0
  75. package/package.json +2 -1
  76. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  77. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  78. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  79. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  80. package/.claude/agents/agent-code-simplifier.md +0 -53
  81. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  82. package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
  83. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  84. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  85. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  86. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  87. package/.claude/agents/agent-ivan-monolith.md +0 -154
  88. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  89. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  90. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  91. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  92. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  93. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  94. package/.claude/agents/agent-permissions-handler.md +0 -208
  95. package/.claude/agents/agent-simple-writer.md +0 -48
  96. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  97. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  98. package/.claude/agents/agent-ui-designer.md +0 -100
  99. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  100. package/.claude/agents/agent-web-search.md +0 -55
  101. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  102. package/.claude/agents/agent-zara-zapier.md +0 -159
  103. package/.claude/commands/app-squad.md +0 -135
  104. package/.claude/commands/audit-squad.md +0 -158
  105. package/.claude/commands/autoplan.md +0 -563
  106. package/.claude/commands/cleanup-squad.md +0 -98
  107. package/.claude/commands/config-squad.md +0 -106
  108. package/.claude/commands/crud-squad.md +0 -87
  109. package/.claude/commands/data-squad.md +0 -97
  110. package/.claude/commands/debug-squad.md +0 -303
  111. package/.claude/commands/doc-squad.md +0 -65
  112. package/.claude/commands/handoff.md +0 -137
  113. package/.claude/commands/health.md +0 -49
  114. package/.claude/commands/help.md +0 -29
  115. package/.claude/commands/help:agents.md +0 -151
  116. package/.claude/commands/help:commands.md +0 -78
  117. package/.claude/commands/help:faq.md +0 -79
  118. package/.claude/commands/help:plugins.md +0 -50
  119. package/.claude/commands/help:skills.md +0 -93
  120. package/.claude/commands/help:tools.md +0 -75
  121. package/.claude/commands/hotfix-squad.md +0 -112
  122. package/.claude/commands/integration-squad.md +0 -82
  123. package/.claude/commands/janitor-squad.md +0 -167
  124. package/.claude/commands/learn-auto.md +0 -120
  125. package/.claude/commands/learn.md +0 -120
  126. package/.claude/commands/mcp-list.md +0 -27
  127. package/.claude/commands/onboard-squad.md +0 -140
  128. package/.claude/commands/plan-workspace.md +0 -732
  129. package/.claude/commands/prd.md +0 -130
  130. package/.claude/commands/project-status.md +0 -82
  131. package/.claude/commands/publish.md +0 -138
  132. package/.claude/commands/recap.md +0 -69
  133. package/.claude/commands/restore.md +0 -64
  134. package/.claude/commands/review-squad.md +0 -152
  135. package/.claude/commands/save.md +0 -24
  136. package/.claude/commands/stats.md +0 -19
  137. package/.claude/commands/swarm.md +0 -210
  138. package/.claude/commands/tool-builder.md +0 -39
  139. package/.claude/commands/ws-pull.md +0 -44
  140. package/.claude/hooks/_shared-memory.cjs +0 -305
  141. package/.claude/hooks/_utils.cjs +0 -108
  142. package/.claude/hooks/agent-failure-detector.cjs +0 -383
  143. package/.claude/hooks/agent-usage-logger.cjs +0 -204
  144. package/.claude/hooks/app-edit-guard.cjs +0 -494
  145. package/.claude/hooks/auto-learn.cjs +0 -304
  146. package/.claude/hooks/bash-guard.cjs +0 -272
  147. package/.claude/hooks/builder-mode-manager.cjs +0 -354
  148. package/.claude/hooks/bulk-activity-guard.cjs +0 -271
  149. package/.claude/hooks/context-watchdog.cjs +0 -230
  150. package/.claude/hooks/delegation-reminder.cjs +0 -465
  151. package/.claude/hooks/design-system-lint.cjs +0 -271
  152. package/.claude/hooks/post-scaffold-hook.cjs +0 -181
  153. package/.claude/hooks/prompt-guard.cjs +0 -354
  154. package/.claude/hooks/publish-template-guard.cjs +0 -147
  155. package/.claude/hooks/session-start.cjs +0 -35
  156. package/.claude/hooks/shared-memory-writer.cjs +0 -147
  157. package/.claude/hooks/skill-injector.cjs +0 -140
  158. package/.claude/hooks/skill-usage-logger.cjs +0 -258
  159. package/.claude/hooks/src-edit-guard.cjs +0 -240
  160. package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
  161. package/.claude/settings.json +0 -257
  162. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  163. package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
  164. package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
  165. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  166. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  167. package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
  168. package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
  169. package/.claude/skills/agent-structure/SKILL.md +0 -98
  170. package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
  171. package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
  172. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  173. package/.claude/skills/frontend-design/SKILL.md +0 -254
  174. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  175. package/.claude/skills/hailer-api-client/SKILL.md +0 -518
  176. package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
  177. package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
  178. package/.claude/skills/hailer-design-system/SKILL.md +0 -235
  179. package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
  180. package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
  181. package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
  182. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  183. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  184. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  185. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  186. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  187. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  188. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  189. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  190. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  191. package/.claude/skills/integration-patterns/SKILL.md +0 -421
  192. package/.claude/skills/json-only-output/SKILL.md +0 -72
  193. package/.claude/skills/lsp-setup/SKILL.md +0 -160
  194. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  195. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  196. package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
  197. package/.claude/skills/testing-patterns/SKILL.md +0 -630
  198. package/.claude/skills/tool-builder/SKILL.md +0 -250
  199. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  200. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  201. package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
  202. package/.mcp.json +0 -13
  203. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  204. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  205. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  206. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  207. package/.opencode/agent/agent-code-simplifier.md +0 -31
  208. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  209. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  210. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  211. package/.opencode/agent/agent-helga-workflow-config.md +0 -203
  212. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  213. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  214. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  215. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  216. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  217. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  218. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  219. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  220. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  221. package/.opencode/agent/agent-permissions-handler.md +0 -50
  222. package/.opencode/agent/agent-simple-writer.md +0 -45
  223. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  224. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  225. package/.opencode/agent/agent-ui-designer.md +0 -56
  226. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  227. package/.opencode/agent/agent-web-search.md +0 -42
  228. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  229. package/.opencode/agent/agent-zara-zapier.md +0 -53
  230. package/.opencode/commands/app-squad.md +0 -135
  231. package/.opencode/commands/audit-squad.md +0 -158
  232. package/.opencode/commands/autoplan.md +0 -563
  233. package/.opencode/commands/cleanup-squad.md +0 -98
  234. package/.opencode/commands/config-squad.md +0 -106
  235. package/.opencode/commands/crud-squad.md +0 -87
  236. package/.opencode/commands/data-squad.md +0 -97
  237. package/.opencode/commands/debug-squad.md +0 -303
  238. package/.opencode/commands/doc-squad.md +0 -65
  239. package/.opencode/commands/handoff.md +0 -137
  240. package/.opencode/commands/health.md +0 -49
  241. package/.opencode/commands/help-agents.md +0 -151
  242. package/.opencode/commands/help-commands.md +0 -32
  243. package/.opencode/commands/help-faq.md +0 -29
  244. package/.opencode/commands/help-plugins.md +0 -28
  245. package/.opencode/commands/help-skills.md +0 -7
  246. package/.opencode/commands/help-tools.md +0 -40
  247. package/.opencode/commands/help.md +0 -28
  248. package/.opencode/commands/hotfix-squad.md +0 -112
  249. package/.opencode/commands/integration-squad.md +0 -82
  250. package/.opencode/commands/janitor-squad.md +0 -167
  251. package/.opencode/commands/learn-auto.md +0 -120
  252. package/.opencode/commands/learn.md +0 -120
  253. package/.opencode/commands/mcp-list.md +0 -27
  254. package/.opencode/commands/onboard-squad.md +0 -140
  255. package/.opencode/commands/plan-workspace.md +0 -732
  256. package/.opencode/commands/prd.md +0 -131
  257. package/.opencode/commands/project-status.md +0 -82
  258. package/.opencode/commands/publish.md +0 -138
  259. package/.opencode/commands/recap.md +0 -69
  260. package/.opencode/commands/restore.md +0 -64
  261. package/.opencode/commands/review-squad.md +0 -152
  262. package/.opencode/commands/save.md +0 -24
  263. package/.opencode/commands/stats.md +0 -19
  264. package/.opencode/commands/swarm.md +0 -210
  265. package/.opencode/commands/tool-builder.md +0 -39
  266. package/.opencode/commands/ws-pull.md +0 -44
  267. package/.opencode/opencode.json +0 -28
  268. package/SESSION-HANDOFF.md +0 -68
  269. package/inbox/2026-03-04-bot-config-patterns.md +0 -24
  270. package/scripts/postinstall.cjs +0 -64
  271. package/scripts/test-hal-tools.ts +0 -154
@@ -10,7 +10,6 @@
10
10
  * - Enables Claude's strict mode validation with actual workspace values
11
11
  */
12
12
  import { z } from 'zod';
13
- import { UserContext } from './UserContextCache';
14
13
  import { McpResponse } from './utils/types';
15
14
  /**
16
15
  * Tool groups for access control
@@ -27,6 +26,12 @@ export declare enum ToolGroup {
27
26
  NUCLEAR = "nuclear",
28
27
  BOT_INTERNAL = "bot_internal"
29
28
  }
29
+ /**
30
+ * Context type for tool execution
31
+ * - 'hailer': Requires Hailer authentication via UserContextCache (default)
32
+ * - 'none': No authentication needed (e.g., Weaviate tools with their own auth)
33
+ */
34
+ export type ToolContextType = 'hailer' | 'none';
30
35
  /**
31
36
  * Tool definition interface
32
37
  */
@@ -35,7 +40,11 @@ export interface Tool<TSchema extends z.ZodType = z.ZodType> {
35
40
  group: ToolGroup;
36
41
  description: string;
37
42
  schema: TSchema;
38
- execute: (args: z.infer<TSchema>, context: UserContext) => Promise<McpResponse>;
43
+ /** What authentication context this tool needs. Defaults to 'hailer'. */
44
+ contextType?: ToolContextType;
45
+ /** Context is UserContext for Hailer tools, VipunenContext for contextType:'none' tools.
46
+ * Type safety is enforced at the mcp-server dispatch boundary, not here. */
47
+ execute: (args: z.infer<TSchema>, context: any) => Promise<McpResponse>;
39
48
  }
40
49
  /**
41
50
  * Tool definition for MCP protocol (JSON-RPC)
@@ -56,10 +65,10 @@ export interface ToolDefinition {
56
65
  */
57
66
  export declare class ToolRegistry {
58
67
  private tools;
68
+ private _lazyGuard?;
59
69
  private enableNuclearTools;
60
70
  private workspaceSchemas;
61
71
  private workspaceSchemasLoaded;
62
- private static readonly TOOL_TO_SCHEMA_MAP;
63
72
  constructor(options?: {
64
73
  enableNuclearTools?: boolean;
65
74
  });
@@ -80,6 +89,10 @@ export declare class ToolRegistry {
80
89
  * Add a tool to the registry
81
90
  */
82
91
  addTool(tool: Tool): void;
92
+ /**
93
+ * Get tool definitions filtered by contextType — single-pass, no secondary lookups
94
+ */
95
+ getToolDefinitionsByContextType(contextType: ToolContextType): ToolDefinition[];
83
96
  /**
84
97
  * Get tool definitions with optional filtering
85
98
  *
@@ -108,7 +121,7 @@ export declare class ToolRegistry {
108
121
  /**
109
122
  * Execute tool with validation
110
123
  */
111
- executeTool(name: string, args: any, context: UserContext): Promise<any>;
124
+ executeTool(name: string, args: any, context: any): Promise<any>;
112
125
  /**
113
126
  * Pre-transform install_workflow args to fix common LLM mistakes BEFORE validation
114
127
  */
@@ -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;