Tags

Tags give the ability to mark specific points in history as being important
  • v0.7.2

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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.