@hailer/mcp 1.1.12 → 1.1.14

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 (269) hide show
  1. package/CHANGELOG.md +0 -7
  2. package/{.claude → dist}/CLAUDE.md +2 -2
  3. package/dist/app.js +18 -5
  4. package/dist/bot/bot-config.d.ts +10 -1
  5. package/dist/bot/bot-config.js +64 -3
  6. package/dist/bot/bot-manager.d.ts +2 -0
  7. package/dist/bot/bot-manager.js +9 -2
  8. package/dist/bot/bot.d.ts +33 -0
  9. package/dist/bot/bot.js +461 -160
  10. package/dist/bot/services/message-classifier.js +17 -0
  11. package/dist/bot/services/permission-guard.d.ts +52 -0
  12. package/dist/bot/services/permission-guard.js +149 -0
  13. package/dist/bot/services/types.d.ts +5 -0
  14. package/dist/bot/services/typing-indicator.d.ts +6 -1
  15. package/dist/bot/services/typing-indicator.js +19 -3
  16. package/dist/cli.js +0 -0
  17. package/dist/config.d.ts +6 -1
  18. package/dist/config.js +43 -0
  19. package/dist/core.js +3 -6
  20. package/dist/lib/discussion-lock.d.ts +42 -0
  21. package/dist/lib/discussion-lock.js +110 -0
  22. package/dist/mcp/UserContextCache.d.ts +5 -0
  23. package/dist/mcp/UserContextCache.js +51 -19
  24. package/dist/mcp/hailer-clients.d.ts +19 -1
  25. package/dist/mcp/hailer-clients.js +158 -24
  26. package/dist/mcp/session-store.d.ts +68 -0
  27. package/dist/mcp/session-store.js +169 -0
  28. package/dist/mcp/signal-handler.js +2 -0
  29. package/dist/mcp/tool-registry.d.ts +17 -4
  30. package/dist/mcp/tool-registry.js +37 -7
  31. package/dist/mcp/tools/activity.js +99 -7
  32. package/dist/mcp/tools/app-scaffold.js +304 -336
  33. package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
  34. package/dist/mcp/tools/bot-config/constants.js +94 -0
  35. package/dist/mcp/tools/bot-config/core.d.ts +253 -0
  36. package/dist/mcp/tools/bot-config/core.js +2456 -0
  37. package/dist/mcp/tools/bot-config/index.d.ts +10 -0
  38. package/dist/mcp/tools/bot-config/index.js +59 -0
  39. package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
  40. package/dist/mcp/tools/bot-config/tools.js +15 -0
  41. package/dist/mcp/tools/bot-config/types.d.ts +50 -0
  42. package/dist/mcp/tools/bot-config/types.js +6 -0
  43. package/dist/mcp/tools/bug-fixer-tools.d.ts +45 -0
  44. package/dist/mcp/tools/bug-fixer-tools.js +1096 -0
  45. package/dist/mcp/tools/company.d.ts +9 -0
  46. package/dist/mcp/tools/company.js +88 -0
  47. package/dist/mcp/tools/discussion.js +68 -0
  48. package/dist/mcp/tools/document.d.ts +11 -0
  49. package/dist/mcp/tools/document.js +741 -0
  50. package/dist/mcp/tools/investigate.d.ts +9 -0
  51. package/dist/mcp/tools/investigate.js +254 -0
  52. package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
  53. package/dist/mcp/tools/workflow-permissions.js +204 -0
  54. package/dist/mcp/tools/workflow.js +57 -18
  55. package/dist/mcp/utils/index.d.ts +2 -0
  56. package/dist/mcp/utils/index.js +12 -1
  57. package/dist/mcp/utils/role-utils.d.ts +74 -0
  58. package/dist/mcp/utils/role-utils.js +151 -0
  59. package/dist/mcp/utils/types.d.ts +43 -1
  60. package/dist/mcp/utils/types.js +14 -0
  61. package/dist/mcp/webhook-handler.d.ts +4 -0
  62. package/dist/mcp/webhook-handler.js +8 -0
  63. package/dist/mcp-server.d.ts +23 -2
  64. package/dist/mcp-server.js +639 -127
  65. package/dist/plugins/vipunen/client.d.ts +150 -0
  66. package/dist/plugins/vipunen/client.js +535 -0
  67. package/dist/plugins/vipunen/config/schema-config.json +19 -0
  68. package/dist/plugins/vipunen/config/schema-doc.json +22 -0
  69. package/dist/plugins/vipunen/index.d.ts +41 -0
  70. package/dist/plugins/vipunen/index.js +88 -0
  71. package/dist/plugins/vipunen/tools.d.ts +26 -0
  72. package/dist/plugins/vipunen/tools.js +501 -0
  73. package/dist/stdio-server.d.ts +14 -0
  74. package/dist/stdio-server.js +101 -0
  75. package/package.json +2 -1
  76. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  77. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  78. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  79. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  80. package/.claude/agents/agent-code-simplifier.md +0 -53
  81. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  82. package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
  83. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  84. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  85. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  86. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  87. package/.claude/agents/agent-ivan-monolith.md +0 -154
  88. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  89. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  90. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  91. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  92. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  93. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  94. package/.claude/agents/agent-permissions-handler.md +0 -208
  95. package/.claude/agents/agent-simple-writer.md +0 -48
  96. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  97. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  98. package/.claude/agents/agent-ui-designer.md +0 -100
  99. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  100. package/.claude/agents/agent-web-search.md +0 -55
  101. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  102. package/.claude/agents/agent-zara-zapier.md +0 -159
  103. package/.claude/commands/app-squad.md +0 -135
  104. package/.claude/commands/audit-squad.md +0 -158
  105. package/.claude/commands/autoplan.md +0 -563
  106. package/.claude/commands/cleanup-squad.md +0 -98
  107. package/.claude/commands/config-squad.md +0 -106
  108. package/.claude/commands/crud-squad.md +0 -87
  109. package/.claude/commands/data-squad.md +0 -97
  110. package/.claude/commands/debug-squad.md +0 -303
  111. package/.claude/commands/doc-squad.md +0 -65
  112. package/.claude/commands/handoff.md +0 -137
  113. package/.claude/commands/health.md +0 -49
  114. package/.claude/commands/help.md +0 -29
  115. package/.claude/commands/help:agents.md +0 -151
  116. package/.claude/commands/help:commands.md +0 -78
  117. package/.claude/commands/help:faq.md +0 -79
  118. package/.claude/commands/help:plugins.md +0 -50
  119. package/.claude/commands/help:skills.md +0 -93
  120. package/.claude/commands/help:tools.md +0 -75
  121. package/.claude/commands/hotfix-squad.md +0 -112
  122. package/.claude/commands/integration-squad.md +0 -82
  123. package/.claude/commands/janitor-squad.md +0 -167
  124. package/.claude/commands/learn-auto.md +0 -120
  125. package/.claude/commands/learn.md +0 -120
  126. package/.claude/commands/mcp-list.md +0 -27
  127. package/.claude/commands/onboard-squad.md +0 -140
  128. package/.claude/commands/plan-workspace.md +0 -732
  129. package/.claude/commands/prd.md +0 -130
  130. package/.claude/commands/project-status.md +0 -82
  131. package/.claude/commands/publish.md +0 -138
  132. package/.claude/commands/recap.md +0 -69
  133. package/.claude/commands/restore.md +0 -64
  134. package/.claude/commands/review-squad.md +0 -152
  135. package/.claude/commands/save.md +0 -24
  136. package/.claude/commands/stats.md +0 -19
  137. package/.claude/commands/swarm.md +0 -210
  138. package/.claude/commands/tool-builder.md +0 -39
  139. package/.claude/commands/ws-pull.md +0 -44
  140. package/.claude/hooks/_shared-memory.cjs +0 -305
  141. package/.claude/hooks/_utils.cjs +0 -108
  142. package/.claude/hooks/agent-failure-detector.cjs +0 -383
  143. package/.claude/hooks/agent-usage-logger.cjs +0 -204
  144. package/.claude/hooks/app-edit-guard.cjs +0 -494
  145. package/.claude/hooks/auto-learn.cjs +0 -304
  146. package/.claude/hooks/bash-guard.cjs +0 -272
  147. package/.claude/hooks/builder-mode-manager.cjs +0 -354
  148. package/.claude/hooks/bulk-activity-guard.cjs +0 -271
  149. package/.claude/hooks/context-watchdog.cjs +0 -230
  150. package/.claude/hooks/delegation-reminder.cjs +0 -465
  151. package/.claude/hooks/design-system-lint.cjs +0 -271
  152. package/.claude/hooks/post-scaffold-hook.cjs +0 -181
  153. package/.claude/hooks/prompt-guard.cjs +0 -354
  154. package/.claude/hooks/publish-template-guard.cjs +0 -147
  155. package/.claude/hooks/session-start.cjs +0 -35
  156. package/.claude/hooks/shared-memory-writer.cjs +0 -147
  157. package/.claude/hooks/skill-injector.cjs +0 -140
  158. package/.claude/hooks/skill-usage-logger.cjs +0 -258
  159. package/.claude/hooks/src-edit-guard.cjs +0 -240
  160. package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
  161. package/.claude/settings.json +0 -257
  162. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  163. package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
  164. package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
  165. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  166. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  167. package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
  168. package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
  169. package/.claude/skills/agent-structure/SKILL.md +0 -98
  170. package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
  171. package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
  172. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  173. package/.claude/skills/frontend-design/SKILL.md +0 -254
  174. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  175. package/.claude/skills/hailer-api-client/SKILL.md +0 -518
  176. package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
  177. package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
  178. package/.claude/skills/hailer-design-system/SKILL.md +0 -235
  179. package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
  180. package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
  181. package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
  182. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  183. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  184. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  185. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  186. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  187. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  188. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  189. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  190. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  191. package/.claude/skills/integration-patterns/SKILL.md +0 -421
  192. package/.claude/skills/json-only-output/SKILL.md +0 -72
  193. package/.claude/skills/lsp-setup/SKILL.md +0 -160
  194. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  195. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  196. package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
  197. package/.claude/skills/testing-patterns/SKILL.md +0 -630
  198. package/.claude/skills/tool-builder/SKILL.md +0 -250
  199. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  200. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  201. package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
  202. package/.mcp.json +0 -13
  203. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  204. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  205. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  206. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  207. package/.opencode/agent/agent-code-simplifier.md +0 -31
  208. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  209. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  210. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  211. package/.opencode/agent/agent-helga-workflow-config.md +0 -203
  212. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  213. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  214. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  215. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  216. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  217. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  218. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  219. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  220. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  221. package/.opencode/agent/agent-permissions-handler.md +0 -50
  222. package/.opencode/agent/agent-simple-writer.md +0 -45
  223. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  224. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  225. package/.opencode/agent/agent-ui-designer.md +0 -56
  226. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  227. package/.opencode/agent/agent-web-search.md +0 -42
  228. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  229. package/.opencode/agent/agent-zara-zapier.md +0 -53
  230. package/.opencode/commands/app-squad.md +0 -135
  231. package/.opencode/commands/audit-squad.md +0 -158
  232. package/.opencode/commands/autoplan.md +0 -563
  233. package/.opencode/commands/cleanup-squad.md +0 -98
  234. package/.opencode/commands/config-squad.md +0 -106
  235. package/.opencode/commands/crud-squad.md +0 -87
  236. package/.opencode/commands/data-squad.md +0 -97
  237. package/.opencode/commands/debug-squad.md +0 -303
  238. package/.opencode/commands/doc-squad.md +0 -65
  239. package/.opencode/commands/handoff.md +0 -137
  240. package/.opencode/commands/health.md +0 -49
  241. package/.opencode/commands/help-agents.md +0 -151
  242. package/.opencode/commands/help-commands.md +0 -32
  243. package/.opencode/commands/help-faq.md +0 -29
  244. package/.opencode/commands/help-plugins.md +0 -28
  245. package/.opencode/commands/help-skills.md +0 -7
  246. package/.opencode/commands/help-tools.md +0 -40
  247. package/.opencode/commands/help.md +0 -28
  248. package/.opencode/commands/hotfix-squad.md +0 -112
  249. package/.opencode/commands/integration-squad.md +0 -82
  250. package/.opencode/commands/janitor-squad.md +0 -167
  251. package/.opencode/commands/learn-auto.md +0 -120
  252. package/.opencode/commands/learn.md +0 -120
  253. package/.opencode/commands/mcp-list.md +0 -27
  254. package/.opencode/commands/onboard-squad.md +0 -140
  255. package/.opencode/commands/plan-workspace.md +0 -732
  256. package/.opencode/commands/prd.md +0 -131
  257. package/.opencode/commands/project-status.md +0 -82
  258. package/.opencode/commands/publish.md +0 -138
  259. package/.opencode/commands/recap.md +0 -69
  260. package/.opencode/commands/restore.md +0 -64
  261. package/.opencode/commands/review-squad.md +0 -152
  262. package/.opencode/commands/save.md +0 -24
  263. package/.opencode/commands/stats.md +0 -19
  264. package/.opencode/commands/swarm.md +0 -210
  265. package/.opencode/commands/tool-builder.md +0 -39
  266. package/.opencode/commands/ws-pull.md +0 -44
  267. package/.opencode/opencode.json +0 -28
  268. package/SESSION-HANDOFF.md +0 -68
  269. package/inbox/2026-03-04-bot-config-patterns.md +0 -24
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Role-Based Access Control Utilities
3
+ *
4
+ * Derives user role from workspace member flags and maps roles to ToolGroups.
5
+ * Used by UserContextCache to determine tool access at context creation time.
6
+ */
7
+ import { ToolGroup } from '../tool-registry';
8
+ import { UserRole, WorkspaceMember, WorkspaceInfo } from './types';
9
+ /**
10
+ * Derive user role from workspace member flags
11
+ * Priority: owner > admin > guest > member
12
+ *
13
+ * @param member - Workspace member from v2.core.init
14
+ * @returns UserRole - 'owner' | 'admin' | 'guest' | 'member'
15
+ */
16
+ export declare function deriveUserRole(member: WorkspaceMember): UserRole;
17
+ /**
18
+ * Map user role to allowed ToolGroups
19
+ *
20
+ * @param role - User role derived from workspace member
21
+ * @param enableNuclear - Optional override to disable NUCLEAR even for owners
22
+ * @returns Array of ToolGroups the user can access
23
+ */
24
+ export declare function getAllowedGroups(role: UserRole, enableNuclear?: boolean): ToolGroup[];
25
+ /**
26
+ * Find current user in workspace members array
27
+ *
28
+ * @param members - Array of workspace members from init.network.members
29
+ * @param currentUserId - Current user's ID
30
+ * @returns WorkspaceMember if found, undefined otherwise
31
+ */
32
+ export declare function findCurrentUserMember(members: WorkspaceMember[], currentUserId: string): WorkspaceMember | undefined;
33
+ /**
34
+ * Extract user roles from all workspaces
35
+ * Returns a map of workspaceId → UserRole
36
+ *
37
+ * @param networks - Record of workspace ID to WorkspaceInfo from init.networks
38
+ * @param currentUserId - Current user's ID
39
+ * @returns Record mapping workspace IDs to UserRoles
40
+ */
41
+ export declare function extractWorkspaceRoles(networks: Record<string, WorkspaceInfo>, currentUserId: string): Record<string, UserRole>;
42
+ /**
43
+ * Get allowed groups for a specific workspace
44
+ *
45
+ * @param workspaceRoles - Map of workspace IDs to UserRoles
46
+ * @param workspaceId - Target workspace ID
47
+ * @param enableNuclear - Optional override to disable NUCLEAR even for owners
48
+ * @returns Array of ToolGroups the user can access in the specified workspace
49
+ */
50
+ export declare function getAllowedGroupsForWorkspace(workspaceRoles: Record<string, UserRole>, workspaceId: string, enableNuclear?: boolean): ToolGroup[];
51
+ /**
52
+ * Get the highest role across all workspaces
53
+ * Used to determine which tools to show at startup (max potential access)
54
+ *
55
+ * @param workspaceRoles - Map of workspace IDs to UserRoles
56
+ * @returns Highest UserRole across all workspaces
57
+ */
58
+ export declare function getMaxRole(workspaceRoles: Record<string, UserRole>): UserRole;
59
+ /**
60
+ * Check if user has access to a specific ToolGroup in a workspace
61
+ * Used for runtime permission validation when tools are called with workspaceId
62
+ *
63
+ * @param workspaceRoles - Map of workspace IDs to UserRoles
64
+ * @param currentWorkspaceId - Current default workspace ID
65
+ * @param targetWorkspaceId - Target workspace ID (or undefined to use current)
66
+ * @param requiredGroup - ToolGroup required for the operation
67
+ * @param enableNuclear - Optional override to disable NUCLEAR even for owners
68
+ * @returns Object with allowed boolean and optional reason string
69
+ */
70
+ export declare function checkWorkspaceAccess(workspaceRoles: Record<string, UserRole>, currentWorkspaceId: string, targetWorkspaceId: string | undefined, requiredGroup: ToolGroup, enableNuclear?: boolean): {
71
+ allowed: boolean;
72
+ reason?: string;
73
+ };
74
+ //# sourceMappingURL=role-utils.d.ts.map
@@ -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?: string[];
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;
@@ -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
@@ -50,6 +50,8 @@ interface BotEntry {
50
50
  enabled: boolean;
51
51
  displayName?: string;
52
52
  systemPrompt?: string;
53
+ accessLevel?: string;
54
+ responseMode?: string;
53
55
  }
