workos 0.12.2 → 0.13.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.
- package/README.md +16 -12
- package/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/auth-status.js +2 -1
- package/dist/commands/auth-status.js.map +1 -1
- package/dist/commands/claim.js +4 -3
- package/dist/commands/claim.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +1 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/install-skill.d.ts +64 -3
- package/dist/commands/install-skill.js +213 -27
- package/dist/commands/install-skill.js.map +1 -1
- package/dist/commands/install.js +5 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +13 -0
- package/dist/commands/login.js +43 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/doctor/checks/ai-analysis.js +4 -3
- package/dist/doctor/checks/ai-analysis.js.map +1 -1
- package/dist/doctor/checks/skills.d.ts +9 -0
- package/dist/doctor/checks/skills.js +84 -0
- package/dist/doctor/checks/skills.js.map +1 -0
- package/dist/doctor/index.d.ts +21 -1
- package/dist/doctor/index.js +52 -1
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/issues.js +15 -0
- package/dist/doctor/issues.js.map +1 -1
- package/dist/doctor/output.js +16 -0
- package/dist/doctor/output.js.map +1 -1
- package/dist/doctor/types.d.ts +27 -0
- package/dist/doctor/types.js.map +1 -1
- package/dist/lib/adapters/cli-adapter.js +2 -1
- package/dist/lib/adapters/cli-adapter.js.map +1 -1
- package/dist/lib/agent-interface.js +38 -14
- package/dist/lib/agent-interface.js.map +1 -1
- package/dist/lib/credential-proxy.js +2 -1
- package/dist/lib/credential-proxy.js.map +1 -1
- package/dist/lib/device-auth.js +26 -10
- package/dist/lib/device-auth.js.map +1 -1
- package/dist/lib/ensure-auth.js +4 -3
- package/dist/lib/ensure-auth.js.map +1 -1
- package/dist/lib/installer-core.d.ts +3 -3
- package/dist/lib/resolve-install-credentials.js +4 -4
- package/dist/lib/resolve-install-credentials.js.map +1 -1
- package/dist/lib/run-with-core.js +3 -1
- package/dist/lib/run-with-core.js.map +1 -1
- package/dist/lib/token-refresh-client.js +2 -1
- package/dist/lib/token-refresh-client.js.map +1 -1
- package/dist/lib/token-refresh.d.ts +1 -1
- package/dist/lib/token-refresh.js +3 -2
- package/dist/lib/token-refresh.js.map +1 -1
- package/dist/utils/command-invocation.d.ts +8 -0
- package/dist/utils/command-invocation.js +17 -0
- package/dist/utils/command-invocation.js.map +1 -0
- package/dist/utils/exit-codes.js +3 -1
- package/dist/utils/exit-codes.js.map +1 -1
- package/dist/utils/help-json.js +8 -0
- package/dist/utils/help-json.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/doctor/issues.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Issue, DoctorReport } from './types.js';\nimport { getInstallHint, languageToSdkLanguage } from './checks/language.js';\n\nexport const ISSUE_DEFINITIONS = {\n MISSING_API_KEY: {\n severity: 'error' as const,\n message: 'WORKOS_API_KEY environment variable not set',\n remediation: 'Set WORKOS_API_KEY in your .env.local file',\n docsUrl: 'https://dashboard.workos.com/api-keys',\n },\n MISSING_CLIENT_ID: {\n severity: 'error' as const,\n message: 'WORKOS_CLIENT_ID environment variable not set',\n remediation: 'Set WORKOS_CLIENT_ID in your .env.local file',\n docsUrl: 'https://dashboard.workos.com/configuration',\n },\n SDK_OUTDATED: {\n severity: 'warning' as const,\n message: 'SDK version is outdated',\n // remediation generated dynamically\n },\n COOKIE_DOMAIN_NOT_SET: {\n severity: 'warning' as const,\n message: 'Cookie domain not explicitly set',\n remediation: 'Consider setting WORKOS_COOKIE_DOMAIN for cross-subdomain auth',\n docsUrl: 'https://workos.com/docs/authkit/cookie-domain',\n },\n NO_SDK_FOUND: {\n severity: 'error' as const,\n message: 'No WorkOS SDK found in dependencies',\n remediation: 'Install a WorkOS SDK: npm install @workos-inc/authkit-nextjs',\n docsUrl: 'https://workos.com/docs',\n },\n API_UNREACHABLE: {\n severity: 'warning' as const,\n message: 'Cannot reach WorkOS API',\n // remediation generated dynamically based on error\n },\n REDIRECT_URI_MISMATCH: {\n severity: 'warning' as const,\n message: 'Redirect URI not found in dashboard configuration',\n docsUrl: 'https://workos.com/docs/authkit/redirect-uri',\n },\n PROD_API_CALL_BLOCKED: {\n severity: 'warning' as const,\n message: 'Dashboard settings not fetched (production API key)',\n remediation: 'Use a staging API key to fetch dashboard settings',\n },\n INVALID_API_KEY: {\n severity: 'error' as const,\n message: 'API key is invalid or expired',\n remediation: 'Check your WORKOS_API_KEY in the WorkOS dashboard',\n docsUrl: 'https://dashboard.workos.com/api-keys',\n },\n CLIENT_ID_MISMATCH: {\n severity: 'error' as const,\n message: 'Client ID does not match the API key environment',\n remediation: 'Ensure WORKOS_CLIENT_ID matches the environment for your API key',\n docsUrl: 'https://dashboard.workos.com/configuration',\n },\n};\n\nexport function detectIssues(report: Omit<DoctorReport, 'issues' | 'summary'>): Issue[] {\n const issues: Issue[] = [];\n\n // SDK issues\n if (!report.sdk.name) {\n const lang = languageToSdkLanguage(report.language.name);\n const hint = getInstallHint(lang);\n issues.push({\n code: 'NO_SDK_FOUND',\n severity: 'error',\n message: 'No WorkOS SDK found in dependencies',\n remediation: `Install a WorkOS SDK: ${hint}`,\n docsUrl: 'https://workos.com/docs',\n });\n } else if (report.sdk.outdated && report.sdk.version && report.sdk.latest) {\n issues.push({\n code: 'SDK_OUTDATED',\n severity: 'warning',\n message: `SDK version outdated (${report.sdk.version} → ${report.sdk.latest})`,\n remediation: `Run: ${getUpdateCommand(report.runtime.packageManager, report.sdk.name)}`,\n details: { installed: report.sdk.version, latest: report.sdk.latest },\n });\n }\n\n // Environment issues\n if (!report.environment.apiKeyConfigured) {\n issues.push({ code: 'MISSING_API_KEY', ...ISSUE_DEFINITIONS.MISSING_API_KEY });\n }\n\n if (!report.environment.clientId) {\n issues.push({ code: 'MISSING_CLIENT_ID', ...ISSUE_DEFINITIONS.MISSING_CLIENT_ID });\n }\n\n if (report.sdk.isAuthKit && !report.environment.cookieDomain) {\n issues.push({ code: 'COOKIE_DOMAIN_NOT_SET', ...ISSUE_DEFINITIONS.COOKIE_DOMAIN_NOT_SET });\n }\n\n // Connectivity issues\n if (!report.connectivity.apiReachable && !report.connectivity.error?.includes('Skipped')) {\n issues.push({\n code: 'API_UNREACHABLE',\n severity: 'warning',\n message: `Cannot reach WorkOS API: ${report.connectivity.error}`,\n remediation: 'Check your network connection and firewall settings',\n });\n }\n\n // Note: Redirect URI mismatch detection disabled - WorkOS API doesn't expose\n // a public endpoint to list configured redirect URIs for verification\n\n // Production key warning (no dashboard data)\n if (report.environment.apiKeyType === 'production' && !report.dashboardSettings) {\n issues.push({\n code: 'PROD_API_CALL_BLOCKED',\n ...ISSUE_DEFINITIONS.PROD_API_CALL_BLOCKED,\n });\n }\n\n // Credential validation issues\n if (report.credentialValidation) {\n if (!report.credentialValidation.valid) {\n issues.push({\n code: 'INVALID_API_KEY',\n ...ISSUE_DEFINITIONS.INVALID_API_KEY,\n details: { error: report.credentialValidation.error },\n });\n } else if (!report.credentialValidation.clientIdMatch) {\n issues.push({\n code: 'CLIENT_ID_MISMATCH',\n ...ISSUE_DEFINITIONS.CLIENT_ID_MISMATCH,\n details: { error: report.credentialValidation.error },\n });\n }\n }\n\n // Auth pattern findings — map directly to issues\n if (report.authPatterns) {\n for (const finding of report.authPatterns.findings) {\n issues.push({\n code: finding.code,\n severity: finding.severity,\n message: finding.message,\n remediation: finding.remediation,\n docsUrl: finding.docsUrl,\n });\n }\n }\n\n return issues;\n}\n\nfunction getUpdateCommand(packageManager: string | null, sdkName: string): string {\n switch (packageManager) {\n case 'pnpm':\n return `pnpm update ${sdkName}`;\n case 'Yarn V1':\n case 'Yarn V2/3/4':\n return `yarn upgrade ${sdkName}`;\n case 'Bun':\n return `bun update ${sdkName}`;\n default:\n return `npm update ${sdkName}`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/doctor/issues.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Issue, DoctorReport } from './types.js';\nimport { getInstallHint, languageToSdkLanguage } from './checks/language.js';\n\nexport const ISSUE_DEFINITIONS = {\n MISSING_API_KEY: {\n severity: 'error' as const,\n message: 'WORKOS_API_KEY environment variable not set',\n remediation: 'Set WORKOS_API_KEY in your .env.local file',\n docsUrl: 'https://dashboard.workos.com/api-keys',\n },\n MISSING_CLIENT_ID: {\n severity: 'error' as const,\n message: 'WORKOS_CLIENT_ID environment variable not set',\n remediation: 'Set WORKOS_CLIENT_ID in your .env.local file',\n docsUrl: 'https://dashboard.workos.com/configuration',\n },\n SDK_OUTDATED: {\n severity: 'warning' as const,\n message: 'SDK version is outdated',\n // remediation generated dynamically\n },\n COOKIE_DOMAIN_NOT_SET: {\n severity: 'warning' as const,\n message: 'Cookie domain not explicitly set',\n remediation: 'Consider setting WORKOS_COOKIE_DOMAIN for cross-subdomain auth',\n docsUrl: 'https://workos.com/docs/authkit/cookie-domain',\n },\n NO_SDK_FOUND: {\n severity: 'error' as const,\n message: 'No WorkOS SDK found in dependencies',\n remediation: 'Install a WorkOS SDK: npm install @workos-inc/authkit-nextjs',\n docsUrl: 'https://workos.com/docs',\n },\n API_UNREACHABLE: {\n severity: 'warning' as const,\n message: 'Cannot reach WorkOS API',\n // remediation generated dynamically based on error\n },\n REDIRECT_URI_MISMATCH: {\n severity: 'warning' as const,\n message: 'Redirect URI not found in dashboard configuration',\n docsUrl: 'https://workos.com/docs/authkit/redirect-uri',\n },\n PROD_API_CALL_BLOCKED: {\n severity: 'warning' as const,\n message: 'Dashboard settings not fetched (production API key)',\n remediation: 'Use a staging API key to fetch dashboard settings',\n },\n INVALID_API_KEY: {\n severity: 'error' as const,\n message: 'API key is invalid or expired',\n remediation: 'Check your WORKOS_API_KEY in the WorkOS dashboard',\n docsUrl: 'https://dashboard.workos.com/api-keys',\n },\n CLIENT_ID_MISMATCH: {\n severity: 'error' as const,\n message: 'Client ID does not match the API key environment',\n remediation: 'Ensure WORKOS_CLIENT_ID matches the environment for your API key',\n docsUrl: 'https://dashboard.workos.com/configuration',\n },\n};\n\nexport function detectIssues(report: Omit<DoctorReport, 'issues' | 'summary'>): Issue[] {\n const issues: Issue[] = [];\n\n // SDK issues\n if (!report.sdk.name) {\n const lang = languageToSdkLanguage(report.language.name);\n const hint = getInstallHint(lang);\n issues.push({\n code: 'NO_SDK_FOUND',\n severity: 'error',\n message: 'No WorkOS SDK found in dependencies',\n remediation: `Install a WorkOS SDK: ${hint}`,\n docsUrl: 'https://workos.com/docs',\n });\n } else if (report.sdk.outdated && report.sdk.version && report.sdk.latest) {\n issues.push({\n code: 'SDK_OUTDATED',\n severity: 'warning',\n message: `SDK version outdated (${report.sdk.version} → ${report.sdk.latest})`,\n remediation: `Run: ${getUpdateCommand(report.runtime.packageManager, report.sdk.name)}`,\n details: { installed: report.sdk.version, latest: report.sdk.latest },\n });\n }\n\n // Environment issues\n if (!report.environment.apiKeyConfigured) {\n issues.push({ code: 'MISSING_API_KEY', ...ISSUE_DEFINITIONS.MISSING_API_KEY });\n }\n\n if (!report.environment.clientId) {\n issues.push({ code: 'MISSING_CLIENT_ID', ...ISSUE_DEFINITIONS.MISSING_CLIENT_ID });\n }\n\n if (report.sdk.isAuthKit && !report.environment.cookieDomain) {\n issues.push({ code: 'COOKIE_DOMAIN_NOT_SET', ...ISSUE_DEFINITIONS.COOKIE_DOMAIN_NOT_SET });\n }\n\n // Connectivity issues\n if (!report.connectivity.apiReachable && !report.connectivity.error?.includes('Skipped')) {\n issues.push({\n code: 'API_UNREACHABLE',\n severity: 'warning',\n message: `Cannot reach WorkOS API: ${report.connectivity.error}`,\n remediation: 'Check your network connection and firewall settings',\n });\n }\n\n // Note: Redirect URI mismatch detection disabled - WorkOS API doesn't expose\n // a public endpoint to list configured redirect URIs for verification\n\n // Production key warning (no dashboard data)\n if (report.environment.apiKeyType === 'production' && !report.dashboardSettings) {\n issues.push({\n code: 'PROD_API_CALL_BLOCKED',\n ...ISSUE_DEFINITIONS.PROD_API_CALL_BLOCKED,\n });\n }\n\n // Credential validation issues\n if (report.credentialValidation) {\n if (!report.credentialValidation.valid) {\n issues.push({\n code: 'INVALID_API_KEY',\n ...ISSUE_DEFINITIONS.INVALID_API_KEY,\n details: { error: report.credentialValidation.error },\n });\n } else if (!report.credentialValidation.clientIdMatch) {\n issues.push({\n code: 'CLIENT_ID_MISMATCH',\n ...ISSUE_DEFINITIONS.CLIENT_ID_MISMATCH,\n details: { error: report.credentialValidation.error },\n });\n }\n }\n\n // Auth pattern findings — map directly to issues\n if (report.authPatterns) {\n for (const finding of report.authPatterns.findings) {\n issues.push({\n code: finding.code,\n severity: finding.severity,\n message: finding.message,\n remediation: finding.remediation,\n docsUrl: finding.docsUrl,\n });\n }\n }\n\n // Skill freshness — warn when agent-installed skills trail the bundled version.\n // Surfaced so users know their coding agent is using older WorkOS guidance.\n if (report.skills?.bundledVersion) {\n const stale = report.skills.agents.filter((a) => a.stale);\n if (stale.length > 0) {\n const agentList = stale.map((a) => `${a.agent} (${a.installedVersion ?? 'unknown'})`).join(', ');\n issues.push({\n code: 'SKILLS_OUTDATED',\n severity: 'warning',\n message: `WorkOS skills outdated for ${agentList} — bundled: ${report.skills.bundledVersion}`,\n remediation: 'Run: workos skills install',\n details: { bundledVersion: report.skills.bundledVersion, stale: stale.map((a) => a.agent) },\n });\n }\n }\n\n return issues;\n}\n\nfunction getUpdateCommand(packageManager: string | null, sdkName: string): string {\n switch (packageManager) {\n case 'pnpm':\n return `pnpm update ${sdkName}`;\n case 'Yarn V1':\n case 'Yarn V2/3/4':\n return `yarn upgrade ${sdkName}`;\n case 'Bun':\n return `bun update ${sdkName}`;\n default:\n return `npm update ${sdkName}`;\n }\n}\n"]}
|
package/dist/doctor/output.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import Chalk from 'chalk';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { createAgents } from '../commands/install-skill.js';
|
|
2
4
|
import { renderSummaryBox } from '../utils/summary-box.js';
|
|
3
5
|
export function formatReport(report, options) {
|
|
4
6
|
console.log('');
|
|
@@ -135,6 +137,20 @@ export function formatReport(report, options) {
|
|
|
135
137
|
}
|
|
136
138
|
}
|
|
137
139
|
}
|
|
140
|
+
// Skills refresh (--fix path)
|
|
141
|
+
if (report.skillsRefresh) {
|
|
142
|
+
const agents = createAgents(homedir());
|
|
143
|
+
const displayName = (slug) => agents[slug]?.displayName ?? slug;
|
|
144
|
+
const formatVersion = (v) => v ?? '(none)';
|
|
145
|
+
console.log('');
|
|
146
|
+
console.log('Skills');
|
|
147
|
+
const slugs = Object.keys(report.skillsRefresh.before);
|
|
148
|
+
for (const slug of slugs) {
|
|
149
|
+
const before = formatVersion(report.skillsRefresh.before[slug] ?? null);
|
|
150
|
+
const after = formatVersion(report.skillsRefresh.after[slug] ?? null);
|
|
151
|
+
console.log(` ${Chalk.green('✓')} Updated WorkOS skills for ${displayName(slug)}: ${before} → ${after}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
138
154
|
// Verbose mode additions
|
|
139
155
|
if (options?.verbose) {
|
|
140
156
|
console.log('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/doctor/output.ts"],"names":[],"mappings":"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","sourcesContent":["import Chalk from 'chalk';\nimport type { DoctorReport, Issue } from './types.js';\nimport { renderSummaryBox, type SummaryBoxItem } from '../utils/summary-box.js';\nimport type { LockExpression } from '../utils/lock-art.js';\n\nexport interface FormatOptions {\n verbose?: boolean;\n}\n\nexport function formatReport(report: DoctorReport, options?: FormatOptions): void {\n console.log('');\n console.log(Chalk.cyan('WorkOS Doctor'));\n console.log(Chalk.dim('━'.repeat(70)));\n\n // SDK & Project\n console.log('');\n console.log('SDK & Project Information');\n if (report.sdk.name) {\n console.log(` SDK: ${report.sdk.name}${report.sdk.version ? ` v${report.sdk.version}` : ''}`);\n } else {\n console.log(` SDK: ${Chalk.red('Not found')}`);\n }\n if (report.language.name !== 'Unknown') {\n console.log(` Language: ${report.language.name}`);\n }\n if (report.language.name === 'JavaScript/TypeScript' || report.language.name === 'Unknown') {\n console.log(` Runtime: Node.js ${report.runtime.nodeVersion}`);\n }\n if (report.framework.name) {\n const variant = report.framework.variant ? ` (${report.framework.variant})` : '';\n console.log(` Framework: ${report.framework.name} ${report.framework.version ?? ''}${variant}`);\n }\n if (report.language.packageManager) {\n console.log(` Package Manager: ${report.language.packageManager}`);\n } else if (report.runtime.packageManager) {\n console.log(` Package Manager: ${report.runtime.packageManager} ${report.runtime.packageManagerVersion ?? ''}`);\n }\n\n // Environment\n console.log('');\n console.log('Environment Configuration');\n const envType = report.environment.apiKeyType\n ? report.environment.apiKeyType.charAt(0).toUpperCase() + report.environment.apiKeyType.slice(1)\n : 'Unable to determine';\n console.log(` Environment: ${envType}`);\n console.log(` Client ID: ${report.environment.clientId ?? Chalk.red('Not set')}`);\n console.log(\n ` API Key: ${report.environment.apiKeyConfigured ? Chalk.green('configured') : Chalk.red('not set')}`,\n );\n console.log(` Base URL: ${report.environment.baseUrl} ${Chalk.green('✓')}`);\n\n // Connectivity & Credential Validation\n console.log('');\n console.log('Connectivity');\n if (report.connectivity.apiReachable) {\n console.log(` API: ${Chalk.green('✓')} Reachable (${report.connectivity.latencyMs}ms)`);\n } else if (report.connectivity.error?.includes('Skipped')) {\n console.log(` API: ${Chalk.dim('Skipped (--skip-api)')}`);\n } else {\n console.log(` API: ${Chalk.red('✗')} ${report.connectivity.error}`);\n }\n\n // Credential validation\n if (report.credentialValidation) {\n if (report.credentialValidation.valid && report.credentialValidation.clientIdMatch) {\n console.log(` Credentials: ${Chalk.green('✓')} Valid and matching`);\n } else if (!report.credentialValidation.valid) {\n console.log(` Credentials: ${Chalk.red('✗')} ${report.credentialValidation.error ?? 'Invalid'}`);\n } else if (!report.credentialValidation.clientIdMatch) {\n console.log(` Credentials: ${Chalk.red('✗')} Client ID mismatch`);\n }\n }\n\n // Dashboard Settings (if available)\n if (report.dashboardSettings) {\n console.log('');\n console.log('Dashboard Settings (Staging)');\n console.log(\n ` Auth Methods: ${report.dashboardSettings.authMethods.length > 0 ? report.dashboardSettings.authMethods.join(', ') : 'None configured'}`,\n );\n console.log(` Session Timeout: ${report.dashboardSettings.sessionTimeout ?? 'Default'}`);\n console.log(` MFA: ${formatMfa(report.dashboardSettings.mfa)}`);\n console.log(` Organizations: ${report.dashboardSettings.organizationCount} configured`);\n } else if (report.dashboardError) {\n console.log('');\n console.log('Dashboard Settings');\n console.log(` Status: ${Chalk.dim(report.dashboardError)}`);\n }\n\n // Redirect URI (can't verify against dashboard - no list API)\n if (report.redirectUris?.codeUri) {\n console.log('');\n const source = report.redirectUris.source === 'inferred' ? 'Inferred' : 'Configured';\n console.log(`Redirect URI (${source})`);\n console.log(` ${report.redirectUris.codeUri}`);\n }\n\n // Auth Patterns\n if (report.authPatterns) {\n console.log('');\n console.log('Auth Patterns');\n if (report.authPatterns.findings.length === 0) {\n console.log(` ${Chalk.green('✓')} ${report.authPatterns.checksRun} checks passed`);\n } else {\n console.log(\n ` ${report.authPatterns.checksRun} checked, ${Chalk.yellow(`${report.authPatterns.findings.length} finding(s)`)}`,\n );\n for (const finding of report.authPatterns.findings) {\n const icon = finding.severity === 'error' ? Chalk.red('✗') : Chalk.yellow('!');\n console.log(` ${icon} ${finding.message}`);\n if (finding.filePath) {\n console.log(` ${Chalk.dim('File:')} ${finding.filePath}`);\n }\n }\n }\n }\n\n // AI Analysis\n if (report.aiAnalysis) {\n console.log('');\n if (report.aiAnalysis.skipped) {\n console.log('AI Analysis');\n console.log(` ${Chalk.dim(report.aiAnalysis.skipReason ?? 'Skipped')}`);\n } else {\n const duration = (report.aiAnalysis.durationMs / 1000).toFixed(1);\n console.log(`AI Analysis ${Chalk.dim(`(${duration}s)`)}`);\n if (report.aiAnalysis.summary) {\n console.log(` ${report.aiAnalysis.summary}`);\n }\n console.log('');\n for (const finding of report.aiAnalysis.findings) {\n const icon =\n finding.severity === 'error'\n ? Chalk.red('✗')\n : finding.severity === 'warning'\n ? Chalk.yellow('!')\n : Chalk.dim('ℹ');\n const color =\n finding.severity === 'error' ? Chalk.red : finding.severity === 'warning' ? Chalk.yellow : Chalk.dim;\n console.log(` ${icon} ${color(finding.title)}`);\n console.log(` ${finding.detail}`);\n if (finding.remediation) {\n console.log(` ${Chalk.dim('→')} ${finding.remediation}`);\n }\n if (finding.filePath) {\n console.log(` ${Chalk.dim('File:')} ${finding.filePath}`);\n }\n console.log('');\n }\n }\n }\n\n // Verbose mode additions\n if (options?.verbose) {\n console.log('');\n console.log(Chalk.dim('Verbose Details'));\n console.log(` ${Chalk.dim('Project path:')} ${report.project.path}`);\n console.log(` ${Chalk.dim('Timestamp:')} ${report.timestamp}`);\n console.log(` ${Chalk.dim('Doctor version:')} ${report.version}`);\n }\n\n console.log('');\n console.log(Chalk.dim('━'.repeat(70)));\n\n // Issues\n if (report.issues.length > 0) {\n const errors = report.issues.filter((i) => i.severity === 'error');\n const warnings = report.issues.filter((i) => i.severity === 'warning');\n\n console.log('');\n if (errors.length > 0) {\n console.log(Chalk.red(`Critical Issues Found (${errors.length} errors)`));\n console.log('');\n for (const issue of errors) {\n formatIssue(issue);\n }\n }\n\n if (warnings.length > 0) {\n console.log(Chalk.yellow(`Warnings (${warnings.length})`));\n console.log('');\n for (const issue of warnings) {\n formatIssue(issue);\n }\n }\n }\n\n console.log('');\n\n // Summary box with lock character\n const expression: LockExpression = report.summary.healthy\n ? 'success'\n : report.summary.errors > 0\n ? 'error'\n : 'warning';\n\n const title = report.summary.healthy\n ? 'WorkOS Integration Healthy'\n : report.summary.errors > 0\n ? `${report.summary.errors} Issue(s) Found`\n : `${report.summary.warnings} Warning(s) to Review`;\n\n const items: SummaryBoxItem[] = report.issues.map((issue) => ({\n type: issue.severity === 'error' ? ('error' as const) : ('pending' as const),\n text: `${issue.code}: ${issue.message}`,\n }));\n\n console.log(\n renderSummaryBox({\n expression,\n title,\n items,\n footer: 'workos doctor --copy | https://workos.com/docs',\n }),\n );\n console.log('');\n}\n\nfunction formatIssue(issue: Issue): void {\n const icon = issue.severity === 'error' ? Chalk.red('✗') : Chalk.yellow('!');\n const color = issue.severity === 'error' ? Chalk.red : Chalk.yellow;\n\n console.log(`${icon} ${color(issue.code)}: ${issue.message}`);\n if (issue.remediation) {\n console.log(` ${Chalk.dim('→')} ${issue.remediation}`);\n }\n if (issue.docsUrl) {\n console.log(` ${Chalk.dim('Docs:')} ${issue.docsUrl}`);\n }\n console.log('');\n}\n\nfunction formatMfa(mfa: string | null): string {\n switch (mfa) {\n case 'required':\n return 'Required';\n case 'optional':\n return 'Optional';\n case 'disabled':\n return 'Disabled';\n default:\n return 'Not configured';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/doctor/output.ts"],"names":[],"mappings":"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","sourcesContent":["import Chalk from 'chalk';\nimport { homedir } from 'os';\nimport { createAgents } from '../commands/install-skill.js';\nimport type { DoctorReport, Issue } from './types.js';\nimport { renderSummaryBox, type SummaryBoxItem } from '../utils/summary-box.js';\nimport type { LockExpression } from '../utils/lock-art.js';\n\nexport interface FormatOptions {\n verbose?: boolean;\n}\n\nexport function formatReport(report: DoctorReport, options?: FormatOptions): void {\n console.log('');\n console.log(Chalk.cyan('WorkOS Doctor'));\n console.log(Chalk.dim('━'.repeat(70)));\n\n // SDK & Project\n console.log('');\n console.log('SDK & Project Information');\n if (report.sdk.name) {\n console.log(` SDK: ${report.sdk.name}${report.sdk.version ? ` v${report.sdk.version}` : ''}`);\n } else {\n console.log(` SDK: ${Chalk.red('Not found')}`);\n }\n if (report.language.name !== 'Unknown') {\n console.log(` Language: ${report.language.name}`);\n }\n if (report.language.name === 'JavaScript/TypeScript' || report.language.name === 'Unknown') {\n console.log(` Runtime: Node.js ${report.runtime.nodeVersion}`);\n }\n if (report.framework.name) {\n const variant = report.framework.variant ? ` (${report.framework.variant})` : '';\n console.log(` Framework: ${report.framework.name} ${report.framework.version ?? ''}${variant}`);\n }\n if (report.language.packageManager) {\n console.log(` Package Manager: ${report.language.packageManager}`);\n } else if (report.runtime.packageManager) {\n console.log(` Package Manager: ${report.runtime.packageManager} ${report.runtime.packageManagerVersion ?? ''}`);\n }\n\n // Environment\n console.log('');\n console.log('Environment Configuration');\n const envType = report.environment.apiKeyType\n ? report.environment.apiKeyType.charAt(0).toUpperCase() + report.environment.apiKeyType.slice(1)\n : 'Unable to determine';\n console.log(` Environment: ${envType}`);\n console.log(` Client ID: ${report.environment.clientId ?? Chalk.red('Not set')}`);\n console.log(\n ` API Key: ${report.environment.apiKeyConfigured ? Chalk.green('configured') : Chalk.red('not set')}`,\n );\n console.log(` Base URL: ${report.environment.baseUrl} ${Chalk.green('✓')}`);\n\n // Connectivity & Credential Validation\n console.log('');\n console.log('Connectivity');\n if (report.connectivity.apiReachable) {\n console.log(` API: ${Chalk.green('✓')} Reachable (${report.connectivity.latencyMs}ms)`);\n } else if (report.connectivity.error?.includes('Skipped')) {\n console.log(` API: ${Chalk.dim('Skipped (--skip-api)')}`);\n } else {\n console.log(` API: ${Chalk.red('✗')} ${report.connectivity.error}`);\n }\n\n // Credential validation\n if (report.credentialValidation) {\n if (report.credentialValidation.valid && report.credentialValidation.clientIdMatch) {\n console.log(` Credentials: ${Chalk.green('✓')} Valid and matching`);\n } else if (!report.credentialValidation.valid) {\n console.log(` Credentials: ${Chalk.red('✗')} ${report.credentialValidation.error ?? 'Invalid'}`);\n } else if (!report.credentialValidation.clientIdMatch) {\n console.log(` Credentials: ${Chalk.red('✗')} Client ID mismatch`);\n }\n }\n\n // Dashboard Settings (if available)\n if (report.dashboardSettings) {\n console.log('');\n console.log('Dashboard Settings (Staging)');\n console.log(\n ` Auth Methods: ${report.dashboardSettings.authMethods.length > 0 ? report.dashboardSettings.authMethods.join(', ') : 'None configured'}`,\n );\n console.log(` Session Timeout: ${report.dashboardSettings.sessionTimeout ?? 'Default'}`);\n console.log(` MFA: ${formatMfa(report.dashboardSettings.mfa)}`);\n console.log(` Organizations: ${report.dashboardSettings.organizationCount} configured`);\n } else if (report.dashboardError) {\n console.log('');\n console.log('Dashboard Settings');\n console.log(` Status: ${Chalk.dim(report.dashboardError)}`);\n }\n\n // Redirect URI (can't verify against dashboard - no list API)\n if (report.redirectUris?.codeUri) {\n console.log('');\n const source = report.redirectUris.source === 'inferred' ? 'Inferred' : 'Configured';\n console.log(`Redirect URI (${source})`);\n console.log(` ${report.redirectUris.codeUri}`);\n }\n\n // Auth Patterns\n if (report.authPatterns) {\n console.log('');\n console.log('Auth Patterns');\n if (report.authPatterns.findings.length === 0) {\n console.log(` ${Chalk.green('✓')} ${report.authPatterns.checksRun} checks passed`);\n } else {\n console.log(\n ` ${report.authPatterns.checksRun} checked, ${Chalk.yellow(`${report.authPatterns.findings.length} finding(s)`)}`,\n );\n for (const finding of report.authPatterns.findings) {\n const icon = finding.severity === 'error' ? Chalk.red('✗') : Chalk.yellow('!');\n console.log(` ${icon} ${finding.message}`);\n if (finding.filePath) {\n console.log(` ${Chalk.dim('File:')} ${finding.filePath}`);\n }\n }\n }\n }\n\n // AI Analysis\n if (report.aiAnalysis) {\n console.log('');\n if (report.aiAnalysis.skipped) {\n console.log('AI Analysis');\n console.log(` ${Chalk.dim(report.aiAnalysis.skipReason ?? 'Skipped')}`);\n } else {\n const duration = (report.aiAnalysis.durationMs / 1000).toFixed(1);\n console.log(`AI Analysis ${Chalk.dim(`(${duration}s)`)}`);\n if (report.aiAnalysis.summary) {\n console.log(` ${report.aiAnalysis.summary}`);\n }\n console.log('');\n for (const finding of report.aiAnalysis.findings) {\n const icon =\n finding.severity === 'error'\n ? Chalk.red('✗')\n : finding.severity === 'warning'\n ? Chalk.yellow('!')\n : Chalk.dim('ℹ');\n const color =\n finding.severity === 'error' ? Chalk.red : finding.severity === 'warning' ? Chalk.yellow : Chalk.dim;\n console.log(` ${icon} ${color(finding.title)}`);\n console.log(` ${finding.detail}`);\n if (finding.remediation) {\n console.log(` ${Chalk.dim('→')} ${finding.remediation}`);\n }\n if (finding.filePath) {\n console.log(` ${Chalk.dim('File:')} ${finding.filePath}`);\n }\n console.log('');\n }\n }\n }\n\n // Skills refresh (--fix path)\n if (report.skillsRefresh) {\n const agents = createAgents(homedir());\n const displayName = (slug: string): string => agents[slug]?.displayName ?? slug;\n const formatVersion = (v: string | null): string => v ?? '(none)';\n\n console.log('');\n console.log('Skills');\n const slugs = Object.keys(report.skillsRefresh.before);\n for (const slug of slugs) {\n const before = formatVersion(report.skillsRefresh.before[slug] ?? null);\n const after = formatVersion(report.skillsRefresh.after[slug] ?? null);\n console.log(` ${Chalk.green('✓')} Updated WorkOS skills for ${displayName(slug)}: ${before} → ${after}`);\n }\n }\n\n // Verbose mode additions\n if (options?.verbose) {\n console.log('');\n console.log(Chalk.dim('Verbose Details'));\n console.log(` ${Chalk.dim('Project path:')} ${report.project.path}`);\n console.log(` ${Chalk.dim('Timestamp:')} ${report.timestamp}`);\n console.log(` ${Chalk.dim('Doctor version:')} ${report.version}`);\n }\n\n console.log('');\n console.log(Chalk.dim('━'.repeat(70)));\n\n // Issues\n if (report.issues.length > 0) {\n const errors = report.issues.filter((i) => i.severity === 'error');\n const warnings = report.issues.filter((i) => i.severity === 'warning');\n\n console.log('');\n if (errors.length > 0) {\n console.log(Chalk.red(`Critical Issues Found (${errors.length} errors)`));\n console.log('');\n for (const issue of errors) {\n formatIssue(issue);\n }\n }\n\n if (warnings.length > 0) {\n console.log(Chalk.yellow(`Warnings (${warnings.length})`));\n console.log('');\n for (const issue of warnings) {\n formatIssue(issue);\n }\n }\n }\n\n console.log('');\n\n // Summary box with lock character\n const expression: LockExpression = report.summary.healthy\n ? 'success'\n : report.summary.errors > 0\n ? 'error'\n : 'warning';\n\n const title = report.summary.healthy\n ? 'WorkOS Integration Healthy'\n : report.summary.errors > 0\n ? `${report.summary.errors} Issue(s) Found`\n : `${report.summary.warnings} Warning(s) to Review`;\n\n const items: SummaryBoxItem[] = report.issues.map((issue) => ({\n type: issue.severity === 'error' ? ('error' as const) : ('pending' as const),\n text: `${issue.code}: ${issue.message}`,\n }));\n\n console.log(\n renderSummaryBox({\n expression,\n title,\n items,\n footer: 'workos doctor --copy | https://workos.com/docs',\n }),\n );\n console.log('');\n}\n\nfunction formatIssue(issue: Issue): void {\n const icon = issue.severity === 'error' ? Chalk.red('✗') : Chalk.yellow('!');\n const color = issue.severity === 'error' ? Chalk.red : Chalk.yellow;\n\n console.log(`${icon} ${color(issue.code)}: ${issue.message}`);\n if (issue.remediation) {\n console.log(` ${Chalk.dim('→')} ${issue.remediation}`);\n }\n if (issue.docsUrl) {\n console.log(` ${Chalk.dim('Docs:')} ${issue.docsUrl}`);\n }\n console.log('');\n}\n\nfunction formatMfa(mfa: string | null): string {\n switch (mfa) {\n case 'required':\n return 'Required';\n case 'optional':\n return 'Optional';\n case 'disabled':\n return 'Disabled';\n default:\n return 'Not configured';\n }\n}\n"]}
|
package/dist/doctor/types.d.ts
CHANGED
|
@@ -92,6 +92,28 @@ export interface AuthPatternInfo {
|
|
|
92
92
|
checksRun: number;
|
|
93
93
|
findings: AuthPatternFinding[];
|
|
94
94
|
}
|
|
95
|
+
export interface SkillAgentStatus {
|
|
96
|
+
agent: string;
|
|
97
|
+
installedVersion: string | null;
|
|
98
|
+
stale: boolean;
|
|
99
|
+
}
|
|
100
|
+
export interface SkillsInfo {
|
|
101
|
+
bundledVersion: string | null;
|
|
102
|
+
agents: SkillAgentStatus[];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Result of `workos doctor --fix` refreshing WorkOS skills. Captured per agent
|
|
106
|
+
* so the human-mode renderer can show a before/after line and the JSON consumer
|
|
107
|
+
* can reason about which agents changed.
|
|
108
|
+
*/
|
|
109
|
+
export interface SkillsRefreshResult {
|
|
110
|
+
/** Marker version per agent.name BEFORE refresh (null = no marker). */
|
|
111
|
+
before: Record<string, string | null>;
|
|
112
|
+
/** Marker version per agent.name AFTER refresh. */
|
|
113
|
+
after: Record<string, string | null>;
|
|
114
|
+
/** Skills the refresh was scoped to (the FIXABLE_SKILLS allowlist). */
|
|
115
|
+
skillsInstalled: string[];
|
|
116
|
+
}
|
|
95
117
|
export interface DoctorReport {
|
|
96
118
|
version: string;
|
|
97
119
|
timestamp: string;
|
|
@@ -111,6 +133,9 @@ export interface DoctorReport {
|
|
|
111
133
|
credentialValidation?: CredentialValidation;
|
|
112
134
|
authPatterns?: AuthPatternInfo;
|
|
113
135
|
aiAnalysis?: AiAnalysis;
|
|
136
|
+
skills?: SkillsInfo;
|
|
137
|
+
/** Present only when `--fix` actually performed a refresh. */
|
|
138
|
+
skillsRefresh?: SkillsRefreshResult;
|
|
114
139
|
issues: Issue[];
|
|
115
140
|
summary: {
|
|
116
141
|
errors: number;
|
|
@@ -140,4 +165,6 @@ export interface DoctorOptions {
|
|
|
140
165
|
skipAi?: boolean;
|
|
141
166
|
json?: boolean;
|
|
142
167
|
copy?: boolean;
|
|
168
|
+
/** When true, refresh stale WorkOS skills (constrained to workos/ + workos-widgets/). */
|
|
169
|
+
fix?: boolean;
|
|
143
170
|
}
|
package/dist/doctor/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"","sourcesContent":["export type IssueSeverity = 'error' | 'warning';\n\nexport interface Issue {\n code: string;\n severity: IssueSeverity;\n message: string;\n details?: Record<string, unknown>;\n remediation?: string;\n docsUrl?: string;\n}\n\nexport interface SdkInfo {\n name: string | null;\n version: string | null;\n latest: string | null;\n outdated: boolean;\n isAuthKit: boolean;\n language: string; // 'javascript' | 'python' | 'ruby' | 'go' | 'java' | 'php' | 'dotnet'\n}\n\nexport interface LanguageInfo {\n name: string; // e.g., 'JavaScript/TypeScript', 'Python', 'Ruby', 'Go', etc.\n manifestFile?: string; // e.g., 'package.json', 'requirements.txt'\n runtimeVersion?: string; // e.g., 'Python 3.12'\n packageManager?: string; // e.g., 'pip', 'poetry', 'bundler'\n}\n\nexport interface FrameworkInfo {\n name: string | null;\n version: string | null;\n variant?: string; // e.g., 'app-router' | 'pages-router'\n expectedCallbackPath?: string; // e.g., '/auth/callback' for Next.js\n detectedPort?: number;\n}\n\nexport interface RuntimeInfo {\n nodeVersion: string;\n packageManager: string | null;\n packageManagerVersion: string | null;\n}\n\nexport interface EnvironmentInfo {\n apiKeyConfigured: boolean;\n apiKeyType: 'staging' | 'production' | null;\n clientId: string | null; // truncated for display\n redirectUri: string | null;\n cookieDomain: string | null;\n baseUrl: string | null;\n}\n\n/** Internal environment data - not included in report output */\nexport interface EnvironmentRaw {\n apiKey: string | null;\n clientId: string | null;\n baseUrl: string | null;\n}\n\nexport interface EnvironmentCheckResult {\n info: EnvironmentInfo;\n raw: EnvironmentRaw;\n}\n\nexport interface ConnectivityInfo {\n apiReachable: boolean;\n latencyMs: number | null;\n tlsValid: boolean;\n error?: string;\n}\n\nexport interface DashboardSettings {\n redirectUris: string[];\n authMethods: string[];\n sessionTimeout: string | null;\n mfa: 'optional' | 'required' | 'disabled' | null;\n organizationCount: number;\n}\n\nexport interface RedirectUriComparison {\n codeUri: string | null;\n dashboardUris: string[];\n match: boolean;\n source?: 'env' | 'inferred'; // Where the codeUri came from\n}\n\nexport interface CredentialValidation {\n valid: boolean;\n clientIdMatch: boolean;\n error?: string;\n}\n\nexport interface DashboardFetchResult {\n settings: DashboardSettings | null;\n credentialValidation?: CredentialValidation;\n error?: string;\n}\n\nexport interface AuthPatternFinding {\n code: string;\n severity: IssueSeverity;\n message: string;\n filePath?: string;\n remediation?: string;\n docsUrl?: string;\n}\n\nexport interface AuthPatternInfo {\n checksRun: number;\n findings: AuthPatternFinding[];\n}\n\nexport interface DoctorReport {\n version: string;\n timestamp: string;\n project: {\n path: string;\n packageManager: string | null;\n };\n sdk: SdkInfo;\n language: LanguageInfo;\n runtime: RuntimeInfo;\n framework: FrameworkInfo;\n environment: EnvironmentInfo;\n connectivity: ConnectivityInfo;\n dashboardSettings?: DashboardSettings;\n dashboardError?: string;\n redirectUris?: RedirectUriComparison;\n credentialValidation?: CredentialValidation;\n authPatterns?: AuthPatternInfo;\n aiAnalysis?: AiAnalysis;\n issues: Issue[];\n summary: {\n errors: number;\n warnings: number;\n healthy: boolean;\n };\n}\n\nexport interface AiFinding {\n severity: 'error' | 'warning' | 'info';\n title: string;\n detail: string;\n remediation: string;\n filePath?: string;\n}\n\nexport interface AiAnalysis {\n findings: AiFinding[];\n summary: string;\n model: string;\n durationMs: number;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport interface DoctorOptions {\n installDir: string;\n verbose?: boolean;\n skipApi?: boolean;\n skipAi?: boolean;\n json?: boolean;\n copy?: boolean;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"","sourcesContent":["export type IssueSeverity = 'error' | 'warning';\n\nexport interface Issue {\n code: string;\n severity: IssueSeverity;\n message: string;\n details?: Record<string, unknown>;\n remediation?: string;\n docsUrl?: string;\n}\n\nexport interface SdkInfo {\n name: string | null;\n version: string | null;\n latest: string | null;\n outdated: boolean;\n isAuthKit: boolean;\n language: string; // 'javascript' | 'python' | 'ruby' | 'go' | 'java' | 'php' | 'dotnet'\n}\n\nexport interface LanguageInfo {\n name: string; // e.g., 'JavaScript/TypeScript', 'Python', 'Ruby', 'Go', etc.\n manifestFile?: string; // e.g., 'package.json', 'requirements.txt'\n runtimeVersion?: string; // e.g., 'Python 3.12'\n packageManager?: string; // e.g., 'pip', 'poetry', 'bundler'\n}\n\nexport interface FrameworkInfo {\n name: string | null;\n version: string | null;\n variant?: string; // e.g., 'app-router' | 'pages-router'\n expectedCallbackPath?: string; // e.g., '/auth/callback' for Next.js\n detectedPort?: number;\n}\n\nexport interface RuntimeInfo {\n nodeVersion: string;\n packageManager: string | null;\n packageManagerVersion: string | null;\n}\n\nexport interface EnvironmentInfo {\n apiKeyConfigured: boolean;\n apiKeyType: 'staging' | 'production' | null;\n clientId: string | null; // truncated for display\n redirectUri: string | null;\n cookieDomain: string | null;\n baseUrl: string | null;\n}\n\n/** Internal environment data - not included in report output */\nexport interface EnvironmentRaw {\n apiKey: string | null;\n clientId: string | null;\n baseUrl: string | null;\n}\n\nexport interface EnvironmentCheckResult {\n info: EnvironmentInfo;\n raw: EnvironmentRaw;\n}\n\nexport interface ConnectivityInfo {\n apiReachable: boolean;\n latencyMs: number | null;\n tlsValid: boolean;\n error?: string;\n}\n\nexport interface DashboardSettings {\n redirectUris: string[];\n authMethods: string[];\n sessionTimeout: string | null;\n mfa: 'optional' | 'required' | 'disabled' | null;\n organizationCount: number;\n}\n\nexport interface RedirectUriComparison {\n codeUri: string | null;\n dashboardUris: string[];\n match: boolean;\n source?: 'env' | 'inferred'; // Where the codeUri came from\n}\n\nexport interface CredentialValidation {\n valid: boolean;\n clientIdMatch: boolean;\n error?: string;\n}\n\nexport interface DashboardFetchResult {\n settings: DashboardSettings | null;\n credentialValidation?: CredentialValidation;\n error?: string;\n}\n\nexport interface AuthPatternFinding {\n code: string;\n severity: IssueSeverity;\n message: string;\n filePath?: string;\n remediation?: string;\n docsUrl?: string;\n}\n\nexport interface AuthPatternInfo {\n checksRun: number;\n findings: AuthPatternFinding[];\n}\n\nexport interface SkillAgentStatus {\n agent: string;\n installedVersion: string | null;\n stale: boolean;\n}\n\nexport interface SkillsInfo {\n bundledVersion: string | null;\n agents: SkillAgentStatus[];\n}\n\n/**\n * Result of `workos doctor --fix` refreshing WorkOS skills. Captured per agent\n * so the human-mode renderer can show a before/after line and the JSON consumer\n * can reason about which agents changed.\n */\nexport interface SkillsRefreshResult {\n /** Marker version per agent.name BEFORE refresh (null = no marker). */\n before: Record<string, string | null>;\n /** Marker version per agent.name AFTER refresh. */\n after: Record<string, string | null>;\n /** Skills the refresh was scoped to (the FIXABLE_SKILLS allowlist). */\n skillsInstalled: string[];\n}\n\nexport interface DoctorReport {\n version: string;\n timestamp: string;\n project: {\n path: string;\n packageManager: string | null;\n };\n sdk: SdkInfo;\n language: LanguageInfo;\n runtime: RuntimeInfo;\n framework: FrameworkInfo;\n environment: EnvironmentInfo;\n connectivity: ConnectivityInfo;\n dashboardSettings?: DashboardSettings;\n dashboardError?: string;\n redirectUris?: RedirectUriComparison;\n credentialValidation?: CredentialValidation;\n authPatterns?: AuthPatternInfo;\n aiAnalysis?: AiAnalysis;\n skills?: SkillsInfo;\n /** Present only when `--fix` actually performed a refresh. */\n skillsRefresh?: SkillsRefreshResult;\n issues: Issue[];\n summary: {\n errors: number;\n warnings: number;\n healthy: boolean;\n };\n}\n\nexport interface AiFinding {\n severity: 'error' | 'warning' | 'info';\n title: string;\n detail: string;\n remediation: string;\n filePath?: string;\n}\n\nexport interface AiAnalysis {\n findings: AiFinding[];\n summary: string;\n model: string;\n durationMs: number;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport interface DoctorOptions {\n installDir: string;\n verbose?: boolean;\n skipApi?: boolean;\n skipAi?: boolean;\n json?: boolean;\n copy?: boolean;\n /** When true, refresh stale WorkOS skills (constrained to workos/ + workos-widgets/). */\n fix?: boolean;\n}\n"]}
|
|
@@ -3,6 +3,7 @@ import chalk from 'chalk';
|
|
|
3
3
|
import { getConfig } from '../settings.js';
|
|
4
4
|
import { ProgressTracker } from '../progress-tracker.js';
|
|
5
5
|
import { renderCompletionSummary } from '../../utils/summary-box.js';
|
|
6
|
+
import { formatWorkOSCommand } from '../../utils/command-invocation.js';
|
|
6
7
|
/**
|
|
7
8
|
* CLI adapter that renders wizard events via clack.
|
|
8
9
|
*
|
|
@@ -368,7 +369,7 @@ export class CLIAdapter {
|
|
|
368
369
|
}
|
|
369
370
|
// Add actionable hints for common errors
|
|
370
371
|
if (message.includes('authentication') || message.includes('auth')) {
|
|
371
|
-
clack.log.info(
|
|
372
|
+
clack.log.info(`Try running: ${formatWorkOSCommand('auth logout')} && ${formatWorkOSCommand('install')}`);
|
|
372
373
|
}
|
|
373
374
|
if (message.includes('ENOENT') || message.includes('not found')) {
|
|
374
375
|
clack.log.info('Ensure you are in a project directory');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-adapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/cli-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InstallerAdapter, AdapterConfig } from './types.js';\nimport type { InstallerEventEmitter, InstallerEvents } from '../events.js';\nimport clack from '../../utils/clack.js';\nimport chalk from 'chalk';\nimport { getConfig } from '../settings.js';\nimport { ProgressTracker } from '../progress-tracker.js';\nimport { renderCompletionSummary } from '../../utils/summary-box.js';\n\n/**\n * CLI adapter that renders wizard events via clack.\n *\n * Subscribes to InstallerEventEmitter and translates events into\n * clack UI operations (logs, spinners, prompts).\n */\nexport class CLIAdapter implements InstallerAdapter {\n readonly emitter: InstallerEventEmitter;\n private sendEvent: AdapterConfig['sendEvent'];\n private debug: boolean;\n private spinner: ReturnType<typeof clack.spinner> | null = null;\n private isStarted = false;\n private progress = new ProgressTracker();\n\n // Store bound handlers for cleanup\n private handlers = new Map<string, (...args: unknown[]) => void>();\n\n // Queue for logs while prompt is active (parallel state issue)\n private isPromptActive = false;\n private pendingLogs: Array<() => void> = [];\n\n // SIGINT handler for cleanup\n private sigIntHandler: (() => void) | null = null;\n\n // Long-running agent update interval\n private agentUpdateInterval: NodeJS.Timeout | null = null;\n\n constructor(config: AdapterConfig) {\n this.emitter = config.emitter;\n this.sendEvent = config.sendEvent;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Queue a log call if a prompt is active, otherwise execute immediately.\n */\n private queueableLog(logFn: () => void): void {\n if (this.isPromptActive) {\n this.pendingLogs.push(logFn);\n } else {\n logFn();\n }\n }\n\n /**\n * Flush any queued logs after prompt completes.\n */\n private flushPendingLogs(): void {\n const logs = this.pendingLogs.splice(0);\n logs.forEach((fn) => fn());\n }\n\n async start(): Promise<void> {\n if (this.isStarted) return;\n this.isStarted = true;\n\n // Show intro\n const config = getConfig();\n if (config.branding.showAsciiArt) {\n const art = config.branding.useCompact ? config.branding.compactAsciiArt : config.branding.asciiArt;\n console.log(chalk.cyan(art));\n console.log();\n } else {\n clack.intro('Welcome to the WorkOS AuthKit installer');\n }\n\n // Handle Ctrl+C gracefully\n const handleSigInt = () => {\n if (this.spinner) {\n this.spinner.stop('Cancelled');\n this.spinner = null;\n }\n this.stopAgentUpdates();\n clack.log.warn('Installer cancelled');\n clack.outro('Your project was not modified');\n process.exit(0);\n };\n process.on('SIGINT', handleSigInt);\n this.sigIntHandler = handleSigInt;\n\n // Subscribe to state events for progress tracking\n this.subscribe('state:enter', this.handleStateEnter);\n this.subscribe('state:exit', this.handleStateExit);\n\n // Subscribe to events that require UI rendering\n this.subscribe('auth:success', this.handleAuthSuccess);\n this.subscribe('auth:failure', this.handleAuthFailure);\n this.subscribe('detection:complete', this.handleDetectionComplete);\n this.subscribe('detection:none', this.handleDetectionNone);\n this.subscribe('git:dirty', this.handleGitDirty);\n this.subscribe('credentials:found', this.handleCredentialsFound);\n this.subscribe('credentials:request', this.handleCredentialsRequest);\n this.subscribe('credentials:env:prompt', this.handleEnvScanPrompt);\n this.subscribe('device:started', this.handleDeviceStarted);\n this.subscribe('device:success', this.handleDeviceSuccess);\n this.subscribe('staging:fetching', this.handleStagingFetching);\n this.subscribe('staging:success', this.handleStagingSuccess);\n this.subscribe('credentials:env:found', this.handleEnvCredentialsFound);\n this.subscribe('config:complete', this.handleConfigComplete);\n this.subscribe('agent:start', this.handleAgentStart);\n this.subscribe('agent:progress', this.handleAgentProgress);\n this.subscribe('validation:start', this.handleValidationStart);\n this.subscribe('validation:issues', this.handleValidationIssues);\n this.subscribe('validation:complete', this.handleValidationComplete);\n this.subscribe('complete', this.handleComplete);\n this.subscribe('error', this.handleError);\n // Branch check events\n this.subscribe('branch:prompt', this.handleBranchPrompt);\n this.subscribe('branch:created', this.handleBranchCreated);\n\n // Post-install events\n this.subscribe('postinstall:changes', this.handlePostInstallChanges);\n this.subscribe('postinstall:commit:prompt', this.handleCommitPrompt);\n this.subscribe('postinstall:commit:generating', this.handleCommitGenerating);\n this.subscribe('postinstall:commit:success', this.handleCommitSuccess);\n this.subscribe('postinstall:commit:failed', this.handleCommitFailed);\n this.subscribe('postinstall:pr:prompt', this.handlePrPrompt);\n this.subscribe('postinstall:pr:generating', this.handlePrGenerating);\n this.subscribe('postinstall:pr:pushing', this.handlePrPushing);\n this.subscribe('postinstall:pr:success', this.handlePrSuccess);\n this.subscribe('postinstall:pr:failed', this.handlePrFailed);\n this.subscribe('postinstall:push:failed', this.handlePushFailed);\n this.subscribe('postinstall:manual', this.handleManualInstructions);\n }\n\n async stop(): Promise<void> {\n if (!this.isStarted) return;\n\n // Remove SIGINT handler\n if (this.sigIntHandler) {\n process.off('SIGINT', this.sigIntHandler);\n this.sigIntHandler = null;\n }\n\n // Stop agent updates\n this.stopAgentUpdates();\n\n // Unsubscribe from all events\n for (const [event, handler] of this.handlers) {\n this.emitter.off(event as keyof InstallerEvents, handler as never);\n }\n this.handlers.clear();\n\n // Stop any active spinner\n this.spinner?.stop();\n this.spinner = null;\n\n this.isStarted = false;\n }\n\n private stopAgentUpdates = (): void => {\n if (this.agentUpdateInterval) {\n clearInterval(this.agentUpdateInterval);\n this.agentUpdateInterval = null;\n }\n };\n\n private stopSpinner(message: string): void {\n if (this.spinner) {\n this.spinner.stop(message);\n this.spinner = null;\n }\n }\n\n /** Debug logging - only outputs when debug mode is enabled */\n private debugLog = (message: string): void => {\n if (this.debug) {\n console.log(chalk.dim(`[debug] ${message}`));\n }\n };\n\n /**\n * Helper to subscribe and track handlers for cleanup.\n */\n private subscribe<K extends keyof InstallerEvents>(\n event: K,\n handler: (payload: InstallerEvents[K]) => void | Promise<void>,\n ): void {\n const boundHandler = handler.bind(this);\n this.handlers.set(event, boundHandler as (...args: unknown[]) => void);\n this.emitter.on(event, boundHandler);\n }\n\n // ===== Event Handlers =====\n\n private handleStateEnter = ({ state }: InstallerEvents['state:enter']): void => {\n this.progress.enterPhase(state);\n };\n\n private handleStateExit = ({ state }: InstallerEvents['state:exit']): void => {\n this.progress.exitPhase(state);\n };\n\n private handleAuthSuccess = (): void => {\n clack.log.success('Authenticated');\n };\n\n private handleAuthFailure = ({ message }: InstallerEvents['auth:failure']): void => {\n clack.log.error(`Auth failed: ${message}`);\n clack.log.info('Visit https://dashboard.workos.com to verify your account');\n };\n\n private handleDetectionComplete = ({ integration }: InstallerEvents['detection:complete']): void => {\n this.queueableLog(() => clack.log.success(`Detected ${chalk.bold(integration)}`));\n };\n\n private handleDetectionNone = (): void => {\n this.queueableLog(() => clack.log.warn('Could not detect framework automatically'));\n };\n\n private handleCredentialsFound = (): void => {\n clack.log.success('Found existing WorkOS credentials in .env.local');\n };\n\n private handleEnvScanPrompt = async ({ files }: InstallerEvents['credentials:env:prompt']): Promise<void> => {\n this.isPromptActive = true;\n const fileList = files.length === 1 ? files[0] : files.slice(0, 2).join(', ');\n const confirmed = await clack.confirm({\n message: `Found ${fileList}. Check for existing WorkOS credentials?`,\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'ENV_SCAN_DECLINED' : 'ENV_SCAN_APPROVED',\n });\n };\n\n private handleDeviceStarted = ({ verificationUri, userCode }: InstallerEvents['device:started']): void => {\n clack.log.info(`\\nOpen this URL in your browser:\\n`);\n console.log(` ${chalk.cyan(verificationUri)}`);\n console.log(`\\nEnter code: ${chalk.bold(userCode)}\\n`);\n\n this.spinner = clack.spinner();\n this.spinner.start('Waiting for authentication...');\n };\n\n private handleDeviceSuccess = (): void => {\n // Spinner will be stopped by handleStagingFetching\n };\n\n private handleStagingFetching = (): void => {\n if (this.spinner) {\n this.spinner.stop('Authenticated');\n }\n this.spinner = clack.spinner();\n this.spinner.start('Fetching your WorkOS credentials...');\n };\n\n private handleStagingSuccess = (): void => {\n this.stopSpinner('Credentials fetched');\n clack.log.success('WorkOS credentials retrieved automatically');\n };\n\n private handleEnvCredentialsFound = ({ sourcePath }: InstallerEvents['credentials:env:found']): void => {\n clack.log.success(`Found existing WorkOS credentials in ${sourcePath}`);\n };\n\n private handleGitDirty = async ({ files }: InstallerEvents['git:dirty']): Promise<void> => {\n clack.log.warn('You have uncommitted or untracked files:');\n files.slice(0, 5).forEach((f) => clack.log.info(chalk.dim(` ${f}`)));\n if (files.length > 5) {\n clack.log.info(chalk.dim(` ... and ${files.length - 5} more`));\n }\n\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Continue anyway?',\n initialValue: false,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'GIT_CANCELLED' : 'GIT_CONFIRMED',\n });\n };\n\n private handleCredentialsRequest = async ({\n requiresApiKey,\n }: InstallerEvents['credentials:request']): Promise<void> => {\n clack.log.step(`Get your credentials from ${chalk.cyan('https://dashboard.workos.com')}`);\n\n const clientId = await clack.text({\n message: 'Enter your WorkOS Client ID:',\n placeholder: 'client_...',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Client ID is required';\n }\n if (!value.startsWith('client_')) {\n return 'Client ID should start with \"client_\"';\n }\n return undefined;\n },\n });\n\n if (clack.isCancel(clientId)) {\n this.sendEvent({ type: 'CANCEL' });\n return;\n }\n\n let apiKey = '';\n if (requiresApiKey) {\n clack.log.info(chalk.dim('ℹ️ Your API key will be hidden for security and saved to .env.local'));\n const apiKeyResult = await clack.password({\n message: 'Enter your WorkOS API Key:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'API Key is required';\n }\n if (!value.startsWith('sk_')) {\n return 'API Key should start with \"sk_\"';\n }\n return undefined;\n },\n });\n\n if (clack.isCancel(apiKeyResult)) {\n this.sendEvent({ type: 'CANCEL' });\n return;\n }\n apiKey = apiKeyResult as string;\n } else {\n clack.log.info(chalk.dim('ℹ️ Client-only SDK - API key not required'));\n }\n\n this.sendEvent({\n type: 'CREDENTIALS_SUBMITTED',\n apiKey,\n clientId: clientId as string,\n });\n };\n\n private handleConfigComplete = (): void => {\n clack.log.success('Environment configured');\n };\n\n private handleAgentStart = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Running AI agent...');\n\n // Periodic status updates for long-running operations\n let dots = 0;\n this.agentUpdateInterval = setInterval(() => {\n dots = (dots + 1) % 4;\n const dotStr = '.'.repeat(dots + 1);\n this.spinner?.message(`Running AI agent${dotStr}`);\n }, 2000);\n };\n\n private handleAgentProgress = ({ step, detail }: InstallerEvents['agent:progress']): void => {\n const message = detail ? `${step}: ${detail}` : step;\n this.spinner?.message(message);\n };\n\n private handleValidationStart = (): void => {\n this.stopAgentUpdates();\n this.stopSpinner('Agent completed');\n };\n\n private handleValidationIssues = ({ issues }: InstallerEvents['validation:issues']): void => {\n for (const issue of issues) {\n if (issue.severity === 'error') {\n clack.log.error(issue.message);\n } else {\n clack.log.warn(issue.message);\n }\n if (issue.hint) {\n clack.log.info(`Hint: ${issue.hint}`);\n }\n }\n };\n\n private handleValidationComplete = ({ passed, issueCount }: InstallerEvents['validation:complete']): void => {\n if (passed) {\n clack.log.success('Validation passed');\n } else {\n clack.log.warn(`Validation found ${issueCount} issue(s)`);\n }\n };\n\n private handleComplete = ({ success, summary }: InstallerEvents['complete']): void => {\n this.stopAgentUpdates();\n this.stopSpinner(success ? 'Done' : 'Failed');\n\n console.log('');\n console.log(renderCompletionSummary(success, summary));\n console.log('');\n };\n\n private handleError = ({ message, stack }: InstallerEvents['error']): void => {\n this.stopSpinner('Error');\n this.stopAgentUpdates();\n\n // Rewrite raw API/SDK errors into user-friendly messages\n const isServiceError =\n /\\b50[0-9]\\b/.test(message) || /server_error|internal_error|overloaded|service.*unavailable/i.test(message);\n const isRateLimit = /\\b429\\b/.test(message) || /rate.limit/i.test(message);\n const isNetworkError = /ECONNREFUSED|ETIMEDOUT|ENOTFOUND|fetch failed/i.test(message);\n const isProcessExit = /process exited with code/i.test(message);\n\n if (isServiceError) {\n clack.log.error('The AI service is temporarily unavailable.');\n clack.log.info('This is usually resolved within a few minutes. Please try again shortly.');\n } else if (isRateLimit) {\n clack.log.error('The AI service is currently rate-limited.');\n clack.log.info('Please wait a minute and try again.');\n } else if (isNetworkError) {\n clack.log.error('Could not connect to the AI service.');\n clack.log.info('Check your internet connection and try again.');\n } else if (isProcessExit) {\n clack.log.error('The AI agent process exited unexpectedly.');\n clack.log.info('Try running again. If this persists, run with --debug for details.');\n } else {\n clack.log.error(message);\n }\n\n // Add actionable hints for common errors\n if (message.includes('authentication') || message.includes('auth')) {\n clack.log.info('Try running: workos auth logout && workos install');\n }\n if (message.includes('ENOENT') || message.includes('not found')) {\n clack.log.info('Ensure you are in a project directory');\n }\n\n if (stack && this.debug) {\n this.debugLog(stack);\n }\n };\n\n private handleBranchPrompt = async ({ branch }: InstallerEvents['branch:prompt']): Promise<void> => {\n this.isPromptActive = true;\n const choice = await clack.select({\n message: `You are on ${chalk.bold(branch)}. Create a feature branch?`,\n options: [\n { value: 'create', label: 'Create feat/add-workos-authkit' },\n { value: 'continue', label: 'Continue on current branch' },\n { value: 'cancel', label: 'Cancel' },\n ],\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n if (clack.isCancel(choice) || choice === 'cancel') {\n this.sendEvent({ type: 'BRANCH_CANCEL' });\n } else if (choice === 'create') {\n this.sendEvent({ type: 'BRANCH_CREATE' });\n } else {\n this.sendEvent({ type: 'BRANCH_CONTINUE' });\n }\n };\n\n private handleBranchCreated = ({ branch }: InstallerEvents['branch:created']): void => {\n this.queueableLog(() => clack.log.success(`Created branch ${chalk.bold(branch)}`));\n };\n\n // ===== Post-install Event Handlers =====\n\n private handlePostInstallChanges = ({ files }: InstallerEvents['postinstall:changes']): void => {\n this.debugLog(`Post-install: ${files.length} changed files detected`);\n };\n\n private handleCommitPrompt = async (): Promise<void> => {\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Commit the changes?',\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'COMMIT_DECLINED' : 'COMMIT_APPROVED',\n });\n };\n\n private handleCommitGenerating = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Generating commit message...');\n };\n\n private handleCommitSuccess = ({ message }: InstallerEvents['postinstall:commit:success']): void => {\n this.stopSpinner('Committed');\n clack.log.success(`Committed: ${chalk.dim(message)}`);\n };\n\n private handleCommitFailed = ({ error }: InstallerEvents['postinstall:commit:failed']): void => {\n this.stopSpinner('Commit failed');\n clack.log.error(`Commit failed: ${error}`);\n };\n\n private handlePrPrompt = async (): Promise<void> => {\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Create a pull request?',\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'PR_DECLINED' : 'PR_APPROVED',\n });\n };\n\n private handlePrGenerating = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Generating PR description...');\n };\n\n private handlePrPushing = (): void => {\n if (this.spinner) {\n this.spinner.message('Pushing to remote...');\n } else {\n this.spinner = clack.spinner();\n this.spinner.start('Pushing to remote...');\n }\n };\n\n private handlePrSuccess = ({ url }: InstallerEvents['postinstall:pr:success']): void => {\n this.stopSpinner('PR created');\n clack.log.success(`Pull request created: ${chalk.cyan(url)}`);\n };\n\n private handlePrFailed = ({ error }: InstallerEvents['postinstall:pr:failed']): void => {\n this.stopSpinner('PR creation failed');\n clack.log.error(`PR creation failed: ${error}`);\n };\n\n private handlePushFailed = ({ error }: InstallerEvents['postinstall:push:failed']): void => {\n this.stopSpinner('Push failed');\n clack.log.error(`Push failed: ${error}`);\n };\n\n private handleManualInstructions = ({ instructions }: InstallerEvents['postinstall:manual']): void => {\n clack.log.info('GitHub CLI not found. Manual steps:');\n console.log(chalk.dim(instructions));\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cli-adapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/cli-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InstallerAdapter, AdapterConfig } from './types.js';\nimport type { InstallerEventEmitter, InstallerEvents } from '../events.js';\nimport clack from '../../utils/clack.js';\nimport chalk from 'chalk';\nimport { getConfig } from '../settings.js';\nimport { ProgressTracker } from '../progress-tracker.js';\nimport { renderCompletionSummary } from '../../utils/summary-box.js';\nimport { formatWorkOSCommand } from '../../utils/command-invocation.js';\n\n/**\n * CLI adapter that renders wizard events via clack.\n *\n * Subscribes to InstallerEventEmitter and translates events into\n * clack UI operations (logs, spinners, prompts).\n */\nexport class CLIAdapter implements InstallerAdapter {\n readonly emitter: InstallerEventEmitter;\n private sendEvent: AdapterConfig['sendEvent'];\n private debug: boolean;\n private spinner: ReturnType<typeof clack.spinner> | null = null;\n private isStarted = false;\n private progress = new ProgressTracker();\n\n // Store bound handlers for cleanup\n private handlers = new Map<string, (...args: unknown[]) => void>();\n\n // Queue for logs while prompt is active (parallel state issue)\n private isPromptActive = false;\n private pendingLogs: Array<() => void> = [];\n\n // SIGINT handler for cleanup\n private sigIntHandler: (() => void) | null = null;\n\n // Long-running agent update interval\n private agentUpdateInterval: NodeJS.Timeout | null = null;\n\n constructor(config: AdapterConfig) {\n this.emitter = config.emitter;\n this.sendEvent = config.sendEvent;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Queue a log call if a prompt is active, otherwise execute immediately.\n */\n private queueableLog(logFn: () => void): void {\n if (this.isPromptActive) {\n this.pendingLogs.push(logFn);\n } else {\n logFn();\n }\n }\n\n /**\n * Flush any queued logs after prompt completes.\n */\n private flushPendingLogs(): void {\n const logs = this.pendingLogs.splice(0);\n logs.forEach((fn) => fn());\n }\n\n async start(): Promise<void> {\n if (this.isStarted) return;\n this.isStarted = true;\n\n // Show intro\n const config = getConfig();\n if (config.branding.showAsciiArt) {\n const art = config.branding.useCompact ? config.branding.compactAsciiArt : config.branding.asciiArt;\n console.log(chalk.cyan(art));\n console.log();\n } else {\n clack.intro('Welcome to the WorkOS AuthKit installer');\n }\n\n // Handle Ctrl+C gracefully\n const handleSigInt = () => {\n if (this.spinner) {\n this.spinner.stop('Cancelled');\n this.spinner = null;\n }\n this.stopAgentUpdates();\n clack.log.warn('Installer cancelled');\n clack.outro('Your project was not modified');\n process.exit(0);\n };\n process.on('SIGINT', handleSigInt);\n this.sigIntHandler = handleSigInt;\n\n // Subscribe to state events for progress tracking\n this.subscribe('state:enter', this.handleStateEnter);\n this.subscribe('state:exit', this.handleStateExit);\n\n // Subscribe to events that require UI rendering\n this.subscribe('auth:success', this.handleAuthSuccess);\n this.subscribe('auth:failure', this.handleAuthFailure);\n this.subscribe('detection:complete', this.handleDetectionComplete);\n this.subscribe('detection:none', this.handleDetectionNone);\n this.subscribe('git:dirty', this.handleGitDirty);\n this.subscribe('credentials:found', this.handleCredentialsFound);\n this.subscribe('credentials:request', this.handleCredentialsRequest);\n this.subscribe('credentials:env:prompt', this.handleEnvScanPrompt);\n this.subscribe('device:started', this.handleDeviceStarted);\n this.subscribe('device:success', this.handleDeviceSuccess);\n this.subscribe('staging:fetching', this.handleStagingFetching);\n this.subscribe('staging:success', this.handleStagingSuccess);\n this.subscribe('credentials:env:found', this.handleEnvCredentialsFound);\n this.subscribe('config:complete', this.handleConfigComplete);\n this.subscribe('agent:start', this.handleAgentStart);\n this.subscribe('agent:progress', this.handleAgentProgress);\n this.subscribe('validation:start', this.handleValidationStart);\n this.subscribe('validation:issues', this.handleValidationIssues);\n this.subscribe('validation:complete', this.handleValidationComplete);\n this.subscribe('complete', this.handleComplete);\n this.subscribe('error', this.handleError);\n // Branch check events\n this.subscribe('branch:prompt', this.handleBranchPrompt);\n this.subscribe('branch:created', this.handleBranchCreated);\n\n // Post-install events\n this.subscribe('postinstall:changes', this.handlePostInstallChanges);\n this.subscribe('postinstall:commit:prompt', this.handleCommitPrompt);\n this.subscribe('postinstall:commit:generating', this.handleCommitGenerating);\n this.subscribe('postinstall:commit:success', this.handleCommitSuccess);\n this.subscribe('postinstall:commit:failed', this.handleCommitFailed);\n this.subscribe('postinstall:pr:prompt', this.handlePrPrompt);\n this.subscribe('postinstall:pr:generating', this.handlePrGenerating);\n this.subscribe('postinstall:pr:pushing', this.handlePrPushing);\n this.subscribe('postinstall:pr:success', this.handlePrSuccess);\n this.subscribe('postinstall:pr:failed', this.handlePrFailed);\n this.subscribe('postinstall:push:failed', this.handlePushFailed);\n this.subscribe('postinstall:manual', this.handleManualInstructions);\n }\n\n async stop(): Promise<void> {\n if (!this.isStarted) return;\n\n // Remove SIGINT handler\n if (this.sigIntHandler) {\n process.off('SIGINT', this.sigIntHandler);\n this.sigIntHandler = null;\n }\n\n // Stop agent updates\n this.stopAgentUpdates();\n\n // Unsubscribe from all events\n for (const [event, handler] of this.handlers) {\n this.emitter.off(event as keyof InstallerEvents, handler as never);\n }\n this.handlers.clear();\n\n // Stop any active spinner\n this.spinner?.stop();\n this.spinner = null;\n\n this.isStarted = false;\n }\n\n private stopAgentUpdates = (): void => {\n if (this.agentUpdateInterval) {\n clearInterval(this.agentUpdateInterval);\n this.agentUpdateInterval = null;\n }\n };\n\n private stopSpinner(message: string): void {\n if (this.spinner) {\n this.spinner.stop(message);\n this.spinner = null;\n }\n }\n\n /** Debug logging - only outputs when debug mode is enabled */\n private debugLog = (message: string): void => {\n if (this.debug) {\n console.log(chalk.dim(`[debug] ${message}`));\n }\n };\n\n /**\n * Helper to subscribe and track handlers for cleanup.\n */\n private subscribe<K extends keyof InstallerEvents>(\n event: K,\n handler: (payload: InstallerEvents[K]) => void | Promise<void>,\n ): void {\n const boundHandler = handler.bind(this);\n this.handlers.set(event, boundHandler as (...args: unknown[]) => void);\n this.emitter.on(event, boundHandler);\n }\n\n // ===== Event Handlers =====\n\n private handleStateEnter = ({ state }: InstallerEvents['state:enter']): void => {\n this.progress.enterPhase(state);\n };\n\n private handleStateExit = ({ state }: InstallerEvents['state:exit']): void => {\n this.progress.exitPhase(state);\n };\n\n private handleAuthSuccess = (): void => {\n clack.log.success('Authenticated');\n };\n\n private handleAuthFailure = ({ message }: InstallerEvents['auth:failure']): void => {\n clack.log.error(`Auth failed: ${message}`);\n clack.log.info('Visit https://dashboard.workos.com to verify your account');\n };\n\n private handleDetectionComplete = ({ integration }: InstallerEvents['detection:complete']): void => {\n this.queueableLog(() => clack.log.success(`Detected ${chalk.bold(integration)}`));\n };\n\n private handleDetectionNone = (): void => {\n this.queueableLog(() => clack.log.warn('Could not detect framework automatically'));\n };\n\n private handleCredentialsFound = (): void => {\n clack.log.success('Found existing WorkOS credentials in .env.local');\n };\n\n private handleEnvScanPrompt = async ({ files }: InstallerEvents['credentials:env:prompt']): Promise<void> => {\n this.isPromptActive = true;\n const fileList = files.length === 1 ? files[0] : files.slice(0, 2).join(', ');\n const confirmed = await clack.confirm({\n message: `Found ${fileList}. Check for existing WorkOS credentials?`,\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'ENV_SCAN_DECLINED' : 'ENV_SCAN_APPROVED',\n });\n };\n\n private handleDeviceStarted = ({ verificationUri, userCode }: InstallerEvents['device:started']): void => {\n clack.log.info(`\\nOpen this URL in your browser:\\n`);\n console.log(` ${chalk.cyan(verificationUri)}`);\n console.log(`\\nEnter code: ${chalk.bold(userCode)}\\n`);\n\n this.spinner = clack.spinner();\n this.spinner.start('Waiting for authentication...');\n };\n\n private handleDeviceSuccess = (): void => {\n // Spinner will be stopped by handleStagingFetching\n };\n\n private handleStagingFetching = (): void => {\n if (this.spinner) {\n this.spinner.stop('Authenticated');\n }\n this.spinner = clack.spinner();\n this.spinner.start('Fetching your WorkOS credentials...');\n };\n\n private handleStagingSuccess = (): void => {\n this.stopSpinner('Credentials fetched');\n clack.log.success('WorkOS credentials retrieved automatically');\n };\n\n private handleEnvCredentialsFound = ({ sourcePath }: InstallerEvents['credentials:env:found']): void => {\n clack.log.success(`Found existing WorkOS credentials in ${sourcePath}`);\n };\n\n private handleGitDirty = async ({ files }: InstallerEvents['git:dirty']): Promise<void> => {\n clack.log.warn('You have uncommitted or untracked files:');\n files.slice(0, 5).forEach((f) => clack.log.info(chalk.dim(` ${f}`)));\n if (files.length > 5) {\n clack.log.info(chalk.dim(` ... and ${files.length - 5} more`));\n }\n\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Continue anyway?',\n initialValue: false,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'GIT_CANCELLED' : 'GIT_CONFIRMED',\n });\n };\n\n private handleCredentialsRequest = async ({\n requiresApiKey,\n }: InstallerEvents['credentials:request']): Promise<void> => {\n clack.log.step(`Get your credentials from ${chalk.cyan('https://dashboard.workos.com')}`);\n\n const clientId = await clack.text({\n message: 'Enter your WorkOS Client ID:',\n placeholder: 'client_...',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Client ID is required';\n }\n if (!value.startsWith('client_')) {\n return 'Client ID should start with \"client_\"';\n }\n return undefined;\n },\n });\n\n if (clack.isCancel(clientId)) {\n this.sendEvent({ type: 'CANCEL' });\n return;\n }\n\n let apiKey = '';\n if (requiresApiKey) {\n clack.log.info(chalk.dim('ℹ️ Your API key will be hidden for security and saved to .env.local'));\n const apiKeyResult = await clack.password({\n message: 'Enter your WorkOS API Key:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'API Key is required';\n }\n if (!value.startsWith('sk_')) {\n return 'API Key should start with \"sk_\"';\n }\n return undefined;\n },\n });\n\n if (clack.isCancel(apiKeyResult)) {\n this.sendEvent({ type: 'CANCEL' });\n return;\n }\n apiKey = apiKeyResult as string;\n } else {\n clack.log.info(chalk.dim('ℹ️ Client-only SDK - API key not required'));\n }\n\n this.sendEvent({\n type: 'CREDENTIALS_SUBMITTED',\n apiKey,\n clientId: clientId as string,\n });\n };\n\n private handleConfigComplete = (): void => {\n clack.log.success('Environment configured');\n };\n\n private handleAgentStart = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Running AI agent...');\n\n // Periodic status updates for long-running operations\n let dots = 0;\n this.agentUpdateInterval = setInterval(() => {\n dots = (dots + 1) % 4;\n const dotStr = '.'.repeat(dots + 1);\n this.spinner?.message(`Running AI agent${dotStr}`);\n }, 2000);\n };\n\n private handleAgentProgress = ({ step, detail }: InstallerEvents['agent:progress']): void => {\n const message = detail ? `${step}: ${detail}` : step;\n this.spinner?.message(message);\n };\n\n private handleValidationStart = (): void => {\n this.stopAgentUpdates();\n this.stopSpinner('Agent completed');\n };\n\n private handleValidationIssues = ({ issues }: InstallerEvents['validation:issues']): void => {\n for (const issue of issues) {\n if (issue.severity === 'error') {\n clack.log.error(issue.message);\n } else {\n clack.log.warn(issue.message);\n }\n if (issue.hint) {\n clack.log.info(`Hint: ${issue.hint}`);\n }\n }\n };\n\n private handleValidationComplete = ({ passed, issueCount }: InstallerEvents['validation:complete']): void => {\n if (passed) {\n clack.log.success('Validation passed');\n } else {\n clack.log.warn(`Validation found ${issueCount} issue(s)`);\n }\n };\n\n private handleComplete = ({ success, summary }: InstallerEvents['complete']): void => {\n this.stopAgentUpdates();\n this.stopSpinner(success ? 'Done' : 'Failed');\n\n console.log('');\n console.log(renderCompletionSummary(success, summary));\n console.log('');\n };\n\n private handleError = ({ message, stack }: InstallerEvents['error']): void => {\n this.stopSpinner('Error');\n this.stopAgentUpdates();\n\n // Rewrite raw API/SDK errors into user-friendly messages\n const isServiceError =\n /\\b50[0-9]\\b/.test(message) || /server_error|internal_error|overloaded|service.*unavailable/i.test(message);\n const isRateLimit = /\\b429\\b/.test(message) || /rate.limit/i.test(message);\n const isNetworkError = /ECONNREFUSED|ETIMEDOUT|ENOTFOUND|fetch failed/i.test(message);\n const isProcessExit = /process exited with code/i.test(message);\n\n if (isServiceError) {\n clack.log.error('The AI service is temporarily unavailable.');\n clack.log.info('This is usually resolved within a few minutes. Please try again shortly.');\n } else if (isRateLimit) {\n clack.log.error('The AI service is currently rate-limited.');\n clack.log.info('Please wait a minute and try again.');\n } else if (isNetworkError) {\n clack.log.error('Could not connect to the AI service.');\n clack.log.info('Check your internet connection and try again.');\n } else if (isProcessExit) {\n clack.log.error('The AI agent process exited unexpectedly.');\n clack.log.info('Try running again. If this persists, run with --debug for details.');\n } else {\n clack.log.error(message);\n }\n\n // Add actionable hints for common errors\n if (message.includes('authentication') || message.includes('auth')) {\n clack.log.info(`Try running: ${formatWorkOSCommand('auth logout')} && ${formatWorkOSCommand('install')}`);\n }\n if (message.includes('ENOENT') || message.includes('not found')) {\n clack.log.info('Ensure you are in a project directory');\n }\n\n if (stack && this.debug) {\n this.debugLog(stack);\n }\n };\n\n private handleBranchPrompt = async ({ branch }: InstallerEvents['branch:prompt']): Promise<void> => {\n this.isPromptActive = true;\n const choice = await clack.select({\n message: `You are on ${chalk.bold(branch)}. Create a feature branch?`,\n options: [\n { value: 'create', label: 'Create feat/add-workos-authkit' },\n { value: 'continue', label: 'Continue on current branch' },\n { value: 'cancel', label: 'Cancel' },\n ],\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n if (clack.isCancel(choice) || choice === 'cancel') {\n this.sendEvent({ type: 'BRANCH_CANCEL' });\n } else if (choice === 'create') {\n this.sendEvent({ type: 'BRANCH_CREATE' });\n } else {\n this.sendEvent({ type: 'BRANCH_CONTINUE' });\n }\n };\n\n private handleBranchCreated = ({ branch }: InstallerEvents['branch:created']): void => {\n this.queueableLog(() => clack.log.success(`Created branch ${chalk.bold(branch)}`));\n };\n\n // ===== Post-install Event Handlers =====\n\n private handlePostInstallChanges = ({ files }: InstallerEvents['postinstall:changes']): void => {\n this.debugLog(`Post-install: ${files.length} changed files detected`);\n };\n\n private handleCommitPrompt = async (): Promise<void> => {\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Commit the changes?',\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'COMMIT_DECLINED' : 'COMMIT_APPROVED',\n });\n };\n\n private handleCommitGenerating = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Generating commit message...');\n };\n\n private handleCommitSuccess = ({ message }: InstallerEvents['postinstall:commit:success']): void => {\n this.stopSpinner('Committed');\n clack.log.success(`Committed: ${chalk.dim(message)}`);\n };\n\n private handleCommitFailed = ({ error }: InstallerEvents['postinstall:commit:failed']): void => {\n this.stopSpinner('Commit failed');\n clack.log.error(`Commit failed: ${error}`);\n };\n\n private handlePrPrompt = async (): Promise<void> => {\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Create a pull request?',\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'PR_DECLINED' : 'PR_APPROVED',\n });\n };\n\n private handlePrGenerating = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Generating PR description...');\n };\n\n private handlePrPushing = (): void => {\n if (this.spinner) {\n this.spinner.message('Pushing to remote...');\n } else {\n this.spinner = clack.spinner();\n this.spinner.start('Pushing to remote...');\n }\n };\n\n private handlePrSuccess = ({ url }: InstallerEvents['postinstall:pr:success']): void => {\n this.stopSpinner('PR created');\n clack.log.success(`Pull request created: ${chalk.cyan(url)}`);\n };\n\n private handlePrFailed = ({ error }: InstallerEvents['postinstall:pr:failed']): void => {\n this.stopSpinner('PR creation failed');\n clack.log.error(`PR creation failed: ${error}`);\n };\n\n private handlePushFailed = ({ error }: InstallerEvents['postinstall:push:failed']): void => {\n this.stopSpinner('Push failed');\n clack.log.error(`Push failed: ${error}`);\n };\n\n private handleManualInstructions = ({ instructions }: InstallerEvents['postinstall:manual']): void => {\n clack.log.info('GitHub CLI not found. Manual steps:');\n console.log(chalk.dim(instructions));\n };\n}\n"]}
|
|
@@ -9,6 +9,7 @@ import { analytics } from '../utils/analytics.js';
|
|
|
9
9
|
import { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';
|
|
10
10
|
import { LINTING_TOOLS } from './safe-tools.js';
|
|
11
11
|
import { getLlmGatewayUrlFromHost } from '../utils/urls.js';
|
|
12
|
+
import { formatWorkOSCommand } from '../utils/command-invocation.js';
|
|
12
13
|
import { getConfig } from './settings.js';
|
|
13
14
|
import { getCredentials, hasCredentials } from './credentials.js';
|
|
14
15
|
import { ensureValidToken } from './token-refresh.js';
|
|
@@ -279,6 +280,14 @@ export async function initializeAgent(config, options) {
|
|
|
279
280
|
// Disable SDK telemetry - our gateway doesn't proxy /api/event_logging/batch
|
|
280
281
|
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 'true',
|
|
281
282
|
};
|
|
283
|
+
// Placeholder bearer token for the Claude Agent SDK. The SDK's CLI
|
|
284
|
+
// subprocess runs a local auth-source check at startup and exits with
|
|
285
|
+
// "Not logged in · Please run /login" if no credentials are present in
|
|
286
|
+
// its environment — even when a proxy is handling auth upstream. Setting
|
|
287
|
+
// this token puts the SDK in custom-backend mode so it skips that check;
|
|
288
|
+
// the credential proxy rewrites the Authorization header with the real
|
|
289
|
+
// WorkOS token before forwarding upstream.
|
|
290
|
+
const PROXY_PLACEHOLDER_TOKEN = 'workos-cli-proxy-placeholder';
|
|
282
291
|
if (options.direct) {
|
|
283
292
|
// Direct mode: use user's Anthropic API key, skip gateway
|
|
284
293
|
if (!process.env.ANTHROPIC_API_KEY) {
|
|
@@ -306,18 +315,21 @@ export async function initializeAgent(config, options) {
|
|
|
306
315
|
clientId: activeEnv.clientId,
|
|
307
316
|
});
|
|
308
317
|
sdkEnv.ANTHROPIC_BASE_URL = activeProxyHandle.url;
|
|
309
|
-
|
|
318
|
+
// Prevent the user's personal Anthropic key (if any) from being sent
|
|
319
|
+
// to the WorkOS gateway; auth is injected by the claim-token proxy.
|
|
320
|
+
delete sdkEnv.ANTHROPIC_API_KEY;
|
|
321
|
+
sdkEnv.ANTHROPIC_AUTH_TOKEN = PROXY_PLACEHOLDER_TOKEN;
|
|
310
322
|
authMode = `claim-token-proxy:${activeProxyHandle.url}→${gatewayUrl}`;
|
|
311
323
|
logInfo(`[agent-interface] Using claim token proxy for unclaimed environment`);
|
|
312
324
|
}
|
|
313
325
|
else if (!options.skipAuth && !options.local) {
|
|
314
326
|
// Check/refresh authentication for production (unless skipping auth)
|
|
315
327
|
if (!hasCredentials()) {
|
|
316
|
-
throw new Error(
|
|
328
|
+
throw new Error(`Not authenticated. Run \`${formatWorkOSCommand('auth login')}\` to authenticate.`);
|
|
317
329
|
}
|
|
318
330
|
const creds = getCredentials();
|
|
319
331
|
if (!creds) {
|
|
320
|
-
throw new Error(
|
|
332
|
+
throw new Error(`Not authenticated. Run \`${formatWorkOSCommand('auth login')}\` to authenticate.`);
|
|
321
333
|
}
|
|
322
334
|
// Check if we have refresh token capability and proxy is not disabled
|
|
323
335
|
if (creds.refreshToken && process.env.INSTALLER_DISABLE_PROXY !== '1') {
|
|
@@ -336,7 +348,7 @@ export async function initializeAgent(config, options) {
|
|
|
336
348
|
onRefreshExpired: () => {
|
|
337
349
|
logError('[agent-interface] Session expired, refresh token invalid');
|
|
338
350
|
options.emitter?.emit('error', {
|
|
339
|
-
message:
|
|
351
|
+
message: `Session expired. Run \`${formatWorkOSCommand('auth login')}\` to re-authenticate.`,
|
|
340
352
|
});
|
|
341
353
|
},
|
|
342
354
|
},
|
|
@@ -344,17 +356,20 @@ export async function initializeAgent(config, options) {
|
|
|
344
356
|
// Point SDK at proxy instead of direct gateway
|
|
345
357
|
sdkEnv.ANTHROPIC_BASE_URL = activeProxyHandle.url;
|
|
346
358
|
logInfo(`[agent-interface] Using credential proxy at ${activeProxyHandle.url}`);
|
|
347
|
-
//
|
|
348
|
-
|
|
359
|
+
// Prevent the user's personal Anthropic key (if any) from being
|
|
360
|
+
// sent to the WorkOS gateway; the credential proxy rewrites the
|
|
361
|
+
// Authorization header with the real WorkOS token.
|
|
362
|
+
delete sdkEnv.ANTHROPIC_API_KEY;
|
|
363
|
+
sdkEnv.ANTHROPIC_AUTH_TOKEN = PROXY_PLACEHOLDER_TOKEN;
|
|
349
364
|
authMode = `proxy:${activeProxyHandle.url}→${gatewayUrl}`;
|
|
350
365
|
}
|
|
351
366
|
else {
|
|
352
367
|
// No refresh token OR proxy disabled - fall back to old behavior (5 min limit)
|
|
353
368
|
if (!creds.refreshToken) {
|
|
354
369
|
logWarn('[agent-interface] No refresh token available, session limited to 5 minutes');
|
|
355
|
-
logWarn(
|
|
370
|
+
logWarn(`[agent-interface] Run \`${formatWorkOSCommand('auth login')}\` to enable extended sessions`);
|
|
356
371
|
options.emitter?.emit('status', {
|
|
357
|
-
message:
|
|
372
|
+
message: `Note: Run \`${formatWorkOSCommand('auth login')}\` to enable extended sessions`,
|
|
358
373
|
});
|
|
359
374
|
}
|
|
360
375
|
else {
|
|
@@ -365,24 +380,33 @@ export async function initializeAgent(config, options) {
|
|
|
365
380
|
throw new Error(refreshResult.error || 'Authentication failed');
|
|
366
381
|
}
|
|
367
382
|
sdkEnv.ANTHROPIC_BASE_URL = gatewayUrl;
|
|
383
|
+
// Prevent the user's personal Anthropic key (if any) from being
|
|
384
|
+
// forwarded to the WorkOS gateway as an x-api-key header alongside
|
|
385
|
+
// the WorkOS access token we set below.
|
|
386
|
+
delete sdkEnv.ANTHROPIC_API_KEY;
|
|
368
387
|
sdkEnv.ANTHROPIC_AUTH_TOKEN = creds.accessToken;
|
|
369
388
|
authMode = options.local ? `local-gateway:${gatewayUrl}` : `workos-gateway:${gatewayUrl}`;
|
|
370
389
|
logInfo('Sending access token to gateway (legacy mode)');
|
|
371
390
|
}
|
|
372
391
|
}
|
|
373
392
|
else if (options.skipAuth) {
|
|
374
|
-
// Skip auth mode - direct to gateway without
|
|
393
|
+
// Skip auth mode - direct to gateway without a real token. The SDK's
|
|
394
|
+
// local auth-source check would otherwise fail with "Not logged in",
|
|
395
|
+
// so seed a placeholder bearer; the gateway is expected to accept
|
|
396
|
+
// unauthenticated requests here and ignore the placeholder value.
|
|
375
397
|
sdkEnv.ANTHROPIC_BASE_URL = gatewayUrl;
|
|
376
|
-
delete sdkEnv.
|
|
398
|
+
delete sdkEnv.ANTHROPIC_API_KEY;
|
|
399
|
+
sdkEnv.ANTHROPIC_AUTH_TOKEN = PROXY_PLACEHOLDER_TOKEN;
|
|
377
400
|
authMode = `skip-auth:${gatewayUrl}`;
|
|
378
|
-
logInfo('Skipping auth -
|
|
401
|
+
logInfo('Skipping auth - placeholder bearer sent to gateway');
|
|
379
402
|
}
|
|
380
403
|
else {
|
|
381
|
-
// Local mode without auth
|
|
404
|
+
// Local mode without auth - same rationale as skip-auth above.
|
|
382
405
|
sdkEnv.ANTHROPIC_BASE_URL = gatewayUrl;
|
|
383
|
-
delete sdkEnv.
|
|
406
|
+
delete sdkEnv.ANTHROPIC_API_KEY;
|
|
407
|
+
sdkEnv.ANTHROPIC_AUTH_TOKEN = PROXY_PLACEHOLDER_TOKEN;
|
|
384
408
|
authMode = `local-gateway:${gatewayUrl}`;
|
|
385
|
-
logInfo('Local mode -
|
|
409
|
+
logInfo('Local mode - placeholder bearer sent to gateway');
|
|
386
410
|
}
|
|
387
411
|
logInfo('Configured LLM gateway:', sdkEnv.ANTHROPIC_BASE_URL);
|
|
388
412
|
// Set analytics tag for gateway mode
|