@hailer/mcp 1.1.11 → 1.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.js +18 -5
- package/dist/bot/bot-config.d.ts +12 -1
- package/dist/bot/bot-config.js +98 -14
- package/dist/bot/bot-manager.d.ts +13 -3
- package/dist/bot/bot-manager.js +80 -25
- package/dist/bot/bot.d.ts +46 -0
- package/dist/bot/bot.js +542 -166
- package/dist/bot/services/message-classifier.js +17 -0
- package/dist/bot/services/permission-guard.d.ts +52 -0
- package/dist/bot/services/permission-guard.js +149 -0
- package/dist/bot/services/types.d.ts +5 -0
- package/dist/bot/services/typing-indicator.d.ts +6 -1
- package/dist/bot/services/typing-indicator.js +19 -3
- package/dist/config.d.ts +6 -1
- package/dist/config.js +43 -0
- package/dist/core.js +3 -6
- package/dist/mcp/UserContextCache.d.ts +5 -0
- package/dist/mcp/UserContextCache.js +51 -19
- package/dist/mcp/hailer-clients.d.ts +19 -1
- package/dist/mcp/hailer-clients.js +157 -20
- package/dist/mcp/session-store.d.ts +68 -0
- package/dist/mcp/session-store.js +169 -0
- package/dist/mcp/signal-handler.js +12 -12
- package/dist/mcp/tool-registry.d.ts +17 -4
- package/dist/mcp/tool-registry.js +37 -7
- package/dist/mcp/tools/activity.js +99 -7
- package/dist/mcp/tools/app-scaffold.js +304 -336
- package/dist/mcp/tools/company.d.ts +9 -0
- package/dist/mcp/tools/company.js +88 -0
- package/dist/mcp/tools/discussion.js +68 -0
- package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
- package/dist/mcp/tools/workflow-permissions.js +204 -0
- package/dist/mcp/tools/workflow.js +57 -18
- package/dist/mcp/utils/index.d.ts +2 -0
- package/dist/mcp/utils/index.js +12 -1
- package/dist/mcp/utils/role-utils.d.ts +74 -0
- package/dist/mcp/utils/role-utils.js +151 -0
- package/dist/mcp/utils/types.d.ts +43 -1
- package/dist/mcp/utils/types.js +14 -0
- package/dist/mcp/webhook-handler.d.ts +6 -0
- package/dist/mcp/webhook-handler.js +11 -0
- package/dist/mcp-server.d.ts +23 -2
- package/dist/mcp-server.js +639 -111
- package/dist/plugins/vipunen/client.d.ts +150 -0
- package/dist/plugins/vipunen/client.js +535 -0
- package/dist/plugins/vipunen/config/schema-config.json +19 -0
- package/dist/plugins/vipunen/config/schema-doc.json +22 -0
- package/dist/plugins/vipunen/index.d.ts +41 -0
- package/dist/plugins/vipunen/index.js +88 -0
- package/dist/plugins/vipunen/tools.d.ts +26 -0
- package/dist/plugins/vipunen/tools.js +501 -0
- package/package.json +2 -1
- package/.claude/.context-watchdog.json +0 -1
- package/.claude/.session-checked +0 -1
- package/.claude/CLAUDE.md +0 -370
- package/.claude/agents/agent-ada-skill-builder.md +0 -94
- package/.claude/agents/agent-alejandro-function-fields.md +0 -342
- package/.claude/agents/agent-bjorn-config-audit.md +0 -103
- package/.claude/agents/agent-builder-agent-creator.md +0 -130
- package/.claude/agents/agent-code-simplifier.md +0 -53
- package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
- package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
- package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
- package/.claude/agents/agent-helga-workflow-config.md +0 -204
- package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
- package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
- package/.claude/agents/agent-ivan-monolith.md +0 -154
- package/.claude/agents/agent-kenji-data-reader.md +0 -86
- package/.claude/agents/agent-lars-code-inspector.md +0 -102
- package/.claude/agents/agent-marco-mockup-builder.md +0 -110
- package/.claude/agents/agent-marcus-api-documenter.md +0 -323
- package/.claude/agents/agent-marketplace-publisher.md +0 -280
- package/.claude/agents/agent-marketplace-reviewer.md +0 -309
- package/.claude/agents/agent-permissions-handler.md +0 -208
- package/.claude/agents/agent-simple-writer.md +0 -48
- package/.claude/agents/agent-svetlana-code-review.md +0 -171
- package/.claude/agents/agent-tanya-test-runner.md +0 -333
- package/.claude/agents/agent-ui-designer.md +0 -100
- package/.claude/agents/agent-viktor-sql-insights.md +0 -212
- package/.claude/agents/agent-web-search.md +0 -55
- package/.claude/agents/agent-yevgeni-discussions.md +0 -45
- package/.claude/agents/agent-zara-zapier.md +0 -159
- package/.claude/commands/app-squad.md +0 -135
- package/.claude/commands/audit-squad.md +0 -158
- package/.claude/commands/autoplan.md +0 -563
- package/.claude/commands/cleanup-squad.md +0 -98
- package/.claude/commands/config-squad.md +0 -106
- package/.claude/commands/crud-squad.md +0 -87
- package/.claude/commands/data-squad.md +0 -97
- package/.claude/commands/debug-squad.md +0 -303
- package/.claude/commands/doc-squad.md +0 -65
- package/.claude/commands/handoff.md +0 -137
- package/.claude/commands/health.md +0 -49
- package/.claude/commands/help.md +0 -29
- package/.claude/commands/help:agents.md +0 -151
- package/.claude/commands/help:commands.md +0 -78
- package/.claude/commands/help:faq.md +0 -79
- package/.claude/commands/help:plugins.md +0 -50
- package/.claude/commands/help:skills.md +0 -93
- package/.claude/commands/help:tools.md +0 -75
- package/.claude/commands/hotfix-squad.md +0 -112
- package/.claude/commands/integration-squad.md +0 -82
- package/.claude/commands/janitor-squad.md +0 -167
- package/.claude/commands/learn-auto.md +0 -120
- package/.claude/commands/learn.md +0 -120
- package/.claude/commands/mcp-list.md +0 -27
- package/.claude/commands/onboard-squad.md +0 -140
- package/.claude/commands/plan-workspace.md +0 -732
- package/.claude/commands/prd.md +0 -130
- package/.claude/commands/project-status.md +0 -82
- package/.claude/commands/publish.md +0 -138
- package/.claude/commands/recap.md +0 -69
- package/.claude/commands/restore.md +0 -64
- package/.claude/commands/review-squad.md +0 -152
- package/.claude/commands/save.md +0 -24
- package/.claude/commands/stats.md +0 -19
- package/.claude/commands/swarm.md +0 -210
- package/.claude/commands/tool-builder.md +0 -39
- package/.claude/commands/ws-pull.md +0 -44
- package/.claude/hooks/_shared-memory.cjs +0 -305
- package/.claude/hooks/_utils.cjs +0 -108
- package/.claude/hooks/agent-failure-detector.cjs +0 -383
- package/.claude/hooks/agent-usage-logger.cjs +0 -204
- package/.claude/hooks/app-edit-guard.cjs +0 -494
- package/.claude/hooks/auto-learn.cjs +0 -304
- package/.claude/hooks/bash-guard.cjs +0 -272
- package/.claude/hooks/builder-mode-manager.cjs +0 -354
- package/.claude/hooks/bulk-activity-guard.cjs +0 -271
- package/.claude/hooks/context-watchdog.cjs +0 -230
- package/.claude/hooks/delegation-reminder.cjs +0 -465
- package/.claude/hooks/design-system-lint.cjs +0 -271
- package/.claude/hooks/post-scaffold-hook.cjs +0 -181
- package/.claude/hooks/prompt-guard.cjs +0 -354
- package/.claude/hooks/publish-template-guard.cjs +0 -147
- package/.claude/hooks/session-start.cjs +0 -35
- package/.claude/hooks/shared-memory-writer.cjs +0 -147
- package/.claude/hooks/skill-injector.cjs +0 -140
- package/.claude/hooks/skill-usage-logger.cjs +0 -258
- package/.claude/hooks/src-edit-guard.cjs +0 -240
- package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
- package/.claude/settings.json +0 -257
- package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
- package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
- package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
- package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
- package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
- package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
- package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
- package/.claude/skills/agent-structure/SKILL.md +0 -98
- package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
- package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
- package/.claude/skills/delegation-routing/SKILL.md +0 -202
- package/.claude/skills/frontend-design/SKILL.md +0 -254
- package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
- package/.claude/skills/hailer-api-client/SKILL.md +0 -518
- package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
- package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
- package/.claude/skills/hailer-design-system/SKILL.md +0 -235
- package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
- package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
- package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
- package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
- package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
- package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
- package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
- package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
- package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
- package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
- package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
- package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
- package/.claude/skills/integration-patterns/SKILL.md +0 -421
- package/.claude/skills/json-only-output/SKILL.md +0 -72
- package/.claude/skills/lsp-setup/SKILL.md +0 -160
- package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
- package/.claude/skills/optional-parameters/SKILL.md +0 -72
- package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
- package/.claude/skills/testing-patterns/SKILL.md +0 -630
- package/.claude/skills/tool-builder/SKILL.md +0 -250
- package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
- package/.claude/skills/tool-response-verification/SKILL.md +0 -92
- package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
- package/.hailer-mcp-port +0 -1
- package/.mcp.json +0 -13
- package/.opencode/agent/agent-ada-skill-builder.md +0 -35
- package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
- package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
- package/.opencode/agent/agent-builder-agent-creator.md +0 -39
- package/.opencode/agent/agent-code-simplifier.md +0 -31
- package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
- package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
- package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
- package/.opencode/agent/agent-helga-workflow-config.md +0 -204
- package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
- package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
- package/.opencode/agent/agent-ivan-monolith.md +0 -46
- package/.opencode/agent/agent-kenji-data-reader.md +0 -53
- package/.opencode/agent/agent-lars-code-inspector.md +0 -28
- package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
- package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
- package/.opencode/agent/agent-marketplace-publisher.md +0 -44
- package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
- package/.opencode/agent/agent-permissions-handler.md +0 -50
- package/.opencode/agent/agent-simple-writer.md +0 -45
- package/.opencode/agent/agent-svetlana-code-review.md +0 -39
- package/.opencode/agent/agent-tanya-test-runner.md +0 -57
- package/.opencode/agent/agent-ui-designer.md +0 -56
- package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
- package/.opencode/agent/agent-web-search.md +0 -42
- package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
- package/.opencode/agent/agent-zara-zapier.md +0 -53
- package/.opencode/commands/app-squad.md +0 -135
- package/.opencode/commands/audit-squad.md +0 -158
- package/.opencode/commands/autoplan.md +0 -563
- package/.opencode/commands/cleanup-squad.md +0 -98
- package/.opencode/commands/config-squad.md +0 -106
- package/.opencode/commands/crud-squad.md +0 -87
- package/.opencode/commands/data-squad.md +0 -97
- package/.opencode/commands/debug-squad.md +0 -303
- package/.opencode/commands/doc-squad.md +0 -65
- package/.opencode/commands/handoff.md +0 -137
- package/.opencode/commands/health.md +0 -49
- package/.opencode/commands/help-agents.md +0 -151
- package/.opencode/commands/help-commands.md +0 -32
- package/.opencode/commands/help-faq.md +0 -29
- package/.opencode/commands/help-plugins.md +0 -28
- package/.opencode/commands/help-skills.md +0 -7
- package/.opencode/commands/help-tools.md +0 -40
- package/.opencode/commands/help.md +0 -28
- package/.opencode/commands/hotfix-squad.md +0 -112
- package/.opencode/commands/integration-squad.md +0 -82
- package/.opencode/commands/janitor-squad.md +0 -167
- package/.opencode/commands/learn-auto.md +0 -120
- package/.opencode/commands/learn.md +0 -120
- package/.opencode/commands/mcp-list.md +0 -27
- package/.opencode/commands/onboard-squad.md +0 -140
- package/.opencode/commands/plan-workspace.md +0 -732
- package/.opencode/commands/prd.md +0 -131
- package/.opencode/commands/project-status.md +0 -82
- package/.opencode/commands/publish.md +0 -138
- package/.opencode/commands/recap.md +0 -69
- package/.opencode/commands/restore.md +0 -64
- package/.opencode/commands/review-squad.md +0 -152
- package/.opencode/commands/save.md +0 -24
- package/.opencode/commands/stats.md +0 -19
- package/.opencode/commands/swarm.md +0 -210
- package/.opencode/commands/tool-builder.md +0 -39
- package/.opencode/commands/ws-pull.md +0 -44
- package/.opencode/opencode.json +0 -21
- package/inbox/failures.log +0 -1
- package/inbox/usage.jsonl +0 -4
- package/scripts/postinstall.cjs +0 -64
- package/scripts/test-hal-tools.ts +0 -154
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Role-Based Access Control Utilities
|
|
4
|
+
*
|
|
5
|
+
* Derives user role from workspace member flags and maps roles to ToolGroups.
|
|
6
|
+
* Used by UserContextCache to determine tool access at context creation time.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.deriveUserRole = deriveUserRole;
|
|
10
|
+
exports.getAllowedGroups = getAllowedGroups;
|
|
11
|
+
exports.findCurrentUserMember = findCurrentUserMember;
|
|
12
|
+
exports.extractWorkspaceRoles = extractWorkspaceRoles;
|
|
13
|
+
exports.getAllowedGroupsForWorkspace = getAllowedGroupsForWorkspace;
|
|
14
|
+
exports.getMaxRole = getMaxRole;
|
|
15
|
+
exports.checkWorkspaceAccess = checkWorkspaceAccess;
|
|
16
|
+
const tool_registry_1 = require("../tool-registry");
|
|
17
|
+
/**
|
|
18
|
+
* Derive user role from workspace member flags
|
|
19
|
+
* Priority: owner > admin > guest > member
|
|
20
|
+
*
|
|
21
|
+
* @param member - Workspace member from v2.core.init
|
|
22
|
+
* @returns UserRole - 'owner' | 'admin' | 'guest' | 'member'
|
|
23
|
+
*/
|
|
24
|
+
function deriveUserRole(member) {
|
|
25
|
+
if (member.owner)
|
|
26
|
+
return 'owner';
|
|
27
|
+
if (member.admin)
|
|
28
|
+
return 'admin';
|
|
29
|
+
if (member.guest)
|
|
30
|
+
return 'guest';
|
|
31
|
+
return 'member';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Map user role to allowed ToolGroups
|
|
35
|
+
*
|
|
36
|
+
* @param role - User role derived from workspace member
|
|
37
|
+
* @param enableNuclear - Optional override to disable NUCLEAR even for owners
|
|
38
|
+
* @returns Array of ToolGroups the user can access
|
|
39
|
+
*/
|
|
40
|
+
function getAllowedGroups(role, enableNuclear = true) {
|
|
41
|
+
switch (role) {
|
|
42
|
+
case 'owner':
|
|
43
|
+
return enableNuclear
|
|
44
|
+
? [tool_registry_1.ToolGroup.READ, tool_registry_1.ToolGroup.WRITE, tool_registry_1.ToolGroup.PLAYGROUND, tool_registry_1.ToolGroup.NUCLEAR]
|
|
45
|
+
: [tool_registry_1.ToolGroup.READ, tool_registry_1.ToolGroup.WRITE, tool_registry_1.ToolGroup.PLAYGROUND];
|
|
46
|
+
case 'admin':
|
|
47
|
+
return [tool_registry_1.ToolGroup.READ, tool_registry_1.ToolGroup.WRITE, tool_registry_1.ToolGroup.PLAYGROUND];
|
|
48
|
+
case 'member':
|
|
49
|
+
return [tool_registry_1.ToolGroup.READ, tool_registry_1.ToolGroup.WRITE];
|
|
50
|
+
case 'guest':
|
|
51
|
+
return [tool_registry_1.ToolGroup.READ];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Find current user in workspace members array
|
|
56
|
+
*
|
|
57
|
+
* @param members - Array of workspace members from init.network.members
|
|
58
|
+
* @param currentUserId - Current user's ID
|
|
59
|
+
* @returns WorkspaceMember if found, undefined otherwise
|
|
60
|
+
*/
|
|
61
|
+
function findCurrentUserMember(members, currentUserId) {
|
|
62
|
+
return members.find(m => m.uid === currentUserId);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extract user roles from all workspaces
|
|
66
|
+
* Returns a map of workspaceId → UserRole
|
|
67
|
+
*
|
|
68
|
+
* @param networks - Record of workspace ID to WorkspaceInfo from init.networks
|
|
69
|
+
* @param currentUserId - Current user's ID
|
|
70
|
+
* @returns Record mapping workspace IDs to UserRoles
|
|
71
|
+
*/
|
|
72
|
+
function extractWorkspaceRoles(networks, currentUserId) {
|
|
73
|
+
const roles = {};
|
|
74
|
+
for (const [wsId, network] of Object.entries(networks)) {
|
|
75
|
+
const members = (network.members || []);
|
|
76
|
+
const member = findCurrentUserMember(members, currentUserId);
|
|
77
|
+
roles[wsId] = member ? deriveUserRole(member) : 'guest';
|
|
78
|
+
}
|
|
79
|
+
return roles;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get allowed groups for a specific workspace
|
|
83
|
+
*
|
|
84
|
+
* @param workspaceRoles - Map of workspace IDs to UserRoles
|
|
85
|
+
* @param workspaceId - Target workspace ID
|
|
86
|
+
* @param enableNuclear - Optional override to disable NUCLEAR even for owners
|
|
87
|
+
* @returns Array of ToolGroups the user can access in the specified workspace
|
|
88
|
+
*/
|
|
89
|
+
function getAllowedGroupsForWorkspace(workspaceRoles, workspaceId, enableNuclear = true) {
|
|
90
|
+
const role = workspaceRoles[workspaceId] || 'guest';
|
|
91
|
+
return getAllowedGroups(role, enableNuclear);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the highest role across all workspaces
|
|
95
|
+
* Used to determine which tools to show at startup (max potential access)
|
|
96
|
+
*
|
|
97
|
+
* @param workspaceRoles - Map of workspace IDs to UserRoles
|
|
98
|
+
* @returns Highest UserRole across all workspaces
|
|
99
|
+
*/
|
|
100
|
+
function getMaxRole(workspaceRoles) {
|
|
101
|
+
const roleOrder = ['guest', 'member', 'admin', 'owner'];
|
|
102
|
+
let maxRole = 'guest';
|
|
103
|
+
for (const role of Object.values(workspaceRoles)) {
|
|
104
|
+
if (roleOrder.indexOf(role) > roleOrder.indexOf(maxRole)) {
|
|
105
|
+
maxRole = role;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return maxRole;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get minimum role required for a ToolGroup
|
|
112
|
+
* Used for error messages
|
|
113
|
+
*/
|
|
114
|
+
function getRequiredRoleForGroup(group) {
|
|
115
|
+
switch (group) {
|
|
116
|
+
case tool_registry_1.ToolGroup.READ:
|
|
117
|
+
return 'guest';
|
|
118
|
+
case tool_registry_1.ToolGroup.WRITE:
|
|
119
|
+
return 'member';
|
|
120
|
+
case tool_registry_1.ToolGroup.PLAYGROUND:
|
|
121
|
+
return 'admin';
|
|
122
|
+
case tool_registry_1.ToolGroup.NUCLEAR:
|
|
123
|
+
return 'owner';
|
|
124
|
+
default:
|
|
125
|
+
return 'owner';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if user has access to a specific ToolGroup in a workspace
|
|
130
|
+
* Used for runtime permission validation when tools are called with workspaceId
|
|
131
|
+
*
|
|
132
|
+
* @param workspaceRoles - Map of workspace IDs to UserRoles
|
|
133
|
+
* @param currentWorkspaceId - Current default workspace ID
|
|
134
|
+
* @param targetWorkspaceId - Target workspace ID (or undefined to use current)
|
|
135
|
+
* @param requiredGroup - ToolGroup required for the operation
|
|
136
|
+
* @param enableNuclear - Optional override to disable NUCLEAR even for owners
|
|
137
|
+
* @returns Object with allowed boolean and optional reason string
|
|
138
|
+
*/
|
|
139
|
+
function checkWorkspaceAccess(workspaceRoles, currentWorkspaceId, targetWorkspaceId, requiredGroup, enableNuclear = true) {
|
|
140
|
+
const effectiveWsId = targetWorkspaceId || currentWorkspaceId;
|
|
141
|
+
const role = workspaceRoles[effectiveWsId] || 'guest';
|
|
142
|
+
const allowedGroups = getAllowedGroups(role, enableNuclear);
|
|
143
|
+
if (!allowedGroups.includes(requiredGroup)) {
|
|
144
|
+
return {
|
|
145
|
+
allowed: false,
|
|
146
|
+
reason: `Insufficient permissions in workspace '${effectiveWsId.slice(-6)}'. Your role '${role}' doesn't have access to ${requiredGroup} tools. Required: ${getRequiredRoleForGroup(requiredGroup)} or higher.`
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return { allowed: true };
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=role-utils.js.map
|
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
* Shared type definitions for Hailer MCP Server
|
|
3
3
|
* Consolidates interfaces used across multiple files
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* User role in workspace (derived from member flags)
|
|
7
|
+
* Used to determine which ToolGroups are available to the user
|
|
8
|
+
*/
|
|
9
|
+
export type UserRole = 'guest' | 'member' | 'admin' | 'owner';
|
|
10
|
+
/**
|
|
11
|
+
* Workspace member from v2.core.init response
|
|
12
|
+
* Contains role flags that determine user permissions
|
|
13
|
+
*
|
|
14
|
+
* Schema reference: hailer-api/src/validation/sharedSchemas.ts (validWorkspaceMemberSchema)
|
|
15
|
+
*/
|
|
16
|
+
export interface WorkspaceMember {
|
|
17
|
+
uid: string;
|
|
18
|
+
title?: string;
|
|
19
|
+
owner?: boolean;
|
|
20
|
+
admin?: boolean;
|
|
21
|
+
guest?: boolean;
|
|
22
|
+
inviter?: boolean;
|
|
23
|
+
feedAdmin?: boolean;
|
|
24
|
+
customRole?: string;
|
|
25
|
+
joined: number;
|
|
26
|
+
fields?: Record<string, string | string[] | null>;
|
|
27
|
+
}
|
|
5
28
|
export type { CleanActivity, FieldValue, WorkflowInfo, PhaseInfo, FieldInfo, UserInfo, } from './data-transformers';
|
|
6
29
|
export interface HailerField {
|
|
7
30
|
data: any[];
|
|
@@ -127,6 +150,12 @@ export interface HailerV2CoreInitResponse {
|
|
|
127
150
|
users: Record<string, HailerUser>;
|
|
128
151
|
[key: string]: any;
|
|
129
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Normalize v2.core.init response: the API returns processes as an object
|
|
155
|
+
* keyed by process ID, but all tool code expects an array. This converts
|
|
156
|
+
* the object form to an array with _id set on each entry.
|
|
157
|
+
*/
|
|
158
|
+
export declare function normalizeInitProcesses(init: HailerV2CoreInitResponse): void;
|
|
130
159
|
export interface McpTextContent {
|
|
131
160
|
type: "text";
|
|
132
161
|
text: string;
|
|
@@ -173,7 +202,7 @@ export interface WorkspaceInfo {
|
|
|
173
202
|
_id: string;
|
|
174
203
|
name: string;
|
|
175
204
|
description?: string;
|
|
176
|
-
members?:
|
|
205
|
+
members?: WorkspaceMember[];
|
|
177
206
|
settings?: Record<string, any>;
|
|
178
207
|
}
|
|
179
208
|
export interface SignalData {
|
|
@@ -248,6 +277,19 @@ export interface DiscussionMessageParams {
|
|
|
248
277
|
discussionId: string;
|
|
249
278
|
content: string;
|
|
250
279
|
}
|
|
280
|
+
export interface OptimizedDiscussionMessage {
|
|
281
|
+
_id: string;
|
|
282
|
+
uid: string;
|
|
283
|
+
username: string;
|
|
284
|
+
created: string;
|
|
285
|
+
type: string;
|
|
286
|
+
msg: string;
|
|
287
|
+
replyTo?: string;
|
|
288
|
+
systemDescription?: string;
|
|
289
|
+
meta?: any;
|
|
290
|
+
forwardMessageId?: string;
|
|
291
|
+
forwardMessage?: OptimizedDiscussionMessage;
|
|
292
|
+
}
|
|
251
293
|
export interface FetchDiscussionParams {
|
|
252
294
|
discussionId: string;
|
|
253
295
|
limit?: number;
|
package/dist/mcp/utils/types.js
CHANGED
|
@@ -4,4 +4,18 @@
|
|
|
4
4
|
* Consolidates interfaces used across multiple files
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.normalizeInitProcesses = normalizeInitProcesses;
|
|
8
|
+
/**
|
|
9
|
+
* Normalize v2.core.init response: the API returns processes as an object
|
|
10
|
+
* keyed by process ID, but all tool code expects an array. This converts
|
|
11
|
+
* the object form to an array with _id set on each entry.
|
|
12
|
+
*/
|
|
13
|
+
function normalizeInitProcesses(init) {
|
|
14
|
+
if (init.processes && !Array.isArray(init.processes)) {
|
|
15
|
+
init.processes = Object.entries(init.processes).map(([id, p]) => ({
|
|
16
|
+
_id: id,
|
|
17
|
+
...p,
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
7
21
|
//# sourceMappingURL=types.js.map
|
|
@@ -49,6 +49,9 @@ interface BotEntry {
|
|
|
49
49
|
botType: string;
|
|
50
50
|
enabled: boolean;
|
|
51
51
|
displayName?: string;
|
|
52
|
+
systemPrompt?: string;
|
|
53
|
+
accessLevel?: string;
|
|
54
|
+
responseMode?: string;
|
|
52
55
|
}
|
|
53
56
|
interface WorkspaceConfig {
|
|
54
57
|
workspaceId: string;
|
|
@@ -59,6 +62,9 @@ interface WorkspaceConfig {
|
|
|
59
62
|
email: string;
|
|
60
63
|
password: string;
|
|
61
64
|
displayName?: string;
|
|
65
|
+
systemPrompt?: string;
|
|
66
|
+
accessLevel?: string;
|
|
67
|
+
responseMode?: string;
|
|
62
68
|
};
|
|
63
69
|
specialists: BotEntry[];
|
|
64
70
|
lastSynced: string;
|
|
@@ -221,6 +221,10 @@ function handleBotConfigWebhook(payload) {
|
|
|
221
221
|
const botType = getFieldValue(payload.fields, 'botType');
|
|
222
222
|
const userId = getFieldValue(payload.fields, 'hailerProfile');
|
|
223
223
|
const schemaConfigStr = getFieldValue(payload.fields, 'schemaConfig');
|
|
224
|
+
const systemPrompt = getFieldValue(payload.fields, 'systemPrompt') || undefined;
|
|
225
|
+
const accessLevel = getFieldValue(payload.fields, 'accessLevel') || undefined;
|
|
226
|
+
// responseMode is stored inside schemaConfig JSON, not as a separate field
|
|
227
|
+
let responseMode;
|
|
224
228
|
// Validate required fields
|
|
225
229
|
if (!email || !password) {
|
|
226
230
|
logger.warn('Webhook missing credentials', {
|
|
@@ -244,6 +248,7 @@ function handleBotConfigWebhook(payload) {
|
|
|
244
248
|
const schemaConfig = JSON.parse(schemaConfigStr);
|
|
245
249
|
deployedPhaseId = schemaConfig.deployedPhaseId;
|
|
246
250
|
retiredPhaseId = schemaConfig.retiredPhaseId;
|
|
251
|
+
responseMode = schemaConfig.responseMode || undefined;
|
|
247
252
|
}
|
|
248
253
|
catch (e) {
|
|
249
254
|
logger.warn('Failed to parse schemaConfig', { schemaConfigStr });
|
|
@@ -262,6 +267,9 @@ function handleBotConfigWebhook(payload) {
|
|
|
262
267
|
botType: botType || 'unknown',
|
|
263
268
|
enabled,
|
|
264
269
|
displayName: payload.name, // Activity name from Agent Directory
|
|
270
|
+
systemPrompt,
|
|
271
|
+
accessLevel,
|
|
272
|
+
responseMode,
|
|
265
273
|
};
|
|
266
274
|
let action;
|
|
267
275
|
// Handle orchestrator
|
|
@@ -273,6 +281,9 @@ function handleBotConfigWebhook(payload) {
|
|
|
273
281
|
email,
|
|
274
282
|
password,
|
|
275
283
|
displayName: payload.name,
|
|
284
|
+
systemPrompt,
|
|
285
|
+
accessLevel,
|
|
286
|
+
responseMode,
|
|
276
287
|
};
|
|
277
288
|
action = 'update';
|
|
278
289
|
logger.info('Updated orchestrator', { workspaceId, email: (0, config_1.maskEmail)(email), displayName: payload.name });
|
package/dist/mcp-server.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { ToolRegistry } from './mcp/tool-registry';
|
|
|
10
10
|
declare module 'express-serve-static-core' {
|
|
11
11
|
interface Request {
|
|
12
12
|
logger: Logger;
|
|
13
|
+
apiKey?: string;
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
export interface MCPServerConfig {
|
|
@@ -22,18 +23,38 @@ export interface MCPServerConfig {
|
|
|
22
23
|
}>>;
|
|
23
24
|
}
|
|
24
25
|
export declare class MCPServerService {
|
|
26
|
+
private static readonly ENDPOINTS;
|
|
25
27
|
private app;
|
|
26
28
|
private server?;
|
|
27
29
|
private logger;
|
|
28
30
|
private config;
|
|
29
31
|
private toolRegistry;
|
|
32
|
+
private appConfig;
|
|
30
33
|
constructor(config: MCPServerConfig);
|
|
31
34
|
private setupMiddleware;
|
|
35
|
+
private escapeHtml;
|
|
36
|
+
private getBaseUrl;
|
|
32
37
|
private setupRoutes;
|
|
38
|
+
private extractBearerToken;
|
|
39
|
+
private setupSseStream;
|
|
40
|
+
private generateSessionId;
|
|
33
41
|
/**
|
|
34
|
-
*
|
|
42
|
+
* Strict access control for /api/mcp — returns false on catch (no config = no access)
|
|
35
43
|
*/
|
|
36
|
-
private
|
|
44
|
+
private canAccessToolStrict;
|
|
45
|
+
/**
|
|
46
|
+
* Permissive access control for Cowork — allows non-NUCLEAR tools on catch (OAuth sessions)
|
|
47
|
+
*/
|
|
48
|
+
private canAccessToolPermissive;
|
|
49
|
+
/**
|
|
50
|
+
* Cowork MCP JSON-RPC handler for /api/cowork/mcp (OAuth multi-user).
|
|
51
|
+
* Permissive access control, contextType filter, OAuth 401 flow.
|
|
52
|
+
*/
|
|
53
|
+
private handleCoworkMcp;
|
|
54
|
+
/**
|
|
55
|
+
* Send MCP success response via SSE
|
|
56
|
+
*/
|
|
57
|
+
private sendMcpResult;
|
|
37
58
|
/**
|
|
38
59
|
* Send MCP error response
|
|
39
60
|
*/
|