Tags give the ability to mark specific points in history as being important
-
v0.7.2
f5f9bc78 · ·essessey v0.7.2 — log scope from ctxscope Log scope now comes from github.com/psyb0t/ctxscope rather than github.com/psyb0t/common-go/scope. Same API, new package name, so the change is mechanical at every call site. This package's own exported surface is unchanged.
-
v0.7.1
1815ed1e · ·essessey v0.7.1 — imported-by badge, refreshed weekly CI only; the library is unchanged. The README gains a count of importing packages linking to the repositories behind it. Blast radius, not adoption: the number is what tells you how much breaks when an exported name moves. It reads 0 today, which is the licence to keep moving fast on the API — and the thing worth noticing when it changes.
-
v0.7.0
216f0081 · ·essessey v0.7.0 — ConversationID becomes StreamID Breaking. MessageMeta.ConversationID is now MessageMeta.StreamID, and its JSON tag moves from conversation_id to stream_id -- a wire change, so a client reading message_start must read the new key. ParsedStream.ConversationID is now ParsedStream.StreamID. SendMessageStart and SendStreamPreamble take streamID. Migration is mechanical: conversation_id to stream_id on the wire, .ConversationID to .StreamID in Go. Nothing in this library is chat-specific -- it streams content blocks for a conversation turn, a build log, a document render, a long-running job. Naming the identifier after one caller's domain made every other use read as a workaround. This also closes an incoherence from v0.6.0: EventStore keyed retention by streamID while the wire said conversation_id. EventStore now documents that they are the same value, that it is caller-minted and opaque, and that a reconnecting client supplies it -- so a resume needs the same authorization as opening the stream.
-
v0.6.1
c88f4e09 · ·essessey v0.6.1 — per-binding docs, error context Each binding now has a README written for someone who does not already know how this works, with runnable examples: sse (handler to bytes to parsing), nats (subject scheme, and the fact that event ids are not carried there), ws (the one-concurrent-writer rule). The sse README leads with the gap this package cannot close in code -- it does not set Content-Type: text/event-stream, and a browser fails the connection without it. The root README gained the read-side example it never had: Reassemble is half of what this library does and had no example anywhere. Ten call sites now wrap their errors with ctxerrors instead of returning them bare, and the root layout block finally lists store.go and multisink.go. No API change, no behaviour change.
-
v0.6.0
d4797466 · ·essessey v0.6.0 — retention and fan-out v0.5.0 gave clients a resume point via Event.ID; this gives a server what it needs to honour one. MultiSink fans one Emit to several sinks, so retention is just another destination rather than a wrapper type. It keeps going when one sink fails and returns the joined error -- a broken buffer must not cost the client its stream. EventStore retains recent events per stream and reports whether a resume point is KNOWN instead of guessing. That matters: replaying from the start duplicates what the client already saw, replaying from now silently drops the gap, and only the caller can decide which is acceptable. InMemoryEventStore is the bounded per-stream default -- ring buffer for order and eviction, id index for lookup. Replay reuses SliceSource and the ordinary Sink, so there is no second code path to drift from live.
-
v0.5.0
3ffdc82c · ·essessey v0.5.0 — SSE wire format as specified, plus event IDs The codec could not round-trip its own output: a payload containing a newline came back truncated at the first one, silently. Payloads are now framed as one data: field per line, which is how the format represents a multi-line value. Previously a blank line inside a payload forged a second event, and a newline in an event type let one Emit write several caller-chosen events. The parser now runs the format's state machine instead of matching the literal prefix 'data: '. The space after a colon is optional, so conformant producers that omit it used to yield nothing at all; multiple data: fields used to lose everything after the first; and typeless events were dropped as malformed. Adds Event.ID (emitted and parsed, omitempty because an empty id: RESETS the receiver's resume point), Source.LastEventID/Retry, FrameRetry and FrameComment. BREAKING: framing bytes change for multi-line payloads and for events carrying an ID, and Source delivers events the old parser silently discarded.
-
v0.4.2
7a0766f3 · ·essessey v0.4.2 — the missing CI workflows CI only. No code, no API, no behaviour change. This repo ran pipeline.yml alone, so it was never mirrored, never archived, and had no PR gate. Adds mirror-and-archive.yml (GitLab + Codeberg + Wayback), issue-pull.yml, and collaborators-only.yml, each on cron slots belonging to this repo rather than copied from a sibling.
-
v0.4.1
ab918f64 · ·essessey v0.4.1 — README voice Docs only. No code, no API, no behaviour change. The README now reads like the rest of the psyb0t libraries. Same facts, same structure, same hill it dies on: SSE is a format, not a transport.
-
v0.4.0
0217613b · ·essessey v0.4.0 — tracks elelem v0.4.0 No API change in this package. Adapter, Bind and the exported callbacks are unchanged, since elelemstream only registers callbacks and never launches. Breaking transitively: this pulls elelem v0.4.0, where Request.Complete, Request.Stream and Request.CompleteInto no longer exist. Complete -> Run, CompleteInto -> RunInto, Stream(ctx, fn) -> OnDelta(fn).Run(ctx). elelem's new WithStreaming(false) is transparent here — the same callbacks fire, so the blocks are identical and only their timing changes.
-
v0.3.0
af3d1e62 · ·essessey v0.3.0 — Bind composes with an app's own callbacks Requires elelem v0.3.0, whose On* setters now append rather than replace. An app can call Bind and then register its own OnRoundStart; both run. v0.2.0 documented that combination as a trap and told callers to route around it -- the fix landed upstream instead, so the trap is gone rather than documented. The exported callbacks remain, for placing a hook at an exact point relative to the Adapter's.
-
v0.2.0
48e3374d · ·essessey v0.2.0 — elelemstream callbacks exported elelem's On* setters replace rather than append, so Bind plus an app's own OnRoundStart silently unregistered the adapter and emitted nothing. The callbacks are now exported so an app can register its own hook and call the adapter's from inside it.
-
v0.1.1
8873d095 · ·essessey v0.1.1 — documentation Adds the core package doc (absent in v0.1.0, so pkg.go.dev showed a bare symbol list) and elelemstream/README.md, which documents the block-index arithmetic -- the layout for parallel tool calls, the invariants, and the failure mode where a result renders into the wrong card instead of erroring. Top-level README reworded in its own voice. No API or behaviour change.
-
v0.1.0
2c090321 · ·essessey v0.1.0 — one event model, many deliveries First release. One Event (a name plus a JSON payload) delivered over SSE, NATS or WebSocket, with the payload identical across all three. SSE is treated as a FORMAT rather than a transport peer: it frames because an HTTP body is an undelimited stream, while message-oriented bindings carry the payload unframed. Zero transport dependencies -- the NATS and WebSocket bindings take the minimal interface each needs from a caller-supplied client. elelemstream bridges elelem's callbacks to the block protocol, owning the block-index arithmetic, and is the only subpackage that imports elelem.