diff --git a/src/infra/clawhub.ts b/src/infra/clawhub.ts index fb7590c7775..cc976335c32 100644 --- a/src/infra/clawhub.ts +++ b/src/infra/clawhub.ts @@ -105,12 +105,7 @@ export type ClawHubPackageArtifactResolverResponse = { createdAt?: number | null; changelog?: string | null; distTags?: string[]; - files?: Array<{ - path: string; - size?: number; - sha256: string; - contentType?: string; - }>; + files?: unknown[]; sha256hash?: string | null; compatibility?: ClawHubPackageCompatibility | null; artifact?: ClawHubPackageArtifactSummary | null; diff --git a/src/plugins/clawhub.ts b/src/plugins/clawhub.ts index 8fef33f8ebc..4952e92c3bc 100644 --- a/src/plugins/clawhub.ts +++ b/src/plugins/clawhub.ts @@ -249,6 +249,21 @@ function readArtifactResolverVersion( return { version: requestedVersion }; } +function isClawHubPackageFamily( + value: unknown, +): value is NonNullable["family"] { + return value === "code-plugin" || value === "bundle-plugin" || value === "skill"; +} + +function normalizeArtifactResolverFiles( + files: ClawHubArtifactResolverVersion["files"], +): NonNullable["files"] { + if (!Array.isArray(files)) { + return undefined; + } + return files as NonNullable["files"]; +} + function resolveTopLevelNpmPackArtifact( artifact: ClawHubResolvedArtifact | null | undefined, ): ClawHubPackageArtifactSummary | null { @@ -784,34 +799,35 @@ async function resolveCompatiblePackageVersion(params: { artifactVersion.clawpack ?? resolveTopLevelNpmPackArtifact(artifactResponse.artifact), }; } + const artifactFamily = artifactResponse.package?.family; + const resolvedFamily: NonNullable["family"] = + isClawHubPackageFamily(artifactFamily) + ? artifactFamily + : (params.detail.package?.family ?? "code-plugin"); + const versionRecord: NonNullable = { + version: resolvedVersion, + createdAt: typeof artifactVersion.createdAt === "number" ? artifactVersion.createdAt : 0, + changelog: typeof artifactVersion.changelog === "string" ? artifactVersion.changelog : "", + distTags: artifactVersion.distTags, + files: normalizeArtifactResolverFiles(artifactVersion.files), + sha256hash: artifactVersion.sha256hash, + compatibility: artifactVersion.compatibility, + artifact: artifactVersion.artifact, + clawpack: artifactVersion.clawpack ?? undefined, + }; const versionDetail: ClawHubPackageVersion = { package: artifactResponse.package ? { name: artifactResponse.package.name ?? params.detail.package?.name ?? "", displayName: artifactResponse.package.displayName ?? params.detail.package?.displayName ?? "", - family: - artifactResponse.package.family === "code-plugin" || - artifactResponse.package.family === "bundle-plugin" || - artifactResponse.package.family === "skill" - ? artifactResponse.package.family - : (params.detail.package?.family ?? "code-plugin"), + family: resolvedFamily, } : null, - version: { - version: resolvedVersion, - createdAt: typeof artifactVersion.createdAt === "number" ? artifactVersion.createdAt : 0, - changelog: typeof artifactVersion.changelog === "string" ? artifactVersion.changelog : "", - distTags: artifactVersion.distTags, - files: artifactVersion.files, - sha256hash: artifactVersion.sha256hash, - compatibility: artifactVersion.compatibility, - artifact: artifactVersion.artifact, - clawpack: artifactVersion.clawpack ?? undefined, - }, + version: versionRecord, }; const clawpack = - resolveClawHubNpmPackArtifact(versionDetail.version) ?? + resolveClawHubNpmPackArtifact(versionRecord) ?? resolveTopLevelNpmPackArtifact(artifactResponse.artifact); const verificationState = resolveClawHubArchiveVerification( versionDetail,