@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.
- package/.claude/.session-checked +1 -0
- package/.claude/agents/agent-ada-skill-builder.md +10 -2
- package/.claude/agents/agent-alejandro-function-fields.md +104 -37
- package/.claude/agents/agent-bjorn-config-audit.md +41 -21
- package/.claude/agents/agent-builder-agent-creator.md +13 -3
- package/.claude/agents/agent-code-simplifier.md +53 -0
- package/.claude/agents/agent-dmitri-activity-crud.md +126 -11
- package/.claude/agents/agent-giuseppe-app-builder.md +212 -22
- package/.claude/agents/agent-gunther-mcp-tools.md +7 -36
- package/.claude/agents/agent-helga-workflow-config.md +75 -10
- package/.claude/agents/agent-igor-activity-mover-automation.md +125 -0
- package/.claude/agents/agent-ingrid-doc-templates.md +164 -36
- package/.claude/agents/agent-ivan-monolith.md +154 -0
- package/.claude/agents/agent-kenji-data-reader.md +15 -8
- package/.claude/agents/agent-lars-code-inspector.md +56 -8
- package/.claude/agents/agent-marco-mockup-builder.md +110 -0
- package/.claude/agents/agent-marcus-api-documenter.md +323 -0
- package/.claude/agents/agent-marketplace-publisher.md +232 -72
- package/.claude/agents/agent-marketplace-reviewer.md +255 -79
- package/.claude/agents/agent-permissions-handler.md +208 -0
- package/.claude/agents/agent-simple-writer.md +48 -0
- package/.claude/agents/agent-svetlana-code-review.md +127 -14
- package/.claude/agents/agent-tanya-test-runner.md +333 -0
- package/.claude/agents/agent-ui-designer.md +100 -0
- package/.claude/agents/agent-viktor-sql-insights.md +19 -6
- package/.claude/agents/agent-web-search.md +55 -0
- package/.claude/agents/agent-yevgeni-discussions.md +7 -1
- package/.claude/agents/agent-zara-zapier.md +159 -0
- package/.claude/commands/app-squad.md +135 -0
- package/.claude/commands/audit-squad.md +158 -0
- package/.claude/commands/autoplan.md +563 -0
- package/.claude/commands/cleanup-squad.md +98 -0
- package/.claude/commands/config-squad.md +106 -0
- package/.claude/commands/crud-squad.md +87 -0
- package/.claude/commands/data-squad.md +97 -0
- package/.claude/commands/debug-squad.md +303 -0
- package/.claude/commands/doc-squad.md +65 -0
- package/.claude/commands/handoff.md +137 -0
- package/.claude/commands/health.md +49 -0
- package/.claude/commands/help.md +2 -1
- package/.claude/commands/help:agents.md +96 -16
- package/.claude/commands/help:commands.md +55 -11
- package/.claude/commands/help:faq.md +16 -1
- package/.claude/commands/help:skills.md +93 -0
- package/.claude/commands/hotfix-squad.md +112 -0
- package/.claude/commands/integration-squad.md +82 -0
- package/.claude/commands/janitor-squad.md +167 -0
- package/.claude/commands/learn-auto.md +120 -0
- package/.claude/commands/learn.md +120 -0
- package/.claude/commands/mcp-list.md +27 -0
- package/.claude/commands/onboard-squad.md +140 -0
- package/.claude/commands/plan-workspace.md +732 -0
- package/.claude/commands/prd.md +131 -0
- package/.claude/commands/project-status.md +82 -0
- package/.claude/commands/publish.md +138 -0
- package/.claude/commands/recap.md +69 -0
- package/.claude/commands/restore.md +64 -0
- package/.claude/commands/review-squad.md +152 -0
- package/.claude/commands/save.md +24 -0
- package/.claude/commands/stats.md +19 -0
- package/.claude/commands/swarm.md +210 -0
- package/.claude/commands/tool-builder.md +3 -1
- package/.claude/commands/ws-pull.md +1 -1
- package/.claude/commands/yolo-off.md +17 -0
- package/.claude/commands/yolo.md +82 -0
- package/.claude/hooks/_shared-memory.cjs +305 -0
- package/.claude/hooks/_utils.cjs +134 -0
- package/.claude/hooks/agent-failure-detector.cjs +164 -79
- package/.claude/hooks/agent-usage-logger.cjs +204 -0
- package/.claude/hooks/app-edit-guard.cjs +20 -4
- package/.claude/hooks/auto-learn.cjs +316 -0
- package/.claude/hooks/bash-guard.cjs +282 -0
- package/.claude/hooks/builder-mode-manager.cjs +183 -54
- package/.claude/hooks/bulk-activity-guard.cjs +283 -0
- package/.claude/hooks/context-watchdog.cjs +292 -0
- package/.claude/hooks/delegation-reminder.cjs +478 -0
- package/.claude/hooks/design-system-lint.cjs +283 -0
- package/.claude/hooks/post-scaffold-hook.cjs +16 -3
- package/.claude/hooks/prompt-guard.cjs +366 -0
- package/.claude/hooks/publish-template-guard.cjs +16 -0
- package/.claude/hooks/session-start.cjs +35 -0
- package/.claude/hooks/shared-memory-writer.cjs +147 -0
- package/.claude/hooks/skill-injector.cjs +140 -0
- package/.claude/hooks/skill-usage-logger.cjs +258 -0
- package/.claude/hooks/src-edit-guard.cjs +16 -1
- package/.claude/hooks/sync-marketplace-agents.cjs +53 -8
- package/.claude/scripts/yolo-toggle.cjs +142 -0
- package/.claude/settings.json +141 -14
- package/.claude/skills/SDK-activity-patterns/SKILL.md +428 -0
- package/.claude/skills/SDK-document-templates/SKILL.md +1033 -0
- package/.claude/skills/SDK-function-fields/SKILL.md +542 -0
- package/.claude/skills/SDK-generate-skill/SKILL.md +92 -0
- package/.claude/skills/SDK-init-skill/SKILL.md +127 -0
- package/.claude/skills/SDK-insight-queries/SKILL.md +787 -0
- package/.claude/skills/SDK-ws-config-skill/SKILL.md +1139 -0
- package/.claude/skills/agent-structure/SKILL.md +98 -0
- package/.claude/skills/api-documentation-patterns/SKILL.md +474 -0
- package/.claude/skills/chrome-mcp-reference/SKILL.md +370 -0
- package/.claude/skills/delegation-routing/SKILL.md +202 -0
- package/.claude/skills/frontend-design/SKILL.md +254 -0
- package/.claude/skills/hailer-activity-mover/SKILL.md +213 -0
- package/.claude/skills/hailer-api-client/SKILL.md +518 -0
- package/.claude/skills/hailer-app-builder/SKILL.md +939 -11
- package/.claude/skills/hailer-apps-pictures/SKILL.md +269 -0
- package/.claude/skills/hailer-design-system/SKILL.md +235 -0
- package/.claude/skills/hailer-monolith-automations/SKILL.md +686 -0
- package/.claude/skills/hailer-permissions-system/SKILL.md +121 -0
- package/.claude/skills/hailer-project-protocol/SKILL.md +488 -0
- package/.claude/skills/hailer-rest-api/SKILL.md +61 -0
- package/.claude/skills/hailer-rest-api/hailer-activities.md +184 -0
- package/.claude/skills/hailer-rest-api/hailer-admin.md +473 -0
- package/.claude/skills/hailer-rest-api/hailer-calendar.md +256 -0
- package/.claude/skills/hailer-rest-api/hailer-feed.md +249 -0
- package/.claude/skills/hailer-rest-api/hailer-insights.md +195 -0
- package/.claude/skills/hailer-rest-api/hailer-messaging.md +276 -0
- package/.claude/skills/hailer-rest-api/hailer-workflows.md +283 -0
- package/.claude/skills/insight-join-patterns/SKILL.md +3 -0
- package/.claude/skills/integration-patterns/SKILL.md +421 -0
- package/.claude/skills/json-only-output/SKILL.md +52 -12
- package/.claude/skills/lsp-setup/SKILL.md +160 -0
- package/.claude/skills/mcp-direct-tools/SKILL.md +153 -0
- package/.claude/skills/optional-parameters/SKILL.md +32 -23
- package/.claude/skills/publish-hailer-app/SKILL.md +76 -12
- package/.claude/skills/testing-patterns/SKILL.md +630 -0
- package/.claude/skills/tool-builder/SKILL.md +250 -0
- package/.claude/skills/tool-parameter-usage/SKILL.md +59 -45
- package/.claude/skills/tool-response-verification/SKILL.md +82 -48
- package/.claude/skills/zapier-hailer-patterns/SKILL.md +581 -0
- package/.env.example +26 -7
- package/CLAUDE.md +290 -224
- package/dist/CLAUDE.md +370 -0
- package/dist/app.d.ts +1 -1
- package/dist/app.js +101 -101
- package/dist/bot/bot-config.d.ts +26 -0
- package/dist/bot/bot-config.js +135 -0
- package/dist/bot/bot-manager.d.ts +40 -0
- package/dist/bot/bot-manager.js +137 -0
- package/dist/bot/bot.d.ts +127 -0
- package/dist/bot/bot.js +1328 -0
- package/dist/bot/operation-logger.d.ts +28 -0
- package/dist/bot/operation-logger.js +132 -0
- package/dist/bot/services/conversation-manager.d.ts +60 -0
- package/dist/bot/services/conversation-manager.js +246 -0
- package/dist/bot/services/index.d.ts +9 -0
- package/dist/bot/services/index.js +18 -0
- package/dist/bot/services/message-classifier.d.ts +42 -0
- package/dist/bot/services/message-classifier.js +228 -0
- package/dist/bot/services/message-formatter.d.ts +88 -0
- package/dist/bot/services/message-formatter.js +411 -0
- package/dist/bot/services/session-logger.d.ts +162 -0
- package/dist/bot/services/session-logger.js +724 -0
- package/dist/bot/services/token-billing.d.ts +78 -0
- package/dist/bot/services/token-billing.js +233 -0
- package/dist/bot/services/types.d.ts +169 -0
- package/dist/bot/services/types.js +12 -0
- package/dist/bot/services/typing-indicator.d.ts +23 -0
- package/dist/bot/services/typing-indicator.js +60 -0
- package/dist/bot/services/workspace-schema-cache.d.ts +122 -0
- package/dist/bot/services/workspace-schema-cache.js +506 -0
- package/dist/bot/tool-executor.d.ts +28 -0
- package/dist/bot/tool-executor.js +48 -0
- package/dist/bot/workspace-overview.d.ts +12 -0
- package/dist/bot/workspace-overview.js +94 -0
- package/dist/cli.d.ts +1 -8
- package/dist/cli.js +1 -253
- package/dist/config.d.ts +96 -3
- package/dist/config.js +148 -37
- package/dist/core.d.ts +5 -0
- package/dist/core.js +61 -8
- package/dist/lib/discussion-lock.d.ts +42 -0
- package/dist/lib/discussion-lock.js +110 -0
- package/dist/lib/logger.d.ts +0 -1
- package/dist/lib/logger.js +39 -23
- package/dist/lib/request-logger.d.ts +77 -0
- package/dist/lib/request-logger.js +147 -0
- package/dist/mcp/UserContextCache.js +16 -13
- package/dist/mcp/hailer-clients.js +18 -17
- package/dist/mcp/signal-handler.js +29 -13
- package/dist/mcp/tool-registry.d.ts +4 -15
- package/dist/mcp/tool-registry.js +94 -32
- package/dist/mcp/tools/activity.js +28 -69
- package/dist/mcp/tools/app-core.js +9 -4
- package/dist/mcp/tools/app-marketplace.js +22 -12
- package/dist/mcp/tools/app-member.js +5 -2
- package/dist/mcp/tools/app-scaffold.js +32 -18
- package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
- package/dist/mcp/tools/bot-config/constants.js +94 -0
- package/dist/mcp/tools/bot-config/core.d.ts +253 -0
- package/dist/mcp/tools/bot-config/core.js +2456 -0
- package/dist/mcp/tools/bot-config/index.d.ts +10 -0
- package/dist/mcp/tools/bot-config/index.js +59 -0
- package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
- package/dist/mcp/tools/bot-config/tools.js +15 -0
- package/dist/mcp/tools/bot-config/types.d.ts +50 -0
- package/dist/mcp/tools/bot-config/types.js +6 -0
- package/dist/mcp/tools/discussion.js +107 -77
- package/dist/mcp/tools/document.d.ts +11 -0
- package/dist/mcp/tools/document.js +741 -0
- package/dist/mcp/tools/file.js +5 -2
- package/dist/mcp/tools/insight.js +36 -12
- package/dist/mcp/tools/investigate.d.ts +9 -0
- package/dist/mcp/tools/investigate.js +254 -0
- package/dist/mcp/tools/user.d.ts +2 -4
- package/dist/mcp/tools/user.js +9 -50
- package/dist/mcp/tools/workflow.d.ts +1 -0
- package/dist/mcp/tools/workflow.js +164 -52
- package/dist/mcp/utils/hailer-api-client.js +26 -17
- package/dist/mcp/webhook-handler.d.ts +64 -3
- package/dist/mcp/webhook-handler.js +219 -9
- package/dist/mcp-server.d.ts +4 -0
- package/dist/mcp-server.js +237 -25
- package/dist/plugins/bug-fixer/index.d.ts +2 -0
- package/dist/plugins/bug-fixer/index.js +18 -0
- package/dist/plugins/bug-fixer/tools.d.ts +45 -0
- package/dist/plugins/bug-fixer/tools.js +1096 -0
- package/package.json +10 -10
- package/scripts/test-hal-tools.ts +154 -0
- package/.claude/agents/agent-nora-name-functions.md +0 -123
- package/.claude/assistant-knowledge.md +0 -23
- package/.claude/commands/install-plugin.md +0 -261
- package/.claude/commands/list-plugins.md +0 -42
- package/.claude/commands/marketplace-setup.md +0 -33
- package/.claude/commands/publish-plugin.md +0 -55
- package/.claude/commands/uninstall-plugin.md +0 -87
- package/.claude/hooks/interactive-mode.cjs +0 -87
- package/.claude/hooks/mcp-server-guard.cjs +0 -108
- package/.claude/skills/marketplace-publishing.md +0 -155
- package/dist/bot/chat-bot.d.ts +0 -31
- package/dist/bot/chat-bot.js +0 -357
- package/dist/mcp/tools/metrics.d.ts +0 -13
- package/dist/mcp/tools/metrics.js +0 -546
- package/dist/stdio-server.d.ts +0 -14
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
const
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
.
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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
|
|
482
|
-
|
|
483
|
-
responseText +=
|
|
484
|
-
responseText +=
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
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
|
-
|
|
502
|
-
|
|
503
|
-
responseText +=
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
192
|
-
error
|
|
193
|
-
|
|
194
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
2
|
+
* Webhook Handler for Bot Config Updates
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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
|