@hailer/mcp 1.0.29 → 1.1.2

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 (233) hide show
  1. package/.claude/.session-checked +1 -0
  2. package/.claude/agents/agent-ada-skill-builder.md +10 -2
  3. package/.claude/agents/agent-alejandro-function-fields.md +104 -37
  4. package/.claude/agents/agent-bjorn-config-audit.md +41 -21
  5. package/.claude/agents/agent-builder-agent-creator.md +13 -3
  6. package/.claude/agents/agent-code-simplifier.md +53 -0
  7. package/.claude/agents/agent-dmitri-activity-crud.md +126 -11
  8. package/.claude/agents/agent-giuseppe-app-builder.md +212 -22
  9. package/.claude/agents/agent-gunther-mcp-tools.md +7 -36
  10. package/.claude/agents/agent-helga-workflow-config.md +75 -10
  11. package/.claude/agents/agent-igor-activity-mover-automation.md +125 -0
  12. package/.claude/agents/agent-ingrid-doc-templates.md +164 -36
  13. package/.claude/agents/agent-ivan-monolith.md +154 -0
  14. package/.claude/agents/agent-kenji-data-reader.md +15 -8
  15. package/.claude/agents/agent-lars-code-inspector.md +56 -8
  16. package/.claude/agents/agent-marco-mockup-builder.md +110 -0
  17. package/.claude/agents/agent-marcus-api-documenter.md +323 -0
  18. package/.claude/agents/agent-marketplace-publisher.md +232 -72
  19. package/.claude/agents/agent-marketplace-reviewer.md +255 -79
  20. package/.claude/agents/agent-permissions-handler.md +208 -0
  21. package/.claude/agents/agent-simple-writer.md +48 -0
  22. package/.claude/agents/agent-svetlana-code-review.md +127 -14
  23. package/.claude/agents/agent-tanya-test-runner.md +333 -0
  24. package/.claude/agents/agent-ui-designer.md +100 -0
  25. package/.claude/agents/agent-viktor-sql-insights.md +19 -6
  26. package/.claude/agents/agent-web-search.md +55 -0
  27. package/.claude/agents/agent-yevgeni-discussions.md +7 -1
  28. package/.claude/agents/agent-zara-zapier.md +159 -0
  29. package/.claude/commands/app-squad.md +135 -0
  30. package/.claude/commands/audit-squad.md +158 -0
  31. package/.claude/commands/autoplan.md +563 -0
  32. package/.claude/commands/cleanup-squad.md +98 -0
  33. package/.claude/commands/config-squad.md +106 -0
  34. package/.claude/commands/crud-squad.md +87 -0
  35. package/.claude/commands/data-squad.md +97 -0
  36. package/.claude/commands/debug-squad.md +303 -0
  37. package/.claude/commands/doc-squad.md +65 -0
  38. package/.claude/commands/handoff.md +137 -0
  39. package/.claude/commands/health.md +49 -0
  40. package/.claude/commands/help.md +2 -1
  41. package/.claude/commands/help:agents.md +96 -16
  42. package/.claude/commands/help:commands.md +55 -11
  43. package/.claude/commands/help:faq.md +16 -1
  44. package/.claude/commands/help:skills.md +93 -0
  45. package/.claude/commands/hotfix-squad.md +112 -0
  46. package/.claude/commands/integration-squad.md +82 -0
  47. package/.claude/commands/janitor-squad.md +167 -0
  48. package/.claude/commands/learn-auto.md +120 -0
  49. package/.claude/commands/learn.md +120 -0
  50. package/.claude/commands/mcp-list.md +27 -0
  51. package/.claude/commands/onboard-squad.md +140 -0
  52. package/.claude/commands/plan-workspace.md +732 -0
  53. package/.claude/commands/prd.md +131 -0
  54. package/.claude/commands/project-status.md +82 -0
  55. package/.claude/commands/publish.md +138 -0
  56. package/.claude/commands/recap.md +69 -0
  57. package/.claude/commands/restore.md +64 -0
  58. package/.claude/commands/review-squad.md +152 -0
  59. package/.claude/commands/save.md +24 -0
  60. package/.claude/commands/stats.md +19 -0
  61. package/.claude/commands/swarm.md +210 -0
  62. package/.claude/commands/tool-builder.md +3 -1
  63. package/.claude/commands/ws-pull.md +1 -1
  64. package/.claude/commands/yolo-off.md +17 -0
  65. package/.claude/commands/yolo.md +82 -0
  66. package/.claude/hooks/_shared-memory.cjs +305 -0
  67. package/.claude/hooks/_utils.cjs +134 -0
  68. package/.claude/hooks/agent-failure-detector.cjs +164 -79
  69. package/.claude/hooks/agent-usage-logger.cjs +204 -0
  70. package/.claude/hooks/app-edit-guard.cjs +20 -4
  71. package/.claude/hooks/auto-learn.cjs +316 -0
  72. package/.claude/hooks/bash-guard.cjs +282 -0
  73. package/.claude/hooks/builder-mode-manager.cjs +183 -54
  74. package/.claude/hooks/bulk-activity-guard.cjs +283 -0
  75. package/.claude/hooks/context-watchdog.cjs +292 -0
  76. package/.claude/hooks/delegation-reminder.cjs +478 -0
  77. package/.claude/hooks/design-system-lint.cjs +283 -0
  78. package/.claude/hooks/post-scaffold-hook.cjs +16 -3
  79. package/.claude/hooks/prompt-guard.cjs +366 -0
  80. package/.claude/hooks/publish-template-guard.cjs +16 -0
  81. package/.claude/hooks/session-start.cjs +35 -0
  82. package/.claude/hooks/shared-memory-writer.cjs +147 -0
  83. package/.claude/hooks/skill-injector.cjs +140 -0
  84. package/.claude/hooks/skill-usage-logger.cjs +258 -0
  85. package/.claude/hooks/src-edit-guard.cjs +16 -1
  86. package/.claude/hooks/sync-marketplace-agents.cjs +53 -8
  87. package/.claude/scripts/yolo-toggle.cjs +142 -0
  88. package/.claude/settings.json +141 -14
  89. package/.claude/skills/SDK-activity-patterns/SKILL.md +428 -0
  90. package/.claude/skills/SDK-document-templates/SKILL.md +1033 -0
  91. package/.claude/skills/SDK-function-fields/SKILL.md +542 -0
  92. package/.claude/skills/SDK-generate-skill/SKILL.md +92 -0
  93. package/.claude/skills/SDK-init-skill/SKILL.md +127 -0
  94. package/.claude/skills/SDK-insight-queries/SKILL.md +787 -0
  95. package/.claude/skills/SDK-ws-config-skill/SKILL.md +1139 -0
  96. package/.claude/skills/agent-structure/SKILL.md +98 -0
  97. package/.claude/skills/api-documentation-patterns/SKILL.md +474 -0
  98. package/.claude/skills/chrome-mcp-reference/SKILL.md +370 -0
  99. package/.claude/skills/delegation-routing/SKILL.md +202 -0
  100. package/.claude/skills/frontend-design/SKILL.md +254 -0
  101. package/.claude/skills/hailer-activity-mover/SKILL.md +213 -0
  102. package/.claude/skills/hailer-api-client/SKILL.md +518 -0
  103. package/.claude/skills/hailer-app-builder/SKILL.md +939 -11
  104. package/.claude/skills/hailer-apps-pictures/SKILL.md +269 -0
  105. package/.claude/skills/hailer-design-system/SKILL.md +235 -0
  106. package/.claude/skills/hailer-monolith-automations/SKILL.md +686 -0
  107. package/.claude/skills/hailer-permissions-system/SKILL.md +121 -0
  108. package/.claude/skills/hailer-project-protocol/SKILL.md +488 -0
  109. package/.claude/skills/hailer-rest-api/SKILL.md +61 -0
  110. package/.claude/skills/hailer-rest-api/hailer-activities.md +184 -0
  111. package/.claude/skills/hailer-rest-api/hailer-admin.md +473 -0
  112. package/.claude/skills/hailer-rest-api/hailer-calendar.md +256 -0
  113. package/.claude/skills/hailer-rest-api/hailer-feed.md +249 -0
  114. package/.claude/skills/hailer-rest-api/hailer-insights.md +195 -0
  115. package/.claude/skills/hailer-rest-api/hailer-messaging.md +276 -0
  116. package/.claude/skills/hailer-rest-api/hailer-workflows.md +283 -0
  117. package/.claude/skills/insight-join-patterns/SKILL.md +3 -0
  118. package/.claude/skills/integration-patterns/SKILL.md +421 -0
  119. package/.claude/skills/json-only-output/SKILL.md +52 -12
  120. package/.claude/skills/lsp-setup/SKILL.md +160 -0
  121. package/.claude/skills/mcp-direct-tools/SKILL.md +153 -0
  122. package/.claude/skills/optional-parameters/SKILL.md +32 -23
  123. package/.claude/skills/publish-hailer-app/SKILL.md +76 -12
  124. package/.claude/skills/testing-patterns/SKILL.md +630 -0
  125. package/.claude/skills/tool-builder/SKILL.md +250 -0
  126. package/.claude/skills/tool-parameter-usage/SKILL.md +59 -45
  127. package/.claude/skills/tool-response-verification/SKILL.md +82 -48
  128. package/.claude/skills/zapier-hailer-patterns/SKILL.md +581 -0
  129. package/.env.example +26 -7
  130. package/CLAUDE.md +290 -224
  131. package/dist/CLAUDE.md +370 -0
  132. package/dist/app.d.ts +1 -1
  133. package/dist/app.js +101 -101
  134. package/dist/bot/bot-config.d.ts +26 -0
  135. package/dist/bot/bot-config.js +135 -0
  136. package/dist/bot/bot-manager.d.ts +40 -0
  137. package/dist/bot/bot-manager.js +137 -0
  138. package/dist/bot/bot.d.ts +127 -0
  139. package/dist/bot/bot.js +1328 -0
  140. package/dist/bot/operation-logger.d.ts +28 -0
  141. package/dist/bot/operation-logger.js +132 -0
  142. package/dist/bot/services/conversation-manager.d.ts +60 -0
  143. package/dist/bot/services/conversation-manager.js +246 -0
  144. package/dist/bot/services/index.d.ts +9 -0
  145. package/dist/bot/services/index.js +18 -0
  146. package/dist/bot/services/message-classifier.d.ts +42 -0
  147. package/dist/bot/services/message-classifier.js +228 -0
  148. package/dist/bot/services/message-formatter.d.ts +88 -0
  149. package/dist/bot/services/message-formatter.js +411 -0
  150. package/dist/bot/services/session-logger.d.ts +162 -0
  151. package/dist/bot/services/session-logger.js +724 -0
  152. package/dist/bot/services/token-billing.d.ts +78 -0
  153. package/dist/bot/services/token-billing.js +233 -0
  154. package/dist/bot/services/types.d.ts +169 -0
  155. package/dist/bot/services/types.js +12 -0
  156. package/dist/bot/services/typing-indicator.d.ts +23 -0
  157. package/dist/bot/services/typing-indicator.js +60 -0
  158. package/dist/bot/services/workspace-schema-cache.d.ts +122 -0
  159. package/dist/bot/services/workspace-schema-cache.js +506 -0
  160. package/dist/bot/tool-executor.d.ts +28 -0
  161. package/dist/bot/tool-executor.js +48 -0
  162. package/dist/bot/workspace-overview.d.ts +12 -0
  163. package/dist/bot/workspace-overview.js +94 -0
  164. package/dist/cli.d.ts +1 -8
  165. package/dist/cli.js +1 -253
  166. package/dist/config.d.ts +96 -3
  167. package/dist/config.js +148 -37
  168. package/dist/core.d.ts +5 -0
  169. package/dist/core.js +61 -8
  170. package/dist/lib/discussion-lock.d.ts +42 -0
  171. package/dist/lib/discussion-lock.js +110 -0
  172. package/dist/lib/logger.d.ts +0 -1
  173. package/dist/lib/logger.js +39 -23
  174. package/dist/lib/request-logger.d.ts +77 -0
  175. package/dist/lib/request-logger.js +147 -0
  176. package/dist/mcp/UserContextCache.js +16 -13
  177. package/dist/mcp/hailer-clients.js +18 -17
  178. package/dist/mcp/signal-handler.js +29 -13
  179. package/dist/mcp/tool-registry.d.ts +4 -15
  180. package/dist/mcp/tool-registry.js +94 -32
  181. package/dist/mcp/tools/activity.js +28 -69
  182. package/dist/mcp/tools/app-core.js +9 -4
  183. package/dist/mcp/tools/app-marketplace.js +22 -12
  184. package/dist/mcp/tools/app-member.js +5 -2
  185. package/dist/mcp/tools/app-scaffold.js +32 -18
  186. package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
  187. package/dist/mcp/tools/bot-config/constants.js +94 -0
  188. package/dist/mcp/tools/bot-config/core.d.ts +253 -0
  189. package/dist/mcp/tools/bot-config/core.js +2456 -0
  190. package/dist/mcp/tools/bot-config/index.d.ts +10 -0
  191. package/dist/mcp/tools/bot-config/index.js +59 -0
  192. package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
  193. package/dist/mcp/tools/bot-config/tools.js +15 -0
  194. package/dist/mcp/tools/bot-config/types.d.ts +50 -0
  195. package/dist/mcp/tools/bot-config/types.js +6 -0
  196. package/dist/mcp/tools/discussion.js +107 -77
  197. package/dist/mcp/tools/document.d.ts +11 -0
  198. package/dist/mcp/tools/document.js +741 -0
  199. package/dist/mcp/tools/file.js +5 -2
  200. package/dist/mcp/tools/insight.js +36 -12
  201. package/dist/mcp/tools/investigate.d.ts +9 -0
  202. package/dist/mcp/tools/investigate.js +254 -0
  203. package/dist/mcp/tools/user.d.ts +2 -4
  204. package/dist/mcp/tools/user.js +9 -50
  205. package/dist/mcp/tools/workflow.d.ts +1 -0
  206. package/dist/mcp/tools/workflow.js +164 -52
  207. package/dist/mcp/utils/hailer-api-client.js +26 -17
  208. package/dist/mcp/webhook-handler.d.ts +64 -3
  209. package/dist/mcp/webhook-handler.js +219 -9
  210. package/dist/mcp-server.d.ts +4 -0
  211. package/dist/mcp-server.js +237 -25
  212. package/dist/plugins/bug-fixer/index.d.ts +2 -0
  213. package/dist/plugins/bug-fixer/index.js +18 -0
  214. package/dist/plugins/bug-fixer/tools.d.ts +45 -0
  215. package/dist/plugins/bug-fixer/tools.js +1096 -0
  216. package/package.json +10 -10
  217. package/scripts/test-hal-tools.ts +154 -0
  218. package/.claude/agents/agent-nora-name-functions.md +0 -123
  219. package/.claude/assistant-knowledge.md +0 -23
  220. package/.claude/commands/install-plugin.md +0 -261
  221. package/.claude/commands/list-plugins.md +0 -42
  222. package/.claude/commands/marketplace-setup.md +0 -33
  223. package/.claude/commands/publish-plugin.md +0 -55
  224. package/.claude/commands/uninstall-plugin.md +0 -87
  225. package/.claude/hooks/interactive-mode.cjs +0 -87
  226. package/.claude/hooks/mcp-server-guard.cjs +0 -108
  227. package/.claude/skills/marketplace-publishing.md +0 -155
  228. package/dist/bot/chat-bot.d.ts +0 -31
  229. package/dist/bot/chat-bot.js +0 -357
  230. package/dist/mcp/tools/metrics.d.ts +0 -13
  231. package/dist/mcp/tools/metrics.js +0 -546
  232. package/dist/stdio-server.d.ts +0 -14
  233. package/dist/stdio-server.js +0 -114
