@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.
Files changed (252) hide show
  1. package/dist/app.js +18 -5
  2. package/dist/bot/bot-config.d.ts +12 -1
  3. package/dist/bot/bot-config.js +98 -14
  4. package/dist/bot/bot-manager.d.ts +13 -3
  5. package/dist/bot/bot-manager.js +80 -25
  6. package/dist/bot/bot.d.ts +46 -0
  7. package/dist/bot/bot.js +542 -166
  8. package/dist/bot/services/message-classifier.js +17 -0
  9. package/dist/bot/services/permission-guard.d.ts +52 -0
  10. package/dist/bot/services/permission-guard.js +149 -0
  11. package/dist/bot/services/types.d.ts +5 -0
  12. package/dist/bot/services/typing-indicator.d.ts +6 -1
  13. package/dist/bot/services/typing-indicator.js +19 -3
  14. package/dist/config.d.ts +6 -1
  15. package/dist/config.js +43 -0
  16. package/dist/core.js +3 -6
  17. package/dist/mcp/UserContextCache.d.ts +5 -0
  18. package/dist/mcp/UserContextCache.js +51 -19
  19. package/dist/mcp/hailer-clients.d.ts +19 -1
  20. package/dist/mcp/hailer-clients.js +157 -20
  21. package/dist/mcp/session-store.d.ts +68 -0
  22. package/dist/mcp/session-store.js +169 -0
  23. package/dist/mcp/signal-handler.js +12 -12
  24. package/dist/mcp/tool-registry.d.ts +17 -4
  25. package/dist/mcp/tool-registry.js +37 -7
  26. package/dist/mcp/tools/activity.js +99 -7
  27. package/dist/mcp/tools/app-scaffold.js +304 -336
  28. package/dist/mcp/tools/company.d.ts +9 -0
  29. package/dist/mcp/tools/company.js +88 -0
  30. package/dist/mcp/tools/discussion.js +68 -0
  31. package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
  32. package/dist/mcp/tools/workflow-permissions.js +204 -0
  33. package/dist/mcp/tools/workflow.js +57 -18
  34. package/dist/mcp/utils/index.d.ts +2 -0
  35. package/dist/mcp/utils/index.js +12 -1
  36. package/dist/mcp/utils/role-utils.d.ts +74 -0
  37. package/dist/mcp/utils/role-utils.js +151 -0
  38. package/dist/mcp/utils/types.d.ts +43 -1
  39. package/dist/mcp/utils/types.js +14 -0
  40. package/dist/mcp/webhook-handler.d.ts +6 -0
  41. package/dist/mcp/webhook-handler.js +11 -0
  42. package/dist/mcp-server.d.ts +23 -2
  43. package/dist/mcp-server.js +639 -111
  44. package/dist/plugins/vipunen/client.d.ts +150 -0
  45. package/dist/plugins/vipunen/client.js +535 -0
  46. package/dist/plugins/vipunen/config/schema-config.json +19 -0
  47. package/dist/plugins/vipunen/config/schema-doc.json +22 -0
  48. package/dist/plugins/vipunen/index.d.ts +41 -0
  49. package/dist/plugins/vipunen/index.js +88 -0
  50. package/dist/plugins/vipunen/tools.d.ts +26 -0
  51. package/dist/plugins/vipunen/tools.js +501 -0
  52. package/package.json +2 -1
  53. package/.claude/.context-watchdog.json +0 -1
  54. package/.claude/.session-checked +0 -1
  55. package/.claude/CLAUDE.md +0 -370
  56. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  57. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  58. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  59. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  60. package/.claude/agents/agent-code-simplifier.md +0 -53
  61. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  62. package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
  63. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  64. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  65. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  66. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  67. package/.claude/agents/agent-ivan-monolith.md +0 -154
  68. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  69. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  70. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  71. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  72. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  73. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  74. package/.claude/agents/agent-permissions-handler.md +0 -208
  75. package/.claude/agents/agent-simple-writer.md +0 -48
  76. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  77. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  78. package/.claude/agents/agent-ui-designer.md +0 -100
  79. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  80. package/.claude/agents/agent-web-search.md +0 -55
  81. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  82. package/.claude/agents/agent-zara-zapier.md +0 -159
  83. package/.claude/commands/app-squad.md +0 -135
  84. package/.claude/commands/audit-squad.md +0 -158
  85. package/.claude/commands/autoplan.md +0 -563
  86. package/.claude/commands/cleanup-squad.md +0 -98
  87. package/.claude/commands/config-squad.md +0 -106
  88. package/.claude/commands/crud-squad.md +0 -87
  89. package/.claude/commands/data-squad.md +0 -97
  90. package/.claude/commands/debug-squad.md +0 -303
  91. package/.claude/commands/doc-squad.md +0 -65
  92. package/.claude/commands/handoff.md +0 -137
  93. package/.claude/commands/health.md +0 -49
  94. package/.claude/commands/help.md +0 -29
  95. package/.claude/commands/help:agents.md +0 -151
  96. package/.claude/commands/help:commands.md +0 -78
  97. package/.claude/commands/help:faq.md +0 -79
  98. package/.claude/commands/help:plugins.md +0 -50
  99. package/.claude/commands/help:skills.md +0 -93
  100. package/.claude/commands/help:tools.md +0 -75
  101. package/.claude/commands/hotfix-squad.md +0 -112
  102. package/.claude/commands/integration-squad.md +0 -82
  103. package/.claude/commands/janitor-squad.md +0 -167
  104. package/.claude/commands/learn-auto.md +0 -120
  105. package/.claude/commands/learn.md +0 -120
  106. package/.claude/commands/mcp-list.md +0 -27
  107. package/.claude/commands/onboard-squad.md +0 -140
  108. package/.claude/commands/plan-workspace.md +0 -732
  109. package/.claude/commands/prd.md +0 -130
  110. package/.claude/commands/project-status.md +0 -82
  111. package/.claude/commands/publish.md +0 -138
  112. package/.claude/commands/recap.md +0 -69
  113. package/.claude/commands/restore.md +0 -64
  114. package/.claude/commands/review-squad.md +0 -152
  115. package/.claude/commands/save.md +0 -24
  116. package/.claude/commands/stats.md +0 -19
  117. package/.claude/commands/swarm.md +0 -210
  118. package/.claude/commands/tool-builder.md +0 -39
  119. package/.claude/commands/ws-pull.md +0 -44
  120. package/.claude/hooks/_shared-memory.cjs +0 -305
  121. package/.claude/hooks/_utils.cjs +0 -108
  122. package/.claude/hooks/agent-failure-detector.cjs +0 -383
  123. package/.claude/hooks/agent-usage-logger.cjs +0 -204
  124. package/.claude/hooks/app-edit-guard.cjs +0 -494
  125. package/.claude/hooks/auto-learn.cjs +0 -304
  126. package/.claude/hooks/bash-guard.cjs +0 -272
  127. package/.claude/hooks/builder-mode-manager.cjs +0 -354
  128. package/.claude/hooks/bulk-activity-guard.cjs +0 -271
  129. package/.claude/hooks/context-watchdog.cjs +0 -230
  130. package/.claude/hooks/delegation-reminder.cjs +0 -465
  131. package/.claude/hooks/design-system-lint.cjs +0 -271
  132. package/.claude/hooks/post-scaffold-hook.cjs +0 -181
  133. package/.claude/hooks/prompt-guard.cjs +0 -354
  134. package/.claude/hooks/publish-template-guard.cjs +0 -147
  135. package/.claude/hooks/session-start.cjs +0 -35
  136. package/.claude/hooks/shared-memory-writer.cjs +0 -147
  137. package/.claude/hooks/skill-injector.cjs +0 -140
  138. package/.claude/hooks/skill-usage-logger.cjs +0 -258
  139. package/.claude/hooks/src-edit-guard.cjs +0 -240
  140. package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
  141. package/.claude/settings.json +0 -257
  142. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  143. package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
  144. package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
  145. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  146. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  147. package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
  148. package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
  149. package/.claude/skills/agent-structure/SKILL.md +0 -98
  150. package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
  151. package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
  152. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  153. package/.claude/skills/frontend-design/SKILL.md +0 -254
  154. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  155. package/.claude/skills/hailer-api-client/SKILL.md +0 -518
  156. package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
  157. package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
  158. package/.claude/skills/hailer-design-system/SKILL.md +0 -235
  159. package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
  160. package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
  161. package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
  162. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  163. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  164. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  165. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  166. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  167. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  168. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  169. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  170. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  171. package/.claude/skills/integration-patterns/SKILL.md +0 -421
  172. package/.claude/skills/json-only-output/SKILL.md +0 -72
  173. package/.claude/skills/lsp-setup/SKILL.md +0 -160
  174. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  175. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  176. package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
  177. package/.claude/skills/testing-patterns/SKILL.md +0 -630
  178. package/.claude/skills/tool-builder/SKILL.md +0 -250
  179. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  180. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  181. package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
  182. package/.hailer-mcp-port +0 -1
  183. package/.mcp.json +0 -13
  184. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  185. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  186. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  187. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  188. package/.opencode/agent/agent-code-simplifier.md +0 -31
  189. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  190. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  191. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  192. package/.opencode/agent/agent-helga-workflow-config.md +0 -204
  193. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  194. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  195. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  196. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  197. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  198. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  199. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  200. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  201. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  202. package/.opencode/agent/agent-permissions-handler.md +0 -50
  203. package/.opencode/agent/agent-simple-writer.md +0 -45
  204. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  205. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  206. package/.opencode/agent/agent-ui-designer.md +0 -56
  207. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  208. package/.opencode/agent/agent-web-search.md +0 -42
  209. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  210. package/.opencode/agent/agent-zara-zapier.md +0 -53
  211. package/.opencode/commands/app-squad.md +0 -135
  212. package/.opencode/commands/audit-squad.md +0 -158
  213. package/.opencode/commands/autoplan.md +0 -563
  214. package/.opencode/commands/cleanup-squad.md +0 -98
  215. package/.opencode/commands/config-squad.md +0 -106
  216. package/.opencode/commands/crud-squad.md +0 -87
  217. package/.opencode/commands/data-squad.md +0 -97
  218. package/.opencode/commands/debug-squad.md +0 -303
  219. package/.opencode/commands/doc-squad.md +0 -65
  220. package/.opencode/commands/handoff.md +0 -137
  221. package/.opencode/commands/health.md +0 -49
  222. package/.opencode/commands/help-agents.md +0 -151
  223. package/.opencode/commands/help-commands.md +0 -32
  224. package/.opencode/commands/help-faq.md +0 -29
  225. package/.opencode/commands/help-plugins.md +0 -28
  226. package/.opencode/commands/help-skills.md +0 -7
  227. package/.opencode/commands/help-tools.md +0 -40
  228. package/.opencode/commands/help.md +0 -28
  229. package/.opencode/commands/hotfix-squad.md +0 -112
  230. package/.opencode/commands/integration-squad.md +0 -82
  231. package/.opencode/commands/janitor-squad.md +0 -167
  232. package/.opencode/commands/learn-auto.md +0 -120
  233. package/.opencode/commands/learn.md +0 -120
  234. package/.opencode/commands/mcp-list.md +0 -27
  235. package/.opencode/commands/onboard-squad.md +0 -140
  236. package/.opencode/commands/plan-workspace.md +0 -732
  237. package/.opencode/commands/prd.md +0 -131
  238. package/.opencode/commands/project-status.md +0 -82
  239. package/.opencode/commands/publish.md +0 -138
  240. package/.opencode/commands/recap.md +0 -69
  241. package/.opencode/commands/restore.md +0 -64
  242. package/.opencode/commands/review-squad.md +0 -152
  243. package/.opencode/commands/save.md +0 -24
  244. package/.opencode/commands/stats.md +0 -19
  245. package/.opencode/commands/swarm.md +0 -210
  246. package/.opencode/commands/tool-builder.md +0 -39
  247. package/.opencode/commands/ws-pull.md +0 -44
  248. package/.opencode/opencode.json +0 -21
  249. package/inbox/failures.log +0 -1
  250. package/inbox/usage.jsonl +0 -4
  251. package/scripts/postinstall.cjs +0 -64
  252. 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?: 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
@@ -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 });
@@ -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
  */