platform

package
v0.9.27 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 28, 2026 License: Apache-2.0 Imports: 21 Imported by: 0

Documentation

Overview

Package platform provides real implementations of SDK interfaces for the Roobai runtime environment.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func InjectIdentity

func InjectIdentity(req *http.Request, appName, traceID string)

InjectIdentity sets identity headers on an outgoing HTTP request. If traceID is non-empty (propagated from incoming request), it is reused to maintain a single trace across the full mesh call chain. The request is signed with the app's Ed25519 private key.

func NewLLMClient

func NewLLMClient(cfg Config) sdk.LLMClient

NewLLMClient creates an LLM client configured from environment variables.

func NewPersistentSimpleMemory

func NewPersistentSimpleMemory(app core.App, sessionID string) sdk.Memory

NewPersistentSimpleMemory creates a PocketBase-backed memory store.

func NewPersistentSummaryBufferMemory

func NewPersistentSummaryBufferMemory(app core.App, llm sdk.LLMClient, sessionID string, config sdk.SummaryBufferConfig) sdk.SummaryMemory

NewPersistentSummaryBufferMemory creates a PocketBase-backed summary buffer memory.

func NewPersistentWindowMemory

func NewPersistentWindowMemory(app core.App, sessionID string, windowSize int) sdk.Memory

NewPersistentWindowMemory creates a PocketBase-backed windowed memory.

func NewSDK

func NewSDK(pctx sdk.PlatformContext) sdk.SDK

NewSDK creates an SDK implementation for the given platform context.

func NewSimpleMemory

func NewSimpleMemory() sdk.Memory

NewSimpleMemory creates a new in-memory message store.

func NewSummaryBufferMemory

func NewSummaryBufferMemory(llm sdk.LLMClient, config sdk.SummaryBufferConfig) sdk.SummaryMemory

NewSummaryBufferMemory creates a new summary buffer memory.

func NewTaskContext added in v0.3.0

func NewTaskContext(task sdk.Task, store *TaskStore, eventBus *EventBus, budget *sdk.TaskBudget, delegationCallbacks sdk.LoopCallbacks) *taskContext

NewTaskContext creates a TaskContext for the given task. eventBus may be nil (events are skipped gracefully). delegationCallbacks may be nil (no external observer).

func NewWindowMemory

func NewWindowMemory(windowSize int) sdk.Memory

NewWindowMemory creates a new windowed memory store.

func RunLoop

func RunLoop(ctx context.Context, pctx sdk.PlatformContext, config sdk.LoopConfig, userPrompt string) (sdk.LoopResult, error)

RunLoop executes an agentic tool-use loop using structured output.

Types

type AgentRouter

type AgentRouter struct {
	// contains filtered or unexported fields
}

AgentRouter implements sdk.AgentRouter using NATS for RPC, discovery, and delegation. HTTP is only used as a last-resort fallback for task control (RespondToTask, CancelTask) when NATS is unavailable.

func NewAgentRouter

func NewAgentRouter(cfg Config) *AgentRouter

NewAgentRouter creates a new agent router.

func (*AgentRouter) Call

func (r *AgentRouter) Call(ctx context.Context, query string, content string, opts ...sdk.CallOption) (sdk.Response, error)

Call invokes another agent by capability or name.

func (*AgentRouter) CallAgent

func (r *AgentRouter) CallAgent(ctx context.Context, agentName string, msg sdk.Message) (sdk.Response, error)

CallAgent invokes a specific agent by name.

func (*AgentRouter) CallTool

func (r *AgentRouter) CallTool(ctx context.Context, toolID string, args map[string]any) (sdk.Response, error)

CallTool invokes a specific tool by its ID (format: "agent_name/action_name").

func (*AgentRouter) CallWithTrace

func (r *AgentRouter) CallWithTrace(ctx context.Context, query string, content string, opts ...sdk.CallOption) (sdk.CallResult, error)

CallWithTrace invokes an agent and returns detailed call metadata.

func (*AgentRouter) CancelTask added in v0.3.0

func (r *AgentRouter) CancelTask(ctx context.Context, taskID string) error

CancelTask requests cancellation of a running task.

func (*AgentRouter) Delegate added in v0.3.0

func (r *AgentRouter) Delegate(ctx context.Context, req sdk.DelegateRequest) (*sdk.Task, error)

