link: fork spl/home into think/link + apps/link convey surface
Scaffolding chunks 1-4 of the spl-solstone integration (vpe req_xhoetsh6).
Complete fork from github.com/solpbc/spl home/ — no pip dep, no submodule,
no sync. Two projects are fully independent from here.
- think/link/: tunnel service (service.py, relay_client.py, wsgi_bridge.py,
ca.py, auth.py, nonces.py, mux.py, framing.py, tls_adapter.py, paths.py).
pair_server.py dropped — pair runs through convey's existing listener.
CA has no passphrase layer per spec (journal/link/ca/private.pem mode 0600).
Added last_seen_at column + touch_last_seen() on AuthorizedClients.
WSGI bridge pipes tunnel bytes to convey's real Flask app.
- apps/link/: dashboard (workspace.html), Flask routes (/pair-start,
/pair, /unpair, /api/devices, /api/status), Typer CLI (pair/list/
unpair/status). All spec literal-copy strings landed verbatim.
- supervisor: link service launches alongside cortex (--no-link opt-out).
- sol.py: 'sol link' command + GROUPS entry.
- pyproject.toml: pyOpenSSL + websockets deps.
- tests/link/test_framing.py: 17 tests ported from spl-repo (all green).
Privacy invariant: no payload bytes in logs. Rendezvous-only (method,
path, status, byte counts, tunnel_id, stream_id). Callosum tract 'link'
emits enrolled/connecting/connected/disconnect/tunnel_pair/tunnel_close/
last_seen.
Remaining chunks (ca/auth/mux/nonces/wsgi unit tests; in-tree test
client; end-to-end integration test; blindness grep; spl-repo
cross-reference PR) delegated to a continuation hopper lode.
Full solstone suite: 3498 tests passing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This is a binary file and will not be displayed.