@@ -6,10 +6,12 @@
6
6
  * These are PLAYGROUND tools requiring workspace administrator permissions.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.updateWorkflowPhaseTool = exports.countActivitiesTool = exports.listWorkflowsMinimalTool = exports.testFunctionFieldTool = exports.updateWorkflowFieldTool = exports.removeWorkflowTool = exports.installWorkflowTool = exports.listWorkflowsTool = exports.listWorkflowPhasesTool = exports.getWorkflowSchemaTool = void 0;
9
+ exports.updateWorkflowPhaseTool = exports.coreInitTool = exports.countActivitiesTool = exports.listWorkflowsMinimalTool = exports.testFunctionFieldTool = exports.updateWorkflowFieldTool = exports.removeWorkflowTool = exports.installWorkflowTool = exports.listWorkflowsTool = exports.listWorkflowPhasesTool = exports.getWorkflowSchemaTool = void 0;
10
10
  const zod_1 = require("zod");
11
11
  const tool_registry_1 = require("../tool-registry");
12
12
  const logger_1 = require("../../lib/logger");
13
+ const request_logger_1 = require("../../lib/request-logger");
14
+ const workspace_overview_1 = require("../../bot/workspace-overview");
13
15
  const logger = (0, logger_1.createLogger)({ component: 'workflow-tools' });