Delegate submits a task to the best matching agent (async).

func (*AgentRouter) DelegateSync added in v0.3.0

func (r *AgentRouter) DelegateSync(ctx context.Context, req sdk.DelegateRequest) (*sdk.Task, error)

DelegateSync submits a task and blocks until completion.

func (*AgentRouter) DelegateToAgent added in v0.3.0

func (r *AgentRouter) DelegateToAgent(ctx context.Context, agentName string, req sdk.DelegateRequest) (*sdk.Task, error)

DelegateToAgent submits a task to a specific agent by name.

func (*AgentRouter) DelegateToAgentStream added in v0.3.0

func (r *AgentRouter) DelegateToAgentStream(ctx context.Context, agentName string, req sdk.DelegateRequest, handler sdk.DelegateEventHandler) (*sdk.Task, error)

DelegateToAgentStream submits a task to a specific agent and streams intermediate events back via the handler. The caller subscribes directly to NATS task events (no SSE proxy needed).

func (*AgentRouter) Discover

func (r *AgentRouter) Discover(ctx context.Context, query string, opts ...sdk.DiscoverOption) ([]sdk.AgentInfo, error)

Discover finds agents matching a capability query.

func (*AgentRouter) ReportToolFeedback added in v0.6.0

func (r *AgentRouter) ReportToolFeedback(ctx context.Context, toolID string, outcome string)

ReportToolFeedback sends a tool usage feedback signal (fire-and-forget).

func (*AgentRouter) RespondToTask added in v0.3.0

func (r *AgentRouter) RespondToTask(ctx context.Context, taskID string, input []sdk.Part) error

RespondToTask sends additional input to a task in "input_needed" state.

func (*AgentRouter) Search

func (r *AgentRouter) Search(ctx context.Context, query string, opts ...sdk.DiscoverOption) ([]sdk.AgentMatch, error)

Search performs semantic search to find agents matching a natural language query.

func (*AgentRouter) SearchAgents added in v0.3.0

func (r *AgentRouter) SearchAgents(ctx context.Context, query string, opts ...sdk.DiscoverOption) ([]sdk.AgentMatch, error)

SearchAgents finds agents available for delegation (AgentMode != nil).

func (*AgentRouter) SearchTools

func (r *AgentRouter) SearchTools(ctx context.Context, query string, opts ...sdk.DiscoverOption) ([]sdk.ToolMatch, error)

SearchTools performs semantic search to find tools matching a query.

func (*AgentRouter) SetNATSConn added in v0.9.10

func (r *AgentRouter) SetNATSConn(nc *nats.Conn)

SetNATSConn sets the NATS connection for the router. Must be called before any RPC/discovery methods are used.

type BlobStore added in v0.9.10

type BlobStore struct {
	// contains filtered or unexported fields
}

BlobStore implements sdk.BlobStore over NATS JetStream Object Store.

func NewBlobStore added in v0.9.10

func NewBlobStore(nc *nats.Conn) (*BlobStore, error)

NewBlobStore creates a BlobStore backed by a NATS Object Store bucket. The bucket is created if it doesn't exist.

func (*BlobStore) Delete added in v0.9.10

func (bs *BlobStore) Delete(ctx context.Context, name string) error

Delete removes a blob by name.

func (*BlobStore) Get added in v0.9.10

func (bs *BlobStore) Get(ctx context.Context, name string) (io.ReadCloser, *sdk.BlobInfo, error)

Get retrieves a blob by name.

func (*BlobStore) List added in v0.9.10

func (bs *BlobStore) List(ctx context.Context) ([]sdk.BlobInfo, error)

List returns metadata for all blobs in the store.

func (*BlobStore) Put added in v0.9.10

func (bs *BlobStore) Put(ctx context.Context, name string, reader io.Reader, opts ...sdk.BlobOption) (*sdk.BlobInfo, error)

Put stores a blob and returns its metadata.

type Config

type Config struct {
	// AgentName is the name of the running agent.
	AgentName string

	// GatewayURL is the URL of the agent gateway for router/registry.
	GatewayURL string

	// DataDir is the directory for persistent data.
	DataDir string

	// LogLevel is the logging level (debug, info, warn, error).
	LogLevel string
}

Config contains configuration for the platform context.

