@aexol/opencode-wizard 0.4.8 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/published-skills-system-note.js +1 -1
- package/dist/published-skills-system-note.js.map +1 -1
- package/dist/server/auth-flow.d.ts +3 -2
- package/dist/server/auth-flow.js +4 -2
- package/dist/server/auth-flow.js.map +1 -1
- package/dist/server/client.d.ts +7 -5
- package/dist/server/client.js +14 -7
- package/dist/server/client.js.map +1 -1
- package/dist/server/preferences.d.ts +5 -3
- package/dist/server/preferences.js +11 -5
- package/dist/server/preferences.js.map +1 -1
- package/dist/server/presence.d.ts +5 -3
- package/dist/server/presence.js +4 -0
- package/dist/server/presence.js.map +1 -1
- package/dist/server/runtime.d.ts +4 -2
- package/dist/server/runtime.js +18 -8
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/types.d.ts +1 -0
- package/dist/server/types.js.map +1 -1
- package/dist/server-opencode.js +3 -1
- package/dist/server-opencode.js.map +1 -1
- package/dist/server-pi.js +3 -1
- package/dist/server-pi.js.map +1 -1
- package/dist/smoke-published-skills.js +3 -3
- package/dist/smoke-published-skills.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,6 @@ export const buildPublishedSkillsSystemNote = ({
|
|
|
9
9
|
const renderedSkillNames = skillNames.length > 0 ? skillNames.slice(0, SYSTEM_NOTE_SKILL_NAME_LIMIT).join(', ') : 'none';
|
|
10
10
|
const remainingCount = Math.max(skillNames.length - SYSTEM_NOTE_SKILL_NAME_LIMIT, 0);
|
|
11
11
|
const renderedCountSuffix = remainingCount > 0 ? ` (+${remainingCount} more)` : '';
|
|
12
|
-
return [workspace ? `Workspace: ${workspace.slug}.` : 'Workspace not found; workspace-scoped wizard skills are unavailable.', `Directory: ${directoryPath}.`, `Wizard-listed skills (${skillNames.length}): ${renderedSkillNames}${renderedCountSuffix}.`, '
|
|
12
|
+
return [workspace ? `Workspace: ${workspace.slug}.` : 'Workspace not found; workspace-scoped wizard skills are unavailable.', `Directory: ${directoryPath}.`, `Wizard-listed skills (${skillNames.length}): ${renderedSkillNames}${renderedCountSuffix}.`, 'Skill rule: for every task, compare the task goal to wizard-listed skills. If one could apply, fetch its `SKILL.md` with `opencode_wizard_published_skills_fetch` before using guidance or choosing a same-named native/local skill; the fetched `SKILL.md` is authoritative.', 'Catalog/status metadata names candidates only, not executable guidance; native/local `.opencode/skills` or OpenCode skill bodies are fallback/source material only after no matching wizard body can be fetched.', 'If fetch/auth/catalog fails, report degraded wizard-skill context and continue with normal repo evidence when safe.', 'Use `refresh: true` before cache deletion; use `opencode_wizard_artifact_fetch` for non-skill wizard artifacts.'].filter(Boolean).join(' ');
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=published-skills-system-note.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SYSTEM_NOTE_SKILL_NAME_LIMIT","buildPublishedSkillsSystemNote","workspace","directoryPath","catalog","details","_details","skillNames","skills","map","skill","artifactName","skillName","skillSlug","renderedSkillNames","length","slice","join","remainingCount","Math","max","renderedCountSuffix","slug","filter","Boolean"],"sources":["../src/published-skills-system-note.ts"],"sourcesContent":["import type { PublishedSkillsSuccessState } from './published-skills-transform.js';\n\nconst SYSTEM_NOTE_SKILL_NAME_LIMIT = 10;\n\nexport const buildPublishedSkillsSystemNote = ({\n workspace,\n directoryPath,\n catalog,\n details: _details,\n}: {\n workspace: { slug: string } | null;\n directoryPath: string;\n catalog: PublishedSkillsSuccessState;\n details: unknown[];\n}): string => {\n const skillNames = catalog.skills.map((skill) => skill.artifactName || skill.skillName || skill.skillSlug);\n const renderedSkillNames =\n skillNames.length > 0 ? skillNames.slice(0, SYSTEM_NOTE_SKILL_NAME_LIMIT).join(', ') : 'none';\n const remainingCount = Math.max(skillNames.length - SYSTEM_NOTE_SKILL_NAME_LIMIT, 0);\n const renderedCountSuffix = remainingCount > 0 ? ` (+${remainingCount} more)` : '';\n\n return [\n workspace ? `Workspace: ${workspace.slug}.` : 'Workspace not found; workspace-scoped wizard skills are unavailable.',\n `Directory: ${directoryPath}.`,\n `Wizard-listed skills (${skillNames.length}): ${renderedSkillNames}${renderedCountSuffix}.`,\n '
|
|
1
|
+
{"version":3,"names":["SYSTEM_NOTE_SKILL_NAME_LIMIT","buildPublishedSkillsSystemNote","workspace","directoryPath","catalog","details","_details","skillNames","skills","map","skill","artifactName","skillName","skillSlug","renderedSkillNames","length","slice","join","remainingCount","Math","max","renderedCountSuffix","slug","filter","Boolean"],"sources":["../src/published-skills-system-note.ts"],"sourcesContent":["import type { PublishedSkillsSuccessState } from './published-skills-transform.js';\n\nconst SYSTEM_NOTE_SKILL_NAME_LIMIT = 10;\n\nexport const buildPublishedSkillsSystemNote = ({\n workspace,\n directoryPath,\n catalog,\n details: _details,\n}: {\n workspace: { slug: string } | null;\n directoryPath: string;\n catalog: PublishedSkillsSuccessState;\n details: unknown[];\n}): string => {\n const skillNames = catalog.skills.map((skill) => skill.artifactName || skill.skillName || skill.skillSlug);\n const renderedSkillNames =\n skillNames.length > 0 ? skillNames.slice(0, SYSTEM_NOTE_SKILL_NAME_LIMIT).join(', ') : 'none';\n const remainingCount = Math.max(skillNames.length - SYSTEM_NOTE_SKILL_NAME_LIMIT, 0);\n const renderedCountSuffix = remainingCount > 0 ? ` (+${remainingCount} more)` : '';\n\n return [\n workspace ? `Workspace: ${workspace.slug}.` : 'Workspace not found; workspace-scoped wizard skills are unavailable.',\n `Directory: ${directoryPath}.`,\n `Wizard-listed skills (${skillNames.length}): ${renderedSkillNames}${renderedCountSuffix}.`,\n 'Skill rule: for every task, compare the task goal to wizard-listed skills. If one could apply, fetch its `SKILL.md` with `opencode_wizard_published_skills_fetch` before using guidance or choosing a same-named native/local skill; the fetched `SKILL.md` is authoritative.',\n 'Catalog/status metadata names candidates only, not executable guidance; native/local `.opencode/skills` or OpenCode skill bodies are fallback/source material only after no matching wizard body can be fetched.',\n 'If fetch/auth/catalog fails, report degraded wizard-skill context and continue with normal repo evidence when safe.',\n 'Use `refresh: true` before cache deletion; use `opencode_wizard_artifact_fetch` for non-skill wizard artifacts.',\n ]\n .filter(Boolean)\n .join(' ');\n};\n"],"mappings":"AAEA,MAAMA,4BAA4B,GAAG,EAAE;AAEvC,OAAO,MAAMC,8BAA8B,GAAGA,CAAC;EAC7CC,SAAS;EACTC,aAAa;EACbC,OAAO;EACPC,OAAO,EAAEC;AAMX,CAAC,KAAa;EACZ,MAAMC,UAAU,GAAGH,OAAO,CAACI,MAAM,CAACC,GAAG,CAAEC,KAAK,IAAKA,KAAK,CAACC,YAAY,IAAID,KAAK,CAACE,SAAS,IAAIF,KAAK,CAACG,SAAS,CAAC;EAC1G,MAAMC,kBAAkB,GACtBP,UAAU,CAACQ,MAAM,GAAG,CAAC,GAAGR,UAAU,CAACS,KAAK,CAAC,CAAC,EAAEhB,4BAA4B,CAAC,CAACiB,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM;EAC/F,MAAMC,cAAc,GAAGC,IAAI,CAACC,GAAG,CAACb,UAAU,CAACQ,MAAM,GAAGf,4BAA4B,EAAE,CAAC,CAAC;EACpF,MAAMqB,mBAAmB,GAAGH,cAAc,GAAG,CAAC,GAAG,MAAMA,cAAc,QAAQ,GAAG,EAAE;EAElF,OAAO,CACLhB,SAAS,GAAG,cAAcA,SAAS,CAACoB,IAAI,GAAG,GAAG,sEAAsE,EACpH,cAAcnB,aAAa,GAAG,EAC9B,yBAAyBI,UAAU,CAACQ,MAAM,MAAMD,kBAAkB,GAAGO,mBAAmB,GAAG,EAC3F,+QAA+Q,EAC/Q,kNAAkN,EAClN,qHAAqH,EACrH,iHAAiH,CAClH,CACEE,MAAM,CAACC,OAAO,CAAC,CACfP,IAAI,CAAC,GAAG,CAAC;AACd,CAAC","ignoreList":[]}
|
|
@@ -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>;
|
package/dist/server/auth-flow.js
CHANGED
|
@@ -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":"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","ignoreList":[]}
|
package/dist/server/client.d.ts
CHANGED
|
@@ -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;
|
package/dist/server/client.js
CHANGED
|
@@ -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":"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","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>;
|