Web serving. Files, directories, adapter documentation and the changelog are
reachable at node-prefixed addresses on the local server, and an address that
names another machine in the subnet is answered by the machine that owns it.
Messages can carry attachments the receiver pulls on demand, every message
gets a short ID to show or reply to, and a machine with no spt on it can be
handed the binary over the local network. The XFER access surface is retired.
Added
spt serve add,spt serve rm, andspt serve list --jsonmanage live file
and directory references. Same-name registrations receive stable numbered
suffixes; removing an entry never deletes its source. Only the same absolute
path and kind may reclaim a retired name.- Every registered adapter gets a core-owned
web/output directory.
[adapter].web_short_pathoptionally gives it a short URL alias. Removing
an adapter stops serving its output without deleting the files. spt adapter addnames each manifest key it does not know on stderr
(manifest: unknown key [<table>].<key> (ignored)) and still registers;
a misspelled optional key is no longer visible only by its absence.
WEBjoins the access-control vocabulary. It is open by default within the
subnet, but explicit WEB denies still govern. Existing file transfer is
unchanged.
- A served resource's URL now works from every machine in the subnet: a
request for/<peer>/…on the local loopback server is answered by the
owning node through the local daemon. The body streams and nothing is
cached;HEADandRangerequests are honored by the owner. An owner
that refuses answers 403 namingWEB; an owner that cannot be reached
answers 502 naming the node, within a bounded time. spt send --attachment <path>sends a file with a message. The file's bytes
are captured as they are at send time, so later edits or a deletion do not
change what arrives, and the receiver pulls them withspt fetchwhen it
wants them.--ttlsets how long an attachment stays available (default 30
days, a unit is required); expired attachments answer 404 immediately.- Every message now carries a short ID.
spt msg show <id>prints a message by
it, andspt send --reply-to <id>marks what a message answers. Messages
from another machine resolve through the machine that holds them. spt serve lan --bootstraphands the spt binary to a machine that is not yet
a node, over the local network on port 5470. It is off by default and off
again after every daemon restart, serves only the binary, its release sidecar
and an install command, and refuses to start by name when the applied update
set is not signed or does not match. It prints a checksum per platform, and
spt installgains--expect-sha256and--release-jsonso what was
downloaded can be compared before it is run. The documentation port is
untouched and stays on loopback.[adapter].docs_dirpublishes an adapter's own documentation at thedocs
segment of its address, beside the adapter's output directory rather than in
place of it. A missing key, an unreadable manifest, a path that escapes the
adapter's directory, and a directory that has since been removed all answer
the same 404 naming what was asked for.- The changelog is now one of the pages the local documentation server offers.
- A harness is told when a message it receives refers to a file the reader
cannot open — an attachment to pull, or a path that belongs to another
machine — instead of leaving the reader to discover it. For a path on
another machine, that machine can be asked to publish it and answers with a
link; it honors such a request only for its own endpoints, so no third
machine can have someone else's file exposed.
Changed
- The loopback HTTP server now has a node-prefixed resource index with HTML
and?jsonviews./redirects to/<node>/; canonical docs URLs live at
/<node>/docs/, while existing bare docs paths remain compatibility aliases.
Removed
- The
XFERaccess surface is retired: attachments replaced the transfer it
gated, so the entry leaves the access-control vocabulary along with the
transfer itself. An existing rule that namesXFERis kept and reported at
load rather than dropped silently; it no longer governs anything. The shell
channel's own transfer progress is unaffected.
Fixed
- Messages delivered by
spt api listennow reach the receiver's incoming-message
history and last-message state, for both queued backlog and live TCP delivery.
A later hook poll does not record those deliveries again; filtered notifications
are not recorded as delivered messages. - A node's message and activity history reads back correctly once its log grows
past a quarter of a megabyte. Positions no longer restart from the beginning,
so a request for everything since a given point no longer comes back empty or
repeats entries that were already seen, and an oversized position is answered
with the current head instead of skipping a page. - An agent's own saved context is no longer overwritten, unread, by the
automatic summary that follows it. The automatic summary is filed directly
and never writes to the file an agent saves its own context to. spt api bindno longer prints an engine-room probe line on a machine that
has no engine room.