type Context

type Context struct {
	// contains filtered or unexported fields
}

Context implements sdk.PlatformContext with real service implementations.

func NewContext

func NewContext(cfg Config) *Context

NewContext creates a new platform context with the given configuration.

func (*Context) App

func (c *Context) App() any

App returns the PocketBase app instance.

func (*Context) Blobs added in v0.9.10

func (c *Context) Blobs() sdk.BlobStore

Blobs returns the blob store for large binary transfers. Returns nil until the store is initialized during startup.

func (*Context) Config

func (c *Context) Config() map[string]string

Config returns the agent configuration.

func (*Context) LLM

func (c *Context) LLM() sdk.LLMClient

LLM returns the LLM client.

func (*Context) Logger

func (c *Context) Logger() sdk.Logger

Logger returns the logger.

func (*Context) MessageBus added in v0.9.10

func (c *Context) MessageBus() sdk.MessageBus

MessageBus returns the NATS message bus for inter-agent communication. Returns nil until the bus is initialized during startup.

func (*Context) RAG

func (c *Context) RAG() sdk.RAGClient

RAG returns the RAG client.

func (*Context) Router

func (c *Context) Router() sdk.AgentRouter

Router returns the agent router.

func (*Context) SDK

func (c *Context) SDK() sdk.SDK

SDK returns the SDK instance.

func (*Context) SetApp

func (c *Context) SetApp(app any)

SetApp sets the PocketBase app instance. When a core.App is provided, the RAG client is upgraded to persistent storage.

func (*Context) SetBlobs added in v0.9.10

func (c *Context) SetBlobs(bs sdk.BlobStore)

SetBlobs sets the blob store implementation. Called by the runtime during initialization.

func (*Context) SetMessageBus added in v0.9.10

func (c *Context) SetMessageBus(mb sdk.MessageBus)

SetMessageBus sets the message bus implementation. Called by the runtime during initialization. Also wires the NATS connection into the AgentRouter for RPC/discovery.

func (*Context) SetTasks added in v0.3.0

func (c *Context) SetTasks(ts sdk.TaskStore)

SetTasks sets the task store implementation. Called by the runtime during initialization.

func (*Context) Tasks added in v0.3.0

func (c *Context) Tasks() sdk.TaskStore

Tasks returns the task store for querying task history.

type EventBus added in v0.3.0

type EventBus struct {
	// contains filtered or unexported fields
}

EventBus publishes and subscribes to task/agent lifecycle events using NATS JetStream. It shares the NATS connection owned by MessageBus.

func NewEventBus added in v0.3.0

func NewEventBus(nc *nats.Conn, agentName string) (*EventBus, error)

NewEventBus creates an EventBus using an existing NATS connection (typically from MessageBus.NC()). Returns nil if nc is nil. The caller retains ownership of the connection — EventBus will not close it.

func (*EventBus) Close added in v0.3.0

func (eb *EventBus) Close()

Close is a no-op. The NATS connection is owned by MessageBus. Retained for API compatibility during the migration.

func (*EventBus) Publish added in v0.3.0

func (eb *EventBus) Publish(_ context.Context, subject string, event sdk.Event) error

Publish sends an event to the given subject.

func (*EventBus) PublishAgentEvent added in v0.3.0

func (eb *EventBus) PublishAgentEvent(eventType sdk.EventType, data any) error

PublishAgentEvent is a convenience method for publishing agent lifecycle events.

func (*EventBus) PublishTaskEvent added in v0.3.0

func (eb *EventBus) PublishTaskEvent(taskID string, eventType sdk.EventType, data any) error

PublishTaskEvent is a convenience method for publishing task lifecycle events.

func (*EventBus) PublishTaskEventCore added in v0.6.0

func (eb *EventBus) PublishTaskEventCore(taskID string, eventType sdk.EventType, data any) error

PublishTaskEventCore publishes a task event via NATS core (not JetStream). This ensures the event is broadcast to all core subscribers across the cluster, which is required for the gateway's delegate-stream handler that uses nc.Subscribe. JetStream publish only guarantees delivery to the stream leader node.

func (*EventBus) Subscribe added in v0.3.0

func (eb *EventBus) Subscribe(ctx context.Context, subject string, handler EventHandler) (*eventSubscription, error)

