Skip to main content

Capabilities and integrations tables

Seven capability-catalog tables: admin catalogs (skills/prompts/mcp_servers/image_styles) plus private user copies (user_skills/user_prompts/user_mcp_servers). Sandbox session state is not in the database — it lives in the sidecar's memory, with /workspace archived to object storage keyed by conversation id (see Sandbox overview) (notation per the overview).

skills — admin skill catalog

An Agent Skill = instructions + asset bundle. 10 columns.

ColumnTypeNullableDefaultNotes
idTEXTno (PK)sk_ + 12 hex chars
nameTEXTnoskill name; lower(trim(name)) unique (duplicates merged during migration by dedupeSkillNames)
descriptionTEXTnomodel-visible trigger metadata (decides when the skill activates)
display_descriptionTEXTno''catalog-only copy, separated from trigger meaning
iconTEXTno''icon
instructionsTEXTnoskill body (injected into model context)
assetsTEXT (JSON)no'[]'bundled asset manifest (admin-only — user copies have no such column, see below)
enabledINTEGERno1listed flag
sort_orderINTEGERno0ordering
updated_atINTEGER → BIGINTnonow()update time
  • Incoming: model_skills.skill_id (CASCADE), user_skills.source_skill_id (SET NULL).

prompts — admin prompt templates

8 columns.

ColumnTypeNullableDefaultNotes
idTEXTno (PK)pt_ + 12 hex chars
nameTEXTnoname; lower(trim(name)) unique
descriptionTEXTno''description
iconTEXTno''icon
contentTEXTnotemplate body (copied into user_prompts; the public catalog exposes only name/description/icon)
enabledINTEGERno1listed flag
sort_orderINTEGERno0ordering
updated_atINTEGER → BIGINTnonow()update time
  • Incoming: user_prompts.source_prompt_id (SET NULL).

user_skills — private user skills

Private copies of admin skills or user-authored ones. 10 columns. Deliberately no assets/storage columns — private skills are instruction-only and can never stage files into the sandbox (a security boundary).

ColumnTypeNullableDefaultNotes
idTEXTno (PK)usk_ + 12 hex chars
user_idTEXTnoFK→users(id), CASCADE
workspace_idTEXTno''soft reference; '' = personal library, non-empty = shared inside that workspace
nameTEXTnoname (uniqueness split into two partial indexes by scope, see below)
descriptionTEXTnotrigger description
iconTEXTno''icon
instructionsTEXTnobody
source_skill_idTEXTyesNULLFK→skills(id), SET NULL — provenance "copied from catalog"
created_atINTEGER → BIGINTnonow()creation time
updated_atINTEGER → BIGINTnonow()update time
  • Indexes (all created during migration, store.go:598-607): idx_user_skills_user(user_id, updated_at DESC), idx_user_skills_workspace(workspace_id, updated_at DESC); name uniqueness per scope — personal rows (user_id, lower(trim(name))) WHERE workspace_id='', workspace rows (workspace_id, lower(trim(name))) WHERE workspace_id<>''; plus two per-scope source-uniqueness partial indexes preventing duplicate catalog copies.

user_prompts — private user prompts

9 columns; same scoping model as user_skills.

ColumnTypeNullableDefaultNotes
idTEXTno (PK)upm_ + 12 hex chars
user_idTEXTnoFK→users(id), CASCADE
workspace_idTEXTno'''' = personal, non-empty = workspace-shared
nameTEXTnoname (unique per scope)
descriptionTEXTno''description
contentTEXTnobody
source_prompt_idTEXTyesNULLFK→prompts(id), SET NULL
created_atINTEGER → BIGINTnonow()creation time
updated_atINTEGER → BIGINTnonow()update time
  • Indexes: same pattern as user_skills ((user_id, updated_at DESC), (workspace_id, updated_at DESC) + per-scope name/source partial unique indexes, store.go:600-611).

mcp_servers — admin MCP servers

Streamable-HTTP MCP endpoints. 13 columns.

ColumnTypeNullableDefaultNotes
idTEXTno (PK)mcp_ + 12 hex chars
nameTEXTnoservice name; lower(trim(name)) unique
iconTEXTno''icon
descriptionTEXTno''description
urlTEXTnoStreamable-HTTP endpoint
headersTEXT (JSON)no'{}'request headers — may contain credentials: stored plaintext, masked by the API
enabledINTEGERno0off by default (new rows start disabled; enable explicitly)
discovered_toolsTEXT (JSON)no'[]'last successful tools/list snapshot — the runtime registry reads this, not a live fetch
protocol_versionTEXTno''negotiated MCP protocol version
last_errorTEXTno''last sync failure detail
last_synced_atINTEGER → BIGINTno0last successful sync
created_atINTEGER → BIGINTnonow()creation time
updated_atINTEGER → BIGINTnonow()update time
  • Indexes: name UNIQUE, idx_mcp_servers_enabled(enabled, name).
  • Incoming: models.mcp_server_ids (JSON id array, soft), workspace_policies.allowed_mcp_server_ids (soft).

user_mcp_servers — user-level MCP (resource library)

Mirrors the mcp_servers snapshot/masking contract plus the user_skills scoping columns. 15 columns.

ColumnTypeNullableDefaultNotes
idTEXTno (PK)umcp_ + 12 hex chars
user_idTEXTnoFK→users(id), CASCADE
workspace_idTEXTno'''' = personal library, non-empty = workspace-shared
nameTEXTnoname (partial unique per scope, store.go:614-615)
iconTEXTno''icon
descriptionTEXTno''description
urlTEXTnoendpoint
headersTEXT (JSON)no'{}'may carry credentials; plaintext in DB, masked by the API
enabledINTEGERno0off by default
discovered_toolsTEXT (JSON)no'[]'sync snapshot (same contract as mcp_servers)
protocol_versionTEXTno''protocol version
last_errorTEXTno''last failure
last_synced_atINTEGER → BIGINTno0last successful sync
created_atINTEGER → BIGINTnonow()creation time
updated_atINTEGER → BIGINTnonow()update time
  • Indexes: (user_id, updated_at DESC), (workspace_id, updated_at DESC) + the two scope-split name uniqueness partial indexes.

image_styles — image studio styles

§4.20 Image Generation Studio presets. 8 columns.

ColumnTypeNullableDefaultNotes
idTEXTno (PK)imgsty_ + 12 hex chars
nameTEXTnostyle name; lower(trim(name)) unique
example_image_urlTEXTno''example thumbnail URL
hidden_promptTEXTno''hidden prompt: composed server-side and NEVER returned to non-admin users
enabledINTEGERno1selectable flag
sort_orderINTEGERno0ordering
created_atINTEGER → BIGINTnonow()creation time
updated_atINTEGER → BIGINTnonow()update time
  • Indexes: idx_image_styles_sort(sort_order), name UNIQUE.