diff --git a/Cargo.lock b/Cargo.lock index 91265a8b..84cdfc4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -478,7 +478,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "c0mpute-api" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "c0mpute-proto", @@ -493,7 +493,7 @@ dependencies = [ [[package]] name = "c0mpute-bench" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "blake3", @@ -504,7 +504,7 @@ dependencies = [ [[package]] name = "c0mpute-cli" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "axum", @@ -534,7 +534,7 @@ dependencies = [ [[package]] name = "c0mpute-core" -version = "0.2.66" +version = "0.2.67" dependencies = [ "aes-gcm", "anyhow", @@ -578,7 +578,7 @@ dependencies = [ [[package]] name = "c0mpute-doctor" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "serde", @@ -590,7 +590,7 @@ dependencies = [ [[package]] name = "c0mpute-envelope" -version = "0.2.66" +version = "0.2.67" dependencies = [ "blake3", "bs58", @@ -603,7 +603,7 @@ dependencies = [ [[package]] name = "c0mpute-gateway" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "axum", @@ -625,7 +625,7 @@ dependencies = [ [[package]] name = "c0mpute-market" -version = "0.2.66" +version = "0.2.67" dependencies = [ "c0mpute-envelope", "serde", @@ -635,7 +635,7 @@ dependencies = [ [[package]] name = "c0mpute-net" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "async-trait", @@ -652,7 +652,7 @@ dependencies = [ [[package]] name = "c0mpute-placement" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "async-trait", @@ -673,7 +673,7 @@ dependencies = [ [[package]] name = "c0mpute-proto" -version = "0.2.66" +version = "0.2.67" dependencies = [ "blake3", "hex", @@ -685,7 +685,7 @@ dependencies = [ [[package]] name = "c0mpute-secure-chat" -version = "0.2.66" +version = "0.2.67" dependencies = [ "aes-gcm", "anyhow", @@ -708,7 +708,7 @@ dependencies = [ [[package]] name = "c0mpute-store" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "blake3", @@ -726,7 +726,7 @@ dependencies = [ [[package]] name = "c0mpute-transcode" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "c0mpute-proto", @@ -739,7 +739,7 @@ dependencies = [ [[package]] name = "c0mpute-update" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "hex", @@ -753,7 +753,7 @@ dependencies = [ [[package]] name = "c0mpute-verify" -version = "0.2.66" +version = "0.2.67" dependencies = [ "anyhow", "blake3", diff --git a/Cargo.toml b/Cargo.toml index f39beda4..6e39d486 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.2.66" +version = "0.2.67" edition = "2024" license = "MIT" repository = "https://github.com/profullstack/c0mpute" diff --git a/apps/tui/package.json b/apps/tui/package.json index 0ed320ba..267c28d3 100644 --- a/apps/tui/package.json +++ b/apps/tui/package.json @@ -1,6 +1,6 @@ { "name": "@c0mpute/tui", - "version": "0.2.66", + "version": "0.2.67", "private": true, "type": "module", "bin": { diff --git a/apps/web/package.json b/apps/web/package.json index 4f0e2948..357ebc88 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "c0mpute", - "version": "0.2.66", + "version": "0.2.67", "private": true, "type": "module", "scripts": { diff --git a/apps/web/src/app/api/plugins/route.ts b/apps/web/src/app/api/plugins/route.ts index cf89594b..f3c7073d 100644 --- a/apps/web/src/app/api/plugins/route.ts +++ b/apps/web/src/app/api/plugins/route.ts @@ -12,6 +12,7 @@ import { loadAllPlugins, tagline, installCommand, + installedByDefault, modelOptions, } from "@/lib/plugins"; @@ -20,19 +21,30 @@ export function GET() { // Omitted rather than sent as [] for the plugins that have no model to // choose, which is most of them. const models = modelOptions(p).map(({ id, model }) => ({ id, ...model })); + const install = installCommand(p); return { id: p.id, name: p.name, version: p.version, kind: p.kind, + // available | partial | coming-soon. A coming-soon plugin is a spec + // with no implementation behind it yet. + status: p.status, + status_note: p.statusNote, + builtin: p.builtin, + installed_by_default: installedByDefault(p), tagline: tagline(p), description: p.description, keywords: p.keywords ?? [], homepage: p.homepage, source: p.source, - install_command: installCommand(p), - install_url: `https://c0mpute.com/plugins/${p.id}/install.sh`, + // null when there is nothing to install: built in, coming soon, or no + // install.sh in the repo. + install_command: install, + install_url: install + ? `https://c0mpute.com/plugins/${p.id}/install.sh` + : null, web: `https://c0mpute.com/plugins/${p.id}`, models: models.length > 0 ? models : undefined, }; diff --git a/apps/web/src/app/plugins/page.tsx b/apps/web/src/app/plugins/page.tsx index 1bacaa1d..07369c32 100644 --- a/apps/web/src/app/plugins/page.tsx +++ b/apps/web/src/app/plugins/page.tsx @@ -6,6 +6,7 @@ import { byCategory, tagline, installCommand, + installedByDefault, modelOptions, CATEGORY_LABELS, CATEGORY_BLURBS, @@ -16,7 +17,7 @@ import { export const metadata = { title: "plugins — c0mpute", description: - "c0mpute workload plugins, network services and applications: AI inference, embeddings, image and video generation, speech and OCR; transcoding, rendering and streaming; crawling, storage and hosting. MIT-licensed, manifest-driven.", + "c0mpute workload plugins, network services and applications: AI inference, image and video generation, speech, transcoding, web fetching, workflow steps, webhooks and OpenDisk storage, with more marked coming soon. MIT-licensed, manifest-driven.", alternates: { canonical: "https://c0mpute.com/plugins" }, }; @@ -64,6 +65,12 @@ export default function PluginsPage() { is a product built on{" "} c0mpute — useful, and not something the protocol depends on.

+

+ runs today with a caveat noted on the + card.{" "} + is a published spec with no + implementation yet — nothing to install or run. +

{groups.map(({ category, plugins }) => ( @@ -74,6 +81,8 @@ export default function PluginsPage() { {" "} · {plugins.length} + {comingSoonCount(plugins) > 0 && + ` (${comingSoonCount(plugins)} coming soon)`}

@@ -119,6 +128,10 @@ function kindLabel(p: PluginManifest): string { return p.category === "applications" ? "application" : "service"; } +function comingSoonCount(plugins: PluginManifest[]): number { + return plugins.filter((p) => p.status === "coming-soon").length; +} + function Badge({ label }: { label: string }) { return ( @@ -134,15 +147,27 @@ function PluginCard({ p }: { p: PluginManifest }) { : p.dispatch?.mode === "container" ? "container" : "subprocess"; + const comingSoon = p.status === "coming-soon"; + const install = installCommand(p); return ( -

+

[ {p.id} ]{" "} {p.name} + {p.status !== "available" && ( + <> + {" "} + + + + + )}

v{p.version} · {kindLabel(p)} · {dispatchLabel} @@ -161,14 +186,24 @@ function PluginCard({ p }: { p: PluginManifest }) { - {p.dispatch?.mode === "in-process" ? ( -

ships with c0mpute · installed by default

- ) : ( - {`$ ${installCommand(p)}`} + {p.status === "partial" && p.statusNote && ( +

+ partial: {p.statusNote} +

)} + {comingSoon ? ( +

+ coming soon · spec only, not yet implemented +

+ ) : installedByDefault(p) ? ( +

ships with c0mpute · installed by default

+ ) : install ? ( + {`$ ${install}`} + ) : null} +