14
16
  // ============================================================================
15
17
  // HELPER FUNCTIONS
@@ -166,7 +168,8 @@ exports.getWorkflowSchemaTool = {
166
168
  };
167
169
  }
168
170
  catch (error) {
169
- logger.error("Failed to get workflow schema", error);
171
+ if (!request_logger_1.RequestLogger.getCurrent())
172
+ logger.error("Failed to get workflow schema", error);
170
173
  return {
171
174
  content: [{
172
175
  type: "text",
@@ -244,7 +247,8 @@ exports.listWorkflowPhasesTool = {
244
247
  };
245
248
  }
246
249
  catch (error) {
247
- logger.error("Failed to list workflow phases", error);
250
+ if (!request_logger_1.RequestLogger.getCurrent())
251
+ logger.error("Failed to list workflow phases", error);
248
252
  return {
249
253
  content: [{
250
254
  type: "text",
@@ -345,7 +349,8 @@ exports.listWorkflowsTool = {
345
349
  };
346
350
  }
347
351
  catch (error) {
348
- logger.error("Error listing workflows", error);
352
+ if (!request_logger_1.RequestLogger.getCurrent())
353
+ logger.error("Error listing workflows", error);
349
354
  return {
350
355
  content: [{
351
356
  type: "text",
@@ -388,7 +393,7 @@ const installWorkflowSchema = zod_1.z.object({
388
393
  ]).describe("Field type"),
389
394
  key: zod_1.z.string().optional().describe("Readable field name (like SQL column name) - RECOMMENDED"),
390
395
  required: zod_1.z.boolean().optional().describe("Whether field is required"),
391
- data: zod_1.z.array(zod_1.z.string()).optional().describe("For textpredefinedoptions: string array like [\"Low\", \"Medium\", \"High\"]. For activitylink: target workflow IDs"),
396
+ data: zod_1.z.array(zod_1.z.string()).optional().describe("For textpredefinedoptions: string array like [\"Low\", \"Medium\", \"High\"]. For activitylink: target workflow IDs. NOTE: 'options' also accepted, will be converted to 'data'"),
392
397
  placeholder: zod_1.z.string().optional().describe("Placeholder text"),
393
398
  unit: zod_1.z.string().optional().describe("Unit for numeric/textunit fields"),
394
399
  description: zod_1.z.string().optional().describe("Field description"),
@@ -441,14 +446,61 @@ exports.installWorkflowTool = {
441
446
  }],
442
447
  };
443
448
  }
449
+ // Transform templates: fix common LLM mistakes
450
+ const transformedTemplates = args.workflowTemplates.map((template) => {
451
+ let result = { ...template };
452
+ // Transform fields
453
+ if (template.fields) {
454
+ const transformedFields = {};
455
+ for (const [fieldId, field] of Object.entries(template.fields)) {
456
+ const f = { ...field };
457
+ // Convert options/predefinedOptions/selectOptions → data
458
+ if (!f.data) {
459
+ if (f.options) {
460
+ f.data = f.options;
461
+ delete f.options;
462
+ }
463
+ else if (f.predefinedOptions) {
464
+ f.data = f.predefinedOptions;
465
+ delete f.predefinedOptions;
466
+ }
467
+ else if (f.selectOptions) {
468
+ // Handle both array and object selectOptions
469
+ f.data = Array.isArray(f.selectOptions)
470
+ ? f.selectOptions.map((o) => o.label || o.value || o)
471
+ : Object.values(f.selectOptions);
472
+ delete f.selectOptions;
473
+ }
474
+ }
475
+ // Remove disallowed properties
476
+ delete f.name; // Only 'label' is allowed
477
+ delete f.sequence; // Not supported
478
+ delete f.order; // Not supported
479
+ transformedFields[fieldId] = f;
480
+ }
481
+ result.fields = transformedFields;
482
+ }
483
+ // Transform phases - remove sequence/order
484
+ if (template.phases) {
485
+ const transformedPhases = {};
486
+ for (const [phaseId, phase] of Object.entries(template.phases)) {
487
+ const p = { ...phase };
488
+ delete p.sequence;
489
+ delete p.order;
490
+ transformedPhases[phaseId] = p;
491
+ }
492
+ result.phases = transformedPhases;
493
+ }
494
+ return result;
495
+ });
444
496
  logger.debug('Calling v3.workflow.install', {
445
497
  workspaceId,
446
- templatesCount: args.workflowTemplates.length
498
+ templatesCount: transformedTemplates.length
447
499
  });
448
500
  // Call v3.workflow.install endpoint
449
501
  const result = await context.hailer.request('v3.workflow.install', [
450
502
  workspaceId,
451
- args.workflowTemplates
503
+ transformedTemplates
452
504
  ]);
453
505
  logger.debug('Workflow installation successful', { result });
454
506
  // Refresh context.init.processes cache so new workflows are immediately available
@@ -456,7 +508,7 @@ exports.installWorkflowTool = {
456
508
  const freshInit = await context.client.socket.request('v2.core.init', [['processes']]);
457
509
  if (freshInit.processes) {
458
510
  context.init.processes = freshInit.processes;
459
- logger.info('Refreshed workflow cache after installation', {
511
+ logger.debug('Refreshed workflow cache after installation', {
460
512
  workflowCount: freshInit.processes.length
461
513
  });
462
514
  }
@@ -465,46 +517,68 @@ exports.installWorkflowTool = {
465
517
  logger.warn('Failed to refresh workflow cache after installation', { error: refreshError });
466
518
  // Non-fatal - the workflow was created, just cache is stale
467
519
  }
468
- // Build success response
469
- let responseText = `✅ **Workflow Installation Successful**\n\n`;
470
- responseText += `**Workspace:** ${workspaceId}\n`;
471
- responseText += `**Workflows Installed:** ${args.workflowTemplates.length}\n\n`;
472
- // Show workflow names and their real IDs
473
- const templates = args.workflowTemplates;
474
- const workflowMappings = templates
475
- .filter((wf) => wf._id)
476
- .map((wf) => `- ${wf.name}: \`${result[wf._id]}\` (from workflow _id \`${wf._id}\`)`)
477
- .join('\n');
478
- if (workflowMappings) {
479
- responseText += `**Created Workflows:**\n${workflowMappings}\n\n`;
520
+ // Build success response - clearly separate workflow/field/phase IDs
521
+ const templates = transformedTemplates;
522
+ // Extract workflow ID (the one that starts with workflow template ID or is for the workflow)
523
+ // The result maps template IDs to real IDs
524
+ const workflowIds = [];
525
+ const fieldIds = {};
526
+ const phaseIds = {};
527
+ for (const [templateId, realId] of Object.entries(result)) {
528
+ if (templateId.startsWith('_0') || templateId.startsWith('_00')) {
529
+ // Workflow ID (_0001, _0002, etc.)
530
+ workflowIds.push(realId);
531
+ }
532
+ else if (templateId.startsWith('_1')) {
533
+ // Field ID (_1000, _1001, etc.)
534
+ fieldIds[templateId] = realId;
535
+ }
536
+ else if (templateId.startsWith('_2')) {
537
+ // Phase ID (_2000, _2001, etc.)
538
+ phaseIds[templateId] = realId;
539
+ }
540
+ else {
541
+ // Fallback - assume workflow ID if no underscore pattern
542
+ workflowIds.push(realId);
543
+ }
480
544
  }
481
- responseText += `**Complete ID Mapping (template_id real_id):**\n`;
482
- responseText += `\`\`\`json\n${JSON.stringify(result, null, 2)}\n\`\`\`\n\n`;
483
- responseText += `💡 **Next Steps:**\n`;
484
- responseText += `- Use \`list_workflows\` to see the new workflows in context\n`;
485
- responseText += `- Use \`create_activity\` with the real workflow IDs to create activities\n`;
486
- responseText += `- Field IDs from mapping are used when setting activity field values\n\n`;
487
- responseText += `**Example Activity Creation:**\n`;
488
- responseText += `\`\`\`javascript\n`;
489
- if (templates[0]?._id) {
490
- const firstTemplate = templates[0];
491
- const workflowId = result[firstTemplate._id];
492
- const firstFieldId = Object.keys(firstTemplate.fields || {})[0];
493
- const realFieldId = firstFieldId ? result[firstFieldId] : 'field_id';
494
- responseText += `// Using workflow: ${firstTemplate.name}\n`;
495
- responseText += `create_activity({\n`;
496
- responseText += ` workflowId: "${workflowId}",\n`;
497
- responseText += ` name: "New Activity",\n`;
498
- responseText += ` fields: { "${realFieldId}": "value" }\n`;
499
- responseText += `});\n`;
545
+ let responseText = `✅ **Workflow "${templates[0]?.name || 'Unknown'}" Created**\n\n`;
546
+ // MOST IMPORTANT - Workflow ID for create_activity
547
+ responseText += `**🎯 WORKFLOW ID (use this for create_activity):**\n`;
548
+ responseText += `\`${workflowIds[0] || 'check list_workflows'}\`\n\n`;
549
+ // Field IDs
550
+ if (Object.keys(fieldIds).length > 0) {
551
+ responseText += `**📋 Field IDs:**\n`;
552
+ for (const [tpl, real] of Object.entries(fieldIds)) {
553
+ const fieldDef = templates[0]?.fields?.[tpl];
554
+ const label = fieldDef?.label || tpl;
555
+ responseText += `- ${label}: \`${real}\`\n`;
556
+ }
557
+ responseText += `\n`;
500
558
  }
501
- else {
502
- responseText += `create_activity({\n`;
503
- responseText += ` workflowId: result._0001,\n`;
504
- responseText += ` name: "New Activity",\n`;
505
- responseText += ` fields: { [result._1000]: "value" }\n`;
506
- responseText += `});\n`;
559
+ // Phase IDs
560
+ if (Object.keys(phaseIds).length > 0) {
561
+ responseText += `**🏷️ Phase IDs:**\n`;
562
+ for (const [tpl, real] of Object.entries(phaseIds)) {
563
+ const phaseDef = templates[0]?.phases?.[tpl];
564
+ const name = phaseDef?.name || tpl;
565
+ responseText += `- ${name}: \`${real}\`\n`;
566
+ }
567
+ responseText += `\n`;
507
568
  }
569
+ // Example
570
+ const firstFieldId = Object.values(fieldIds)[0];
571
+ const firstPhaseId = Object.values(phaseIds)[0];
572
+ responseText += `**Example create_activity:**\n`;
573
+ responseText += `\`\`\`json\n`;
574
+ responseText += `{\n`;
575
+ responseText += ` "workflowId": "${workflowIds[0] || 'WORKFLOW_ID'}",\n`;
576
+ responseText += ` "name": "New Activity",\n`;
577
+ if (firstPhaseId)
578
+ responseText += ` "phaseId": "${firstPhaseId}",\n`;
579
+ if (firstFieldId)
580
+ responseText += ` "fields": { "${firstFieldId}": "value" }\n`;
581
+ responseText += `}\n`;
508
582
  responseText += `\`\`\``;
509
583
  return {
510
584
  content: [{
@@ -515,7 +589,8 @@ exports.installWorkflowTool = {
515
589
  }
516
590
  catch (error) {
517
591
  const errorMessage = error instanceof Error ? error.message : String(error);
518
- logger.error("Error installing workflow", new Error(errorMessage));
592
+ if (!request_logger_1.RequestLogger.getCurrent())
593
+ logger.error("Error installing workflow", new Error(errorMessage));
519
594
  // Handle permission errors
520
595
  if (errorMessage.includes('network admin') || errorMessage.includes('PermissionDenied')) {
521
596
  return {
@@ -646,7 +721,8 @@ exports.removeWorkflowTool = {
646
721
  };
647
722
  }
648
723
  catch (error) {
649
- logger.error("Error removing workflow", error);
724
+ if (!request_logger_1.RequestLogger.getCurrent())
725
+ logger.error("Error removing workflow", error);
650
726
  const errorMessage = error instanceof Error ? error.message : String(error);
651
727
  // Handle permission errors
652
728
  if (errorMessage.includes('network admin') || errorMessage.includes('PermissionDenied') || errorMessage.includes('permission')) {
@@ -780,7 +856,8 @@ exports.updateWorkflowFieldTool = {
780
856
  };
781
857
  }
782
858
  catch (error) {
783
- logger.error("Error updating workflow field", error);
859
+ if (!request_logger_1.RequestLogger.getCurrent())
860
+ logger.error("Error updating workflow field", error);
784
861
  const errorMessage = error instanceof Error ? error.message : String(error);
785
862
  // Handle permission errors
786
863
  if (errorMessage.includes('network admin') || errorMessage.includes('PermissionDenied') || errorMessage.includes('permission')) {
@@ -968,7 +1045,8 @@ functionVariables: {
968
1045
  };
969
1046
  }
970
1047
  catch (error) {
971
- logger.error("Error testing function field", error);
1048
+ if (!request_logger_1.RequestLogger.getCurrent())
1049
+ logger.error("Error testing function field", error);
972
1050
  const errorMessage = error instanceof Error
973
1051
  ? error.message
974
1052
  : JSON.stringify(error, null, 2);
@@ -1084,7 +1162,8 @@ exports.listWorkflowsMinimalTool = {
1084
1162
  };
1085
1163
  }
1086
1164
  catch (error) {
1087
- logger.error("Error listing workflows (minimal)", error);
1165
+ if (!request_logger_1.RequestLogger.getCurrent())
1166
+ logger.error("Error listing workflows (minimal)", error);
1088
1167
  return {
1089
1168
  content: [{
1090
1169
  type: "text",
@@ -1180,7 +1259,8 @@ exports.countActivitiesTool = {
1180
1259
  };
1181
1260
  }
1182
1261
  catch (error) {
1183
- logger.error("Error counting activities", error);
1262
+ if (!request_logger_1.RequestLogger.getCurrent())
1263
+ logger.error("Error counting activities", error);
1184
1264
  return {
1185
1265
  content: [{
1186
1266
  type: "text",
@@ -1230,6 +1310,37 @@ const updateWorkflowPhaseSchema = zod_1.z.object({
1230
1310
  }).passthrough().describe("Phase properties to update"),
1231
1311
  workspaceId: zod_1.z.string().optional().describe("Optional workspace ID - defaults to current workspace"),
1232
1312
  });
1313
+ // ============================================================================
1314
+ // CORE INIT TOOL - Workspace overview for terminal Claude Code sessions
1315
+ // ============================================================================
1316
+ const coreInitDescription = `Load workspace context - call once at session start to get workflows, phases, teams with IDs`;
1317
+ exports.coreInitTool = {
1318
+ name: 'core_init',
1319
+ group: tool_registry_1.ToolGroup.READ,
1320
+ description: coreInitDescription,
1321
+ schema: zod_1.z.object({}),
1322
+ async execute(_args, context) {
1323
+ try {
1324
+ const overview = (0, workspace_overview_1.generateWorkspaceOverview)(context.init);
1325
+ return {
1326
+ content: [{
1327
+ type: "text",
1328
+ text: `Use this workspace context for all subsequent tool calls. Do NOT call core_init again this session.\n\n${overview}`,
1329
+ }],
1330
+ };
1331
+ }
1332
+ catch (error) {
1333
+ if (!request_logger_1.RequestLogger.getCurrent())
1334
+ logger.error("Failed to generate workspace overview", error);
1335
+ return {
1336
+ content: [{
1337
+ type: "text",
1338
+ text: `❌ Failed to load workspace context: ${error instanceof Error ? error.message : String(error)}`,
1339
+ }],
1340
+ };
1341
+ }
1342
+ },
1343
+ };
1233
1344
  exports.updateWorkflowPhaseTool = {
1234
1345
  name: 'update_workflow_phase',
1235
1346
  group: tool_registry_1.ToolGroup.PLAYGROUND,
@@ -1301,7 +1412,8 @@ exports.updateWorkflowPhaseTool = {
1301
1412
  };
1302
1413
  }
1303
1414
  catch (error) {
1304
- logger.error("Error updating workflow phase", error);
1415
+ if (!request_logger_1.RequestLogger.getCurrent())
1416
+ logger.error("Error updating workflow phase", error);
1305
1417
  const errorMessage = error instanceof Error ? error.message : String(error);
1306
1418
  // Handle permission errors
1307
1419
  if (errorMessage.includes('network admin') || errorMessage.includes('PermissionDenied') || errorMessage.includes('permission')) {
@@ -6,6 +6,7 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.HailerApiClient = void 0;
8
8
  const logger_1 = require("../../lib/logger");
9
+ const request_logger_1 = require("../../lib/request-logger");
9
10
  const api_errors_1 = require("./api-errors");
10
11
  const file_upload_1 = require("./file-upload");
11
12
  class HailerApiClient {
@@ -34,12 +35,14 @@ class HailerApiClient {
34
35
  return result;
35
36
  }
36
37
  catch (error) {
37
- // Log with detailed context for debugging
38
- this.logger.error('Socket API error', error, {
39
- method,
40
- args: JSON.stringify(args || []),
41
- apiBaseUrl: this.clients.socket.host
42
- });
38
+ // Log with detailed context for debugging (skip if inside a request cycle)
39
+ if (!request_logger_1.RequestLogger.getCurrent()) {
40
+ this.logger.error('Socket API error', error, {
41
+ method,
42
+ args: JSON.stringify(args || []),
43
+ apiBaseUrl: this.clients.socket.host
44
+ });
45
+ }
43
46
  throw error;
44
47
  }
45
48
  }
@@ -105,10 +108,12 @@ class HailerApiClient {
105
108
  return result;
106
109
  }
107
110
  catch (error) {
108
- this.logger.error('createActivities failed', error, {
109
- workflowId,
110
- activitiesCount: activities.length
111
- });
111
+ if (!request_logger_1.RequestLogger.getCurrent()) {
112
+ this.logger.error('createActivities failed', error, {
113
+ workflowId,
114
+ activitiesCount: activities.length
115
+ });
116
+ }
112
117
  throw error;
113
118
  }
114
119
  }
@@ -188,11 +193,13 @@ class HailerApiClient {
188
193
  }
189
194
  }
190
195
  catch (error) {
191
- this.logger.error(`Error fetching batch ${i + 1}`, {
192
- error: error,
193
- currentMessageId,
194
- batchNumber: i + 1
195
- });
196
+ if (!request_logger_1.RequestLogger.getCurrent()) {
197
+ this.logger.error(`Error fetching batch ${i + 1}`, {
198
+ error: error,
199
+ currentMessageId,
200
+ batchNumber: i + 1
201
+ });
202
+ }
196
203
  break;
197
204
  }
198
205
  }
@@ -351,7 +358,7 @@ class HailerApiClient {
351
358
  if (lastname) {
352
359
  await this.setUserInfo('lastname', lastname);
353
360
  }
354
- this.logger.info('User display name updated', { fullName, firstname, lastname });
361
+ this.logger.debug('User display name updated', { fullName, firstname, lastname });
355
362
  }
356
363
  /**
357
364
  * Find user by name - searches init data for firstname/lastname match
@@ -497,7 +504,9 @@ class HailerApiClient {
497
504
  };
498
505
  }
499
506
  catch (error) {
500
- this.logger.error('File download failed', error, { fileId });
507
+ if (!request_logger_1.RequestLogger.getCurrent()) {
508
+ this.logger.error('File download failed', error, { fileId });
509
+ }
501
510
  throw error;
502
511
  }
503
512
  }
@@ -1,7 +1,8 @@
1
1
  /**
2
- * Webhook Handler Utilities
2
+ * Webhook Handler for Bot Config Updates
3
3
  *
4
- * Provides webhook token generation and verification for secure endpoints.
4
+ * Receives activity updates from Hailer workflow webhooks and updates
5
+ * local .bot-config/{workspaceId}.json files.
5
6
  */
6
7
  /**
7
8
  * Generate HMAC-SHA256 signature for webhook payload
@@ -20,7 +21,67 @@ export declare function verifyWebhookSignature(payload: string, signature: strin
20
21
  */
21
22
  export declare function getWebhookToken(): string | null;
22
23
  /**
23
- * Get the full webhook path with token
24
+ * Get the full webhook path with token (no prefix for security through obscurity)
24
25
  */
25
26
  export declare function getWebhookPath(): string | null;
27
+ interface WebhookField {
28
+ id: string;
29
+ type: string;
30
+ value: any;
31
+ key: string;
32
+ }
33
+ interface WebhookPayload {
34
+ _id: string;
35
+ name: string;
36
+ fields: WebhookField[];
37
+ currentPhase: string;
38
+ process: string;
39
+ cid: string;
40
+ uid: string;
41
+ created: number;
42
+ updated: number;
43
+ }
44
+ interface BotEntry {
45
+ activityId: string;
46
+ userId: string | null;
47
+ email: string;
48
+ password: string;
49
+ botType: string;
50
+ enabled: boolean;
51
+ displayName?: string;
52
+ }
53
+ interface WorkspaceConfig {
54
+ workspaceId: string;
55
+ workspaceName: string;
56
+ orchestrator?: {
57
+ activityId: string;
58
+ userId: string;
59
+ email: string;
60
+ password: string;
61
+ displayName?: string;
62
+ };
63
+ specialists: BotEntry[];
64
+ lastSynced: string;
65
+ }
66
+ type BotUpdateCallback = (workspaceId: string, bot: BotEntry, action: 'add' | 'update' | 'remove') => void;
67
+ export declare function onBotUpdate(callback: BotUpdateCallback): void;
68
+ /**
69
+ * Process webhook payload and update workspace config
70
+ */
71
+ export declare function handleBotConfigWebhook(payload: WebhookPayload): {
72
+ success: boolean;
73
+ action: string;
74
+ workspaceId: string;
75
+ botType: string | null;
76
+ error?: string;
77
+ };
78
+ /**
79
+ * Get workspace config (for debugging/status)
80
+ */
81
+ export declare function getWorkspaceConfig(workspaceId: string): WorkspaceConfig | null;
82
+ /**
83
+ * List all workspace configs
84
+ */
85
+ export declare function listWorkspaceConfigs(): WorkspaceConfig[];
86
+ export {};
26
87
  //# sourceMappingURL=webhook-handler.d.ts.map