Nao.Runtime.Orleans Namespace
| Type/Module | Description |
|
Metadata about a persisted conversation |
|
File-based conversation store.
Layout:
{baseDir}/
{sessionDir}/
conversations.json — index: every conversation's metadata
conversations/
{conversationId}/
messages.json — the full message history (JSON array)
meta.json — conversation-level metadata
A conversation's id is its (possibly hierarchical) name flattened to a single safe
folder name, so sub-agent delegations — named "parent/child-turn-n" — each get their
own folder listed in the index rather than nesting physically. The full name is kept in
each meta's `ConversationName`.
{baseDir} is the shared `sessions/` root and paths resolve through `SessionPaths.sessionDir`,
so a session's conversations nest alongside its tasks, files, observability and feedback
under one folder, and a task-spawned sub-session's conversations nest beneath that task.
|
|
File-based task store.
Layout:
{baseDir}/
{sessionDir}/
tasks.json — index: all task records, ordered by Sequence
tasks/
{taskId}/
meta.json — one task's full record
sessions/ — the sub-session(s) this task spawned (written by their grains)
{baseDir} is the shared `sessions/` root. Paths resolve through `SessionPaths.sessionDir`
so a task's metadata and the sub-session it starts nest together under tasks/
|
|
|
Pluggable interface for external conversation persistence. Implementations can store to files, databases, or cloud storage. All methods are organized by session ID for grouping. |
|
|
Pluggable store for externalized task state, grouped by parent session key. |
|
|
Registry that manages multiple workspaces within a single silo. Customers register workspaces at silo startup or dynamically at runtime. Grains resolve workspace definitions by key on each request. |
|
|
A single persisted message in a conversation |
|
|
Tee conversation store: every WRITE is persisted to the wrapped backing store (so history reads stay correct) and ALSO published to the bus as a `ConversationCaptured` event, so the transcript stream flows through the same event pipeline as feedback and observability. The producer (the `SessionGrain`) keeps depending only on `IConversationStore`; swapping the backing store for a database/cloud implementation needs no producer change, and any subscriber can persist or forward the events independently. |
|
Single source of truth for mapping a session grain key to its on-disk directory.
A session key is a '/'-separated path:
"userId/sessionId" → a primary (top-level) session
"userId/sessionId/taskId" → the sub-session a task spawned
"userId/sessionId/taskId/taskId2" → a sub-session of that sub-session (recursive)
The first two segments name the primary session folder ("userId_sessionId"). Every
further segment is a task id, so its sub-session nests beneath the task that started it:
sessions/userId_sessionId/tasks/
|
|
|
On-disk, grain-independent record of an async task. This is the externalized copy of a task's authoritative state, written by the owning task grain so the full task history is readable straight from the filesystem (for tracking/debugging) without activating a grain. |
|
|
A single step in the process an agent ran to produce a turn's answer (a tool invocation or a sub-agent delegation). Surfaced to the frontend so the whole process — not just the final answer — is visible. |
|
|
|
|
|
Identifies a loaded workspace |
|
|
|
|
|
In-memory workspace registry backed by a concurrent dictionary. Designed to be registered as a singleton in the Orleans DI container. |
Nao