@burdenoff/mcp-libs 2026.1008.2 → 2026.1008.4

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 (205) hide show
  1. package/dist/{chunk-BSNL65PZ.js → chunk-G76DKEPI.js} +19 -3
  2. package/dist/{chunk-BSNL65PZ.js.map → chunk-G76DKEPI.js.map} +1 -1
  3. package/dist/{chunk-QQYJVKJE.js → chunk-SX6IGKZH.js} +3 -3
  4. package/dist/{chunk-QQYJVKJE.js.map → chunk-SX6IGKZH.js.map} +1 -1
  5. package/dist/{context-1jV4NsLv.d.cts → context-DGO4h-Pd.d.cts} +1 -0
  6. package/dist/{context-1jV4NsLv.d.ts → context-DGO4h-Pd.d.ts} +1 -0
  7. package/dist/core/index.cjs +17 -1
  8. package/dist/core/index.cjs.map +1 -1
  9. package/dist/core/index.d.cts +3 -3
  10. package/dist/core/index.d.ts +3 -3
  11. package/dist/core/index.js +1 -1
  12. package/dist/{http-DXTeCD5r.d.ts → http-Wj1WM6ji.d.ts} +1 -1
  13. package/dist/{http-BP4c721D.d.cts → http-uAT9KeBa.d.cts} +1 -1
  14. package/dist/index.cjs +17 -1
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +4 -4
  17. package/dist/index.d.ts +4 -4
  18. package/dist/index.js +1 -1
  19. package/dist/{module-DFQBZNK6.d.cts → module-CfnM2XHg.d.cts} +1 -1
  20. package/dist/{module-DBcfA-i3.d.ts → module-VpgjAf8m.d.ts} +1 -1
  21. package/dist/modules/adaptercloud/index.d.cts +2 -2
  22. package/dist/modules/adaptercloud/index.d.ts +2 -2
  23. package/dist/modules/adaptercloud/index.js +1 -1
  24. package/dist/modules/artistrybase/index.d.cts +2 -2
  25. package/dist/modules/artistrybase/index.d.ts +2 -2
  26. package/dist/modules/artistrybase/index.js +1 -1
  27. package/dist/modules/assethandler/index.d.cts +2 -2
  28. package/dist/modules/assethandler/index.d.ts +2 -2
  29. package/dist/modules/assethandler/index.js +1 -1
  30. package/dist/modules/atheletebridge/index.d.cts +2 -2
  31. package/dist/modules/atheletebridge/index.d.ts +2 -2
  32. package/dist/modules/atheletebridge/index.js +1 -1
  33. package/dist/modules/auth/index.cjs +1027 -0
  34. package/dist/modules/auth/index.cjs.map +1 -1
  35. package/dist/modules/auth/index.d.cts +2 -2
  36. package/dist/modules/auth/index.d.ts +2 -2
  37. package/dist/modules/auth/index.js +1030 -3
  38. package/dist/modules/auth/index.js.map +1 -1
  39. package/dist/modules/billing/index.cjs +29 -14
  40. package/dist/modules/billing/index.cjs.map +1 -1
  41. package/dist/modules/billing/index.d.cts +2 -2
  42. package/dist/modules/billing/index.d.ts +2 -2
  43. package/dist/modules/billing/index.js +30 -15
  44. package/dist/modules/billing/index.js.map +1 -1
  45. package/dist/modules/brainyrich/index.d.cts +2 -2
  46. package/dist/modules/brainyrich/index.d.ts +2 -2
  47. package/dist/modules/brainyrich/index.js +1 -1
  48. package/dist/modules/buildmyiq/index.d.cts +2 -2
  49. package/dist/modules/buildmyiq/index.d.ts +2 -2
  50. package/dist/modules/buildmyiq/index.js +1 -1
  51. package/dist/modules/channels/index.d.cts +2 -2
  52. package/dist/modules/channels/index.d.ts +2 -2
  53. package/dist/modules/channels/index.js +1 -1
  54. package/dist/modules/collabkin/index.d.cts +2 -2
  55. package/dist/modules/collabkin/index.d.ts +2 -2
  56. package/dist/modules/collabkin/index.js +1 -1
  57. package/dist/modules/comradecircle/index.d.cts +2 -2
  58. package/dist/modules/comradecircle/index.d.ts +2 -2
  59. package/dist/modules/comradecircle/index.js +1 -1
  60. package/dist/modules/conversations/index.d.cts +2 -2
  61. package/dist/modules/conversations/index.d.ts +2 -2
  62. package/dist/modules/conversations/index.js +1 -1
  63. package/dist/modules/coolandlovely/index.d.cts +2 -2
  64. package/dist/modules/coolandlovely/index.d.ts +2 -2
  65. package/dist/modules/coolandlovely/index.js +1 -1
  66. package/dist/modules/cosmicintersection/index.d.cts +2 -2
  67. package/dist/modules/cosmicintersection/index.d.ts +2 -2
  68. package/dist/modules/cosmicintersection/index.js +1 -1
  69. package/dist/modules/crewfoundry/index.d.cts +2 -2
  70. package/dist/modules/crewfoundry/index.d.ts +2 -2
  71. package/dist/modules/crewfoundry/index.js +1 -1
  72. package/dist/modules/devportal/index.d.cts +2 -2
  73. package/dist/modules/devportal/index.d.ts +2 -2
  74. package/dist/modules/devportal/index.js +1 -1
  75. package/dist/modules/ecoimpacthub/index.d.cts +2 -2
  76. package/dist/modules/ecoimpacthub/index.d.ts +2 -2
  77. package/dist/modules/ecoimpacthub/index.js +1 -1
  78. package/dist/modules/eventfullymanaged/index.d.cts +2 -2
  79. package/dist/modules/eventfullymanaged/index.d.ts +2 -2
  80. package/dist/modules/eventfullymanaged/index.js +1 -1
  81. package/dist/modules/export/index.d.cts +2 -2
  82. package/dist/modules/export/index.d.ts +2 -2
  83. package/dist/modules/export/index.js +1 -1
  84. package/dist/modules/files/index.d.cts +2 -2
  85. package/dist/modules/files/index.d.ts +2 -2
  86. package/dist/modules/files/index.js +1 -1
  87. package/dist/modules/fluidgrids/index.d.cts +2 -2
  88. package/dist/modules/fluidgrids/index.d.ts +2 -2
  89. package/dist/modules/fluidgrids/index.js +1 -1
  90. package/dist/modules/ggnomad/index.d.cts +2 -2
  91. package/dist/modules/ggnomad/index.d.ts +2 -2
  92. package/dist/modules/ggnomad/index.js +1 -1
  93. package/dist/modules/govcitizenhub/index.d.cts +2 -2
  94. package/dist/modules/govcitizenhub/index.d.ts +2 -2
  95. package/dist/modules/govcitizenhub/index.js +1 -1
  96. package/dist/modules/groups/index.d.cts +2 -2
  97. package/dist/modules/groups/index.d.ts +2 -2
  98. package/dist/modules/groups/index.js +1 -1
  99. package/dist/modules/headshotmarketing/index.d.cts +2 -2
  100. package/dist/modules/headshotmarketing/index.d.ts +2 -2
  101. package/dist/modules/headshotmarketing/index.js +1 -1
  102. package/dist/modules/health/index.d.cts +2 -2
  103. package/dist/modules/health/index.d.ts +2 -2
  104. package/dist/modules/health/index.js +1 -1
  105. package/dist/modules/hookmovies/index.d.cts +2 -2
  106. package/dist/modules/hookmovies/index.d.ts +2 -2
  107. package/dist/modules/hookmovies/index.js +1 -1
  108. package/dist/modules/housingvista/index.d.cts +2 -2
  109. package/dist/modules/housingvista/index.d.ts +2 -2
  110. package/dist/modules/housingvista/index.js +1 -1
  111. package/dist/modules/integrations/index.d.cts +2 -2
  112. package/dist/modules/integrations/index.d.ts +2 -2
  113. package/dist/modules/integrations/index.js +1 -1
  114. package/dist/modules/intelwatchtower/index.d.cts +2 -2
  115. package/dist/modules/intelwatchtower/index.d.ts +2 -2
  116. package/dist/modules/intelwatchtower/index.js +1 -1
  117. package/dist/modules/kadaikodi/index.d.cts +2 -2
  118. package/dist/modules/kadaikodi/index.d.ts +2 -2
  119. package/dist/modules/kadaikodi/index.js +1 -1
  120. package/dist/modules/labsofscience/index.d.cts +2 -2
  121. package/dist/modules/labsofscience/index.d.ts +2 -2
  122. package/dist/modules/labsofscience/index.js +1 -1
  123. package/dist/modules/manufacturedops/index.d.cts +2 -2
  124. package/dist/modules/manufacturedops/index.d.ts +2 -2
  125. package/dist/modules/manufacturedops/index.js +1 -1
  126. package/dist/modules/movethewheels/index.d.cts +2 -2
  127. package/dist/modules/movethewheels/index.d.ts +2 -2
  128. package/dist/modules/movethewheels/index.js +1 -1
  129. package/dist/modules/mybodyshield/index.d.cts +2 -2
  130. package/dist/modules/mybodyshield/index.d.ts +2 -2
  131. package/dist/modules/mybodyshield/index.js +1 -1
  132. package/dist/modules/notifications/index.d.cts +2 -2
  133. package/dist/modules/notifications/index.d.ts +2 -2
  134. package/dist/modules/notifications/index.js +1 -1
  135. package/dist/modules/organizations/index.d.cts +2 -2
  136. package/dist/modules/organizations/index.d.ts +2 -2
  137. package/dist/modules/organizations/index.js +1 -1
  138. package/dist/modules/planmagnet/index.d.cts +2 -2
  139. package/dist/modules/planmagnet/index.d.ts +2 -2
  140. package/dist/modules/planmagnet/index.js +1 -1
  141. package/dist/modules/products/index.d.cts +2 -2
  142. package/dist/modules/products/index.d.ts +2 -2
  143. package/dist/modules/products/index.js +1 -1
  144. package/dist/modules/proserviceworld/index.d.cts +2 -2
  145. package/dist/modules/proserviceworld/index.d.ts +2 -2
  146. package/dist/modules/proserviceworld/index.js +1 -1
  147. package/dist/modules/rbac/index.d.cts +2 -2
  148. package/dist/modules/rbac/index.d.ts +2 -2
  149. package/dist/modules/rbac/index.js +1 -1
  150. package/dist/modules/sandbox/index.d.cts +2 -2
  151. package/dist/modules/sandbox/index.d.ts +2 -2
  152. package/dist/modules/sandbox/index.js +1 -1
  153. package/dist/modules/scheduler/index.d.cts +2 -2
  154. package/dist/modules/scheduler/index.d.ts +2 -2
  155. package/dist/modules/scheduler/index.js +1 -1
  156. package/dist/modules/security/index.d.cts +2 -2
  157. package/dist/modules/security/index.d.ts +2 -2
  158. package/dist/modules/security/index.js +1 -1
  159. package/dist/modules/semanticfed/index.d.cts +2 -2
  160. package/dist/modules/semanticfed/index.d.ts +2 -2
  161. package/dist/modules/semanticfed/index.js +1 -1
  162. package/dist/modules/store/index.d.cts +2 -2
  163. package/dist/modules/store/index.d.ts +2 -2
  164. package/dist/modules/store/index.js +1 -1
  165. package/dist/modules/subscriberbot/index.d.cts +2 -2
  166. package/dist/modules/subscriberbot/index.d.ts +2 -2
  167. package/dist/modules/subscriberbot/index.js +1 -1
  168. package/dist/modules/support/index.d.cts +2 -2
  169. package/dist/modules/support/index.d.ts +2 -2
  170. package/dist/modules/support/index.js +1 -1
  171. package/dist/modules/tags/index.d.cts +2 -2
  172. package/dist/modules/tags/index.d.ts +2 -2
  173. package/dist/modules/tags/index.js +1 -1
  174. package/dist/modules/technospam/index.d.cts +2 -2
  175. package/dist/modules/technospam/index.d.ts +2 -2
  176. package/dist/modules/technospam/index.js +1 -1
  177. package/dist/modules/theculturepost/index.d.cts +2 -2
  178. package/dist/modules/theculturepost/index.d.ts +2 -2
  179. package/dist/modules/theculturepost/index.js +1 -1
  180. package/dist/modules/theglobalfuel/index.d.cts +2 -2
  181. package/dist/modules/theglobalfuel/index.d.ts +2 -2
  182. package/dist/modules/theglobalfuel/index.js +1 -1
  183. package/dist/modules/timecampus/index.d.cts +2 -2
  184. package/dist/modules/timecampus/index.d.ts +2 -2
  185. package/dist/modules/timecampus/index.js +1 -1
  186. package/dist/modules/tours/index.cjs +1 -2
  187. package/dist/modules/tours/index.cjs.map +1 -1
  188. package/dist/modules/tours/index.d.cts +2 -2
  189. package/dist/modules/tours/index.d.ts +2 -2
  190. package/dist/modules/tours/index.js +2 -3
  191. package/dist/modules/tours/index.js.map +1 -1
  192. package/dist/modules/vibecontrols/index.d.cts +2 -2
  193. package/dist/modules/vibecontrols/index.d.ts +2 -2
  194. package/dist/modules/vibecontrols/index.js +2 -2
  195. package/dist/modules/workspaces/index.cjs +56 -167
  196. package/dist/modules/workspaces/index.cjs.map +1 -1
  197. package/dist/modules/workspaces/index.d.cts +2 -2
  198. package/dist/modules/workspaces/index.d.ts +2 -2
  199. package/dist/modules/workspaces/index.js +57 -168
  200. package/dist/modules/workspaces/index.js.map +1 -1
  201. package/dist/{tool-name-nso0HFYX.d.ts → tool-name-BFdQwYrv.d.ts} +2 -2
  202. package/dist/{tool-name-DYWaobFF.d.cts → tool-name-DzP7TA0l.d.cts} +2 -2
  203. package/dist/transports/index.d.cts +2 -2
  204. package/dist/transports/index.d.ts +2 -2
  205. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/modules/auth/legacy-auth.ts"],"names":[],"mappings":"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","file":"chunk-QQYJVKJE.js","sourcesContent":["/**\n * Auth helper for the auth module — ports VibeControlsMCPAuth from\n * vibecontrols-mcp/src/auth/index.ts to a ctx-aware factory.\n *\n * Differences from the legacy class:\n * - Per-ctx instance (no module-level singleton; each product MCP gets its own)\n * - Token persistence delegated to ctx.auth (StoredAuth file)\n * - Endpoints + clientId resolved via ctx.config.resolveOIDC + ctx.config.read\n * - pendingDeviceCode kept in closure scope (alive for the MCP server process,\n * suitable for stdio's lifetime; HTTP's per-session servers each get their own\n * pending state)\n *\n * Public surface mirrors the legacy class so the lifted auth/tools.ts works\n * without modification: startLogin / completeLogin / selectWorkspace /\n * listWorkspaces / getStatus / logout / ensureAuthenticated / getHeaders /\n * isLoggedIn / setOnTokensChanged.\n */\n\nimport type { McpContext } from '../../core/index.js';\nimport { fetchWorkspaces, issueWorkspaceToken } from '../../core/auth/device-code.js';\n\ninterface PendingDeviceCode {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string | null;\n expiresAt: number;\n interval: number;\n clientId: string;\n tokenUrl: string;\n}\n\nexport interface WorkspaceInfo {\n id: string;\n name: string;\n slug: string;\n tenantId: string;\n organizationId: string;\n}\n\nexport interface LoginStartResult {\n status: 'device_code_issued';\n verificationUri: string;\n verificationUriComplete: string | null;\n userCode: string;\n expiresIn: number;\n message: string;\n}\n\nexport interface LoginCompleteResult {\n status: 'authenticated' | 'workspace_selection_required' | 'pending' | 'expired';\n message: string;\n workspaces?: WorkspaceInfo[];\n}\n\nexport interface AuthHelper {\n startLogin(): Promise<LoginStartResult>;\n completeLogin(): Promise<LoginCompleteResult>;\n selectWorkspace(workspaceId: string, organizationId: string): Promise<void>;\n listWorkspaces(): Promise<WorkspaceInfo[]>;\n ensureAuthenticated(): Promise<void>;\n getStatus(): Promise<{\n authenticated: boolean;\n method: string;\n expiresAt: string | null;\n workspaceId: string | null;\n organizationId: string | null;\n workspaceTokenExpiresAt: string | null;\n hasWorkspaceToken: boolean;\n hasPendingLogin: boolean;\n }>;\n logout(): Promise<void>;\n getHeaders(): Record<string, string>;\n isLoggedIn(): boolean;\n setOnTokensChanged(cb: () => void): void;\n}\n\nconst helpers = new WeakMap<McpContext, AuthHelper>();\n\nexport function getAuth(ctx: McpContext): AuthHelper {\n const cached = helpers.get(ctx);\n if (cached) return cached;\n const helper = createAuthHelper(ctx);\n helpers.set(ctx, helper);\n return helper;\n}\n\nfunction createAuthHelper(ctx: McpContext): AuthHelper {\n let pending: PendingDeviceCode | null = null;\n let onTokensChanged: (() => void) | null = null;\n let refreshInProgress: Promise<void> | null = null;\n\n function notify(): void {\n onTokensChanged?.();\n }\n\n async function startLogin(): Promise<LoginStartResult> {\n const { oidcIssuer, clientId } = ctx.config.resolveOIDC();\n const deviceCodeUrl = `${oidcIssuer}/oidc/device/code`;\n const tokenUrl = `${oidcIssuer}/oauth/device/token`;\n\n const response = await fetch(deviceCodeUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: clientId,\n scope: 'openid profile email offline_access',\n }).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 const deviceCode = data['device_code'] as string;\n const userCode = data['user_code'] as string;\n const verificationUri = data['verification_uri'] as string;\n const verificationUriComplete = (data['verification_uri_complete'] as string) ?? null;\n const expiresIn = (data['expires_in'] as number) ?? 900;\n const interval = (data['interval'] as number) ?? 5;\n\n pending = {\n deviceCode,\n userCode,\n verificationUri,\n verificationUriComplete,\n expiresAt: Date.now() + expiresIn * 1000,\n interval,\n clientId,\n tokenUrl,\n };\n\n return {\n status: 'device_code_issued',\n verificationUri,\n verificationUriComplete,\n userCode,\n expiresIn,\n message: `Open ${verificationUriComplete ?? verificationUri} in a browser and enter code: ${userCode}. Then call ${ctx.productName}_auth_complete to finish authentication.`,\n };\n }\n\n async function completeLogin(): Promise<LoginCompleteResult> {\n if (!pending) {\n throw new Error(\n `No pending login flow. Call ${ctx.productName}_auth_login first to start the device code flow.`,\n );\n }\n\n const p = pending;\n if (Date.now() >= p.expiresAt) {\n pending = null;\n return {\n status: 'expired',\n message: `Device code has expired. Call ${ctx.productName}_auth_login again to get a new code.`,\n };\n }\n\n const response = await fetch(p.tokenUrl, {\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: p.deviceCode,\n client_id: p.clientId,\n }).toString(),\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (response.ok && data['access_token']) {\n pending = null;\n const expiresIn = (data['expires_in'] as number) ?? 3600;\n const auth = ctx.auth.read() ?? { accessToken: '', refreshToken: '' };\n ctx.auth.write({\n ...auth,\n accessToken: data['access_token'] as string,\n refreshToken: (data['refresh_token'] as string) ?? '',\n expiresAt: Date.now() + expiresIn * 1000,\n authMethod: 'device_code',\n });\n ctx.gql.reset();\n return await handlePostLogin();\n }\n\n const errorCode = data['error'] as string | undefined;\n if (errorCode === 'authorization_pending') {\n return {\n status: 'pending',\n message: `Still waiting for user to authorize. Open ${p.verificationUriComplete ?? p.verificationUri} and enter code: ${p.userCode}. Then call ${ctx.productName}_auth_complete again.`,\n };\n } else if (errorCode === 'slow_down') {\n p.interval += 5;\n return {\n status: 'pending',\n message: `Authorization server asked to slow down. Wait a moment, then call ${ctx.productName}_auth_complete again.`,\n };\n } else if (errorCode === 'expired_token') {\n pending = null;\n return {\n status: 'expired',\n message: `Device code has expired. Call ${ctx.productName}_auth_login again.`,\n };\n } else if (errorCode === 'access_denied') {\n pending = null;\n throw new Error('Authorization was denied by the user.');\n } else {\n pending = null;\n throw new Error(\n `Device code error: ${(data['error_description'] as string) ?? errorCode ?? 'Unknown'}`,\n );\n }\n }\n\n async function handlePostLogin(): Promise<LoginCompleteResult> {\n try {\n const workspaces = await listWorkspaces();\n if (workspaces.length === 0) {\n notify();\n ctx.logger.info('Device code login successful (no workspaces found)');\n return {\n status: 'authenticated',\n message: `Authentication successful. No workspaces found — use ${ctx.productName}_auth_select_workspace when one is available.`,\n };\n }\n if (workspaces.length === 1) {\n const ws = workspaces[0];\n if (!ws)\n throw new Error('Unexpected: workspaces.length === 1 but workspaces[0] is undefined');\n await issueAndStoreWorkspaceToken(ws.id, ws.organizationId);\n ctx.logger.info('Device code login successful', {\n workspaceId: ws.id,\n workspaceName: ws.name,\n });\n return {\n status: 'authenticated',\n message: `Authentication successful. Workspace \"${ws.name}\" selected automatically.`,\n };\n }\n notify();\n ctx.logger.info('Device code login successful, workspace selection needed');\n return {\n status: 'workspace_selection_required',\n message: `Authentication successful. ${workspaces.length} workspaces available — call ${ctx.productName}_auth_select_workspace to choose one.`,\n workspaces,\n };\n } catch (wsError) {\n notify();\n ctx.logger.warn('Workspace discovery failed after login', {\n error: wsError instanceof Error ? wsError.message : String(wsError),\n });\n return {\n status: 'authenticated',\n message: `Authentication successful. Workspace discovery failed: ${wsError instanceof Error ? wsError.message : String(wsError)}`,\n };\n }\n }\n\n async function listWorkspaces(): Promise<WorkspaceInfo[]> {\n const auth = ctx.auth.read();\n if (!auth?.accessToken) throw new Error('Not authenticated. Please login first.');\n return fetchWorkspaces(ctx.config.read().globalEndpoint, auth.accessToken);\n }\n\n async function issueAndStoreWorkspaceToken(\n workspaceId: string,\n organizationId: string,\n ): Promise<void> {\n const auth = ctx.auth.read();\n if (!auth?.accessToken) throw new Error('Not authenticated.');\n const result = await issueWorkspaceToken(\n ctx.config.read().workspaceEndpoint,\n auth.accessToken,\n workspaceId,\n organizationId,\n );\n ctx.auth.write({\n ...auth,\n workspaceToken: result.token,\n workspaceTokenExpiresAt: new Date(result.expiresAt).getTime(),\n workspaceId,\n organizationId,\n });\n ctx.gql.reset();\n notify();\n }\n\n async function selectWorkspace(workspaceId: string, organizationId: string): Promise<void> {\n const auth = ctx.auth.read();\n if (!auth?.accessToken) throw new Error('Not authenticated. Please login first.');\n await issueAndStoreWorkspaceToken(workspaceId, organizationId);\n ctx.logger.info('Workspace selected', { workspaceId });\n }\n\n async function ensureAuthenticated(): Promise<void> {\n if (refreshInProgress) {\n await refreshInProgress;\n return;\n }\n const doEnsure = async (): Promise<void> => {\n const auth = ctx.auth.read();\n if (auth?.apiKey) return;\n if (!auth?.accessToken) {\n throw new Error(\n `Not authenticated. Call ${ctx.productName}_auth_login to start the login flow, then ${ctx.productName}_auth_complete after authorizing in the browser.`,\n );\n }\n // The shared gql client handles refresh via isTokenExpiringSoon + isWorkspaceTokenExpiringSoon —\n // trigger by issuing a no-op request that goes through the workspace client's refresh path.\n // We simulate a no-op via a cheap query if needed; today the gql wrapper does it lazily,\n // so we just delegate to it on the next request. Nothing to do here.\n };\n refreshInProgress = doEnsure().finally(() => {\n refreshInProgress = null;\n });\n await refreshInProgress;\n }\n\n function getStatus(): Promise<{\n authenticated: boolean;\n method: string;\n expiresAt: string | null;\n workspaceId: string | null;\n organizationId: string | null;\n workspaceTokenExpiresAt: string | null;\n hasWorkspaceToken: boolean;\n hasPendingLogin: boolean;\n }> {\n const auth = ctx.auth.read();\n return Promise.resolve({\n authenticated: !!(auth?.accessToken || auth?.apiKey),\n method: auth?.apiKey ? 'api_key' : auth?.accessToken ? 'oauth_token' : 'none',\n expiresAt: auth?.expiresAt ? new Date(auth.expiresAt).toISOString() : null,\n workspaceId: auth?.workspaceId ?? null,\n organizationId: auth?.organizationId ?? null,\n workspaceTokenExpiresAt: auth?.workspaceTokenExpiresAt\n ? new Date(auth.workspaceTokenExpiresAt).toISOString()\n : null,\n hasWorkspaceToken: !!auth?.workspaceToken,\n hasPendingLogin: !!pending,\n });\n }\n\n async function logout(): Promise<void> {\n pending = null;\n ctx.auth.clear();\n ctx.gql.reset();\n notify();\n ctx.logger.info('Logged out and cleared stored tokens');\n }\n\n function getHeaders(): Record<string, string> {\n const auth = ctx.auth.read();\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?.workspaceToken)\n headers['X-Workspace-Authorization'] = `Bearer ${auth.workspaceToken}`;\n if (auth?.organizationId) headers['x-org-id'] = auth.organizationId;\n if (auth?.workspaceId) headers['x-workspace-id'] = auth.workspaceId;\n return headers;\n }\n\n function isLoggedIn(): boolean {\n const auth = ctx.auth.read();\n return !!(auth?.accessToken || auth?.apiKey);\n }\n\n function setOnTokensChanged(cb: () => void): void {\n onTokensChanged = cb;\n }\n\n return {\n startLogin,\n completeLogin,\n selectWorkspace,\n listWorkspaces,\n ensureAuthenticated,\n getStatus,\n logout,\n getHeaders,\n isLoggedIn,\n setOnTokensChanged,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/modules/auth/legacy-auth.ts"],"names":[],"mappings":";;;AA6EA,IAAM,OAAA,uBAAc,OAAA,EAAgC;AAE7C,SAAS,QAAQ,GAAA,EAA6B;AACnD,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC9B,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAG,CAAA;AACnC,EAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAM,CAAA;AACvB,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,GAAA,EAA6B;AACrD,EAAA,IAAI,OAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,eAAA,GAAuC,IAAA;AAC3C,EAAA,IAAI,iBAAA,GAA0C,IAAA;AAE9C,EAAA,SAAS,MAAA,GAAe;AACtB,IAAA,eAAA,IAAkB;AAAA,EACpB;AAEA,EAAA,eAAe,UAAA,GAAwC;AACrD,IAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,GAAA,CAAI,OAAO,WAAA,EAAY;AACxD,IAAA,MAAM,aAAA,GAAgB,GAAG,UAAU,CAAA,iBAAA,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,GAAG,UAAU,CAAA,mBAAA,CAAA;AAE9B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,aAAA,EAAe;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,IAAA,EAAM,IAAI,eAAA,CAAgB;AAAA,QACxB,SAAA,EAAW,QAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACR,EAAE,QAAA;AAAS,KACb,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,eAAe,CAAA;AAC9D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAS,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,UAAA,GAAa,KAAK,aAAa,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAK,WAAW,CAAA;AACjC,IAAA,MAAM,eAAA,GAAkB,KAAK,kBAAkB,CAAA;AAC/C,IAAA,MAAM,uBAAA,GAA2B,IAAA,CAAK,2BAA2B,CAAA,IAAgB,IAAA;AACjF,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,YAAY,CAAA,IAAgB,GAAA;AACpD,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,UAAU,CAAA,IAAgB,CAAA;AAEjD,IAAA,OAAA,GAAU;AAAA,MACR,UAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA,uBAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,GAAA;AAAA,MACpC,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,oBAAA;AAAA,MACR,eAAA;AAAA,MACA,uBAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAS,QAAQ,uBAAA,IAA2B,eAAe,iCAAiC,QAAQ,CAAA,YAAA,EAAe,IAAI,WAAW,CAAA,wCAAA;AAAA,KACpI;AAAA,EACF;AAEA,EAAA,eAAe,aAAA,GAA8C;AAC3D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,4BAAA,EAA+B,IAAI,WAAW,CAAA,gDAAA;AAAA,OAChD;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,OAAA;AACV,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,IAAK,CAAA,CAAE,SAAA,EAAW;AAC7B,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAA,8BAAA,EAAiC,GAAA,CAAI,WAAW,CAAA,oCAAA;AAAA,OAC3D;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,CAAE,QAAA,EAAU;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,IAAA,EAAM,IAAI,eAAA,CAAgB;AAAA,QACxB,UAAA,EAAY,8CAAA;AAAA,QACZ,aAAa,CAAA,CAAE,UAAA;AAAA,QACf,WAAW,CAAA,CAAE;AAAA,OACd,EAAE,QAAA;AAAS,KACb,CAAA;AAED,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,IAAA,IAAI,QAAA,CAAS,EAAA,IAAM,IAAA,CAAK,cAAc,CAAA,EAAG;AACvC,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,SAAA,GAAa,IAAA,CAAK,YAAY,CAAA,IAAgB,IAAA;AACpD,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,MAAU,EAAE,WAAA,EAAa,EAAA,EAAI,YAAA,EAAc,EAAA,EAAG;AACpE,MAAA,GAAA,CAAI,KAAK,KAAA,CAAM;AAAA,QACb,GAAG,IAAA;AAAA,QACH,WAAA,EAAa,KAAK,cAAc,CAAA;AAAA,QAChC,YAAA,EAAe,IAAA,CAAK,eAAe,CAAA,IAAgB,EAAA;AAAA,QACnD,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,GAAA;AAAA,QACpC,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,GAAA,CAAI,IAAI,KAAA,EAAM;AACd,MAAA,OAAO,MAAM,eAAA,EAAgB;AAAA,IAC/B;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,OAAO,CAAA;AAC9B,IAAA,IAAI,cAAc,uBAAA,EAAyB;AACzC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAA,0CAAA,EAA6C,CAAA,CAAE,uBAAA,IAA2B,CAAA,CAAE,eAAe,CAAA,iBAAA,EAAoB,CAAA,CAAE,QAAQ,CAAA,YAAA,EAAe,GAAA,CAAI,WAAW,CAAA,qBAAA;AAAA,OAClK;AAAA,IACF,CAAA,MAAA,IAAW,cAAc,WAAA,EAAa;AACpC,MAAA,CAAA,CAAE,QAAA,IAAY,CAAA;AACd,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAA,kEAAA,EAAqE,GAAA,CAAI,WAAW,CAAA,qBAAA;AAAA,OAC/F;AAAA,IACF,CAAA,MAAA,IAAW,cAAc,eAAA,EAAiB;AACxC,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAA,8BAAA,EAAiC,GAAA,CAAI,WAAW,CAAA,kBAAA;AAAA,OAC3D;AAAA,IACF,CAAA,MAAA,IAAW,cAAc,eAAA,EAAiB;AACxC,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,mBAAA,EAAuB,IAAA,CAAK,mBAAmB,CAAA,IAAgB,aAAa,SAAS,CAAA;AAAA,OACvF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAe,eAAA,GAAgD;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAA,EAAO;AACP,QAAA,GAAA,CAAI,MAAA,CAAO,KAAK,oDAAoD,CAAA;AACpE,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAS,CAAA,0DAAA,EAAwD,GAAA,CAAI,WAAW,CAAA,6CAAA;AAAA,SAClF;AAAA,MACF;AACA,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,EAAA,GAAK,WAAW,CAAC,CAAA;AACvB,QAAA,IAAI,CAAC,EAAA;AACH,UAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AACtF,QAAA,MAAM,2BAAA,CAA4B,EAAA,CAAG,EAAA,EAAI,EAAA,CAAG,cAAc,CAAA;AAC1D,QAAA,GAAA,CAAI,MAAA,CAAO,KAAK,8BAAA,EAAgC;AAAA,UAC9C,aAAa,EAAA,CAAG,EAAA;AAAA,UAChB,eAAe,EAAA,CAAG;AAAA,SACnB,CAAA;AACD,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAS,CAAA,sCAAA,EAAyC,EAAA,CAAG,IAAI,CAAA,yBAAA;AAAA,SAC3D;AAAA,MACF;AACA,MAAA,MAAA,EAAO;AACP,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,0DAA0D,CAAA;AAC1E,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,8BAAA;AAAA,QACR,SAAS,CAAA,2BAAA,EAA8B,UAAA,CAAW,MAAM,CAAA,kCAAA,EAAgC,IAAI,WAAW,CAAA,qCAAA,CAAA;AAAA,QACvG;AAAA,OACF;AAAA,IACF,SAAS,OAAA,EAAS;AAChB,MAAA,MAAA,EAAO;AACP,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,wCAAA,EAA0C;AAAA,QACxD,OAAO,OAAA,YAAmB,KAAA,GAAQ,OAAA,CAAQ,OAAA,GAAU,OAAO,OAAO;AAAA,OACnE,CAAA;AACD,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,eAAA;AAAA,QACR,OAAA,EAAS,0DAA0D,OAAA,YAAmB,KAAA,GAAQ,QAAQ,OAAA,GAAU,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,OACjI;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAe,cAAA,GAA2C;AACxD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM,WAAA,EAAa,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAChF,IAAA,OAAO,gBAAgB,GAAA,CAAI,MAAA,CAAO,MAAK,CAAE,cAAA,EAAgB,KAAK,WAAW,CAAA;AAAA,EAC3E;AAEA,EAAA,eAAe,2BAAA,CACb,aACA,cAAA,EACe;AACf,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM,WAAA,EAAa,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAC5D,IAAA,MAAM,SAAS,MAAM,mBAAA;AAAA,MACnB,GAAA,CAAI,MAAA,CAAO,IAAA,EAAK,CAAE,iBAAA;AAAA,MAClB,IAAA,CAAK,WAAA;AAAA,MACL,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,GAAA,CAAI,KAAK,KAAA,CAAM;AAAA,MACb,GAAG,IAAA;AAAA,MACH,gBAAgB,MAAA,CAAO,KAAA;AAAA,MACvB,yBAAyB,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,EAAE,OAAA,EAAQ;AAAA,MAC5D,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,GAAA,CAAI,IAAI,KAAA,EAAM;AACd,IAAA,MAAA,EAAO;AAAA,EACT;AAEA,EAAA,eAAe,eAAA,CAAgB,aAAqB,cAAA,EAAuC;AACzF,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM,WAAA,EAAa,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAChF,IAAA,MAAM,2BAAA,CAA4B,aAAa,cAAc,CAAA;AAC7D,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,aAAa,CAAA;AAAA,EACvD;AAEA,EAAA,eAAe,mBAAA,GAAqC;AAClD,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,iBAAA;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAW,YAA2B;AAC1C,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,MAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,MAAA,IAAI,CAAC,MAAM,WAAA,EAAa;AACtB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,wBAAA,EAA2B,GAAA,CAAI,WAAW,CAAA,0CAAA,EAA6C,IAAI,WAAW,CAAA,gDAAA;AAAA,SACxG;AAAA,MACF;AAAA,IAKF,CAAA;AACA,IAAA,iBAAA,GAAoB,QAAA,EAAS,CAAE,OAAA,CAAQ,MAAM;AAC3C,MAAA,iBAAA,GAAoB,IAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,MAAM,iBAAA;AAAA,EACR;AAEA,EAAA,SAAS,SAAA,GASN;AACD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,IAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,MACrB,aAAA,EAAe,CAAC,EAAE,IAAA,EAAM,eAAe,IAAA,EAAM,MAAA,CAAA;AAAA,MAC7C,QAAQ,IAAA,EAAM,MAAA,GAAS,SAAA,GAAY,IAAA,EAAM,cAAc,aAAA,GAAgB,MAAA;AAAA,MACvE,SAAA,EAAW,MAAM,SAAA,GAAY,IAAI,KAAK,IAAA,CAAK,SAAS,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA;AAAA,MACtE,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,MAClC,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,MACxC,uBAAA,EAAyB,MAAM,uBAAA,GAC3B,IAAI,KAAK,IAAA,CAAK,uBAAuB,CAAA,CAAE,WAAA,EAAY,GACnD,IAAA;AAAA,MACJ,iBAAA,EAAmB,CAAC,CAAC,IAAA,EAAM,cAAA;AAAA,MAC3B,eAAA,EAAiB,CAAC,CAAC;AAAA,KACpB,CAAA;AAAA,EACH;AAEA,EAAA,eAAe,MAAA,GAAwB;AACrC,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,GAAA,CAAI,KAAK,KAAA,EAAM;AACf,IAAA,GAAA,CAAI,IAAI,KAAA,EAAM;AACd,IAAA,MAAA,EAAO;AACP,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,sCAAsC,CAAA;AAAA,EACxD;AAEA,EAAA,SAAS,UAAA,GAAqC;AAC5C,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,IAAI,IAAA,EAAM,MAAA,EAAQ,OAAA,CAAQ,WAAW,IAAI,IAAA,CAAK,MAAA;AAC9C,IAAA,IAAI,MAAM,WAAA,EAAa,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,WAAW,CAAA,CAAA;AAC5E,IAAA,IAAI,IAAA,EAAM,cAAA;AACR,MAAA,OAAA,CAAQ,2BAA2B,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,cAAc,CAAA,CAAA;AACtE,IAAA,IAAI,IAAA,EAAM,cAAA,EAAgB,OAAA,CAAQ,UAAU,IAAI,IAAA,CAAK,cAAA;AACrD,IAAA,IAAI,IAAA,EAAM,WAAA,EAAa,OAAA,CAAQ,gBAAgB,IAAI,IAAA,CAAK,WAAA;AACxD,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,SAAS,UAAA,GAAsB;AAC7B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AAC3B,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,WAAA,IAAe,IAAA,EAAM,MAAA,CAAA;AAAA,EACvC;AAEA,EAAA,SAAS,mBAAmB,EAAA,EAAsB;AAChD,IAAA,eAAA,GAAkB,EAAA;AAAA,EACpB;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-SX6IGKZH.js","sourcesContent":["/**\n * Auth helper for the auth module — ports VibeControlsMCPAuth from\n * vibecontrols-mcp/src/auth/index.ts to a ctx-aware factory.\n *\n * Differences from the legacy class:\n * - Per-ctx instance (no module-level singleton; each product MCP gets its own)\n * - Token persistence delegated to ctx.auth (StoredAuth file)\n * - Endpoints + clientId resolved via ctx.config.resolveOIDC + ctx.config.read\n * - pendingDeviceCode kept in closure scope (alive for the MCP server process,\n * suitable for stdio's lifetime; HTTP's per-session servers each get their own\n * pending state)\n *\n * Public surface mirrors the legacy class so the lifted auth/tools.ts works\n * without modification: startLogin / completeLogin / selectWorkspace /\n * listWorkspaces / getStatus / logout / ensureAuthenticated / getHeaders /\n * isLoggedIn / setOnTokensChanged.\n */\n\nimport type { McpContext } from '../../core/index.js';\nimport { fetchWorkspaces, issueWorkspaceToken } from '../../core/auth/device-code.js';\n\ninterface PendingDeviceCode {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string | null;\n expiresAt: number;\n interval: number;\n clientId: string;\n tokenUrl: string;\n}\n\nexport interface WorkspaceInfo {\n id: string;\n name: string;\n slug: string;\n tenantId: string;\n organizationId: string;\n}\n\nexport interface LoginStartResult {\n status: 'device_code_issued';\n verificationUri: string;\n verificationUriComplete: string | null;\n userCode: string;\n expiresIn: number;\n message: string;\n}\n\nexport interface LoginCompleteResult {\n status: 'authenticated' | 'workspace_selection_required' | 'pending' | 'expired';\n message: string;\n workspaces?: WorkspaceInfo[];\n}\n\nexport interface AuthHelper {\n startLogin(): Promise<LoginStartResult>;\n completeLogin(): Promise<LoginCompleteResult>;\n selectWorkspace(workspaceId: string, organizationId: string): Promise<void>;\n listWorkspaces(): Promise<WorkspaceInfo[]>;\n ensureAuthenticated(): Promise<void>;\n getStatus(): Promise<{\n authenticated: boolean;\n method: string;\n expiresAt: string | null;\n workspaceId: string | null;\n organizationId: string | null;\n workspaceTokenExpiresAt: string | null;\n hasWorkspaceToken: boolean;\n hasPendingLogin: boolean;\n }>;\n logout(): Promise<void>;\n getHeaders(): Record<string, string>;\n isLoggedIn(): boolean;\n setOnTokensChanged(cb: () => void): void;\n}\n\nconst helpers = new WeakMap<McpContext, AuthHelper>();\n\nexport function getAuth(ctx: McpContext): AuthHelper {\n const cached = helpers.get(ctx);\n if (cached) return cached;\n const helper = createAuthHelper(ctx);\n helpers.set(ctx, helper);\n return helper;\n}\n\nfunction createAuthHelper(ctx: McpContext): AuthHelper {\n let pending: PendingDeviceCode | null = null;\n let onTokensChanged: (() => void) | null = null;\n let refreshInProgress: Promise<void> | null = null;\n\n function notify(): void {\n onTokensChanged?.();\n }\n\n async function startLogin(): Promise<LoginStartResult> {\n const { oidcIssuer, clientId } = ctx.config.resolveOIDC();\n const deviceCodeUrl = `${oidcIssuer}/oidc/device/code`;\n const tokenUrl = `${oidcIssuer}/oauth/device/token`;\n\n const response = await fetch(deviceCodeUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: clientId,\n scope: 'openid profile email offline_access',\n }).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 const deviceCode = data['device_code'] as string;\n const userCode = data['user_code'] as string;\n const verificationUri = data['verification_uri'] as string;\n const verificationUriComplete = (data['verification_uri_complete'] as string) ?? null;\n const expiresIn = (data['expires_in'] as number) ?? 900;\n const interval = (data['interval'] as number) ?? 5;\n\n pending = {\n deviceCode,\n userCode,\n verificationUri,\n verificationUriComplete,\n expiresAt: Date.now() + expiresIn * 1000,\n interval,\n clientId,\n tokenUrl,\n };\n\n return {\n status: 'device_code_issued',\n verificationUri,\n verificationUriComplete,\n userCode,\n expiresIn,\n message: `Open ${verificationUriComplete ?? verificationUri} in a browser and enter code: ${userCode}. Then call ${ctx.productName}_auth_complete to finish authentication.`,\n };\n }\n\n async function completeLogin(): Promise<LoginCompleteResult> {\n if (!pending) {\n throw new Error(\n `No pending login flow. Call ${ctx.productName}_auth_login first to start the device code flow.`,\n );\n }\n\n const p = pending;\n if (Date.now() >= p.expiresAt) {\n pending = null;\n return {\n status: 'expired',\n message: `Device code has expired. Call ${ctx.productName}_auth_login again to get a new code.`,\n };\n }\n\n const response = await fetch(p.tokenUrl, {\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: p.deviceCode,\n client_id: p.clientId,\n }).toString(),\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (response.ok && data['access_token']) {\n pending = null;\n const expiresIn = (data['expires_in'] as number) ?? 3600;\n const auth = ctx.auth.read() ?? { accessToken: '', refreshToken: '' };\n ctx.auth.write({\n ...auth,\n accessToken: data['access_token'] as string,\n refreshToken: (data['refresh_token'] as string) ?? '',\n expiresAt: Date.now() + expiresIn * 1000,\n authMethod: 'device_code',\n });\n ctx.gql.reset();\n return await handlePostLogin();\n }\n\n const errorCode = data['error'] as string | undefined;\n if (errorCode === 'authorization_pending') {\n return {\n status: 'pending',\n message: `Still waiting for user to authorize. Open ${p.verificationUriComplete ?? p.verificationUri} and enter code: ${p.userCode}. Then call ${ctx.productName}_auth_complete again.`,\n };\n } else if (errorCode === 'slow_down') {\n p.interval += 5;\n return {\n status: 'pending',\n message: `Authorization server asked to slow down. Wait a moment, then call ${ctx.productName}_auth_complete again.`,\n };\n } else if (errorCode === 'expired_token') {\n pending = null;\n return {\n status: 'expired',\n message: `Device code has expired. Call ${ctx.productName}_auth_login again.`,\n };\n } else if (errorCode === 'access_denied') {\n pending = null;\n throw new Error('Authorization was denied by the user.');\n } else {\n pending = null;\n throw new Error(\n `Device code error: ${(data['error_description'] as string) ?? errorCode ?? 'Unknown'}`,\n );\n }\n }\n\n async function handlePostLogin(): Promise<LoginCompleteResult> {\n try {\n const workspaces = await listWorkspaces();\n if (workspaces.length === 0) {\n notify();\n ctx.logger.info('Device code login successful (no workspaces found)');\n return {\n status: 'authenticated',\n message: `Authentication successful. No workspaces found — use ${ctx.productName}_auth_select_workspace when one is available.`,\n };\n }\n if (workspaces.length === 1) {\n const ws = workspaces[0];\n if (!ws)\n throw new Error('Unexpected: workspaces.length === 1 but workspaces[0] is undefined');\n await issueAndStoreWorkspaceToken(ws.id, ws.organizationId);\n ctx.logger.info('Device code login successful', {\n workspaceId: ws.id,\n workspaceName: ws.name,\n });\n return {\n status: 'authenticated',\n message: `Authentication successful. Workspace \"${ws.name}\" selected automatically.`,\n };\n }\n notify();\n ctx.logger.info('Device code login successful, workspace selection needed');\n return {\n status: 'workspace_selection_required',\n message: `Authentication successful. ${workspaces.length} workspaces available — call ${ctx.productName}_auth_select_workspace to choose one.`,\n workspaces,\n };\n } catch (wsError) {\n notify();\n ctx.logger.warn('Workspace discovery failed after login', {\n error: wsError instanceof Error ? wsError.message : String(wsError),\n });\n return {\n status: 'authenticated',\n message: `Authentication successful. Workspace discovery failed: ${wsError instanceof Error ? wsError.message : String(wsError)}`,\n };\n }\n }\n\n async function listWorkspaces(): Promise<WorkspaceInfo[]> {\n const auth = ctx.auth.read();\n if (!auth?.accessToken) throw new Error('Not authenticated. Please login first.');\n return fetchWorkspaces(ctx.config.read().globalEndpoint, auth.accessToken);\n }\n\n async function issueAndStoreWorkspaceToken(\n workspaceId: string,\n organizationId: string,\n ): Promise<void> {\n const auth = ctx.auth.read();\n if (!auth?.accessToken) throw new Error('Not authenticated.');\n const result = await issueWorkspaceToken(\n ctx.config.read().workspaceEndpoint,\n auth.accessToken,\n workspaceId,\n organizationId,\n );\n ctx.auth.write({\n ...auth,\n workspaceToken: result.token,\n workspaceTokenExpiresAt: new Date(result.expiresAt).getTime(),\n workspaceId,\n organizationId,\n });\n ctx.gql.reset();\n notify();\n }\n\n async function selectWorkspace(workspaceId: string, organizationId: string): Promise<void> {\n const auth = ctx.auth.read();\n if (!auth?.accessToken) throw new Error('Not authenticated. Please login first.');\n await issueAndStoreWorkspaceToken(workspaceId, organizationId);\n ctx.logger.info('Workspace selected', { workspaceId });\n }\n\n async function ensureAuthenticated(): Promise<void> {\n if (refreshInProgress) {\n await refreshInProgress;\n return;\n }\n const doEnsure = async (): Promise<void> => {\n const auth = ctx.auth.read();\n if (auth?.apiKey) return;\n if (!auth?.accessToken) {\n throw new Error(\n `Not authenticated. Call ${ctx.productName}_auth_login to start the login flow, then ${ctx.productName}_auth_complete after authorizing in the browser.`,\n );\n }\n // The shared gql client handles refresh via isTokenExpiringSoon + isWorkspaceTokenExpiringSoon —\n // trigger by issuing a no-op request that goes through the workspace client's refresh path.\n // We simulate a no-op via a cheap query if needed; today the gql wrapper does it lazily,\n // so we just delegate to it on the next request. Nothing to do here.\n };\n refreshInProgress = doEnsure().finally(() => {\n refreshInProgress = null;\n });\n await refreshInProgress;\n }\n\n function getStatus(): Promise<{\n authenticated: boolean;\n method: string;\n expiresAt: string | null;\n workspaceId: string | null;\n organizationId: string | null;\n workspaceTokenExpiresAt: string | null;\n hasWorkspaceToken: boolean;\n hasPendingLogin: boolean;\n }> {\n const auth = ctx.auth.read();\n return Promise.resolve({\n authenticated: !!(auth?.accessToken || auth?.apiKey),\n method: auth?.apiKey ? 'api_key' : auth?.accessToken ? 'oauth_token' : 'none',\n expiresAt: auth?.expiresAt ? new Date(auth.expiresAt).toISOString() : null,\n workspaceId: auth?.workspaceId ?? null,\n organizationId: auth?.organizationId ?? null,\n workspaceTokenExpiresAt: auth?.workspaceTokenExpiresAt\n ? new Date(auth.workspaceTokenExpiresAt).toISOString()\n : null,\n hasWorkspaceToken: !!auth?.workspaceToken,\n hasPendingLogin: !!pending,\n });\n }\n\n async function logout(): Promise<void> {\n pending = null;\n ctx.auth.clear();\n ctx.gql.reset();\n notify();\n ctx.logger.info('Logged out and cleared stored tokens');\n }\n\n function getHeaders(): Record<string, string> {\n const auth = ctx.auth.read();\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?.workspaceToken)\n headers['X-Workspace-Authorization'] = `Bearer ${auth.workspaceToken}`;\n if (auth?.organizationId) headers['x-org-id'] = auth.organizationId;\n if (auth?.workspaceId) headers['x-workspace-id'] = auth.workspaceId;\n return headers;\n }\n\n function isLoggedIn(): boolean {\n const auth = ctx.auth.read();\n return !!(auth?.accessToken || auth?.apiKey);\n }\n\n function setOnTokensChanged(cb: () => void): void {\n onTokensChanged = cb;\n }\n\n return {\n startLogin,\n completeLogin,\n selectWorkspace,\n listWorkspaces,\n ensureAuthenticated,\n getStatus,\n logout,\n getHeaders,\n isLoggedIn,\n setOnTokensChanged,\n };\n}\n"]}
@@ -25,6 +25,7 @@ interface AuthStore {
25
25
  isWorkspaceTokenExpired(): boolean;
26
26
  isWorkspaceTokenExpiringSoon(): boolean;
27
27
  isAuthenticated(): boolean;
28
+ getActorUserId(): string | null;
28
29
  }
29
30
  declare function createAuthStore(configDir: string, authFileName?: string): AuthStore;
30
31
 
@@ -25,6 +25,7 @@ interface AuthStore {
25
25
  isWorkspaceTokenExpired(): boolean;
26
26
  isWorkspaceTokenExpiringSoon(): boolean;
27
27
  isAuthenticated(): boolean;
28
+ getActorUserId(): string | null;
28
29
  }
29
30
  declare function createAuthStore(configDir: string, authFileName?: string): AuthStore;
30
31
 
@@ -71,6 +71,21 @@ function createAuthStore(configDir, authFileName2 = "auth.json") {
71
71
  if (!auth?.accessToken) return false;
72
72
  return !isTokenExpired();
73
73
  }
74
+ function getActorUserId() {
75
+ const auth = read();
76
+ const token = auth?.accessToken;
77
+ if (!token) return null;
78
+ const parts = token.split(".");
79
+ if (parts.length !== 3) return null;
80
+ try {
81
+ const payload = JSON.parse(
82
+ Buffer.from(parts[1].replace(/-/g, "+").replace(/_/g, "/"), "base64").toString("utf8")
83
+ );
84
+ return typeof payload.sub === "string" ? payload.sub : null;
85
+ } catch {
86
+ return null;
87
+ }
88
+ }
74
89
  return {
75
90
  read,
76
91
  write,
@@ -79,7 +94,8 @@ function createAuthStore(configDir, authFileName2 = "auth.json") {
79
94
  isTokenExpiringSoon,
80
95
  isWorkspaceTokenExpired,
81
96
  isWorkspaceTokenExpiringSoon,
82
- isAuthenticated
97
+ isAuthenticated,
98
+ getActorUserId
83
99
  };
84
100
  }
85
101
  function envOr(prefix, key, fallback) {