@novoagents/react
v0.3.0-alpha.74
Published
Browser-safe React hooks for Novo Agents streams and interactions.
Readme
@novoagents/react
Developer access is currently closed. Novo Agents powers the agents in Novo North. This package is maintained for approved integrations; installing it does not grant service access.
Headless React bindings for the canonical browser run controller in
novoagents/browser. The package renders nothing, ships no CSS, and never
accepts a Novo API key. Browser requests go only to your authenticated proxy
routes.
npm install novoagents @novoagents/react'use client';
import { useNovoInteractions, useNovoRun } from '@novoagents/react';
import {
createHttpInteractionResolveTransport,
createNovoHttpRunSource,
createNovoRunController,
} from 'novoagents/browser';
export function RunView({ runId }: { runId: string }) {
const run = useNovoRun({
runKey: runId,
createController: () =>
createNovoRunController({
source: createNovoHttpRunSource({
url: `/api/runs/${runId}/stream`,
pollUrl: `/api/runs/${runId}`,
}),
interactions: createHttpInteractionResolveTransport({
endpoint: `/api/runs/${runId}/interactions/resolve`,
}),
}),
});
const inbox = useNovoInteractions(run.controller);
return <main>{run.status} · {run.messages.length} messages · {inbox.interactions.length} pending</main>;
}useNovoRun creates its controller inside an effect, owns it for one runKey,
and stops/disposes it on replacement or unmount. useNovoRunSelector provides
concurrent-safe selected subscriptions. useNovoInteractions binds the
controller's interactions.pending queue and resolution primitive.
If your host persists interaction requests independently of the stream,
configure interactionDiscovery: { list, intervalMs? } on the controller.
Discovery is generation-fenced, runs while the SSE connection is idle, and
reconciles DB-only requests into the same canonical pending queue.
Questions stay in the pending queue across run terminals and new runs. An explicit Stop cancels them. They do not change the run status or require a paused controller to resolve. Approvals pause execution until resolved. Use a thread-follow source and controller for this ongoing conversation, and scope discovery to the thread so questions from older runs remain available. The example above follows one finite run only.
