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 ¶
- Variables
- func AutoInstallMCP()
- func Register(r tool.Router)
- func Router9APIProxy() http.Handler
- func Router9Autostart()
- func Router9AutostartEnabled() bool
- func Router9Enabled() bool
- func Router9ExternalAPIEnabled() bool
- func Router9MountPrefix() string
- func Router9NextAssetProxy() http.Handler
- func Router9RootProxy() http.Handler
- func SetApprovals(m *gate.ApprovalManager)
- func SetAskUsers(m *askuser.Manager)
- func SetAuth(a *login.Service)
- func SetBroadcaster(b *Broadcaster)
- func SetChannelRegistry(r *agentchannels.Registry)
- func SetConfigs(c *configs.Service)
- func SetConnectors(c *connectors.Service)
- func SetDB(db *gorm.DB)
- func SetDataTables(s datatable.Service)
- func SetGateStatus(s GateStatus)
- func SetLayout(l agentconfig.Layout)
- func SetManager(m *registry.Manager)
- func SetPool(p *pool.Pool)
- func SetSkillStore(s *skills.Store)
- func SetSpawnLogger(s *provider.SpawnLogger)
- func SetSyncManager(m *providersync.Manager)
- func SetTagsService(svc *tags.Service)
- func SetWorkflowEncService(s *enc.Service)
- func SetWorkflowManager(m *setup.Manager)
- func WorkflowEventHook(b *Broadcaster) func(id, runID string, ev wf.RunEvent)
- func WorkflowSSESession(id string) string
- type Broadcaster
- func (b *Broadcaster) Publish(sessionID, agentName string, ev event.AgentEvent)
- func (b *Broadcaster) PublishApprovalRequest(sessionID string, req gate.ApprovalRequest)
- func (b *Broadcaster) PublishApprovalResolved(sessionID, requestID, decision string)
- func (b *Broadcaster) PublishAskUser(sessionID, agentName string, payload []byte)
- func (b *Broadcaster) PublishAskUserResolved(sessionID, requestID string)
- func (b *Broadcaster) PublishGitStatusJSON(sessionID, jsonPayload string)
- func (b *Broadcaster) PublishLifecycle(ctx context.Context, sessionID, agentName, lifecycle, provider string, pid int)
- func (b *Broadcaster) PublishPoolStats(active, max, queueLen int, procs []LiveProcessEntry)
- func (b *Broadcaster) PublishRaw(sessionID, agentName, evType, data string)
- func (b *Broadcaster) PublishSessionMeta(sessionID, title string, titleCustom bool, status string)
- func (b *Broadcaster) PublishSystemTurn(sessionID, agentName, text string, steps []string)
- func (b *Broadcaster) Subscribe(sessionID string) (<-chan Event, func())
- type ConfigFieldDTO
- type Event
- type GateStatus
- type GateStatusDTO
- type GitStatusSnapshot
- type HookCapabilityDTO
- type LiveProcessDTO
- type LiveProcessEntry
- type MCPClientDTO
- type MCPStatusDTO
- type OverviewActiveDTO
- type OverviewDTO
- type OverviewQueuedDTO
- type OverviewStatsDTO
- type PoolStatsPayload
- type PresetDetailResponse
- type PresetListItem
- type PresetListResponse
- type ProjectPinnedSession
- type ProjectSettingsResponse
- type ProviderCapDTO
- type ProviderDetailResponse
- type ProviderInstanceDTO
- type ProviderListItem
- type ProviderStatusDTO
- type ProvidersListResponse
- type RepoSummary
- type Router9DetailDTO
- type SessionListItem
- type SessionMetaDTO
- type SkillDetailResponse
- type SkillFileDetailResponse
- type SkillListItem
- type SkillListResponse
- type SkillProviderEntryResponse
- type SpawnDetailResponse
- type SpawnEventDTO
- type SpawnLogFileDTO
- type StorageFileDTO
- type StorageFileVM
- type StoragePageVM
- type StorageResponse
- type TestCaseItem
Constants ¶
This section is empty.
Variables ¶
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 Router9APIProxy ¶ added in v0.28.1
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
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
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 ¶
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
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 ¶
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 ¶
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
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 ¶
SetManager wires in the agents registry manager.
func SetSkillStore ¶ added in v0.17.0
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
SetTagsService wires the tags service for skill ownership checks.
func SetWorkflowEncService ¶ added in v0.16.0
SetWorkflowEncService wires the cipher used by the env save handler.
func SetWorkflowManager ¶ added in v0.13.0
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
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) 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.
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
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
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"`
IsDefault bool `json:"is_default"`
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
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.
Source Files
¶
- api_conversation.go
- api_overview.go
- api_presets.go
- api_projects.go
- api_providers.go
- api_skills.go
- approvals.go
- artifacts.go
- askuser_handler.go
- channels_handler.go
- context.go
- datatables.go
- handler.go
- providers.go
- router9.go
- scm.go
- scm_watch.go
- service.go
- session_workspace_handler.go
- skills.go
- spa.go
- spa_handler.go
- spa_palette.go
- spa_workflow_history.go
- spa_workflow_panels.go
- spa_workflows.go
- storage.go
- stream.go
- uploads.go
- workflows.go