agents

package
v0.29.0 Latest Latest
Warning

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

Go to latest
Published: Jul 9, 2026 License: MIT Imports: 87 Imported by: 0

Documentation

Overview

Package agents backs /tools/agents — the Agents UI Manager. It lets users manage AI agent sessions, workspaces, and presets from the browser and streams real-time agent output via Server-Sent Events.

Index

Constants

This section is empty.

Variables

View Source
var SPAFS fs.FS = func() fs.FS { return spaLoader.FS() }()

SPAFS is kept for backward compatibility with spa_handler.go (reads the FS directly to serve assets + the shell). Points at the same FS as spaLoader.

Functions

func AutoInstallMCP added in v0.13.4

func AutoInstallMCP()

AutoInstallMCP installs wick into every detected MCP client that doesn't have it yet, skipping blocklisted (manually-uninstalled) clients. Called once at server startup; the mcp_auto_installed flag prevents re-runs so page renders never trigger spurious re-installs.

func Register

func Register(r tool.Router)

Register mounts all Agents routes under /tools/agents.

func Router9APIProxy added in v0.28.1

func Router9APIProxy() http.Handler

Router9APIProxy is the OpenAI-compatible API reverse-proxy handler. server.go mounts it at router9.MountPrefix+"/v1/" WITHOUT auth so local AI CLIs pointed at wick's /9router/v1 base URL can reach 9router. Still gated by the master switch (404 when off).

func Router9Autostart added in v0.28.1

func Router9Autostart()

Router9Autostart starts 9router at boot when the stored auto-start flag is on. Called from server.go after the tool router mounts (so the config store is wired); safe in a goroutine.

func Router9AutostartEnabled added in v0.28.1

func Router9AutostartEnabled() bool

Router9AutostartEnabled reports whether the admin turned on 9router auto-start. server.go calls this to decide whether to add a boot-gate step (so the "Booting…" screen waits for 9router) — skipping it entirely when off keeps boot instant.

func Router9Enabled added in v0.28.1

func Router9Enabled() bool

Router9Enabled reports the master switch. Absent config row = ON (default true, matching DefaultGeneralConfig) so an existing setup keeps working until an admin explicitly disables it. When off, every 9router surface (dashboard, /v1 proxy, autostart, controls) is dead.

func Router9ExternalAPIEnabled added in v0.28.1

func Router9ExternalAPIEnabled() bool

Router9ExternalAPIEnabled reports whether the admin exposed the /9router/v1 API to off-machine callers. server.go reads this to decide whether a non-loopback request to the API subtree bypasses the host allowlist (so a tunnel/public host reaches 9router, which then enforces its own API key). Gated by the master switch.

func Router9MountPrefix added in v0.28.1

func Router9MountPrefix() string

Router9MountPrefix is the wick-root path the dashboard proxy is mounted under. Re-exported so server.go can wire the route without importing the 9router subpackage directly.

func Router9NextAssetProxy added in v0.28.1

func Router9NextAssetProxy() http.Handler

