mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-29 06:28:23 +02:00
37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
import type { Skill, SkillSummary } from "@multica/core/types";
|
|
|
|
/**
|
|
* Discriminated view over `Skill.config.origin` — the JSONB blob the backend
|
|
* writes when a skill was imported from outside (local runtime, ClawHub,
|
|
* Skills.sh, GitHub). Manual creates have no origin, so we synthesize
|
|
* `{ type: "manual" }` for them to keep the consumer code uniform.
|
|
*/
|
|
export type OriginInfo = {
|
|
type: "runtime_local" | "clawhub" | "skills_sh" | "github" | "manual";
|
|
provider?: string;
|
|
runtime_id?: string;
|
|
source_path?: string;
|
|
source_url?: string;
|
|
};
|
|
|
|
export function readOrigin(skill: SkillSummary): OriginInfo {
|
|
const raw = (skill.config?.origin ?? null) as
|
|
| (OriginInfo & Record<string, unknown>)
|
|
| null;
|
|
if (raw?.type === "runtime_local") return raw;
|
|
if (raw?.type === "clawhub") return raw;
|
|
if (raw?.type === "skills_sh") return raw;
|
|
if (raw?.type === "github") return raw;
|
|
return { type: "manual" };
|
|
}
|
|
|
|
/**
|
|
* SKILL.md is always present plus any additional attached files. Accepts a
|
|
* `SkillSummary` because list endpoints don't return the `files` array — in
|
|
* that case we only know the body exists, so the count falls back to 1.
|
|
*/
|
|
export function totalFileCount(skill: Skill | SkillSummary): number {
|
|
const files = (skill as Skill).files;
|
|
return (files?.length ?? 0) + 1;
|
|
}
|