

























@@ -13,18 +13,20 @@ import {
1313import {
1414ClawHubRequestError,
1515downloadClawHubPackageArchive,
16+fetchClawHubPackageArtifact,
1617fetchClawHubPackageDetail,
17-fetchClawHubPackageVersion,
1818normalizeClawHubSha256Integrity,
1919normalizeClawHubSha256Hex,
2020parseClawHubPluginSpec,
2121resolveLatestVersionFromPackage,
2222satisfiesGatewayMinimum,
2323satisfiesPluginApiRange,
2424type ClawHubPackageArtifactSummary,
25+type ClawHubPackageArtifactResolverResponse,
2526type ClawHubPackageCompatibility,
2627type ClawHubPackageDetail,
2728type ClawHubPackageClawPackSummary,
29+type ClawHubResolvedArtifact,
2830type ClawHubPackageVersion,
2931} from "../infra/clawhub.js";
3032import { formatErrorMessage } from "../infra/errors.js";
@@ -89,6 +91,17 @@ type ClawHubArchiveVerificationResolution =
8991}
9092| ClawHubInstallFailure;
919394+type ClawHubArtifactResolverVersion = NonNullable<
95+Exclude<ClawHubPackageArtifactResolverResponse["version"], string | null | undefined>
96+>;
97+98+type ClawHubInstallArtifactDecision = {
99+version: string;
100+compatibility?: ClawHubPackageCompatibility | null;
101+verification: ClawHubArchiveVerification | null;
102+clawpack?: ClawHubPackageArtifactSummary | ClawHubPackageClawPackSummary | null;
103+};
104+92105type ClawHubArchiveFileVerificationResult =
93106| {
94107ok: true;
@@ -219,6 +232,49 @@ function resolveClawHubNpmPackArtifact(
219232return null;
220233}
221234235+function readArtifactResolverVersion(
236+response: ClawHubPackageArtifactResolverResponse,
237+requestedVersion: string,
238+): ClawHubArtifactResolverVersion {
239+if (
240+response.version &&
241+typeof response.version === "object" &&
242+!Array.isArray(response.version)
243+) {
244+return response.version;
245+}
246+if (typeof response.version === "string" && response.version.trim().length > 0) {
247+return { version: response.version.trim() };
248+}
249+return { version: requestedVersion };
250+}
251+252+function resolveTopLevelNpmPackArtifact(
253+artifact: ClawHubResolvedArtifact | null | undefined,
254+): ClawHubPackageArtifactSummary | null {
255+if (artifact?.artifactKind !== "npm-pack") {
256+return null;
257+}
258+return {
259+kind: "npm-pack",
260+format: "tgz",
261+sha256: artifact.artifactSha256 ?? null,
262+npmIntegrity: artifact.npmIntegrity,
263+npmShasum: artifact.npmShasum ?? null,
264+downloadUrl: artifact.downloadUrl ?? null,
265+};
266+}
267+268+function resolveTopLevelLegacyArchiveVerification(
269+artifact: ClawHubResolvedArtifact | null | undefined,
270+): ClawHubArchiveVerification | null {
271+if (artifact?.artifactKind !== "legacy-zip" || typeof artifact.artifactSha256 !== "string") {
272+return null;
273+}
274+const integrity = normalizeClawHubSha256Integrity(artifact.artifactSha256);
275+return integrity ? { kind: "archive-integrity", integrity } : null;
276+}
277+222278export function formatClawHubSpecifier(params: { name: string; version?: string }): string {
223279return `clawhub:${params.name}${params.version ? `@${params.version}` : ""}`;
224280}
@@ -692,26 +748,17 @@ async function resolveCompatiblePackageVersion(params: {
692748baseUrl?: string;
693749token?: string;
694750timeoutMs?: number;
695-}): Promise<
696-| {
697-ok: true;
698-version: string;
699-compatibility?: ClawHubPackageCompatibility | null;
700-verification: ClawHubArchiveVerification | null;
701-clawpack?: ClawHubPackageArtifactSummary | ClawHubPackageClawPackSummary | null;
702-}
703-| ClawHubInstallFailure
704-> {
751+}): Promise<({ ok: true } & ClawHubInstallArtifactDecision) | ClawHubInstallFailure> {
705752const requestedVersion = resolveRequestedVersion(params);
706753if (!requestedVersion) {
707754return buildClawHubInstallFailure(
708755`ClawHub package "${params.detail.package?.name ?? "unknown"}" has no installable version.`,
709756CLAWHUB_INSTALL_ERROR_CODE.NO_INSTALLABLE_VERSION,
710757);
711758}
712-let versionDetail;
759+let artifactResponse;
713760try {
714-versionDetail = await fetchClawHubPackageVersion({
761+artifactResponse = await fetchClawHubPackageArtifact({
715762name: params.detail.package?.name ?? "",
716763version: requestedVersion,
717764baseUrl: params.baseUrl,
@@ -725,20 +772,47 @@ async function resolveCompatiblePackageVersion(params: {
725772version: requestedVersion,
726773});
727774}
728-const resolvedVersion = versionDetail.version?.version ?? requestedVersion;
775+const artifactVersion = readArtifactResolverVersion(artifactResponse, requestedVersion);
776+const resolvedVersion = normalizeOptionalString(artifactVersion.version) ?? requestedVersion;
729777if (params.detail.package?.family === "skill") {
730778return {
731779ok: true,
732780version: resolvedVersion,
733-compatibility:
734-versionDetail.version?.compatibility ?? params.detail.package?.compatibility ?? null,
781+compatibility: artifactVersion.compatibility ?? params.detail.package?.compatibility ?? null,
735782verification: null,
736-clawpack: versionDetail.version?.clawpack ?? null,
783+clawpack:
784+artifactVersion.clawpack ?? resolveTopLevelNpmPackArtifact(artifactResponse.artifact),
737785};
738786}
739-const clawpack = versionDetail.version
740- ? resolveClawHubNpmPackArtifact(versionDetail.version)
741- : null;
787+const versionDetail: ClawHubPackageVersion = {
788+package: artifactResponse.package
789+ ? {
790+name: artifactResponse.package.name ?? params.detail.package?.name ?? "",
791+displayName:
792+artifactResponse.package.displayName ?? params.detail.package?.displayName ?? "",
793+family:
794+artifactResponse.package.family === "code-plugin" ||
795+artifactResponse.package.family === "bundle-plugin" ||
796+artifactResponse.package.family === "skill"
797+ ? artifactResponse.package.family
798+ : (params.detail.package?.family ?? "code-plugin"),
799+}
800+ : null,
801+version: {
802+version: resolvedVersion,
803+createdAt: typeof artifactVersion.createdAt === "number" ? artifactVersion.createdAt : 0,
804+changelog: typeof artifactVersion.changelog === "string" ? artifactVersion.changelog : "",
805+distTags: artifactVersion.distTags,
806+files: artifactVersion.files,
807+sha256hash: artifactVersion.sha256hash,
808+compatibility: artifactVersion.compatibility,
809+artifact: artifactVersion.artifact,
810+clawpack: artifactVersion.clawpack ?? undefined,
811+},
812+};
813+const clawpack =
814+resolveClawHubNpmPackArtifact(versionDetail.version) ??
815+resolveTopLevelNpmPackArtifact(artifactResponse.artifact);
742816const verificationState = resolveClawHubArchiveVerification(
743817versionDetail,
744818params.detail.package?.name ?? "unknown",
@@ -757,12 +831,15 @@ async function resolveCompatiblePackageVersion(params: {
757831 clawpack,
758832};
759833}
834+const topLevelLegacyVerification = resolveTopLevelLegacyArchiveVerification(
835+artifactResponse.artifact,
836+);
760837return {
761838ok: true,
762839version: resolvedVersion,
763840compatibility:
764841versionDetail.version?.compatibility ?? params.detail.package?.compatibility ?? null,
765-verification: verificationState.verification,
842+verification: verificationState.verification ?? topLevelLegacyVerification,
766843 clawpack,
767844};
768845}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。