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}
+