Skip to content

v0.0.4

Choose a tag to compare

@mococa mococa released this 10 Sep 02:14
· 14 commits to main since this release

Added

  • Pluggable logging — Pipeflow accepts logger (implements Logger interface) or verbose: true shorthands. Ships ConsoleLogger and SilentLogger. The logger propagates through Conversations, Conversation, Orchestrator, and CoordinationRunner, logging creation, starts, stops, generation status, errors, and key lifecycle events. Exported from @moureau/pipeflow.
  • Server transport abstraction — ServerAdapter/ServerClient interfaces let any runtime (Bun, Node ws, socket.io) bridge Conversation events to remote clients. Exported from @moureau/pipeflow/transport.
  • Per-conversation LLM abort isolation — LLMRequest.signal allows each orchestrator to abort its own generation without affecting other conversations sharing the same LLM instance. onInterrupt() and stop() now use this per-conversation AbortController instead of calling llm.stop() (which previously aborted all streams on that LLM instance, regardless of which conversation owned them).
  • Event-driven whenIdle() — replaced busy-wait polling with a promise-based notification, eliminating CPU spin during test idle detection.
  • Conversation listing with filters — pipeflow.conversations.list() accepts userId, status, archived, orderBy, orderDir, page, and pageSize filters. Returns { conversations, total } for paginated UIs. Excludes archived conversations by default.
  • Conversation archiving — pipeflow.conversations.archive(id) soft-deletes by setting archivedAt. Archived conversations are hidden from list() but still retrievable via get(). Filter with list({ archived: true }).
  • createdBy field — conversations can be tagged with the creating user's id. Filtered via list({ userId }).
  • Client generation-complete and text-delta events — PipeflowClient now dispatches generation-complete and text-delta events, letting the server decide whether to forward streaming text deltas to clients.

Fixed

  • Cross-conversation interrupt contamination — interrupting one conversation no longer cancels generations in other conversations sharing the same LLM instance. Previously onInterrupt called llm.stop() which aborted every in-flight stream on that LLM instance. Now each orchestrator owns its own AbortController which only aborts its own streams.
  • Silent persistence errors — .catch(() => {}) replaced with .catch((err) => logger.error(...)) on generation timing writes, so failures surface in logs instead of being silently swallowed.

Changed

  • Removed busy-wait loop — Orchestrator.whenIdle() now uses a microtask check + promise resolve instead of while(…) { Bun.sleep(1) }, eliminating CPU pegging.
  • tsconfig.json excludes dist/ — prevents stale build artifacts from polluting typecheck.