Subscribe listens to events matching the given subject pattern.

type EventHandler added in v0.9.10

type EventHandler func(ctx context.Context, event sdk.Event) error

EventHandler processes a single event (internal runtime type).

type Logger

type Logger struct {
	// contains filtered or unexported fields
}

Logger implements sdk.Logger with structured output.

func NewLogger

func NewLogger(agentName, levelStr string) *Logger

NewLogger creates a new logger for the given agent.

func (*Logger) Debug

func (l *Logger) Debug(msg string, fields ...sdk.Field)

Debug logs a debug-level message.

func (*Logger) Error

func (l *Logger) Error(msg string, fields ...sdk.Field)

Error logs an error-level message.

func (*Logger) Info

func (l *Logger) Info(msg string, fields ...sdk.Field)

Info logs an info-level message.

func (*Logger) Warn

func (l *Logger) Warn(msg string, fields ...sdk.Field)

Warn logs a warning-level message.

func (*Logger) With

func (l *Logger) With(fields ...sdk.Field) sdk.Logger

With returns a logger with the given fields added to all messages.

type MessageBus added in v0.9.10

type MessageBus struct {
	// contains filtered or unexported fields
}

MessageBus implements sdk.MessageBus over a NATS connection.

func NewMessageBus added in v0.9.10

func NewMessageBus(natsURL, agentName, natsUser, natsPass string) (*MessageBus, error)

NewMessageBus creates a MessageBus connected to the given NATS server. natsUser/natsPass are used for per-agent authentication (may be empty).

func (*MessageBus) Close added in v0.9.10

func (mb *MessageBus) Close()

Close drains the NATS connection.

func (*MessageBus) NC added in v0.9.10

func (mb *MessageBus) NC() *nats.Conn

NC returns the underlying NATS connection (for internal use by EventBus/BlobStore).

func (*MessageBus) Publish added in v0.9.10

func (mb *MessageBus) Publish(_ context.Context, subject string, data []byte) error

Publish sends a fire-and-forget message.

func (*MessageBus) QueueSubscribe added in v0.9.10

func (mb *MessageBus) QueueSubscribe(_ context.Context, subject string, queue string, handler sdk.MsgHandler) (sdk.Subscription, error)

QueueSubscribe listens with load balancing across a named group.

func (*MessageBus) Request added in v0.9.10

func (mb *MessageBus) Request(ctx context.Context, subject string, data []byte, timeout time.Duration) ([]byte, error)

Request sends a message and waits for a single reply.

func (*MessageBus) Subscribe added in v0.9.10

func (mb *MessageBus) Subscribe(_ context.Context, subject string, handler sdk.MsgHandler) (sdk.Subscription, error)

Subscribe listens for messages on a subject pattern.

type PersistentRAGClient

type PersistentRAGClient struct {
	// contains filtered or unexported fields
}

PersistentRAGClient implements sdk.RAGClient with PocketBase-backed storage. Documents are stored in the agentic_documents collection. Vector search loads embeddings from PB and computes cosine similarity in-memory.

func NewPersistentRAGClient

func NewPersistentRAGClient(app core.App, cfg Config) *PersistentRAGClient

NewPersistentRAGClient creates a PocketBase-backed RAG client.

func (*PersistentRAGClient) Delete

func (c *PersistentRAGClient) Delete(ctx context.Context, id string) error

Delete removes a document by ID from the collection.

func (*PersistentRAGClient) List

List returns all documents (metadata only).

func (*PersistentRAGClient) Query

func (c *PersistentRAGClient) Query(ctx context.Context, query string, opts ...sdk.QueryOption) ([]sdk.SearchResult, error)

Query performs a search over documents. Currently uses basic matching (no vector similarity) since embeddings are not yet generated. Returns all matching documents with placeholder scores.

func (*PersistentRAGClient) Store

func (c *PersistentRAGClient) Store(ctx context.Context, doc sdk.Document) error

Store adds a document to the agentic_documents collection.

type PersistentSimpleMemory

type PersistentSimpleMemory struct {
	// contains filtered or unexported fields
}

PersistentSimpleMemory stores messages in PocketBase collections. Messages persist across app restarts via agentic_conversations + agentic_messages.

func (*PersistentSimpleMemory) Clear

func (*PersistentSimpleMemory) LoadMessages

