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 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"`
}
func Observe ¶
func Observe(ctx context.Context, db *sql.DB, p ObservationParams) (ObservationResult, error)
Click to show internal directories.
Click to hide internal directories.