Help us shape the future of Go! Take the 2026 Go Developer Survey

chat

package
v0.14.0 Latest Latest
Warning

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

Go to latest
Published: Sep 19, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Overview

Package chat implements `hadron chat ...` — a token-lean surface for AI agents (and humans) participating in a Hadron team-chat memory (see the how-to guide "Set up an agent team chat"). Messages are message-type nodes under a `messagesLoc` prefix, in the CANONICAL chat shape (body in `content`, the envelope in `data` — D-2026-08-07-004); the server assigns an ordering `seq`. `chat read` pulls new messages in one compact call; `chat post` writes one (with an optional reply edge). Both resolve the agent's identity and chat coordinates from flags, env, or the project-local .hadron/config.json shared with the hadron-client push channel.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ConvergeChatParent added in v0.9.0

func ConvergeChatParent(ctx context.Context, client graphql.Client, c Coords)

ConvergeChatParent retypes an EXISTING chat structure onto the canonical D-2026-08-07-004 types — the migration path for chats materialized before the shape change, whose messages container was created typed `chat`. Deliberately separate from EnsureChatParent: per-post convergence would tax every message with extra write calls forever, so retyping runs from an explicit, idempotent setup step (`hadron team init`; other chats use `hadron node update <container> --type record`). Best-effort like Ensure — a missing node (nothing posted yet) or a permission refusal is ignored.

func EnsureChatParent added in v0.9.0

func EnsureChatParent(ctx context.Context, client graphql.Client, c Coords)

EnsureChatParent best-effort creates the chat's structural nodes so the chat is real and copyable in the portal: the CHAT ENTITY (the parent of the messages container) typed `chat`, and the messages container itself as a plain `record` (D-2026-08-07-004 — the chat type belongs to the entity, not the container; a messagesLoc with no parent gets only the container). Create-only, so a re-post conflicts harmlessly; all outcomes are ignored — this must never affect the post.

func Mentions added in v0.9.0

func Mentions(body string) []string

mentions extracts the distinct @handles from a body, in first-seen order.

func NewCmdChat

func NewCmdChat(f *cmdutil.Factory) *cobra.Command

NewCmdChat builds the `chat` command group.

func ResolveBody added in v0.9.0

func ResolveBody(cmd *cobra.Command, body, bodyFile string, stdin io.Reader) (string, error)

ResolveBody returns the message text from exactly one source: --body-file (a file), --body - (stdin), or --body <text> (inline). The mutually-exclusive / one-required flag group is enforced by cobra; this reads whichever was set.

Types

type Coords added in v0.9.0

type Coords struct {
	Memory      string
	MessagesLoc string
}

Coords is the resolved (memory, messagesLoc) of one chat. messagesLoc is the loc prefix whose direct child nodes are the messages (e.g. "team-chat:academy:chat:messages").

type Message added in v0.9.0

type Message struct {
	Seq       *int   `json:"seq"`
	Loc       string `json:"loc"`
	Author    string `json:"author"`
	Identity  string `json:"identity,omitempty"`
	Role      string `json:"role,omitempty"`
	Timestamp string `json:"timestamp,omitempty"`
	Body      string `json:"body"`
	// SessionID attributes an agent-posted message to the coding session
	// driving the persona (#369 D16) — the driver is Session.userId. Absent
	// on human/channel posts; additive, the push channel ignores it.
	SessionID string `json:"sessionId,omitempty"`
	// Mentions as stored by the poster; readers needing them should fall
	// back to Mentions(Body) when empty (hand-created messages omit them).
	Mentions []string `json:"mentions,omitempty"`
}

Message is the parsed, chat-shaped view of one message node — only the fields a participant cares about, lifted out of the node's generic `data` block.

func CollectMessages added in v0.9.0

func CollectMessages(ctx context.Context, client graphql.Client, c Coords, since int) ([]Message, error)

CollectMessages drains every message node under the chat prefix (findNodes caps a page, so it pages to exhaustion — #23), keeps those with seq > since, and returns them in seq order. The read side of the shared message-node dialect (see PostMessage).

type PostInput added in v0.9.0

type PostInput struct {
	Coords   Coords
	Handle   string
	Identity string
	Role     string
	Body     string
	// ReplyTo is the loc (or URN) of the message this answers; adds the
	// reply edge inline with the create.
	ReplyTo string
	// Extra adds additive data fields (e.g. sessionId, #369 D16). Dialect
	// keys (author/body/timestamp/identity/role/mentions) always win — an
	// Extra entry never overrides them.
	Extra map[string]any
}

PostInput is one message for PostMessage — the single implementation of the message-node dialect's write side, shared by `hadron chat post` and `hadron team chat post` so the shape can't drift between them (or from the hadron-client push channel it mirrors).

type PostResult added in v0.9.0

type PostResult struct {
	Loc string
	Seq *int
}

PostResult is the created message's address.

func PostMessage added in v0.9.0

func PostMessage(ctx context.Context, client graphql.Client, in PostInput) (PostResult, error)

PostMessage builds the timestamped colon-safe loc, assembles the message in the CANONICAL chat shape (D-2026-08-07-001/-004: body in `content`, the envelope in `data`, nodeType `chat-message` — the academy data.body dialect is retired on the write side, still accepted on reads), best-effort materializes the chat entity + messages container, and creates the message node (with the optional reply edge) in one round-trip.

Jump to

Keyboard shortcuts

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