54
56
  interface WorkspaceConfig {
55
57
  workspaceId: string;
@@ -61,6 +63,8 @@ interface WorkspaceConfig {
61
63
  password: string;
62
64
  displayName?: string;
63
65
  systemPrompt?: string;
66
+ accessLevel?: string;
67
+ responseMode?: string;
64
68
  };
65
69
  specialists: BotEntry[];
66
70
  lastSynced: string;
@@ -222,6 +222,9 @@ function handleBotConfigWebhook(payload) {
222
222
  const userId = getFieldValue(payload.fields, 'hailerProfile');
223
223
  const schemaConfigStr = getFieldValue(payload.fields, 'schemaConfig');
224
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;
225
228
  // Validate required fields
226
229
  if (!email || !password) {
227
230
  logger.warn('Webhook missing credentials', {
@@ -245,6 +248,7 @@ function handleBotConfigWebhook(payload) {
245
248
  const schemaConfig = JSON.parse(schemaConfigStr);
246
249
  deployedPhaseId = schemaConfig.deployedPhaseId;
247
250
  retiredPhaseId = schemaConfig.retiredPhaseId;
251
+ responseMode = schemaConfig.responseMode || undefined;
248
252
  }
249
253
  catch (e) {
250
254
  logger.warn('Failed to parse schemaConfig', { schemaConfigStr });
@@ -264,6 +268,8 @@ function handleBotConfigWebhook(payload) {
264
268
  enabled,
265
269
  displayName: payload.name, // Activity name from Agent Directory
266
270
  systemPrompt,
271
+ accessLevel,
272
+ responseMode,
267
273
  };
268
274
  let action;
269
275
  // Handle orchestrator
@@ -276,6 +282,8 @@ function handleBotConfigWebhook(payload) {
276
282
  password,
277
283
  displayName: payload.name,
278
284
  systemPrompt,
285
+ accessLevel,
286
+ responseMode,
279
287
  };
280
288
  action = 'update';
281
289
  logger.info('Updated orchestrator', { workspaceId, email: (0, config_1.maskEmail)(email), displayName: payload.name });
@@ -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
- * Check if agent has access to a specific tool
42
+ * Strict access control for /api/mcp returns false on catch (no config = no access)
35
43
  */
36
- private canAccessTool;
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
  */