v0.2.0
codeoid v0.2.0 — the package family release
codeoid is no longer one npm package: the wire protocol and the client core now ship standalone — @codeoid/protocol and @codeoid/core — one source of truth shared by the daemon, the web UI, and the mobile client that's next. On top of that: a hardened wire protocol, two security fixes, and a substantial performance pass.
Highlights
@codeoid/protocol— typed client↔daemon contract (messages, scopes, published input limits) with optional runtime-validation schemas (@codeoid/protocol/schemas) (#101, #102, #105)@codeoid/core— framework-agnostic client core: reconnecting WebSocket transport, transcript store semantics, resume cursors, display helpers — build a codeoid frontend without re-implementing the hard parts (#115)- Long tasks no longer get killed — the 300s stall watchdog paused during tool execution and pending approvals, so multi-minute research/exploration runs survive (#104)
- Cheap reconnects — incremental resume replays only what changed since your cursor, not the whole scrollback (#103)
- One prompt, one bill — send idempotency dedupes ambiguous-delivery retries (#103)
Security
- Untrusted model/tool output sanitized before dangerous sinks (terminal output, markdown link/image URLs) (#91)
- Cross-tenant memory disclosure fixed — workspace ids are now tenant-scoped (#93)
Protocol & reliability
- Typed auth handshake with bidirectional capability negotiation (#102)
- All inbound frames schema-validated; oversized prompts rejected as a token-bill safety net (#102)
- Large-session scrollback replays chunked + drain-paced — no more backpressure lockouts on attach (#84, #100)
- Client core hardening: auth-handshake deadline, connect-join semantics, duplicate-request-id guard, subscriber-fault isolation (#115)
Performance
- Daemon event loop unblocked on status flips, workspace probes, and
fs.list(#95) · transcripts bounded with rotation + tail-load (#96) - Memory recall: vector cache appended not cleared (#94); clustering single-flight with yielding k-means (#97)
- Web streaming: no full markdown re-parse per delta (#98); O(1) reducer lookups (#99)
Models
- Live model catalog persisted across restarts, provider-agnostic — no more stale hardcoded picker (#78, #79)
Full changelog: v0.1.3...v0.2.0 · Detailed entries in CHANGELOG.md
What's Changed
- fix: refresh stale fallback model catalog to current Claude models by @saucam in #78
- feat: persist the live model catalog so restarts serve current models by @saucam in #79
- fix: sanitize untrusted terminal output and markdown link/image URLs by @saucam in #91
- fix: tenant-scope memory workspace ids so co-located accounts can't cross-read by @saucam in #93
- fix: append to the vector cache on embed instead of clearing it by @saucam in #94
- fix: stop blocking the daemon event loop on status flips, workspace-id probes, and fs.list by @saucam in #95
- fix: bound transcript growth and resume cost — rotation, streaming tail load, output cap by @saucam in #96
- fix: share clustering per workspace — single-flight, lean hydration, yielding k-means by @saucam in #97
- fix: stop re-parsing the whole markdown message on every streaming delta by @saucam in #98
- fix: O(1) positional lookup in the web streaming reducers by @saucam in #99
- fix: chunk large scrollback replays to avoid WS backpressure lockout (#84) by @saucam in #100
- feat: extract @codeoid/protocol workspace package (P0) by @saucam in #101
- feat: typed auth handshake, capability negotiation, inbound validation (protocol P0, 1/2) by @saucam in #102
- fix: stall watchdog no longer kills long-running tools by @saucam in #104
- feat: seq-based incremental resume + send idempotency (protocol P0, 2/2) by @saucam in #103
- feat: web consumes @codeoid/protocol — retire the hand-maintained mirror by @saucam in #105
- feat: extract @codeoid/core — framework-agnostic client core (P0, final) by @saucam in #115
- chore: release v0.2.0 by @saucam in #116
- fix: complete the 0.2.0 changelog — security, performance, model catalog by @saucam in #117
Full Changelog: v0.1.3...v0.2.0