Skip to content

Storage + OpenDisk on by default, crawl.fetch, /v1/videos, honest plugins page; v0.2.67 - #141

Merged
ralyodio merged 3 commits into
masterfrom
feat/plugins-storage-opendisk-crawl
Nov 8, 2026
Merged

ralyodio merged 3 commits into
masterfrom
feat/plugins-storage-opendisk-crawl

Conversation

@ralyodio

@ralyodio ralyodio commented Nov 8, 2026

Copy link
Copy Markdown
Collaborator

Why

An audit of c0mpute.com/plugins found 13 of 25 plugins were manifests with no code, 6 of 7 advertised plugin install commands 404'd, "installed by default" was printed for anything in-process, and several real plugins were only partly usable.

What

Plugins page: status (available / partial / coming-soon) + status_note + explicit builtin in every manifest. Coming-soon cards get a badge, no install command, no cli: line. Install commands only where an install.sh exists. WebMCP install tool reads the live listing.

Storage, on by default, peer to peer

  • Every storage node's gateway now serves the CIP-002 storage API (reads open; writes ed25519-signed by the node's own key or storage.trusted_writers; anonymous PUT -> 401) and /.well-known/opendisk.json (OpenDisk 0.1: identity key, live free/total, price/GiB-month).
  • A node with a public https gateway.announce lists itself on d1sks at start and daily. No central registry; private mode and storage.opendisk = false opt out.
  • Capability ads carry the storage offer; /api/nodes shows it (sanitized). Docs: docs/storage-opendisk.md.

New: crawl.fetch (default role): static, robots.txt-aware page fetch on the SSRF-guarded workflow.step HTTP client. Jobs bridge accepts it; c0mpute crawl fetch <url>.

Partials

  • transcode: default role when ffmpeg is on PATH (live network had 0 transcode workers).
  • video: POST /v1/videos on the buyer gateway (txt2vid; img2vid via image_base64), video-length deadlines, mp4 check.
  • result fetch from NAT'd workers: complements feat(net): workers dial the buyer back to deliver results (C0MPUTE_P2P_LISTEN/EXTERNAL); v0.2.66 #140; when the buyer advertises no buyer_addrs, the worker dials it by peer id before the receipt.
  • buyer bridges (speech serve, jobs serve, one-shot submits) now use their own identity under <data_dir>/buyer. Reusing the worker's key on a box that also runs a worker made every auction fail with NoPeersSubscribedToTopic (reproduced live on dev2).

Verified

  • cargo build --workspace --all-targets --locked + cargo test --workspace --no-fail-fast (isolated network): all green, incl. 10 new tests (crawl robots/spec/SSRF, opendisk capacity/descriptor/origin, storage offer sanitizer).
  • Ran the built node: /.well-known/opendisk.json validated by the live d1sks validator (ok: true, 0 errors, 0 warnings); /storage/v1/status up; anonymous PUT 401.
  • web: tsc --noEmit clean, 12/12 tests, next build ok.

Next PR: hosting plugin (>=3 self-healing replicas, replica map gossiped, proxies on gateway nodes for Moshpit domains, fully p2p).

🤖 Generated with Claude Code

ralyodio and others added 3 commits November 8, 2026 17:29
…t labels

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…buyer route; NAT result fetch fix

Storage (on by default, peer to peer):
- Every node with the storage role now serves the CIP-002 storage API on its
  gateway (reads open, writes ed25519-signed by the node's own key or
  storage.trusted_writers) plus /.well-known/opendisk.json (OpenDisk 0.1:
  identity key, live free/total space, price per GiB-month).
- A node whose gateway announces a public https origin lists itself on d1sks
  at start and daily. Private-mode nodes and storage.opendisk=false opt out.
- Capability ads carry the storage offer; /api/nodes shows it (sanitized).

New: crawl.fetch workload (default role): static, robots.txt-aware,
SSRF-guarded page fetch on the workflow.step HTTP client; jobs bridge accepts
it; `c0mpute crawl fetch <url>`.

Partials fixed:
- transcode is a default role when ffmpeg is on PATH (was 0 workers).
- video: POST /v1/videos on the buyer gateway (txt2vid, img2vid via
  image_base64), long deadlines, mp4 validation.
- diffusion/any result fetch from a NAT'd worker: the worker dials the buyer
  before publishing its receipt, so the fetch rides that connection.
- buyer bridges (speech/jobs serve, one-shot submits) use their own identity
  under <data_dir>/buyer instead of the worker's key, which made auctions fail
  with NoPeersSubscribedToTopic on any box that also runs a worker.

Web: plugins page marks unbuilt plugins coming soon, partial ones partial,
only real installers get install commands; WebMCP install tool reads the
live listing. docs/storage-opendisk.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ships storage+OpenDisk on by default, crawl.fetch, /v1/videos, transcode default with ffmpeg, separate buyer identity, honest plugins page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 8, 2026

Copy link
Copy Markdown

ThreatCrush Security Scan

12 finding(s)

HIGH/CRITICAL: 1 | MEDIUM: 8 | LOW: 3

Severity Rule Location
HIGH js-ssrf-outbound-request apps/web/public/sw.js:24
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:53
MEDIUM js-unescaped-html-sink apps/web/src/app/layout.tsx:80
MEDIUM sh-remote-script-execution scripts/dev-setup.sh:25
MEDIUM sh-eval-expansion scripts/dev-setup.sh:35
MEDIUM sh-remote-script-execution scripts/install.sh:173
MEDIUM sh-remote-script-execution scripts/install.sh:198
MEDIUM sh-remote-script-execution scripts/install.sh:316
MEDIUM sh-remote-script-execution scripts/install.sh:354
LOW py-ssrf-outbound-request examples/business-strategist-agent/chat.py:37
LOW py-ssrf-outbound-request examples/business-strategist-agent/train.py:54
LOW secret-generic-credential node/crates/c0mpute-core/src/webhook.rs:1165

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit d148bfc into master Nov 8, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant