observationlog

package
v0.3.2 Latest Latest
Warning

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

Go to latest
Published: Jun 6, 2026 License: MIT Imports: 14 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrObservationConflict      = errors.New("goncho: observation conflict")
	ErrObservationNotFound      = errors.New("goncho: observation not found")
	ErrObservationSchemaMissing = errors.New("goncho: observation schema missing")
	ErrObservationInvalid       = errors.New("goncho: invalid observation")
)
View Source
var DDL = []string{
	`CREATE TABLE IF NOT EXISTS goncho_observations (
		id TEXT PRIMARY KEY,
		kind TEXT NOT NULL CHECK(kind IN ('session_start','user_prompt','tool_call','tool_result','tool_error','assistant_response','compact','session_end','custom')),
		workspace_id TEXT NOT NULL DEFAULT '',
		profile_id TEXT NOT NULL DEFAULT '',
		peer_id TEXT NOT NULL DEFAULT '',
		session_key TEXT NOT NULL DEFAULT '',
		context_id TEXT NOT NULL DEFAULT '',
		input TEXT NOT NULL DEFAULT '',
		output TEXT NOT NULL DEFAULT '',
		success INTEGER CHECK(success IN (0, 1) OR success IS NULL),
		metadata_json TEXT NOT NULL DEFAULT '{}',
		input_truncated INTEGER NOT NULL DEFAULT 0 CHECK(input_truncated IN (0, 1)),
		output_truncated INTEGER NOT NULL DEFAULT 0 CHECK(output_truncated IN (0, 1)),
		input_original_bytes INTEGER NOT NULL DEFAULT 0,
		output_original_bytes INTEGER NOT NULL DEFAULT 0,
		redacted INTEGER NOT NULL DEFAULT 0 CHECK(redacted IN (0, 1)),
		redaction_count INTEGER NOT NULL DEFAULT 0,
		checksum TEXT NOT NULL,
		observed_at INTEGER NOT NULL
	)`,
	`ALTER TABLE goncho_observations ADD COLUMN profile_id TEXT NOT NULL DEFAULT ''`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_observations_observed_at ON goncho_observations(observed_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_observations_workspace ON goncho_observations(workspace_id, observed_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_observations_profile ON goncho_observations(profile_id, observed_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_observations_peer ON goncho_observations(peer_id, observed_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_observations_session ON goncho_observations(session_key, observed_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_observations_context ON goncho_observations(context_id, observed_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_observations_kind ON goncho_observations(kind, observed_at DESC)`,
	`CREATE TABLE IF NOT EXISTS goncho_audit_events (
		id TEXT PRIMARY KEY,
		action TEXT NOT NULL CHECK(action IN ('observe')),
		target_type TEXT NOT NULL CHECK(target_type IN ('observation')),
		target_id TEXT NOT NULL,
		workspace_id TEXT NOT NULL DEFAULT '',
		peer_id TEXT NOT NULL DEFAULT '',
		session_key TEXT NOT NULL DEFAULT '',
		reason TEXT NOT NULL,
		metadata_json TEXT NOT NULL DEFAULT '{}',
		created_at INTEGER NOT NULL
	)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_audit_events_created_at ON goncho_audit_events(created_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_audit_events_target ON goncho_audit_events(target_type, target_id, created_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_audit_events_action ON goncho_audit_events(action, created_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_audit_events_workspace ON goncho_audit_events(workspace_id, created_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_audit_events_peer ON goncho_audit_events(peer_id, created_at DESC)`,
	`CREATE INDEX IF NOT EXISTS idx_goncho_audit_events_session ON goncho_audit_events(session_key, created_at DESC)`,
}

Functions

This section is empty.

Types

type AuditAction

type AuditAction string
const (
	AuditActionObserve AuditAction = "observe"
)

type AuditEvent

type AuditEvent struct {
	ID          string            `json:"id"`
	Action      AuditAction       `json:"action"`
	TargetType  AuditTargetType   `json:"target_type"`
	TargetID    string            `json:"target_id"`
	WorkspaceID string            `json:"workspace_id"`
	PeerID      string            `json:"peer_id"`
	SessionKey  string            `json:"session_key"`
	Reason      string            `json:"reason"`
	Metadata    map[string]string `json:"metadata,omitempty"`
	CreatedAt   time.Time         `json:"created_at"`
}

type AuditQuery

type AuditQuery struct {
	Action      AuditAction     `json:"action,omitempty"`
	TargetType  AuditTargetType `json:"target_type,omitempty"`
	TargetID    string          `json:"target_id,omitempty"`
	WorkspaceID string          `json:"workspace_id,omitempty"`
	PeerID      string          `json:"peer_id,omitempty"`
	SessionKey  string          `json:"session_key,omitempty"`
	Since       time.Time       `json:"since,omitempty"`
	Until       time.Time       `json:"until,omitempty"`
	Limit       int             `json:"limit,omitempty"`
}

type AuditResult

type AuditResult struct {
	Events []AuditEvent `json:"events"`
	Count  int          `json:"count"`
}

func AuditTrail

func AuditTrail(ctx context.Context, db *sql.DB, q AuditQuery) (AuditResult, error)

type AuditTargetType

type AuditTargetType string
const (
	AuditTargetObservation AuditTargetType = "observation"
)

type Observation

type Observation struct {
	ID                  string            `json:"id"`
	Kind                ObservationKind   `json:"kind"`
	WorkspaceID         string            `json:"workspace_id,omitempty"`
	ProfileID           string            `json:"profile_id,omitempty"`
	PeerID              string            `json:"peer_id,omitempty"`
	SessionKey          string            `json:"session_key,omitempty"`
	ContextID           string            `json:"context_id,omitempty"`
	Input               string            `json:"input"`
	Output              string            `json:"output"`
	Success             *bool             `json:"success,omitempty"`
	Metadata            map[string]string `json:"metadata,omitempty"`
	InputTruncated      bool              `json:"input_truncated"`
	OutputTruncated     bool              `json:"output_truncated"`
	InputOriginalBytes  int               `json:"input_original_bytes"`
	OutputOriginalBytes int               `json:"output_original_bytes"`
	Redacted            bool              `json:"redacted"`
	RedactionCount      int               `json:"redaction_count"`
	Checksum            string            `json:"checksum"`
	ObservedAt          time.Time         `json:"observed_at"`
}

type ObservationKind

type ObservationKind string
const (
	ObservationKindSessionStart      ObservationKind = "session_start"
	ObservationKindUserPrompt        ObservationKind = "user_prompt"
	ObservationKindToolCall          ObservationKind = "tool_call"
	ObservationKindToolResult        ObservationKind = "tool_result"
	ObservationKindToolError         ObservationKind = "tool_error"
	ObservationKindAssistantResponse ObservationKind = "assistant_response"
	ObservationKindCompact           ObservationKind = "compact"
	ObservationKindSessionEnd        ObservationKind = "session_end"
	ObservationKindCustom            ObservationKind = "custom"
)

type ObservationList

type ObservationList struct {
	Observations []Observation `json:"observations"`
	Count        int           `json:"count"`
}

func ListObservations

func ListObservations(ctx context.Context, db *sql.DB, q ObservationQuery) (ObservationList, error)

type ObservationParams

type ObservationParams struct {
	ID          string            `json:"id,omitempty"`
	Kind        ObservationKind   `json:"kind"`
	WorkspaceID string            `json:"workspace_id,omitempty"`
	ProfileID   string            `json:"profile_id,omitempty"`
	PeerID      string            `json:"peer_id,omitempty"`
	SessionKey  string            `json:"session_key,omitempty"`
	ContextID   string            `json:"context_id,omitempty"`
	Input       string            `json:"input"`
	Output      string            `json:"output"`
	Success     *bool             `json:"success,omitempty"`
	Metadata    map[string]string `json:"metadata,omitempty"`
	ObservedAt  time.Time         `json:"observed_at,omitempty"`
	Reason      string            `json:"reason,omitempty"`
}

type ObservationQuery

type ObservationQuery struct {
	WorkspaceID string            `json:"workspace_id,omitempty"`
	ProfileID   string            `json:"profile_id,omitempty"`
	PeerID      string            `json:"peer_id,omitempty"`
	SessionKey  string            `json:"session_key,omitempty"`
	ContextID   string            `json:"context_id,omitempty"`
	Kinds       []ObservationKind `json:"kinds,omitempty"`
	Success     *bool             `json:"success,omitempty"`
	Since       time.Time         `json:"since,omitempty"`
	Until       time.Time         `json:"until,omitempty"`
	Limit       int               `json:"limit,omitempty"`
}

type ObservationResult

type ObservationResult struct {
	Observation Observation `json:"observation"`
	AuditID     string      `json:"audit_id"`
	Replayed    bool        `json:"replayed,omitempty"`
}

Jump to

Keyboard shortcuts

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