You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.