@aexol/opencode-wizard 0.4.8 → 0.5.0

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.
@@ -1,10 +1,11 @@
1
- import type { OidcLoginStart, PluginSessionResponse, ResolvedConfig } from './types.js';
1
+ import type { OidcLoginStart, PluginEventSource, PluginSessionResponse, ResolvedConfig } from './types.js';
2
2
  export declare const startLoginFlow: (signal: AbortSignal) => Promise<OidcLoginStart>;
3
- export declare const createPluginSession: ({ code, codeVerifier, redirectUri, config, signal, }: {
3
+ export declare const createPluginSession: ({ code, codeVerifier, redirectUri, config, signal, source, }: {
4
4
  code: string;
5
5
  codeVerifier: string;
6
6
  redirectUri: string;
7
7
  config: ResolvedConfig;
8
8
  signal: AbortSignal;
9
+ source?: PluginEventSource;
9
10
  }) => Promise<PluginSessionResponse["session"]>;
10
11
  export declare const openBrowser: (url: string) => Promise<string | null>;
@@ -173,7 +173,8 @@ export const createPluginSession = async ({
173
173
  codeVerifier,
174
174
  redirectUri,
175
175
  config,
176
- signal
176
+ signal,
177
+ source = 'OPENCODE'
177
178
  }) => {
178
179
  const response = await fetch(config.authSessionUrl, {
179
180
  method: 'POST',
@@ -183,7 +184,8 @@ export const createPluginSession = async ({
183
184
  body: JSON.stringify({
184
185
  code,
185
186
  codeVerifier,
186
- redirectUri
187
+ redirectUri,
188
+ source
187
189
  }),
188
190
  signal
189
191
  });
@@ -1 +1 @@
1
- {"version":3,"names":["execFile","crypto","http","promisify","URL","sendOAuthCallbackHtmlResponse","LOGIN_TIMEOUT_MS","OIDC_CALLBACK_ORIGIN","OIDC_CALLBACK_PATH","OIDC_CALLBACK_URL","OIDC_CLIENT_ID","OIDC_ISSUER","OIDC_SCOPES","execFileAsync","createRandomBase64Url","bytes","randomBytes","toString","createCodeChallenge","codeVerifier","createHash","update","digest","getMessageFromUnknownPayload","value","candidate","message","fetchOidcDiscoveryDocument","signal","discoveryUrl","replace","response","fetch","method","ok","Error","status","json","isCallbackPortInUseError","error","code","toCallbackServerStartError","startLocalCallbackServer","expectedState","settled","resolvePayload","undefined","rejectPayload","callbackPromise","Promise","resolve","reject","finalize","payload","fail","reason","server","createServer","request","requestUrl","url","pathname","searchParams","get","errorDescription","state","close","rejectStart","once","listen","off","on","addEventListener","catch","startLoginFlow","discovery","codeChallenge","expiresAt","Date","now","toISOString","browserUrl","authorization_endpoint","set","join","closeCallbackServer","createPluginSession","redirectUri","config","authSessionUrl","headers","body","JSON","stringify","success","session","openBrowser","process","platform"],"sources":["../../src/server/auth-flow.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport http from 'node:http';\nimport { promisify } from 'node:util';\nimport { URL } from 'node:url';\nimport { sendOAuthCallbackHtmlResponse } from '../oauth-callback-page.js';\nimport {\n LOGIN_TIMEOUT_MS,\n OIDC_CALLBACK_ORIGIN,\n OIDC_CALLBACK_PATH,\n OIDC_CALLBACK_URL,\n OIDC_CLIENT_ID,\n OIDC_ISSUER,\n OIDC_SCOPES,\n} from './constants.js';\nimport type { OidcCallbackPayload, OidcDiscoveryDocument, OidcLoginStart, PluginSessionResponse, ResolvedConfig } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst createRandomBase64Url = (bytes: number): string => {\n return crypto.randomBytes(bytes).toString('base64url');\n};\n\nconst createCodeChallenge = (codeVerifier: string): string => {\n return crypto.createHash('sha256').update(codeVerifier).digest('base64url');\n};\n\nconst getMessageFromUnknownPayload = (value: unknown): string | null => {\n if (!value || typeof value !== 'object') return null;\n\n const candidate = 'message' in value ? value.message : null;\n return typeof candidate === 'string' ? candidate : null;\n};\n\nconst fetchOidcDiscoveryDocument = async (signal: AbortSignal): Promise<OidcDiscoveryDocument> => {\n const discoveryUrl = `${OIDC_ISSUER.replace(/\\/+$/, '')}/.well-known/openid-configuration`;\n const response = await fetch(discoveryUrl, {\n method: 'GET',\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`OIDC discovery failed with HTTP ${response.status}.`);\n }\n\n return (await response.json()) as OidcDiscoveryDocument;\n};\n\nconst isCallbackPortInUseError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') return false;\n if (!('code' in error)) return false;\n return error.code === 'EADDRINUSE';\n};\n\nconst toCallbackServerStartError = (error: unknown): Error => {\n if (!isCallbackPortInUseError(error)) {\n return error instanceof Error ? error : new Error('Failed to start local OAuth callback server.');\n }\n\n return new Error(\n 'OAuth login cannot start because localhost:24953 is already in use. Another OpenCode login is likely in progress; finish it or close the other instance, then retry.',\n );\n};\n\nconst startLocalCallbackServer = async ({\n expectedState,\n signal,\n}: {\n expectedState: string;\n signal: AbortSignal;\n}): Promise<{\n callbackPromise: Promise<OidcCallbackPayload>;\n close: () => Promise<void>;\n}> => {\n let settled = false;\n let resolvePayload: (value: OidcCallbackPayload) => void = () => undefined;\n let rejectPayload: (reason?: unknown) => void = () => undefined;\n\n const callbackPromise = new Promise<OidcCallbackPayload>((resolve, reject) => {\n resolvePayload = resolve;\n rejectPayload = reject;\n });\n\n const finalize = (payload: OidcCallbackPayload) => {\n if (settled) return;\n settled = true;\n resolvePayload(payload);\n };\n\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n rejectPayload(reason);\n };\n\n const server = http.createServer((request, response) => {\n const requestUrl = new URL(request.url ?? '/', OIDC_CALLBACK_ORIGIN);\n\n if (requestUrl.pathname !== OIDC_CALLBACK_PATH) {\n sendOAuthCallbackHtmlResponse(response, 404, 'opencode-wizard plugin login', 'Unknown callback path.');\n return;\n }\n\n const error = requestUrl.searchParams.get('error');\n const errorDescription = requestUrl.searchParams.get('error_description');\n\n if (error) {\n const message = errorDescription ?? error;\n sendOAuthCallbackHtmlResponse(response, 400, 'opencode-wizard plugin login failed', message);\n finalize({ status: 'error', message });\n return;\n }\n\n const state = requestUrl.searchParams.get('state');\n const code = requestUrl.searchParams.get('code');\n\n if (!state || state !== expectedState) {\n sendOAuthCallbackHtmlResponse(\n response,\n 400,\n 'opencode-wizard plugin login failed',\n 'OAuth state did not match the login request.',\n );\n finalize({ status: 'error', message: 'OAuth state did not match the login request.' });\n return;\n }\n\n if (!code) {\n sendOAuthCallbackHtmlResponse(\n response,\n 400,\n 'opencode-wizard plugin login failed',\n 'OAuth callback did not include an authorization code.',\n );\n finalize({ status: 'error', message: 'OAuth callback did not include an authorization code.' });\n return;\n }\n\n sendOAuthCallbackHtmlResponse(\n response,\n 200,\n 'opencode-wizard plugin callback received',\n 'Callback received. OpenCode is finalizing the backend session now.',\n );\n finalize({ status: 'success', code, state });\n });\n\n const close = async () => {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n };\n\n await new Promise<void>((resolve, reject) => {\n const rejectStart = (error: unknown) => {\n reject(toCallbackServerStartError(error));\n };\n\n server.once('error', rejectStart);\n server.listen(24953, 'localhost', () => {\n server.off('error', rejectStart);\n server.on('error', (error) => {\n fail(error instanceof Error ? error : new Error('Local OAuth callback server failed.'));\n });\n resolve();\n });\n });\n\n signal.addEventListener(\n 'abort',\n () => {\n fail(signal.reason instanceof Error ? signal.reason : new Error('OAuth login aborted.'));\n void close().catch(() => undefined);\n },\n { once: true },\n );\n\n return { callbackPromise, close };\n};\n\nexport const startLoginFlow = async (signal: AbortSignal): Promise<OidcLoginStart> => {\n const discovery = await fetchOidcDiscoveryDocument(signal);\n const codeVerifier = createRandomBase64Url(64);\n const expectedState = createRandomBase64Url(32);\n const codeChallenge = createCodeChallenge(codeVerifier);\n const expiresAt = new Date(Date.now() + LOGIN_TIMEOUT_MS).toISOString();\n const { callbackPromise, close } = await startLocalCallbackServer({ expectedState, signal });\n\n const browserUrl = new URL(discovery.authorization_endpoint);\n browserUrl.searchParams.set('client_id', OIDC_CLIENT_ID);\n browserUrl.searchParams.set('response_type', 'code');\n browserUrl.searchParams.set('redirect_uri', OIDC_CALLBACK_URL);\n browserUrl.searchParams.set('response_mode', 'query');\n browserUrl.searchParams.set('scope', OIDC_SCOPES.join(' '));\n browserUrl.searchParams.set('code_challenge', codeChallenge);\n browserUrl.searchParams.set('code_challenge_method', 'S256');\n browserUrl.searchParams.set('state', expectedState);\n\n return {\n browserUrl: browserUrl.toString(),\n expiresAt,\n codeVerifier,\n expectedState,\n callbackPromise,\n closeCallbackServer: close,\n };\n};\n\nexport const createPluginSession = async ({\n code,\n codeVerifier,\n redirectUri,\n config,\n signal,\n}: {\n code: string;\n codeVerifier: string;\n redirectUri: string;\n config: ResolvedConfig;\n signal: AbortSignal;\n}): Promise<PluginSessionResponse['session']> => {\n const response = await fetch(config.authSessionUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ code, codeVerifier, redirectUri }),\n signal,\n });\n\n const payload = (await response.json().catch(() => null)) as PluginSessionResponse | { message?: string } | null;\n\n if (!response.ok) {\n throw new Error(\n getMessageFromUnknownPayload(payload) ?? `Plugin session exchange failed with HTTP ${response.status}.`,\n );\n }\n\n if (!payload || !('success' in payload) || payload.success !== true) {\n throw new Error('Plugin session exchange returned an unexpected payload.');\n }\n\n return payload.session;\n};\n\nexport const openBrowser = async (url: string): Promise<string | null> => {\n try {\n if (process.platform === 'darwin') {\n await execFileAsync('open', [url]);\n return null;\n }\n\n if (process.platform === 'win32') {\n await execFileAsync('cmd', ['/c', 'start', '', url]);\n return null;\n }\n\n await execFileAsync('xdg-open', [url]);\n return null;\n } catch (error) {\n return error instanceof Error ? error.message : 'Failed to open browser automatically';\n }\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["execFile","crypto","http","promisify","URL","sendOAuthCallbackHtmlResponse","LOGIN_TIMEOUT_MS","OIDC_CALLBACK_ORIGIN","OIDC_CALLBACK_PATH","OIDC_CALLBACK_URL","OIDC_CLIENT_ID","OIDC_ISSUER","OIDC_SCOPES","execFileAsync","createRandomBase64Url","bytes","randomBytes","toString","createCodeChallenge","codeVerifier","createHash","update","digest","getMessageFromUnknownPayload","value","candidate","message","fetchOidcDiscoveryDocument","signal","discoveryUrl","replace","response","fetch","method","ok","Error","status","json","isCallbackPortInUseError","error","code","toCallbackServerStartError","startLocalCallbackServer","expectedState","settled","resolvePayload","undefined","rejectPayload","callbackPromise","Promise","resolve","reject","finalize","payload","fail","reason","server","createServer","request","requestUrl","url","pathname","searchParams","get","errorDescription","state","close","rejectStart","once","listen","off","on","addEventListener","catch","startLoginFlow","discovery","codeChallenge","expiresAt","Date","now","toISOString","browserUrl","authorization_endpoint","set","join","closeCallbackServer","createPluginSession","redirectUri","config","source","authSessionUrl","headers","body","JSON","stringify","success","session","openBrowser","process","platform"],"sources":["../../src/server/auth-flow.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport http from 'node:http';\nimport { promisify } from 'node:util';\nimport { URL } from 'node:url';\nimport { sendOAuthCallbackHtmlResponse } from '../oauth-callback-page.js';\nimport {\n LOGIN_TIMEOUT_MS,\n OIDC_CALLBACK_ORIGIN,\n OIDC_CALLBACK_PATH,\n OIDC_CALLBACK_URL,\n OIDC_CLIENT_ID,\n OIDC_ISSUER,\n OIDC_SCOPES,\n} from './constants.js';\nimport type {\n OidcCallbackPayload,\n OidcDiscoveryDocument,\n OidcLoginStart,\n PluginEventSource,\n PluginSessionResponse,\n ResolvedConfig,\n} from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst createRandomBase64Url = (bytes: number): string => {\n return crypto.randomBytes(bytes).toString('base64url');\n};\n\nconst createCodeChallenge = (codeVerifier: string): string => {\n return crypto.createHash('sha256').update(codeVerifier).digest('base64url');\n};\n\nconst getMessageFromUnknownPayload = (value: unknown): string | null => {\n if (!value || typeof value !== 'object') return null;\n\n const candidate = 'message' in value ? value.message : null;\n return typeof candidate === 'string' ? candidate : null;\n};\n\nconst fetchOidcDiscoveryDocument = async (signal: AbortSignal): Promise<OidcDiscoveryDocument> => {\n const discoveryUrl = `${OIDC_ISSUER.replace(/\\/+$/, '')}/.well-known/openid-configuration`;\n const response = await fetch(discoveryUrl, {\n method: 'GET',\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`OIDC discovery failed with HTTP ${response.status}.`);\n }\n\n return (await response.json()) as OidcDiscoveryDocument;\n};\n\nconst isCallbackPortInUseError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') return false;\n if (!('code' in error)) return false;\n return error.code === 'EADDRINUSE';\n};\n\nconst toCallbackServerStartError = (error: unknown): Error => {\n if (!isCallbackPortInUseError(error)) {\n return error instanceof Error ? error : new Error('Failed to start local OAuth callback server.');\n }\n\n return new Error(\n 'OAuth login cannot start because localhost:24953 is already in use. Another OpenCode login is likely in progress; finish it or close the other instance, then retry.',\n );\n};\n\nconst startLocalCallbackServer = async ({\n expectedState,\n signal,\n}: {\n expectedState: string;\n signal: AbortSignal;\n}): Promise<{\n callbackPromise: Promise<OidcCallbackPayload>;\n close: () => Promise<void>;\n}> => {\n let settled = false;\n let resolvePayload: (value: OidcCallbackPayload) => void = () => undefined;\n let rejectPayload: (reason?: unknown) => void = () => undefined;\n\n const callbackPromise = new Promise<OidcCallbackPayload>((resolve, reject) => {\n resolvePayload = resolve;\n rejectPayload = reject;\n });\n\n const finalize = (payload: OidcCallbackPayload) => {\n if (settled) return;\n settled = true;\n resolvePayload(payload);\n };\n\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n rejectPayload(reason);\n };\n\n const server = http.createServer((request, response) => {\n const requestUrl = new URL(request.url ?? '/', OIDC_CALLBACK_ORIGIN);\n\n if (requestUrl.pathname !== OIDC_CALLBACK_PATH) {\n sendOAuthCallbackHtmlResponse(response, 404, 'opencode-wizard plugin login', 'Unknown callback path.');\n return;\n }\n\n const error = requestUrl.searchParams.get('error');\n const errorDescription = requestUrl.searchParams.get('error_description');\n\n if (error) {\n const message = errorDescription ?? error;\n sendOAuthCallbackHtmlResponse(response, 400, 'opencode-wizard plugin login failed', message);\n finalize({ status: 'error', message });\n return;\n }\n\n const state = requestUrl.searchParams.get('state');\n const code = requestUrl.searchParams.get('code');\n\n if (!state || state !== expectedState) {\n sendOAuthCallbackHtmlResponse(\n response,\n 400,\n 'opencode-wizard plugin login failed',\n 'OAuth state did not match the login request.',\n );\n finalize({ status: 'error', message: 'OAuth state did not match the login request.' });\n return;\n }\n\n if (!code) {\n sendOAuthCallbackHtmlResponse(\n response,\n 400,\n 'opencode-wizard plugin login failed',\n 'OAuth callback did not include an authorization code.',\n );\n finalize({ status: 'error', message: 'OAuth callback did not include an authorization code.' });\n return;\n }\n\n sendOAuthCallbackHtmlResponse(\n response,\n 200,\n 'opencode-wizard plugin callback received',\n 'Callback received. OpenCode is finalizing the backend session now.',\n );\n finalize({ status: 'success', code, state });\n });\n\n const close = async () => {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n };\n\n await new Promise<void>((resolve, reject) => {\n const rejectStart = (error: unknown) => {\n reject(toCallbackServerStartError(error));\n };\n\n server.once('error', rejectStart);\n server.listen(24953, 'localhost', () => {\n server.off('error', rejectStart);\n server.on('error', (error) => {\n fail(error instanceof Error ? error : new Error('Local OAuth callback server failed.'));\n });\n resolve();\n });\n });\n\n signal.addEventListener(\n 'abort',\n () => {\n fail(signal.reason instanceof Error ? signal.reason : new Error('OAuth login aborted.'));\n void close().catch(() => undefined);\n },\n { once: true },\n );\n\n return { callbackPromise, close };\n};\n\nexport const startLoginFlow = async (signal: AbortSignal): Promise<OidcLoginStart> => {\n const discovery = await fetchOidcDiscoveryDocument(signal);\n const codeVerifier = createRandomBase64Url(64);\n const expectedState = createRandomBase64Url(32);\n const codeChallenge = createCodeChallenge(codeVerifier);\n const expiresAt = new Date(Date.now() + LOGIN_TIMEOUT_MS).toISOString();\n const { callbackPromise, close } = await startLocalCallbackServer({ expectedState, signal });\n\n const browserUrl = new URL(discovery.authorization_endpoint);\n browserUrl.searchParams.set('client_id', OIDC_CLIENT_ID);\n browserUrl.searchParams.set('response_type', 'code');\n browserUrl.searchParams.set('redirect_uri', OIDC_CALLBACK_URL);\n browserUrl.searchParams.set('response_mode', 'query');\n browserUrl.searchParams.set('scope', OIDC_SCOPES.join(' '));\n browserUrl.searchParams.set('code_challenge', codeChallenge);\n browserUrl.searchParams.set('code_challenge_method', 'S256');\n browserUrl.searchParams.set('state', expectedState);\n\n return {\n browserUrl: browserUrl.toString(),\n expiresAt,\n codeVerifier,\n expectedState,\n callbackPromise,\n closeCallbackServer: close,\n };\n};\n\nexport const createPluginSession = async ({\n code,\n codeVerifier,\n redirectUri,\n config,\n signal,\n source = 'OPENCODE',\n}: {\n code: string;\n codeVerifier: string;\n redirectUri: string;\n config: ResolvedConfig;\n signal: AbortSignal;\n source?: PluginEventSource;\n}): Promise<PluginSessionResponse['session']> => {\n const response = await fetch(config.authSessionUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ code, codeVerifier, redirectUri, source }),\n signal,\n });\n\n const payload = (await response.json().catch(() => null)) as PluginSessionResponse | { message?: string } | null;\n\n if (!response.ok) {\n throw new Error(\n getMessageFromUnknownPayload(payload) ?? `Plugin session exchange failed with HTTP ${response.status}.`,\n );\n }\n\n if (!payload || !('success' in payload) || payload.success !== true) {\n throw new Error('Plugin session exchange returned an unexpected payload.');\n }\n\n return payload.session;\n};\n\nexport const openBrowser = async (url: string): Promise<string | null> => {\n try {\n if (process.platform === 'darwin') {\n await execFileAsync('open', [url]);\n return null;\n }\n\n if (process.platform === 'win32') {\n await execFileAsync('cmd', ['/c', 'start', '', url]);\n return null;\n }\n\n await execFileAsync('xdg-open', [url]);\n return null;\n } catch (error) {\n return error instanceof Error ? error.message : 'Failed to open browser automatically';\n }\n};\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,oBAAoB;AAC7C,OAAOC,MAAM,MAAM,aAAa;AAChC,OAAOC,IAAI,MAAM,WAAW;AAC5B,SAASC,SAAS,QAAQ,WAAW;AACrC,SAASC,GAAG,QAAQ,UAAU;AAC9B,SAASC,6BAA6B,QAAQ,2BAA2B;AACzE,SACEC,gBAAgB,EAChBC,oBAAoB,EACpBC,kBAAkB,EAClBC,iBAAiB,EACjBC,cAAc,EACdC,WAAW,EACXC,WAAW,QACN,gBAAgB;AAUvB,MAAMC,aAAa,GAAGV,SAAS,CAACH,QAAQ,CAAC;AAEzC,MAAMc,qBAAqB,GAAIC,KAAa,IAAa;EACvD,OAAOd,MAAM,CAACe,WAAW,CAACD,KAAK,CAAC,CAACE,QAAQ,CAAC,WAAW,CAAC;AACxD,CAAC;AAED,MAAMC,mBAAmB,GAAIC,YAAoB,IAAa;EAC5D,OAAOlB,MAAM,CAACmB,UAAU,CAAC,QAAQ,CAAC,CAACC,MAAM,CAACF,YAAY,CAAC,CAACG,MAAM,CAAC,WAAW,CAAC;AAC7E,CAAC;AAED,MAAMC,4BAA4B,GAAIC,KAAc,IAAoB;EACtE,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,IAAI;EAEpD,MAAMC,SAAS,GAAG,SAAS,IAAID,KAAK,GAAGA,KAAK,CAACE,OAAO,GAAG,IAAI;EAC3D,OAAO,OAAOD,SAAS,KAAK,QAAQ,GAAGA,SAAS,GAAG,IAAI;AACzD,CAAC;AAED,MAAME,0BAA0B,GAAG,MAAOC,MAAmB,IAAqC;EAChG,MAAMC,YAAY,GAAG,GAAGlB,WAAW,CAACmB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,mCAAmC;EAC1F,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACH,YAAY,EAAE;IACzCI,MAAM,EAAE,KAAK;IACbL;EACF,CAAC,CAAC;EAEF,IAAI,CAACG,QAAQ,CAACG,EAAE,EAAE;IAChB,MAAM,IAAIC,KAAK,CAAC,mCAAmCJ,QAAQ,CAACK,MAAM,GAAG,CAAC;EACxE;EAEA,OAAQ,MAAML,QAAQ,CAACM,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAMC,wBAAwB,GAAIC,KAAc,IAAc;EAC5D,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,KAAK;EACrD,IAAI,EAAE,MAAM,IAAIA,KAAK,CAAC,EAAE,OAAO,KAAK;EACpC,OAAOA,KAAK,CAACC,IAAI,KAAK,YAAY;AACpC,CAAC;AAED,MAAMC,0BAA0B,GAAIF,KAAc,IAAY;EAC5D,IAAI,CAACD,wBAAwB,CAACC,KAAK,CAAC,EAAE;IACpC,OAAOA,KAAK,YAAYJ,KAAK,GAAGI,KAAK,GAAG,IAAIJ,KAAK,CAAC,8CAA8C,CAAC;EACnG;EAEA,OAAO,IAAIA,KAAK,CACd,sKACF,CAAC;AACH,CAAC;AAED,MAAMO,wBAAwB,GAAG,MAAAA,CAAO;EACtCC,aAAa;EACbf;AAIF,CAAC,KAGK;EACJ,IAAIgB,OAAO,GAAG,KAAK;EACnB,IAAIC,cAAoD,GAAGA,CAAA,KAAMC,SAAS;EAC1E,IAAIC,aAAyC,GAAGA,CAAA,KAAMD,SAAS;EAE/D,MAAME,eAAe,GAAG,IAAIC,OAAO,CAAsB,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC5EN,cAAc,GAAGK,OAAO;IACxBH,aAAa,GAAGI,MAAM;EACxB,CAAC,CAAC;EAEF,MAAMC,QAAQ,GAAIC,OAA4B,IAAK;IACjD,IAAIT,OAAO,EAAE;IACbA,OAAO,GAAG,IAAI;IACdC,cAAc,CAACQ,OAAO,CAAC;EACzB,CAAC;EAED,MAAMC,IAAI,GAAIC,MAAe,IAAK;IAChC,IAAIX,OAAO,EAAE;IACbA,OAAO,GAAG,IAAI;IACdG,aAAa,CAACQ,MAAM,CAAC;EACvB,CAAC;EAED,MAAMC,MAAM,GAAGtD,IAAI,CAACuD,YAAY,CAAC,CAACC,OAAO,EAAE3B,QAAQ,KAAK;IACtD,MAAM4B,UAAU,GAAG,IAAIvD,GAAG,CAACsD,OAAO,CAACE,GAAG,IAAI,GAAG,EAAErD,oBAAoB,CAAC;IAEpE,IAAIoD,UAAU,CAACE,QAAQ,KAAKrD,kBAAkB,EAAE;MAC9CH,6BAA6B,CAAC0B,QAAQ,EAAE,GAAG,EAAE,8BAA8B,EAAE,wBAAwB,CAAC;MACtG;IACF;IAEA,MAAMQ,KAAK,GAAGoB,UAAU,CAACG,YAAY,CAACC,GAAG,CAAC,OAAO,CAAC;IAClD,MAAMC,gBAAgB,GAAGL,UAAU,CAACG,YAAY,CAACC,GAAG,CAAC,mBAAmB,CAAC;IAEzE,IAAIxB,KAAK,EAAE;MACT,MAAMb,OAAO,GAAGsC,gBAAgB,IAAIzB,KAAK;MACzClC,6BAA6B,CAAC0B,QAAQ,EAAE,GAAG,EAAE,qCAAqC,EAAEL,OAAO,CAAC;MAC5F0B,QAAQ,CAAC;QAAEhB,MAAM,EAAE,OAAO;QAAEV;MAAQ,CAAC,CAAC;MACtC;IACF;IAEA,MAAMuC,KAAK,GAAGN,UAAU,CAACG,YAAY,CAACC,GAAG,CAAC,OAAO,CAAC;IAClD,MAAMvB,IAAI,GAAGmB,UAAU,CAACG,YAAY,CAACC,GAAG,CAAC,MAAM,CAAC;IAEhD,IAAI,CAACE,KAAK,IAAIA,KAAK,KAAKtB,aAAa,EAAE;MACrCtC,6BAA6B,CAC3B0B,QAAQ,EACR,GAAG,EACH,qCAAqC,EACrC,8CACF,CAAC;MACDqB,QAAQ,CAAC;QAAEhB,MAAM,EAAE,OAAO;QAAEV,OAAO,EAAE;MAA+C,CAAC,CAAC;MACtF;IACF;IAEA,IAAI,CAACc,IAAI,EAAE;MACTnC,6BAA6B,CAC3B0B,QAAQ,EACR,GAAG,EACH,qCAAqC,EACrC,uDACF,CAAC;MACDqB,QAAQ,CAAC;QAAEhB,MAAM,EAAE,OAAO;QAAEV,OAAO,EAAE;MAAwD,CAAC,CAAC;MAC/F;IACF;IAEArB,6BAA6B,CAC3B0B,QAAQ,EACR,GAAG,EACH,0CAA0C,EAC1C,oEACF,CAAC;IACDqB,QAAQ,CAAC;MAAEhB,MAAM,EAAE,SAAS;MAAEI,IAAI;MAAEyB;IAAM,CAAC,CAAC;EAC9C,CAAC,CAAC;EAEF,MAAMC,KAAK,GAAG,MAAAA,CAAA,KAAY;IACxB,MAAM,IAAIjB,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC3CK,MAAM,CAACU,KAAK,CAAE3B,KAAK,IAAK;QACtB,IAAIA,KAAK,EAAE;UACTY,MAAM,CAACZ,KAAK,CAAC;UACb;QACF;QAEAW,OAAO,CAAC,CAAC;MACX,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC;EAED,MAAM,IAAID,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC3C,MAAMgB,WAAW,GAAI5B,KAAc,IAAK;MACtCY,MAAM,CAACV,0BAA0B,CAACF,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEDiB,MAAM,CAACY,IAAI,CAAC,OAAO,EAAED,WAAW,CAAC;IACjCX,MAAM,CAACa,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM;MACtCb,MAAM,CAACc,GAAG,CAAC,OAAO,EAAEH,WAAW,CAAC;MAChCX,MAAM,CAACe,EAAE,CAAC,OAAO,EAAGhC,KAAK,IAAK;QAC5Be,IAAI,CAACf,KAAK,YAAYJ,KAAK,GAAGI,KAAK,GAAG,IAAIJ,KAAK,CAAC,qCAAqC,CAAC,CAAC;MACzF,CAAC,CAAC;MACFe,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFtB,MAAM,CAAC4C,gBAAgB,CACrB,OAAO,EACP,MAAM;IACJlB,IAAI,CAAC1B,MAAM,CAAC2B,MAAM,YAAYpB,KAAK,GAAGP,MAAM,CAAC2B,MAAM,GAAG,IAAIpB,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACxF,KAAK+B,KAAK,CAAC,CAAC,CAACO,KAAK,CAAC,MAAM3B,SAAS,CAAC;EACrC,CAAC,EACD;IAAEsB,IAAI,EAAE;EAAK,CACf,CAAC;EAED,OAAO;IAAEpB,eAAe;IAAEkB;EAAM,CAAC;AACnC,CAAC;AAED,OAAO,MAAMQ,cAAc,GAAG,MAAO9C,MAAmB,IAA8B;EACpF,MAAM+C,SAAS,GAAG,MAAMhD,0BAA0B,CAACC,MAAM,CAAC;EAC1D,MAAMT,YAAY,GAAGL,qBAAqB,CAAC,EAAE,CAAC;EAC9C,MAAM6B,aAAa,GAAG7B,qBAAqB,CAAC,EAAE,CAAC;EAC/C,MAAM8D,aAAa,GAAG1D,mBAAmB,CAACC,YAAY,CAAC;EACvD,MAAM0D,SAAS,GAAG,IAAIC,IAAI,CAACA,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGzE,gBAAgB,CAAC,CAAC0E,WAAW,CAAC,CAAC;EACvE,MAAM;IAAEhC,eAAe;IAAEkB;EAAM,CAAC,GAAG,MAAMxB,wBAAwB,CAAC;IAAEC,aAAa;IAAEf;EAAO,CAAC,CAAC;EAE5F,MAAMqD,UAAU,GAAG,IAAI7E,GAAG,CAACuE,SAAS,CAACO,sBAAsB,CAAC;EAC5DD,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,WAAW,EAAEzE,cAAc,CAAC;EACxDuE,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC;EACpDF,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,cAAc,EAAE1E,iBAAiB,CAAC;EAC9DwE,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC;EACrDF,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,OAAO,EAAEvE,WAAW,CAACwE,IAAI,CAAC,GAAG,CAAC,CAAC;EAC3DH,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,gBAAgB,EAAEP,aAAa,CAAC;EAC5DK,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC;EAC5DF,UAAU,CAACnB,YAAY,CAACqB,GAAG,CAAC,OAAO,EAAExC,aAAa,CAAC;EAEnD,OAAO;IACLsC,UAAU,EAAEA,UAAU,CAAChE,QAAQ,CAAC,CAAC;IACjC4D,SAAS;IACT1D,YAAY;IACZwB,aAAa;IACbK,eAAe;IACfqC,mBAAmB,EAAEnB;EACvB,CAAC;AACH,CAAC;AAED,OAAO,MAAMoB,mBAAmB,GAAG,MAAAA,CAAO;EACxC9C,IAAI;EACJrB,YAAY;EACZoE,WAAW;EACXC,MAAM;EACN5D,MAAM;EACN6D,MAAM,GAAG;AAQX,CAAC,KAAgD;EAC/C,MAAM1D,QAAQ,GAAG,MAAMC,KAAK,CAACwD,MAAM,CAACE,cAAc,EAAE;IAClDzD,MAAM,EAAE,MAAM;IACd0D,OAAO,EAAE;MAAE,cAAc,EAAE;IAAmB,CAAC;IAC/CC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;MAAEtD,IAAI;MAAErB,YAAY;MAAEoE,WAAW;MAAEE;IAAO,CAAC,CAAC;IACjE7D;EACF,CAAC,CAAC;EAEF,MAAMyB,OAAO,GAAI,MAAMtB,QAAQ,CAACM,IAAI,CAAC,CAAC,CAACoC,KAAK,CAAC,MAAM,IAAI,CAAyD;EAEhH,IAAI,CAAC1C,QAAQ,CAACG,EAAE,EAAE;IAChB,MAAM,IAAIC,KAAK,CACbZ,4BAA4B,CAAC8B,OAAO,CAAC,IAAI,4CAA4CtB,QAAQ,CAACK,MAAM,GACtG,CAAC;EACH;EAEA,IAAI,CAACiB,OAAO,IAAI,EAAE,SAAS,IAAIA,OAAO,CAAC,IAAIA,OAAO,CAAC0C,OAAO,KAAK,IAAI,EAAE;IACnE,MAAM,IAAI5D,KAAK,CAAC,yDAAyD,CAAC;EAC5E;EAEA,OAAOkB,OAAO,CAAC2C,OAAO;AACxB,CAAC;AAED,OAAO,MAAMC,WAAW,GAAG,MAAOrC,GAAW,IAA6B;EACxE,IAAI;IACF,IAAIsC,OAAO,CAACC,QAAQ,KAAK,QAAQ,EAAE;MACjC,MAAMtF,aAAa,CAAC,MAAM,EAAE,CAAC+C,GAAG,CAAC,CAAC;MAClC,OAAO,IAAI;IACb;IAEA,IAAIsC,OAAO,CAACC,QAAQ,KAAK,OAAO,EAAE;MAChC,MAAMtF,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE+C,GAAG,CAAC,CAAC;MACpD,OAAO,IAAI;IACb;IAEA,MAAM/C,aAAa,CAAC,UAAU,EAAE,CAAC+C,GAAG,CAAC,CAAC;IACtC,OAAO,IAAI;EACb,CAAC,CAAC,OAAOrB,KAAK,EAAE;IACd,OAAOA,KAAK,YAAYJ,KAAK,GAAGI,KAAK,CAACb,OAAO,GAAG,sCAAsC;EACxF;AACF,CAAC","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import type { AuthState, FetchResult, PublishedSkillArtifactDetailPayload, PublishedSkillArtifactDetailPurpose, ResolvedConfig, WizardArtifactDetailPayload, WizardArtifactFetchResult, WizardArtifactKind, WorkspaceResolution } from './types.js';
1
+ import type { AuthState, FetchResult, PublishedSkillArtifactDetailPayload, PublishedSkillArtifactDetailPurpose, PluginEventSource, ResolvedConfig, WizardArtifactDetailPayload, WizardArtifactFetchResult, WizardArtifactKind, WorkspaceResolution } from './types.js';
2
2
  export declare const hydrateStoredAuthStateRole: ({ worktree, config, signal, onAuthStateChanged, }: {
3
3
  worktree: string;
4
4
  config: ResolvedConfig;
@@ -23,14 +23,14 @@ export declare const fetchPublishedSkillsGraphQl: <TData>({ worktree, config, qu
23
23
  ok: false;
24
24
  }>;
25
25
  }>;
26
- export declare const fetchPublishedSkillsCatalog: (worktree: string, config: ResolvedConfig, resolution: WorkspaceResolution, signal: AbortSignal, recommendationContext?: string | null, onAuthStateChanged?: () => void) => Promise<FetchResult>;
27
- export declare const fetchWizardArtifactsCatalog: (worktree: string, config: ResolvedConfig, resolution: WorkspaceResolution, artifactKind: WizardArtifactKind, signal: AbortSignal, recommendationContext?: string | null, onAuthStateChanged?: () => void) => Promise<WizardArtifactFetchResult>;
26
+ export declare const fetchPublishedSkillsCatalog: (worktree: string, config: ResolvedConfig, resolution: WorkspaceResolution, signal: AbortSignal, recommendationContext?: string | null, source?: PluginEventSource, onAuthStateChanged?: () => void) => Promise<FetchResult>;
27
+ export declare const fetchWizardArtifactsCatalog: (worktree: string, config: ResolvedConfig, resolution: WorkspaceResolution, artifactKind: WizardArtifactKind, signal: AbortSignal, recommendationContext?: string | null, source?: PluginEventSource, onAuthStateChanged?: () => void) => Promise<WizardArtifactFetchResult>;
28
28
  export declare const maybePersistWorkspaceSlugFromCatalog: ({ config, resolution, fetchResult, }: {
29
29
  config: ResolvedConfig;
30
30
  resolution: WorkspaceResolution;
31
31
  fetchResult: FetchResult;
32
32
  }) => Promise<void>;
33
- export declare const fetchPublishedSkillDetail: ({ worktree, config, resolution, skillVersionId, artifactVersionId, signal, onAuthStateChanged, purpose, }: {
33
+ export declare const fetchPublishedSkillDetail: ({ worktree, config, resolution, skillVersionId, artifactVersionId, signal, onAuthStateChanged, purpose, source, }: {
34
34
  worktree: string;
35
35
  config: ResolvedConfig;
36
36
  resolution: WorkspaceResolution;
@@ -39,6 +39,7 @@ export declare const fetchPublishedSkillDetail: ({ worktree, config, resolution,
39
39
  signal: AbortSignal;
40
40
  onAuthStateChanged?: () => void;
41
41
  purpose: PublishedSkillArtifactDetailPurpose;
42
+ source?: PluginEventSource;
42
43
  }) => Promise<{
43
44
  ok: true;
44
45
  artifact: PublishedSkillArtifactDetailPayload;
@@ -58,7 +59,7 @@ export declare const fetchPublishedSkillDetail: ({ worktree, config, resolution,
58
59
  ok: false;
59
60
  }>;
60
61
  }>;
61
- export declare const fetchWizardArtifactDetail: ({ worktree, config, resolution, artifactKind, artifactVersionId, signal, onAuthStateChanged, purpose, }: {
62
+ export declare const fetchWizardArtifactDetail: ({ worktree, config, resolution, artifactKind, artifactVersionId, signal, onAuthStateChanged, purpose, source, }: {
62
63
  worktree: string;
63
64
  config: ResolvedConfig;
64
65
  resolution: WorkspaceResolution;
@@ -67,6 +68,7 @@ export declare const fetchWizardArtifactDetail: ({ worktree, config, resolution,
67
68
  signal: AbortSignal;
68
69
  onAuthStateChanged?: () => void;
69
70
  purpose: PublishedSkillArtifactDetailPurpose;
71
+ source?: PluginEventSource;
70
72
  }) => Promise<{
71
73
  ok: true;
72
74
  artifact: WizardArtifactDetailPayload;
@@ -213,7 +213,7 @@ export const fetchPublishedSkillsGraphQl = async ({
213
213
  fetchedAt
214
214
  };
215
215
  };
216
- export const fetchPublishedSkillsCatalog = async (worktree, config, resolution, signal, recommendationContext, onAuthStateChanged) => {
216
+ export const fetchPublishedSkillsCatalog = async (worktree, config, resolution, signal, recommendationContext, source = 'OPENCODE', onAuthStateChanged) => {
217
217
  const response = await fetchPublishedSkillsGraphQl({
218
218
  worktree,
219
219
  config,
@@ -221,6 +221,7 @@ export const fetchPublishedSkillsCatalog = async (worktree, config, resolution,
221
221
  variables: {
222
222
  input: {
223
223
  ...toDeliveryInput(resolution),
224
+ source,
224
225
  recommendationContext
225
226
  }
226
227
  },
@@ -249,7 +250,7 @@ export const fetchPublishedSkillsCatalog = async (worktree, config, resolution,
249
250
  source: 'network'
250
251
  };
251
252
  };
252
- export const fetchWizardArtifactsCatalog = async (worktree, config, resolution, artifactKind, signal, recommendationContext, onAuthStateChanged) => {
253
+ export const fetchWizardArtifactsCatalog = async (worktree, config, resolution, artifactKind, signal, recommendationContext, source = 'OPENCODE', onAuthStateChanged) => {
253
254
  const response = await fetchPublishedSkillsGraphQl({
254
255
  worktree,
255
256
  config,
@@ -258,6 +259,7 @@ export const fetchWizardArtifactsCatalog = async (worktree, config, resolution,
258
259
  input: {
259
260
  ...toDeliveryInput(resolution),
260
261
  artifactKind,
262
+ source,
261
263
  recommendationContext
262
264
  }
263
265
  },
@@ -312,7 +314,8 @@ export const fetchPublishedSkillDetail = async ({
312
314
  artifactVersionId,
313
315
  signal,
314
316
  onAuthStateChanged,
315
- purpose
317
+ purpose,
318
+ source = 'OPENCODE'
316
319
  }) => {
317
320
  const wizardArtifactResponse = await fetchPublishedSkillsGraphQl({
318
321
  worktree,
@@ -323,7 +326,8 @@ export const fetchPublishedSkillDetail = async ({
323
326
  ...toDeliveryInput(resolution),
324
327
  artifactKind: 'SKILL',
325
328
  artifactVersionId,
326
- purpose
329
+ purpose,
330
+ source
327
331
  }
328
332
  },
329
333
  signal,
@@ -348,7 +352,8 @@ export const fetchPublishedSkillDetail = async ({
348
352
  input: {
349
353
  ...toDeliveryInput(resolution),
350
354
  skillVersionId,
351
- purpose
355
+ purpose,
356
+ source
352
357
  }
353
358
  },
354
359
  signal,
@@ -383,7 +388,8 @@ export const fetchWizardArtifactDetail = async ({
383
388
  artifactVersionId,
384
389
  signal,
385
390
  onAuthStateChanged,
386
- purpose
391
+ purpose,
392
+ source = 'OPENCODE'
387
393
  }) => {
388
394
  const response = await fetchPublishedSkillsGraphQl({
389
395
  worktree,
@@ -394,7 +400,8 @@ export const fetchWizardArtifactDetail = async ({
394
400
  ...toDeliveryInput(resolution),
395
401
  artifactKind,
396
402
  artifactVersionId,
397
- purpose
403
+ purpose,
404
+ source
398
405
  }
399
406
  },
400
407
  signal,
@@ -1 +1 @@
1
- {"version":3,"names":["CURRENT_USER_ROLE_QUERY","PUBLISHED_SKILL_DETAIL_QUERY","PUBLISHED_SKILLS_CATALOG_QUERY","WIZARD_ARTIFACT_DETAIL_QUERY","WIZARD_ARTIFACTS_CATALOG_QUERY","clearAuthState","resolveStoredAuthState","upsertWorkspaceSlugMapping","writeAuthState","toWorkspaceSlug","toDeliveryInput","isUnauthorizedGraphQlMessage","message","normalizedMessage","toLowerCase","includes","isPluginEditorRole","value","formatGraphQlError","error","details","path","length","join","extensions","code","filter","Boolean","hydrateStoredAuthStateRole","worktree","config","signal","onAuthStateChanged","authState","role","response","fetch","graphqlUrl","method","headers","authorization","sessionToken","body","JSON","stringify","query","variables","status","authStatePath","ok","json","errors","some","me","data","user","hydratedAuthState","userId","_id","trim","email","fetchPublishedSkillsGraphQl","operationName","fetchedAt","Date","toISOString","result","authMode","source","Error","graphQlErrors","map","operationPrefix","fetchPublishedSkillsCatalog","resolution","recommendationContext","input","payload","pluginPublishedSkills","fetchWizardArtifactsCatalog","artifactKind","pluginWizardArtifacts","maybePersistWorkspaceSlugFromCatalog","fetchResult","backendWorkspaceSlug","workspace","slug","normalizedWorkspaceSlug","workspaceSlug","workspaceSlugSource","configFile","repositoryUrl","repositoryRoot","fetchPublishedSkillDetail","skillVersionId","artifactVersionId","purpose","wizardArtifactResponse","wizardArtifact","pluginWizardArtifactVersion","artifact","pluginPublishedSkillVersionArtifact","fetchWizardArtifactDetail"],"sources":["../../src/server/client.ts"],"sourcesContent":["import {\n CURRENT_USER_ROLE_QUERY,\n PUBLISHED_SKILL_DETAIL_QUERY,\n PUBLISHED_SKILLS_CATALOG_QUERY,\n WIZARD_ARTIFACT_DETAIL_QUERY,\n WIZARD_ARTIFACTS_CATALOG_QUERY,\n} from '../graphql-operations.js';\nimport { clearAuthState, resolveStoredAuthState, upsertWorkspaceSlugMapping, writeAuthState } from './auth-store.js';\nimport { toWorkspaceSlug } from './path-utils.js';\nimport { toDeliveryInput } from './workspace.js';\nimport type {\n AuthState,\n CurrentUserRoleResponse,\n FetchResult,\n GraphQLResponse,\n PublishedSkillArtifactDetailPayload,\n PublishedSkillArtifactDetailPurpose,\n PublishedSkillCatalogResponse,\n PublishedSkillDetailResponse,\n ResolvedConfig,\n WizardArtifactCatalogResponse,\n WizardArtifactDetailPayload,\n WizardArtifactDetailResponse,\n WizardArtifactFetchResult,\n WizardArtifactKind,\n WorkspaceResolution,\n} from './types.js';\n\nconst isUnauthorizedGraphQlMessage = (message: string): boolean => {\n const normalizedMessage = message.toLowerCase();\n return normalizedMessage.includes('not authorized') || normalizedMessage.includes('unauthorized');\n};\n\nconst isPluginEditorRole = (value: unknown): value is NonNullable<AuthState['role']> => {\n return value === 'ADMIN' || value === 'EDITOR';\n};\n\nconst formatGraphQlError = (error: { message: string; path?: Array<string | number>; extensions?: { code?: string } }): string => {\n const details = [\n error.path && error.path.length > 0 ? `path=${error.path.join('.')}` : null,\n error.extensions?.code ? `code=${error.extensions.code}` : null,\n ].filter(Boolean);\n\n return details.length > 0 ? `${error.message} (${details.join(', ')})` : error.message;\n};\n\nexport const hydrateStoredAuthStateRole = async ({\n worktree,\n config,\n signal,\n onAuthStateChanged,\n}: {\n worktree: string;\n config: ResolvedConfig;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n}): Promise<AuthState | null> => {\n const authState = await resolveStoredAuthState(worktree, config);\n if (!authState) return null;\n if (authState.role) return authState;\n\n let response: Response;\n\n try {\n response = await fetch(config.graphqlUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({ query: CURRENT_USER_ROLE_QUERY, variables: {} }),\n signal,\n });\n } catch {\n return authState;\n }\n\n if (response.status === 401 || response.status === 403) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return null;\n }\n\n if (!response.ok) return authState;\n\n let body: GraphQLResponse<CurrentUserRoleResponse>;\n\n try {\n body = (await response.json()) as GraphQLResponse<CurrentUserRoleResponse>;\n } catch {\n return authState;\n }\n\n if (body.errors?.some((error) => isUnauthorizedGraphQlMessage(error.message))) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return null;\n }\n\n const me = body.data?.user?.me;\n if (!isPluginEditorRole(me?.role)) return authState;\n\n const hydratedAuthState: AuthState = {\n ...authState,\n userId: typeof me._id === 'string' && me._id.trim().length > 0 ? me._id : authState.userId,\n email: typeof me.email === 'string' && me.email.trim().length > 0 ? me.email : authState.email,\n role: me.role,\n };\n\n await writeAuthState(config.authStatePath, hydratedAuthState);\n return hydratedAuthState;\n};\n\nexport const fetchPublishedSkillsGraphQl = async <TData>({\n worktree,\n config,\n query,\n variables,\n signal,\n onAuthStateChanged,\n operationName,\n}: {\n worktree: string;\n config: ResolvedConfig;\n query: string;\n variables: Record<string, unknown>;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n operationName?: string;\n}): Promise<\n | { ok: true; data: TData; fetchedAt: string }\n | { ok: false; result: Extract<FetchResult, { ok: false }> }\n> => {\n const authState = await resolveStoredAuthState(worktree, config);\n const fetchedAt = new Date().toISOString();\n\n if (!authState) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'missing_auth',\n authMode: 'missing',\n message:\n 'No plugin session is stored. Interactive opencode_wizard_published_skills_fetch can bootstrap browser login automatically when needed. Configured backend and GraphQL URLs are shown for visibility, but no GraphQL request was made because auth is missing.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n let response: Response;\n\n try {\n response = await fetch(config.graphqlUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({ query, variables }),\n signal,\n });\n } catch (error) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: error instanceof Error ? error.message : 'Unknown fetch error',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (response.status === 401 || response.status === 403) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return {\n ok: false,\n result: {\n ok: false,\n status: 'missing_auth',\n authMode: 'session',\n message:\n 'Stored plugin session was rejected by the backend. Retry opencode_wizard_published_skills_fetch to bootstrap a fresh browser login automatically.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (!response.ok) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: `GraphQL request failed with HTTP ${response.status}.`,\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n let body: GraphQLResponse<TData>;\n\n try {\n body = (await response.json()) as GraphQLResponse<TData>;\n } catch (error) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: `GraphQL response was not valid JSON: ${error instanceof Error ? error.message : 'Unknown parse error'}`,\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (body.errors?.length) {\n const graphQlErrors = body.errors.map(formatGraphQlError);\n const operationPrefix = operationName ? `${operationName}: ` : '';\n const message = `${operationPrefix}${graphQlErrors.join('; ')}`;\n\n if (body.errors.some((error) => isUnauthorizedGraphQlMessage(error.message))) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return {\n ok: false,\n result: {\n ok: false,\n status: 'missing_auth',\n authMode: 'session',\n message:\n 'Stored plugin session is no longer valid. Retry opencode_wizard_published_skills_fetch to bootstrap a fresh browser login automatically.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message,\n graphQlErrors,\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (!body.data) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: 'GraphQL response did not include data.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n return { ok: true, data: body.data, fetchedAt };\n};\n\nexport const fetchPublishedSkillsCatalog = async (\n worktree: string,\n config: ResolvedConfig,\n resolution: WorkspaceResolution,\n signal: AbortSignal,\n recommendationContext?: string | null,\n onAuthStateChanged?: () => void,\n): Promise<FetchResult> => {\n const response = await fetchPublishedSkillsGraphQl<PublishedSkillCatalogResponse>({\n worktree,\n config,\n query: PUBLISHED_SKILLS_CATALOG_QUERY,\n variables: { input: { ...toDeliveryInput(resolution), recommendationContext } },\n signal,\n onAuthStateChanged,\n operationName: 'pluginPublishedSkills',\n });\n\n if (!response.ok) return response.result;\n\n const payload = response.data.pluginPublishedSkills;\n\n if (!payload) {\n return {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: 'GraphQL response did not include pluginPublishedSkills.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n }\n\n return {\n ok: true,\n status: 'ready',\n authMode: 'session',\n payload,\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n};\n\nexport const fetchWizardArtifactsCatalog = async (\n worktree: string,\n config: ResolvedConfig,\n resolution: WorkspaceResolution,\n artifactKind: WizardArtifactKind,\n signal: AbortSignal,\n recommendationContext?: string | null,\n onAuthStateChanged?: () => void,\n): Promise<WizardArtifactFetchResult> => {\n const response = await fetchPublishedSkillsGraphQl<WizardArtifactCatalogResponse>({\n worktree,\n config,\n query: WIZARD_ARTIFACTS_CATALOG_QUERY,\n variables: { input: { ...toDeliveryInput(resolution), artifactKind, recommendationContext } },\n signal,\n onAuthStateChanged,\n operationName: 'pluginWizardArtifacts',\n });\n\n if (!response.ok) return response.result;\n\n const payload = response.data.pluginWizardArtifacts;\n if (!payload) {\n return {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: 'GraphQL response did not include pluginWizardArtifacts.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n }\n\n return {\n ok: true,\n status: 'ready',\n authMode: 'session',\n payload,\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n};\n\nexport const maybePersistWorkspaceSlugFromCatalog = async ({\n config,\n resolution,\n fetchResult,\n}: {\n config: ResolvedConfig;\n resolution: WorkspaceResolution;\n fetchResult: FetchResult;\n}): Promise<void> => {\n if (!fetchResult.ok) return;\n\n const backendWorkspaceSlug = fetchResult.payload.workspace?.slug?.trim();\n if (!backendWorkspaceSlug) return;\n\n const normalizedWorkspaceSlug = toWorkspaceSlug(backendWorkspaceSlug);\n if (!normalizedWorkspaceSlug) return;\n\n if (resolution.workspaceSlug === normalizedWorkspaceSlug && resolution.workspaceSlugSource !== 'fallback') return;\n\n await upsertWorkspaceSlugMapping({\n configFile: config.authStatePath,\n repositoryUrl: resolution.repositoryUrl,\n repositoryRoot: resolution.repositoryRoot,\n workspaceSlug: normalizedWorkspaceSlug,\n });\n};\n\nexport const fetchPublishedSkillDetail = async ({\n worktree,\n config,\n resolution,\n skillVersionId,\n artifactVersionId,\n signal,\n onAuthStateChanged,\n purpose,\n}: {\n worktree: string;\n config: ResolvedConfig;\n resolution: WorkspaceResolution;\n skillVersionId: string;\n artifactVersionId: string;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n purpose: PublishedSkillArtifactDetailPurpose;\n}): Promise<\n | { ok: true; artifact: PublishedSkillArtifactDetailPayload }\n | {\n ok: false;\n result: {\n ok: false;\n status: 'not_found';\n authMode: 'session';\n message: string;\n fetchedAt: string;\n source: 'network';\n };\n }\n | { ok: false; result: Extract<FetchResult, { ok: false }> }\n> => {\n const wizardArtifactResponse = await fetchPublishedSkillsGraphQl<WizardArtifactDetailResponse>({\n worktree,\n config,\n query: WIZARD_ARTIFACT_DETAIL_QUERY,\n variables: {\n input: { ...toDeliveryInput(resolution), artifactKind: 'SKILL', artifactVersionId, purpose },\n },\n signal,\n onAuthStateChanged,\n operationName: 'pluginWizardArtifactVersion',\n });\n\n if (!wizardArtifactResponse.ok && wizardArtifactResponse.result.status === 'missing_auth') {\n return wizardArtifactResponse;\n }\n\n if (wizardArtifactResponse.ok) {\n const wizardArtifact = wizardArtifactResponse.data.pluginWizardArtifactVersion;\n if (wizardArtifact) return { ok: true, artifact: wizardArtifact };\n }\n\n const response = await fetchPublishedSkillsGraphQl<PublishedSkillDetailResponse>({\n worktree,\n config,\n query: PUBLISHED_SKILL_DETAIL_QUERY,\n variables: {\n input: { ...toDeliveryInput(resolution), skillVersionId, purpose },\n },\n signal,\n onAuthStateChanged,\n operationName: 'pluginPublishedSkillVersionArtifact',\n });\n\n if (!response.ok) return wizardArtifactResponse.ok ? response : wizardArtifactResponse;\n\n const artifact = response.data.pluginPublishedSkillVersionArtifact;\n\n if (!artifact) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'not_found',\n authMode: 'session',\n message: 'Published skill detail is not effective for the current scope.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n },\n };\n }\n\n return { ok: true, artifact };\n};\n\nexport const fetchWizardArtifactDetail = async ({\n worktree,\n config,\n resolution,\n artifactKind,\n artifactVersionId,\n signal,\n onAuthStateChanged,\n purpose,\n}: {\n worktree: string;\n config: ResolvedConfig;\n resolution: WorkspaceResolution;\n artifactKind: WizardArtifactKind;\n artifactVersionId: string;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n purpose: PublishedSkillArtifactDetailPurpose;\n}): Promise<\n | { ok: true; artifact: WizardArtifactDetailPayload }\n | {\n ok: false;\n result: {\n ok: false;\n status: 'not_found';\n authMode: 'session';\n message: string;\n fetchedAt: string;\n source: 'network';\n };\n }\n | { ok: false; result: Extract<FetchResult, { ok: false }> }\n> => {\n const response = await fetchPublishedSkillsGraphQl<WizardArtifactDetailResponse>({\n worktree,\n config,\n query: WIZARD_ARTIFACT_DETAIL_QUERY,\n variables: {\n input: { ...toDeliveryInput(resolution), artifactKind, artifactVersionId, purpose },\n },\n signal,\n onAuthStateChanged,\n operationName: 'pluginWizardArtifactVersion',\n });\n\n if (!response.ok) return response;\n\n const artifact = response.data.pluginWizardArtifactVersion;\n if (!artifact) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'not_found',\n authMode: 'session',\n message: 'Wizard artifact detail is not effective for the current scope.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n },\n };\n }\n\n return { ok: true, artifact };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["CURRENT_USER_ROLE_QUERY","PUBLISHED_SKILL_DETAIL_QUERY","PUBLISHED_SKILLS_CATALOG_QUERY","WIZARD_ARTIFACT_DETAIL_QUERY","WIZARD_ARTIFACTS_CATALOG_QUERY","clearAuthState","resolveStoredAuthState","upsertWorkspaceSlugMapping","writeAuthState","toWorkspaceSlug","toDeliveryInput","isUnauthorizedGraphQlMessage","message","normalizedMessage","toLowerCase","includes","isPluginEditorRole","value","formatGraphQlError","error","details","path","length","join","extensions","code","filter","Boolean","hydrateStoredAuthStateRole","worktree","config","signal","onAuthStateChanged","authState","role","response","fetch","graphqlUrl","method","headers","authorization","sessionToken","body","JSON","stringify","query","variables","status","authStatePath","ok","json","errors","some","me","data","user","hydratedAuthState","userId","_id","trim","email","fetchPublishedSkillsGraphQl","operationName","fetchedAt","Date","toISOString","result","authMode","source","Error","graphQlErrors","map","operationPrefix","fetchPublishedSkillsCatalog","resolution","recommendationContext","input","payload","pluginPublishedSkills","fetchWizardArtifactsCatalog","artifactKind","pluginWizardArtifacts","maybePersistWorkspaceSlugFromCatalog","fetchResult","backendWorkspaceSlug","workspace","slug","normalizedWorkspaceSlug","workspaceSlug","workspaceSlugSource","configFile","repositoryUrl","repositoryRoot","fetchPublishedSkillDetail","skillVersionId","artifactVersionId","purpose","wizardArtifactResponse","wizardArtifact","pluginWizardArtifactVersion","artifact","pluginPublishedSkillVersionArtifact","fetchWizardArtifactDetail"],"sources":["../../src/server/client.ts"],"sourcesContent":["import {\n CURRENT_USER_ROLE_QUERY,\n PUBLISHED_SKILL_DETAIL_QUERY,\n PUBLISHED_SKILLS_CATALOG_QUERY,\n WIZARD_ARTIFACT_DETAIL_QUERY,\n WIZARD_ARTIFACTS_CATALOG_QUERY,\n} from '../graphql-operations.js';\nimport { clearAuthState, resolveStoredAuthState, upsertWorkspaceSlugMapping, writeAuthState } from './auth-store.js';\nimport { toWorkspaceSlug } from './path-utils.js';\nimport { toDeliveryInput } from './workspace.js';\nimport type {\n AuthState,\n CurrentUserRoleResponse,\n FetchResult,\n GraphQLResponse,\n PublishedSkillArtifactDetailPayload,\n PublishedSkillArtifactDetailPurpose,\n PublishedSkillCatalogResponse,\n PublishedSkillDetailResponse,\n PluginEventSource,\n ResolvedConfig,\n WizardArtifactCatalogResponse,\n WizardArtifactDetailPayload,\n WizardArtifactDetailResponse,\n WizardArtifactFetchResult,\n WizardArtifactKind,\n WorkspaceResolution,\n} from './types.js';\n\nconst isUnauthorizedGraphQlMessage = (message: string): boolean => {\n const normalizedMessage = message.toLowerCase();\n return normalizedMessage.includes('not authorized') || normalizedMessage.includes('unauthorized');\n};\n\nconst isPluginEditorRole = (value: unknown): value is NonNullable<AuthState['role']> => {\n return value === 'ADMIN' || value === 'EDITOR';\n};\n\nconst formatGraphQlError = (error: { message: string; path?: Array<string | number>; extensions?: { code?: string } }): string => {\n const details = [\n error.path && error.path.length > 0 ? `path=${error.path.join('.')}` : null,\n error.extensions?.code ? `code=${error.extensions.code}` : null,\n ].filter(Boolean);\n\n return details.length > 0 ? `${error.message} (${details.join(', ')})` : error.message;\n};\n\nexport const hydrateStoredAuthStateRole = async ({\n worktree,\n config,\n signal,\n onAuthStateChanged,\n}: {\n worktree: string;\n config: ResolvedConfig;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n}): Promise<AuthState | null> => {\n const authState = await resolveStoredAuthState(worktree, config);\n if (!authState) return null;\n if (authState.role) return authState;\n\n let response: Response;\n\n try {\n response = await fetch(config.graphqlUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({ query: CURRENT_USER_ROLE_QUERY, variables: {} }),\n signal,\n });\n } catch {\n return authState;\n }\n\n if (response.status === 401 || response.status === 403) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return null;\n }\n\n if (!response.ok) return authState;\n\n let body: GraphQLResponse<CurrentUserRoleResponse>;\n\n try {\n body = (await response.json()) as GraphQLResponse<CurrentUserRoleResponse>;\n } catch {\n return authState;\n }\n\n if (body.errors?.some((error) => isUnauthorizedGraphQlMessage(error.message))) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return null;\n }\n\n const me = body.data?.user?.me;\n if (!isPluginEditorRole(me?.role)) return authState;\n\n const hydratedAuthState: AuthState = {\n ...authState,\n userId: typeof me._id === 'string' && me._id.trim().length > 0 ? me._id : authState.userId,\n email: typeof me.email === 'string' && me.email.trim().length > 0 ? me.email : authState.email,\n role: me.role,\n };\n\n await writeAuthState(config.authStatePath, hydratedAuthState);\n return hydratedAuthState;\n};\n\nexport const fetchPublishedSkillsGraphQl = async <TData>({\n worktree,\n config,\n query,\n variables,\n signal,\n onAuthStateChanged,\n operationName,\n}: {\n worktree: string;\n config: ResolvedConfig;\n query: string;\n variables: Record<string, unknown>;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n operationName?: string;\n}): Promise<\n | { ok: true; data: TData; fetchedAt: string }\n | { ok: false; result: Extract<FetchResult, { ok: false }> }\n> => {\n const authState = await resolveStoredAuthState(worktree, config);\n const fetchedAt = new Date().toISOString();\n\n if (!authState) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'missing_auth',\n authMode: 'missing',\n message:\n 'No plugin session is stored. Interactive opencode_wizard_published_skills_fetch can bootstrap browser login automatically when needed. Configured backend and GraphQL URLs are shown for visibility, but no GraphQL request was made because auth is missing.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n let response: Response;\n\n try {\n response = await fetch(config.graphqlUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({ query, variables }),\n signal,\n });\n } catch (error) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: error instanceof Error ? error.message : 'Unknown fetch error',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (response.status === 401 || response.status === 403) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return {\n ok: false,\n result: {\n ok: false,\n status: 'missing_auth',\n authMode: 'session',\n message:\n 'Stored plugin session was rejected by the backend. Retry opencode_wizard_published_skills_fetch to bootstrap a fresh browser login automatically.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (!response.ok) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: `GraphQL request failed with HTTP ${response.status}.`,\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n let body: GraphQLResponse<TData>;\n\n try {\n body = (await response.json()) as GraphQLResponse<TData>;\n } catch (error) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: `GraphQL response was not valid JSON: ${error instanceof Error ? error.message : 'Unknown parse error'}`,\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (body.errors?.length) {\n const graphQlErrors = body.errors.map(formatGraphQlError);\n const operationPrefix = operationName ? `${operationName}: ` : '';\n const message = `${operationPrefix}${graphQlErrors.join('; ')}`;\n\n if (body.errors.some((error) => isUnauthorizedGraphQlMessage(error.message))) {\n await clearAuthState(config.authStatePath);\n onAuthStateChanged?.();\n return {\n ok: false,\n result: {\n ok: false,\n status: 'missing_auth',\n authMode: 'session',\n message:\n 'Stored plugin session is no longer valid. Retry opencode_wizard_published_skills_fetch to bootstrap a fresh browser login automatically.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message,\n graphQlErrors,\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n if (!body.data) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: 'GraphQL response did not include data.',\n fetchedAt,\n source: 'network',\n },\n };\n }\n\n return { ok: true, data: body.data, fetchedAt };\n};\n\nexport const fetchPublishedSkillsCatalog = async (\n worktree: string,\n config: ResolvedConfig,\n resolution: WorkspaceResolution,\n signal: AbortSignal,\n recommendationContext?: string | null,\n source: PluginEventSource = 'OPENCODE',\n onAuthStateChanged?: () => void,\n): Promise<FetchResult> => {\n const response = await fetchPublishedSkillsGraphQl<PublishedSkillCatalogResponse>({\n worktree,\n config,\n query: PUBLISHED_SKILLS_CATALOG_QUERY,\n variables: { input: { ...toDeliveryInput(resolution), source, recommendationContext } },\n signal,\n onAuthStateChanged,\n operationName: 'pluginPublishedSkills',\n });\n\n if (!response.ok) return response.result;\n\n const payload = response.data.pluginPublishedSkills;\n\n if (!payload) {\n return {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: 'GraphQL response did not include pluginPublishedSkills.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n }\n\n return {\n ok: true,\n status: 'ready',\n authMode: 'session',\n payload,\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n};\n\nexport const fetchWizardArtifactsCatalog = async (\n worktree: string,\n config: ResolvedConfig,\n resolution: WorkspaceResolution,\n artifactKind: WizardArtifactKind,\n signal: AbortSignal,\n recommendationContext?: string | null,\n source: PluginEventSource = 'OPENCODE',\n onAuthStateChanged?: () => void,\n): Promise<WizardArtifactFetchResult> => {\n const response = await fetchPublishedSkillsGraphQl<WizardArtifactCatalogResponse>({\n worktree,\n config,\n query: WIZARD_ARTIFACTS_CATALOG_QUERY,\n variables: { input: { ...toDeliveryInput(resolution), artifactKind, source, recommendationContext } },\n signal,\n onAuthStateChanged,\n operationName: 'pluginWizardArtifacts',\n });\n\n if (!response.ok) return response.result;\n\n const payload = response.data.pluginWizardArtifacts;\n if (!payload) {\n return {\n ok: false,\n status: 'request_failed',\n authMode: 'session',\n message: 'GraphQL response did not include pluginWizardArtifacts.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n }\n\n return {\n ok: true,\n status: 'ready',\n authMode: 'session',\n payload,\n fetchedAt: response.fetchedAt,\n source: 'network',\n };\n};\n\nexport const maybePersistWorkspaceSlugFromCatalog = async ({\n config,\n resolution,\n fetchResult,\n}: {\n config: ResolvedConfig;\n resolution: WorkspaceResolution;\n fetchResult: FetchResult;\n}): Promise<void> => {\n if (!fetchResult.ok) return;\n\n const backendWorkspaceSlug = fetchResult.payload.workspace?.slug?.trim();\n if (!backendWorkspaceSlug) return;\n\n const normalizedWorkspaceSlug = toWorkspaceSlug(backendWorkspaceSlug);\n if (!normalizedWorkspaceSlug) return;\n\n if (resolution.workspaceSlug === normalizedWorkspaceSlug && resolution.workspaceSlugSource !== 'fallback') return;\n\n await upsertWorkspaceSlugMapping({\n configFile: config.authStatePath,\n repositoryUrl: resolution.repositoryUrl,\n repositoryRoot: resolution.repositoryRoot,\n workspaceSlug: normalizedWorkspaceSlug,\n });\n};\n\nexport const fetchPublishedSkillDetail = async ({\n worktree,\n config,\n resolution,\n skillVersionId,\n artifactVersionId,\n signal,\n onAuthStateChanged,\n purpose,\n source = 'OPENCODE',\n}: {\n worktree: string;\n config: ResolvedConfig;\n resolution: WorkspaceResolution;\n skillVersionId: string;\n artifactVersionId: string;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n purpose: PublishedSkillArtifactDetailPurpose;\n source?: PluginEventSource;\n}): Promise<\n | { ok: true; artifact: PublishedSkillArtifactDetailPayload }\n | {\n ok: false;\n result: {\n ok: false;\n status: 'not_found';\n authMode: 'session';\n message: string;\n fetchedAt: string;\n source: 'network';\n };\n }\n | { ok: false; result: Extract<FetchResult, { ok: false }> }\n> => {\n const wizardArtifactResponse = await fetchPublishedSkillsGraphQl<WizardArtifactDetailResponse>({\n worktree,\n config,\n query: WIZARD_ARTIFACT_DETAIL_QUERY,\n variables: {\n input: { ...toDeliveryInput(resolution), artifactKind: 'SKILL', artifactVersionId, purpose, source },\n },\n signal,\n onAuthStateChanged,\n operationName: 'pluginWizardArtifactVersion',\n });\n\n if (!wizardArtifactResponse.ok && wizardArtifactResponse.result.status === 'missing_auth') {\n return wizardArtifactResponse;\n }\n\n if (wizardArtifactResponse.ok) {\n const wizardArtifact = wizardArtifactResponse.data.pluginWizardArtifactVersion;\n if (wizardArtifact) return { ok: true, artifact: wizardArtifact };\n }\n\n const response = await fetchPublishedSkillsGraphQl<PublishedSkillDetailResponse>({\n worktree,\n config,\n query: PUBLISHED_SKILL_DETAIL_QUERY,\n variables: {\n input: { ...toDeliveryInput(resolution), skillVersionId, purpose, source },\n },\n signal,\n onAuthStateChanged,\n operationName: 'pluginPublishedSkillVersionArtifact',\n });\n\n if (!response.ok) return wizardArtifactResponse.ok ? response : wizardArtifactResponse;\n\n const artifact = response.data.pluginPublishedSkillVersionArtifact;\n\n if (!artifact) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'not_found',\n authMode: 'session',\n message: 'Published skill detail is not effective for the current scope.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n },\n };\n }\n\n return { ok: true, artifact };\n};\n\nexport const fetchWizardArtifactDetail = async ({\n worktree,\n config,\n resolution,\n artifactKind,\n artifactVersionId,\n signal,\n onAuthStateChanged,\n purpose,\n source = 'OPENCODE',\n}: {\n worktree: string;\n config: ResolvedConfig;\n resolution: WorkspaceResolution;\n artifactKind: WizardArtifactKind;\n artifactVersionId: string;\n signal: AbortSignal;\n onAuthStateChanged?: () => void;\n purpose: PublishedSkillArtifactDetailPurpose;\n source?: PluginEventSource;\n}): Promise<\n | { ok: true; artifact: WizardArtifactDetailPayload }\n | {\n ok: false;\n result: {\n ok: false;\n status: 'not_found';\n authMode: 'session';\n message: string;\n fetchedAt: string;\n source: 'network';\n };\n }\n | { ok: false; result: Extract<FetchResult, { ok: false }> }\n> => {\n const response = await fetchPublishedSkillsGraphQl<WizardArtifactDetailResponse>({\n worktree,\n config,\n query: WIZARD_ARTIFACT_DETAIL_QUERY,\n variables: {\n input: { ...toDeliveryInput(resolution), artifactKind, artifactVersionId, purpose, source },\n },\n signal,\n onAuthStateChanged,\n operationName: 'pluginWizardArtifactVersion',\n });\n\n if (!response.ok) return response;\n\n const artifact = response.data.pluginWizardArtifactVersion;\n if (!artifact) {\n return {\n ok: false,\n result: {\n ok: false,\n status: 'not_found',\n authMode: 'session',\n message: 'Wizard artifact detail is not effective for the current scope.',\n fetchedAt: response.fetchedAt,\n source: 'network',\n },\n };\n }\n\n return { ok: true, artifact };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,23 +1,25 @@
1
- import type { PublishedSkillPreferenceAction, PublishedSkillPreferenceCacheContext, PublishedSkillsIgnoreState, ResolvedConfig, WorkspaceResolution } from './types.js';
1
+ import type { PublishedSkillPreferenceAction, PublishedSkillPreferenceCacheContext, PluginEventSource, PublishedSkillsIgnoreState, ResolvedConfig, WorkspaceResolution } from './types.js';
2
2
  export declare const toIgnoredSkillSlug: (value: string) => string | null;
3
3
  export declare const toPublishedSkillPreferenceAction: (value: string) => PublishedSkillPreferenceAction;
4
4
  export declare const toPublishedSkillPreferenceScope: (value: string | undefined, defaultScope: "global" | "project") => "global" | "project";
5
5
  export declare const resolvePublishedSkillPreferenceCacheContext: (config: ResolvedConfig) => Promise<PublishedSkillPreferenceCacheContext>;
6
6
  export declare const getCatalogCacheKey: (workspaceResolution: WorkspaceResolution, preferenceContext: PublishedSkillPreferenceCacheContext) => string;
7
7
  export declare const GLOBAL_SKILL_MANAGEMENT_HINT = "Per-user global starter/global skills can be disabled with opencode_wizard_published_skill_preference_set skill=<slug> action=ignore preferenceScope=global and re-enabled with action=unignore preferenceScope=global.";
8
- export declare const setPublishedSkillIgnored: ({ worktree, directory, skillSlug, ignored, preferenceScope, }: {
8
+ export declare const setPublishedSkillIgnored: ({ worktree, directory, skillSlug, ignored, preferenceScope, source, }: {
9
9
  worktree: string;
10
10
  directory: string;
11
11
  scopeKey?: string;
12
12
  skillSlug: string;
13
13
  ignored: boolean;
14
14
  preferenceScope?: "global" | "project";
15
+ source?: PluginEventSource;
15
16
  }) => Promise<PublishedSkillsIgnoreState>;
16
- export declare const setPublishedSkillInstalled: ({ worktree, directory, skillSlug, installed, preferenceScope, }: {
17
+ export declare const setPublishedSkillInstalled: ({ worktree, directory, skillSlug, installed, preferenceScope, source, }: {
17
18
  worktree: string;
18
19
  directory: string;
19
20
  scopeKey?: string;
20
21
  skillSlug: string;
21
22
  installed: boolean;
22
23
  preferenceScope: "global" | "project";
24
+ source?: PluginEventSource;
23
25
  }) => Promise<PublishedSkillsIgnoreState>;
@@ -44,7 +44,8 @@ const setPublishedSkillPreference = async ({
44
44
  skillSlug,
45
45
  preferenceScope,
46
46
  installed,
47
- ignored
47
+ ignored,
48
+ source = 'OPENCODE'
48
49
  }) => {
49
50
  const workspaceResolution = await resolveWorkspace({
50
51
  config,
@@ -58,6 +59,7 @@ const setPublishedSkillPreference = async ({
58
59
  input: {
59
60
  ...toDeliveryInput(workspaceResolution),
60
61
  skillSlug,
62
+ source,
61
63
  preferenceScope: toBackendPreferenceScope(preferenceScope),
62
64
  installed,
63
65
  ignored
@@ -84,7 +86,8 @@ export const setPublishedSkillIgnored = async ({
84
86
  directory,
85
87
  skillSlug,
86
88
  ignored,
87
- preferenceScope
89
+ preferenceScope,
90
+ source
88
91
  }) => {
89
92
  const config = await resolveConfig(worktree);
90
93
  const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);
@@ -97,7 +100,8 @@ export const setPublishedSkillIgnored = async ({
97
100
  config,
98
101
  skillSlug: normalizedSkillSlug,
99
102
  preferenceScope: preferenceScope ?? 'project',
100
- ignored
103
+ ignored,
104
+ source
101
105
  });
102
106
  };
103
107
  export const setPublishedSkillInstalled = async ({
@@ -105,7 +109,8 @@ export const setPublishedSkillInstalled = async ({
105
109
  directory,
106
110
  skillSlug,
107
111
  installed,
108
- preferenceScope
112
+ preferenceScope,
113
+ source
109
114
  }) => {
110
115
  const config = await resolveConfig(worktree);
111
116
  const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);
@@ -118,7 +123,8 @@ export const setPublishedSkillInstalled = async ({
118
123
  config,
119
124
  skillSlug: normalizedSkillSlug,
120
125
  preferenceScope,
121
- installed
126
+ installed,
127
+ source
122
128
  });
123
129
  };
124
130
  //# sourceMappingURL=preferences.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["SET_PUBLISHED_SKILL_PREFERENCE_MUTATION","readGlobalAuthState","toStoredUserKey","fetchPublishedSkillsGraphQl","PRESENCE_EVENT_TIMEOUT_MS","resolveConfig","resolveWorkspace","toDeliveryInput","publishedSkillPreferenceCacheVersion","toIgnoredSkillSlug","value","normalized","trim","toLowerCase","toPublishedSkillPreferenceAction","Error","toPublishedSkillPreferenceScope","defaultScope","resolvePublishedSkillPreferenceCacheContext","config","authState","authStatePath","userKey","preferenceVersion","getCatalogCacheKey","workspaceResolution","preferenceContext","JSON","stringify","cacheKey","toBackendPreferenceScope","preferenceScope","GLOBAL_SKILL_MANAGEMENT_HINT","setPublishedSkillPreference","worktree","directory","skillSlug","installed","ignored","response","query","variables","input","signal","AbortSignal","timeout","ok","result","message","preferences","data","scopeKey","ignoredSkillSlugs","ignoredSkills","map","item","skill","slug","installedGlobalSkillSlugs","installedWorkspaceSkillSlugs","globalSkillManagementHint","setPublishedSkillIgnored","normalizedSkillSlug","setPublishedSkillInstalled"],"sources":["../../src/server/preferences.ts"],"sourcesContent":["import { SET_PUBLISHED_SKILL_PREFERENCE_MUTATION } from '../graphql-operations.js';\nimport { readGlobalAuthState, toStoredUserKey } from './auth-store.js';\nimport { fetchPublishedSkillsGraphQl } from './client.js';\nimport { PRESENCE_EVENT_TIMEOUT_MS } from './constants.js';\nimport { resolveConfig } from './config.js';\nimport { resolveWorkspace, toDeliveryInput } from './workspace.js';\nimport type {\n PublishedSkillPreferenceAction,\n PublishedSkillPreferenceCacheContext,\n PublishedSkillPreferenceScope,\n PublishedSkillsIgnoreState,\n ResolvedConfig,\n SetPublishedSkillPreferenceResponse,\n WorkspaceResolution,\n} from './types.js';\n\nlet publishedSkillPreferenceCacheVersion = 0;\n\nexport const toIgnoredSkillSlug = (value: string): string | null => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n return normalized;\n};\n\nexport const toPublishedSkillPreferenceAction = (value: string): PublishedSkillPreferenceAction => {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === 'install' ||\n normalized === 'uninstall' ||\n normalized === 'ignore' ||\n normalized === 'unignore'\n ) {\n return normalized;\n }\n\n throw new Error('Published skill preference action must be one of: install, uninstall, ignore, unignore.');\n};\n\nexport const toPublishedSkillPreferenceScope = (\n value: string | undefined,\n defaultScope: 'global' | 'project',\n): 'global' | 'project' => {\n if (!value) return defaultScope;\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'global' || normalized === 'project') return normalized;\n if (normalized === 'workspace') return 'project';\n\n throw new Error('Published skill preferenceScope must be global, project, or workspace.');\n};\n\nexport const resolvePublishedSkillPreferenceCacheContext = async (\n config: ResolvedConfig,\n): Promise<PublishedSkillPreferenceCacheContext> => {\n const authState = await readGlobalAuthState(config.authStatePath);\n\n return {\n userKey: toStoredUserKey(authState),\n preferenceVersion: publishedSkillPreferenceCacheVersion,\n };\n};\n\nexport const getCatalogCacheKey = (\n workspaceResolution: WorkspaceResolution,\n preferenceContext: PublishedSkillPreferenceCacheContext,\n): string => JSON.stringify([workspaceResolution.cacheKey, preferenceContext.userKey, preferenceContext.preferenceVersion]);\n\nconst toBackendPreferenceScope = (preferenceScope: 'global' | 'project'): PublishedSkillPreferenceScope => {\n if (preferenceScope === 'global') return 'GLOBAL';\n return 'WORKSPACE';\n};\n\nexport const GLOBAL_SKILL_MANAGEMENT_HINT =\n 'Per-user global starter/global skills can be disabled with opencode_wizard_published_skill_preference_set skill=<slug> action=ignore preferenceScope=global and re-enabled with action=unignore preferenceScope=global.';\n\nconst setPublishedSkillPreference = async ({\n worktree,\n directory,\n config,\n skillSlug,\n preferenceScope,\n installed,\n ignored,\n}: {\n worktree: string;\n directory: string;\n config: ResolvedConfig;\n skillSlug: string;\n preferenceScope: 'global' | 'project';\n installed?: boolean;\n ignored?: boolean;\n}): Promise<PublishedSkillsIgnoreState> => {\n const workspaceResolution = await resolveWorkspace({ config, directory });\n const response = await fetchPublishedSkillsGraphQl<SetPublishedSkillPreferenceResponse>({\n worktree,\n config,\n query: SET_PUBLISHED_SKILL_PREFERENCE_MUTATION,\n variables: {\n input: {\n ...toDeliveryInput(workspaceResolution),\n skillSlug,\n preferenceScope: toBackendPreferenceScope(preferenceScope),\n installed,\n ignored,\n },\n },\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(response.result.message);\n }\n\n const preferences = response.data.setPublishedSkillPreference;\n publishedSkillPreferenceCacheVersion += 1;\n\n return {\n scopeKey: preferences.scopeKey,\n userKey: preferences.userKey,\n ignoredSkillSlugs: preferences.ignoredSkills.map((item) => item.skill.slug),\n installedGlobalSkillSlugs: [],\n installedWorkspaceSkillSlugs: [],\n globalSkillManagementHint: GLOBAL_SKILL_MANAGEMENT_HINT,\n };\n};\n\nexport const setPublishedSkillIgnored = async ({\n worktree,\n directory,\n skillSlug,\n ignored,\n preferenceScope,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n ignored: boolean;\n preferenceScope?: 'global' | 'project';\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope: preferenceScope ?? 'project',\n ignored,\n });\n};\n\nexport const setPublishedSkillInstalled = async ({\n worktree,\n directory,\n skillSlug,\n installed,\n preferenceScope,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n installed: boolean;\n preferenceScope: 'global' | 'project';\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope,\n installed,\n });\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["SET_PUBLISHED_SKILL_PREFERENCE_MUTATION","readGlobalAuthState","toStoredUserKey","fetchPublishedSkillsGraphQl","PRESENCE_EVENT_TIMEOUT_MS","resolveConfig","resolveWorkspace","toDeliveryInput","publishedSkillPreferenceCacheVersion","toIgnoredSkillSlug","value","normalized","trim","toLowerCase","toPublishedSkillPreferenceAction","Error","toPublishedSkillPreferenceScope","defaultScope","resolvePublishedSkillPreferenceCacheContext","config","authState","authStatePath","userKey","preferenceVersion","getCatalogCacheKey","workspaceResolution","preferenceContext","JSON","stringify","cacheKey","toBackendPreferenceScope","preferenceScope","GLOBAL_SKILL_MANAGEMENT_HINT","setPublishedSkillPreference","worktree","directory","skillSlug","installed","ignored","source","response","query","variables","input","signal","AbortSignal","timeout","ok","result","message","preferences","data","scopeKey","ignoredSkillSlugs","ignoredSkills","map","item","skill","slug","installedGlobalSkillSlugs","installedWorkspaceSkillSlugs","globalSkillManagementHint","setPublishedSkillIgnored","normalizedSkillSlug","setPublishedSkillInstalled"],"sources":["../../src/server/preferences.ts"],"sourcesContent":["import { SET_PUBLISHED_SKILL_PREFERENCE_MUTATION } from '../graphql-operations.js';\nimport { readGlobalAuthState, toStoredUserKey } from './auth-store.js';\nimport { fetchPublishedSkillsGraphQl } from './client.js';\nimport { PRESENCE_EVENT_TIMEOUT_MS } from './constants.js';\nimport { resolveConfig } from './config.js';\nimport { resolveWorkspace, toDeliveryInput } from './workspace.js';\nimport type {\n PublishedSkillPreferenceAction,\n PublishedSkillPreferenceCacheContext,\n PublishedSkillPreferenceScope,\n PluginEventSource,\n PublishedSkillsIgnoreState,\n ResolvedConfig,\n SetPublishedSkillPreferenceResponse,\n WorkspaceResolution,\n} from './types.js';\n\nlet publishedSkillPreferenceCacheVersion = 0;\n\nexport const toIgnoredSkillSlug = (value: string): string | null => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n return normalized;\n};\n\nexport const toPublishedSkillPreferenceAction = (value: string): PublishedSkillPreferenceAction => {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === 'install' ||\n normalized === 'uninstall' ||\n normalized === 'ignore' ||\n normalized === 'unignore'\n ) {\n return normalized;\n }\n\n throw new Error('Published skill preference action must be one of: install, uninstall, ignore, unignore.');\n};\n\nexport const toPublishedSkillPreferenceScope = (\n value: string | undefined,\n defaultScope: 'global' | 'project',\n): 'global' | 'project' => {\n if (!value) return defaultScope;\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'global' || normalized === 'project') return normalized;\n if (normalized === 'workspace') return 'project';\n\n throw new Error('Published skill preferenceScope must be global, project, or workspace.');\n};\n\nexport const resolvePublishedSkillPreferenceCacheContext = async (\n config: ResolvedConfig,\n): Promise<PublishedSkillPreferenceCacheContext> => {\n const authState = await readGlobalAuthState(config.authStatePath);\n\n return {\n userKey: toStoredUserKey(authState),\n preferenceVersion: publishedSkillPreferenceCacheVersion,\n };\n};\n\nexport const getCatalogCacheKey = (\n workspaceResolution: WorkspaceResolution,\n preferenceContext: PublishedSkillPreferenceCacheContext,\n): string => JSON.stringify([workspaceResolution.cacheKey, preferenceContext.userKey, preferenceContext.preferenceVersion]);\n\nconst toBackendPreferenceScope = (preferenceScope: 'global' | 'project'): PublishedSkillPreferenceScope => {\n if (preferenceScope === 'global') return 'GLOBAL';\n return 'WORKSPACE';\n};\n\nexport const GLOBAL_SKILL_MANAGEMENT_HINT =\n 'Per-user global starter/global skills can be disabled with opencode_wizard_published_skill_preference_set skill=<slug> action=ignore preferenceScope=global and re-enabled with action=unignore preferenceScope=global.';\n\nconst setPublishedSkillPreference = async ({\n worktree,\n directory,\n config,\n skillSlug,\n preferenceScope,\n installed,\n ignored,\n source = 'OPENCODE',\n}: {\n worktree: string;\n directory: string;\n config: ResolvedConfig;\n skillSlug: string;\n preferenceScope: 'global' | 'project';\n installed?: boolean;\n ignored?: boolean;\n source?: PluginEventSource;\n}): Promise<PublishedSkillsIgnoreState> => {\n const workspaceResolution = await resolveWorkspace({ config, directory });\n const response = await fetchPublishedSkillsGraphQl<SetPublishedSkillPreferenceResponse>({\n worktree,\n config,\n query: SET_PUBLISHED_SKILL_PREFERENCE_MUTATION,\n variables: {\n input: {\n ...toDeliveryInput(workspaceResolution),\n skillSlug,\n source,\n preferenceScope: toBackendPreferenceScope(preferenceScope),\n installed,\n ignored,\n },\n },\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(response.result.message);\n }\n\n const preferences = response.data.setPublishedSkillPreference;\n publishedSkillPreferenceCacheVersion += 1;\n\n return {\n scopeKey: preferences.scopeKey,\n userKey: preferences.userKey,\n ignoredSkillSlugs: preferences.ignoredSkills.map((item) => item.skill.slug),\n installedGlobalSkillSlugs: [],\n installedWorkspaceSkillSlugs: [],\n globalSkillManagementHint: GLOBAL_SKILL_MANAGEMENT_HINT,\n };\n};\n\nexport const setPublishedSkillIgnored = async ({\n worktree,\n directory,\n skillSlug,\n ignored,\n preferenceScope,\n source,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n ignored: boolean;\n preferenceScope?: 'global' | 'project';\n source?: PluginEventSource;\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope: preferenceScope ?? 'project',\n ignored,\n source,\n });\n};\n\nexport const setPublishedSkillInstalled = async ({\n worktree,\n directory,\n skillSlug,\n installed,\n preferenceScope,\n source,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n installed: boolean;\n preferenceScope: 'global' | 'project';\n source?: PluginEventSource;\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope,\n installed,\n source,\n });\n};\n"],"mappings":"AAAA,SAASA,uCAAuC,QAAQ,0BAA0B;AAClF,SAASC,mBAAmB,EAAEC,eAAe,QAAQ,iBAAiB;AACtE,SAASC,2BAA2B,QAAQ,aAAa;AACzD,SAASC,yBAAyB,QAAQ,gBAAgB;AAC1D,SAASC,aAAa,QAAQ,aAAa;AAC3C,SAASC,gBAAgB,EAAEC,eAAe,QAAQ,gBAAgB;AAYlE,IAAIC,oCAAoC,GAAG,CAAC;AAE5C,OAAO,MAAMC,kBAAkB,GAAIC,KAAa,IAAoB;EAClE,MAAMC,UAAU,GAAGD,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAC7C,IAAI,CAACF,UAAU,EAAE,OAAO,IAAI;EAC5B,OAAOA,UAAU;AACnB,CAAC;AAED,OAAO,MAAMG,gCAAgC,GAAIJ,KAAa,IAAqC;EACjG,MAAMC,UAAU,GAAGD,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAC7C,IACEF,UAAU,KAAK,SAAS,IACxBA,UAAU,KAAK,WAAW,IAC1BA,UAAU,KAAK,QAAQ,IACvBA,UAAU,KAAK,UAAU,EACzB;IACA,OAAOA,UAAU;EACnB;EAEA,MAAM,IAAII,KAAK,CAAC,yFAAyF,CAAC;AAC5G,CAAC;AAED,OAAO,MAAMC,+BAA+B,GAAGA,CAC7CN,KAAyB,EACzBO,YAAkC,KACT;EACzB,IAAI,CAACP,KAAK,EAAE,OAAOO,YAAY;EAE/B,MAAMN,UAAU,GAAGD,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAC7C,IAAIF,UAAU,KAAK,QAAQ,IAAIA,UAAU,KAAK,SAAS,EAAE,OAAOA,UAAU;EAC1E,IAAIA,UAAU,KAAK,WAAW,EAAE,OAAO,SAAS;EAEhD,MAAM,IAAII,KAAK,CAAC,wEAAwE,CAAC;AAC3F,CAAC;AAED,OAAO,MAAMG,2CAA2C,GAAG,MACzDC,MAAsB,IAC4B;EAClD,MAAMC,SAAS,GAAG,MAAMnB,mBAAmB,CAACkB,MAAM,CAACE,aAAa,CAAC;EAEjE,OAAO;IACLC,OAAO,EAAEpB,eAAe,CAACkB,SAAS,CAAC;IACnCG,iBAAiB,EAAEf;EACrB,CAAC;AACH,CAAC;AAED,OAAO,MAAMgB,kBAAkB,GAAGA,CAChCC,mBAAwC,EACxCC,iBAAuD,KAC5CC,IAAI,CAACC,SAAS,CAAC,CAACH,mBAAmB,CAACI,QAAQ,EAAEH,iBAAiB,CAACJ,OAAO,EAAEI,iBAAiB,CAACH,iBAAiB,CAAC,CAAC;AAE3H,MAAMO,wBAAwB,GAAIC,eAAqC,IAAoC;EACzG,IAAIA,eAAe,KAAK,QAAQ,EAAE,OAAO,QAAQ;EACjD,OAAO,WAAW;AACpB,CAAC;AAED,OAAO,MAAMC,4BAA4B,GACvC,yNAAyN;AAE3N,MAAMC,2BAA2B,GAAG,MAAAA,CAAO;EACzCC,QAAQ;EACRC,SAAS;EACThB,MAAM;EACNiB,SAAS;EACTL,eAAe;EACfM,SAAS;EACTC,OAAO;EACPC,MAAM,GAAG;AAUX,CAAC,KAA0C;EACzC,MAAMd,mBAAmB,GAAG,MAAMnB,gBAAgB,CAAC;IAAEa,MAAM;IAAEgB;EAAU,CAAC,CAAC;EACzE,MAAMK,QAAQ,GAAG,MAAMrC,2BAA2B,CAAsC;IACtF+B,QAAQ;IACRf,MAAM;IACNsB,KAAK,EAAEzC,uCAAuC;IAC9C0C,SAAS,EAAE;MACTC,KAAK,EAAE;QACL,GAAGpC,eAAe,CAACkB,mBAAmB,CAAC;QACvCW,SAAS;QACTG,MAAM;QACNR,eAAe,EAAED,wBAAwB,CAACC,eAAe,CAAC;QAC1DM,SAAS;QACTC;MACF;IACF,CAAC;IACDM,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC1C,yBAAyB;EACvD,CAAC,CAAC;EAEF,IAAI,CAACoC,QAAQ,CAACO,EAAE,EAAE;IAChB,MAAM,IAAIhC,KAAK,CAACyB,QAAQ,CAACQ,MAAM,CAACC,OAAO,CAAC;EAC1C;EAEA,MAAMC,WAAW,GAAGV,QAAQ,CAACW,IAAI,CAAClB,2BAA2B;EAC7DzB,oCAAoC,IAAI,CAAC;EAEzC,OAAO;IACL4C,QAAQ,EAAEF,WAAW,CAACE,QAAQ;IAC9B9B,OAAO,EAAE4B,WAAW,CAAC5B,OAAO;IAC5B+B,iBAAiB,EAAEH,WAAW,CAACI,aAAa,CAACC,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,KAAK,CAACC,IAAI,CAAC;IAC3EC,yBAAyB,EAAE,EAAE;IAC7BC,4BAA4B,EAAE,EAAE;IAChCC,yBAAyB,EAAE7B;EAC7B,CAAC;AACH,CAAC;AAED,OAAO,MAAM8B,wBAAwB,GAAG,MAAAA,CAAO;EAC7C5B,QAAQ;EACRC,SAAS;EACTC,SAAS;EACTE,OAAO;EACPP,eAAe;EACfQ;AASF,CAAC,KAA0C;EACzC,MAAMpB,MAAM,GAAG,MAAMd,aAAa,CAAC6B,QAAQ,CAAC;EAC5C,MAAM6B,mBAAmB,GAAGtD,kBAAkB,CAAC2B,SAAS,CAAC;EAEzD,IAAI,CAAC2B,mBAAmB,EAAE;IACxB,MAAM,IAAIhD,KAAK,CAAC,8CAA8C,CAAC;EACjE;EAEA,OAAOkB,2BAA2B,CAAC;IACjCC,QAAQ;IACRC,SAAS;IACThB,MAAM;IACNiB,SAAS,EAAE2B,mBAAmB;IAC9BhC,eAAe,EAAEA,eAAe,IAAI,SAAS;IAC7CO,OAAO;IACPC;EACF,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMyB,0BAA0B,GAAG,MAAAA,CAAO;EAC/C9B,QAAQ;EACRC,SAAS;EACTC,SAAS;EACTC,SAAS;EACTN,eAAe;EACfQ;AASF,CAAC,KAA0C;EACzC,MAAMpB,MAAM,GAAG,MAAMd,aAAa,CAAC6B,QAAQ,CAAC;EAC5C,MAAM6B,mBAAmB,GAAGtD,kBAAkB,CAAC2B,SAAS,CAAC;EAEzD,IAAI,CAAC2B,mBAAmB,EAAE;IACxB,MAAM,IAAIhD,KAAK,CAAC,8CAA8C,CAAC;EACjE;EAEA,OAAOkB,2BAA2B,CAAC;IACjCC,QAAQ;IACRC,SAAS;IACThB,MAAM;IACNiB,SAAS,EAAE2B,mBAAmB;IAC9BhC,eAAe;IACfM,SAAS;IACTE;EACF,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}
@@ -1,14 +1,16 @@
1
- import type { AuthState, PluginActionEventType, PresenceEventType, ResolvedConfig } from './types.js';
2
- export declare const emitPresenceEvent: ({ config, authState, event, workspacePath, }: {
1
+ import type { AuthState, PluginActionEventType, PluginEventSource, PresenceEventType, ResolvedConfig } from './types.js';
2
+ export declare const emitPresenceEvent: ({ config, authState, event, source, workspacePath, }: {
3
3
  config: ResolvedConfig;
4
4
  authState: AuthState;
5
5
  event: PresenceEventType;
6
+ source?: PluginEventSource;
6
7
  workspacePath: string;
7
8
  }) => Promise<void>;
8
- export declare const emitPluginActionEvent: ({ config, authState, event, workspacePath, directoryPath, }: {
9
+ export declare const emitPluginActionEvent: ({ config, authState, event, source, workspacePath, directoryPath, }: {
9
10
  config: ResolvedConfig;
10
11
  authState: AuthState | null;
11
12
  event: PluginActionEventType;
13
+ source?: PluginEventSource;
12
14
  workspacePath: string;
13
15
  directoryPath?: string;
14
16
  }) => Promise<void>;
@@ -11,6 +11,7 @@ export const emitPresenceEvent = async ({
11
11
  config,
12
12
  authState,
13
13
  event,
14
+ source = 'OPENCODE',
14
15
  workspacePath
15
16
  }) => {
16
17
  for (let attempt = 1; attempt <= PRESENCE_EVENT_MAX_ATTEMPTS; attempt += 1) {
@@ -23,6 +24,7 @@ export const emitPresenceEvent = async ({
23
24
  },
24
25
  body: JSON.stringify({
25
26
  event,
27
+ source,
26
28
  occurredAt: new Date().toISOString(),
27
29
  workspacePath
28
30
  }),
@@ -41,6 +43,7 @@ export const emitPluginActionEvent = async ({
41
43
  config,
42
44
  authState,
43
45
  event,
46
+ source = 'OPENCODE',
44
47
  workspacePath,
45
48
  directoryPath
46
49
  }) => {
@@ -54,6 +57,7 @@ export const emitPluginActionEvent = async ({
54
57
  },
55
58
  body: JSON.stringify({
56
59
  event,
60
+ source,
57
61
  occurredAt: new Date().toISOString(),
58
62
  workspacePath,
59
63
  directoryPath
@@ -1 +1 @@
1
- {"version":3,"names":["PRESENCE_EVENT_MAX_ATTEMPTS","PRESENCE_EVENT_RETRY_DELAY_MS","PRESENCE_EVENT_TIMEOUT_MS","wait","milliseconds","Promise","resolve","setTimeout","shouldRetryPresenceEvent","status","emitPresenceEvent","config","authState","event","workspacePath","attempt","response","fetch","presenceUrl","method","headers","authorization","sessionToken","body","JSON","stringify","occurredAt","Date","toISOString","keepalive","signal","AbortSignal","timeout","ok","emitPluginActionEvent","directoryPath","actionsUrl"],"sources":["../../src/server/presence.ts"],"sourcesContent":["import {\n PRESENCE_EVENT_MAX_ATTEMPTS,\n PRESENCE_EVENT_RETRY_DELAY_MS,\n PRESENCE_EVENT_TIMEOUT_MS,\n} from './constants.js';\nimport type { AuthState, PluginActionEventType, PresenceEventType, ResolvedConfig } from './types.js';\n\nconst wait = async (milliseconds: number): Promise<void> => {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n};\n\nconst shouldRetryPresenceEvent = (status: number): boolean => {\n return status === 408 || status === 429 || status >= 500;\n};\n\nexport const emitPresenceEvent = async ({\n config,\n authState,\n event,\n workspacePath,\n}: {\n config: ResolvedConfig;\n authState: AuthState;\n event: PresenceEventType;\n workspacePath: string;\n}): Promise<void> => {\n for (let attempt = 1; attempt <= PRESENCE_EVENT_MAX_ATTEMPTS; attempt += 1) {\n try {\n const response = await fetch(config.presenceUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({\n event,\n occurredAt: new Date().toISOString(),\n workspacePath,\n }),\n keepalive: event === 'STOP',\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n\n if (response.ok) return;\n if (!shouldRetryPresenceEvent(response.status) || attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;\n } catch {\n if (attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;\n }\n\n await wait(PRESENCE_EVENT_RETRY_DELAY_MS * attempt);\n }\n};\n\nexport const emitPluginActionEvent = async ({\n config,\n authState,\n event,\n workspacePath,\n directoryPath,\n}: {\n config: ResolvedConfig;\n authState: AuthState | null;\n event: PluginActionEventType;\n workspacePath: string;\n directoryPath?: string;\n}): Promise<void> => {\n if (!authState) return;\n\n try {\n await fetch(config.actionsUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({\n event,\n occurredAt: new Date().toISOString(),\n workspacePath,\n directoryPath,\n }),\n keepalive: event === 'STOP',\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n } catch {\n return;\n }\n};\n"],"mappings":"AAAA,SACEA,2BAA2B,EAC3BC,6BAA6B,EAC7BC,yBAAyB,QACpB,gBAAgB;AAGvB,MAAMC,IAAI,GAAG,MAAOC,YAAoB,IAAoB;EAC1D,MAAM,IAAIC,OAAO,CAAQC,OAAO,IAAK;IACnCC,UAAU,CAACD,OAAO,EAAEF,YAAY,CAAC;EACnC,CAAC,CAAC;AACJ,CAAC;AAED,MAAMI,wBAAwB,GAAIC,MAAc,IAAc;EAC5D,OAAOA,MAAM,KAAK,GAAG,IAAIA,MAAM,KAAK,GAAG,IAAIA,MAAM,IAAI,GAAG;AAC1D,CAAC;AAED,OAAO,MAAMC,iBAAiB,GAAG,MAAAA,CAAO;EACtCC,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC;AAMF,CAAC,KAAoB;EACnB,KAAK,IAAIC,OAAO,GAAG,CAAC,EAAEA,OAAO,IAAIf,2BAA2B,EAAEe,OAAO,IAAI,CAAC,EAAE;IAC1E,IAAI;MACF,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACN,MAAM,CAACO,WAAW,EAAE;QAC/CC,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,cAAc,EAAE,kBAAkB;UAClCC,aAAa,EAAE,UAAUT,SAAS,CAACU,YAAY;QACjD,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;UACnBZ,KAAK;UACLa,UAAU,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UACpCd;QACF,CAAC,CAAC;QACFe,SAAS,EAAEhB,KAAK,KAAK,MAAM;QAC3BiB,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC9B,yBAAyB;MACvD,CAAC,CAAC;MAEF,IAAIc,QAAQ,CAACiB,EAAE,EAAE;MACjB,IAAI,CAACzB,wBAAwB,CAACQ,QAAQ,CAACP,MAAM,CAAC,IAAIM,OAAO,KAAKf,2BAA2B,EAAE;IAC7F,CAAC,CAAC,MAAM;MACN,IAAIe,OAAO,KAAKf,2BAA2B,EAAE;IAC/C;IAEA,MAAMG,IAAI,CAACF,6BAA6B,GAAGc,OAAO,CAAC;EACrD;AACF,CAAC;AAED,OAAO,MAAMmB,qBAAqB,GAAG,MAAAA,CAAO;EAC1CvB,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC,aAAa;EACbqB;AAOF,CAAC,KAAoB;EACnB,IAAI,CAACvB,SAAS,EAAE;EAEhB,IAAI;IACF,MAAMK,KAAK,CAACN,MAAM,CAACyB,UAAU,EAAE;MAC7BjB,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;QAClCC,aAAa,EAAE,UAAUT,SAAS,CAACU,YAAY;MACjD,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;QACnBZ,KAAK;QACLa,UAAU,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;QACpCd,aAAa;QACbqB;MACF,CAAC,CAAC;MACFN,SAAS,EAAEhB,KAAK,KAAK,MAAM;MAC3BiB,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC9B,yBAAyB;IACvD,CAAC,CAAC;EACJ,CAAC,CAAC,MAAM;IACN;EACF;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["PRESENCE_EVENT_MAX_ATTEMPTS","PRESENCE_EVENT_RETRY_DELAY_MS","PRESENCE_EVENT_TIMEOUT_MS","wait","milliseconds","Promise","resolve","setTimeout","shouldRetryPresenceEvent","status","emitPresenceEvent","config","authState","event","source","workspacePath","attempt","response","fetch","presenceUrl","method","headers","authorization","sessionToken","body","JSON","stringify","occurredAt","Date","toISOString","keepalive","signal","AbortSignal","timeout","ok","emitPluginActionEvent","directoryPath","actionsUrl"],"sources":["../../src/server/presence.ts"],"sourcesContent":["import {\n PRESENCE_EVENT_MAX_ATTEMPTS,\n PRESENCE_EVENT_RETRY_DELAY_MS,\n PRESENCE_EVENT_TIMEOUT_MS,\n} from './constants.js';\nimport type { AuthState, PluginActionEventType, PluginEventSource, PresenceEventType, ResolvedConfig } from './types.js';\n\nconst wait = async (milliseconds: number): Promise<void> => {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n};\n\nconst shouldRetryPresenceEvent = (status: number): boolean => {\n return status === 408 || status === 429 || status >= 500;\n};\n\nexport const emitPresenceEvent = async ({\n config,\n authState,\n event,\n source = 'OPENCODE',\n workspacePath,\n}: {\n config: ResolvedConfig;\n authState: AuthState;\n event: PresenceEventType;\n source?: PluginEventSource;\n workspacePath: string;\n}): Promise<void> => {\n for (let attempt = 1; attempt <= PRESENCE_EVENT_MAX_ATTEMPTS; attempt += 1) {\n try {\n const response = await fetch(config.presenceUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({\n event,\n source,\n occurredAt: new Date().toISOString(),\n workspacePath,\n }),\n keepalive: event === 'STOP',\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n\n if (response.ok) return;\n if (!shouldRetryPresenceEvent(response.status) || attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;\n } catch {\n if (attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;\n }\n\n await wait(PRESENCE_EVENT_RETRY_DELAY_MS * attempt);\n }\n};\n\nexport const emitPluginActionEvent = async ({\n config,\n authState,\n event,\n source = 'OPENCODE',\n workspacePath,\n directoryPath,\n}: {\n config: ResolvedConfig;\n authState: AuthState | null;\n event: PluginActionEventType;\n source?: PluginEventSource;\n workspacePath: string;\n directoryPath?: string;\n}): Promise<void> => {\n if (!authState) return;\n\n try {\n await fetch(config.actionsUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({\n event,\n source,\n occurredAt: new Date().toISOString(),\n workspacePath,\n directoryPath,\n }),\n keepalive: event === 'STOP',\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n } catch {\n return;\n }\n};\n"],"mappings":"AAAA,SACEA,2BAA2B,EAC3BC,6BAA6B,EAC7BC,yBAAyB,QACpB,gBAAgB;AAGvB,MAAMC,IAAI,GAAG,MAAOC,YAAoB,IAAoB;EAC1D,MAAM,IAAIC,OAAO,CAAQC,OAAO,IAAK;IACnCC,UAAU,CAACD,OAAO,EAAEF,YAAY,CAAC;EACnC,CAAC,CAAC;AACJ,CAAC;AAED,MAAMI,wBAAwB,GAAIC,MAAc,IAAc;EAC5D,OAAOA,MAAM,KAAK,GAAG,IAAIA,MAAM,KAAK,GAAG,IAAIA,MAAM,IAAI,GAAG;AAC1D,CAAC;AAED,OAAO,MAAMC,iBAAiB,GAAG,MAAAA,CAAO;EACtCC,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC,MAAM,GAAG,UAAU;EACnBC;AAOF,CAAC,KAAoB;EACnB,KAAK,IAAIC,OAAO,GAAG,CAAC,EAAEA,OAAO,IAAIhB,2BAA2B,EAAEgB,OAAO,IAAI,CAAC,EAAE;IAC1E,IAAI;MACF,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACP,MAAM,CAACQ,WAAW,EAAE;QAC/CC,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,cAAc,EAAE,kBAAkB;UAClCC,aAAa,EAAE,UAAUV,SAAS,CAACW,YAAY;QACjD,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;UACnBb,KAAK;UACLC,MAAM;UACNa,UAAU,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UACpCd;QACF,CAAC,CAAC;QACFe,SAAS,EAAEjB,KAAK,KAAK,MAAM;QAC3BkB,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC/B,yBAAyB;MACvD,CAAC,CAAC;MAEF,IAAIe,QAAQ,CAACiB,EAAE,EAAE;MACjB,IAAI,CAAC1B,wBAAwB,CAACS,QAAQ,CAACR,MAAM,CAAC,IAAIO,OAAO,KAAKhB,2BAA2B,EAAE;IAC7F,CAAC,CAAC,MAAM;MACN,IAAIgB,OAAO,KAAKhB,2BAA2B,EAAE;IAC/C;IAEA,MAAMG,IAAI,CAACF,6BAA6B,GAAGe,OAAO,CAAC;EACrD;AACF,CAAC;AAED,OAAO,MAAMmB,qBAAqB,GAAG,MAAAA,CAAO;EAC1CxB,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC,MAAM,GAAG,UAAU;EACnBC,aAAa;EACbqB;AAQF,CAAC,KAAoB;EACnB,IAAI,CAACxB,SAAS,EAAE;EAEhB,IAAI;IACF,MAAMM,KAAK,CAACP,MAAM,CAAC0B,UAAU,EAAE;MAC7BjB,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;QAClCC,aAAa,EAAE,UAAUV,SAAS,CAACW,YAAY;MACjD,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;QACnBb,KAAK;QACLC,MAAM;QACNa,UAAU,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;QACpCd,aAAa;QACbqB;MACF,CAAC,CAAC;MACFN,SAAS,EAAEjB,KAAK,KAAK,MAAM;MAC3BkB,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC/B,yBAAyB;IACvD,CAAC,CAAC;EACJ,CAAC,CAAC,MAAM;IACN;EACF;AACF,CAAC","ignoreList":[]}