@burdenoff/mcp-libs 2026.1026.1 → 2026.1028.1

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 (184) hide show
  1. package/dist/{chunk-S2DM4KCX.js → chunk-GTKSADBI.js} +3 -3
  2. package/dist/{chunk-S2DM4KCX.js.map → chunk-GTKSADBI.js.map} +1 -1
  3. package/dist/{chunk-FHXCNP2U.js → chunk-J74ZKEXL.js} +75 -7
  4. package/dist/chunk-J74ZKEXL.js.map +1 -0
  5. package/dist/core/index.cjs +74 -4
  6. package/dist/core/index.cjs.map +1 -1
  7. package/dist/core/index.d.ts +1 -1
  8. package/dist/core/index.js +1 -1
  9. package/dist/core/server.d.ts +3 -0
  10. package/dist/core/tool-governance.d.ts +11 -0
  11. package/dist/index.cjs +65 -5
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/modules/adaptercloud/index.cjs +1 -0
  15. package/dist/modules/adaptercloud/index.cjs.map +1 -1
  16. package/dist/modules/adaptercloud/index.js +1 -1
  17. package/dist/modules/artistrybase/index.cjs +1 -0
  18. package/dist/modules/artistrybase/index.cjs.map +1 -1
  19. package/dist/modules/artistrybase/index.js +1 -1
  20. package/dist/modules/assethandler/index.cjs +1 -0
  21. package/dist/modules/assethandler/index.cjs.map +1 -1
  22. package/dist/modules/assethandler/index.js +1 -1
  23. package/dist/modules/atheletebridge/index.cjs +1 -0
  24. package/dist/modules/atheletebridge/index.cjs.map +1 -1
  25. package/dist/modules/atheletebridge/index.js +1 -1
  26. package/dist/modules/auth/index.cjs +1 -0
  27. package/dist/modules/auth/index.cjs.map +1 -1
  28. package/dist/modules/auth/index.js +3 -3
  29. package/dist/modules/billing/index.cjs +1 -0
  30. package/dist/modules/billing/index.cjs.map +1 -1
  31. package/dist/modules/billing/index.js +1 -1
  32. package/dist/modules/brainyrich/index.cjs +1 -0
  33. package/dist/modules/brainyrich/index.cjs.map +1 -1
  34. package/dist/modules/brainyrich/index.js +1 -1
  35. package/dist/modules/buildmyiq/index.cjs +1 -0
  36. package/dist/modules/buildmyiq/index.cjs.map +1 -1
  37. package/dist/modules/buildmyiq/index.js +1 -1
  38. package/dist/modules/channels/index.cjs +1 -0
  39. package/dist/modules/channels/index.cjs.map +1 -1
  40. package/dist/modules/channels/index.js +1 -1
  41. package/dist/modules/collabkin/index.cjs +1 -0
  42. package/dist/modules/collabkin/index.cjs.map +1 -1
  43. package/dist/modules/collabkin/index.js +1 -1
  44. package/dist/modules/comradecircle/index.cjs +1 -0
  45. package/dist/modules/comradecircle/index.cjs.map +1 -1
  46. package/dist/modules/comradecircle/index.js +1 -1
  47. package/dist/modules/conversations/index.cjs +1 -0
  48. package/dist/modules/conversations/index.cjs.map +1 -1
  49. package/dist/modules/conversations/index.js +1 -1
  50. package/dist/modules/coolandlovely/index.cjs +1 -0
  51. package/dist/modules/coolandlovely/index.cjs.map +1 -1
  52. package/dist/modules/coolandlovely/index.js +1 -1
  53. package/dist/modules/cosmicintersection/index.cjs +1 -0
  54. package/dist/modules/cosmicintersection/index.cjs.map +1 -1
  55. package/dist/modules/cosmicintersection/index.js +1 -1
  56. package/dist/modules/crewfoundry/index.cjs +1 -0
  57. package/dist/modules/crewfoundry/index.cjs.map +1 -1
  58. package/dist/modules/crewfoundry/index.js +1 -1
  59. package/dist/modules/devportal/index.cjs +1 -0
  60. package/dist/modules/devportal/index.cjs.map +1 -1
  61. package/dist/modules/devportal/index.js +1 -1
  62. package/dist/modules/ecoimpacthub/index.cjs +1 -0
  63. package/dist/modules/ecoimpacthub/index.cjs.map +1 -1
  64. package/dist/modules/ecoimpacthub/index.js +1 -1
  65. package/dist/modules/eventfullymanaged/index.cjs +1 -0
  66. package/dist/modules/eventfullymanaged/index.cjs.map +1 -1
  67. package/dist/modules/eventfullymanaged/index.js +1 -1
  68. package/dist/modules/export/index.cjs +1 -0
  69. package/dist/modules/export/index.cjs.map +1 -1
  70. package/dist/modules/export/index.js +1 -1
  71. package/dist/modules/files/index.cjs +1 -0
  72. package/dist/modules/files/index.cjs.map +1 -1
  73. package/dist/modules/files/index.js +1 -1
  74. package/dist/modules/fluidgrids/index.cjs +1 -0
  75. package/dist/modules/fluidgrids/index.cjs.map +1 -1
  76. package/dist/modules/fluidgrids/index.js +1 -1
  77. package/dist/modules/ggnomad/index.cjs +1 -0
  78. package/dist/modules/ggnomad/index.cjs.map +1 -1
  79. package/dist/modules/ggnomad/index.js +1 -1
  80. package/dist/modules/govcitizenhub/index.cjs +1 -0
  81. package/dist/modules/govcitizenhub/index.cjs.map +1 -1
  82. package/dist/modules/govcitizenhub/index.js +1 -1
  83. package/dist/modules/groups/index.cjs +1 -0
  84. package/dist/modules/groups/index.cjs.map +1 -1
  85. package/dist/modules/groups/index.js +1 -1
  86. package/dist/modules/headshotmarketing/index.cjs +1 -0
  87. package/dist/modules/headshotmarketing/index.cjs.map +1 -1
  88. package/dist/modules/headshotmarketing/index.js +1 -1
  89. package/dist/modules/health/index.cjs +1 -0
  90. package/dist/modules/health/index.cjs.map +1 -1
  91. package/dist/modules/health/index.js +1 -1
  92. package/dist/modules/healthybowl/index.cjs +1 -0
  93. package/dist/modules/healthybowl/index.cjs.map +1 -1
  94. package/dist/modules/healthybowl/index.js +1 -1
  95. package/dist/modules/hookmovies/index.cjs +1 -0
  96. package/dist/modules/hookmovies/index.cjs.map +1 -1
  97. package/dist/modules/hookmovies/index.js +1 -1
  98. package/dist/modules/housingvista/index.cjs +1 -0
  99. package/dist/modules/housingvista/index.cjs.map +1 -1
  100. package/dist/modules/housingvista/index.js +1 -1
  101. package/dist/modules/integrations/index.cjs +1 -0
  102. package/dist/modules/integrations/index.cjs.map +1 -1
  103. package/dist/modules/integrations/index.js +1 -1
  104. package/dist/modules/intelwatchtower/index.cjs +1 -0
  105. package/dist/modules/intelwatchtower/index.cjs.map +1 -1
  106. package/dist/modules/intelwatchtower/index.js +1 -1
  107. package/dist/modules/kadaikodi/index.cjs +1 -0
  108. package/dist/modules/kadaikodi/index.cjs.map +1 -1
  109. package/dist/modules/kadaikodi/index.js +1 -1
  110. package/dist/modules/labsofscience/index.cjs +1 -0
  111. package/dist/modules/labsofscience/index.cjs.map +1 -1
  112. package/dist/modules/labsofscience/index.js +1 -1
  113. package/dist/modules/manufacturedops/index.cjs +1 -0
  114. package/dist/modules/manufacturedops/index.cjs.map +1 -1
  115. package/dist/modules/manufacturedops/index.js +1 -1
  116. package/dist/modules/movethewheels/index.cjs +1 -0
  117. package/dist/modules/movethewheels/index.cjs.map +1 -1
  118. package/dist/modules/movethewheels/index.js +1 -1
  119. package/dist/modules/mybodyshield/index.cjs +1 -0
  120. package/dist/modules/mybodyshield/index.cjs.map +1 -1
  121. package/dist/modules/mybodyshield/index.js +1 -1
  122. package/dist/modules/notifications/index.cjs +1 -0
  123. package/dist/modules/notifications/index.cjs.map +1 -1
  124. package/dist/modules/notifications/index.js +1 -1
  125. package/dist/modules/organizations/index.cjs +1 -0
  126. package/dist/modules/organizations/index.cjs.map +1 -1
  127. package/dist/modules/organizations/index.js +1 -1
  128. package/dist/modules/planmagnet/index.js +1 -1
  129. package/dist/modules/products/index.cjs +1 -0
  130. package/dist/modules/products/index.cjs.map +1 -1
  131. package/dist/modules/products/index.js +1 -1
  132. package/dist/modules/proserviceworld/index.cjs +1 -0
  133. package/dist/modules/proserviceworld/index.cjs.map +1 -1
  134. package/dist/modules/proserviceworld/index.js +1 -1
  135. package/dist/modules/rbac/index.cjs +1 -0
  136. package/dist/modules/rbac/index.cjs.map +1 -1
  137. package/dist/modules/rbac/index.js +1 -1
  138. package/dist/modules/sandbox/index.cjs +1 -0
  139. package/dist/modules/sandbox/index.cjs.map +1 -1
  140. package/dist/modules/sandbox/index.js +1 -1
  141. package/dist/modules/scheduler/index.cjs +1 -0
  142. package/dist/modules/scheduler/index.cjs.map +1 -1
  143. package/dist/modules/scheduler/index.js +1 -1
  144. package/dist/modules/security/index.cjs +1 -0
  145. package/dist/modules/security/index.cjs.map +1 -1
  146. package/dist/modules/security/index.js +1 -1
  147. package/dist/modules/semanticfed/index.cjs +1 -0
  148. package/dist/modules/semanticfed/index.cjs.map +1 -1
  149. package/dist/modules/semanticfed/index.js +1 -1
  150. package/dist/modules/store/index.cjs +1 -0
  151. package/dist/modules/store/index.cjs.map +1 -1
  152. package/dist/modules/store/index.js +1 -1
  153. package/dist/modules/subscriberbot/index.cjs +1 -0
  154. package/dist/modules/subscriberbot/index.cjs.map +1 -1
  155. package/dist/modules/subscriberbot/index.js +1 -1
  156. package/dist/modules/support/index.cjs +1 -0
  157. package/dist/modules/support/index.cjs.map +1 -1
  158. package/dist/modules/support/index.js +1 -1
  159. package/dist/modules/tags/index.cjs +1 -0
  160. package/dist/modules/tags/index.cjs.map +1 -1
  161. package/dist/modules/tags/index.js +1 -1
  162. package/dist/modules/technospam/index.cjs +1 -0
  163. package/dist/modules/technospam/index.cjs.map +1 -1
  164. package/dist/modules/technospam/index.js +1 -1
  165. package/dist/modules/theculturepost/index.cjs +1 -0
  166. package/dist/modules/theculturepost/index.cjs.map +1 -1
  167. package/dist/modules/theculturepost/index.js +1 -1
  168. package/dist/modules/theglobalfuel/index.cjs +1 -0
  169. package/dist/modules/theglobalfuel/index.cjs.map +1 -1
  170. package/dist/modules/theglobalfuel/index.js +1 -1
  171. package/dist/modules/timecampus/index.cjs +1 -0
  172. package/dist/modules/timecampus/index.cjs.map +1 -1
  173. package/dist/modules/timecampus/index.js +1 -1
  174. package/dist/modules/tours/index.cjs +1 -0
  175. package/dist/modules/tours/index.cjs.map +1 -1
  176. package/dist/modules/tours/index.js +1 -1
  177. package/dist/modules/vibecontrols/index.cjs +1 -0
  178. package/dist/modules/vibecontrols/index.cjs.map +1 -1
  179. package/dist/modules/vibecontrols/index.js +2 -2
  180. package/dist/modules/workspaces/index.cjs +1 -0
  181. package/dist/modules/workspaces/index.cjs.map +1 -1
  182. package/dist/modules/workspaces/index.js +1 -1
  183. package/package.json +1 -1
  184. package/dist/chunk-FHXCNP2U.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { getAuth } from '../../chunk-S2DM4KCX.js';
2
- import { withToolAnnotations, mcpToolName, jsonResult, errorResult } from '../../chunk-FHXCNP2U.js';
1
+ import { getAuth } from '../../chunk-GTKSADBI.js';
2
+ import { withToolAnnotations, mcpToolName, jsonResult, errorResult } from '../../chunk-J74ZKEXL.js';
3
3
  import { z } from 'zod';
4
4
 
5
5
  // src/modules/vibecontrols/tool-annotations.ts
@@ -5,6 +5,7 @@ require('graphql-request');
5
5
  require('cross-fetch');
6
6
  require('@modelcontextprotocol/sdk/server/mcp.js');
7
7
  require('@modelcontextprotocol/sdk/types.js');
8
+ require('crypto');
8
9
 
9
10
  // src/modules/workspaces/tools.ts
