Knowledge Pack Files
SideButton Marketing Website Knowledge Pack Files
Browse the source files that power the SideButton Marketing Website MCP server knowledge pack.
sidebutton install sidebutton.com What This Is
Settings page for Fleet Control -- a multi-tab configuration interface for managing the fleet. Seven tabs: General (LLM provider, model, API key, effort level), Agents (per-agent config with roles, entry paths, env vars, RDP downloads, avatar picker, danger zone), Assistant (chat bot name, persona prompt, avatar URL), Issue Tracking (Jira credentials, webhook URL, deploy/test webhook), Slack (channel connections with bot token setup and live testing), Knowledge Packs (default pack status, ZIP upload, workflow list), and Logs (incoming webhook event history with MATCH/SKIP status, pagination, and matched-only filter). All tabs have editable forms with save feedback. Tabs are deep-linkable via URL query parameter.
URL Patterns
| Pattern | Description |
|---|---|
/portal/settings | Settings page (General tab default) |
/portal/settings?tab=general | General tab (explicit) |
/portal/settings?tab=agents | Agents tab |
/portal/settings?tab=assistant | Assistant tab |
/portal/settings?tab=integrations | Issue Tracking tab |
/portal/settings?tab=slack | Slack tab |
/portal/settings?tab=knowledge-packs | Knowledge Packs tab |
/portal/settings?tab=logs | Logs tab (was ?tab=webhook-logs) |
Page Structure
+--[Sidebar]--+--[Main Content]------------------------------------------------------------------+
| | H1: "Settings" |
| Settings | |
| (active) | [Tab Bar: General | Agents | Assistant | Issue Tracking | Slack | Knowledge Packs | Logs] |
| | (horizontal scrollbar when narrow viewport) |
| | |
| | [Tab Content -- varies by active tab] |
+-------------+-----------------------------------------------------------------------------------+
General Tab
| LLM Provider [dropdown] Model [text input] |
| API Key [password input] |
| "API key is configured" (green) or "Platform key |
| active — add your own to override" |
| Default Effort Level: [Max] [High] [Medium] toggles |
| "Max / High = Opus, Medium = Sonnet..." |
| [Save] button [status: Saving.../Saved/error] |
Agents Tab
| "Manage agent roles, entry paths, environment config, |
| and download RDP shortcuts." |
| |
| [Owned Agent Card] |
| [Set avatar] display-name [✏ Rename] |
| hostname ONLINE [SE][QA][SD][PM] |
| Shared with N account(s) [Default v] [RDP] |
| [Expanded Config Panel] |
| Entry Paths: |
| [x] ~/workspace "Main" [MCP JSON] [Remove] |
| [+ Add Entry Path] |
| Environment Variables: |
| [textarea: ~/.agent-env content] |
| [Save] [Save & Apply] [status text] |
| Danger Zone: |
| [Reboot] [Delete] |
| |
| [Shared Agent Card] |
| [avatar] agent-name ONLINE "shared" [roles] |
| agent-name.agents.sidebutton.com [chevron v]|
| [Shared Preferences Panel] |
| Enabled Roles: [SE] [QA] [SD] [PM] checkboxes |
| Effort Level: [dropdown] |
| Enabled Entry Paths: [checkboxes per path] |
| [Save Preferences] [Remove Shared Agent] |
| |
| -- or (empty state) -- |
| "No agents registered yet" |
Assistant Tab
| Name [text input] |
| "The name your team sees in Slack messages" |
| Persona [textarea] |
| "System prompt that shapes the assistant's voice |
| and behavior" |
| Avatar URL [text input] |
| Active Role [dropdown] |
| "Skill pack role that shapes the assistant's |
| domain expertise" |
| [Save] button [status: Saving.../Saved/error] |
| |
| ───────────────────────────────────────────────── |
| |
| H3: "MCP Connections" |
| "Tool sources available to the chat assistant..." |
| |
| [● green] SideButton Cloud 7 tools [toggle] |
| "Agent dispatch, workflow execution..." |
| |
| [● grey] Jira / Atlassian [Configure] |
| "Search, create, edit, and transition..." |
Issue Tracking Tab
| H2: "Issue Tracking" |
| "Connect your issue tracker to enable automated |
| agent dispatching from ticket updates." |
| |
| [Jira Card] |
| [Jira icon] "Jira" |
| "Atlassian Jira Cloud" |
| |
| CREDENTIALS |
| Jira URL [text input] |
| Email [text input] |
| API Token [password input] |
| "API token is configured" (green, when set) |
| [Test Connection] [Save] [status text] |
| |
| WEBHOOK |
| "Configure this URL in your Jira webhook settings, |
| or click Deploy to register automatically." |
| Webhook URL [readonly input] [Copy] |
| [Test Webhook] [Deploy Webhook] |
| "View webhook logs >" (link to Logs tab) |
Slack Tab
| H2: "Connected Channels" |
| [status dot] #channel-name Team: T0123 [Remove] |
| -- or -- |
| "No channels connected yet." |
| |
| H2: "Add Channel" |
| Team ID [text] Channel ID [text] |
| Channel Name [text] |
| Bot Token [password] |
| Signing Secret [password] |
| Bot User ID [text] |
| [Add Channel] [Test Connection] |
| [test status: "Connected: {team} ({user})"] |
| |
| > Slack App Setup Guide (expandable) |
Knowledge Packs Tab
| H3: "Knowledge Pack" |
| [Status Card] |
| "Using SideButton Default Pack" |
| "Default workflows are available to all accounts. |
| Upload a custom pack below to add account-specific |
| workflows." |
| [Sync Now] [Remove] |
| |
| H3: "Upload Knowledge Pack" |
| Knowledge Pack ZIP [drag-drop zone] |
| "Drop a .zip file here or click to browse" |
| "Max 10MB. Must contain index.json at root." |
| Display Name [text input] |
| [Upload & Sync] (disabled until file selected) |
| |
| H3: "Loaded Workflows" |
| "Default workflows are available on the |
| Workflows page." (link) |
| -- or (when custom pack uploaded) -- |
| workflow-name [override|skill-pack badge] domain |
Logs Tab
| H2: "Webhooks" |
| "Incoming webhook events across all automations." |
| |
| [x] Matched only (checkbox filter) |
| |
| Time Status Event Automation Job |
| 4/2/2026 [SKIP] jira:issue_updated Auto Name — |
| 4/2/2026 [MATCH] jira:issue_updated Auto Name #2959 |
| ... |
| |
| 1–30 of 3769 [Prev] [Next] |
| |
| -- or (empty state) -- |
| "No webhook events recorded yet" |
Key Elements
Tab Bar
| Element | Selector / Ref | Notes |
|---|---|---|
| General tab | link "General" | Active by default, dark background when selected; URL adds ?tab=general |
| Agents tab | link "Agents" | URL adds ?tab=agents |
| Assistant tab | link "Assistant" | URL adds ?tab=assistant |
| Issue Tracking tab | link "Issue Tracking" | URL adds ?tab=integrations |
| Slack tab | link "Slack" | URL adds ?tab=slack |
| Knowledge Packs tab | link "Knowledge Packs" | URL adds ?tab=knowledge-packs |
| Logs tab | link "Logs" | 7th tab; URL adds ?tab=logs; was previously labeled "Webhook Logs" with ?tab=webhook-logs |
General Tab
| Element | Selector / Ref | Notes |
|---|---|---|
| LLM Provider dropdown | combobox labeled "LLM Provider" | Options: OpenAI (openai), Anthropic (anthropic), OpenRouter (openrouter) |
| Model input | textbox labeled "Model" | Text input, e.g. "gpt-5.4" |
| API Key input | textbox labeled "API Key" | Password field; placeholder varies by state |
| API key status (configured) | .text-emerald-400 | "API key is configured" |
| API key status (platform) | Text below input | "Platform key active — add your own to override" |
| Effort: Max button | button "Max" | Toggle; orange border/text when selected |
| Effort: High button | button "High" | Toggle; orange border/text when selected |
| Effort: Medium button | button "Medium" | Toggle; orange border/text when selected |
| Effort hint | Below buttons | "Max / High = Opus, Medium = Sonnet. Applied to all agent jobs unless overridden per agent." |
| Save button | button "Save" | Orange button |
| Save status | .text-slate-500 / .text-emerald-400 / .text-red-400 | "Saving..." then "Saved" or error message |
Issue Tracking Tab — Jira Credentials
| Element | Selector / Ref | Notes |
|---|---|---|
| Page heading | heading "Issue Tracking" | H2 |
| Subheading | heading "Jira" | With Jira icon and "Atlassian Jira Cloud" subtitle |
| Credentials heading | heading "Credentials" | Section label |
| Jira URL input | textbox labeled "Jira URL" | Placeholder "https://yourcompany.atlassian.net" |
| Email input | textbox labeled "Email" | Placeholder "[email protected]" |
| API Token input | textbox labeled "API Token" | Password field; placeholder "(configured — enter new to change)" when set, "ATATT3x..." otherwise |
| API token status | .text-emerald-400 | "API token is configured" (shown when token exists) |
| Test Connection button | button "Test Connection" | Outlined button; tests Jira API connectivity |
| Save button | button "Save" | Orange button; saves credentials |
| Status text | Below buttons | "Saving..." then "Saved" or error |
Issue Tracking Tab — Webhook
| Element | Selector / Ref | Notes |
|---|---|---|
| Webhook heading | heading "Webhook" | Section label |
| Webhook description | Text below heading | "Configure this URL in your Jira webhook settings, or click Deploy to register automatically." |
| Webhook URL input | textbox labeled "Webhook URL" | Readonly; value: https://sidebutton.com/api/webhooks/jira |
| Copy button | button "Copy" | Copies webhook URL to clipboard |
| Test Webhook button | button "Test Webhook" | Outlined button; sends test webhook |
| Deploy Webhook button | button "Deploy Webhook" | Orange button; auto-registers webhook in Jira (requires saved credentials) |
| View webhook logs link | link "View webhook logs" | Navigates to Logs tab |
Agents Tab — Card Header (per agent)
| Element | Selector / Ref | Notes |
|---|---|---|
| Description text | Below tab bar | "Manage agent roles, entry paths, environment config, and download RDP shortcuts." |
| Avatar button | button "Set avatar" (w-9 h-9, first in card) | Click opens avatar picker modal |
| Agent display name | Bold text in card | Editable display name, e.g. "dev-agent-1" |
| Rename agent button | button "Rename agent" (.agent-rename-btn) | Hover-to-reveal pencil icon; click makes name editable inline |
| Rename save button | .agent-rename-save | Emerald checkmark; saves new name |
| Rename cancel button | .agent-rename-cancel | Slate X; cancels rename |
| Agent hostname | Grey text below name | e.g. "venmate-agent-1" |
| Status badge | Badge in card | ONLINE (green) / BUSY (amber) / ERROR (red) / OFFLINE (gray) |
| Shared with text | span on owned agents | "Shared with N account(s)" — shows how many accounts share this agent |
| Shared badge | Light blue badge | "shared" — shown for non-owned agents |
| Role checkboxes (owned) | input[type="checkbox"] per role | SE, QA, SD, PM — toggles agent capabilities |
| Effort dropdown (owned) | select | Default (empty) / Max / High / Medium — direct PUT on change |
| RDP button | button "RDP" (.rdp-download-btn) | Opens RDP configuration modal |
| Expand chevron | button (chevron icon) | Toggles config panel open/closed |
| No agents text | "No agents registered yet" | Empty state when no agents exist |
Agents Tab — Owned Agent Config Panel (expanded)
| Element | Selector / Ref | Notes |
|---|---|---|
| Entry path active checkbox | input[type="checkbox"] per path | Toggle path active/inactive |
| Entry path input | input per path | Path value, e.g. "~/workspace" |
| Entry path label input | input per path | Label, e.g. "Main" |
| Entry path MCP JSON textarea | textarea per path (3 rows) | JSON config for MCP servers on this path |
| Remove entry path button | button per path | Removes this entry path |
| Add Entry Path button | button "+ Add Entry Path" | Appends new empty entry path |
| Environment variables textarea | textarea (4 rows) | ~/.agent-env content; supports ANTHROPIC_API_KEY, GH_TOKEN, etc. |
| Save button | button "Save" | Slate button — saves config to DB only |
| Save & Apply button | button "Save & Apply" | Orange button — saves + pushes config to agent VM |
| Config status text | Below buttons | Shows result of last save/apply operation |
| Applied timestamp | Below status | "Applied at: {ISO timestamp}" |
| Reboot button | button "Reboot" (amber) | Danger zone — shows confirmation alert, POST to reboot |
| Delete button | button "Delete" (red) | Danger zone — shows confirmation alert, deletes agent |
Agents Tab — Shared Agent Preferences Panel (expanded)
| Element | Selector / Ref | Notes |
|---|---|---|
| Enabled Roles checkboxes | input[type="checkbox"] per capability | Select which roles your account can use; unchecking all = enable all |
| Effort Level dropdown | select | Default / Max / High / Medium; shows agent's default in label |
| Enabled Entry Paths checkboxes | input[type="checkbox"] per active path | Select which entry paths your account can use |
| Save Preferences button | button "Save Preferences" | Sky-blue (sky-500) button |
| Remove Shared Agent button | button (red) | Removes shared agent from your account |
Avatar Picker Modal (heading: "Set Agent Avatar")
| Element | Selector / Ref | Notes |
|---|---|---|
| Modal heading | heading "Set Agent Avatar" | H3 |
| Preset avatar grid | 10 avatar buttons in grid | Click to select preset (supportbot, bot-blue, opshub, bot-orange, sidebutton, bot-teal, aictpo, bot-red, talentflow, bot-cyan) |
| Upload file input | input[type="file"] | Max 1 MB; accepts JPEG, PNG, GIF, WebP, SVG |
| Remove Avatar button | button "Remove avatar (use default)" | Sets avatar to null (default SVG) |
| Cancel button | button "Cancel" | Closes modal without changes |
| Modal status text | Below grid | "Saving..." then "Saved" or error (e.g. "File too large") |
RDP Download Modal (heading: "Download RDP Shortcut")
| Element | Selector / Ref | Notes |
|---|---|---|
| Modal heading | heading "Download RDP Shortcut" | H3 |
| Display Mode: Fullscreen | radio | Disables resolution options when selected |
| Display Mode: Windowed | radio | Enables resolution options |
| Resolution: 1280x800 | radio | Disabled if fullscreen |
| Resolution: 1440x900 | radio | Default selection |
| Resolution: 1920x1080 | radio | Disabled if fullscreen |
| Save Credentials checkbox | checkbox#rdp-save-password | "Save credentials Embed password in RDP file" |
| Platform: Windows | radio | Default; generates standard .rdp |
| Platform: macOS | radio | Hint: "Requires Microsoft Remote Desktop from App Store" |
| Platform: Linux | radio | Hint: "Open with Remmina, xfreerdp..." |
| Cancel button | button "Cancel" | Closes modal |
| Copy password button | button "Copy password" | Copies agent RDP password to clipboard |
| Download button | button "Download" | Generates and downloads {agentName}.rdp file |
Assistant Tab
| Element | Selector / Ref | Notes |
|---|---|---|
| Name input | textbox labeled "Name" | Placeholder "e.g. Atlas", max 100 chars |
| Name hint | Below input | "The name your team sees in Slack messages" |
| Persona textarea | textbox labeled "Persona" (4 rows) | System prompt text, placeholder "You are Atlas, a concise and helpful engineering assistant...", max 5000 chars |
| Persona hint | Below textarea | "System prompt that shapes the assistant's voice and behavior" |
| Avatar URL input | textbox labeled "Avatar URL" | Placeholder "https://...", max 500 chars |
| Active Role dropdown | select#active-role-select (name="active_role") | Options: No role (default), QA Engineer, Skill Discovery, Software Engineer, Product Manager, Social Media Manager, sales |
| Active Role hint | Below dropdown | "Skill pack role that shapes the assistant's domain expertise" |
| Save button | button "Save" | Orange button |
| Save status | .text-emerald-400 / .text-red-400 | "Saving..." then "Saved" or error |
Assistant Tab — MCP Connections
Below the persona form, separated by a divider line.
| Element | Selector / Ref | Notes |
|---|---|---|
| MCP Connections heading | heading "MCP Connections" | H3 (not H2), below divider |
| MCP description | Text below heading | "Tool sources available to the chat assistant, Slack bot, and MCP clients. Each connection provides tools the assistant can use." |
| SideButton Cloud card | Connection card | Green dot (active), "SideButton Cloud" title, "Agent dispatch, workflow execution, and fleet monitoring" description |
| SideButton Cloud tool count | Badge text | "7 tools" |
| SideButton Cloud toggle | checkbox | Orange toggle switch when enabled; controls whether chat assistant can use SideButton Cloud tools |
| Jira / Atlassian card | Connection card | Green dot when configured (grey when unconfigured), "Jira / Atlassian" title, "Search, create, edit, and transition Jira issues and Confluence pages" description |
| Jira tool count | Badge text | "60 tools" (when configured) |
| Jira toggle | checkbox (data-mcp-id="jira") | Orange toggle when enabled; only shown when Jira credentials are configured (otherwise shows "Configure" link to Issue Tracking tab) |
Slack Tab
| Element | Selector / Ref | Notes |
|---|---|---|
| Connected Channels heading | heading "Connected Channels" | H2 |
| Channel status dot | Emerald (active) or Gray (inactive) | Per connected channel |
| Channel name | #channel-name text | Falls back to channel ID if no name |
| Channel team ID | Small text | Shown per channel |
| Channel remove button | button per channel | DELETE endpoint; removes channel binding |
| No channels text | "No channels connected yet." | Empty state |
| Add Channel heading | heading "Add Channel" | H2 |
| Team ID input | textbox labeled "Team ID" | Placeholder "T0123ABC" |
| Channel ID input | textbox labeled "Channel ID" | Placeholder "C0123ABC" |
| Channel Name input | textbox labeled "Channel Name" | Placeholder "#engineering-agents" (optional) |
| Bot Token input | textbox labeled "Bot Token" | Password field; placeholder "xoxb-..." (required) |
| Signing Secret input | textbox labeled "Signing Secret" | Password field; placeholder "From Slack App settings" (required) |
| Bot User ID input | textbox labeled "Bot User ID" | Placeholder "U0123ABC (from auth.test)" (optional, auto-filled by Test) |
| Add Channel button | button "Add Channel" | Orange button |
| Test Connection button | button "Test Connection" | Outlined button; calls Slack auth.test API directly |
| Test status text | Below buttons | "Testing..." then "Connected: {team} ({user})" or "Slack error: {error}" |
| Setup Guide | details > summary "Slack App Setup Guide" | Expandable 7-step guide |
Slack App Setup Guide (expanded content)
- Go to
api.slack.com/appsand create a new app - Under OAuth & Permissions, add bot scopes:
chat:write,reactions:write,users:read - Install the app to workspace, copy Bot User OAuth Token (starts with
xoxb-) - Under Basic Information, copy the Signing Secret
- Under Event Subscriptions, enable events, set Request URL to:
https://sidebutton.com/api/slack/events - Subscribe to bot events:
message.channels,message.groups - Invite the bot to your channel, then add channel details in the form above
Knowledge Packs Tab — Default Pack Status
| Element | Selector / Ref | Notes |
|---|---|---|
| Knowledge Pack heading | heading "Knowledge Pack" | H3 |
| Default pack label | "Using SideButton Default Pack" | Status card with icon |
| Default pack description | Below label | "Default workflows are available to all accounts. Upload a custom pack below to add account-specific workflows." |
| Sync Now button | button "Sync Now" | Refreshes pack workflows from upstream (was "Pull Updates") |
| Remove button | button "Remove" | Removes the knowledge pack; shows confirmation dialog |
Knowledge Packs Tab — Upload Form
| Element | Selector / Ref | Notes |
|---|---|---|
| Upload heading | heading "Upload Knowledge Pack" | H3 |
| ZIP file drop zone | textbox labeled "Knowledge Pack ZIP" | Drag-and-drop area: "Drop a .zip file here or click to browse"; max 10MB; must contain index.json at root |
| Display Name input | textbox labeled "Display Name" | Placeholder "My Knowledge Pack" |
| Upload & Sync button | button "Upload & Sync" | Orange; disabled until file selected; uploads ZIP and syncs workflows |
Knowledge Packs Tab — Loaded Workflows
| Element | Selector / Ref | Notes |
|---|---|---|
| Loaded Workflows heading | heading "Loaded Workflows" | H3 |
| Default workflows text | "Default workflows are available on the Workflows page." | Shown when using default pack only |
| Workflows page link | link "Workflows page" | Links to /portal/workflows |
| Workflow card | Per workflow (when custom pack uploaded) | Name (monospace, truncated), source badge, domain text |
| Source badge: override | Orange badge | override — account-level override workflow |
| Source badge: skill-pack | Gray badge | skill-pack — from uploaded pack |
Logs Tab
| Element | Selector / Ref | Notes |
|---|---|---|
| Section heading | heading "Webhooks" | H2 |
| Section description | Text below heading | "Incoming webhook events across all automations." |
| Matched only checkbox | checkbox / #wh-logs-matched-only | Filters to show only matched (dispatched) events |
| Log table | table in .bg-slate-900/60 container | 5-column table with border and rounded corners |
| Column: Time | th "Time" | Timestamp in locale format (e.g. "4/2/2026, 2:13:05 PM") |
| Column: Status | th "Status" | MATCH or SKIP badge |
| Column: Event | th "Event" | Formatted event summary (truncated at 280px) |
| Column: Automation | th "Automation" | Automation name that evaluated this event |
| Column: Job | th "Job" | Job link #N or "—" dash |
| MATCH badge | span.text-emerald-400 | Green badge: "MATCH" — event matched automation criteria and dispatched a job |
| SKIP badge | span.text-slate-500 | Grey badge: "SKIP" — event was evaluated but did not match |
| Job link | a (sky-400 text) | Links to /portal/jobs/{id} for matched events |
| Pagination container | #wh-logs-pagination | Shows when total > 30 items; hidden otherwise |
| Pagination info | #wh-logs-info | "N–M of Total" (e.g. "1–30 of 3769") |
| Prev button | button "Prev" / #wh-logs-prev | Disabled on first page (opacity-30) |
| Next button | button "Next" / #wh-logs-next | Disabled on last page |
| Loading state | td (colspan=5) | "Loading..." centered text |
| Empty state | td (colspan=5) | "No webhook events recorded yet" centered text |
| Error state | td (colspan=5) | "Failed to load logs ({error})" in red-400 text |
Data Model
General Settings
| Field | Type | Description |
|---|---|---|
| llm_provider | string | LLM provider: "openai", "anthropic", or "openrouter" |
| model | string | Model identifier (e.g. "gpt-5.4") |
| api_key | string | API key (masked in UI, transmitted only when changed) |
| has_api_key | boolean | Read-only; true when key configured |
| default_effort | string | "max" / "high" / "medium" |
Jira Integration (Issue Tracking)
| Field | Type | Description |
|---|---|---|
| jira_url | string | Atlassian instance URL (e.g. "https://yourcompany.atlassian.net") |
| jira_email | string | Jira account email for API access |
| jira_api_token | string | Jira API token (masked in UI, transmitted only when changed) |
| has_jira_token | boolean | Read-only; true when token configured |
| webhook_url | string | Read-only; webhook endpoint: https://sidebutton.com/api/webhooks/jira |
Agent
| Field | Type | Description |
|---|---|---|
| display_name | string | Editable display name shown on card (e.g. "dev-agent-1") |
| name | string | Agent hostname/identifier |
| ip | string | Agent IP or DNS address |
| status | string | "online" / "busy" / "error" / "offline" |
| capabilities | string[] | Array of roles: ["se", "qa", "sd", "pm"] |
| effort_level | string? | Per-agent effort override: "max" / "high" / "medium" / null |
| agent_env | string | Environment variable content (~/.agent-env) |
| avatar_url | string? | Custom avatar URL or null for default |
| entry_paths | object[] | Array of {path, label, mcp_json, active} objects |
| is_shared | boolean | Whether agent is shared from another account |
Entry Path
| Field | Type | Description |
|---|---|---|
| path | string | Filesystem path (e.g. "~/workspace") |
| label | string | Display label |
| mcp_json | string | JSON config for MCP servers on this path |
| active | boolean | Whether this path is enabled |
Assistant Settings
| Field | Type | Description |
|---|---|---|
| name | string | Bot display name (max 100 chars) |
| persona | string | System prompt text (max 5000 chars) |
| avatar_url | string | Avatar image URL (max 500 chars) |
| active_role | string | Skill pack role: "" (No role), "qa", "sd", "se", "pm", "software-engineer", "product-manager", "sales", "smm" |
Slack Channel
| Field | Type | Description |
|---|---|---|
| team_id | string | Slack team/workspace ID (required) |
| channel_id | string | Slack channel ID (required) |
| channel_name | string | Channel display name (optional) |
| bot_token | string | Slack bot token xoxb-... (required, masked in responses) |
| signing_secret | string | Slack signing secret (required, masked in responses) |
| bot_user_id | string | Bot user ID (optional, auto-filled by Test Connection) |
| is_active | boolean | Whether channel is active |
MCP Connection
| Field | Type | Description |
|---|---|---|
| name | string | Connection display name (e.g. "SideButton Cloud", "Jira / Atlassian") |
| description | string | What tools the connection provides |
| tool_count | number | Number of tools available (e.g. 7) |
| enabled | boolean | Whether connection is active (toggle state) |
| status | string | "active" (green dot) / "inactive" (grey dot) |
| configure_url | string | Tab to navigate to for setup (e.g. Issue Tracking for Jira) |
Knowledge Pack
| Field | Type | Description |
|---|---|---|
| name | string | Display name for the pack |
| type | string | "default" (SideButton built-in) or "custom" (uploaded ZIP) |
| zip_file | file | ZIP archive; max 10MB; must contain index.json at root |
Webhook Log Entry
| Field | Type | Description |
|---|---|---|
| id | number | Log entry ID |
| automation_id | number | ID of the automation that evaluated this event |
| automation_name | string | Display name of the automation |
| trigger_event | object | JSON event payload (webhookEvent, issueKey, projectKey, issueType, assignee, status for Jira; eventType, workflowSlug, agentName for SideButton; type, schedule for cron) |
| matched | boolean | Whether the event matched the automation criteria |
| dispatched_job_id | number? | Job ID if a job was dispatched (null for SKIP events) |
| created_at | string (datetime) | When the event was received |
States & Variations
| State | Trigger | Visual Indicator |
|---|---|---|
| General tab active | Default or click General | Dark tab background; URL ?tab=general |
| Agents tab active | Click Agents | Dark tab background; URL ?tab=agents |
| Assistant tab active | Click Assistant | Dark tab background; URL ?tab=assistant |
| Issue Tracking tab active | Click Issue Tracking | Dark tab background; URL ?tab=integrations |
| Slack tab active | Click Slack | Dark tab background; URL ?tab=slack |
| Knowledge Packs tab active | Click Knowledge Packs | Dark tab background; URL ?tab=knowledge-packs |
| Logs tab active | Click Logs | Dark tab background; URL ?tab=logs |
| API key configured | Key exists | Green "API key is configured" text |
| API key missing (platform) | No user key, platform key active | "Platform key active — add your own to override" |
| Effort: selected | Click effort button | Selected button has orange border/text (orange-500/20 bg, orange-400 text, orange-500/50 border) |
| Effort: unselected | Other buttons | Dark background (slate-800), slate-400 text |
| Save: Saving | Click Save | "Saving..." in slate-500 text |
| Save: Success | API returns OK | "Saved" in emerald-400 text |
| Save: Error | API returns error | Error message in red-400 text |
| Jira token configured | Token exists | Green "API token is configured" text below API Token field |
| Jira test: success | Valid credentials | Success message with connection details |
| Jira test: error | Invalid credentials | Error message in red |
| Webhook deploy: success | Click Deploy Webhook | Success status after auto-registering webhook in Jira |
| Agent online | Agent connected | Green "ONLINE" badge |
| Agent busy | Agent running job | Amber "BUSY" badge |
| Agent error | Agent in error state | Red "ERROR" badge |
| Agent offline | Agent disconnected | Gray "OFFLINE" badge |
| No agents | No agents registered | "No agents registered yet" text |
| Agent card collapsed | Default | Only header row visible |
| Agent card expanded | Click chevron | Config panel visible below card |
| Agent effort changed | Change dropdown | Border flash green (success) or red (error) |
| Agent role toggled | Click role checkbox | Label style updates, outline flash |
| Agent rename active | Hover → click Rename | Name field becomes editable inline; save/cancel buttons appear |
| Avatar modal open | Click "Set avatar" | Modal overlay with heading "Set Agent Avatar", preset grid + upload |
| RDP modal open | Click "RDP" | Modal with heading "Download RDP Shortcut", display/resolution/platform options, Copy password/Cancel/Download buttons |
| Shared agent card | Non-owned agent | Sky-blue accents, "shared" badge, preferences panel instead of config |
| No Slack channels | No channels configured | "No channels connected yet." text |
| Channels connected | Channels exist | Channel list with status dots above "Add Channel" form |
| Slack test: testing | Click "Test Connection" | "Testing..." text |
| Slack test: success | Valid token | "Connected: {team} ({user})" — auto-fills bot_user_id |
| Slack test: error | Invalid token | "Slack error: {message}" |
| Slack duplicate channel | Add existing channel | Error 409: "This Slack channel is already connected" |
| MCP: SideButton Cloud enabled | Toggle on | Green dot, orange toggle, "7 tools" badge |
| MCP: SideButton Cloud disabled | Toggle off | Grey dot, slate toggle |
| MCP: Jira unconfigured | No Jira credentials | Grey dot, "Configure" link (goes to Issue Tracking tab); no toggle or tool count shown |
| MCP: Jira configured | Jira credentials saved | Green dot, "60 tools" badge, orange toggle switch |
| Default pack active | No custom pack uploaded | Status card: "Using SideButton Default Pack" with Sync Now and Remove buttons |
| Upload & Sync disabled | No file selected | Button grayed out |
| Upload & Sync enabled | ZIP file selected | Button becomes orange/clickable |
| Workflows: default only | Default pack | "Default workflows are available on the Workflows page." with link |
| Workflows: custom loaded | Custom pack synced | Workflow list with name/source/domain per item |
| Logs: loading | Tab first opened | "Loading..." in table (client-side fetch) |
| Logs: with data | Webhook events exist | Table rows with Time/Status/Event/Automation/Job columns |
| Logs: empty | No webhook events | "No webhook events recorded yet" centered in table |
| Logs: error | API fetch fails | "Failed to load logs ({error})" in red text |
| Logs: matched filter | "Matched only" checked | Only MATCH rows shown; resets pagination to page 1 |
| Logs: pagination | Total > 30 events | Pagination bar visible with "N–M of Total" + Prev/Next buttons |
| Logs: first page | Offset = 0 | Prev button disabled (opacity-30) |
| Logs: last page | Offset + 30 >= total | Next button disabled |
Common Tasks
1. Configure LLM provider
- Go to Settings > General tab
- Select LLM Provider from dropdown
- Enter Model name
- Enter API Key (or leave blank to keep existing)
- Click Save
- Verify "Saved" status text appears in green
2. Set default effort level
- Go to Settings > General tab
- Click Max, High, or Medium button
- Click Save
- Verify button styling updates and "Saved" appears
3. Configure Jira integration
- Go to Settings > Issue Tracking tab
- Enter Jira URL (e.g. "https://yourcompany.atlassian.net")
- Enter Email (your Jira account email)
- Enter API Token (from Jira account settings)
- Click "Test Connection" to verify credentials
- Click Save
- Verify "Saved" and "API token is configured" text
4. Deploy Jira webhook
- Go to Settings > Issue Tracking tab (requires saved Jira credentials)
- In the Webhook section, click "Deploy Webhook"
- Webhook auto-registers in Jira pointing to
https://sidebutton.com/api/webhooks/jira - Alternatively, copy the URL and configure manually in Jira
5. Rename an agent
- Go to Settings > Agents tab
- Hover over the agent card to reveal the pencil icon (Rename button)
- Click the Rename button — the name becomes an editable text field
- Type the new display name
- Click the emerald checkmark to save, or the slate X to cancel
- Name updates immediately on the card
6. Change agent avatar
- Go to Settings > Agents tab
- Click the "Set avatar" button (small square) on the agent card
- In the modal ("Set Agent Avatar"), either click a preset avatar or upload a file (max 1 MB)
- Verify "Saved" status; click "Cancel" or click outside to close
7. Configure agent roles
- Go to Settings > Agents tab
- Click role checkboxes (SE/QA/SD/PM) on the agent card header
- Changes save immediately via PUT on each toggle (outline flash confirms)
8. Configure agent entry paths
- Go to Settings > Agents tab
- Click chevron to expand agent card
- Click "+ Add Entry Path" to add a new path
- Fill in Path (e.g. "~/workspace"), Label (e.g. "Main"), optionally MCP JSON
- Toggle active checkbox per path
- Click "Save" (DB only) or "Save & Apply" (DB + push to agent VM)
9. Set agent environment variables
- Go to Settings > Agents tab
- Click chevron to expand agent card
- Edit the environment variables textarea
- Click "Save & Apply" to push to agent
10. Download RDP connection
- Go to Settings > Agents tab
- Click "RDP" button for desired agent
- In the modal ("Download RDP Shortcut"), choose Display Mode (Fullscreen/Windowed), Resolution, Platform
- Optionally check "Save credentials" to embed password in RDP file
- Use "Copy password" to copy the RDP password to clipboard
- Click "Download" — browser downloads
{agentName}.rdpfile; or "Cancel" to close
11. Reboot an agent
- Go to Settings > Agents tab
- Click chevron to expand agent card
- In the Danger Zone, click "Reboot"
- Confirm in the alert dialog
- Agent status changes to offline; agent reboots on its side
12. Delete an agent
- Go to Settings > Agents tab
- Click chevron to expand agent card
- In the Danger Zone, click "Delete"
- Confirm in the alert dialog
13. Configure shared agent preferences
- Go to Settings > Agents tab
- Find a shared agent (sky-blue accent, "shared" badge)
- Click chevron to expand preferences panel
- Toggle Enabled Roles (unchecking all = enable all)
- Set Effort Level override
- Toggle Enabled Entry Paths
- Click "Save Preferences"
14. Configure assistant persona
- Go to Settings > Assistant tab
- Set Name (max 100 chars), Persona prompt (max 5000 chars), Avatar URL, and Active Role
- Click Save
- Verify "Saved" status appears
15. Set assistant active role
- Go to Settings > Assistant tab
- Select a role from the "Active Role" dropdown (No role, QA Engineer, Skill Discovery, Software Engineer, etc.)
- Click Save
- The selected role shapes the assistant's domain expertise in chat and Slack
16. Add Slack channel
- Go to Settings > Slack tab
- Fill in Team ID, Channel ID, Channel Name, Bot Token, Signing Secret
- Click "Test Connection" — verify "Connected: {team} ({user})" appears
- Bot User ID auto-fills if empty
- Click "Add Channel" to save
- Verify channel appears in Connected Channels list
17. Remove Slack channel
- Go to Settings > Slack tab
- Find the channel in Connected Channels list
- Click the Remove button next to the channel
18. Upload a knowledge pack
- Go to Settings > Knowledge Packs tab
- Drop or click to browse for a ZIP file (max 10MB, must contain
index.jsonat root) - Enter Display Name
- Click "Upload & Sync"
- Workflows from the pack appear in Loaded Workflows section
19. Sync knowledge pack
- Go to Settings > Knowledge Packs tab
- Click "Sync Now" on the pack card
- Workflows refresh from upstream
20. View webhook logs
- Go to Settings > Logs tab (or click "View webhook logs" link in Issue Tracking tab)
- Table loads automatically via client-side fetch (shows "Loading..." then data)
- View incoming webhook events with Time, Status (MATCH/SKIP), Event summary, Automation name, and linked Job
- Use "Matched only" checkbox to filter to events that dispatched jobs
- Use Prev/Next buttons to paginate (30 per page)
Tips
- The General tab effort level maps to Claude models: Max/High = Opus, Medium = Sonnet
- The Assistant persona is the system prompt used when the bot responds in Slack
- Jira configuration (URL, email, API token) is on the Issue Tracking tab, not General
- Agent display names are editable via the hover-to-reveal Rename button; the hostname below the name is the permanent identifier
- RDP files allow direct desktop access to agent VMs; the modal lets you customize resolution and platform; use "Copy password" to get the RDP password
- Tabs are deep-linkable via
?tab=query parameter — the URL updates when switching tabs - "Save" persists config to the database; "Save & Apply" also pushes the config to the agent VM — use Apply when you need the agent to pick up changes immediately
- Agent role checkboxes and effort dropdown save immediately on change — no explicit Save needed
- Shared agents show sky-blue accents; you can only change preferences (roles, effort, paths), not the agent config itself
- Test Connection on the Slack tab calls the Slack API directly from the browser and auto-fills the Bot User ID
- Deploy Webhook on the Issue Tracking tab auto-registers a Jira webhook — no manual Jira admin needed
- MCP Connections on the Assistant tab control which tool sources the chat assistant, Slack bot, and MCP clients can use
- SideButton Cloud connection provides 7 tools for agent dispatch, workflow execution, and fleet monitoring
- Jira / Atlassian connection requires Jira credentials from the Issue Tracking tab before it can be enabled
- Active Role on the Assistant tab sets the assistant's domain expertise; options are populated from installed knowledge pack roles
- Knowledge Packs now use ZIP upload instead of local path attachment; "Sync Now" (was "Pull Updates") refreshes workflows
Gotchas
- Seven tabs: General, Agents, Assistant, Issue Tracking, Slack, Knowledge Packs, Logs; tab bar may scroll horizontally in narrow viewports
- Tab label renamed: The 7th tab is now "Logs" (was "Webhook Logs"); URL param is
?tab=logs(was?tab=webhook-logs) - Tab URL param: Issue Tracking tab uses
?tab=integrations(not?tab=issue-tracking) — the param name doesn't match the visible label - Jira moved out of General: Jira URL, email, and API token are now on the Issue Tracking tab, not the General tab — old references to "General > Jira URL" are outdated
- API key masking: The API Key field shows "(configured — enter new to change)" as placeholder when a key exists — entering a new value overwrites it
- Platform key fallback: When no user API key is set, shows "(optional — platform key active)" as placeholder and "Platform key active — add your own to override" as hint text
- Effort is global default: The effort level set in General applies to all jobs unless overridden per-agent or per-dispatch
- Effort button styling changed: Selected effort button now uses orange border/text accent (
orange-500/20bg) instead of dark/orange solid background - Save vs Save & Apply: Agent config has two save actions — "Save" only writes to DB, "Save & Apply" also pushes to the agent VM. Forgetting to Apply means the agent doesn't see changes
- Role/effort saves immediately: Agent role checkboxes and effort dropdown fire PUT requests on every change — no Save button needed; visual feedback is a border flash
- Rename agent is hover-reveal: The pencil icon button appears only on hover over the agent card (
opacity-0 group-hover/card:opacity-100); clicking it turns the name into an editable inline text field with save/cancel buttons - Agent display name vs hostname: Cards show an editable display name (top) and a fixed hostname (below); the hostname is the permanent identifier used for DNS
- "Shared with N account(s)": Owned agents show a span indicating how many other accounts the agent is shared with
- Avatar modal heading: Modal heading is "Set Agent Avatar"; remove button text is "Remove avatar (use default)"; modal has a Cancel button
- Avatar upload limits: Max 1 MB, JPEG/PNG/GIF/WebP/SVG only. Oversized files show error and clear the input
- RDP modal heading: Modal heading is "Download RDP Shortcut"; includes "Copy password" button to copy RDP credentials and "Cancel" button to close without downloading
- RDP button text changed: The button on agent cards now shows as "RDP" (was "Download RDP")
- RDP Save Credentials: Checkbox id is
rdp-save-password, label is "Save credentials Embed password in RDP file" - RDP modal platform hints: macOS shows "Requires Microsoft Remote Desktop from App Store"; Linux shows "Open with Remmina, xfreerdp..."
- Shared agent read-only config: Non-owners see a Preferences panel (roles/effort/paths) instead of the full config panel — they cannot edit entry paths, env vars, or use danger zone
- Slack setup complexity: Adding a Slack channel requires multiple fields from the Slack App configuration — the expandable Setup Guide provides 7-step instructions
- Slack events URL: Event subscriptions must point to
https://sidebutton.com/api/slack/events - Slack duplicate channel: Adding a channel that's already connected returns error 409 — "This Slack channel is already connected"
- Slack Test Connection: Calls Slack
auth.testAPI directly from browser — requires valid bot token - No delete for settings: There's no reset/delete for General or Assistant settings — only overwrite via Save
- Knowledge pack is now ZIP upload: The old "Attach Skill Pack" flow with local path is replaced by ZIP file upload (max 10MB, must contain
index.jsonat root) - Sync Now replaced Pull Updates: The button to refresh knowledge pack workflows is now "Sync Now" (was "Pull Updates")
- Knowledge Pack Remove button: A "Remove" button is now visible on the pack card for removing the knowledge pack (shows confirmation dialog)
- Knowledge Pack heading level: The "Knowledge Pack" heading is now H3 (was H2)
- Active Role dropdown: New field on Assistant tab —
select#active-role-selectwithname="active_role"— options are populated from installed skill pack roles - Logs table headers: Column headers are now Title Case ("Time", "Status", "Event", "Automation", "Job") — previously documented as UPPERCASE
- Upload & Sync disabled by default: The button is disabled until a ZIP file is selected
- Deploy Webhook requires saved credentials: The Deploy Webhook button on the Issue Tracking tab only works after Jira credentials (URL, email, token) are saved
- Logs tab is client-side rendered: The table fetches data via
/api/webhooks/logson tab open — shows "Loading..." then populates; snapshot may not capture table rows since they're injected via JS - Logs empty state: Shows "No webhook events recorded yet" (not a blank area) when no events exist
- Logs pagination: 30 items per page; Prev/Next buttons appear only when total > 30; "N–M of Total" info text (e.g. "1–30 of 3769")
- MATCH vs SKIP badges: MATCH (emerald/green) = event triggered a job dispatch; SKIP (slate/grey) = event was evaluated but didn't match automation criteria
- Logs event summary format: Jira events show "webhookEvent — issueKey (status)"; SideButton events show "eventType — workflowSlug on agentName"; cron events show "cron — schedule"; manual shows "manual trigger"
- Auth is now Auth0: Portal authentication uses Auth0 (email + password) instead of the old email-only flow; legacy
/api/auth/loginstill works for programmatic access - MCP Connections is on Assistant tab: The MCP Connections section is below the persona form on the Assistant tab, under an H3 heading (not H2), separated by a divider line
- Jira MCP state depends on credentials: When unconfigured, shows grey dot + "Configure" link to Issue Tracking tab; when configured, shows green dot + "60 tools" badge + orange toggle switch
- SideButton Cloud always available: SideButton Cloud connection is pre-configured and shows green dot; Jira shows grey dot until credentials are configured
- Confirmation dialogs on destructive actions: Reboot, Delete agent, and Remove pack all show browser confirm() dialogs