@eminent337/aery 0.1.101 → 0.1.103
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/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +5 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3 -7
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/package.json +3 -3
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface DoctorReportOptions {
|
|
|
23
23
|
coreExtensions?: CoreExtensionDiagnostic;
|
|
24
24
|
agentDir?: string;
|
|
25
25
|
}
|
|
26
|
+
export declare function getCoreExtensionDiagnostic(agentDir?: string): CoreExtensionDiagnostic;
|
|
27
|
+
export declare function formatCurrentCoreExtensionsReport(agentDir?: string): string;
|
|
26
28
|
export declare function collectDoctorReport(options?: DoctorReportOptions): Promise<DoctorReport>;
|
|
27
29
|
export declare function formatDoctorReport(report: DoctorReport): string;
|
|
28
30
|
export declare function formatCoreExtensionsReport(extensions: CoreExtensionDiagnostic): string;
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,KAAK,uBAAuB,EAA0B,MAAM,kBAAkB,CAAC;AAOxF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,cAAc,EAAE,uBAAuB,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxE,cAAc,CAAC,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,KAAK,uBAAuB,EAA0B,MAAM,kBAAkB,CAAC;AAOxF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,cAAc,EAAE,uBAAuB,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxE,cAAc,CAAC,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD,wBAAgB,0BAA0B,CAAC,QAAQ,GAAE,MAAsB,GAAG,uBAAuB,CAIpG;AAED,wBAAgB,iCAAiC,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAE1F;AAED,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgClG;AAiBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAyB/D;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAetF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAavE","sourcesContent":["import chalk from \"chalk\";\nimport { join } from \"path\";\nimport { APP_NAME, getAgentDir, VERSION } from \"../config.js\";\nimport { type AuthStatus, AuthStorage } from \"../core/auth-storage.js\";\nimport { ModelRegistry } from \"../core/model-registry.js\";\nimport { type CoreExtensionDiagnostic, diagnoseCoreExtensions } from \"../migrations.js\";\nimport { getLatestPiVersion, isNewerPackageVersion } from \"../utils/version-check.js\";\n\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\treturn value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport interface DoctorProviderStatus {\n\tprovider: string;\n\tstatus: AuthStatus;\n}\n\nexport interface DoctorReport {\n\tversion: {\n\t\tlocal: string;\n\t\tlatest?: string;\n\t\tupdateAvailable?: boolean;\n\t\terror?: string;\n\t};\n\tproviders: DoctorProviderStatus[];\n\tcoreExtensions: CoreExtensionDiagnostic;\n}\n\nexport interface DoctorReportOptions {\n\tversion?: string;\n\tauthStorage?: AuthStorage;\n\tmodelRegistry?: ModelRegistry;\n\tlatestVersion?: (currentVersion: string) => Promise<string | undefined>;\n\tcoreExtensions?: CoreExtensionDiagnostic;\n\tagentDir?: string;\n}\n\nconst DEFAULT_PROVIDER_CHECKS = [\n\t\"anthropic\",\n\t\"openai\",\n\t\"google\",\n\t\"openrouter\",\n\t\"cloudflare-workers-ai\",\n\t\"deepseek\",\n\t\"mistral\",\n\t\"groq\",\n\t\"xai\",\n\t\"bedrock\",\n];\n\nexport function getCoreExtensionDiagnostic(agentDir: string = getAgentDir()): CoreExtensionDiagnostic {\n\tconst repoPath = join(agentDir, \"git\", \"github.com\", \"eminent337\", \"aery-extensions\");\n\tconst settingsPath = join(agentDir, \"settings.json\");\n\treturn diagnoseCoreExtensions(repoPath, settingsPath);\n}\n\nexport function formatCurrentCoreExtensionsReport(agentDir: string = getAgentDir()): string {\n\treturn formatCoreExtensionsReport(getCoreExtensionDiagnostic(agentDir));\n}\n\nexport async function collectDoctorReport(options: DoctorReportOptions = {}): Promise<DoctorReport> {\n\tconst version = options.version ?? VERSION;\n\tconst authStorage = options.authStorage ?? AuthStorage.create();\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage);\n\tconst latestVersion =\n\t\toptions.latestVersion ??\n\t\t(isTruthyEnvFlag(process.env.AERY_OFFLINE) || isTruthyEnvFlag(process.env.AERY_SKIP_VERSION_CHECK)\n\t\t\t? async () => undefined\n\t\t\t: getLatestPiVersion);\n\tconst providerIds = [...new Set([...DEFAULT_PROVIDER_CHECKS, ...authStorage.list()])].sort();\n\n\tlet latest: string | undefined;\n\tlet versionError: string | undefined;\n\ttry {\n\t\tlatest = await latestVersion(version);\n\t} catch (error) {\n\t\tversionError = error instanceof Error ? error.message : String(error);\n\t}\n\n\treturn {\n\t\tversion: {\n\t\t\tlocal: version,\n\t\t\tlatest,\n\t\t\tupdateAvailable: latest ? isNewerPackageVersion(latest, version) : false,\n\t\t\terror: versionError,\n\t\t},\n\t\tproviders: providerIds.map((provider) => ({\n\t\t\tprovider,\n\t\t\tstatus: modelRegistry.getProviderAuthStatus(provider),\n\t\t})),\n\t\tcoreExtensions: options.coreExtensions ?? getCoreExtensionDiagnostic(options.agentDir),\n\t};\n}\n\nfunction formatStatus(status: AuthStatus): string {\n\tif (status.configured) {\n\t\tconst source = status.source ? ` via ${status.source}` : \"\";\n\t\tconst label = status.label ? ` (${status.label})` : \"\";\n\t\treturn `configured${source}${label}`;\n\t}\n\tif (status.label) {\n\t\treturn status.label;\n\t}\n\tif (status.source) {\n\t\treturn `detected via ${status.source}`;\n\t}\n\treturn \"not configured\";\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n\tconst lines: string[] = [];\n\tlines.push(chalk.bold(`${APP_NAME.charAt(0).toUpperCase()}${APP_NAME.slice(1)} Doctor`));\n\tlines.push(\"\");\n\tlines.push(chalk.bold(\"Version\"));\n\tlines.push(` local: ${report.version.local}`);\n\tif (report.version.latest) {\n\t\tconst suffix = report.version.updateAvailable ? \" (update available)\" : \" (latest)\";\n\t\tlines.push(` latest: ${report.version.latest}${suffix}`);\n\t} else if (report.version.error) {\n\t\tlines.push(` latest: unavailable (${report.version.error})`);\n\t} else {\n\t\tlines.push(\" latest: unavailable\");\n\t}\n\n\tlines.push(\"\");\n\tlines.push(chalk.bold(\"Providers\"));\n\tfor (const provider of report.providers) {\n\t\tlines.push(` ${provider.provider}: ${formatStatus(provider.status)}`);\n\t}\n\n\tlines.push(\"\");\n\tlines.push(formatCoreExtensionsReport(report.coreExtensions));\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function formatCoreExtensionsReport(extensions: CoreExtensionDiagnostic): string {\n\tconst lines: string[] = [];\n\tlines.push(chalk.bold(\"Core Extensions\"));\n\tif (!extensions.repoExists) {\n\t\tlines.push(\" core extensions: not installed\");\n\t\tlines.push(\" repair: run aery update --extensions\");\n\t} else if (extensions.missingFiles.length > 0 || extensions.missingSettingsEntries.length > 0) {\n\t\tlines.push(\" core extensions: attention needed\");\n\t\tlines.push(` missing files: ${extensions.missingFiles.length}`);\n\t\tlines.push(` missing settings entries: ${extensions.missingSettingsEntries.length}`);\n\t\tlines.push(\" repair: run aery update --extensions\");\n\t} else {\n\t\tlines.push(\" core extensions: ok\");\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport async function runDoctorCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"doctor\") {\n\t\treturn false;\n\t}\n\n\tconst json = args.includes(\"--json\");\n\tconst report = await collectDoctorReport();\n\tif (json) {\n\t\tconsole.log(JSON.stringify(report, null, 2));\n\t} else {\n\t\tconsole.log(formatDoctorReport(report));\n\t}\n\treturn true;\n}\n"]}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -20,11 +20,14 @@ const DEFAULT_PROVIDER_CHECKS = [
|
|
|
20
20
|
"xai",
|
|
21
21
|
"bedrock",
|
|
22
22
|
];
|
|
23
|
-
function getCoreExtensionDiagnostic(agentDir) {
|
|
23
|
+
export function getCoreExtensionDiagnostic(agentDir = getAgentDir()) {
|
|
24
24
|
const repoPath = join(agentDir, "git", "github.com", "eminent337", "aery-extensions");
|
|
25
25
|
const settingsPath = join(agentDir, "settings.json");
|
|
26
26
|
return diagnoseCoreExtensions(repoPath, settingsPath);
|
|
27
27
|
}
|
|
28
|
+
export function formatCurrentCoreExtensionsReport(agentDir = getAgentDir()) {
|
|
29
|
+
return formatCoreExtensionsReport(getCoreExtensionDiagnostic(agentDir));
|
|
30
|
+
}
|
|
28
31
|
export async function collectDoctorReport(options = {}) {
|
|
29
32
|
const version = options.version ?? VERSION;
|
|
30
33
|
const authStorage = options.authStorage ?? AuthStorage.create();
|
|
@@ -53,7 +56,7 @@ export async function collectDoctorReport(options = {}) {
|
|
|
53
56
|
provider,
|
|
54
57
|
status: modelRegistry.getProviderAuthStatus(provider),
|
|
55
58
|
})),
|
|
56
|
-
coreExtensions: options.coreExtensions ?? getCoreExtensionDiagnostic(options.agentDir
|
|
59
|
+
coreExtensions: options.coreExtensions ?? getCoreExtensionDiagnostic(options.agentDir),
|
|
57
60
|
};
|
|
58
61
|
}
|
|
59
62
|
function formatStatus(status) {
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { join } from \"path\";\nimport { APP_NAME, getAgentDir, VERSION } from \"../config.js\";\nimport { type AuthStatus, AuthStorage } from \"../core/auth-storage.js\";\nimport { ModelRegistry } from \"../core/model-registry.js\";\nimport { type CoreExtensionDiagnostic, diagnoseCoreExtensions } from \"../migrations.js\";\nimport { getLatestPiVersion, isNewerPackageVersion } from \"../utils/version-check.js\";\n\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\treturn value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport interface DoctorProviderStatus {\n\tprovider: string;\n\tstatus: AuthStatus;\n}\n\nexport interface DoctorReport {\n\tversion: {\n\t\tlocal: string;\n\t\tlatest?: string;\n\t\tupdateAvailable?: boolean;\n\t\terror?: string;\n\t};\n\tproviders: DoctorProviderStatus[];\n\tcoreExtensions: CoreExtensionDiagnostic;\n}\n\nexport interface DoctorReportOptions {\n\tversion?: string;\n\tauthStorage?: AuthStorage;\n\tmodelRegistry?: ModelRegistry;\n\tlatestVersion?: (currentVersion: string) => Promise<string | undefined>;\n\tcoreExtensions?: CoreExtensionDiagnostic;\n\tagentDir?: string;\n}\n\nconst DEFAULT_PROVIDER_CHECKS = [\n\t\"anthropic\",\n\t\"openai\",\n\t\"google\",\n\t\"openrouter\",\n\t\"cloudflare-workers-ai\",\n\t\"deepseek\",\n\t\"mistral\",\n\t\"groq\",\n\t\"xai\",\n\t\"bedrock\",\n];\n\nfunction getCoreExtensionDiagnostic(agentDir: string): CoreExtensionDiagnostic {\n\tconst repoPath = join(agentDir, \"git\", \"github.com\", \"eminent337\", \"aery-extensions\");\n\tconst settingsPath = join(agentDir, \"settings.json\");\n\treturn diagnoseCoreExtensions(repoPath, settingsPath);\n}\n\nexport async function collectDoctorReport(options: DoctorReportOptions = {}): Promise<DoctorReport> {\n\tconst version = options.version ?? VERSION;\n\tconst authStorage = options.authStorage ?? AuthStorage.create();\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage);\n\tconst latestVersion =\n\t\toptions.latestVersion ??\n\t\t(isTruthyEnvFlag(process.env.AERY_OFFLINE) || isTruthyEnvFlag(process.env.AERY_SKIP_VERSION_CHECK)\n\t\t\t? async () => undefined\n\t\t\t: getLatestPiVersion);\n\tconst providerIds = [...new Set([...DEFAULT_PROVIDER_CHECKS, ...authStorage.list()])].sort();\n\n\tlet latest: string | undefined;\n\tlet versionError: string | undefined;\n\ttry {\n\t\tlatest = await latestVersion(version);\n\t} catch (error) {\n\t\tversionError = error instanceof Error ? error.message : String(error);\n\t}\n\n\treturn {\n\t\tversion: {\n\t\t\tlocal: version,\n\t\t\tlatest,\n\t\t\tupdateAvailable: latest ? isNewerPackageVersion(latest, version) : false,\n\t\t\terror: versionError,\n\t\t},\n\t\tproviders: providerIds.map((provider) => ({\n\t\t\tprovider,\n\t\t\tstatus: modelRegistry.getProviderAuthStatus(provider),\n\t\t})),\n\t\tcoreExtensions: options.coreExtensions ?? getCoreExtensionDiagnostic(options.agentDir ?? getAgentDir()),\n\t};\n}\n\nfunction formatStatus(status: AuthStatus): string {\n\tif (status.configured) {\n\t\tconst source = status.source ? ` via ${status.source}` : \"\";\n\t\tconst label = status.label ? ` (${status.label})` : \"\";\n\t\treturn `configured${source}${label}`;\n\t}\n\tif (status.label) {\n\t\treturn status.label;\n\t}\n\tif (status.source) {\n\t\treturn `detected via ${status.source}`;\n\t}\n\treturn \"not configured\";\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n\tconst lines: string[] = [];\n\tlines.push(chalk.bold(`${APP_NAME.charAt(0).toUpperCase()}${APP_NAME.slice(1)} Doctor`));\n\tlines.push(\"\");\n\tlines.push(chalk.bold(\"Version\"));\n\tlines.push(` local: ${report.version.local}`);\n\tif (report.version.latest) {\n\t\tconst suffix = report.version.updateAvailable ? \" (update available)\" : \" (latest)\";\n\t\tlines.push(` latest: ${report.version.latest}${suffix}`);\n\t} else if (report.version.error) {\n\t\tlines.push(` latest: unavailable (${report.version.error})`);\n\t} else {\n\t\tlines.push(\" latest: unavailable\");\n\t}\n\n\tlines.push(\"\");\n\tlines.push(chalk.bold(\"Providers\"));\n\tfor (const provider of report.providers) {\n\t\tlines.push(` ${provider.provider}: ${formatStatus(provider.status)}`);\n\t}\n\n\tlines.push(\"\");\n\tlines.push(formatCoreExtensionsReport(report.coreExtensions));\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function formatCoreExtensionsReport(extensions: CoreExtensionDiagnostic): string {\n\tconst lines: string[] = [];\n\tlines.push(chalk.bold(\"Core Extensions\"));\n\tif (!extensions.repoExists) {\n\t\tlines.push(\" core extensions: not installed\");\n\t\tlines.push(\" repair: run aery update --extensions\");\n\t} else if (extensions.missingFiles.length > 0 || extensions.missingSettingsEntries.length > 0) {\n\t\tlines.push(\" core extensions: attention needed\");\n\t\tlines.push(` missing files: ${extensions.missingFiles.length}`);\n\t\tlines.push(` missing settings entries: ${extensions.missingSettingsEntries.length}`);\n\t\tlines.push(\" repair: run aery update --extensions\");\n\t} else {\n\t\tlines.push(\" core extensions: ok\");\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport async function runDoctorCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"doctor\") {\n\t\treturn false;\n\t}\n\n\tconst json = args.includes(\"--json\");\n\tconst report = await collectDoctorReport();\n\tif (json) {\n\t\tconsole.log(JSON.stringify(report, null, 2));\n\t} else {\n\t\tconsole.log(formatDoctorReport(report));\n\t}\n\treturn true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { join } from \"path\";\nimport { APP_NAME, getAgentDir, VERSION } from \"../config.js\";\nimport { type AuthStatus, AuthStorage } from \"../core/auth-storage.js\";\nimport { ModelRegistry } from \"../core/model-registry.js\";\nimport { type CoreExtensionDiagnostic, diagnoseCoreExtensions } from \"../migrations.js\";\nimport { getLatestPiVersion, isNewerPackageVersion } from \"../utils/version-check.js\";\n\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\treturn value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport interface DoctorProviderStatus {\n\tprovider: string;\n\tstatus: AuthStatus;\n}\n\nexport interface DoctorReport {\n\tversion: {\n\t\tlocal: string;\n\t\tlatest?: string;\n\t\tupdateAvailable?: boolean;\n\t\terror?: string;\n\t};\n\tproviders: DoctorProviderStatus[];\n\tcoreExtensions: CoreExtensionDiagnostic;\n}\n\nexport interface DoctorReportOptions {\n\tversion?: string;\n\tauthStorage?: AuthStorage;\n\tmodelRegistry?: ModelRegistry;\n\tlatestVersion?: (currentVersion: string) => Promise<string | undefined>;\n\tcoreExtensions?: CoreExtensionDiagnostic;\n\tagentDir?: string;\n}\n\nconst DEFAULT_PROVIDER_CHECKS = [\n\t\"anthropic\",\n\t\"openai\",\n\t\"google\",\n\t\"openrouter\",\n\t\"cloudflare-workers-ai\",\n\t\"deepseek\",\n\t\"mistral\",\n\t\"groq\",\n\t\"xai\",\n\t\"bedrock\",\n];\n\nexport function getCoreExtensionDiagnostic(agentDir: string = getAgentDir()): CoreExtensionDiagnostic {\n\tconst repoPath = join(agentDir, \"git\", \"github.com\", \"eminent337\", \"aery-extensions\");\n\tconst settingsPath = join(agentDir, \"settings.json\");\n\treturn diagnoseCoreExtensions(repoPath, settingsPath);\n}\n\nexport function formatCurrentCoreExtensionsReport(agentDir: string = getAgentDir()): string {\n\treturn formatCoreExtensionsReport(getCoreExtensionDiagnostic(agentDir));\n}\n\nexport async function collectDoctorReport(options: DoctorReportOptions = {}): Promise<DoctorReport> {\n\tconst version = options.version ?? VERSION;\n\tconst authStorage = options.authStorage ?? AuthStorage.create();\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage);\n\tconst latestVersion =\n\t\toptions.latestVersion ??\n\t\t(isTruthyEnvFlag(process.env.AERY_OFFLINE) || isTruthyEnvFlag(process.env.AERY_SKIP_VERSION_CHECK)\n\t\t\t? async () => undefined\n\t\t\t: getLatestPiVersion);\n\tconst providerIds = [...new Set([...DEFAULT_PROVIDER_CHECKS, ...authStorage.list()])].sort();\n\n\tlet latest: string | undefined;\n\tlet versionError: string | undefined;\n\ttry {\n\t\tlatest = await latestVersion(version);\n\t} catch (error) {\n\t\tversionError = error instanceof Error ? error.message : String(error);\n\t}\n\n\treturn {\n\t\tversion: {\n\t\t\tlocal: version,\n\t\t\tlatest,\n\t\t\tupdateAvailable: latest ? isNewerPackageVersion(latest, version) : false,\n\t\t\terror: versionError,\n\t\t},\n\t\tproviders: providerIds.map((provider) => ({\n\t\t\tprovider,\n\t\t\tstatus: modelRegistry.getProviderAuthStatus(provider),\n\t\t})),\n\t\tcoreExtensions: options.coreExtensions ?? getCoreExtensionDiagnostic(options.agentDir),\n\t};\n}\n\nfunction formatStatus(status: AuthStatus): string {\n\tif (status.configured) {\n\t\tconst source = status.source ? ` via ${status.source}` : \"\";\n\t\tconst label = status.label ? ` (${status.label})` : \"\";\n\t\treturn `configured${source}${label}`;\n\t}\n\tif (status.label) {\n\t\treturn status.label;\n\t}\n\tif (status.source) {\n\t\treturn `detected via ${status.source}`;\n\t}\n\treturn \"not configured\";\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n\tconst lines: string[] = [];\n\tlines.push(chalk.bold(`${APP_NAME.charAt(0).toUpperCase()}${APP_NAME.slice(1)} Doctor`));\n\tlines.push(\"\");\n\tlines.push(chalk.bold(\"Version\"));\n\tlines.push(` local: ${report.version.local}`);\n\tif (report.version.latest) {\n\t\tconst suffix = report.version.updateAvailable ? \" (update available)\" : \" (latest)\";\n\t\tlines.push(` latest: ${report.version.latest}${suffix}`);\n\t} else if (report.version.error) {\n\t\tlines.push(` latest: unavailable (${report.version.error})`);\n\t} else {\n\t\tlines.push(\" latest: unavailable\");\n\t}\n\n\tlines.push(\"\");\n\tlines.push(chalk.bold(\"Providers\"));\n\tfor (const provider of report.providers) {\n\t\tlines.push(` ${provider.provider}: ${formatStatus(provider.status)}`);\n\t}\n\n\tlines.push(\"\");\n\tlines.push(formatCoreExtensionsReport(report.coreExtensions));\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function formatCoreExtensionsReport(extensions: CoreExtensionDiagnostic): string {\n\tconst lines: string[] = [];\n\tlines.push(chalk.bold(\"Core Extensions\"));\n\tif (!extensions.repoExists) {\n\t\tlines.push(\" core extensions: not installed\");\n\t\tlines.push(\" repair: run aery update --extensions\");\n\t} else if (extensions.missingFiles.length > 0 || extensions.missingSettingsEntries.length > 0) {\n\t\tlines.push(\" core extensions: attention needed\");\n\t\tlines.push(` missing files: ${extensions.missingFiles.length}`);\n\t\tlines.push(` missing settings entries: ${extensions.missingSettingsEntries.length}`);\n\t\tlines.push(\" repair: run aery update --extensions\");\n\t} else {\n\t\tlines.push(\" core extensions: ok\");\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport async function runDoctorCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"doctor\") {\n\t\treturn false;\n\t}\n\n\tconst json = args.includes(\"--json\");\n\tconst report = await collectDoctorReport();\n\tif (json) {\n\t\tconsole.log(JSON.stringify(report, null, 2));\n\t} else {\n\t\tconsole.log(formatDoctorReport(report));\n\t}\n\treturn true;\n}\n"]}
|