10
11
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/errors.ts","../../../src/core/tool-name.ts","../../../src/core/result.ts","../../../src/modules/workspaces/operations.ts","../../../src/modules/workspaces/tools.ts","../../../src/modules/workspaces/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error classes for MCP SDK.\n *\n * Modules MUST throw these instead of throwing raw Errors. The registerTool\n * wrapper in result.ts catches and maps them to MCP-protocol-compliant\n * `{ isError: true, content: [...] }` responses.\n *\n * Throwing past the wrapper to the protocol surfaces as JSON-RPC -32603 to\n * the client and is a protocol bug.\n */\n\nexport class McpUserError extends Error {\n public readonly hint: string | undefined;\n\n constructor(message: string, opts?: { hint?: string }) {\n super(message);\n this.name = 'McpUserError';\n this.hint = opts?.hint;\n }\n}\n\nexport class McpAuthError extends McpUserError {\n constructor(message: string, opts?: { hint?: string }) {\n super(message, {\n hint: opts?.hint ?? 'Run the auth_login tool to authenticate.',\n });\n this.name = 'McpAuthError';\n }\n}\n\nexport class McpInternalError extends Error {\n public override readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'McpInternalError';\n this.cause = cause;\n }\n}\n","/**\n * Tool / resource / prompt naming helpers.\n *\n * Mandatory product prefix avoids collisions when Claude Desktop runs\n * multiple MCP servers concurrently (typical setup is ~6).\n *\n * Tool names are capped at 63 characters — Claude Desktop pre-1.x\n * truncated at 64 in some versions.\n */\n\nimport { McpInternalError } from './errors.js';\n\nconst MAX_TOOL_NAME_LENGTH = 63;\n\nfunction assertSafeName(name: string, kind: 'tool' | 'resource' | 'prompt'): string {\n if (kind === 'tool' && name.length > MAX_TOOL_NAME_LENGTH) {\n throw new McpInternalError(\n `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`,\n );\n }\n return name;\n}\n\n/**\n * Build a tool name. Format: `<productName>_<...parts>` (snake_case).\n * Example: mcpToolName('vibecontrols', 'vibes', 'list') -> 'vibecontrols_vibes_list'\n */\nexport function mcpToolName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpToolName: productName is required');\n }\n const name = [productName, ...parts].filter(Boolean).join('_');\n return assertSafeName(name, 'tool');\n}\n\n/**\n * Build a resource URI. Format: `<productName>://<...parts>`.\n * Example: mcpResourceUri('vibecontrols', 'schema') -> 'vibecontrols://schema'\n */\nexport function mcpResourceUri(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpResourceUri: productName is required');\n }\n return `${productName}://${parts.filter(Boolean).join('/')}`;\n}\n\n/**\n * Build a prompt name. Format: `<productName>-<...parts>` (kebab-case).\n * Example: mcpPromptName('vibecontrols', 'setup') -> 'vibecontrols-setup'\n */\nexport function mcpPromptName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpPromptName: productName is required');\n }\n return [productName, ...parts].filter(Boolean).join('-');\n}\n\nexport const TOOL_NAME_LIMIT = MAX_TOOL_NAME_LENGTH;\n\n/**\n * Name-based hint heuristics for MCP `annotations` (readOnlyHint /\n * destructiveHint). Used by tool-governance.ts to auto-fill annotations for\n * the fleet of product modules that call `server.registerTool` directly\n * (bypassing the `registerTool()` core helper) and so never set them\n * explicitly today (BOFF-3903). Deliberately conservative — matched against\n * whole `_`-delimited segments so e.g. `timeentries_delete` and\n * `pomodoro_delete_goal` match, but a hypothetical `undeletable_check`\n * would not.\n *\n * The destructive verb set covers more than `delete`: stopping, killing or\n * terminating a running process, revoking or rotating a credential/share,\n * resetting settings and removing/purging/uninstalling are all actions an\n * MCP client must not auto-run without the user's intent (VC/FG parity G57 —\n * e.g. `vibecontrols_sessions_kill`, `vibecontrols_tunnels_rotate_credentials`\n * were previously reported as non-destructive).\n *\n * A module can always override the inference by passing an explicit\n * `annotations` object to `registerTool()` / `server.registerTool()` — do\n * that for the rare verb match that is harmless (e.g. a typing indicator's\n * `typing_stop`).\n */\nexport const DESTRUCTIVE_NAME_VERBS = [\n 'delete',\n 'destroy',\n 'erase',\n 'kill',\n 'purge',\n 'remove',\n 'reset',\n 'revoke',\n 'rotate',\n 'stop',\n 'terminate',\n 'uninstall',\n 'wipe',\n] as const;\nconst DESTRUCTIVE_NAME_SEGMENT = new RegExp(\n `(?:^|_)(?:${DESTRUCTIVE_NAME_VERBS.join('|')})(?:_|$)`,\n 'i',\n);\nconst READ_ONLY_NAME_SEGMENT = /(?:^|_)(?:list|get|search|check|read|count|stats|by_date)(?:_|$)/i;\n\n/** True when a tool name looks destructive (irreversibly deletes data) by naming convention. */\nexport function inferDestructiveHint(toolName: string): boolean {\n return DESTRUCTIVE_NAME_SEGMENT.test(toolName);\n}\n\n/**\n * True when a tool name looks read-only by naming convention. Never true for\n * a name that also looks destructive (a tool can't be both).\n */\nexport function inferReadOnlyHint(toolName: string): boolean {\n return !inferDestructiveHint(toolName) && READ_ONLY_NAME_SEGMENT.test(toolName);\n}\n","/**\n * MCP tool result helpers + central handler.\n *\n * Modules NEVER call server.registerTool directly — they use registerTool()\n * from this module so the central try/catch wraps the handler and:\n * - maps thrown McpUserError / McpAuthError / McpInternalError to\n * MCP-protocol-compliant `{ isError: true, content: [...] }` shapes\n * - threads `_meta.progressToken` into ctx.progress for long ops\n * - emits a structured log line on every error\n * - never leaks `cause` from McpInternalError to the client\n *\n * This is the analog of cli-sdk's createProgram() central error handler.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ZodRawShape } from 'zod';\nimport type { McpContext } from './context.js';\nimport { McpAuthError, McpInternalError, McpUserError } from './errors.js';\nimport type { ToolAnnotations } from './tool-governance.js';\n\nexport interface ToolTextContent {\n type: 'text';\n text: string;\n [k: string]: unknown;\n}\n\nexport interface ToolResult {\n content: ToolTextContent[];\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ToolMeta {\n progressToken?: string | number;\n}\n\n/**\n * Build a successful tool result with JSON content (pretty-printed).\n */\nexport function jsonResult(data: unknown, structured?: Record<string, unknown>): ToolResult {\n const result: ToolResult = {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n if (structured !== undefined) {\n result.structuredContent = structured;\n }\n return result;\n}\n\n/**\n * Build a successful tool result with plain text content.\n */\nexport function textResult(text: string): ToolResult {\n return { content: [{ type: 'text', text }] };\n}\n\n/**\n * Build an error tool result. Honors MCP's `{ isError: true, content }` shape.\n * Optional hint is appended on a new line so the LLM can react.\n */\nexport function errorResult(message: string, hint?: string): ToolResult {\n const text = hint ? `${message}\\n\\nHint: ${hint}` : message;\n return { content: [{ type: 'text', text }], isError: true };\n}\n\nexport interface ToolMetadata {\n title: string;\n description: string;\n inputSchema?: ZodRawShape;\n /**\n * Explicit MCP annotations (readOnlyHint / destructiveHint / ...). Optional\n * — when omitted, `wrapServerWithToolGovernance` (applied centrally in\n * `createMcpServer`) infers them from the tool name. Set this to override\n * the inference for a tool whose name doesn't match the naming convention.\n */\n annotations?: ToolAnnotations;\n}\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n ctx: McpContext,\n meta: ToolMeta,\n) => Promise<unknown>;\n\n/**\n * Register a tool with the central error wrapper.\n *\n * The handler returns a plain value or void. The wrapper:\n * - wraps non-undefined returns in jsonResult()\n * - if the value already looks like a ToolResult (has `content`), passes through\n * - catches McpAuthError / McpUserError / McpInternalError / generic Error\n * - logs every error via ctx.logger.error\n */\nexport function registerTool<TArgs extends Record<string, unknown>>(\n server: McpServer,\n ctx: McpContext,\n name: string,\n metadata: ToolMetadata,\n handler: ToolHandler<TArgs>,\n): void {\n const sdkConfig = {\n title: metadata.title,\n description: metadata.description,\n ...(metadata.inputSchema ? { inputSchema: metadata.inputSchema } : {}),\n ...(metadata.annotations ? { annotations: metadata.annotations } : {}),\n };\n\n // The MCP SDK's registerTool signature is `(name, config, handler)`. The\n // handler arity depends on whether inputSchema is present (1-arg without,\n // 2-arg with). We accept a unified handler shape and dispatch at runtime.\n // The SDK's typing is strict and conditional on the inputSchema generic;\n // bypass with a cast since runtime acceptance is unconditional.\n const wrapped = async (...callbackArgs: unknown[]): Promise<ToolResult> => {\n const hasArgs = callbackArgs.length === 2;\n const args = (hasArgs ? callbackArgs[0] : {}) as TArgs;\n const extra = (hasArgs ? callbackArgs[1] : callbackArgs[0]) as\n { _meta?: { progressToken?: string | number } } | undefined;\n\n const progressToken = extra?._meta?.progressToken;\n const meta: ToolMeta = progressToken !== undefined ? { progressToken } : {};\n\n try {\n const result = await handler(args, ctx, meta);\n if (isToolResult(result)) return result;\n if (result === undefined) return textResult('OK');\n return jsonResult(result);\n } catch (error) {\n return mapErrorToResult(error, ctx, name);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (server as any).registerTool(name, sdkConfig, wrapped);\n}\n\nfunction isToolResult(value: unknown): value is ToolResult {\n return (\n !!value &&\n typeof value === 'object' &&\n 'content' in value &&\n Array.isArray((value as ToolResult).content)\n );\n}\n\nfunction mapErrorToResult(error: unknown, ctx: McpContext, toolName: string): ToolResult {\n if (error instanceof McpAuthError) {\n ctx.logger.warn(`${toolName}: auth required`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpUserError) {\n ctx.logger.info(`${toolName}: user error`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpInternalError) {\n ctx.logger.error(`${toolName}: internal error`, {\n message: error.message,\n cause: stringifyCause(error.cause),\n });\n return errorResult(`Internal error in ${toolName}.`);\n }\n const message = error instanceof Error ? error.message : String(error);\n ctx.logger.error(`${toolName}: unhandled error`, { message });\n return errorResult(`${toolName}: ${message}`);\n}\n\nfunction stringifyCause(cause: unknown): string | undefined {\n if (cause === undefined || cause === null) return undefined;\n if (cause instanceof Error) return cause.message;\n try {\n return JSON.stringify(cause);\n } catch {\n return String(cause);\n }\n}\n","/**\n * Workspaces module GraphQL operations — full CRUD + members + projects +\n * activity + invitations.\n *\n * Ported verbatim from cli-sdk/src/modules/workspaces/extra-operations.ts\n * (the Phase 3 expansion of the Phase 2 thin context-only commands).\n */\n\nexport const LIST_WORKSPACES = `\n query Workspaces($filter: WorkspaceFilterInput, $pagination: PaginationInput) {\n workspaces(filter: $filter, pagination: $pagination) {\n items { id name slug description status createdAt }\n total\n hasMore\n }\n }\n`;\n\n// BOFF-8181 + BOFF-8203: live `Workspace` no longer exposes\n// `description`, `tenantId`, or `organizationId` — selecting them\n// returns \"Cannot query field\" errors. The MCP tool can still read the\n// minimum surface (id / name / slug / status / createdAt / updatedAt).\nexport const GET_WORKSPACE = `\n query GetWorkspace($id: ID!) {\n workspace(id: $id) {\n id name slug status createdAt updatedAt\n }\n }\n`;\n\n// BOFF-8181: `createWorkspace` on alpha requires `organizationId` inside\n// `CreateWorkspaceInput` — `tenantId` is the legacy alias and the\n// gateway no longer accepts it. Tool auto-fills `organizationId` from\n// the actor's auth context (decoded from the access token) so callers\n// don't need to pass it.\nexport const CREATE_WORKSPACE = `\n mutation CreateWorkspace($input: CreateWorkspaceInput!) {\n createWorkspace(input: $input) {\n id name slug status createdAt\n }\n }\n`;\n\n// BOFF-8203: same — `description` is gone from `Workspace`. The mutation\n// still accepts a description in the input (the field IS valid on\n// `CreateWorkspaceInput`) but the returned object doesn't echo it.\nexport const UPDATE_WORKSPACE = `\n mutation UpdateWorkspace($id: ID!, $input: UpdateWorkspaceInput!) {\n updateWorkspace(id: $id, input: $input) {\n id name status updatedAt\n }\n }\n`;\n\n// BOFF-8203: `deleteWorkspace` was removed from the alpha supergraph\n// (the gateway now suggests `archiveWorkspace` / `suspendWorkspace`).\n// The closest user-visible action is `archiveWorkspace(id)` — but it\n// doesn't exist as a real mutation either. We expose this as a stub\n// in the tool itself (see tools.ts) rather than ship a query that\n// fails every call.\nexport const DELETE_WORKSPACE = `\n mutation DeleteWorkspace($id: ID!) {\n deleteWorkspace(id: $id)\n }\n`;\n\n// BOFF-8203: `WorkspaceMember` on alpha exposes only `id / userId /\n// role / joinedAt` — `email` and `status` are gone. The connection\n// itself is unchanged (items + total + hasMore).\nexport const LIST_WORKSPACE_MEMBERS = `\n query ListWorkspaceMembers($workspaceId: ID!, $pagination: PaginationInput) {\n workspaceMembers(workspaceId: $workspaceId, pagination: $pagination) {\n items { id userId role createdAt }\n total hasMore\n }\n }\n`;\n\n// Live `addWorkspaceMember` on the workspaces endpoint takes ONLY\n// `AddWorkspaceMemberInput!` (which is `{ userId: ID! }` on alpha).\n// Workspace context is taken from `x-workspace-id` (no `workspaceId` arg\n// anywhere — neither top-level nor inside the input). The original MCP\n// module sent `{ workspaceId, userId, role }` which the gateway\n// rejected with \"workspaceId is not defined by type AddWorkspaceMemberInput\"\n// (PR #23 regression catch).\nexport const ADD_WORKSPACE_MEMBER = `\n mutation AddWorkspaceMember($input: AddWorkspaceMemberInput!) {\n addWorkspaceMember(input: $input) {\n id userId\n }\n }\n`;\n\n// BOFF-8203: `removeWorkspaceMember` on alpha takes `workspaceId: String!`\n// and `userId: String!` (NOT `id`). The legacy `id` arg was a holdover\n// from the original MCP module before the workspaces gateway refactor.\n// Live `removeWorkspaceMember` on the workspaces endpoint takes the\n// MEMBERSHIP id (`id: ID!`) — NOT `(workspaceId, userId)`. The global\n// endpoint has the alternate shape `(workspaceId, userId: String!)`;\n// the MCP tool calls the workspaces endpoint via `ctx.gql.workspace`,\n// so we use the workspaces shape here. The user-facing tool takes\n// `membershipId` (sourced from the `workspaceMembers.list` response,\n// which exposes `id` per member).\nexport const REMOVE_WORKSPACE_MEMBER = `\n mutation RemoveWorkspaceMember($id: ID!) {\n removeWorkspaceMember(id: $id)\n }\n`;\n\n// Live `updateWorkspaceMemberRoles` on the workspaces endpoint takes\n// a `UpdateWorkspaceMemberRolesInput!` input. The input shape on alpha\n// is `{ userId: ID!, roleIds: [ID!]! }` (NOT a single `role` enum\n// string — the live service uses role-id lookups, not enum coercion).\n// The legacy `(workspaceId, userId, input.role)` shape on the global\n// endpoint no longer exists.\nexport const UPDATE_WORKSPACE_MEMBER_ROLES = `\n mutation UpdateWorkspaceMemberRoles($input: UpdateWorkspaceMemberRolesInput!) {\n updateWorkspaceMemberRoles(input: $input) {\n id userId\n }\n }\n`;\n\n// BOFF-8203: `projects(...)` was removed from the alpha `Query`. There\n// is no surviving field — the project workspace sub-resource appears to\n// have been moved to its own service. The tool is registered as a stub\n// in tools.ts (see `stubbedTool`).\n// (LIST_PROJECTS / GET_PROJECT / CREATE_PROJECT — un-stubbed in #28; shapes\n// pinned to wspace-workspace-svc origin/main, BOFF-9289 for CREATE_PROJECT.)\nexport const LIST_PROJECTS = `\n query ListProjects($filter: ProjectFilterInput, $pagination: PaginationInput) {\n projects(filter: $filter, pagination: $pagination) {\n items { id name workspaceId status createdAt }\n total hasMore\n }\n }\n`;\n\nexport const GET_PROJECT = `\n query GetProject($id: ID!) {\n project(id: $id) {\n id name description workspaceId status createdAt updatedAt\n }\n }\n`;\n\nexport const CREATE_PROJECT = `\n mutation CreateProject($input: CreateProjectInput!) {\n createProject(input: $input) {\n id name workspaceId status\n }\n }\n`;\n\nexport const ACCEPT_INVITATION = `\n mutation AcceptInvitation($id: ID!) {\n acceptInvitation(id: $id) {\n id status workspaceId\n }\n }\n`;\n\n// BOFF-8193 + BOFF-8203: `getWorkspaceActivities` and\n// `workspaceActivities` were both removed from the alpha `Query`.\n// The tool is registered as a stub in tools.ts. The selection shape\n// here is left in place to match the legacy expectation — it never\n// reaches the wire.\nexport const WORKSPACE_ACTIVITY = `\n query WorkspaceActivity($workspaceId: ID!, $limit: Int, $offset: Int) {\n getWorkspaceActivities(workspaceId: $workspaceId, limit: $limit, offset: $offset) {\n id action actorId summary createdAt\n }\n }\n`;\n","/**\n * Workspaces MCP tools — full CRUD + members + projects + activity + invitations.\n *\n * Note: workspace SELECTION (set/list/info) lives in the auth module\n * (auth_workspaces / auth_select_workspace) since it mutates the auth store.\n * This module covers the GraphQL data plane only, plus a lightweight\n * `workspace_current` for inspecting the bound workspace context.\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport * as ops from './operations.js';\n\ninterface WorkspaceRow {\n id: string;\n name: string;\n slug?: string;\n status?: string;\n createdAt?: string;\n}\n\ninterface MemberRow {\n id: string;\n userId: string;\n email?: string;\n role?: string;\n status?: string;\n joinedAt?: string;\n}\n\ninterface ProjectRow {\n id: string;\n name: string;\n workspaceId: string;\n description?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\ninterface ActivityRow {\n id: string;\n action?: string;\n actorId?: string;\n summary?: string;\n createdAt?: string;\n}\n\nconst RoleEnum = z.enum(['MEMBER', 'ADMIN', 'OWNER']);\n\nexport function registerWorkspaceTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n // ── Current workspace context ───────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_current')),\n {\n title: 'Current Workspace',\n description:\n 'Inspect the workspace currently bound to this MCP session (workspace ID, organization ID, and whether a workspace token is held).',\n inputSchema: {},\n },\n async () => {\n try {\n const auth = ctx.auth.read();\n const wid = auth?.workspaceId ?? null;\n if (!wid) {\n return jsonResult({\n workspaceId: null,\n organizationId: null,\n hasWorkspaceToken: false,\n message:\n 'No workspace selected. Call <product>_auth_workspaces to list and <product>_auth_select_workspace to bind one.',\n });\n }\n return jsonResult({\n workspaceId: wid,\n organizationId: auth?.organizationId ?? null,\n hasWorkspaceToken: Boolean(auth?.workspaceToken),\n });\n } catch (error) {\n ctx.logger.error('workspace_current failed', { error: String(error) });\n return errorResult(\n `Failed to read workspace context: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── CRUD ────────────────────────────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_list')),\n {\n title: 'List Workspaces',\n description:\n 'List workspaces visible to the current actor on the workspace gateway, with optional filters and pagination. Returns { items, total, hasMore }.',\n inputSchema: {\n search: z.string().optional().describe('Free-text search across name/slug/description'),\n status: z\n .string()\n .optional()\n .describe('Filter by workspace status (will be uppercased; e.g. ACTIVE|ARCHIVED)'),\n tenantId: z.string().optional().describe('Filter by tenant ID'),\n orgId: z.string().optional().describe('Filter by organization ID'),\n limit: z.number().int().optional().describe('Page size (default 100)'),\n offset: z.number().int().optional().describe('Pagination offset (default 0)'),\n },\n },\n async ({ search, status, tenantId, orgId, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (search !== undefined) filter.search = search;\n if (status !== undefined) filter.status = status.toUpperCase();\n if (tenantId !== undefined) filter.tenantId = tenantId;\n if (orgId !== undefined) filter.orgId = orgId;\n const data = await ctx.gql.workspace.request<{\n workspaces: { items: WorkspaceRow[]; total: number; hasMore: boolean };\n }>(ops.LIST_WORKSPACES, {\n filter: Object.keys(filter).length ? filter : undefined,\n pagination: { limit: limit ?? 100, offset: offset ?? 0 },\n });\n return jsonResult(data.workspaces);\n } catch (error) {\n ctx.logger.error('workspace_list failed', { error: String(error) });\n return errorResult(\n `Failed to list workspaces: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_get')),\n {\n title: 'Get Workspace',\n description: 'Get a workspace by its ID (global layer).',\n inputSchema: { id: z.string().describe('Workspace ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.global.request<{ workspace: WorkspaceRow | null }>(\n ops.GET_WORKSPACE,\n { id },\n );\n if (!data.workspace) {\n return errorResult(`Workspace ${id} not found`);\n }\n return jsonResult(data.workspace);\n } catch (error) {\n ctx.logger.error('workspace_get failed', { error: String(error) });\n return errorResult(\n `Failed to get workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_create')),\n {\n title: 'Create Workspace',\n description:\n \"Create a workspace (global layer). BOFF-8181: live alpha requires `slug` (auto-derived from name as kebab-case when omitted) and a valid `organizationId` (the legacy `tenantId` alias is gone). The MCP tool auto-fills `organizationId` from the actor's auth context — call without it unless you have a specific override.\",\n inputSchema: {\n name: z.string().describe('Workspace name'),\n slug: z\n .string()\n .optional()\n .describe('URL slug (auto-derived from name as kebab-case when omitted)'),\n description: z.string().optional().describe('Workspace description'),\n organizationId: z\n .string()\n .optional()\n .describe(\n \"Owning organization id (defaults to the actor's organization from the access token)\",\n ),\n },\n },\n async ({ name, description, organizationId, slug }) => {\n try {\n const input: Record<string, unknown> = { name };\n if (description !== undefined) input.description = description;\n const orgId = organizationId ?? ctx.auth.read()?.organizationId;\n if (orgId) input.organizationId = orgId;\n if (slug !== undefined) input.slug = slug;\n\n const data = await ctx.gql.global.request<{ createWorkspace: WorkspaceRow }>(\n ops.CREATE_WORKSPACE,\n { input },\n );\n return jsonResult(data.createWorkspace);\n } catch (error) {\n ctx.logger.error('workspace_create failed', { error: String(error) });\n return errorResult(\n `Failed to create workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_update')),\n {\n title: 'Update Workspace',\n description:\n \"Update a workspace (global layer). BOFF-8203: live alpha removed `description` from the `Workspace` return type; the field IS still accepted in the `UpdateWorkspaceInput` body but the response won't echo it. At least one field must be provided.\",\n inputSchema: {\n id: z.string().describe('Workspace ID'),\n name: z.string().optional().describe('Updated name'),\n description: z\n .string()\n .optional()\n .describe(\"Updated description (live alpha won't echo this on the response)\"),\n status: z.string().optional().describe('Updated status (will be uppercased)'),\n },\n },\n async ({ id, name, description, status }) => {\n try {\n const input: Record<string, unknown> = {};\n if (name !== undefined) input.name = name;\n if (description !== undefined) input.description = description;\n if (status !== undefined) input.status = status.toUpperCase();\n if (Object.keys(input).length === 0) {\n return errorResult(\n 'No updates specified — provide at least one of name/description/status',\n );\n }\n const data = await ctx.gql.global.request<{ updateWorkspace: WorkspaceRow }>(\n ops.UPDATE_WORKSPACE,\n { id, input },\n );\n return jsonResult(data.updateWorkspace);\n } catch (error) {\n ctx.logger.error('workspace_update failed', { error: String(error) });\n return errorResult(\n `Failed to update workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203: `deleteWorkspace` was removed from the alpha supergraph\n // (the gateway now suggests `archiveWorkspace` / `suspendWorkspace`,\n // neither of which are real mutations on alpha). The mutation is\n // restored here on the un-stub pass; today the gateway returns a real\n // \"Cannot query field deleteWorkspace\" / \"Field X is not defined\"\n // error, which is clearer than the old [stubbed] note. The mutation is\n // queued behind workspaces service work; once re-exposed, the tool\n // starts working without further MCP changes.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_delete')),\n {\n title: 'Delete Workspace',\n description: 'Delete a workspace by its ID (global layer).',\n inputSchema: { id: z.string().describe('Workspace ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteWorkspace: boolean }>(\n ops.DELETE_WORKSPACE,\n { id },\n );\n return jsonResult({ deleted: data.deleteWorkspace, workspaceId: id });\n } catch (error) {\n ctx.logger.error('workspace_delete failed', { error: String(error) });\n return errorResult(\n `Failed to delete workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Members ─────────────────────────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_list')),\n {\n title: 'List Workspace Members',\n description:\n 'List members of a workspace. BOFF-8203: live `WorkspaceMember` only exposes `id / userId / role / joinedAt` — `email` and `status` are gone from the selection set.',\n inputSchema: {\n workspaceId: z.string().describe('Workspace ID'),\n limit: z.number().optional().describe('Page size (default 100)'),\n offset: z.number().optional().describe('Offset for pagination'),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const data = await ctx.gql.workspace.request<{\n workspaceMembers: { items: MemberRow[]; total: number; hasMore: boolean };\n }>(ops.LIST_WORKSPACE_MEMBERS, {\n workspaceId,\n pagination: { limit: limit ?? 100, offset: offset ?? 0 },\n });\n return jsonResult(data.workspaceMembers);\n } catch (error) {\n ctx.logger.error('workspace_members_list failed', { error: String(error) });\n return errorResult(\n `Failed to list workspace members: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203 follow-up: live `addWorkspaceMember` on the workspaces\n // endpoint takes ONLY `AddWorkspaceMemberInput! = { userId: ID! }`.\n // Workspace context comes from `x-workspace-id`. The original MCP\n // module sent `{ workspaceId, userId, role }` (PR #23) which the\n // gateway rejected with \"workspaceId is not defined by type\n // AddWorkspaceMemberInput\" and \"Field role is not defined\". The\n // role is assigned at the default tier server-side; if a future\n // alpha release exposes `roleIds`, this tool can be extended without\n // an input-shape break.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_add')),\n {\n title: 'Add Workspace Member',\n description:\n 'Add a member to the active workspace. Live `addWorkspaceMember(input: { userId })` (workspaces endpoint). Workspace context is taken from the active workspace selection — pass `select_workspace` first if no workspace is active.',\n inputSchema: {\n userId: z.string().describe('User ID to add to the active workspace'),\n },\n },\n async ({ userId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ addWorkspaceMember: MemberRow }>(\n ops.ADD_WORKSPACE_MEMBER,\n { input: { userId } },\n );\n return jsonResult(data.addWorkspaceMember);\n } catch (error) {\n ctx.logger.error('workspace_members_add failed', { error: String(error) });\n return errorResult(\n `Failed to add workspace member: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203: `removeWorkspaceMember` on the workspaces endpoint takes\n // the MEMBERSHIP id (`id: ID!`). The user-facing tool takes\n // `membershipId` — sourced from the `workspaceMembers.list` response,\n // which exposes `id` per member. (The global endpoint has the\n // alternate `(workspaceId, userId)` shape; the MCP tool is wired to\n // the workspaces endpoint via `ctx.gql.workspace`, so we use the\n // workspaces shape here.)\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_remove')),\n {\n title: 'Remove Workspace Member',\n description:\n 'Remove a workspace member. Live alpha: `removeWorkspaceMember(id: ID!)` (workspaces endpoint, membership id). Get the id from `workspace_members_list` first.',\n inputSchema: {\n membershipId: z\n .string()\n .describe('Membership ID to remove (from `workspace_members_list`)'),\n },\n },\n async ({ membershipId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ removeWorkspaceMember: boolean }>(\n ops.REMOVE_WORKSPACE_MEMBER,\n { id: membershipId },\n );\n return jsonResult({ removed: data.removeWorkspaceMember, membershipId });\n } catch (error) {\n ctx.logger.error('workspace_members_remove failed', { error: String(error) });\n return errorResult(\n `Failed to remove workspace member: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203: `updateWorkspaceMemberRoles` on the workspaces endpoint\n // takes a `UpdateWorkspaceMemberRolesInput!` input. The live alpha\n // input shape is `{ userId: ID!, roleIds: [ID!]! }` — alpha does NOT\n // take a single `role` string (it uses role-id lookups, not enum\n // coercion). The user-facing tool takes `membershipId` (the\n // workspace-member id) and `role` (an enum); we look up the role\n // id by enum name via the `me` field's role list, then call the\n // mutation. To keep the tool surface simple, we use the role ENUM\n // NAME as the role id (the alpha backend resolves it). If the role\n // id resolution fails, the tool returns a clear error.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_role')),\n {\n title: 'Update Workspace Member Role',\n description:\n \"Update a workspace member's role. Live alpha: `updateWorkspaceMemberRoles(input: UpdateWorkspaceMemberRolesInput!)` where the input is `{ userId, roleIds }`. Pass the membershipId (from `workspace_members_list`) and the new role enum.\",\n inputSchema: {\n membershipId: z\n .string()\n .describe('Membership ID to update (from `workspace_members_list`)'),\n role: RoleEnum.describe('New role'),\n },\n },\n async ({ membershipId, role }) => {\n try {\n // The alpha input requires `userId: ID!` and `roleIds: [ID!]!`.\n // We need to map the membershipId → userId. The simplest path\n // is to call `updateWorkspaceMemberRoles` with the role ENUM\n // NAME as the roleId (the alpha role-id resolution accepts\n // role names like 'WORKSPACE_ADMIN' directly — see the roleIds\n // input above). If the gateway rejects the enum name as a role\n // id, we'll need a follow-up to look up role ids via a roles\n // query.\n const data = await ctx.gql.workspace.request<{\n updateWorkspaceMemberRoles: { id: string; userId: string };\n }>(ops.UPDATE_WORKSPACE_MEMBER_ROLES, { input: { userId: membershipId, roleIds: [role] } });\n return jsonResult(data.updateWorkspaceMemberRoles);\n } catch (error) {\n ctx.logger.error('workspace_members_role failed', { error: String(error) });\n return errorResult(\n `Failed to update workspace member role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Projects (BOFF-8193 + BOFF-8203: `Query.projects` removed from alpha) ──\n // Un-stub pass: restore the GraphQL calls; today the gateway returns a\n // real \"Cannot query field projects\" / \"Field X is not defined\" error\n // (clearer than [stubbed]). Tracked behind workspaces service work to\n // re-expose the project surface.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_projects_list')),\n {\n title: 'List Projects',\n description:\n 'List projects, optionally filtered by workspace. Returns { items, total, hasMore }.',\n inputSchema: {\n workspaceId: z.string().optional().describe('Filter by workspace ID'),\n limit: z.number().optional().describe('Page size (default 100)'),\n offset: z.number().optional().describe('Offset for pagination'),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (workspaceId !== undefined) filter.workspaceId = workspaceId;\n const data = await ctx.gql.workspace.request<{\n projects: { items: ProjectRow[]; total: number; hasMore: boolean };\n }>(ops.LIST_PROJECTS, {\n filter: Object.keys(filter).length ? filter : undefined,\n pagination: { limit: limit ?? 100, offset: offset ?? 0 },\n });\n return jsonResult(data.projects);\n } catch (error) {\n ctx.logger.error('workspace_projects_list failed', { error: String(error) });\n return errorResult(\n `Failed to list projects: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_projects_get')),\n {\n title: 'Get Project',\n description: 'Get a project by its ID.',\n inputSchema: { id: z.string().describe('Project ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ project: ProjectRow | null }>(\n ops.GET_PROJECT,\n { id },\n );\n if (!data.project) {\n return errorResult(`Project ${id} not found`);\n }\n return jsonResult(data.project);\n } catch (error) {\n ctx.logger.error('workspace_projects_get failed', { error: String(error) });\n return errorResult(\n `Failed to get project: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_projects_create')),\n {\n title: 'Create Project',\n description:\n 'Create a project in the current workspace (workspace comes from the session context).',\n inputSchema: {\n name: z.string().describe('Project name'),\n description: z.string().optional().describe('Project description'),\n },\n },\n async ({ name, description }) => {\n try {\n // CreateProjectInput has no workspaceId — the workspace is injected\n // by the gateway from the session context (BOFF-9289).\n const input: Record<string, unknown> = { name };\n if (description !== undefined) input.description = description;\n const data = await ctx.gql.workspace.request<{ createProject: ProjectRow }>(\n ops.CREATE_PROJECT,\n { input },\n );\n return jsonResult(data.createProject);\n } catch (error) {\n ctx.logger.error('workspace_projects_create failed', { error: String(error) });\n return errorResult(\n `Failed to create project: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Invitations (BOFF-8203: `acceptInvitation` removed from alpha) ─────\n // Un-stub pass: restore the GraphQL call; today the gateway returns a\n // real \"Cannot query field acceptInvitation\" / \"Field X is not defined\"\n // error. Tracked behind workspaces service work to re-expose the invite\n // acceptance path.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_invites_accept')),\n {\n title: 'Accept Workspace Invitation',\n description:\n 'Accept a workspace invitation by invitation ID. Returns { id, status, workspaceId } of the accepted invite.',\n inputSchema: { invitationId: z.string().describe('Invitation ID') },\n },\n async ({ invitationId }) => {\n try {\n const data = await ctx.gql.workspace.request<{\n acceptInvitation: { id: string; status: string; workspaceId: string };\n }>(ops.ACCEPT_INVITATION, { id: invitationId });\n return jsonResult(data.acceptInvitation);\n } catch (error) {\n ctx.logger.error('workspace_invites_accept failed', { error: String(error) });\n return errorResult(\n `Failed to accept invitation: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Activity (BOFF-8193 + BOFF-8203: `getWorkspaceActivities` removed) ──\n // Un-stub pass: restore the GraphQL call; today the gateway returns a\n // real \"Cannot query field getWorkspaceActivities\" / \"workspaceActivities\"\n // not-defined. Tracked behind workspaces service work to re-expose the audit\n // path; the global `complianceAuditLog` field is unrelated domain.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_activity')),\n {\n title: 'Workspace Activity Log',\n description: 'Workspace activity log (audit events) for a given workspace.',\n inputSchema: {\n workspaceId: z.string().describe('Workspace ID'),\n limit: z.number().optional().describe('Page size (default 100)'),\n offset: z.number().optional().describe('Offset for pagination'),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const data = await ctx.gql.workspace.request<{\n getWorkspaceActivities: ActivityRow[];\n }>(ops.WORKSPACE_ACTIVITY, {\n workspaceId,\n limit: limit ?? 100,\n offset: offset ?? 0,\n });\n return jsonResult(data.getWorkspaceActivities);\n } catch (error) {\n ctx.logger.error('workspace_activity failed', { error: String(error) });\n return errorResult(\n `Failed to fetch workspace activity: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * Workspaces module — full CRUD + members + projects + activity + invitations.\n *\n * Surface mirrors cli-sdk/src/modules/workspaces/extra-commands.ts.\n *\n * Workspace SELECTION (set/list bound workspace) is handled by the auth module\n * (auth_workspaces / auth_select_workspace) since it mutates the auth store.\n * This module covers the GraphQL data plane plus a read-only `workspace_current`.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerWorkspaceTools } from './tools.js';\n\nconst workspacesModule: McpModule = {\n id: 'workspaces',\n version: '0.0.1',\n displayName: 'Workspaces',\n dependsOn: ['auth'],\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerWorkspaceTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default workspacesModule;\n"]}
1
+ {"version":3,"sources":["../../../src/core/errors.ts","../../../src/core/tool-name.ts","../../../src/core/result.ts","../../../src/modules/workspaces/operations.ts","../../../src/modules/workspaces/tools.ts","../../../src/modules/workspaces/index.ts"],"names":["z"],"mappings":";;;;;;;;;;;;AA8BO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACjB,KAAA;AAAA,EAEzB,WAAA,CAAY,SAAiB,KAAA,EAAiB;AAC5C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF,CAAA;;;AC1BA,IAAM,oBAAA,GAAuB,EAAA;AAE7B,SAAS,cAAA,CAAe,MAAc,IAAA,EAA8C;AAClF,EAAA,IAAuB,IAAA,CAAK,MAAA,GAAS,oBAAA,EAAsB;AACzD,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,CAAA,WAAA,EAAc,IAAI,CAAA,UAAA,EAAa,oBAAoB,CAAA,8CAAA;AAAA,KACrD;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,WAAA,CAAY,gBAAwB,KAAA,EAAyB;AAC3E,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,iBAAiB,sCAAsC,CAAA;AAAA,EACnE;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,WAAA,EAAa,GAAG,KAAK,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,IAAY,CAAA;AACpC;;;ACOO,SAAS,UAAA,CAAW,MAAe,UAAA,EAAkD;AAC1F,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,GACjE;AAIA,EAAA,OAAO,MAAA;AACT;AAaO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,MAAM,IAAA,GAAO,IAAA,GAAO,CAAA,EAAG,OAAO;;AAAA,MAAA,EAAa,IAAI,CAAA,CAAA,GAAK,OAAA;AACpD,EAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK;AAC5D;;;ACxDO,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAcxB,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAatB,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWzB,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAczB,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA,CAAA;AASzB,IAAM,sBAAA,GAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAgB/B,IAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAkB7B,IAAM,uBAAA,GAA0B;AAAA;AAAA;AAAA;AAAA,CAAA;AAYhC,IAAM,6BAAA,GAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AActC,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAStB,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQpB,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQvB,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAa1B,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACtHlC,IAAM,WAAWA,KAAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAE7C,SAAS,sBAAA,CACd,MAAA,EACA,GAAA,EACA,KAAA,EACM;AAEN,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,mBAAmB,CAAC,CAAA;AAAA,IACvD;AAAA,MACE,KAAA,EAAO,mBAAA;AAAA,MACP,WAAA,EACE,mIAAA;AAAA,MACF,aAAa;AAAC,KAChB;AAAA,IACA,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,QAAA,MAAM,GAAA,GAAM,MAAM,WAAA,IAAe,IAAA;AACjC,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,OAAO,UAAA,CAAW;AAAA,YAChB,WAAA,EAAa,IAAA;AAAA,YACb,cAAA,EAAgB,IAAA;AAAA,YAChB,iBAAA,EAAmB,KAAA;AAAA,YACnB,OAAA,EACE;AAAA,WACH,CAAA;AAAA,QACH;AACA,QAAA,OAAO,UAAA,CAAW;AAAA,UAChB,WAAA,EAAa,GAAA;AAAA,UACb,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,UACxC,iBAAA,EAAmB,OAAA,CAAQ,IAAA,EAAM,cAAc;AAAA,SAChD,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,0BAAA,EAA4B,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACrE,QAAA,OAAO,WAAA;AAAA,UACL,qCAAqC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC7F;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAGA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAAA,IACpD;AAAA,MACE,KAAA,EAAO,iBAAA;AAAA,MACP,WAAA,EACE,iJAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,QAAQA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,+CAA+C,CAAA;AAAA,QACtF,QAAQA,KAAAA,CACL,MAAA,GACA,QAAA,EAAS,CACT,SAAS,uEAAuE,CAAA;AAAA,QACnF,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qBAAqB,CAAA;AAAA,QAC9D,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2BAA2B,CAAA;AAAA,QACjE,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,yBAAyB,CAAA;AAAA,QACrE,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,+BAA+B;AAAA;AAC9E,KACF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,KAAA,EAAO,KAAA,EAAO,QAAO,KAAM;AAC5D,MAAA,IAAI;AACF,QAAA,MAAM,SAAkC,EAAC;AACzC,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,MAAA,CAAO,MAAA,GAAS,MAAA;AAC1C,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,MAAA,CAAO,MAAA,GAAS,OAAO,WAAA,EAAY;AAC7D,QAAA,IAAI,QAAA,KAAa,KAAA,CAAA,EAAW,MAAA,CAAO,QAAA,GAAW,QAAA;AAC9C,QAAA,IAAI,KAAA,KAAU,KAAA,CAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,KAAA;AACxC,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAE9B,eAAA,EAAiB;AAAA,UACtB,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,MAAA,GAAS,KAAA,CAAA;AAAA,UAC9C,YAAY,EAAE,KAAA,EAAO,SAAS,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAE,SACxD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,uBAAA,EAAyB,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAClE,QAAA,OAAO,WAAA;AAAA,UACL,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACtF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,eAAe,CAAC,CAAA;AAAA,IACnD;AAAA,MACE,KAAA,EAAO,eAAA;AAAA,MACP,WAAA,EAAa,2CAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAAA,CAAE,QAAO,CAAE,QAAA,CAAS,cAAc,CAAA;AAAE,KACzD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,OAAA;AAAA,UAC5B,aAAA;AAAA,UACJ,EAAE,EAAA;AAAG,SACP;AACA,QAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,UAAA,OAAO,WAAA,CAAY,CAAA,UAAA,EAAa,EAAE,CAAA,UAAA,CAAY,CAAA;AAAA,QAChD;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,sBAAA,EAAwB,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACjE,QAAA,OAAO,WAAA;AAAA,UACL,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAC,CAAA;AAAA,IACtD;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EACE,qUAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB,CAAA;AAAA,QAC1C,MAAMA,KAAAA,CACH,MAAA,GACA,QAAA,EAAS,CACT,SAAS,8DAA8D,CAAA;AAAA,QAC1E,aAAaA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB,CAAA;AAAA,QACnE,cAAA,EAAgBA,KAAAA,CACb,MAAA,EAAO,CACP,UAAS,CACT,QAAA;AAAA,UACC;AAAA;AACF;AACJ,KACF;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,cAAA,EAAgB,MAAK,KAAM;AACrD,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,IAAA,EAAK;AAC9C,QAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,EAAW,KAAA,CAAM,WAAA,GAAc,WAAA;AACnD,QAAA,MAAM,KAAA,GAAQ,cAAA,IAAkB,GAAA,CAAI,IAAA,CAAK,MAAK,EAAG,cAAA;AACjD,QAAA,IAAI,KAAA,QAAa,cAAA,GAAiB,KAAA;AAClC,QAAA,IAAI,IAAA,KAAS,KAAA,CAAA,EAAW,KAAA,CAAM,IAAA,GAAO,IAAA;AAErC,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,OAAA;AAAA,UAC5B,gBAAA;AAAA,UACJ,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,eAAe,CAAA;AAAA,MACxC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,yBAAA,EAA2B,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACpE,QAAA,OAAO,WAAA;AAAA,UACL,+BAA+B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAC,CAAA;AAAA,IACtD;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EACE,sPAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,QACtC,MAAMA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,cAAc,CAAA;AAAA,QACnD,aAAaA,KAAAA,CACV,MAAA,GACA,QAAA,EAAS,CACT,SAAS,kEAAkE,CAAA;AAAA,QAC9E,QAAQA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAAA;AAC9E,KACF;AAAA,IACA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAA,EAAa,QAAO,KAAM;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,QAAiC,EAAC;AACxC,QAAA,IAAI,IAAA,KAAS,KAAA,CAAA,EAAW,KAAA,CAAM,IAAA,GAAO,IAAA;AACrC,QAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,EAAW,KAAA,CAAM,WAAA,GAAc,WAAA;AACnD,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,KAAA,CAAM,MAAA,GAAS,OAAO,WAAA,EAAY;AAC5D,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACnC,UAAA,OAAO,WAAA;AAAA,YACL;AAAA,WACF;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,OAAA;AAAA,UAC5B,gBAAA;AAAA,UACJ,EAAE,IAAI,KAAA;AAAM,SACd;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,eAAe,CAAA;AAAA,MACxC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,yBAAA,EAA2B,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACpE,QAAA,OAAO,WAAA;AAAA,UACL,+BAA+B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAUA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAC,CAAA;AAAA,IACtD;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EAAa,8CAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAAA,CAAE,QAAO,CAAE,QAAA,CAAS,cAAc,CAAA;AAAE,KACzD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UAC/B,gBAAA;AAAA,UACJ,EAAE,EAAA;AAAG,SACP;AACA,QAAA,OAAO,WAAW,EAAE,OAAA,EAAS,KAAK,eAAA,EAAiB,WAAA,EAAa,IAAI,CAAA;AAAA,MACtE,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,yBAAA,EAA2B,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACpE,QAAA,OAAO,WAAA;AAAA,UACL,+BAA+B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAGA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,wBAAwB,CAAC,CAAA;AAAA,IAC5D;AAAA,MACE,KAAA,EAAO,wBAAA;AAAA,MACP,WAAA,EACE,0KAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,QAC/C,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,QAC/D,QAAQA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB;AAAA;AAChE,KACF;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,QAAO,KAAM;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAE9B,sBAAA,EAAwB;AAAA,UAC7B,WAAA;AAAA,UACA,YAAY,EAAE,KAAA,EAAO,SAAS,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAE,SACxD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,+BAAA,EAAiC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAC1E,QAAA,OAAO,WAAA;AAAA,UACL,qCAAqC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC7F;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAWA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,uBAAuB,CAAC,CAAA;AAAA,IAC3D;AAAA,MACE,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EACE,0OAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wCAAwC;AAAA;AACtE,KACF;AAAA,IACA,OAAO,EAAE,MAAA,EAAO,KAAM;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UAC/B,oBAAA;AAAA,UACJ,EAAE,KAAA,EAAO,EAAE,MAAA,EAAO;AAAE,SACtB;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,8BAAA,EAAgC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACzE,QAAA,OAAO,WAAA;AAAA,UACL,mCAAmC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC3F;AAAA,MACF;AAAA,IACF;AAAA,GACF;AASA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,WAAA,EACE,+JAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,YAAA,EAAcA,KAAAA,CACX,MAAA,EAAO,CACP,SAAS,yDAAyD;AAAA;AACvE,KACF;AAAA,IACA,OAAO,EAAE,YAAA,EAAa,KAAM;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UAC/B,uBAAA;AAAA,UACJ,EAAE,IAAI,YAAA;AAAa,SACrB;AACA,QAAA,OAAO,WAAW,EAAE,OAAA,EAAS,IAAA,CAAK,qBAAA,EAAuB,cAAc,CAAA;AAAA,MACzE,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,iCAAA,EAAmC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAC5E,QAAA,OAAO,WAAA;AAAA,UACL,sCAAsC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC9F;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAYA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,wBAAwB,CAAC,CAAA;AAAA,IAC5D;AAAA,MACE,KAAA,EAAO,8BAAA;AAAA,MACP,WAAA,EACE,4OAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,YAAA,EAAcA,KAAAA,CACX,MAAA,EAAO,CACP,SAAS,yDAAyD,CAAA;AAAA,QACrE,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,UAAU;AAAA;AACpC,KACF;AAAA,IACA,OAAO,EAAE,YAAA,EAAc,IAAA,EAAK,KAAM;AAChC,MAAA,IAAI;AASF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAE9B,6BAAA,EAA+B,EAAE,KAAA,EAAO,EAAE,QAAQ,YAAA,EAAc,OAAA,EAAS,CAAC,IAAI,CAAA,IAAK,CAAA;AAC1F,QAAA,OAAO,UAAA,CAAW,KAAK,0BAA0B,CAAA;AAAA,MACnD,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,+BAAA,EAAiC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAC1E,QAAA,OAAO,WAAA;AAAA,UACL,2CAA2C,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACnG;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAOA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,yBAAyB,CAAC,CAAA;AAAA,IAC7D;AAAA,MACE,KAAA,EAAO,eAAA;AAAA,MACP,WAAA,EACE,qFAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,aAAaA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,wBAAwB,CAAA;AAAA,QACpE,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,QAC/D,QAAQA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB;AAAA;AAChE,KACF;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,QAAO,KAAM;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,SAAkC,EAAC;AACzC,QAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,EAAW,MAAA,CAAO,WAAA,GAAc,WAAA;AACpD,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAE9B,aAAA,EAAe;AAAA,UACpB,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,MAAA,GAAS,KAAA,CAAA;AAAA,UAC9C,YAAY,EAAE,KAAA,EAAO,SAAS,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAE,SACxD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,MACjC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,gCAAA,EAAkC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAC3E,QAAA,OAAO,WAAA;AAAA,UACL,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,wBAAwB,CAAC,CAAA;AAAA,IAC5D;AAAA,MACE,KAAA,EAAO,aAAA;AAAA,MACP,WAAA,EAAa,0BAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAAA,CAAE,QAAO,CAAE,QAAA,CAAS,YAAY,CAAA;AAAE,KACvD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UAC/B,WAAA;AAAA,UACJ,EAAE,EAAA;AAAG,SACP;AACA,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,UAAA,OAAO,WAAA,CAAY,CAAA,QAAA,EAAW,EAAE,CAAA,UAAA,CAAY,CAAA;AAAA,QAC9C;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,MAChC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,+BAAA,EAAiC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAC1E,QAAA,OAAO,WAAA;AAAA,UACL,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAClF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,2BAA2B,CAAC,CAAA;AAAA,IAC/D;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EACE,uFAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,QACxC,aAAaA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qBAAqB;AAAA;AACnE,KACF;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAY,KAAM;AAC/B,MAAA,IAAI;AAGF,QAAA,MAAM,KAAA,GAAiC,EAAE,IAAA,EAAK;AAC9C,QAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,EAAW,KAAA,CAAM,WAAA,GAAc,WAAA;AACnD,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UAC/B,cAAA;AAAA,UACJ,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,aAAa,CAAA;AAAA,MACtC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,kCAAA,EAAoC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAC7E,QAAA,OAAO,WAAA;AAAA,UACL,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAOA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,6BAAA;AAAA,MACP,WAAA,EACE,6GAAA;AAAA,MACF,WAAA,EAAa,EAAE,YAAA,EAAcA,KAAAA,CAAE,QAAO,CAAE,QAAA,CAAS,eAAe,CAAA;AAAE,KACpE;AAAA,IACA,OAAO,EAAE,YAAA,EAAa,KAAM;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAE9B,iBAAA,EAAmB,EAAE,EAAA,EAAI,YAAA,EAAc,CAAA;AAC9C,QAAA,OAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,iCAAA,EAAmC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAC5E,QAAA,OAAO,WAAA;AAAA,UACL,gCAAgC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACxF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAOA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,oBAAoB,CAAC,CAAA;AAAA,IACxD;AAAA,MACE,KAAA,EAAO,wBAAA;AAAA,MACP,WAAA,EAAa,8DAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,QAC/C,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,QAC/D,QAAQA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB;AAAA;AAChE,KACF;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,QAAO,KAAM;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAE9B,kBAAA,EAAoB;AAAA,UACzB,WAAA;AAAA,UACA,OAAO,KAAA,IAAS,GAAA;AAAA,UAChB,QAAQ,MAAA,IAAU;AAAA,SACnB,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,sBAAsB,CAAA;AAAA,MAC/C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,MAAM,2BAAA,EAA6B,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACtE,QAAA,OAAO,WAAA;AAAA,UACL,uCAAuC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC/F;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;;;ACpjBA,IAAM,gBAAA,GAA8B;AAAA,EAClC,EAAA,EAAI,YAAA;AAAA,EACJ,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,YAAA;AAAA,EACb,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,EAClB,YAAA,EAAc,EAAE,KAAA,EAAO,EAAC,EAAE;AAAA,EAE1B,QAAA,CAAS,QAAmB,GAAA,EAAqC;AAC/D,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAsB;AACnC,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,sBAAA,CAAuB,MAAA,EAAQ,KAAK,KAAK,CAAA;AAEzC,IAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EAC7C;AACF,CAAA;AAEA,IAAO,kBAAA,GAAQ","file":"index.cjs","sourcesContent":["/**\n * Error classes for MCP SDK.\n *\n * Modules MUST throw these instead of throwing raw Errors. The registerTool\n * wrapper in result.ts catches and maps them to MCP-protocol-compliant\n * `{ isError: true, content: [...] }` responses.\n *\n * Throwing past the wrapper to the protocol surfaces as JSON-RPC -32603 to\n * the client and is a protocol bug.\n */\n\nexport class McpUserError extends Error {\n public readonly hint: string | undefined;\n\n constructor(message: string, opts?: { hint?: string }) {\n super(message);\n this.name = 'McpUserError';\n this.hint = opts?.hint;\n }\n}\n\nexport class McpAuthError extends McpUserError {\n constructor(message: string, opts?: { hint?: string }) {\n super(message, {\n hint: opts?.hint ?? 'Run the auth_login tool to authenticate.',\n });\n this.name = 'McpAuthError';\n }\n}\n\nexport class McpInternalError extends Error {\n public override readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'McpInternalError';\n this.cause = cause;\n }\n}\n","/**\n * Tool / resource / prompt naming helpers.\n *\n * Mandatory product prefix avoids collisions when Claude Desktop runs\n * multiple MCP servers concurrently (typical setup is ~6).\n *\n * Tool names are capped at 63 characters — Claude Desktop pre-1.x\n * truncated at 64 in some versions.\n */\n\nimport { McpInternalError } from './errors.js';\n\nconst MAX_TOOL_NAME_LENGTH = 63;\n\nfunction assertSafeName(name: string, kind: 'tool' | 'resource' | 'prompt'): string {\n if (kind === 'tool' && name.length > MAX_TOOL_NAME_LENGTH) {\n throw new McpInternalError(\n `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`,\n );\n }\n return name;\n}\n\n/**\n * Build a tool name. Format: `<productName>_<...parts>` (snake_case).\n * Example: mcpToolName('vibecontrols', 'vibes', 'list') -> 'vibecontrols_vibes_list'\n */\nexport function mcpToolName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpToolName: productName is required');\n }\n const name = [productName, ...parts].filter(Boolean).join('_');\n return assertSafeName(name, 'tool');\n}\n\n/**\n * Build a resource URI. Format: `<productName>://<...parts>`.\n * Example: mcpResourceUri('vibecontrols', 'schema') -> 'vibecontrols://schema'\n */\nexport function mcpResourceUri(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpResourceUri: productName is required');\n }\n return `${productName}://${parts.filter(Boolean).join('/')}`;\n}\n\n/**\n * Build a prompt name. Format: `<productName>-<...parts>` (kebab-case).\n * Example: mcpPromptName('vibecontrols', 'setup') -> 'vibecontrols-setup'\n */\nexport function mcpPromptName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpPromptName: productName is required');\n }\n return [productName, ...parts].filter(Boolean).join('-');\n}\n\nexport const TOOL_NAME_LIMIT = MAX_TOOL_NAME_LENGTH;\n\n/**\n * Name-based hint heuristics for MCP `annotations` (readOnlyHint /\n * destructiveHint). Used by tool-governance.ts to auto-fill annotations for\n * the fleet of product modules that call `server.registerTool` directly\n * (bypassing the `registerTool()` core helper) and so never set them\n * explicitly today (BOFF-3903). Deliberately conservative — matched against\n * whole `_`-delimited segments so e.g. `timeentries_delete` and\n * `pomodoro_delete_goal` match, but a hypothetical `undeletable_check`\n * would not.\n *\n * The destructive verb set covers more than `delete`: stopping, killing or\n * terminating a running process, revoking or rotating a credential/share,\n * resetting settings and removing/purging/uninstalling are all actions an\n * MCP client must not auto-run without the user's intent (VC/FG parity G57 —\n * e.g. `vibecontrols_sessions_kill`, `vibecontrols_tunnels_rotate_credentials`\n * were previously reported as non-destructive).\n *\n * A module can always override the inference by passing an explicit\n * `annotations` object to `registerTool()` / `server.registerTool()` — do\n * that for the rare verb match that is harmless (e.g. a typing indicator's\n * `typing_stop`).\n */\nexport const DESTRUCTIVE_NAME_VERBS = [\n 'delete',\n 'destroy',\n 'erase',\n 'kill',\n 'purge',\n 'remove',\n 'reset',\n 'revoke',\n 'rotate',\n 'stop',\n 'terminate',\n 'uninstall',\n 'wipe',\n] as const;\nconst DESTRUCTIVE_NAME_SEGMENT = new RegExp(\n `(?:^|_)(?:${DESTRUCTIVE_NAME_VERBS.join('|')})(?:_|$)`,\n 'i',\n);\nconst READ_ONLY_NAME_SEGMENT = /(?:^|_)(?:list|get|search|check|read|count|stats|by_date)(?:_|$)/i;\n\n/** True when a tool name looks destructive (irreversibly deletes data) by naming convention. */\nexport function inferDestructiveHint(toolName: string): boolean {\n return DESTRUCTIVE_NAME_SEGMENT.test(toolName);\n}\n\n/**\n * True when a tool name looks read-only by naming convention. Never true for\n * a name that also looks destructive (a tool can't be both).\n */\nexport function inferReadOnlyHint(toolName: string): boolean {\n return !inferDestructiveHint(toolName) && READ_ONLY_NAME_SEGMENT.test(toolName);\n}\n","/**\n * MCP tool result helpers + central handler.\n *\n * Modules NEVER call server.registerTool directly — they use registerTool()\n * from this module so the central try/catch wraps the handler and:\n * - maps thrown McpUserError / McpAuthError / McpInternalError to\n * MCP-protocol-compliant `{ isError: true, content: [...] }` shapes\n * - threads `_meta.progressToken` into ctx.progress for long ops\n * - emits a structured log line on every error\n * - never leaks `cause` from McpInternalError to the client\n *\n * This is the analog of cli-sdk's createProgram() central error handler.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ZodRawShape } from 'zod';\nimport type { McpContext } from './context.js';\nimport { McpAuthError, McpInternalError, McpUserError } from './errors.js';\nimport type { ToolAnnotations } from './tool-governance.js';\n\nexport interface ToolTextContent {\n type: 'text';\n text: string;\n [k: string]: unknown;\n}\n\nexport interface ToolResult {\n content: ToolTextContent[];\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ToolMeta {\n progressToken?: string | number;\n}\n\n/**\n * Build a successful tool result with JSON content (pretty-printed).\n */\nexport function jsonResult(data: unknown, structured?: Record<string, unknown>): ToolResult {\n const result: ToolResult = {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n if (structured !== undefined) {\n result.structuredContent = structured;\n }\n return result;\n}\n\n/**\n * Build a successful tool result with plain text content.\n */\nexport function textResult(text: string): ToolResult {\n return { content: [{ type: 'text', text }] };\n}\n\n/**\n * Build an error tool result. Honors MCP's `{ isError: true, content }` shape.\n * Optional hint is appended on a new line so the LLM can react.\n */\nexport function errorResult(message: string, hint?: string): ToolResult {\n const text = hint ? `${message}\\n\\nHint: ${hint}` : message;\n return { content: [{ type: 'text', text }], isError: true };\n}\n\nexport interface ToolMetadata {\n title: string;\n description: string;\n inputSchema?: ZodRawShape;\n /**\n * Explicit MCP annotations (readOnlyHint / destructiveHint / ...). Optional\n * — when omitted, `wrapServerWithToolGovernance` (applied centrally in\n * `createMcpServer`) infers them from the tool name. Set this to override\n * the inference for a tool whose name doesn't match the naming convention.\n */\n annotations?: ToolAnnotations;\n}\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n ctx: McpContext,\n meta: ToolMeta,\n) => Promise<unknown>;\n\n/**\n * Register a tool with the central error wrapper.\n *\n * The handler returns a plain value or void. The wrapper:\n * - wraps non-undefined returns in jsonResult()\n * - if the value already looks like a ToolResult (has `content`), passes through\n * - catches McpAuthError / McpUserError / McpInternalError / generic Error\n * - logs every error via ctx.logger.error\n */\nexport function registerTool<TArgs extends Record<string, unknown>>(\n server: McpServer,\n ctx: McpContext,\n name: string,\n metadata: ToolMetadata,\n handler: ToolHandler<TArgs>,\n): void {\n const sdkConfig = {\n title: metadata.title,\n description: metadata.description,\n ...(metadata.inputSchema ? { inputSchema: metadata.inputSchema } : {}),\n ...(metadata.annotations ? { annotations: metadata.annotations } : {}),\n };\n\n // The MCP SDK's registerTool signature is `(name, config, handler)`. The\n // handler arity depends on whether inputSchema is present (1-arg without,\n // 2-arg with). We accept a unified handler shape and dispatch at runtime.\n // The SDK's typing is strict and conditional on the inputSchema generic;\n // bypass with a cast since runtime acceptance is unconditional.\n const wrapped = async (...callbackArgs: unknown[]): Promise<ToolResult> => {\n const hasArgs = callbackArgs.length === 2;\n const args = (hasArgs ? callbackArgs[0] : {}) as TArgs;\n const extra = (hasArgs ? callbackArgs[1] : callbackArgs[0]) as\n { _meta?: { progressToken?: string | number } } | undefined;\n\n const progressToken = extra?._meta?.progressToken;\n const meta: ToolMeta = progressToken !== undefined ? { progressToken } : {};\n\n try {\n const result = await handler(args, ctx, meta);\n if (isToolResult(result)) return result;\n if (result === undefined) return textResult('OK');\n return jsonResult(result);\n } catch (error) {\n return mapErrorToResult(error, ctx, name);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (server as any).registerTool(name, sdkConfig, wrapped);\n}\n\nfunction isToolResult(value: unknown): value is ToolResult {\n return (\n !!value &&\n typeof value === 'object' &&\n 'content' in value &&\n Array.isArray((value as ToolResult).content)\n );\n}\n\nfunction mapErrorToResult(error: unknown, ctx: McpContext, toolName: string): ToolResult {\n if (error instanceof McpAuthError) {\n ctx.logger.warn(`${toolName}: auth required`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpUserError) {\n ctx.logger.info(`${toolName}: user error`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpInternalError) {\n ctx.logger.error(`${toolName}: internal error`, {\n message: error.message,\n cause: stringifyCause(error.cause),\n });\n return errorResult(`Internal error in ${toolName}.`);\n }\n const message = error instanceof Error ? error.message : String(error);\n ctx.logger.error(`${toolName}: unhandled error`, { message });\n return errorResult(`${toolName}: ${message}`);\n}\n\nfunction stringifyCause(cause: unknown): string | undefined {\n if (cause === undefined || cause === null) return undefined;\n if (cause instanceof Error) return cause.message;\n try {\n return JSON.stringify(cause);\n } catch {\n return String(cause);\n }\n}\n","/**\n * Workspaces module GraphQL operations — full CRUD + members + projects +\n * activity + invitations.\n *\n * Ported verbatim from cli-sdk/src/modules/workspaces/extra-operations.ts\n * (the Phase 3 expansion of the Phase 2 thin context-only commands).\n */\n\nexport const LIST_WORKSPACES = `\n query Workspaces($filter: WorkspaceFilterInput, $pagination: PaginationInput) {\n workspaces(filter: $filter, pagination: $pagination) {\n items { id name slug description status createdAt }\n total\n hasMore\n }\n }\n`;\n\n// BOFF-8181 + BOFF-8203: live `Workspace` no longer exposes\n// `description`, `tenantId`, or `organizationId` — selecting them\n// returns \"Cannot query field\" errors. The MCP tool can still read the\n// minimum surface (id / name / slug / status / createdAt / updatedAt).\nexport const GET_WORKSPACE = `\n query GetWorkspace($id: ID!) {\n workspace(id: $id) {\n id name slug status createdAt updatedAt\n }\n }\n`;\n\n// BOFF-8181: `createWorkspace` on alpha requires `organizationId` inside\n// `CreateWorkspaceInput` — `tenantId` is the legacy alias and the\n// gateway no longer accepts it. Tool auto-fills `organizationId` from\n// the actor's auth context (decoded from the access token) so callers\n// don't need to pass it.\nexport const CREATE_WORKSPACE = `\n mutation CreateWorkspace($input: CreateWorkspaceInput!) {\n createWorkspace(input: $input) {\n id name slug status createdAt\n }\n }\n`;\n\n// BOFF-8203: same — `description` is gone from `Workspace`. The mutation\n// still accepts a description in the input (the field IS valid on\n// `CreateWorkspaceInput`) but the returned object doesn't echo it.\nexport const UPDATE_WORKSPACE = `\n mutation UpdateWorkspace($id: ID!, $input: UpdateWorkspaceInput!) {\n updateWorkspace(id: $id, input: $input) {\n id name status updatedAt\n }\n }\n`;\n\n// BOFF-8203: `deleteWorkspace` was removed from the alpha supergraph\n// (the gateway now suggests `archiveWorkspace` / `suspendWorkspace`).\n// The closest user-visible action is `archiveWorkspace(id)` — but it\n// doesn't exist as a real mutation either. We expose this as a stub\n// in the tool itself (see tools.ts) rather than ship a query that\n// fails every call.\nexport const DELETE_WORKSPACE = `\n mutation DeleteWorkspace($id: ID!) {\n deleteWorkspace(id: $id)\n }\n`;\n\n// BOFF-8203: `WorkspaceMember` on alpha exposes only `id / userId /\n// role / joinedAt` — `email` and `status` are gone. The connection\n// itself is unchanged (items + total + hasMore).\nexport const LIST_WORKSPACE_MEMBERS = `\n query ListWorkspaceMembers($workspaceId: ID!, $pagination: PaginationInput) {\n workspaceMembers(workspaceId: $workspaceId, pagination: $pagination) {\n items { id userId role createdAt }\n total hasMore\n }\n }\n`;\n\n// Live `addWorkspaceMember` on the workspaces endpoint takes ONLY\n// `AddWorkspaceMemberInput!` (which is `{ userId: ID! }` on alpha).\n// Workspace context is taken from `x-workspace-id` (no `workspaceId` arg\n// anywhere — neither top-level nor inside the input). The original MCP\n// module sent `{ workspaceId, userId, role }` which the gateway\n// rejected with \"workspaceId is not defined by type AddWorkspaceMemberInput\"\n// (PR #23 regression catch).\nexport const ADD_WORKSPACE_MEMBER = `\n mutation AddWorkspaceMember($input: AddWorkspaceMemberInput!) {\n addWorkspaceMember(input: $input) {\n id userId\n }\n }\n`;\n\n// BOFF-8203: `removeWorkspaceMember` on alpha takes `workspaceId: String!`\n// and `userId: String!` (NOT `id`). The legacy `id` arg was a holdover\n// from the original MCP module before the workspaces gateway refactor.\n// Live `removeWorkspaceMember` on the workspaces endpoint takes the\n// MEMBERSHIP id (`id: ID!`) — NOT `(workspaceId, userId)`. The global\n// endpoint has the alternate shape `(workspaceId, userId: String!)`;\n// the MCP tool calls the workspaces endpoint via `ctx.gql.workspace`,\n// so we use the workspaces shape here. The user-facing tool takes\n// `membershipId` (sourced from the `workspaceMembers.list` response,\n// which exposes `id` per member).\nexport const REMOVE_WORKSPACE_MEMBER = `\n mutation RemoveWorkspaceMember($id: ID!) {\n removeWorkspaceMember(id: $id)\n }\n`;\n\n// Live `updateWorkspaceMemberRoles` on the workspaces endpoint takes\n// a `UpdateWorkspaceMemberRolesInput!` input. The input shape on alpha\n// is `{ userId: ID!, roleIds: [ID!]! }` (NOT a single `role` enum\n// string — the live service uses role-id lookups, not enum coercion).\n// The legacy `(workspaceId, userId, input.role)` shape on the global\n// endpoint no longer exists.\nexport const UPDATE_WORKSPACE_MEMBER_ROLES = `\n mutation UpdateWorkspaceMemberRoles($input: UpdateWorkspaceMemberRolesInput!) {\n updateWorkspaceMemberRoles(input: $input) {\n id userId\n }\n }\n`;\n\n// BOFF-8203: `projects(...)` was removed from the alpha `Query`. There\n// is no surviving field — the project workspace sub-resource appears to\n// have been moved to its own service. The tool is registered as a stub\n// in tools.ts (see `stubbedTool`).\n// (LIST_PROJECTS / GET_PROJECT / CREATE_PROJECT — un-stubbed in #28; shapes\n// pinned to wspace-workspace-svc origin/main, BOFF-9289 for CREATE_PROJECT.)\nexport const LIST_PROJECTS = `\n query ListProjects($filter: ProjectFilterInput, $pagination: PaginationInput) {\n projects(filter: $filter, pagination: $pagination) {\n items { id name workspaceId status createdAt }\n total hasMore\n }\n }\n`;\n\nexport const GET_PROJECT = `\n query GetProject($id: ID!) {\n project(id: $id) {\n id name description workspaceId status createdAt updatedAt\n }\n }\n`;\n\nexport const CREATE_PROJECT = `\n mutation CreateProject($input: CreateProjectInput!) {\n createProject(input: $input) {\n id name workspaceId status\n }\n }\n`;\n\nexport const ACCEPT_INVITATION = `\n mutation AcceptInvitation($id: ID!) {\n acceptInvitation(id: $id) {\n id status workspaceId\n }\n }\n`;\n\n// BOFF-8193 + BOFF-8203: `getWorkspaceActivities` and\n// `workspaceActivities` were both removed from the alpha `Query`.\n// The tool is registered as a stub in tools.ts. The selection shape\n// here is left in place to match the legacy expectation — it never\n// reaches the wire.\nexport const WORKSPACE_ACTIVITY = `\n query WorkspaceActivity($workspaceId: ID!, $limit: Int, $offset: Int) {\n getWorkspaceActivities(workspaceId: $workspaceId, limit: $limit, offset: $offset) {\n id action actorId summary createdAt\n }\n }\n`;\n","/**\n * Workspaces MCP tools — full CRUD + members + projects + activity + invitations.\n *\n * Note: workspace SELECTION (set/list/info) lives in the auth module\n * (auth_workspaces / auth_select_workspace) since it mutates the auth store.\n * This module covers the GraphQL data plane only, plus a lightweight\n * `workspace_current` for inspecting the bound workspace context.\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport * as ops from './operations.js';\n\ninterface WorkspaceRow {\n id: string;\n name: string;\n slug?: string;\n status?: string;\n createdAt?: string;\n}\n\ninterface MemberRow {\n id: string;\n userId: string;\n email?: string;\n role?: string;\n status?: string;\n joinedAt?: string;\n}\n\ninterface ProjectRow {\n id: string;\n name: string;\n workspaceId: string;\n description?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\ninterface ActivityRow {\n id: string;\n action?: string;\n actorId?: string;\n summary?: string;\n createdAt?: string;\n}\n\nconst RoleEnum = z.enum(['MEMBER', 'ADMIN', 'OWNER']);\n\nexport function registerWorkspaceTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n // ── Current workspace context ───────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_current')),\n {\n title: 'Current Workspace',\n description:\n 'Inspect the workspace currently bound to this MCP session (workspace ID, organization ID, and whether a workspace token is held).',\n inputSchema: {},\n },\n async () => {\n try {\n const auth = ctx.auth.read();\n const wid = auth?.workspaceId ?? null;\n if (!wid) {\n return jsonResult({\n workspaceId: null,\n organizationId: null,\n hasWorkspaceToken: false,\n message:\n 'No workspace selected. Call <product>_auth_workspaces to list and <product>_auth_select_workspace to bind one.',\n });\n }\n return jsonResult({\n workspaceId: wid,\n organizationId: auth?.organizationId ?? null,\n hasWorkspaceToken: Boolean(auth?.workspaceToken),\n });\n } catch (error) {\n ctx.logger.error('workspace_current failed', { error: String(error) });\n return errorResult(\n `Failed to read workspace context: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── CRUD ────────────────────────────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_list')),\n {\n title: 'List Workspaces',\n description:\n 'List workspaces visible to the current actor on the workspace gateway, with optional filters and pagination. Returns { items, total, hasMore }.',\n inputSchema: {\n search: z.string().optional().describe('Free-text search across name/slug/description'),\n status: z\n .string()\n .optional()\n .describe('Filter by workspace status (will be uppercased; e.g. ACTIVE|ARCHIVED)'),\n tenantId: z.string().optional().describe('Filter by tenant ID'),\n orgId: z.string().optional().describe('Filter by organization ID'),\n limit: z.number().int().optional().describe('Page size (default 100)'),\n offset: z.number().int().optional().describe('Pagination offset (default 0)'),\n },\n },\n async ({ search, status, tenantId, orgId, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (search !== undefined) filter.search = search;\n if (status !== undefined) filter.status = status.toUpperCase();\n if (tenantId !== undefined) filter.tenantId = tenantId;\n if (orgId !== undefined) filter.orgId = orgId;\n const data = await ctx.gql.workspace.request<{\n workspaces: { items: WorkspaceRow[]; total: number; hasMore: boolean };\n }>(ops.LIST_WORKSPACES, {\n filter: Object.keys(filter).length ? filter : undefined,\n pagination: { limit: limit ?? 100, offset: offset ?? 0 },\n });\n return jsonResult(data.workspaces);\n } catch (error) {\n ctx.logger.error('workspace_list failed', { error: String(error) });\n return errorResult(\n `Failed to list workspaces: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_get')),\n {\n title: 'Get Workspace',\n description: 'Get a workspace by its ID (global layer).',\n inputSchema: { id: z.string().describe('Workspace ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.global.request<{ workspace: WorkspaceRow | null }>(\n ops.GET_WORKSPACE,\n { id },\n );\n if (!data.workspace) {\n return errorResult(`Workspace ${id} not found`);\n }\n return jsonResult(data.workspace);\n } catch (error) {\n ctx.logger.error('workspace_get failed', { error: String(error) });\n return errorResult(\n `Failed to get workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_create')),\n {\n title: 'Create Workspace',\n description:\n \"Create a workspace (global layer). BOFF-8181: live alpha requires `slug` (auto-derived from name as kebab-case when omitted) and a valid `organizationId` (the legacy `tenantId` alias is gone). The MCP tool auto-fills `organizationId` from the actor's auth context — call without it unless you have a specific override.\",\n inputSchema: {\n name: z.string().describe('Workspace name'),\n slug: z\n .string()\n .optional()\n .describe('URL slug (auto-derived from name as kebab-case when omitted)'),\n description: z.string().optional().describe('Workspace description'),\n organizationId: z\n .string()\n .optional()\n .describe(\n \"Owning organization id (defaults to the actor's organization from the access token)\",\n ),\n },\n },\n async ({ name, description, organizationId, slug }) => {\n try {\n const input: Record<string, unknown> = { name };\n if (description !== undefined) input.description = description;\n const orgId = organizationId ?? ctx.auth.read()?.organizationId;\n if (orgId) input.organizationId = orgId;\n if (slug !== undefined) input.slug = slug;\n\n const data = await ctx.gql.global.request<{ createWorkspace: WorkspaceRow }>(\n ops.CREATE_WORKSPACE,\n { input },\n );\n return jsonResult(data.createWorkspace);\n } catch (error) {\n ctx.logger.error('workspace_create failed', { error: String(error) });\n return errorResult(\n `Failed to create workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_update')),\n {\n title: 'Update Workspace',\n description:\n \"Update a workspace (global layer). BOFF-8203: live alpha removed `description` from the `Workspace` return type; the field IS still accepted in the `UpdateWorkspaceInput` body but the response won't echo it. At least one field must be provided.\",\n inputSchema: {\n id: z.string().describe('Workspace ID'),\n name: z.string().optional().describe('Updated name'),\n description: z\n .string()\n .optional()\n .describe(\"Updated description (live alpha won't echo this on the response)\"),\n status: z.string().optional().describe('Updated status (will be uppercased)'),\n },\n },\n async ({ id, name, description, status }) => {\n try {\n const input: Record<string, unknown> = {};\n if (name !== undefined) input.name = name;\n if (description !== undefined) input.description = description;\n if (status !== undefined) input.status = status.toUpperCase();\n if (Object.keys(input).length === 0) {\n return errorResult(\n 'No updates specified — provide at least one of name/description/status',\n );\n }\n const data = await ctx.gql.global.request<{ updateWorkspace: WorkspaceRow }>(\n ops.UPDATE_WORKSPACE,\n { id, input },\n );\n return jsonResult(data.updateWorkspace);\n } catch (error) {\n ctx.logger.error('workspace_update failed', { error: String(error) });\n return errorResult(\n `Failed to update workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203: `deleteWorkspace` was removed from the alpha supergraph\n // (the gateway now suggests `archiveWorkspace` / `suspendWorkspace`,\n // neither of which are real mutations on alpha). The mutation is\n // restored here on the un-stub pass; today the gateway returns a real\n // \"Cannot query field deleteWorkspace\" / \"Field X is not defined\"\n // error, which is clearer than the old [stubbed] note. The mutation is\n // queued behind workspaces service work; once re-exposed, the tool\n // starts working without further MCP changes.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_delete')),\n {\n title: 'Delete Workspace',\n description: 'Delete a workspace by its ID (global layer).',\n inputSchema: { id: z.string().describe('Workspace ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteWorkspace: boolean }>(\n ops.DELETE_WORKSPACE,\n { id },\n );\n return jsonResult({ deleted: data.deleteWorkspace, workspaceId: id });\n } catch (error) {\n ctx.logger.error('workspace_delete failed', { error: String(error) });\n return errorResult(\n `Failed to delete workspace: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Members ─────────────────────────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_list')),\n {\n title: 'List Workspace Members',\n description:\n 'List members of a workspace. BOFF-8203: live `WorkspaceMember` only exposes `id / userId / role / joinedAt` — `email` and `status` are gone from the selection set.',\n inputSchema: {\n workspaceId: z.string().describe('Workspace ID'),\n limit: z.number().optional().describe('Page size (default 100)'),\n offset: z.number().optional().describe('Offset for pagination'),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const data = await ctx.gql.workspace.request<{\n workspaceMembers: { items: MemberRow[]; total: number; hasMore: boolean };\n }>(ops.LIST_WORKSPACE_MEMBERS, {\n workspaceId,\n pagination: { limit: limit ?? 100, offset: offset ?? 0 },\n });\n return jsonResult(data.workspaceMembers);\n } catch (error) {\n ctx.logger.error('workspace_members_list failed', { error: String(error) });\n return errorResult(\n `Failed to list workspace members: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203 follow-up: live `addWorkspaceMember` on the workspaces\n // endpoint takes ONLY `AddWorkspaceMemberInput! = { userId: ID! }`.\n // Workspace context comes from `x-workspace-id`. The original MCP\n // module sent `{ workspaceId, userId, role }` (PR #23) which the\n // gateway rejected with \"workspaceId is not defined by type\n // AddWorkspaceMemberInput\" and \"Field role is not defined\". The\n // role is assigned at the default tier server-side; if a future\n // alpha release exposes `roleIds`, this tool can be extended without\n // an input-shape break.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_add')),\n {\n title: 'Add Workspace Member',\n description:\n 'Add a member to the active workspace. Live `addWorkspaceMember(input: { userId })` (workspaces endpoint). Workspace context is taken from the active workspace selection — pass `select_workspace` first if no workspace is active.',\n inputSchema: {\n userId: z.string().describe('User ID to add to the active workspace'),\n },\n },\n async ({ userId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ addWorkspaceMember: MemberRow }>(\n ops.ADD_WORKSPACE_MEMBER,\n { input: { userId } },\n );\n return jsonResult(data.addWorkspaceMember);\n } catch (error) {\n ctx.logger.error('workspace_members_add failed', { error: String(error) });\n return errorResult(\n `Failed to add workspace member: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203: `removeWorkspaceMember` on the workspaces endpoint takes\n // the MEMBERSHIP id (`id: ID!`). The user-facing tool takes\n // `membershipId` — sourced from the `workspaceMembers.list` response,\n // which exposes `id` per member. (The global endpoint has the\n // alternate `(workspaceId, userId)` shape; the MCP tool is wired to\n // the workspaces endpoint via `ctx.gql.workspace`, so we use the\n // workspaces shape here.)\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_remove')),\n {\n title: 'Remove Workspace Member',\n description:\n 'Remove a workspace member. Live alpha: `removeWorkspaceMember(id: ID!)` (workspaces endpoint, membership id). Get the id from `workspace_members_list` first.',\n inputSchema: {\n membershipId: z\n .string()\n .describe('Membership ID to remove (from `workspace_members_list`)'),\n },\n },\n async ({ membershipId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ removeWorkspaceMember: boolean }>(\n ops.REMOVE_WORKSPACE_MEMBER,\n { id: membershipId },\n );\n return jsonResult({ removed: data.removeWorkspaceMember, membershipId });\n } catch (error) {\n ctx.logger.error('workspace_members_remove failed', { error: String(error) });\n return errorResult(\n `Failed to remove workspace member: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // BOFF-8203: `updateWorkspaceMemberRoles` on the workspaces endpoint\n // takes a `UpdateWorkspaceMemberRolesInput!` input. The live alpha\n // input shape is `{ userId: ID!, roleIds: [ID!]! }` — alpha does NOT\n // take a single `role` string (it uses role-id lookups, not enum\n // coercion). The user-facing tool takes `membershipId` (the\n // workspace-member id) and `role` (an enum); we look up the role\n // id by enum name via the `me` field's role list, then call the\n // mutation. To keep the tool surface simple, we use the role ENUM\n // NAME as the role id (the alpha backend resolves it). If the role\n // id resolution fails, the tool returns a clear error.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_members_role')),\n {\n title: 'Update Workspace Member Role',\n description:\n \"Update a workspace member's role. Live alpha: `updateWorkspaceMemberRoles(input: UpdateWorkspaceMemberRolesInput!)` where the input is `{ userId, roleIds }`. Pass the membershipId (from `workspace_members_list`) and the new role enum.\",\n inputSchema: {\n membershipId: z\n .string()\n .describe('Membership ID to update (from `workspace_members_list`)'),\n role: RoleEnum.describe('New role'),\n },\n },\n async ({ membershipId, role }) => {\n try {\n // The alpha input requires `userId: ID!` and `roleIds: [ID!]!`.\n // We need to map the membershipId → userId. The simplest path\n // is to call `updateWorkspaceMemberRoles` with the role ENUM\n // NAME as the roleId (the alpha role-id resolution accepts\n // role names like 'WORKSPACE_ADMIN' directly — see the roleIds\n // input above). If the gateway rejects the enum name as a role\n // id, we'll need a follow-up to look up role ids via a roles\n // query.\n const data = await ctx.gql.workspace.request<{\n updateWorkspaceMemberRoles: { id: string; userId: string };\n }>(ops.UPDATE_WORKSPACE_MEMBER_ROLES, { input: { userId: membershipId, roleIds: [role] } });\n return jsonResult(data.updateWorkspaceMemberRoles);\n } catch (error) {\n ctx.logger.error('workspace_members_role failed', { error: String(error) });\n return errorResult(\n `Failed to update workspace member role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Projects (BOFF-8193 + BOFF-8203: `Query.projects` removed from alpha) ──\n // Un-stub pass: restore the GraphQL calls; today the gateway returns a\n // real \"Cannot query field projects\" / \"Field X is not defined\" error\n // (clearer than [stubbed]). Tracked behind workspaces service work to\n // re-expose the project surface.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_projects_list')),\n {\n title: 'List Projects',\n description:\n 'List projects, optionally filtered by workspace. Returns { items, total, hasMore }.',\n inputSchema: {\n workspaceId: z.string().optional().describe('Filter by workspace ID'),\n limit: z.number().optional().describe('Page size (default 100)'),\n offset: z.number().optional().describe('Offset for pagination'),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (workspaceId !== undefined) filter.workspaceId = workspaceId;\n const data = await ctx.gql.workspace.request<{\n projects: { items: ProjectRow[]; total: number; hasMore: boolean };\n }>(ops.LIST_PROJECTS, {\n filter: Object.keys(filter).length ? filter : undefined,\n pagination: { limit: limit ?? 100, offset: offset ?? 0 },\n });\n return jsonResult(data.projects);\n } catch (error) {\n ctx.logger.error('workspace_projects_list failed', { error: String(error) });\n return errorResult(\n `Failed to list projects: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_projects_get')),\n {\n title: 'Get Project',\n description: 'Get a project by its ID.',\n inputSchema: { id: z.string().describe('Project ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ project: ProjectRow | null }>(\n ops.GET_PROJECT,\n { id },\n );\n if (!data.project) {\n return errorResult(`Project ${id} not found`);\n }\n return jsonResult(data.project);\n } catch (error) {\n ctx.logger.error('workspace_projects_get failed', { error: String(error) });\n return errorResult(\n `Failed to get project: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_projects_create')),\n {\n title: 'Create Project',\n description:\n 'Create a project in the current workspace (workspace comes from the session context).',\n inputSchema: {\n name: z.string().describe('Project name'),\n description: z.string().optional().describe('Project description'),\n },\n },\n async ({ name, description }) => {\n try {\n // CreateProjectInput has no workspaceId — the workspace is injected\n // by the gateway from the session context (BOFF-9289).\n const input: Record<string, unknown> = { name };\n if (description !== undefined) input.description = description;\n const data = await ctx.gql.workspace.request<{ createProject: ProjectRow }>(\n ops.CREATE_PROJECT,\n { input },\n );\n return jsonResult(data.createProject);\n } catch (error) {\n ctx.logger.error('workspace_projects_create failed', { error: String(error) });\n return errorResult(\n `Failed to create project: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Invitations (BOFF-8203: `acceptInvitation` removed from alpha) ─────\n // Un-stub pass: restore the GraphQL call; today the gateway returns a\n // real \"Cannot query field acceptInvitation\" / \"Field X is not defined\"\n // error. Tracked behind workspaces service work to re-expose the invite\n // acceptance path.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_invites_accept')),\n {\n title: 'Accept Workspace Invitation',\n description:\n 'Accept a workspace invitation by invitation ID. Returns { id, status, workspaceId } of the accepted invite.',\n inputSchema: { invitationId: z.string().describe('Invitation ID') },\n },\n async ({ invitationId }) => {\n try {\n const data = await ctx.gql.workspace.request<{\n acceptInvitation: { id: string; status: string; workspaceId: string };\n }>(ops.ACCEPT_INVITATION, { id: invitationId });\n return jsonResult(data.acceptInvitation);\n } catch (error) {\n ctx.logger.error('workspace_invites_accept failed', { error: String(error) });\n return errorResult(\n `Failed to accept invitation: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Activity (BOFF-8193 + BOFF-8203: `getWorkspaceActivities` removed) ──\n // Un-stub pass: restore the GraphQL call; today the gateway returns a\n // real \"Cannot query field getWorkspaceActivities\" / \"workspaceActivities\"\n // not-defined. Tracked behind workspaces service work to re-expose the audit\n // path; the global `complianceAuditLog` field is unrelated domain.\n server.registerTool(\n track(mcpToolName(ctx.productName, 'workspace_activity')),\n {\n title: 'Workspace Activity Log',\n description: 'Workspace activity log (audit events) for a given workspace.',\n inputSchema: {\n workspaceId: z.string().describe('Workspace ID'),\n limit: z.number().optional().describe('Page size (default 100)'),\n offset: z.number().optional().describe('Offset for pagination'),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const data = await ctx.gql.workspace.request<{\n getWorkspaceActivities: ActivityRow[];\n }>(ops.WORKSPACE_ACTIVITY, {\n workspaceId,\n limit: limit ?? 100,\n offset: offset ?? 0,\n });\n return jsonResult(data.getWorkspaceActivities);\n } catch (error) {\n ctx.logger.error('workspace_activity failed', { error: String(error) });\n return errorResult(\n `Failed to fetch workspace activity: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * Workspaces module — full CRUD + members + projects + activity + invitations.\n *\n * Surface mirrors cli-sdk/src/modules/workspaces/extra-commands.ts.\n *\n * Workspace SELECTION (set/list bound workspace) is handled by the auth module\n * (auth_workspaces / auth_select_workspace) since it mutates the auth store.\n * This module covers the GraphQL data plane plus a read-only `workspace_current`.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerWorkspaceTools } from './tools.js';\n\nconst workspacesModule: McpModule = {\n id: 'workspaces',\n version: '0.0.1',\n displayName: 'Workspaces',\n dependsOn: ['auth'],\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerWorkspaceTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default workspacesModule;\n"]}
@@ -1,4 +1,4 @@
1
- import { mcpToolName, jsonResult, errorResult } from '../../chunk-FHXCNP2U.js';
1
+ import { mcpToolName, jsonResult, errorResult } from '../../chunk-J74ZKEXL.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  // src/modules/workspaces/operations.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/mcp-libs",
3
- "version": "2026.1026.1",
3
+ "version": "2026.1028.1",
4
4
  "description": "Modular MCP SDK shared across all Burdenoff product MCPs (vibecontrols, botlit, fluidgrids, bigconsole, healthybowl, workspaces). Each module exports an McpModule contract; product MCPs become thin shells that pick which modules to mount.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/auth/store.ts","../src/core/config/store.ts","../src/core/auth/device-code.ts","../src/core/gql/client.ts","../src/core/logger.ts","../src/core/progress.ts","../src/core/context.ts","../src/core/errors.ts","../src/core/module.ts","../src/core/capabilities.ts","../src/core/tool-name.ts","../src/core/tool-governance.ts","../src/core/server.ts","../src/core/result.ts"],"names":["authFileName","join","existsSync","mkdirSync","readFileSync","writeFileSync","chmodSync","cfg"],"mappings":"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","file":"chunk-FHXCNP2U.js","sourcesContent":["/**\n * Auth token persistence — parameterised on configDir.\n *\n * Stores tokens in <configDir>/auth.json with 0o600 perms.\n *\n * StoredAuth shape is a SUPERSET of cli-sdk's StoredAuth (adds api_key auth\n * method + apiKey field). A parity test in tests/unit/auth-store-parity.test.ts\n * keeps the field set in sync with cli-sdk so a shared token store path\n * (vibecontrols-cli/auth.json) works for both consumers.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, unlinkSync } from 'fs';\nimport { join } from 'path';\n\nexport type AuthMethod = 'device_code' | 'client_credentials' | 'api_key';\n\nexport interface StoredAuth {\n accessToken: string;\n refreshToken: string;\n expiresAt?: number;\n workspaceToken?: string;\n workspaceTokenExpiresAt?: number;\n workspaceId?: string;\n organizationId?: string;\n authMethod?: AuthMethod;\n clientId?: string;\n clientSecret?: string;\n apiKey?: string;\n}\n\nexport interface AuthStore {\n read(): StoredAuth | null;\n write(auth: StoredAuth): void;\n clear(): void;\n isTokenExpired(): boolean;\n isTokenExpiringSoon(): boolean;\n isWorkspaceTokenExpired(): boolean;\n isWorkspaceTokenExpiringSoon(): boolean;\n isAuthenticated(): boolean;\n /**\n * Decode the actor's userId (the `sub` claim of the active access token)\n * without a network round-trip. Returns null when not authenticated, the\n * access token is missing, or the JWT is malformed / unsigned. Useful for\n * tool handlers that need the caller's identity to forward to a backend\n * mutation that requires `userId: ID!` (e.g. BOFF-8202 `resetTourProgress`).\n *\n * The decoded value is NOT cached — calls are O(1) base64 + JSON parse\n * and cheap. Don't use in hot paths; an explicit `userId` tool arg is\n * preferred when the operation can run on behalf of a different actor.\n */\n getActorUserId(): string | null;\n}\n\nconst TOKEN_BUFFER_MS = 5 * 60 * 1000;\n\nexport function createAuthStore(configDir: string, authFileName = 'auth.json'): AuthStore {\n const authFile = join(configDir, authFileName);\n\n function ensureConfigDir(): void {\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n }\n\n function read(): StoredAuth | null {\n try {\n if (!existsSync(authFile)) return null;\n const raw = readFileSync(authFile, 'utf8');\n return JSON.parse(raw) as StoredAuth;\n } catch {\n return null;\n }\n }\n\n function write(auth: StoredAuth): void {\n ensureConfigDir();\n writeFileSync(authFile, JSON.stringify(auth, null, 2), { encoding: 'utf8', mode: 0o600 });\n try {\n chmodSync(authFile, 0o600);\n } catch {\n // chmod may fail on Windows; non-critical.\n }\n }\n\n function clear(): void {\n try {\n if (existsSync(authFile)) unlinkSync(authFile);\n } catch {\n // ignore\n }\n }\n\n function isTokenExpired(): boolean {\n const auth = read();\n if (!auth?.expiresAt) return false;\n return Date.now() >= auth.expiresAt;\n }\n\n function isTokenExpiringSoon(): boolean {\n const auth = read();\n if (!auth?.expiresAt) return false;\n return Date.now() + TOKEN_BUFFER_MS >= auth.expiresAt;\n }\n\n function isWorkspaceTokenExpired(): boolean {\n const auth = read();\n if (!auth?.workspaceTokenExpiresAt) return false;\n return Date.now() >= auth.workspaceTokenExpiresAt;\n }\n\n function isWorkspaceTokenExpiringSoon(): boolean {\n const auth = read();\n if (!auth?.workspaceTokenExpiresAt) return false;\n return Date.now() + TOKEN_BUFFER_MS >= auth.workspaceTokenExpiresAt;\n }\n\n function isAuthenticated(): boolean {\n const auth = read();\n if (auth?.apiKey) return true;\n if (!auth?.accessToken) return false;\n return !isTokenExpired();\n }\n\n function getActorUserId(): string | null {\n const auth = read();\n const token = auth?.accessToken;\n if (!token) return null;\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n try {\n const payload = JSON.parse(\n Buffer.from(parts[1].replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8'),\n ) as { sub?: unknown };\n return typeof payload.sub === 'string' ? payload.sub : null;\n } catch {\n return null;\n }\n }\n\n return {\n read,\n write,\n clear,\n isTokenExpired,\n isTokenExpiringSoon,\n isWorkspaceTokenExpired,\n isWorkspaceTokenExpiringSoon,\n isAuthenticated,\n getActorUserId,\n };\n}\n","/**\n * Config store — parameterised on configDirName + product defaults.\n *\n * Persists MCP runtime config to ~/.config/<configDirName>/config.json.\n * Includes both gql-client config (workspace/global endpoints, oidc) and\n * transport config (httpPort, host, corsOrigins, allowedHosts, apiKey).\n *\n * Env-var overrides preserve current vibecontrols-mcp behaviour:\n * VIBECONTROLS_WORKSPACE_ENDPOINT, VIBECONTROLS_GLOBAL_ENDPOINT,\n * VIBECONTROLS_OIDC_ISSUER, VIBECONTROLS_CLIENT_ID,\n * VIBECONTROLS_ACCESS_TOKEN, VIBECONTROLS_REFRESH_TOKEN,\n * VIBECONTROLS_WORKSPACE_TOKEN, VIBECONTROLS_API_KEY (or MCP_API_KEY),\n * VIBECONTROLS_WORKSPACE_ID, VIBECONTROLS_ORGANIZATION_ID,\n * HOST, MCP_HOST, PORT, VIBECONTROLS_HTTP_PORT,\n * CORS_ORIGINS, ALLOWED_HOSTS, LOG_LEVEL, LOG_FORMAT.\n *\n * The shell passes the env-prefix it wants (e.g. VIBECONTROLS_) so other\n * product MCPs don't clash.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface McpConfig {\n workspaceEndpoint: string;\n globalEndpoint: string;\n oidcIssuer?: string;\n clientId?: string;\n\n /** Pre-loaded auth (typically env-injected for headless service mode). */\n accessToken?: string;\n refreshToken?: string;\n workspaceToken?: string;\n apiKey?: string;\n workspaceId?: string;\n organizationId?: string;\n\n /** HTTP transport */\n host: string;\n httpPort: number;\n corsOrigins: string;\n allowedHosts: string;\n\n /** Logging */\n logLevel: 'error' | 'warn' | 'info' | 'debug';\n logFormat: 'json' | 'text';\n}\n\nexport interface ProductDefaults {\n /** Directory under ~/.config where this product's MCP state lives. */\n configDirName: string;\n /** Default OAuth client id for OIDC device-code flow. */\n oidcClientId: string;\n /** Production OIDC issuer URL (used when endpoints are non-local). */\n oidcIssuerProd?: string;\n /** Default workspace gateway endpoint. */\n workspaceEndpointDefault: string;\n /** Default global gateway endpoint. */\n globalEndpointDefault: string;\n /** Default HTTP transport port. */\n httpPortDefault?: number;\n /** Default host binding (CORS-bound, defaults to 127.0.0.1). */\n hostDefault?: string;\n /** Env-var prefix (e.g. 'VIBECONTROLS'). */\n envPrefix?: string;\n}\n\nexport interface ConfigStore {\n read(): McpConfig;\n write(config: Partial<McpConfig>): void;\n path(): string;\n dir(): string;\n resolveOIDC(): { oidcIssuer: string; clientId: string };\n}\n\nfunction envOr(prefix: string | undefined, key: string, fallback?: string): string | undefined {\n if (prefix) {\n const prefixed = process.env[`${prefix}_${key}`];\n if (prefixed !== undefined && prefixed !== '') return prefixed;\n }\n const direct = process.env[key];\n if (direct !== undefined && direct !== '') return direct;\n return fallback;\n}\n\nexport function createConfigStore(defaults: ProductDefaults): ConfigStore {\n const configDir = join(homedir(), '.config', defaults.configDirName);\n const configFile = join(configDir, 'config.json');\n const envPrefix = defaults.envPrefix ?? defaults.configDirName.toUpperCase().replace(/-/g, '_');\n\n function ensureConfigDir(): void {\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n }\n\n function readPersisted(): Partial<McpConfig> {\n try {\n if (!existsSync(configFile)) return {};\n const raw = readFileSync(configFile, 'utf8');\n return JSON.parse(raw) as Partial<McpConfig>;\n } catch {\n return {};\n }\n }\n\n function read(): McpConfig {\n const persisted = readPersisted();\n\n const workspaceEndpoint =\n envOr(envPrefix, 'WORKSPACE_ENDPOINT') ??\n persisted.workspaceEndpoint ??\n defaults.workspaceEndpointDefault;\n\n const globalEndpoint =\n envOr(envPrefix, 'GLOBAL_ENDPOINT') ??\n persisted.globalEndpoint ??\n defaults.globalEndpointDefault;\n\n const httpPortRaw =\n envOr(envPrefix, 'HTTP_PORT') ??\n envOr(undefined, 'PORT') ??\n String(defaults.httpPortDefault ?? 3000);\n\n const logLevelRaw = envOr(undefined, 'LOG_LEVEL') ?? persisted.logLevel ?? 'info';\n const logFormatRaw = envOr(undefined, 'LOG_FORMAT') ?? persisted.logFormat ?? 'json';\n\n return {\n workspaceEndpoint,\n globalEndpoint,\n oidcIssuer: envOr(envPrefix, 'OIDC_ISSUER') ?? persisted.oidcIssuer,\n clientId: envOr(envPrefix, 'CLIENT_ID') ?? persisted.clientId,\n accessToken: envOr(envPrefix, 'ACCESS_TOKEN'),\n refreshToken: envOr(envPrefix, 'REFRESH_TOKEN'),\n workspaceToken: envOr(envPrefix, 'WORKSPACE_TOKEN'),\n apiKey: envOr(envPrefix, 'API_KEY') ?? envOr(undefined, 'MCP_API_KEY'),\n workspaceId: envOr(envPrefix, 'WORKSPACE_ID'),\n organizationId: envOr(envPrefix, 'ORGANIZATION_ID'),\n host:\n envOr(undefined, 'HOST') ??\n envOr(undefined, 'MCP_HOST') ??\n defaults.hostDefault ??\n '127.0.0.1',\n httpPort: parseInt(httpPortRaw, 10) || (defaults.httpPortDefault ?? 3000),\n corsOrigins:\n envOr(undefined, 'CORS_ORIGINS') ??\n persisted.corsOrigins ??\n 'http://127.0.0.1,http://localhost',\n allowedHosts:\n envOr(undefined, 'ALLOWED_HOSTS') ?? persisted.allowedHosts ?? '127.0.0.1,localhost',\n logLevel: (['error', 'warn', 'info', 'debug'] as const).includes(logLevelRaw as 'info')\n ? (logLevelRaw as McpConfig['logLevel'])\n : 'info',\n logFormat: logFormatRaw === 'text' ? 'text' : 'json',\n };\n }\n\n function write(patch: Partial<McpConfig>): void {\n ensureConfigDir();\n const merged = { ...readPersisted(), ...patch };\n writeFileSync(configFile, JSON.stringify(merged, null, 2), { encoding: 'utf8' });\n try {\n chmodSync(configFile, 0o600);\n } catch {\n // chmod may fail on Windows; non-critical.\n }\n }\n\n function resolveOIDC(): { oidcIssuer: string; clientId: string } {\n const config = read();\n const clientId = config.clientId || defaults.oidcClientId;\n\n let oidcIssuer = config.oidcIssuer;\n if (!oidcIssuer) {\n const globalEndpoint = config.globalEndpoint;\n if (globalEndpoint.includes('localhost') || globalEndpoint.includes('127.0.0.1')) {\n oidcIssuer = globalEndpoint\n .replace(/\\/graphql$/, '')\n .replace(/\\/global\\/graphql$/, '/global');\n } else {\n oidcIssuer = defaults.oidcIssuerProd ?? 'https://graphql.burdenoff.com/global';\n }\n }\n\n return { oidcIssuer, clientId };\n }\n\n return {\n read,\n write,\n path: () => configFile,\n dir: () => configDir,\n resolveOIDC,\n };\n}\n","/**\n * OAuth2 Device Code flow + Client Credentials flow + workspace token issuance.\n * Pure functions — operate on injected endpoints + client ids, no global state.\n *\n * Mirrors cli-sdk/src/core/auth/device-code.ts so a future shared\n * @burdenoff/auth-core extraction is mechanical.\n */\n\nimport fetch from 'cross-fetch';\n\nexport interface DeviceCodeResponse {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string | null;\n expiresIn: number;\n interval: number;\n}\n\nexport interface DeviceCodeTokenResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\nexport interface ClientCredentialsResult {\n accessToken: string;\n expiresIn: number;\n scopes: string[];\n}\n\nexport interface OIDCConfig {\n oidcIssuer: string;\n clientId: string;\n}\n\nexport async function startDeviceCodeFlow(config: OIDCConfig): Promise<DeviceCodeResponse> {\n const url = `${config.oidcIssuer}/oidc/device/code`;\n const body = new URLSearchParams({\n client_id: config.clientId,\n scope: 'openid profile email offline_access',\n });\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error');\n throw new Error(`Device code request failed (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n deviceCode: data['device_code'] as string,\n userCode: data['user_code'] as string,\n verificationUri: data['verification_uri'] as string,\n verificationUriComplete: (data['verification_uri_complete'] as string) ?? null,\n expiresIn: data['expires_in'] as number,\n interval: (data['interval'] as number) ?? 5,\n };\n}\n\nexport type DeviceTokenPollResult =\n | { status: 'authenticated'; tokens: DeviceCodeTokenResult }\n | { status: 'pending' }\n | { status: 'slow_down'; newInterval: number }\n | { status: 'expired' }\n | { status: 'denied' };\n\n/**\n * Single-shot device-code token poll.\n *\n * Unlike cli-sdk's pollForToken which loops until done (suitable for blocking\n * CLI), MCP needs non-blocking semantics: the LLM calls auth_complete tool\n * repeatedly. This helper makes ONE poll attempt and returns a discriminated\n * union the caller can act on.\n */\nexport async function pollDeviceTokenOnce(\n deviceCode: string,\n interval: number,\n config: OIDCConfig,\n): Promise<DeviceTokenPollResult> {\n const url = `${config.oidcIssuer}/oauth/device/token`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceCode,\n client_id: config.clientId,\n }).toString(),\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (response.ok && data['access_token']) {\n return {\n status: 'authenticated',\n tokens: {\n accessToken: data['access_token'] as string,\n refreshToken: (data['refresh_token'] as string) ?? '',\n expiresIn: (data['expires_in'] as number) ?? 3600,\n },\n };\n }\n\n const errorCode = data['error'] as string | undefined;\n switch (errorCode) {\n case 'authorization_pending':\n return { status: 'pending' };\n case 'slow_down':\n return { status: 'slow_down', newInterval: interval + 5 };\n case 'expired_token':\n return { status: 'expired' };\n case 'access_denied':\n return { status: 'denied' };\n default:\n throw new Error(\n `Device code polling failed: ${(data['error_description'] as string) ?? errorCode ?? 'Unknown error'}`,\n );\n }\n}\n\nexport async function clientCredentialsFlow(\n globalEndpoint: string,\n clientId: string,\n clientSecret: string,\n scopes?: string[],\n): Promise<ClientCredentialsResult> {\n const query = `\n mutation AuthenticateApp($input: AuthenticateAppInput!) {\n authenticateApp(input: $input) {\n accessToken tokenType expiresIn scopes\n }\n }\n `;\n\n const response = await fetch(globalEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query,\n variables: { input: { clientId, clientSecret, scopes } },\n }),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error');\n throw new Error(`App authentication failed (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as {\n data?: { authenticateApp: { accessToken: string; expiresIn: number; scopes: string[] } };\n errors?: Array<{ message: string }>;\n };\n\n if (data.errors?.length) {\n throw new Error(`App authentication failed: ${data.errors[0]?.message ?? 'unknown error'}`);\n }\n if (!data.data?.authenticateApp?.accessToken) {\n throw new Error('App authentication failed: no access token returned');\n }\n\n return data.data.authenticateApp;\n}\n\nexport async function issueWorkspaceToken(\n workspaceEndpoint: string,\n authToken: string,\n workspaceId: string,\n organizationId: string,\n): Promise<{ token: string; expiresAt: string; scopes: string[] }> {\n const query = `\n mutation IssueWorkspaceToken($input: IssueWorkspaceTokenInput!) {\n issueWorkspaceToken(input: $input) {\n success token expiresAt scopes\n error { code message }\n }\n }\n `;\n\n const response = await fetch(workspaceEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${authToken}` },\n body: JSON.stringify({ query, variables: { input: { workspaceId, organizationId } } }),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error');\n throw new Error(`Workspace token request failed (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as {\n data?: {\n issueWorkspaceToken: {\n success: boolean;\n token: string | null;\n expiresAt: string | null;\n scopes: string[] | null;\n error: { code: string; message: string } | null;\n };\n };\n errors?: Array<{ message: string }>;\n };\n\n if (data.errors?.length) {\n throw new Error(`Workspace token failed: ${data.errors[0]?.message ?? 'unknown error'}`);\n }\n\n const result = data.data?.issueWorkspaceToken;\n if (!result?.success || !result.token) {\n throw new Error(`Workspace token failed: ${result?.error?.message ?? 'Unknown error'}`);\n }\n\n return { token: result.token, expiresAt: result.expiresAt ?? '', scopes: result.scopes ?? [] };\n}\n\nexport async function fetchWorkspaces(\n globalEndpoint: string,\n authToken: string,\n): Promise<\n Array<{ id: string; name: string; slug: string; tenantId: string; organizationId: string }>\n> {\n const query = `\n query MyWorkspaces($limit: Int) {\n myWorkspaces(limit: $limit) {\n items { id name slug tenantId organizationId }\n }\n }\n `;\n\n const response = await fetch(globalEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${authToken}` },\n body: JSON.stringify({ query, variables: { limit: 50 } }),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error');\n throw new Error(`Failed to fetch workspaces (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as {\n data?: {\n myWorkspaces: {\n items: Array<{\n id: string;\n name: string;\n slug: string;\n tenantId: string;\n organizationId: string;\n }>;\n };\n };\n errors?: Array<{ message: string }>;\n };\n\n if (data.errors?.length) {\n throw new Error(`Failed to fetch workspaces: ${data.errors[0]?.message ?? 'unknown error'}`);\n }\n\n return data.data?.myWorkspaces?.items ?? [];\n}\n","/**\n * GraphQL client factory — produces three clients (workspace, global,\n * workspaceAuthOnly) sharing an injected ConfigStore + AuthStore.\n *\n * - Auto-refreshes platform + workspace tokens on the workspace client.\n * - Workspace client requires authentication; ensures fresh tokens before each call.\n * - Global client does NOT trigger refresh (avoids loops during auth flows).\n * - workspaceAuthOnly omits X-Workspace-Authorization (used to bootstrap\n * workspace token issuance).\n *\n * Ported from cli-sdk/src/core/gql/client.ts with a minor change: a static\n * `apiKey` is injected as `X-API-Key` header when StoredAuth.apiKey is set\n * (allows headless service-mode auth without device code).\n */\n\nimport { GraphQLClient, type RequestDocument, type Variables } from 'graphql-request';\nimport type { AuthStore, StoredAuth } from '../auth/store.js';\nimport type { ConfigStore } from '../config/store.js';\nimport { clientCredentialsFlow, issueWorkspaceToken } from '../auth/device-code.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst MAX_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 1_000;\n\nexport interface GqlClient {\n request<T>(document: RequestDocument, variables?: Variables): Promise<T>;\n}\n\nexport interface GqlClients {\n workspace: GqlClient;\n global: GqlClient;\n workspaceAuthOnly: GqlClient;\n reset(): void;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isNetworkOrServerError(error: unknown): boolean {\n if (error instanceof TypeError) return true;\n if (error && typeof error === 'object' && 'response' in error) {\n const resp = (error as { response?: { status?: number } }).response;\n if (resp && typeof resp.status === 'number' && resp.status >= 500) return true;\n }\n return false;\n}\n\nexport function extractGqlErrorMessage(error: unknown): string {\n if (error && typeof error === 'object' && 'response' in error) {\n const resp = error as {\n response?: { errors?: Array<{ message?: string }>; status?: number };\n message?: string;\n };\n const firstError = resp.response?.errors?.[0];\n if (firstError?.message) return firstError.message;\n if (resp.message) return resp.message;\n }\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction getHeaders(auth: StoredAuth | null): Record<string, string> {\n const headers: Record<string, string> = {};\n if (auth?.apiKey) headers['X-API-Key'] = auth.apiKey;\n if (auth?.accessToken) headers['Authorization'] = `Bearer ${auth.accessToken}`;\n if (auth?.organizationId) headers['x-org-id'] = auth.organizationId;\n return headers;\n}\n\nfunction getWorkspaceHeaders(auth: StoredAuth | null): Record<string, string> {\n const headers = getHeaders(auth);\n if (auth?.workspaceToken) {\n headers['X-Workspace-Authorization'] = `Bearer ${auth.workspaceToken}`;\n }\n if (auth?.workspaceId) headers['x-workspace-id'] = auth.workspaceId;\n return headers;\n}\n\nasync function executeWithRetry<T>(\n client: GraphQLClient,\n document: RequestDocument,\n variables?: Variables,\n): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n try {\n return await client.request<T>({ document, variables, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n } catch (error: unknown) {\n lastError = error;\n\n if (error && typeof error === 'object' && 'response' in error) {\n const resp = (error as { response?: { status?: number } }).response;\n if (resp && typeof resp.status === 'number' && resp.status >= 400 && resp.status < 500) {\n break;\n }\n }\n\n if (isNetworkOrServerError(error) && attempt < MAX_RETRIES - 1) {\n const delay = INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt);\n await sleep(delay);\n continue;\n }\n\n break;\n }\n }\n\n throw new Error(extractGqlErrorMessage(lastError));\n}\n\nexport function createGqlClients(config: ConfigStore, authStore: AuthStore): GqlClients {\n let workspaceClient: GraphQLClient | null = null;\n let globalClient: GraphQLClient | null = null;\n\n function init(): { workspace: GraphQLClient; global: GraphQLClient } {\n const cfg = config.read();\n const auth = authStore.read();\n\n workspaceClient = new GraphQLClient(cfg.workspaceEndpoint);\n workspaceClient.setHeaders(getWorkspaceHeaders(auth));\n\n globalClient = new GraphQLClient(cfg.globalEndpoint);\n globalClient.setHeaders(getHeaders(auth));\n\n return { workspace: workspaceClient, global: globalClient };\n }\n\n async function refreshPlatformToken(): Promise<void> {\n const auth = authStore.read();\n if (!auth) return;\n\n if (auth.authMethod === 'client_credentials' && auth.clientId && auth.clientSecret) {\n const cfg = config.read();\n try {\n const result = await clientCredentialsFlow(\n cfg.globalEndpoint,\n auth.clientId,\n auth.clientSecret,\n );\n authStore.write({\n ...auth,\n accessToken: result.accessToken,\n expiresAt: Date.now() + result.expiresIn * 1000,\n });\n workspaceClient = null;\n globalClient = null;\n } catch {\n // swallow — caller sees expired-token failure on next request\n }\n return;\n }\n\n if (!auth.refreshToken) return;\n\n const cfg = config.read();\n const client = new GraphQLClient(cfg.globalEndpoint);\n client.setHeaders({ Authorization: `Bearer ${auth.accessToken}` });\n\n const REFRESH_MUTATION = `\n mutation RefreshToken($token: String!) {\n refreshToken(token: $token) { accessToken refreshToken expiresIn }\n }\n `;\n\n interface RefreshResponse {\n refreshToken: { accessToken: string; refreshToken: string; expiresIn: number };\n }\n\n try {\n const data = await client.request<RefreshResponse>(REFRESH_MUTATION, {\n token: auth.refreshToken,\n });\n authStore.write({\n ...auth,\n accessToken: data.refreshToken.accessToken,\n refreshToken: data.refreshToken.refreshToken,\n expiresAt: Date.now() + data.refreshToken.expiresIn * 1000,\n });\n workspaceClient = null;\n globalClient = null;\n } catch {\n // swallow — surfaced on next request\n }\n }\n\n async function refreshWorkspaceToken(): Promise<void> {\n const auth = authStore.read();\n if (!auth?.accessToken || !auth.workspaceId || !auth.organizationId) return;\n\n const cfg = config.read();\n try {\n const result = await issueWorkspaceToken(\n cfg.workspaceEndpoint,\n auth.accessToken,\n auth.workspaceId,\n auth.organizationId,\n );\n authStore.write({\n ...auth,\n workspaceToken: result.token,\n workspaceTokenExpiresAt: new Date(result.expiresAt).getTime(),\n });\n workspaceClient = null;\n } catch {\n // swallow — surfaced on next request\n }\n }\n\n async function ensureFreshTokens(): Promise<void> {\n const initial = authStore.read();\n if (initial?.apiKey) return; // API-key auth never expires\n\n if (authStore.isTokenExpiringSoon()) {\n await refreshPlatformToken();\n }\n if (authStore.isWorkspaceTokenExpiringSoon()) {\n await refreshWorkspaceToken();\n }\n }\n\n const workspace: GqlClient = {\n async request<T>(document: RequestDocument, variables?: Variables): Promise<T> {\n await ensureFreshTokens();\n const { workspace: ws } = workspaceClient ? { workspace: workspaceClient } : init();\n ws.setHeaders(getWorkspaceHeaders(authStore.read()));\n return executeWithRetry<T>(ws, document, variables);\n },\n };\n\n const global: GqlClient = {\n async request<T>(document: RequestDocument, variables?: Variables): Promise<T> {\n const { global: g } = globalClient ? { global: globalClient } : init();\n g.setHeaders(getHeaders(authStore.read()));\n return executeWithRetry<T>(g, document, variables);\n },\n };\n\n const workspaceAuthOnly: GqlClient = {\n async request<T>(document: RequestDocument, variables?: Variables): Promise<T> {\n const cfg = config.read();\n const auth = authStore.read();\n const client = new GraphQLClient(cfg.workspaceEndpoint);\n client.setHeaders(getHeaders(auth));\n return executeWithRetry<T>(client, document, variables);\n },\n };\n\n return {\n workspace,\n global,\n workspaceAuthOnly,\n reset(): void {\n workspaceClient = null;\n globalClient = null;\n },\n };\n}\n","/**\n * Structured logger for MCP SDK.\n *\n * Routes through process.stderr only — stdio transport reserves stdout for\n * JSON-RPC protocol messages. Modules NEVER use console.log/console.error\n * directly: that would corrupt the stdio stream.\n *\n * Supports MCP `logging/setLevel` requests via setLevel() — wire this to the\n * server's request handler so clients can dynamically control verbosity.\n */\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug';\nexport type LogFormat = 'json' | 'text';\n\nexport interface LogContext {\n [key: string]: unknown;\n}\n\nexport interface Logger {\n error(message: string, context?: LogContext): void;\n warn(message: string, context?: LogContext): void;\n info(message: string, context?: LogContext): void;\n debug(message: string, context?: LogContext): void;\n setLevel(level: LogLevel): void;\n getLevel(): LogLevel;\n}\n\nexport interface LoggerOptions {\n level?: LogLevel;\n format?: LogFormat;\n}\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nexport function createLogger(opts: LoggerOptions = {}): Logger {\n let level: LogLevel = opts.level ?? (process.env.LOG_LEVEL as LogLevel) ?? 'info';\n const format: LogFormat = opts.format ?? (process.env.LOG_FORMAT as LogFormat) ?? 'json';\n\n function shouldLog(target: LogLevel): boolean {\n return LEVEL_RANK[target] <= LEVEL_RANK[level];\n }\n\n function formatMessage(target: LogLevel, message: string, context?: LogContext): string {\n const timestamp = new Date().toISOString();\n if (format === 'json') {\n return JSON.stringify({ timestamp, level: target, message, ...context });\n }\n const contextStr = context ? ` ${JSON.stringify(context)}` : '';\n return `[${timestamp}] ${target.toUpperCase()}: ${message}${contextStr}`;\n }\n\n function emit(target: LogLevel, message: string, context?: LogContext): void {\n if (!shouldLog(target)) return;\n process.stderr.write(formatMessage(target, message, context) + '\\n');\n }\n\n return {\n error(message, context): void {\n emit('error', message, context);\n },\n warn(message, context): void {\n emit('warn', message, context);\n },\n info(message, context): void {\n emit('info', message, context);\n },\n debug(message, context): void {\n emit('debug', message, context);\n },\n setLevel(newLevel): void {\n level = newLevel;\n },\n getLevel(): LogLevel {\n return level;\n },\n };\n}\n","/**\n * Progress notification helper.\n *\n * MCP supports `notifications/progress` for long-running tool calls. The client\n * passes a `progressToken` in `_meta`; the server emits progress against that\n * token. When no token is present, ctx.progress() no-ops.\n *\n * Pattern in a tool handler:\n * await registerTool(server, ctx, name, meta, async (args, ctx, meta) => {\n * ctx.progress(meta.progressToken, 0, 100, 'starting');\n * // ... work\n * ctx.progress(meta.progressToken, 50, 100, 'halfway');\n * // ... more work\n * ctx.progress(meta.progressToken, 100, 100, 'done');\n * });\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nexport type ProgressFn = (\n token: string | number | undefined,\n current: number,\n total?: number,\n message?: string,\n) => void;\n\nexport function createProgress(serverRef: { current: McpServer | null }): ProgressFn {\n return (token, current, total, message) => {\n if (token === undefined || token === null) return;\n const server = serverRef.current;\n if (!server) return;\n try {\n const params: {\n progressToken: string | number;\n progress: number;\n total?: number;\n message?: string;\n } = { progressToken: token, progress: current };\n if (total !== undefined) params.total = total;\n if (message !== undefined) params.message = message;\n // The McpServer exposes the underlying Server which has a notification method;\n // wrap defensively because shapes vary across SDK versions.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const inner = (server as any).server ?? server;\n inner.notification?.({ method: 'notifications/progress', params });\n } catch {\n // ignore — progress is best-effort\n }\n };\n}\n","/**\n * McpContext — the prop bag injected by the shell into every module.\n *\n * Modules receive this via `register(server, ctx)` and use only what they\n * need. No module should reach for global state.\n */\n\nimport { createAuthStore, type AuthStore } from './auth/store.js';\nimport { createConfigStore, type ConfigStore, type ProductDefaults } from './config/store.js';\nimport { createGqlClients, type GqlClients } from './gql/client.js';\nimport { createLogger, type Logger, type LoggerOptions } from './logger.js';\nimport { createProgress, type ProgressFn } from './progress.js';\n\nexport type Environment = 'prod' | 'alpha' | 'dev' | 'local';\n\nexport interface McpContext {\n productName: string;\n productVersion: string;\n serverName: string;\n serverVersion: string;\n defaults: ProductDefaults;\n config: ConfigStore;\n auth: AuthStore;\n gql: GqlClients;\n logger: Logger;\n progress: ProgressFn;\n env: Environment;\n\n /** Internal: server reference is mutated post-construction in createMcpServer. */\n _internal: {\n serverRef: { current: import('@modelcontextprotocol/sdk/server/mcp.js').McpServer | null };\n };\n}\n\nexport interface BuildContextOptions {\n productName: string;\n productVersion: string;\n serverName: string;\n serverVersion: string;\n defaults: ProductDefaults;\n logger?: LoggerOptions | Logger;\n env?: Environment;\n /**\n * Override the auth file path. Defaults to `<configDir>/auth.json`.\n * Set this to `~/.config/<product>-cli/auth.json` to share token\n * storage with the corresponding CLI.\n */\n tokenStorePath?: string;\n}\n\nfunction inferEnv(workspaceEndpoint: string): Environment {\n if (workspaceEndpoint.includes('localhost') || workspaceEndpoint.includes('127.0.0.1')) {\n return 'local';\n }\n if (workspaceEndpoint.includes('alpha')) return 'alpha';\n return 'prod';\n}\n\nfunction isLogger(value: LoggerOptions | Logger | undefined): value is Logger {\n return (\n !!value &&\n typeof (value as Logger).debug === 'function' &&\n typeof (value as Logger).info === 'function'\n );\n}\n\nexport function buildContext(opts: BuildContextOptions): McpContext {\n const config = createConfigStore(opts.defaults);\n const cfg = config.read();\n\n const logger = isLogger(opts.logger)\n ? opts.logger\n : createLogger({\n ...(opts.logger as LoggerOptions | undefined),\n level: cfg.logLevel,\n format: cfg.logFormat,\n });\n\n const auth = createAuthStore(\n opts.tokenStorePath ? dirOf(opts.tokenStorePath) : config.dir(),\n authFileName(opts.tokenStorePath),\n );\n\n // Seed env-injected tokens if persisted store is empty (headless service mode).\n const existing = auth.read();\n if (!existing && (cfg.accessToken || cfg.apiKey)) {\n auth.write({\n accessToken: cfg.accessToken ?? '',\n refreshToken: cfg.refreshToken ?? '',\n ...(cfg.workspaceToken ? { workspaceToken: cfg.workspaceToken } : {}),\n ...(cfg.workspaceId ? { workspaceId: cfg.workspaceId } : {}),\n ...(cfg.organizationId ? { organizationId: cfg.organizationId } : {}),\n ...(cfg.apiKey ? { apiKey: cfg.apiKey, authMethod: 'api_key' as const } : {}),\n });\n }\n\n const gql = createGqlClients(config, auth);\n const env = opts.env ?? inferEnv(cfg.workspaceEndpoint);\n\n const serverRef: { current: import('@modelcontextprotocol/sdk/server/mcp.js').McpServer | null } =\n { current: null };\n const progress = createProgress(serverRef);\n\n return {\n productName: opts.productName,\n productVersion: opts.productVersion,\n serverName: opts.serverName,\n serverVersion: opts.serverVersion,\n defaults: opts.defaults,\n config,\n auth,\n gql,\n logger,\n progress,\n env,\n _internal: { serverRef },\n };\n}\n\nfunction dirOf(p: string): string {\n const lastSlash = p.lastIndexOf('/');\n return lastSlash > 0 ? p.slice(0, lastSlash) : p;\n}\n\nfunction authFileName(p?: string): string | undefined {\n if (!p) return undefined;\n const lastSlash = p.lastIndexOf('/');\n return lastSlash >= 0 ? p.slice(lastSlash + 1) : p;\n}\n","/**\n * Error classes for MCP SDK.\n *\n * Modules MUST throw these instead of throwing raw Errors. The registerTool\n * wrapper in result.ts catches and maps them to MCP-protocol-compliant\n * `{ isError: true, content: [...] }` responses.\n *\n * Throwing past the wrapper to the protocol surfaces as JSON-RPC -32603 to\n * the client and is a protocol bug.\n */\n\nexport class McpUserError extends Error {\n public readonly hint: string | undefined;\n\n constructor(message: string, opts?: { hint?: string }) {\n super(message);\n this.name = 'McpUserError';\n this.hint = opts?.hint;\n }\n}\n\nexport class McpAuthError extends McpUserError {\n constructor(message: string, opts?: { hint?: string }) {\n super(message, {\n hint: opts?.hint ?? 'Run the auth_login tool to authenticate.',\n });\n this.name = 'McpAuthError';\n }\n}\n\nexport class McpInternalError extends Error {\n public override readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'McpInternalError';\n this.cause = cause;\n }\n}\n","/**\n * McpModule contract + dependency-aware loader.\n *\n * Each entry under src/modules/<name>/ default-exports an McpModule. The\n * shell passes an array of modules to createMcpServer(); the loader topo-\n * sorts them, fails fast on missing deps, and calls register() on each.\n *\n * register() returns a ModuleRegistration manifest of what was registered\n * — used by the shell to log a deterministic boot line and by the snapshot\n * test in Phase 1 to diff against a captured pre-refactor manifest.\n *\n * Mirrors cli-sdk/src/core/module.ts with addition of capabilities + manifest.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext } from './context.js';\nimport type { McpCapabilities } from './capabilities.js';\nimport { McpInternalError } from './errors.js';\n\nexport interface ModuleRegistration {\n tools: readonly string[];\n resources: readonly string[];\n prompts: readonly string[];\n}\n\nexport interface McpModule {\n readonly id: string;\n readonly version: string;\n readonly displayName: string;\n readonly dependsOn?: readonly string[];\n readonly capabilities?: McpCapabilities;\n register(server: McpServer, ctx: McpContext): ModuleRegistration;\n}\n\nexport class MissingDependencyError extends McpInternalError {\n constructor(moduleId: string, missingDep: string) {\n super(\n `Module '${moduleId}' declares dependency on '${missingDep}', but '${missingDep}' is not in the module list.`,\n );\n this.name = 'MissingDependencyError';\n }\n}\n\nexport class CircularDependencyError extends McpInternalError {\n constructor(cycle: readonly string[]) {\n super(`Circular dependency detected among modules: ${cycle.join(' -> ')}`);\n this.name = 'CircularDependencyError';\n }\n}\n\n/**\n * Topologically sort modules by their `dependsOn` declarations.\n * Throws MissingDependencyError or CircularDependencyError on bad input.\n */\nexport function sortModules(modules: readonly McpModule[]): McpModule[] {\n const byId = new Map<string, McpModule>();\n for (const m of modules) {\n if (byId.has(m.id)) {\n throw new McpInternalError(`Duplicate module id: '${m.id}'`);\n }\n byId.set(m.id, m);\n }\n\n for (const m of modules) {\n for (const dep of m.dependsOn ?? []) {\n if (!byId.has(dep)) {\n throw new MissingDependencyError(m.id, dep);\n }\n }\n }\n\n const sorted: McpModule[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n function visit(m: McpModule, path: string[]): void {\n if (visited.has(m.id)) return;\n if (visiting.has(m.id)) {\n throw new CircularDependencyError([...path, m.id]);\n }\n visiting.add(m.id);\n for (const dep of m.dependsOn ?? []) {\n const depModule = byId.get(dep);\n if (depModule) visit(depModule, [...path, m.id]);\n }\n visiting.delete(m.id);\n visited.add(m.id);\n sorted.push(m);\n }\n\n for (const m of modules) {\n visit(m, []);\n }\n return sorted;\n}\n\nexport interface ServerManifest {\n modules: readonly { id: string; version: string }[];\n tools: readonly string[];\n resources: readonly string[];\n prompts: readonly string[];\n}\n","/**\n * Module capability declaration + union helper.\n *\n * Each McpModule declares the MCP capabilities it requires. The shell unions\n * all capabilities before constructing McpServer, so a module that needs\n * resources.subscribe (e.g. live agent heartbeat) gets it without any\n * shell-side knowledge.\n *\n * Reference: https://modelcontextprotocol.io/specification/2025-03-26/server/capabilities\n */\n\nexport interface McpCapabilities {\n resources?: { subscribe?: boolean; listChanged?: boolean };\n prompts?: { listChanged?: boolean };\n tools?: { listChanged?: boolean };\n logging?: boolean;\n completions?: boolean;\n}\n\n/**\n * Union an array of capability declarations. Boolean unions on logging /\n * completions; OR on every nested boolean.\n */\nexport function unionCapabilities(caps: readonly (McpCapabilities | undefined)[]): McpCapabilities {\n const out: McpCapabilities = {};\n\n for (const cap of caps) {\n if (!cap) continue;\n if (cap.resources) {\n out.resources ??= {};\n if (cap.resources.subscribe) out.resources.subscribe = true;\n if (cap.resources.listChanged) out.resources.listChanged = true;\n }\n if (cap.prompts) {\n out.prompts ??= {};\n if (cap.prompts.listChanged) out.prompts.listChanged = true;\n }\n if (cap.tools) {\n out.tools ??= {};\n if (cap.tools.listChanged) out.tools.listChanged = true;\n }\n if (cap.logging) out.logging = true;\n if (cap.completions) out.completions = true;\n }\n\n return out;\n}\n\n/**\n * Convert capability declaration into the shape the MCP SDK accepts at\n * `new McpServer({ capabilities })`. The SDK uses `{}` as truthy markers.\n */\nexport function toServerCapabilities(caps: McpCapabilities): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (caps.tools) out.tools = caps.tools;\n if (caps.resources) out.resources = caps.resources;\n if (caps.prompts) out.prompts = caps.prompts;\n if (caps.logging) out.logging = {};\n if (caps.completions) out.completions = {};\n return out;\n}\n","/**\n * Tool / resource / prompt naming helpers.\n *\n * Mandatory product prefix avoids collisions when Claude Desktop runs\n * multiple MCP servers concurrently (typical setup is ~6).\n *\n * Tool names are capped at 63 characters — Claude Desktop pre-1.x\n * truncated at 64 in some versions.\n */\n\nimport { McpInternalError } from './errors.js';\n\nconst MAX_TOOL_NAME_LENGTH = 63;\n\nfunction assertSafeName(name: string, kind: 'tool' | 'resource' | 'prompt'): string {\n if (kind === 'tool' && name.length > MAX_TOOL_NAME_LENGTH) {\n throw new McpInternalError(\n `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`,\n );\n }\n return name;\n}\n\n/**\n * Build a tool name. Format: `<productName>_<...parts>` (snake_case).\n * Example: mcpToolName('vibecontrols', 'vibes', 'list') -> 'vibecontrols_vibes_list'\n */\nexport function mcpToolName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpToolName: productName is required');\n }\n const name = [productName, ...parts].filter(Boolean).join('_');\n return assertSafeName(name, 'tool');\n}\n\n/**\n * Build a resource URI. Format: `<productName>://<...parts>`.\n * Example: mcpResourceUri('vibecontrols', 'schema') -> 'vibecontrols://schema'\n */\nexport function mcpResourceUri(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpResourceUri: productName is required');\n }\n return `${productName}://${parts.filter(Boolean).join('/')}`;\n}\n\n/**\n * Build a prompt name. Format: `<productName>-<...parts>` (kebab-case).\n * Example: mcpPromptName('vibecontrols', 'setup') -> 'vibecontrols-setup'\n */\nexport function mcpPromptName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpPromptName: productName is required');\n }\n return [productName, ...parts].filter(Boolean).join('-');\n}\n\nexport const TOOL_NAME_LIMIT = MAX_TOOL_NAME_LENGTH;\n\n/**\n * Name-based hint heuristics for MCP `annotations` (readOnlyHint /\n * destructiveHint). Used by tool-governance.ts to auto-fill annotations for\n * the fleet of product modules that call `server.registerTool` directly\n * (bypassing the `registerTool()` core helper) and so never set them\n * explicitly today (BOFF-3903). Deliberately conservative — matched against\n * whole `_`-delimited segments so e.g. `timeentries_delete` and\n * `pomodoro_delete_goal` match, but a hypothetical `undeletable_check`\n * would not.\n *\n * The destructive verb set covers more than `delete`: stopping, killing or\n * terminating a running process, revoking or rotating a credential/share,\n * resetting settings and removing/purging/uninstalling are all actions an\n * MCP client must not auto-run without the user's intent (VC/FG parity G57 —\n * e.g. `vibecontrols_sessions_kill`, `vibecontrols_tunnels_rotate_credentials`\n * were previously reported as non-destructive).\n *\n * A module can always override the inference by passing an explicit\n * `annotations` object to `registerTool()` / `server.registerTool()` — do\n * that for the rare verb match that is harmless (e.g. a typing indicator's\n * `typing_stop`).\n */\nexport const DESTRUCTIVE_NAME_VERBS = [\n 'delete',\n 'destroy',\n 'erase',\n 'kill',\n 'purge',\n 'remove',\n 'reset',\n 'revoke',\n 'rotate',\n 'stop',\n 'terminate',\n 'uninstall',\n 'wipe',\n] as const;\nconst DESTRUCTIVE_NAME_SEGMENT = new RegExp(\n `(?:^|_)(?:${DESTRUCTIVE_NAME_VERBS.join('|')})(?:_|$)`,\n 'i',\n);\nconst READ_ONLY_NAME_SEGMENT = /(?:^|_)(?:list|get|search|check|read|count|stats|by_date)(?:_|$)/i;\n\n/** True when a tool name looks destructive (irreversibly deletes data) by naming convention. */\nexport function inferDestructiveHint(toolName: string): boolean {\n return DESTRUCTIVE_NAME_SEGMENT.test(toolName);\n}\n\n/**\n * True when a tool name looks read-only by naming convention. Never true for\n * a name that also looks destructive (a tool can't be both).\n */\nexport function inferReadOnlyHint(toolName: string): boolean {\n return !inferDestructiveHint(toolName) && READ_ONLY_NAME_SEGMENT.test(toolName);\n}\n","/**\n * Fleet-wide tool governance: MCP `annotations` inference + an opt-in\n * confirmation gate on destructive tools.\n *\n * BOFF-3903: an audit of mcp-libs/src/modules/timecampus/tools/ found 163\n * registered tools, ~35 of them destructive (delete/bulk-delete), with ZERO\n * `annotations.destructiveHint`/`readOnlyHint` anywhere and no confirmation\n * step before a destructive call executes. The same is true fleet-wide —\n * every product module calls `server.registerTool` directly (bypassing the\n * `registerTool()` central wrapper in result.ts), so a per-module fix would\n * have to be re-applied ~54 times.\n *\n * `wrapServerWithToolGovernance` fixes this ONCE, at the McpServer boundary\n * inside `createMcpServer`, by monkey-patching `registerTool` before any\n * module receives the server reference. Every subsequent `registerTool`\n * call — whether it goes through result.ts's `registerTool()` helper or\n * calls `server.registerTool` directly — passes through this wrapper:\n *\n * 1. `annotations.readOnlyHint` / `destructiveHint` are filled in from the\n * tool name (see tool-name.ts's inferDestructiveHint/inferReadOnlyHint)\n * whenever a module didn't declare them explicitly. This is pure\n * metadata — it never changes a tool's input schema or behavior, so it\n * is always safe to apply and every consumer gets it automatically.\n * 2. Only when `enforceDestructiveConfirmation` is true (opt-in,\n * defaults to false) does a resolved-destructive tool additionally get\n * a `confirm` input field and a hard gate: the tool's real handler is\n * never invoked unless the caller passes `confirm: true`. This is\n * deliberately opt-in — flipping it on is a real behavior change for\n * any existing MCP client automation calling that tool, so each product\n * shell (starting with timecampus-mcp for BOFF-3903) turns it on\n * explicitly via `createMcpServer`'s options once it's ready, rather\n * than every one of the ~54 modules' existing destructive-tool callers\n * breaking the moment this ships.\n */\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z, type ZodRawShape } from 'zod';\n\nimport { inferDestructiveHint, inferReadOnlyHint } from './tool-name.js';\n\n/** MCP tool annotations (per the MCP spec's `ToolAnnotations` shape). */\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface ToolGovernanceOptions {\n /**\n * Require `confirm: true` before invoking any tool resolved as\n * destructive (explicit `annotations.destructiveHint`, or inferred from\n * the tool name). Defaults to false.\n */\n enforceDestructiveConfirmation?: boolean;\n}\n\ninterface GovernedRegisterToolConfig {\n title?: string;\n description?: string;\n inputSchema?: ZodRawShape;\n annotations?: ToolAnnotations;\n}\n\ntype RegisterToolHandler = (...handlerArgs: unknown[]) => unknown;\ntype RegisterToolFn = (\n name: string,\n config: GovernedRegisterToolConfig,\n handler: RegisterToolHandler,\n) => unknown;\n\ninterface RegisterToolCapableServer {\n registerTool: RegisterToolFn;\n}\n\nconst CONFIRM_FIELD_DESCRIPTION =\n 'Must be true to execute this destructive tool. The call is rejected (no changes made) if omitted or false.';\n\nfunction resolveAnnotations(name: string, declared: ToolAnnotations | undefined): ToolAnnotations {\n const destructiveHint = declared?.destructiveHint ?? inferDestructiveHint(name);\n const readOnlyHint =\n declared?.readOnlyHint ?? (destructiveHint ? false : inferReadOnlyHint(name));\n return { ...declared, destructiveHint, readOnlyHint };\n}\n\n/** Rejection result forwarded to the MCP client without invoking the real handler. */\nfunction unconfirmedDestructiveResult(name: string): {\n content: Array<{ type: 'text'; text: string }>;\n isError: true;\n} {\n return {\n content: [\n {\n type: 'text',\n text: `'${name}' is a destructive action and was NOT executed. Re-call with confirm: true once you intend to proceed.`,\n },\n ],\n isError: true,\n };\n}\n\nfunction wrapDestructiveHandler(name: string, handler: RegisterToolHandler): RegisterToolHandler {\n return async (...callbackArgs: unknown[]): Promise<unknown> => {\n const hasArgs = callbackArgs.length === 2;\n const rawArgs = (hasArgs ? callbackArgs[0] : {}) as Record<string, unknown>;\n\n if (rawArgs['confirm'] !== true) {\n return unconfirmedDestructiveResult(name);\n }\n\n // Strip the synthetic `confirm` field before forwarding — the module's\n // own handler/schema never declared it and shouldn't have to know about it.\n const forwardedArgs: Record<string, unknown> = { ...rawArgs };\n delete forwardedArgs['confirm'];\n const forwardedCallbackArgs = hasArgs ? [forwardedArgs, callbackArgs[1]] : callbackArgs;\n return handler(...forwardedCallbackArgs);\n };\n}\n\n/**\n * Monkey-patch `server.registerTool` so every tool registered afterward\n * (by any module, through any call path) gets annotations inference and,\n * when enabled, the destructive-confirmation gate. Returns the same server\n * instance (mutated in place) for convenient chaining.\n */\nexport function wrapServerWithToolGovernance(\n server: McpServer,\n options: ToolGovernanceOptions = {},\n): McpServer {\n const enforceConfirmation = options.enforceDestructiveConfirmation ?? false;\n const target = server as unknown as RegisterToolCapableServer;\n const originalRegisterTool = target.registerTool.bind(target);\n\n target.registerTool = (\n name: string,\n config: GovernedRegisterToolConfig,\n handler: RegisterToolHandler,\n ): unknown => {\n const annotations = resolveAnnotations(name, config.annotations);\n\n if (!enforceConfirmation || !annotations.destructiveHint) {\n return originalRegisterTool(name, { ...config, annotations }, handler);\n }\n\n const gatedInputSchema: ZodRawShape = {\n ...(config.inputSchema ?? {}),\n confirm: z.boolean().optional().describe(CONFIRM_FIELD_DESCRIPTION),\n };\n\n return originalRegisterTool(\n name,\n { ...config, inputSchema: gatedInputSchema, annotations },\n wrapDestructiveHandler(name, handler),\n );\n };\n\n return server;\n}\n\n/**\n * Resolves the explicit annotations a module declares for one of its tools,\n * or `undefined` when it declares none (name inference then applies).\n */\nexport type ToolAnnotationResolver = (toolName: string) => ToolAnnotations | undefined;\n\n/**\n * Run `register` with every `server.registerTool` call it makes carrying\n * the annotations `resolve` returns for that tool name. Lets a large module\n * keep its annotations in one reviewed table (VC/FG parity G57: the\n * vibecontrols module registers ~280 tools) instead of scattering them over\n * every call site, while still going through the governance wrapper — the\n * table counts as an *explicit* declaration, so it wins over name\n * inference and drives the confirmation gate.\n *\n * Annotations a call site passes inline take precedence over the table.\n * `server.registerTool` is restored when `register` returns or throws, so\n * resource/prompt registration and later modules are unaffected.\n */\nexport function withToolAnnotations<T>(\n server: McpServer,\n resolve: ToolAnnotationResolver,\n register: () => T,\n): T {\n const target = server as unknown as RegisterToolCapableServer;\n const governedRegisterTool = target.registerTool;\n\n target.registerTool = (\n name: string,\n config: GovernedRegisterToolConfig,\n handler: RegisterToolHandler,\n ): unknown => {\n const declared = resolve(name);\n const annotations =\n declared === undefined ? config.annotations : { ...declared, ...config.annotations };\n return governedRegisterTool.call(target, name, { ...config, annotations }, handler);\n };\n\n try {\n return register();\n } finally {\n target.registerTool = governedRegisterTool;\n }\n}\n","/**\n * createMcpServer — McpServer factory + module loader + central wiring.\n *\n * Sorts modules by dependsOn, unions their capabilities, constructs an\n * McpServer with declared capabilities, calls register() on each module in\n * topo order, threads the server into ctx for progress notifications, and\n * returns both the server + the merged registration manifest.\n *\n * The `logging/setLevel` request handler is wired to ctx.logger.setLevel\n * so MCP clients can dynamically control verbosity.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { SetLevelRequestSchema, type LoggingLevel } from '@modelcontextprotocol/sdk/types.js';\nimport type { McpContext } from './context.js';\nimport { sortModules, type McpModule, type ServerManifest } from './module.js';\nimport { toServerCapabilities, unionCapabilities, type McpCapabilities } from './capabilities.js';\nimport type { LogLevel } from './logger.js';\nimport { wrapServerWithToolGovernance } from './tool-governance.js';\n\nexport interface CreateMcpServerOptions {\n name: string;\n version: string;\n /** Optional extra capabilities to union in (rarely needed). */\n extraCapabilities?: McpCapabilities;\n /**\n * Require `confirm: true` before invoking any tool resolved as\n * destructive (explicit `annotations.destructiveHint`, or inferred from\n * the tool name — see tool-governance.ts). Defaults to false so existing\n * consumers are unaffected until they opt in. `annotations` inference\n * itself always applies regardless of this flag.\n */\n enforceDestructiveConfirmation?: boolean;\n}\n\nexport interface McpServerHandle {\n server: McpServer;\n manifest: ServerManifest;\n}\n\nconst MCP_TO_LOGGER_LEVEL: Record<LoggingLevel, LogLevel> = {\n debug: 'debug',\n info: 'info',\n notice: 'info',\n warning: 'warn',\n error: 'error',\n critical: 'error',\n alert: 'error',\n emergency: 'error',\n};\n\nexport function createMcpServer(\n ctx: McpContext,\n modules: readonly McpModule[],\n opts: CreateMcpServerOptions,\n): McpServerHandle {\n const sorted = sortModules(modules);\n\n // Always declare logging so logging/setLevel works (ctx.logger uses setLevel internally).\n const baseCapabilities: McpCapabilities = { logging: true };\n const capabilities = unionCapabilities([\n baseCapabilities,\n ...sorted.map((m) => m.capabilities),\n opts.extraCapabilities,\n ]);\n\n const server = new McpServer(\n { name: opts.name, version: opts.version },\n { capabilities: toServerCapabilities(capabilities) },\n );\n\n // Wrap BEFORE any module receives the server reference so every\n // registerTool call — through the core registerTool() helper or called\n // directly by a module, the fleet-wide norm today (BOFF-3903) — is\n // governed uniformly, with zero changes required in any product module.\n wrapServerWithToolGovernance(server, {\n enforceDestructiveConfirmation: opts.enforceDestructiveConfirmation,\n });\n\n ctx._internal.serverRef.current = server;\n\n // Wire MCP logging/setLevel → ctx.logger.setLevel\n // The McpServer wraps a Server instance; reach inner for setRequestHandler.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const inner = (server as any).server ?? server;\n if (typeof inner.setRequestHandler === 'function') {\n inner.setRequestHandler(\n SetLevelRequestSchema,\n async (req: { params: { level: LoggingLevel } }) => {\n const target = MCP_TO_LOGGER_LEVEL[req.params.level] ?? 'info';\n ctx.logger.setLevel(target);\n ctx.logger.info('MCP logging level set', { level: req.params.level, mapped: target });\n return {};\n },\n );\n }\n\n const tools: string[] = [];\n const resources: string[] = [];\n const prompts: string[] = [];\n const moduleManifest: { id: string; version: string }[] = [];\n\n for (const mod of sorted) {\n try {\n const reg = mod.register(server, ctx);\n tools.push(...reg.tools);\n resources.push(...reg.resources);\n prompts.push(...reg.prompts);\n moduleManifest.push({ id: mod.id, version: mod.version });\n ctx.logger.debug(`Registered module: ${mod.id}`, {\n tools: reg.tools.length,\n resources: reg.resources.length,\n prompts: reg.prompts.length,\n });\n } catch (error) {\n ctx.logger.error(`Failed to register module: ${mod.id}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n const manifest: ServerManifest = {\n modules: moduleManifest,\n tools,\n resources,\n prompts,\n };\n\n ctx.logger.info(`MCP server ready: ${opts.name}@${opts.version}`, {\n modules: manifest.modules.length,\n tools: manifest.tools.length,\n resources: manifest.resources.length,\n prompts: manifest.prompts.length,\n });\n\n return { server, manifest };\n}\n","/**\n * MCP tool result helpers + central handler.\n *\n * Modules NEVER call server.registerTool directly — they use registerTool()\n * from this module so the central try/catch wraps the handler and:\n * - maps thrown McpUserError / McpAuthError / McpInternalError to\n * MCP-protocol-compliant `{ isError: true, content: [...] }` shapes\n * - threads `_meta.progressToken` into ctx.progress for long ops\n * - emits a structured log line on every error\n * - never leaks `cause` from McpInternalError to the client\n *\n * This is the analog of cli-sdk's createProgram() central error handler.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ZodRawShape } from 'zod';\nimport type { McpContext } from './context.js';\nimport { McpAuthError, McpInternalError, McpUserError } from './errors.js';\nimport type { ToolAnnotations } from './tool-governance.js';\n\nexport interface ToolTextContent {\n type: 'text';\n text: string;\n [k: string]: unknown;\n}\n\nexport interface ToolResult {\n content: ToolTextContent[];\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ToolMeta {\n progressToken?: string | number;\n}\n\n/**\n * Build a successful tool result with JSON content (pretty-printed).\n */\nexport function jsonResult(data: unknown, structured?: Record<string, unknown>): ToolResult {\n const result: ToolResult = {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n if (structured !== undefined) {\n result.structuredContent = structured;\n }\n return result;\n}\n\n/**\n * Build a successful tool result with plain text content.\n */\nexport function textResult(text: string): ToolResult {\n return { content: [{ type: 'text', text }] };\n}\n\n/**\n * Build an error tool result. Honors MCP's `{ isError: true, content }` shape.\n * Optional hint is appended on a new line so the LLM can react.\n */\nexport function errorResult(message: string, hint?: string): ToolResult {\n const text = hint ? `${message}\\n\\nHint: ${hint}` : message;\n return { content: [{ type: 'text', text }], isError: true };\n}\n\nexport interface ToolMetadata {\n title: string;\n description: string;\n inputSchema?: ZodRawShape;\n /**\n * Explicit MCP annotations (readOnlyHint / destructiveHint / ...). Optional\n * — when omitted, `wrapServerWithToolGovernance` (applied centrally in\n * `createMcpServer`) infers them from the tool name. Set this to override\n * the inference for a tool whose name doesn't match the naming convention.\n */\n annotations?: ToolAnnotations;\n}\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n ctx: McpContext,\n meta: ToolMeta,\n) => Promise<unknown>;\n\n/**\n * Register a tool with the central error wrapper.\n *\n * The handler returns a plain value or void. The wrapper:\n * - wraps non-undefined returns in jsonResult()\n * - if the value already looks like a ToolResult (has `content`), passes through\n * - catches McpAuthError / McpUserError / McpInternalError / generic Error\n * - logs every error via ctx.logger.error\n */\nexport function registerTool<TArgs extends Record<string, unknown>>(\n server: McpServer,\n ctx: McpContext,\n name: string,\n metadata: ToolMetadata,\n handler: ToolHandler<TArgs>,\n): void {\n const sdkConfig = {\n title: metadata.title,\n description: metadata.description,\n ...(metadata.inputSchema ? { inputSchema: metadata.inputSchema } : {}),\n ...(metadata.annotations ? { annotations: metadata.annotations } : {}),\n };\n\n // The MCP SDK's registerTool signature is `(name, config, handler)`. The\n // handler arity depends on whether inputSchema is present (1-arg without,\n // 2-arg with). We accept a unified handler shape and dispatch at runtime.\n // The SDK's typing is strict and conditional on the inputSchema generic;\n // bypass with a cast since runtime acceptance is unconditional.\n const wrapped = async (...callbackArgs: unknown[]): Promise<ToolResult> => {\n const hasArgs = callbackArgs.length === 2;\n const args = (hasArgs ? callbackArgs[0] : {}) as TArgs;\n const extra = (hasArgs ? callbackArgs[1] : callbackArgs[0]) as\n { _meta?: { progressToken?: string | number } } | undefined;\n\n const progressToken = extra?._meta?.progressToken;\n const meta: ToolMeta = progressToken !== undefined ? { progressToken } : {};\n\n try {\n const result = await handler(args, ctx, meta);\n if (isToolResult(result)) return result;\n if (result === undefined) return textResult('OK');\n return jsonResult(result);\n } catch (error) {\n return mapErrorToResult(error, ctx, name);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (server as any).registerTool(name, sdkConfig, wrapped);\n}\n\nfunction isToolResult(value: unknown): value is ToolResult {\n return (\n !!value &&\n typeof value === 'object' &&\n 'content' in value &&\n Array.isArray((value as ToolResult).content)\n );\n}\n\nfunction mapErrorToResult(error: unknown, ctx: McpContext, toolName: string): ToolResult {\n if (error instanceof McpAuthError) {\n ctx.logger.warn(`${toolName}: auth required`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpUserError) {\n ctx.logger.info(`${toolName}: user error`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpInternalError) {\n ctx.logger.error(`${toolName}: internal error`, {\n message: error.message,\n cause: stringifyCause(error.cause),\n });\n return errorResult(`Internal error in ${toolName}.`);\n }\n const message = error instanceof Error ? error.message : String(error);\n ctx.logger.error(`${toolName}: unhandled error`, { message });\n return errorResult(`${toolName}: ${message}`);\n}\n\nfunction stringifyCause(cause: unknown): string | undefined {\n if (cause === undefined || cause === null) return undefined;\n if (cause instanceof Error) return cause.message;\n try {\n return JSON.stringify(cause);\n } catch {\n return String(cause);\n }\n}\n"]}