Router9NextAssetProxy handles root-absolute /_next/* asset requests that 9router's Next.js bundle emits at runtime and which slip past the body rewriter (fonts/CSS/chunks assembled from JS fragments, so the string rewrite in rewrite.go can't catch them). The iframe is same-origin, so those requests land at the wick root as /_next/... with no prefix and 404.

Rather than chase every runtime-assembled path in the rewriter, we catch them here: re-root the path under MountPrefix and hand it to the dashboard proxy (which strips the prefix back off before forwarding). /_next/ is unique to Next.js so serving it at the wick root can't collide with any wick route — no Referer guard needed (and a guard was in fact fragile: module-script / preload requests send an origin-only Referer with no path under strict-origin-when-cross-origin, so a /9router-path check dropped legitimate assets and 404'd them). Admin auth is applied at the mount in server.go, like the dashboard proxy.

func Router9RootProxy added in v0.28.1

func Router9RootProxy() http.Handler

Router9RootProxy is the dashboard reverse-proxy handler, wrapped so it 404s when the master switch is off. Admin auth is applied at the mount (RequireAdmin) in server.go. server.go mounts it at the wick root.

func SetApprovals

func SetApprovals(m *gate.ApprovalManager)

SetApprovals wires in the gate ApprovalManager. nil = gate disabled (handler endpoints fall back to 503).

func SetAskUsers

func SetAskUsers(m *askuser.Manager)

SetAskUsers wires in the ask_user Manager. nil = ask_user MCP tool returns errors and the answer endpoint 503s.

func SetAuth added in v0.14.21

func SetAuth(a *login.Service)

SetAuth wires the login service so per-user preferences (pinned project) can be read/written from the agents tool.

func SetBroadcaster

func SetBroadcaster(b *Broadcaster)

SetBroadcaster wires in the SSE event broadcaster.

func SetChannelRegistry added in v0.10.0

func SetChannelRegistry(r *agentchannels.Registry)

SetChannelRegistry wires the live channel registry so picker fields can issue lookup queries against each channel's upstream (Slack API, etc.). Without this, /channels/{slug}/lookup returns 503.

func SetConfigs

func SetConfigs(c *configs.Service)

SetConfigs wires the shared configs service so the Providers page can toggle agents.gate_enabled inline. Without this, the toggle endpoint 503s.

func SetConnectors added in v0.17.0

func SetConnectors(c *connectors.Service)

SetConnectors wires the connectors service so the session Config tab can read a connector's field schema (to render the form) and resolve which connectors opted into per-session overrides.

func SetDB

func SetDB(db *gorm.DB)

SetDB wires the shared GORM DB so channel handlers can read/write agent_channels rows. Without this, channel config endpoints 503.

Workflow data is DB-primary. Folders left on disk from before the DB migration are not imported automatically — use the SPA or MCP to recreate them, then remove the old folders.

func SetDataTables added in v0.13.1

func SetDataTables(s datatable.Service)

SetDataTables registers the shared data-table service. nil is allowed during early boot; handlers fall back to 503.

func SetGateStatus

func SetGateStatus(s GateStatus)

SetGateStatus records the boot-time gate-resolution result. Read by the Providers page. Call exactly once during server boot.

func SetLayout

func SetLayout(l agentconfig.Layout)

SetLayout wires in the on-disk layout used for direct file reads.

func SetManager

func SetManager(m *registry.Manager)

SetManager wires in the agents registry manager.

func SetPool

func SetPool(p *pool.Pool)

SetPool wires in the agent subprocess pool.

func SetSkillStore added in v0.17.0

func SetSkillStore(s *skills.Store)

SetSkillStore wires the skills ownership store so delete/upload/sync handlers can enforce owner-or-admin access control.

func SetSpawnLogger

func SetSpawnLogger(s *provider.SpawnLogger)

SetSpawnLogger wires in the per-spawn jsonl writer/reader. The Providers page reads from it via List + Read; the pool factory already writes through it.

func SetSyncManager added in v0.11.0

func SetSyncManager(m *providersync.Manager)

SetSyncManager wires the provider storage sync manager.

func SetTagsService added in v0.17.0

func SetTagsService(svc *tags.Service)

SetTagsService wires the tags service for skill ownership checks.

func SetWorkflowEncService added in v0.16.0

func SetWorkflowEncService(s *enc.Service)

SetWorkflowEncService wires the cipher used by the env save handler.

func SetWorkflowManager added in v0.13.0

func SetWorkflowManager(m *setup.Manager)

SetWorkflowManager wires in the workflow Manager constructed by server.go. After the JSON migration, workflow body is DB-primary — no file→DB importer runs here.

func WorkflowEventHook added in v0.13.0

func WorkflowEventHook(b *Broadcaster) func(id, runID string, ev wf.RunEvent)

WorkflowEventHook builds an engine.OnEvent callback that fans workflow run events out to the SSE broadcaster.

func WorkflowSSESession added in v0.13.0

func WorkflowSSESession(id string) string

WorkflowSSESession returns the broadcaster session key used for workflow run events.

Types

type Broadcaster

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

Broadcaster fans out agent events to all subscribed SSE connections. Subscribe returns a receive channel and an unsub func. Publish is called from ClaudeFactory.OnEvent on every AgentEvent.

subs is keyed by sessionID ("" = global subscribers that receive all events). Channels are buffered at 64 so a slow client never stalls the agent reader goroutine.

func NewBroadcaster

func NewBroadcaster() *Broadcaster

NewBroadcaster returns a ready Broadcaster.

func (*Broadcaster) Publish

func (b *Broadcaster) Publish(sessionID, agentName string, ev event.AgentEvent)

Publish fires ev to all subscribers of sessionID and all global ("") subscribers. Non-blocking: a full channel's event is dropped rather than blocking.

func (*Broadcaster) PublishApprovalRequest

func (b *Broadcaster) PublishApprovalRequest(sessionID string, req gate.ApprovalRequest)

PublishApprovalRequest fires when the gate binary dials the daemon socket with an unrecognised command. Browsers render this as a modal with 4 decision buttons (approve_once / approve_session / approve_always / block); the user's pick rides back through POST /approve.

Data is the JSON-encoded ApprovalRequest so the front-end can decode it once and use every field (cmd, work_dir, match_key, ...).

func (*Broadcaster) PublishApprovalResolved

func (b *Broadcaster) PublishApprovalResolved(sessionID, requestID, decision string)

PublishApprovalResolved fires once a decision is delivered (UI click, timeout, or listener close). Browsers use this to dismiss any open modal across all tabs subscribed to the session.

func (*Broadcaster) PublishAskUser

func (b *Broadcaster) PublishAskUser(sessionID, agentName string, payload []byte)

PublishAskUser fires when the ask_user MCP tool is invoked by an agent. Front-end renders an inline card with options + freeform input; user's pick rides back through POST /answer. Data is the JSON-encoded request body so every field (question, options, allow_freeform, ...) round-trips exactly once.

func (*Broadcaster) PublishAskUserResolved

func (b *Broadcaster) PublishAskUserResolved(sessionID, requestID string)

PublishAskUserResolved fires once an ask_user request resolves (UI answer or timeout). Used by the UI to dismiss the inline card across all tabs subscribed to the session.

func (*Broadcaster) PublishGitStatusJSON added in v0.15.5

func (b *Broadcaster) PublishGitStatusJSON(sessionID, jsonPayload string)

PublishGitStatusJSON broadcasts a pre-marshalled git_status payload to a session's subscribers. The payload is the full repo+status snapshot (built by the fs watcher) so the FE updates entirely from the event — no follow-up fetch, hence no polling. The marshalling lives in the caller (scm_watch.go) to avoid an import cycle on the scm types.

func (*Broadcaster) PublishLifecycle

func (b *Broadcaster) PublishLifecycle(ctx context.Context, sessionID, agentName, lifecycle, provider string, pid int)

PublishLifecycle pushes a lifecycle transition (Spawning, Killed) to subscribers. Idle/Working transitions are inferred from AgentEvent flow on the client side; only the bookend transitions — which never carry an AgentEvent — go through this channel. PublishLifecycle takes the spawn-time ctx so the broadcast log line carries the originating request_id (set by the HTTP middleware) when the spawn came from an HTTP path. Pass context.Background() when no spawn ctx is in scope.

func (*Broadcaster) PublishPoolStats added in v0.15.2

func (b *Broadcaster) PublishPoolStats(active, max, queueLen int, procs []LiveProcessEntry)

PublishPoolStats broadcasts a pool_stats event to all global SSE subscribers (sessionID == ""). Called after every lifecycle transition so the Providers page stays live.

func (*Broadcaster) PublishRaw added in v0.13.4

func (b *Broadcaster) PublishRaw(sessionID, agentName, evType, data string)

func (*Broadcaster) PublishSessionMeta added in v0.17.0

func (b *Broadcaster) PublishSessionMeta(sessionID, title string, titleCustom bool, status string)

PublishSessionMeta broadcasts a session's current title + status so open tabs update the header/sidebar live — no page reload. Fired after session meta changes (wick_set_title, status transitions), including changes that originated in a sibling stdio process and were relayed in via the agentctl refresh_session op.

func (*Broadcaster) PublishSystemTurn added in v0.13.4

func (b *Broadcaster) PublishSystemTurn(sessionID, agentName, text string, steps []string)

PublishSystemTurn fires a system_turn event so the UI can append it to the conversation without a page reload. Data is JSON with text + steps so the front-end can render the pill + checklist inline.

func (*Broadcaster) PublishUserMessage added in v0.29.0

func (b *Broadcaster) PublishUserMessage(sessionID, agentName, source, text string)

PublishUserMessage fires a user_message event so connected web viewers render a user turn injected from a NON-web source (a channel or the schedule runner) live, instead of only after a manual refresh. Without this the SSE stream carries only the assistant reply, so the incoming user turn silently goes missing until a refetch. Data is JSON with the text + source so the UI can badge where the message came from.

func (*Broadcaster) Subscribe

func (b *Broadcaster) Subscribe(sessionID string) (<-chan Event, func())

Subscribe registers a listener for a specific session (or "" for all). The caller must call the returned unsub func when the SSE connection closes.

type ConfigFieldDTO added in v0.19.0

type ConfigFieldDTO struct {
	Key         string `json:"key"`
	Value       string `json:"value"`
	Type        string `json:"type"`
	Options     string `json:"options,omitempty"`
	IsSecret    bool   `json:"is_secret"`
	Description string `json:"description,omitempty"`
	Required    bool   `json:"required"`
}

ConfigFieldDTO is one config row for the detail page (secret values masked).

type Event

type Event struct {
	SessionID string `json:"session_id"`
	AgentName string `json:"agent_name"`
	Type      string `json:"type"`
	Data      string `json:"data"`
	// ToolName, ToolInput, ToolUseID are populated for tool_use events;
	// ToolUseID and IsError are also set for tool_result events.
	ToolName  string `json:"tool_name,omitempty"`
	ToolInput string `json:"tool_input,omitempty"`
	ToolUseID string `json:"tool_use_id,omitempty"`
	IsError   bool   `json:"is_error,omitempty"`
	PID       int    `json:"pid,omitempty"`
	Lifecycle string `json:"lifecycle,omitempty"`
	// At / EndAt carry Unix ms timestamps for tool_use/tool_result events
	// so the UI can show "started HH:MM:SS, took Ns".
	At    int64 `json:"at,omitempty"`
	EndAt int64 `json:"end_at,omitempty"`
}

Event is one SSE payload pushed to browser subscribers. Type distinguishes agent stream events ("text_delta", "tool_use", ...) from lifecycle events ("lifecycle"); the latter carry PID + lifecycle label in Data so the UI can update the status badge without re-fetching the page.

func (Event) JSON

func (e Event) JSON() string

type GateStatus

type GateStatus struct {
	Enabled bool
	Binary  string // absolute path
	Source  string // gate.Source* constant
	Reason  string // populated when Enabled=false
}

GateStatus is the boot-time snapshot of the command gate. Populated once during server.go startup and read by the Providers page so operators can tell at a glance whether the gate sidecar is wired up.

Enabled=false means ResolveGateBinary returned an error — every command will hit fail-safe block at the matcher / no-socket path, except whitelist matches. Reason carries the error message so the UI can show actionable guidance (run `wick build`).

func GetGateStatus

func GetGateStatus() GateStatus

GetGateStatus is the read side. Returns a zero value when boot hasn't reached SetGateStatus yet.

type GateStatusDTO added in v0.19.0

type GateStatusDTO struct {
	Enabled        bool   `json:"enabled"`
	Binary         string `json:"binary"`
	Source         string `json:"source"`
	Reason         string `json:"reason,omitempty"`
	Note           string `json:"note"`
	PermissionMode string `json:"permission_mode"`
	BypassLocked   bool   `json:"bypass_locked"`
}

GateStatusDTO is the gate policy state.

type GitStatusSnapshot added in v0.15.5

type GitStatusSnapshot struct {
	Repos        []RepoSummary               `json:"repos"`
	Statuses     map[string]scm.StatusResult `json:"statuses"`
	TotalChanged int                         `json:"total_changed"`
}

GitStatusSnapshot is the full session-wide git state pushed over SSE (git_status event) AND returned by GET /git/repos. The FE renders entirely from this — repos for the switcher, statuses[rel] for the changes list of each repo — so a change event needs no follow-up fetch (zero polling).

type HookCapabilityDTO added in v0.19.0

type HookCapabilityDTO struct {
	Supported bool   `json:"supported"`
	Verified  bool   `json:"verified"`
	ProbedAt  string `json:"probed_at,omitempty"`
	Error     string `json:"error,omitempty"`
	Scope     string `json:"scope,omitempty"`
}

HookCapabilityDTO is the per-event hook capability state for one provider.

type LiveProcessDTO added in v0.19.0

type LiveProcessDTO struct {
	SessionID string `json:"session_id"`
	AgentName string `json:"agent_name"`
	PID       int    `json:"pid"`
	Lifecycle string `json:"lifecycle"`
	Substate  string `json:"substate"`
}

LiveProcessDTO is one active spawn entry.

type LiveProcessEntry added in v0.15.2

type LiveProcessEntry struct {
	SessionID string `json:"session_id"`
	AgentName string `json:"agent_name"`
	Provider  string `json:"provider,omitempty"` // "type/name"
	PID       int    `json:"pid,omitempty"`
	Queued    int    `json:"queued,omitempty"` // messages waiting after current turn
	Alive     bool   `json:"alive"`            // false only for a genuinely dead process (zombie). Respawn-mode idle-between-turns is alive.
	Lifecycle string `json:"lifecycle"`
	Substate  string `json:"substate,omitempty"`
}

LiveProcessEntry is one row in PoolStatsPayload.

type MCPClientDTO added in v0.19.0

type MCPClientDTO struct {
	ID          string `json:"id"`
	Label       string `json:"label"`
	Detected    bool   `json:"detected"`
	Installed   bool   `json:"installed"`
	Blocklisted bool   `json:"blocklisted"`
	ConfigPath  string `json:"config_path"`
}

MCPClientDTO is one MCP client install state.

type MCPStatusDTO added in v0.19.0

type MCPStatusDTO struct {
	AppName string         `json:"app_name"`
	Clients []MCPClientDTO `json:"clients"`
}

MCPStatusDTO is the aggregate MCP Wick card state.

type OverviewActiveDTO added in v0.19.0

type OverviewActiveDTO struct {
	SessionID string `json:"session_id"`
	Label     string `json:"label"`
	Lifecycle string `json:"lifecycle"`
	PID       int    `json:"pid,omitempty"`
	ProjectID string `json:"project_id"`
}

OverviewActiveDTO is one row in the active sessions panel returned by /api/overview.

type OverviewDTO added in v0.19.0

type OverviewDTO struct {
	Queued []OverviewQueuedDTO `json:"queued"`
	Active []OverviewActiveDTO `json:"active"`
	Stats  OverviewStatsDTO    `json:"stats"`
}

OverviewDTO is the JSON body returned by GET /api/overview.

type OverviewQueuedDTO added in v0.19.0

type OverviewQueuedDTO struct {
	SessionID string `json:"session_id"`
	AgentName string `json:"agent_name"`
	WaitingMs int64  `json:"waiting_ms"`
	Label     string `json:"label"`
	Project   string `json:"project"`
}

OverviewQueuedDTO is one row in the queue panel returned by /api/overview.

type OverviewStatsDTO added in v0.19.0

type OverviewStatsDTO struct {
	Active   int `json:"active"`
	PoolMax  int `json:"pool_max"`
	QueueLen int `json:"queue_len"`
}

OverviewStatsDTO carries the pool counters for the stats row.

type PoolStatsPayload added in v0.15.2

type PoolStatsPayload struct {
	Active        int                `json:"active"`
	Max           int                `json:"max"`
	QueueLen      int                `json:"queue_len"`
	LiveProcesses []LiveProcessEntry `json:"live_processes"`
}

PublishRaw fires an arbitrary typed SSE event. Used to inject synthetic agent events (e.g. text_delta + done for a switch confirmation reply). PoolStatsPayload is the JSON shape of a pool_stats SSE event. Sent to global ("") subscribers on every lifecycle transition so the Providers page can update the Active Processes panel without reload.

type PresetDetailResponse added in v0.19.0

type PresetDetailResponse struct {
	Name string `json:"name"`
	Body string `json:"body"`
}

PresetDetailResponse is the envelope for GET /api/presets/{name}.

type PresetListItem added in v0.19.0

type PresetListItem struct {
	Name      string `json:"name"`
	IsDefault bool   `json:"is_default,omitempty"`
}

PresetListItem is one row in GET /api/presets.

type PresetListResponse added in v0.19.0

type PresetListResponse struct {
	Presets []PresetListItem `json:"presets"`
}

PresetListResponse is the envelope for GET /api/presets.

type ProjectPinnedSession added in v0.19.0

type ProjectPinnedSession struct {
	ID    string `json:"id"`
	Label string `json:"label"`
}

ProjectPinnedSession is one pinned session row in the API response.

type ProjectSettingsResponse added in v0.19.0

type ProjectSettingsResponse struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	Icon        string `json:"icon"`
	Description string `json:"description"`
	CustomPath  string `json:"custom_path"`
	Managed     bool   `json:"managed"`
	// IsProtected reports whether the project cannot be deleted — the
	// built-in "default" project or an auto-created personal project.
	// The SPA hides the delete control when true.
	IsProtected     bool                   `json:"is_protected"`
	IsNew           bool                   `json:"is_new"`
	DefaultPreset   string                 `json:"default_preset"`
	DefaultProvider string                 `json:"default_provider"`
	SystemAddon     string                 `json:"system_addon"`
	ChatCount       int                    `json:"chat_count"`
	CreatedAt       string                 `json:"created_at"`
	PresetList      []string               `json:"preset_list"`
	ProviderList    []ProviderListItem     `json:"provider_list"`
	Pinned          []ProjectPinnedSession `json:"pinned"`
	MetaJSON        string                 `json:"meta_json"`
	Action          string                 `json:"action"`
}

ProjectSettingsResponse is the envelope for GET /api/projects/{id}.

type ProviderCapDTO added in v0.19.0

type ProviderCapDTO struct {
	Used      int  `json:"used"`
	Max       int  `json:"max"`
	Unlimited bool `json:"unlimited"`
}

ProviderCapDTO is the used / effective-max slot count for one provider.

type ProviderDetailResponse added in v0.19.0

type ProviderDetailResponse struct {
	Instance     ProviderInstanceDTO          `json:"instance"`
	Path         string                       `json:"path"`
	PathFound    bool                         `json:"path_found"`
	Version      string                       `json:"version"`
	VersionErr   string                       `json:"version_err,omitempty"`
	Probing      bool                         `json:"probing"`
	Hooks        map[string]HookCapabilityDTO `json:"hooks"`
	HookEnabled  map[string]bool              `json:"hook_enabled"`
	Gate         GateStatusDTO                `json:"gate"`
	GlobalMax    int                          `json:"global_max"`
	ActiveCount  int                          `json:"active_count"`
	ActivePIDs   []LiveProcessDTO             `json:"active_pids"`
	ConfigFields []ConfigFieldDTO             `json:"config_fields"`
	Spawns       []SpawnLogFileDTO            `json:"spawns"`
	Page         int                          `json:"page"`
	HasNext      bool                         `json:"has_next"`
	Router9      Router9DetailDTO             `json:"router9"`
}

ProviderDetailResponse is the JSON envelope for GET /api/providers/{type}/{name}.

type ProviderInstanceDTO added in v0.19.0

type ProviderInstanceDTO struct {
	Type          string `json:"type"`
	Name          string `json:"name"`
	Binary        string `json:"binary"`
	Disabled      bool   `json:"disabled"`
	MaxConcurrent int    `json:"max_concurrent"`
	SendMode      string `json:"send_mode"`
}

ProviderInstanceDTO is the static config of one instance.

type ProviderListItem added in v0.28.1

type ProviderListItem struct {
	Type string `json:"type"`
	Name string `json:"name"`
}

ProviderListItem is one selectable provider instance for the project defaults dropdown. The "type/name" pair is what Defaults.Provider stores; the SPA renders the value as "type/name" so a custom instance (e.g. claude/abc) is selectable, not just the base type.

type ProviderStatusDTO added in v0.19.0

type ProviderStatusDTO struct {
	Instance    ProviderInstanceDTO          `json:"instance"`
	Path        string                       `json:"path"`
	PathFound   bool                         `json:"path_found"`
	Version     string                       `json:"version"`
	VersionErr  string                       `json:"version_err,omitempty"`
	Probing     bool                         `json:"probing"`
	Hooks       map[string]HookCapabilityDTO `json:"hooks"`
	Cap         ProviderCapDTO               `json:"cap"`
	HookEnabled map[string]bool              `json:"hook_enabled"`
}

ProviderStatusDTO is one provider card's data: instance config + live status.

type ProvidersListResponse added in v0.19.0

type ProvidersListResponse struct {
	Providers     []ProviderStatusDTO `json:"providers"`
	Gate          GateStatusDTO       `json:"gate"`
	Spawns        []SpawnLogFileDTO   `json:"spawns"`
	MCPClients    MCPStatusDTO        `json:"mcp"`
	AutoRescan    bool                `json:"auto_rescan"`
	PoolActive    int                 `json:"pool_active"`
	PoolQueueLen  int                 `json:"pool_queue_len"`
	PoolMax       int                 `json:"pool_max"`
	LiveProcesses []LiveProcessDTO    `json:"live_processes"`
	SupportedKeys []string            `json:"supported_keys"`
}

ProvidersListResponse is the JSON envelope for GET /api/providers.

type RepoSummary added in v0.15.5

type RepoSummary struct {
	Rel     string `json:"rel"`
	Name    string `json:"name"`
	Branch  string `json:"branch"`
	Changed int    `json:"changed"`
	Ahead   int    `json:"ahead"`
	Behind  int    `json:"behind"`
}

RepoSummary is one repo in the /git/repos listing.

type Router9DetailDTO added in v0.28.1

type Router9DetailDTO struct {
	Supported bool              `json:"supported"`
	Enabled   bool              `json:"enabled"`
	Models    map[string]string `json:"models"`
	KeySet    bool              `json:"key_set"`
}

Router9DetailDTO carries the instance's current 9router settings so the detail page can seed its widget. The API key is never returned — only a flag indicating one is stored.

type SessionListItem added in v0.19.0

type SessionListItem struct {
	ID          string `json:"id"`
	Label       string `json:"label"`
	Status      string `json:"status"`
	ProjectID   string `json:"project_id"`
	ActiveAgent string `json:"active_agent"`
	CreatedAt   string `json:"created_at"`
	LastActive  string `json:"last_active"`
	Lifecycle   string `json:"lifecycle"`
	PID         int    `json:"pid,omitempty"`
}

SessionListItem is the JSON shape for one session in the /api/sessions list.

type SessionMetaDTO added in v0.19.0

type SessionMetaDTO struct {
	ID          string `json:"id"`
	Label       string `json:"label"`
	Status      string `json:"status"`
	ProjectID   string `json:"project_id"`
	ActiveAgent string `json:"active_agent"`
	TitleCustom bool   `json:"title_custom"`
	CreatedAt   string `json:"created_at"`
	LastActive  string `json:"last_active"`
}

SessionMetaDTO is the JSON shape returned by /api/sessions/{id}/meta.

type SkillDetailResponse added in v0.19.0

type SkillDetailResponse struct {
	Name        string          `json:"name"`
	IsDir       bool            `json:"is_dir"`
	Content     string          `json:"content,omitempty"`
	SourcePath  string          `json:"source_path,omitempty"`
	InDirs      []string        `json:"in_dirs"`
	Entries     []SkillListItem `json:"entries,omitempty"`
	MissingDirs []string        `json:"missing_dirs,omitempty"`
}

SkillDetailResponse is the envelope for GET /api/skills/{name}.

type SkillFileDetailResponse added in v0.19.0

type SkillFileDetailResponse struct {
	Name       string          `json:"name"`
	IsDir      bool            `json:"is_dir"`
	Content    string          `json:"content,omitempty"`
	SourcePath string          `json:"source_path,omitempty"`
	InDirs     []string        `json:"in_dirs"`
	Entries    []SkillListItem `json:"entries,omitempty"`
}

SkillFileDetailResponse is the envelope for GET /api/skills/{folder}/files/{file...}.

type SkillListItem added in v0.19.0

type SkillListItem struct {
	Name        string   `json:"name"`
	IsDir       bool     `json:"is_dir"`
	InDirs      []string `json:"in_dirs"`
	MissingDirs []string `json:"missing_dirs"`
}

SkillListItem is one row in GET /api/skills.

type SkillListResponse added in v0.19.0

type SkillListResponse struct {
	Dirs   []string        `json:"dirs"`
	Skills []SkillListItem `json:"skills"`
}

SkillListResponse is the envelope for GET /api/skills.

type SkillProviderEntryResponse added in v0.19.0

type SkillProviderEntryResponse struct {
	Provider     string          `json:"provider"`
	Path         string          `json:"path"`
	IsDir        bool            `json:"is_dir"`
	Content      string          `json:"content,omitempty"`
	SourcePath   string          `json:"source_path,omitempty"`
	Entries      []SkillListItem `json:"entries,omitempty"`
	AllProviders []string        `json:"all_providers"`
	HasFile      map[string]bool `json:"has_file,omitempty"`
}

SkillProviderEntryResponse is the envelope for GET /api/skills/{provider}/{path...}.

type SpawnDetailResponse added in v0.28.1

type SpawnDetailResponse struct {
	File           SpawnLogFileDTO   `json:"file"`
	Events         []SpawnEventDTO   `json:"events"`
	SessionDeleted bool              `json:"session_deleted"`
	Repro          map[string]string `json:"repro"`
	// HasResume is true when the spawn carried a --resume/resume id, so the
	// Keep/Fresh toggle is meaningful. False on a session's first spawn.
	HasResume bool `json:"has_resume"`
}

SpawnDetailResponse is the full spawn-log detail: metadata, the event timeline, whether the session was since deleted, and the MASKED reproduce commands keyed by view.ReproKey (shell-mode-path). Unmasked variants come from the separate reveal endpoint.

type SpawnEventDTO added in v0.28.1

type SpawnEventDTO struct {
	Type             string   `json:"type"`
	At               string   `json:"at"`
	ProviderType     string   `json:"provider_type,omitempty"`
	ProviderName     string   `json:"provider_name,omitempty"`
	AgentName        string   `json:"agent_name,omitempty"`
	Workspace        string   `json:"workspace,omitempty"`
	ResumeID         string   `json:"resume_id,omitempty"`
	Binary           string   `json:"binary,omitempty"`
	Args             []string `json:"args,omitempty"`
	Env              []string `json:"env,omitempty"`
	PID              int      `json:"pid,omitempty"`
	Origin           string   `json:"origin,omitempty"`
	FirstUserMessage string   `json:"first_user_message,omitempty"`
	ExitReason       string   `json:"exit_reason,omitempty"`
	DurationMs       int64    `json:"duration_ms,omitempty"`
	Error            string   `json:"error,omitempty"`
	Message          string   `json:"message,omitempty"`
}

SpawnEventDTO is one event line from a spawn log's timeline.

type SpawnLogFileDTO added in v0.19.0

type SpawnLogFileDTO struct {
	Path             string `json:"path"`
	ProviderType     string `json:"provider_type"`
	ProviderName     string `json:"provider_name"`
	SessionID        string `json:"session_id"`
	StartedAt        string `json:"started_at"`
	PID              int    `json:"pid,omitempty"`
	Origin           string `json:"origin,omitempty"`
	FirstUserMessage string `json:"first_user_message,omitempty"`
	Binary           string `json:"binary,omitempty"`
	ExitReason       string `json:"exit_reason,omitempty"`
}

SpawnLogFileDTO is a parsed spawn log file entry.

type StorageFileDTO added in v0.19.0

type StorageFileDTO struct {
	ID            uint   `json:"id"`
	ProviderType  string `json:"provider_type"`
	InstanceName  string `json:"instance_name"`
	RelPath       string `json:"rel_path"`
	Name          string `json:"name"`
	IsDir         bool   `json:"is_dir"`
	Size          int    `json:"size"`
	SyncedAt      string `json:"synced_at"`
	RetentionDays int    `json:"retention_days"`
}

StorageFileDTO is one storage file row (without the binary content blob).

type StorageFileVM added in v0.11.0

type StorageFileVM struct {
	entity.ProviderStorage
	SyncedAtFmt string
}

StorageFileVM is the view model for one file row in the storage table.

type StoragePageVM added in v0.11.0

type StoragePageVM struct {
	Base           string
	Files          []StorageFileVM
	FilterProvider string
	FilterInstance string
	ProviderTypes  []string
}

StoragePageVM is the view model for the storage manager page.

type StorageResponse added in v0.19.0

type StorageResponse struct {
	Files          []StorageFileDTO `json:"files"`
	FilterProvider string           `json:"filter_provider,omitempty"`
	FilterInstance string           `json:"filter_instance,omitempty"`
	ProviderTypes  []string         `json:"provider_types"`
}

StorageResponse is the JSON envelope for GET /api/providers/storage.

type TestCaseItem added in v0.14.20

type TestCaseItem struct {
	Name   string
	Case   wftest.Case
	Result *wftest.Result
}

TestCaseItem pairs an on-disk test case with its last-run result for the spa test panel handlers.

Directories

Path Synopsis
Package router9 manages the embedded 9router dashboard.
Package router9 manages the embedded 9router dashboard.
templ: version: v0.3.1020
templ: version: v0.3.1020
workflow
templ: version: v0.3.1020
templ: version: v0.3.1020

Jump to

Keyboard shortcuts

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