func (m *PersistentSimpleMemory) LoadMessages(ctx context.Context) ([]sdk.ChatMessage, error)

func (*PersistentSimpleMemory) SaveMessages

func (m *PersistentSimpleMemory) SaveMessages(ctx context.Context, messages []sdk.ChatMessage) error

type PersistentSummaryBufferMemory

type PersistentSummaryBufferMemory struct {
	// contains filtered or unexported fields
}

PersistentSummaryBufferMemory persists messages and summary to PocketBase.

func (*PersistentSummaryBufferMemory) Clear

func (*PersistentSummaryBufferMemory) GetSummary

func (m *PersistentSummaryBufferMemory) GetSummary() string

func (*PersistentSummaryBufferMemory) LoadMessages

func (*PersistentSummaryBufferMemory) SaveMessages

func (m *PersistentSummaryBufferMemory) SaveMessages(ctx context.Context, messages []sdk.ChatMessage) error

func (*PersistentSummaryBufferMemory) SetMessages

func (m *PersistentSummaryBufferMemory) SetMessages(messages []sdk.ChatMessage)

func (*PersistentSummaryBufferMemory) SetSummary

func (m *PersistentSummaryBufferMemory) SetSummary(summary string)

type PersistentWindowMemory

type PersistentWindowMemory struct {
	// contains filtered or unexported fields
}

PersistentWindowMemory is a persistent memory that only loads the last N message pairs.

func (*PersistentWindowMemory) Clear

func (*PersistentWindowMemory) LoadMessages

func (m *PersistentWindowMemory) LoadMessages(ctx context.Context) ([]sdk.ChatMessage, error)

func (*PersistentWindowMemory) SaveMessages

func (m *PersistentWindowMemory) SaveMessages(ctx context.Context, messages []sdk.ChatMessage) error

type RAGClient

type RAGClient struct {
	// contains filtered or unexported fields
}

RAGClient implements sdk.RAGClient with an in-memory store. TODO: Replace with SQLite + vector embeddings.

func NewRAGClient

func NewRAGClient(cfg Config) *RAGClient

NewRAGClient creates a new RAG client.

func (*RAGClient) Delete

func (c *RAGClient) Delete(ctx context.Context, id string) error

Delete removes a document by ID.

func (*RAGClient) List

func (c *RAGClient) List(ctx context.Context) ([]sdk.DocumentMeta, error)

List returns all documents (without content, for indexing purposes).

func (*RAGClient) Query

func (c *RAGClient) Query(ctx context.Context, query string, opts ...sdk.QueryOption) ([]sdk.SearchResult, error)

Query performs a semantic search and returns relevant documents.

func (*RAGClient) Store

func (c *RAGClient) Store(ctx context.Context, doc sdk.Document) error

Store adds a document to the RAG store.

type SimpleMemory

type SimpleMemory struct {
	// contains filtered or unexported fields
}

SimpleMemory stores messages in-memory.

func (*SimpleMemory) Clear

func (m *SimpleMemory) Clear(ctx context.Context) error

func (*SimpleMemory) LoadMessages

func (m *SimpleMemory) LoadMessages(ctx context.Context) ([]sdk.ChatMessage, error)

func (*SimpleMemory) SaveMessages

func (m *SimpleMemory) SaveMessages(ctx context.Context, messages []sdk.ChatMessage) error

type SummaryBufferMemory

type SummaryBufferMemory struct {
	// contains filtered or unexported fields
}

SummaryBufferMemory keeps recent messages in full and summarizes older ones.

func (*SummaryBufferMemory) Clear

func (m *SummaryBufferMemory) Clear(ctx context.Context) error

func (*SummaryBufferMemory) GetSummary

func (m *SummaryBufferMemory) GetSummary() string

GetSummary returns the current conversation summary.

func (*SummaryBufferMemory) LoadMessages

func (m *SummaryBufferMemory) LoadMessages(ctx context.Context) ([]sdk.ChatMessage, error)

func (*SummaryBufferMemory) SaveMessages

func (m *SummaryBufferMemory) SaveMessages(ctx context.Context, messages []sdk.ChatMessage) error

func (*SummaryBufferMemory) SetMessages

func (m *SummaryBufferMemory) SetMessages(messages []sdk.ChatMessage)

SetMessages replaces all messages.

