@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,9 @@
1
+ /**
2
+ * Company Tools
3
+ *
4
+ * Tools for managing workspace-level company settings in Hailer:
5
+ * - Set user role (owner, admin, guest, inviter, feedAdmin, customRole)
6
+ */
7
+ import { Tool } from '../tool-registry';
8
+ export declare const setUserRoleTool: Tool;
9
+ //# sourceMappingURL=company.d.ts.map
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * Company Tools
4
+ *
5
+ * Tools for managing workspace-level company settings in Hailer:
6
+ * - Set user role (owner, admin, guest, inviter, feedAdmin, customRole)
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.setUserRoleTool = void 0;
10
+ const zod_1 = require("zod");
11
+ const tool_registry_1 = require("../tool-registry");
12
+ const index_1 = require("../utils/index");
13
+ const tool_helpers_1 = require("../utils/tool-helpers");
14
+ const request_logger_1 = require("../../lib/request-logger");
15
+ const logger = (0, index_1.createLogger)({ component: 'company-tools' });
16
+ // ============================================================================
17
+ // TOOL 1: SET USER ROLE
18
+ // ============================================================================
19
+ const roleSections = ['owner', 'admin', 'guest', 'inviter', 'feedAdmin', 'customRole'];
20
+ const setUserRoleDescription = `Set a user's role in the workspace.
21
+
22
+ Sections:
23
+ - owner: Transfer/revoke workspace ownership (owner only)
24
+ - admin: Grant/revoke admin role (value: true/false)
25
+ - guest: Grant/revoke guest role (value: true/false)
26
+ - inviter: Grant/revoke inviter role (value: true/false)
27
+ - feedAdmin: Grant/revoke feed admin role (value: true/false)
28
+ - customRole: Assign/remove a custom role (value: customRole ID string)
29
+
30
+ Required permissions:
31
+ - owner: only the workspace owner can change
32
+ - admin/guest/feedAdmin: must be admin
33
+ - customRole: must be admin or owner`;
34
+ exports.setUserRoleTool = {
35
+ name: 'set_user_role',
36
+ group: tool_registry_1.ToolGroup.WRITE,
37
+ description: setUserRoleDescription,
38
+ schema: zod_1.z.object({
39
+ section: zod_1.z
40
+ .enum(roleSections)
41
+ .describe('Which role to change: owner, admin, guest, inviter, feedAdmin, or customRole'),
42
+ uid: zod_1.z
43
+ .string()
44
+ .describe('Target user ID'),
45
+ value: zod_1.z
46
+ .union([zod_1.z.coerce.boolean(), zod_1.z.string()])
47
+ .describe('true/false to grant/revoke the role, or a custom role ID string for customRole section'),
48
+ workspaceId: zod_1.z
49
+ .string()
50
+ .optional()
51
+ .describe('Workspace ID. Defaults to the current session workspace.'),
52
+ }),
53
+ async execute(args, context) {
54
+ logger.debug('Setting user role', {
55
+ section: args.section,
56
+ uid: args.uid,
57
+ value: args.value,
58
+ apiKey: context.apiKey.substring(0, 8) + '...',
59
+ });
60
+ try {
61
+ const workspaceId = (0, tool_helpers_1.getResolvedWorkspaceId)(args, context);
62
+ const payload = {
63
+ section: args.section,
64
+ uid: args.uid,
65
+ value: args.value,
66
+ };
67
+ if (workspaceId) {
68
+ payload.workspaceId = workspaceId;
69
+ }
70
+ const result = await context.hailer.request('company.set_user_data', [payload]);
71
+ return (0, index_1.textResponse)(JSON.stringify({
72
+ success: true,
73
+ section: args.section,
74
+ uid: args.uid,
75
+ value: args.value,
76
+ workspaceId,
77
+ result,
78
+ }, null, 2));
79
+ }
80
+ catch (error) {
81
+ if (!request_logger_1.RequestLogger.getCurrent())
82
+ logger.error('Error setting user role', error);
83
+ const msg = error?.msg || error?.message || (0, index_1.getErrorMessage)(error);
84
+ return (0, index_1.errorResponse)(`Error setting user role: ${msg}`);
85
+ }
86
+ },
87
+ };
88
+ //# sourceMappingURL=company.js.map
@@ -304,6 +304,32 @@ exports.fetchDiscussionMessagesTool = {
304
304
  const messageCount = messages.length;
305
305
  const userMessages = messages.filter((m) => m.type === "user");
306
306
  const recentMessage = messages[0];
307
+ function extractForwardedMessage(fwd, depth = 0) {
308
+ if (depth > 10)
309
+ return null;
310
+ const fwdUserInfo = (0, workspace_cache_1.getUserById)(context.workspaceCache, fwd.uid);
311
+ let fwdUsername = `User ${fwd.uid}`;
312
+ if (fwdUserInfo) {
313
+ const fullName = `${fwdUserInfo.firstname || ''} ${fwdUserInfo.lastname || ''}`.trim();
314
+ fwdUsername = fullName || fwdUserInfo.fullName || `User ${fwd.uid}`;
315
+ }
316
+ const extracted = {
317
+ _id: fwd._id,
318
+ uid: fwd.uid,
319
+ username: fwdUsername,
320
+ created: new Date(fwd.created).toLocaleString(),
321
+ msg: fwd.msg || '',
322
+ type: fwd.type
323
+ };
324
+ if (fwd.forwardMessageId)
325
+ extracted.forwardMessageId = fwd.forwardMessageId;
326
+ if (fwd.forwardMessage) {
327
+ const nested = extractForwardedMessage(fwd.forwardMessage, depth + 1);
328
+ if (nested)
329
+ extracted.forwardMessage = nested;
330
+ }
331
+ return extracted;
332
+ }
307
333
  const optimizedMessages = messages.map((msg) => {
308
334
  let cleanMsg = msg.msg || '';
309
335
  if (cleanMsg) {
@@ -333,6 +359,14 @@ exports.fetchDiscussionMessagesTool = {
333
359
  if (msg.replyTo) {
334
360
  optimizedMsg.replyTo = msg.replyTo;
335
361
  }
362
+ if (msg.forwardMessageId) {
363
+ optimizedMsg.forwardMessageId = msg.forwardMessageId;
364
+ }
365
+ if (msg.forwardMessage) {
366
+ const forwarded = extractForwardedMessage(msg.forwardMessage, 0);
367
+ if (forwarded)
368
+ optimizedMsg.forwardMessage = forwarded;
369
+ }
336
370
  return optimizedMsg;
337
371
  });
338
372
  const optimizedResult = {
@@ -434,6 +468,32 @@ exports.fetchPreviousDiscussionMessagesTool = {
434
468
  const messageCount = messages.length;
435
469
  const userMessages = messages.filter((m) => m.type === "user");
436
470
  const oldestMessage = messages.length > 0 ? messages[messages.length - 1] : null;
471
+ function extractForwardedMessage(fwd, depth = 0) {
472
+ if (depth > 10)
473
+ return null;
474
+ const fwdUserInfo = (0, workspace_cache_1.getUserById)(context.workspaceCache, fwd.uid);
475
+ let fwdUsername = `User ${fwd.uid}`;
476
+ if (fwdUserInfo) {
477
+ const fullName = `${fwdUserInfo.firstname || ''} ${fwdUserInfo.lastname || ''}`.trim();
478
+ fwdUsername = fullName || fwdUserInfo.fullName || `User ${fwd.uid}`;
479
+ }
480
+ const extracted = {
481
+ _id: fwd._id,
482
+ uid: fwd.uid,
483
+ username: fwdUsername,
484
+ created: new Date(fwd.created).toLocaleString(),
485
+ msg: fwd.msg || '',
486
+ type: fwd.type
487
+ };
488
+ if (fwd.forwardMessageId)
489
+ extracted.forwardMessageId = fwd.forwardMessageId;
490
+ if (fwd.forwardMessage) {
491
+ const nested = extractForwardedMessage(fwd.forwardMessage, depth + 1);
492
+ if (nested)
493
+ extracted.forwardMessage = nested;
494
+ }
495
+ return extracted;
496
+ }
437
497
  const optimizedMessages = messages.map((msg) => {
438
498
  let cleanMsg = msg.msg || '';
439
499
  if (cleanMsg) {
@@ -456,6 +516,14 @@ exports.fetchPreviousDiscussionMessagesTool = {
456
516
  if (msg.replyTo) {
457
517
  optimizedMsg.replyTo = msg.replyTo;
458
518
  }
519
+ if (msg.forwardMessageId) {
520
+ optimizedMsg.forwardMessageId = msg.forwardMessageId;
521
+ }
522
+ if (msg.forwardMessage) {
523
+ const forwarded = extractForwardedMessage(msg.forwardMessage, 0);
524
+ if (forwarded)
525
+ optimizedMsg.forwardMessage = forwarded;
526
+ }
459
527
  return optimizedMsg;
460
528
  });
461
529
  const optimizedResult = {
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Workflow Permission Tools
3
+ *
4
+ * Tools for managing workflow member permissions in Hailer workspaces:
5
+ * - List members and their permission levels
6
+ * - Grant user or team access with a specific permission level
7
+ * - Revoke user or team access
8
+ * - Check what permissions a specific user has
9
+ */
10
+ import { Tool } from '../tool-registry';
11
+ export declare const listWorkflowPermissionsTool: Tool;
12
+ export declare const grantWorkflowPermissionTool: Tool;
13
+ export declare const revokeWorkflowPermissionTool: Tool;
14
+ export declare const checkUserPermissionsTool: Tool;
15
+ //# sourceMappingURL=workflow-permissions.d.ts.map
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ /**
3
+ * Workflow Permission Tools
4
+ *
5
+ * Tools for managing workflow member permissions in Hailer workspaces:
6
+ * - List members and their permission levels
7
+ * - Grant user or team access with a specific permission level
8
+ * - Revoke user or team access
9
+ * - Check what permissions a specific user has
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.checkUserPermissionsTool = exports.revokeWorkflowPermissionTool = exports.grantWorkflowPermissionTool = exports.listWorkflowPermissionsTool = void 0;
13
+ const zod_1 = require("zod");
14
+ const tool_registry_1 = require("../tool-registry");
15
+ const index_1 = require("../utils/index");
16
+ const tool_helpers_1 = require("../utils/tool-helpers");
17
+ const request_logger_1 = require("../../lib/request-logger");
18
+ const logger = (0, index_1.createLogger)({ component: 'workflow-permissions-tools' });
19
+ /** Ensure memberId has the required prefix (user_, team_, network_, group_) */
20
+ function ensureMemberPrefix(memberId) {
21
+ if (memberId.startsWith('user_') || memberId.startsWith('team_') ||
22
+ memberId.startsWith('network_') || memberId.startsWith('group_')) {
23
+ return memberId;
24
+ }
25
+ return `user_${memberId}`;
26
+ }
27
+ // ============================================================================
28
+ // TOOL 1: LIST WORKFLOW PERMISSIONS
29
+ // ============================================================================
30
+ exports.listWorkflowPermissionsTool = {
31
+ name: 'list_workflow_permissions',
32
+ group: tool_registry_1.ToolGroup.READ,
33
+ description: 'List members and their permission levels for a workflow',
34
+ schema: zod_1.z.object({
35
+ workflowId: zod_1.z
36
+ .string()
37
+ .describe('The workflow ID to list permissions for'),
38
+ }),
39
+ async execute(args, context) {
40
+ logger.debug('Listing workflow permissions', {
41
+ workflowId: args.workflowId,
42
+ apiKey: context.apiKey.substring(0, 8) + '...',
43
+ });
44
+ try {
45
+ const result = await context.hailer.request('v2.process.member.list', [args.workflowId]);
46
+ return (0, index_1.textResponse)(JSON.stringify(result, null, 2));
47
+ }
48
+ catch (error) {
49
+ if (!request_logger_1.RequestLogger.getCurrent())
50
+ logger.error('Error listing workflow permissions', error);
51
+ const msg = error?.msg || error?.message || (0, index_1.getErrorMessage)(error);
52
+ return (0, index_1.errorResponse)(`Error listing workflow permissions: ${msg}`);
53
+ }
54
+ },
55
+ };
56
+ // ============================================================================
57
+ // TOOL 2: GRANT WORKFLOW PERMISSION
58
+ // ============================================================================
59
+ const permissionLevels = ['admin', 'any', 'ownteam', 'own'];
60
+ exports.grantWorkflowPermissionTool = {
61
+ name: 'grant_workflow_permission',
62
+ group: tool_registry_1.ToolGroup.WRITE,
63
+ description: 'Grant a user or team access to a workflow with a specific permission level',
64
+ schema: zod_1.z.object({
65
+ workflowId: zod_1.z
66
+ .string()
67
+ .describe('The workflow ID to grant permission on'),
68
+ memberId: zod_1.z
69
+ .string()
70
+ .describe('The user ID or team ID to grant access to'),
71
+ level: zod_1.z
72
+ .enum(permissionLevels)
73
+ .describe('Permission level: admin (full access), any (all activities), ownteam (own team activities), own (own activities only)'),
74
+ }),
75
+ async execute(args, context) {
76
+ logger.debug('Granting workflow permission', {
77
+ workflowId: args.workflowId,
78
+ memberId: args.memberId,
79
+ level: args.level,
80
+ apiKey: context.apiKey.substring(0, 8) + '...',
81
+ });
82
+ try {
83
+ const prefixedMemberId = ensureMemberPrefix(args.memberId);
84
+ // Step 1: Add as member first (may fail if already a member — that's OK)
85
+ try {
86
+ await context.hailer.request('v2.process.member.add', [args.workflowId, prefixedMemberId]);
87
+ }
88
+ catch (addError) {
89
+ logger.debug('member.add failed (possibly already a member), continuing to grant', {
90
+ error: (0, index_1.getErrorMessage)(addError),
91
+ });
92
+ }
93
+ // Step 2: Set the permission level
94
+ const result = await context.hailer.request('v2.process.permissions.grant', [
95
+ args.workflowId,
96
+ prefixedMemberId,
97
+ args.level,
98
+ ]);
99
+ return (0, index_1.textResponse)(JSON.stringify({
100
+ success: true,
101
+ workflowId: args.workflowId,
102
+ memberId: prefixedMemberId,
103
+ level: args.level,
104
+ result,
105
+ }, null, 2));
106
+ }
107
+ catch (error) {
108
+ if (!request_logger_1.RequestLogger.getCurrent())
109
+ logger.error('Error granting workflow permission', error);
110
+ const msg = error?.msg || error?.message || (0, index_1.getErrorMessage)(error);
111
+ return (0, index_1.errorResponse)(`Error granting workflow permission: ${msg}`);
112
+ }
113
+ },
114
+ };
115
+ // ============================================================================
116
+ // TOOL 3: REVOKE WORKFLOW PERMISSION
117
+ // ============================================================================
118
+ exports.revokeWorkflowPermissionTool = {
119
+ name: 'revoke_workflow_permission',
120
+ group: tool_registry_1.ToolGroup.WRITE,
121
+ description: "Remove a user or team's access to a workflow",
122
+ schema: zod_1.z.object({
123
+ workflowId: zod_1.z
124
+ .string()
125
+ .describe('The workflow ID to revoke permission on'),
126
+ memberId: zod_1.z
127
+ .string()
128
+ .describe('The user ID or team ID to remove access from'),
129
+ }),
130
+ async execute(args, context) {
131
+ logger.debug('Revoking workflow permission', {
132
+ workflowId: args.workflowId,
133
+ memberId: args.memberId,
134
+ apiKey: context.apiKey.substring(0, 8) + '...',
135
+ });
136
+ try {
137
+ const prefixedMemberId = ensureMemberPrefix(args.memberId);
138
+ // Step 1: Deny permissions (may fail if no explicit grant — that's OK)
139
+ try {
140
+ await context.hailer.request('v2.process.permissions.deny', [args.workflowId, prefixedMemberId]);
141
+ }
142
+ catch (denyError) {
143
+ logger.debug('permissions.deny failed (possibly no explicit grant), continuing to remove', {
144
+ error: (0, index_1.getErrorMessage)(denyError),
145
+ });
146
+ }
147
+ // Step 2: Remove from members
148
+ const result = await context.hailer.request('v2.process.member.remove', [
149
+ args.workflowId,
150
+ prefixedMemberId,
151
+ ]);
152
+ return (0, index_1.textResponse)(JSON.stringify({
153
+ success: true,
154
+ workflowId: args.workflowId,
155
+ memberId: prefixedMemberId,
156
+ result,
157
+ }, null, 2));
158
+ }
159
+ catch (error) {
160
+ if (!request_logger_1.RequestLogger.getCurrent())
161
+ logger.error('Error revoking workflow permission', error);
162
+ const msg = error?.msg || error?.message || (0, index_1.getErrorMessage)(error);
163
+ return (0, index_1.errorResponse)(`Error revoking workflow permission: ${msg}`);
164
+ }
165
+ },
166
+ };
167
+ // ============================================================================
168
+ // TOOL 4: CHECK USER PERMISSIONS
169
+ // ============================================================================
170
+ exports.checkUserPermissionsTool = {
171
+ name: 'check_user_permissions',
172
+ group: tool_registry_1.ToolGroup.READ,
173
+ description: 'Check what permissions a specific user has in the workspace',
174
+ schema: zod_1.z.object({
175
+ userId: zod_1.z
176
+ .string()
177
+ .describe('The user ID to check permissions for'),
178
+ workspaceId: zod_1.z
179
+ .string()
180
+ .optional()
181
+ .describe('The workspace ID to check permissions in. Defaults to the current workspace.'),
182
+ }),
183
+ async execute(args, context) {
184
+ logger.debug('Checking user permissions', {
185
+ userId: args.userId,
186
+ apiKey: context.apiKey.substring(0, 8) + '...',
187
+ });
188
+ try {
189
+ const workspaceId = (0, tool_helpers_1.getResolvedWorkspaceId)(args, context);
190
+ const result = await context.hailer.request('v3.user.permissions', [
191
+ args.userId,
192
+ workspaceId,
193
+ ]);
194
+ return (0, index_1.textResponse)(JSON.stringify(result, null, 2));
195
+ }
196
+ catch (error) {
197
+ if (!request_logger_1.RequestLogger.getCurrent())
198
+ logger.error('Error checking user permissions', error);
199
+ const msg = error?.msg || error?.message || (0, index_1.getErrorMessage)(error);
200
+ return (0, index_1.errorResponse)(`Error checking user permissions: ${msg}`);
201
+ }
202
+ },
203
+ };
204
+ //# sourceMappingURL=workflow-permissions.js.map
@@ -54,7 +54,13 @@ function parseErrorType(errorMessage) {
54
54
  // ============================================================================
55
55
  // READ TOOLS - Workflow Schema and Information
56
56
  // ============================================================================
57
- const getWorkflowSchemaDescription = `📋 Get workflow field schema and structure - REQUIRED before using list_activities to understand available fields. Shows all field IDs, labels, types, and options. Requires both workflowId and phaseId (use list_workflow_phases first).`;
57
+ const getWorkflowSchemaDescription = `Get workflow field structure - CALL THIS BEFORE create_activity or update_activity.
58
+
59
+ **Hailer Concept:** Shows all fields (columns) in a workflow with their IDs, types, and options. You MUST know field IDs to create or update activities.
60
+
61
+ **Returns:** Field IDs, labels, types (text, numeric, date, dropdown, user, activitylink), required status, dropdown options.
62
+
63
+ **Critical:** Never guess field IDs - always get them from this tool first.`;
58
64
  exports.getWorkflowSchemaTool = {
59
65
  name: 'get_workflow_schema',
60
66
  group: tool_registry_1.ToolGroup.READ,
@@ -179,7 +185,13 @@ exports.getWorkflowSchemaTool = {
179
185
  }
180
186
  },
181
187
  };
182
- const listWorkflowPhasesDescription = `📊 List available phases in a workflow - Required before using list_activities to get phase IDs. Use this first to see all phases, then call list_activities for each phase to get complete workflow overview. TIP: Also call get_workflow_schema to understand field structure.`;
188
+ const listWorkflowPhasesDescription = `List phases (stages/statuses) in a workflow - REQUIRED to get phase IDs.
189
+
190
+ **Hailer Concept:** Phases are stages like "New" → "In Progress" → "Done". Activities move through phases as work progresses.
191
+
192
+ **When to use:** Before list_activities (need phaseId), before create_activity (need initial phase), before update_activity (to move to new phase).
193
+
194
+ **Returns:** Phase names, IDs, which phase is initial (for new items), which is endpoint (completed).`;
183
195
  exports.listWorkflowPhasesTool = {
184
196
  name: 'list_workflow_phases',
185
197
  group: tool_registry_1.ToolGroup.READ,
@@ -258,7 +270,15 @@ exports.listWorkflowPhasesTool = {
258
270
  }
259
271
  },
260
272
  };
261
- const listWorkflowsDescription = `List workflows - Get workflow info with optional detailed data`;
273
+ const listWorkflowsDescription = `List workflows (processes/pipelines) in the Hailer workspace.
274
+
275
+ **Hailer Concept:** A Workflow is like a database table or Kanban board - it defines a process with fields (columns) and phases (stages). Examples: "Sales Pipeline", "Customer Database", "Project Tasks".
276
+
277
+ **When to use:** To see all available workflows, find workflow IDs, or understand the workspace structure.
278
+
279
+ **Returns:** Workflow names, IDs, activity counts, and relationships between workflows.
280
+
281
+ **Next steps:** Use \`list_workflow_phases\` to see stages, then \`get_workflow_schema\` for field structure.`;
262
282
  exports.listWorkflowsTool = {
263
283
  name: 'list_workflows',
264
284
  group: tool_registry_1.ToolGroup.READ,
@@ -1069,23 +1089,15 @@ ${errorMessage}
1069
1089
  // ============================================================================
1070
1090
  // TOOL 5: LIST WORKFLOWS MINIMAL
1071
1091
  // ============================================================================
1072
- const listWorkflowsMinimalDescription = `🧪 [PLAYGROUND] List workflows with minimal output - Returns only id and name to avoid token limits
1092
+ const listWorkflowsMinimalDescription = `Quick list of all workflows - START HERE to find workflow IDs.
1073
1093
 
1074
- **⚡ PERFORMANCE ADVANTAGE:**
1075
- - Uses cached data from init (v2.core.init) - **ZERO extra API calls**
1076
- - Returns activity counts for ALL workflows in one call
1077
- - **Preferred method for getting bulk workflow counts**
1078
- - Much faster and more efficient than calling \`count_activities\` for each workflow
1094
+ **Hailer Concept:** Returns all workflows (processes/boards) with their IDs and names. This is usually your FIRST CALL to discover what's available.
1079
1095
 
1080
- **When to use this vs count_activities:**
1081
- - ✅ Use \`list_workflows_minimal\` for: Bulk counts, workflow discovery, listing all workflows with counts
1082
- - ❌ Use \`count_activities\` for: Phase-level breakdown, real-time count for single workflow
1096
+ **When to use:** User asks "show my tasks", "what workflows do I have", "find customers" - use this to locate the right workflow ID.
1083
1097
 
1084
- **Response includes**:
1085
- - Workflow ID and name
1086
- - Activity count (from cached init data)
1087
- - Starred status
1088
- - Workspace ID`;
1098
+ **Returns:** Workflow name, ID, activity count. Use the ID in subsequent calls.
1099
+
1100
+ **Typical flow:** list_workflows_minimal list_workflow_phases get_workflow_schema → list_activities`;
1089
1101
  const listWorkflowsMinimalSchema = zod_1.z.object({
1090
1102
  workspace: zod_1.z.string().optional().describe("Optional workspace ID or name"),
1091
1103
  limit: zod_1.z.coerce.number().optional().describe("Maximum number of workflows to return"),
@@ -1313,7 +1325,34 @@ const updateWorkflowPhaseSchema = zod_1.z.object({
1313
1325
  // ============================================================================
1314
1326
  // CORE INIT TOOL - Workspace overview for terminal Claude Code sessions
1315
1327
  // ============================================================================
1316
- const coreInitDescription = `Load workspace context - call once at session start to get workflows, phases, teams with IDs`;
1328
+ const coreInitDescription = `🚀 START HERE - Load workspace context and learn how to use Hailer tools.
1329
+
1330
+ ## What is Hailer?
1331
+ Hailer is a workspace platform. Key concepts:
1332
+ - **Workflow** = process/board (like "Tasks", "Customers", "Sales Pipeline")
1333
+ - **Activity** = item/record/card in a workflow
1334
+ - **Phase** = stage/status (like "New" → "In Progress" → "Done")
1335
+ - **Field** = property/column on an activity (name, date, priority, etc.)
1336
+
1337
+ ## How to use these tools:
1338
+
1339
+ **Step 1 - Find workflow:** \`list_workflows_minimal\` → get workflow ID
1340
+ **Step 2 - Get phases:** \`list_workflow_phases(workflowId)\` → get phase IDs
1341
+ **Step 3 - Get fields:** \`get_workflow_schema(workflowId, phaseId)\` → get field IDs
1342
+ **Step 4 - Read/Write:**
1343
+ - \`list_activities\` - see items (requires workflowId, phaseId, fields[])
1344
+ - \`create_activity\` - create item (requires workflowId, use field IDs from schema)
1345
+ - \`update_activity\` - update item (requires activityId, use field IDs)
1346
+
1347
+ ## Field value formats:
1348
+ - Text: \`"value"\`
1349
+ - Number: \`42\`
1350
+ - Date: Unix timestamp in ms \`1730937600000\`
1351
+ - Dropdown: exact option string \`"High"\`
1352
+ - User: user ID string \`"5f8a1b2c..."\`
1353
+
1354
+ ## This tool returns:
1355
+ All workflows, phases, fields, and teams with IDs. Reference this data for all other calls.`;
1317
1356
  exports.coreInitTool = {
1318
1357
  name: 'core_init',
1319
1358
  group: tool_registry_1.ToolGroup.READ,
@@ -12,5 +12,7 @@ export { transformActivity, transformActivities, transformFields, transformField
12
12
  export { textResponse, errorResponse, successResponse, jsonResponse, paginatedResponse, listResponse, getErrorMessage, withErrorHandling, isErrorResponse } from './response-builder';
13
13
  export { normalizePagination, calculatePaginationMeta, formatPaginationText } from './pagination';
14
14
  export type { PaginationMeta, PaginationOptions } from './pagination';
15
+ export { deriveUserRole, getAllowedGroups, findCurrentUserMember, extractWorkspaceRoles, getAllowedGroupsForWorkspace, getMaxRole, checkWorkspaceAccess } from './role-utils';
15
16
  export type * from './types';
17
+ export { normalizeInitProcesses } from './types';
16
18
  //# sourceMappingURL=index.d.ts.map
@@ -4,7 +4,7 @@
4
4
  * Provides centralized access to all utility functions and types
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.formatPaginationText = exports.calculatePaginationMeta = exports.normalizePagination = exports.isErrorResponse = exports.withErrorHandling = exports.getErrorMessage = exports.listResponse = exports.paginatedResponse = exports.jsonResponse = exports.successResponse = exports.errorResponse = exports.textResponse = exports.formatActivityListResponse = exports.formatUserName = exports.formatTimestamp = exports.transformWorkflowFields = exports.transformPhases = exports.transformWorkflow = exports.findFieldByKey = exports.transformFieldValue = exports.transformFields = exports.transformActivities = exports.transformActivity = exports.HailerApiClient = exports.createSuccessResponse = exports.createErrorResponse = exports.handleApiResponse = exports.makeApiCall = exports.HailerApiError = exports.LogTag = exports.LogLevel = exports.logger = exports.createLogger = void 0;
7
+ exports.normalizeInitProcesses = exports.checkWorkspaceAccess = exports.getMaxRole = exports.getAllowedGroupsForWorkspace = exports.extractWorkspaceRoles = exports.findCurrentUserMember = exports.getAllowedGroups = exports.deriveUserRole = exports.formatPaginationText = exports.calculatePaginationMeta = exports.normalizePagination = exports.isErrorResponse = exports.withErrorHandling = exports.getErrorMessage = exports.listResponse = exports.paginatedResponse = exports.jsonResponse = exports.successResponse = exports.errorResponse = exports.textResponse = exports.formatActivityListResponse = exports.formatUserName = exports.formatTimestamp = exports.transformWorkflowFields = exports.transformPhases = exports.transformWorkflow = exports.findFieldByKey = exports.transformFieldValue = exports.transformFields = exports.transformActivities = exports.transformActivity = exports.HailerApiClient = exports.createSuccessResponse = exports.createErrorResponse = exports.handleApiResponse = exports.makeApiCall = exports.HailerApiError = exports.LogTag = exports.LogLevel = exports.logger = exports.createLogger = void 0;
8
8
  // Logging utilities
9
9
  var logger_1 = require("../../lib/logger");
10
10
  Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_1.createLogger; } });
@@ -50,4 +50,15 @@ var pagination_1 = require("./pagination");
50
50
  Object.defineProperty(exports, "normalizePagination", { enumerable: true, get: function () { return pagination_1.normalizePagination; } });
51
51
  Object.defineProperty(exports, "calculatePaginationMeta", { enumerable: true, get: function () { return pagination_1.calculatePaginationMeta; } });
52
52
  Object.defineProperty(exports, "formatPaginationText", { enumerable: true, get: function () { return pagination_1.formatPaginationText; } });
53
+ // Role-based access control
54
+ var role_utils_1 = require("./role-utils");
55
+ Object.defineProperty(exports, "deriveUserRole", { enumerable: true, get: function () { return role_utils_1.deriveUserRole; } });
56
+ Object.defineProperty(exports, "getAllowedGroups", { enumerable: true, get: function () { return role_utils_1.getAllowedGroups; } });
57
+ Object.defineProperty(exports, "findCurrentUserMember", { enumerable: true, get: function () { return role_utils_1.findCurrentUserMember; } });
58
+ Object.defineProperty(exports, "extractWorkspaceRoles", { enumerable: true, get: function () { return role_utils_1.extractWorkspaceRoles; } });
59
+ Object.defineProperty(exports, "getAllowedGroupsForWorkspace", { enumerable: true, get: function () { return role_utils_1.getAllowedGroupsForWorkspace; } });
60
+ Object.defineProperty(exports, "getMaxRole", { enumerable: true, get: function () { return role_utils_1.getMaxRole; } });
61
+ Object.defineProperty(exports, "checkWorkspaceAccess", { enumerable: true, get: function () { return role_utils_1.checkWorkspaceAccess; } });
62
+ var types_1 = require("./types");
63
+ Object.defineProperty(exports, "normalizeInitProcesses", { enumerable: true, get: function () { return types_1.normalizeInitProcesses; } });
53
64
  //# sourceMappingURL=index.js.map
@@ -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