func (*SummaryBufferMemory) SetSummary

func (m *SummaryBufferMemory) SetSummary(summary string)

SetSummary sets the summary.

type TaskEventCallbacks added in v0.3.0

type TaskEventCallbacks struct {
	sdk.NoopCallbacks
	// contains filtered or unexported fields
}

TaskEventCallbacks implements sdk.LoopCallbacks by publishing each callback as a NATS event on the task's subject. This makes a sub-agent's internal loop activity observable by the caller during delegation.

func NewTaskEventCallbacks added in v0.3.0

func NewTaskEventCallbacks(taskID string, eventBus *EventBus) *TaskEventCallbacks

NewTaskEventCallbacks creates callbacks that publish loop events to NATS for the given task. eventBus must not be nil.

func (*TaskEventCallbacks) OnLLMEnd added in v0.3.0

func (c *TaskEventCallbacks) OnLLMEnd(ctx context.Context, response string, usage sdk.TokenUsage)

func (*TaskEventCallbacks) OnLLMStart added in v0.3.0

func (c *TaskEventCallbacks) OnLLMStart(ctx context.Context, messages []sdk.ChatMessage)

func (*TaskEventCallbacks) OnToolEnd added in v0.3.0

func (c *TaskEventCallbacks) OnToolEnd(ctx context.Context, action sdk.ToolAction, result string, err error, duration time.Duration)

func (*TaskEventCallbacks) OnToolStart added in v0.3.0

func (c *TaskEventCallbacks) OnToolStart(ctx context.Context, action sdk.ToolAction)

type TaskStore added in v0.3.0

type TaskStore struct {
	// contains filtered or unexported fields
}

TaskStore implements sdk.TaskStore backed by PocketBase collections (agentic_tasks and agentic_artifacts).

func NewTaskStore added in v0.3.0

func NewTaskStore(app core.App) *TaskStore

NewTaskStore creates a new PocketBase-backed task store.

func (*TaskStore) CreateArtifact added in v0.3.0

func (s *TaskStore) CreateArtifact(artifact *sdk.Artifact) error

CreateArtifact stores a new artifact record in PocketBase.

func (*TaskStore) CreateTask added in v0.3.0

func (s *TaskStore) CreateTask(task *sdk.Task) error

CreateTask creates a new task record in PocketBase.

func (*TaskStore) Get added in v0.3.0

func (s *TaskStore) Get(_ context.Context, taskID string) (*sdk.Task, error)

Get retrieves a task by ID.

func (*TaskStore) GetArtifact added in v0.3.0

func (s *TaskStore) GetArtifact(_ context.Context, artifactID string) (*sdk.Artifact, error)

GetArtifact returns a specific artifact by ID.

func (*TaskStore) GetArtifacts added in v0.3.0

func (s *TaskStore) GetArtifacts(_ context.Context, taskID string) ([]sdk.Artifact, error)

GetArtifacts returns all artifacts for a task.

func (*TaskStore) List added in v0.3.0

func (s *TaskStore) List(_ context.Context, filter sdk.TaskFilter) ([]sdk.Task, error)

List returns tasks matching the given filter.

func (*TaskStore) SetTaskOutput added in v0.3.0

func (s *TaskStore) SetTaskOutput(taskID string, output []sdk.Part) error

SetTaskOutput sets the output on a task.

func (*TaskStore) UpdateTaskStatus added in v0.3.0

func (s *TaskStore) UpdateTaskStatus(taskID string, status sdk.TaskStatus) error

UpdateTaskStatus updates a task's status in PocketBase.

type WindowMemory

type WindowMemory struct {
	// contains filtered or unexported fields
}

WindowMemory keeps only the last N message pairs (user + assistant).

func (*WindowMemory) Clear

func (m *WindowMemory) Clear(ctx context.Context) error

func (*WindowMemory) LoadMessages

func (m *WindowMemory) LoadMessages(ctx context.Context) ([]sdk.ChatMessage, error)

func (*WindowMemory) SaveMessages

func (m *WindowMemory) SaveMessages(ctx context.Context, messages []sdk.ChatMessage) error

func (*WindowMemory) SetMessages

func (m *WindowMemory) SetMessages(messages []sdk.ChatMessage)

SetMessages replaces all messages (useful for initializing from existing conversation).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL