Files
resolutionflow/frontend/src/data/guides.ts
Michael Chihlas 307a6285e6
All checks were successful
Mirror to GitHub / mirror (push) Successful in 4s
CI / frontend (pull_request) Successful in 4m57s
CI / backend (pull_request) Successful in 10m21s
CI / e2e (pull_request) Successful in 12m0s
feat(guides): rewrite in-product User Guides as Diátaxis how-tos
Replace 15 feature-dump guides with 43 problem-oriented how-tos grouped
under 10 categories. Drop Maintenance Flows / AI Assistant / Flow Assist
Sparkles — those surfaces no longer exist post-FlowPilot pivot. Rename
Step Library → Solutions Library throughout. Correct every "click X in
the sidebar" reference to match live labels (Home, History, Tickets,
Flows, Scripts, Data, Acct).

Schema: add `category: CategoryId` and optional `relatedSlugs` to Guide;
new Category type and `categories` const drive hub ordering. GuidesHubPage
renders category sections (auto-hides empty); GuideDetailPage renders a
related-guides footer when set; GuideCard drops the misleading "N sections"
subtitle.

Fix step.tip markdown rendering — `**bold**` rendered literally because
tip used plain text instead of the same regex replacement used on
instruction.

14 net-new how-tos for FlowPilot-era surfaces with no prior coverage:
tasklane keyboard flow, view-what-we-know, ask-AI mid-session,
pause-and-leave, resolve, record-fix-outcome, escalate (Escalation
Mode), post-docs-to-ticket, send-client-update, build-script-from-scratch,
open-suggested-flow, pin-a-flow, invite-teammate.

Browser-verified against engineer + owner test users (sidebar labels,
account sub-pages, pilot-screen header buttons, Tasks panel, integration
form). tsc clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 21:16:51 -04:00

923 lines
39 KiB
TypeScript

import type { LucideIcon } from 'lucide-react'
import {
BarChart3,
Bookmark,
BookmarkPlus,
Box,
CheckCircle2,
CircleCheck,
ClipboardList,
Clock,
Compass,
Download,
Eye,
Flag,
FolderOpen,
FormInput,
GitBranch,
KeyRound,
Lightbulb,
Link2Off,
ListChecks,
LogIn,
MessageSquare,
Pause,
Pin,
Play,
Plug,
PlugZap,
RotateCcw,
Send,
Settings,
Share2,
Shield,
Sparkles,
Tag,
TerminalSquare,
Terminal,
TicketCheck,
TrendingUp,
User,
UserPlus,
Users,
Workflow,
} from 'lucide-react'
export type CategoryId =
| 'getting-started'
| 'pilot-sessions'
| 'closing-out'
| 'documentation'
| 'authoring'
| 'reusable-assets'
| 'ai-assistance'
| 'psa'
| 'account-admin'
| 'analytics'
export interface Category {
id: CategoryId
label: string
description: string
}
export const categories: Category[] = [
{ id: 'getting-started', label: 'Getting started', description: 'First login, navigation, and orientation.' },
{ id: 'pilot-sessions', label: 'Working a pilot session', description: 'Drive a session from the home screen through a resolution.' },
{ id: 'closing-out', label: 'Closing out a session', description: 'Resolve, escalate, and record outcomes.' },
{ id: 'documentation', label: 'Documentation & sharing', description: 'Share, export, and redact session output.' },
{ id: 'authoring', label: 'Authoring flows', description: 'Build troubleshooting trees and step-by-step procedures.' },
{ id: 'reusable-assets', label: 'Reusable assets', description: 'Solutions library entries, script templates, and the Script Builder.' },
{ id: 'ai-assistance', label: 'AI assistance', description: 'Chat with the AI inside and outside of pilot sessions.' },
{ id: 'psa', label: 'PSA integrations', description: 'Connect ConnectWise and other PSA tools.' },
{ id: 'account-admin', label: 'Account & team admin', description: 'Profile settings, team configuration, and retention.' },
{ id: 'analytics', label: 'Analytics', description: 'Team and personal usage metrics.' },
]
export interface GuideStep {
instruction: string
detail?: string
tip?: string
}
export interface GuideSection {
title: string
steps: GuideStep[]
}
export interface Guide {
slug: string
title: string
icon: LucideIcon
summary: string
category: CategoryId
sections: GuideSection[]
relatedSlugs?: string[]
}
export const guides: Guide[] = [
// ─────────────────────────────────────────────────────────────────────
// Getting started
// ─────────────────────────────────────────────────────────────────────
{
slug: 'sign-in',
title: 'Sign in for the first time',
icon: LogIn,
summary: 'Get from the login page to your dashboard.',
category: 'getting-started',
sections: [
{
title: 'Sign in',
steps: [
{ instruction: 'Open the **ResolutionFlow** login page.' },
{ instruction: 'Enter your email and password.' },
{ instruction: 'Click **Sign in**. You land on **Home**, the dashboard.' },
],
},
],
relatedSlugs: ['reset-password', 'find-your-way-around'],
},
{
slug: 'reset-password',
title: 'Reset a forgotten password',
icon: KeyRound,
summary: 'Recover access when you can\'t sign in.',
category: 'getting-started',
sections: [
{
title: 'Reset',
steps: [
{ instruction: 'On the login page, click **Forgot password?**.' },
{ instruction: 'Enter the email on your account and submit.' },
{ instruction: 'Open the password reset email and click the link.', tip: 'Check your spam folder if it doesn\'t arrive within a few minutes.' },
{ instruction: 'Choose a new password and confirm it. You\'re signed in immediately.' },
],
},
],
relatedSlugs: ['sign-in'],
},
{
slug: 'find-your-way-around',
title: 'Find your way around the app',
icon: Compass,
summary: 'Map out the sidebar, top bar, and main destinations.',
category: 'getting-started',
sections: [
{
title: 'Layout',
steps: [
{ instruction: 'The **left sidebar** holds the main destinations: **Home** (start a session), **History** (your past sessions), **Tickets**, **Flows**, **Scripts**, **Data** (analytics), and **Acct**.' },
{ instruction: 'The **top bar** has a global search (**Ctrl+K** / **Cmd+K**), a link to **User Guides**, a notifications bell, and your avatar.' },
{ instruction: 'Click **Home** anytime to return to the start screen where new sessions begin.' },
],
},
],
},
{
slug: 'pin-a-flow',
title: 'Pin a flow for fast access',
icon: Pin,
summary: 'Keep your most-used flows one click away.',
category: 'getting-started',
sections: [
{
title: 'Pin',
steps: [
{ instruction: 'Click **Flows** in the sidebar and find the flow you want quick access to.' },
{ instruction: 'Click the **Pin** icon on the flow card.' },
{ instruction: 'Open the **Pin** shortcut at the bottom of the sidebar to launch any pinned flow in one click.' },
],
},
],
relatedSlugs: ['organize-with-categories-tags'],
},
// ─────────────────────────────────────────────────────────────────────
// Working a pilot session
// ─────────────────────────────────────────────────────────────────────
{
slug: 'start-a-session',
title: 'Start a session from the dashboard',
icon: Play,
summary: 'Describe the issue and get the AI to drive.',
category: 'pilot-sessions',
sections: [
{
title: 'Start',
steps: [
{ instruction: 'Go to **Home**.' },
{ instruction: 'In the **"Describe the issue, paste an error message, or drop a screenshot…"** box, type the symptom or paste the error.' },
{ instruction: '(Optional) Click **Attach** to add a screenshot or file, or **Paste Logs** for raw output.' },
{ instruction: 'Click **Start session**. The pilot screen opens with the AI\'s first response and a Tasks panel on the right.', tip: 'For common issues use the quick-start chips below the box (**VPN not connecting**, **Outlook not syncing**, **User locked out**, etc.).' },
],
},
],
relatedSlugs: ['resume-a-session', 'navigate-troubleshooting-flow'],
},
{
slug: 'resume-a-session',
title: 'Resume a paused session',
icon: RotateCcw,
summary: 'Pick back up where you left off.',
category: 'pilot-sessions',
sections: [
{
title: 'Resume',
steps: [
{ instruction: 'Click **History** in the sidebar to see all past and active sessions, newest first.' },
{ instruction: 'Click the session you want to continue. The pilot screen reopens with full context restored.' },
{ instruction: 'Or, on the **Home** screen, click any card under **Active Sessions** to jump straight back in.' },
],
},
],
relatedSlugs: ['start-a-session'],
},
{
slug: 'navigate-troubleshooting-flow',
title: 'Navigate a troubleshooting flow',
icon: GitBranch,
summary: 'Run an authored decision tree and reach a solution.',
category: 'pilot-sessions',
sections: [
{
title: 'Navigate',
steps: [
{ instruction: 'Click **Flows** in the sidebar and find the troubleshooting flow you need.' },
{ instruction: 'Click the flow card and then **Start Session**. The pilot screen opens.' },
{ instruction: 'Read each question in the **Tasks** panel on the right. Click **Answer** to record your response.' },
{ instruction: 'Continue answering until the flow reaches a **Solution**.' },
],
},
],
relatedSlugs: ['run-procedural-flow', 'start-a-session'],
},
{
slug: 'run-procedural-flow',
title: 'Run a procedural flow with an intake form',
icon: ListChecks,
summary: 'Execute a step-by-step procedure on a target.',
category: 'pilot-sessions',
sections: [
{
title: 'Run',
steps: [
{ instruction: 'Open **Flows**, switch to the **Projects** filter, and click the procedural flow you need.' },
{ instruction: 'Click **Start Session**. The intake form appears.' },
{ instruction: 'Fill in the required fields and submit. The first step opens.' },
{ instruction: 'Work through each step in order, marking it complete as you go. Add notes inline where useful.' },
],
},
],
relatedSlugs: ['navigate-troubleshooting-flow', 'build-intake-form'],
},
{
slug: 'tasklane-keyboard-flow',
title: 'Use the tasklane keyboard flow',
icon: Lightbulb,
summary: 'Answer pending tasks without lifting your hands off the keyboard.',
category: 'pilot-sessions',
sections: [
{
title: 'Keys',
steps: [
{ instruction: 'Click into the answer field on any pending **Question** in the **Tasks** panel.' },
{ instruction: 'Type your answer. Press **Enter** to submit and auto-advance to the next pending task.' },
{ instruction: 'Press **Shift+Enter** to add a newline when an answer needs multiple lines.' },
{ instruction: 'Press **Esc** to cancel the current input and step away.' },
{ instruction: 'After your last submission, focus jumps to **Send Responses** so you can fire all answers in one batch.' },
],
},
],
relatedSlugs: ['navigate-troubleshooting-flow', 'view-what-we-know'],
},
{
slug: 'view-what-we-know',
title: 'View What we know during a session',
icon: Eye,
summary: 'See the running list of established facts the AI is reasoning over.',
category: 'pilot-sessions',
sections: [
{
title: 'View',
steps: [
{ instruction: 'In the **Tasks** panel, find the **What we know · N** header at the top.' },
{ instruction: 'Click to expand and read the facts established so far. Facts are added automatically as you answer questions and paste check output.' },
{ instruction: 'The panel auto-collapses once there are 5 or more facts. Click again any time to re-expand. Your preference is remembered for the rest of the session.' },
],
},
],
relatedSlugs: ['tasklane-keyboard-flow'],
},
{
slug: 'ask-ai-mid-session',
title: 'Ask the AI a question mid-session',
icon: MessageSquare,
summary: 'Get contextual help without leaving the session.',
category: 'pilot-sessions',
sections: [
{
title: 'Ask',
steps: [
{ instruction: 'Find the composer at the bottom of the pilot screen: **"Type a message, paste a screenshot, or drag a file…"**.' },
{ instruction: 'Type your question. Examples: "What else could cause this?", "How do I run this command on Server 2019?", "Explain this step in more detail."' },
{ instruction: 'Press **Enter** or click **Send**. The AI knows what flow and step you\'re on and replies in context.', tip: 'Drop a screenshot or paste log output directly into the composer — the AI can read both.' },
],
},
],
relatedSlugs: ['open-suggested-flow'],
},
{
slug: 'pause-and-leave-session',
title: 'Pause and leave a session',
icon: Pause,
summary: 'Save state and walk away without losing context.',
category: 'pilot-sessions',
sections: [
{
title: 'Pause',
steps: [
{ instruction: 'In the session header, click **Pause**.' },
{ instruction: 'The session is saved automatically with everything you\'ve done so far.' },
{ instruction: 'Pick it up later from **History** or the **Active Sessions** card on **Home**.' },
],
},
],
relatedSlugs: ['resume-a-session'],
},
// ─────────────────────────────────────────────────────────────────────
// Closing out a session
// ─────────────────────────────────────────────────────────────────────
{
slug: 'resolve-a-session',
title: 'Resolve a session',
icon: CircleCheck,
summary: 'Mark the issue fixed and post the resolution note.',
category: 'closing-out',
sections: [
{
title: 'Resolve',
steps: [
{ instruction: 'In the **Tasks** panel, click **Preview Resolve note** to see the AI-generated resolution summary.' },
{ instruction: 'Edit the note if you want to adjust the wording before posting.' },
{ instruction: 'Click **Resolve** in the session header to mark the session resolved and post the note.', tip: 'If suggested fixes are still parked as **Waiting to verify**, ResolutionFlow auto-marks them as success before resolving.' },
],
},
],
relatedSlugs: ['record-suggested-fix-outcome', 'escalate-a-session', 'post-docs-to-ticket'],
},
{
slug: 'record-suggested-fix-outcome',
title: 'Record a suggested-fix outcome',
icon: CheckCircle2,
summary: 'Tell the session whether a fix worked, didn\'t, or needs time.',
category: 'closing-out',
sections: [
{
title: 'Record',
steps: [
{ instruction: 'After applying a suggested fix, find its banner in the session view.' },
{ instruction: 'Choose the outcome: **It worked**, **Didn\'t work**, or **Waiting to verify…**.' },
{ instruction: 'For **Waiting to verify**, enter a reason (e.g., "Waiting on user to confirm tomorrow morning"). The fix stays open with a **Pending** banner until you finalize it.' },
{ instruction: 'Recording the outcome closes any inline template or follow-on prompts for that fix.' },
],
},
],
relatedSlugs: ['resolve-a-session'],
},
{
slug: 'escalate-a-session',
title: 'Escalate a session',
icon: Send,
summary: 'Hand off to a senior tech with full context.',
category: 'closing-out',
sections: [
{
title: 'Escalate',
steps: [
{ instruction: 'Click **Escalate** in the session header.' },
{ instruction: 'Review the AI-generated **Escalation Mode** package — what was tried, what failed, and the suspected root cause.' },
{ instruction: 'Edit the package as needed and choose a destination: PSA ticket note, email draft, or ticket update.' },
{ instruction: 'Confirm. The senior tech receives the full context, not a "please help" ping.' },
],
},
],
relatedSlugs: ['resolve-a-session', 'post-docs-to-ticket'],
},
{
slug: 'post-docs-to-ticket',
title: 'Post session docs to a ConnectWise ticket',
icon: TicketCheck,
summary: 'Write the session\'s output back to your PSA.',
category: 'closing-out',
sections: [
{
title: 'Post',
steps: [
{ instruction: 'Open the session on a ticket you\'re working. Ticket-linked sessions show ticket actions in the header overflow.' },
{ instruction: 'Click **More session actions** → **Update Ticket**.' },
{ instruction: 'Choose what to post — internal note, public note, or time entry. Edit the markdown if needed.' },
{ instruction: 'Click **Post to ticket**. The note is attributed to your mapped ConnectWise member.', tip: 'Need a one-off update without finishing the session? Use **Share Update** in the header for a partial status post.' },
],
},
],
relatedSlugs: ['connect-connectwise', 'send-client-update'],
},
{
slug: 'send-client-update',
title: 'Send a client update from a session',
icon: Sparkles,
summary: 'Touch base mid-troubleshoot without finishing the session.',
category: 'closing-out',
sections: [
{
title: 'Send',
steps: [
{ instruction: 'In the session header, click **Share Update**.' },
{ instruction: 'The AI drafts a client-friendly status message based on what\'s been done so far.' },
{ instruction: 'Edit the wording. Toggle redaction to mask sensitive details before sending.' },
{ instruction: 'Send (or copy) the update. Use this when the issue isn\'t resolved yet but the client needs a status touch-point.' },
],
},
],
relatedSlugs: ['post-docs-to-ticket'],
},
// ─────────────────────────────────────────────────────────────────────
// Documentation & sharing
// ─────────────────────────────────────────────────────────────────────
{
slug: 'share-session-link',
title: 'Share a completed session via link',
icon: Share2,
summary: 'Hand a teammate or client a read-only view.',
category: 'documentation',
sections: [
{
title: 'Share',
steps: [
{ instruction: 'Open the session you want to share.' },
{ instruction: 'Click the **More session actions** kebab in the header and choose **Share**.' },
{ instruction: 'In the share modal, click **Copy Link** to put the URL on your clipboard.' },
{ instruction: 'Send the link. The recipient can view the session path and notes — no login required.', tip: 'Public sharing must be enabled by an account owner. If the option is missing, ask whoever owns the account to turn it on.' },
],
},
],
relatedSlugs: ['export-session', 'revoke-share-link'],
},
{
slug: 'export-session',
title: 'Export a session',
icon: Download,
summary: 'Download a session at the right level of detail.',
category: 'documentation',
sections: [
{
title: 'Export',
steps: [
{ instruction: 'Open the session and click **More session actions** → **Export**.' },
{ instruction: 'Choose a detail level: **Summary** (high-level), **Standard** (key decisions), or **Detailed** (full path with all notes).' },
{ instruction: 'Preview the export and edit the text if needed.' },
{ instruction: 'Click **Download** to save it locally.', tip: 'Set the default format (Markdown / Plain Text / HTML) on the **Acct** page.' },
],
},
],
relatedSlugs: ['redact-sensitive-data', 'share-session-link'],
},
{
slug: 'redact-sensitive-data',
title: 'Redact sensitive data from an exported session',
icon: Shield,
summary: 'Mask passwords, IPs, and credentials before sharing.',
category: 'documentation',
sections: [
{
title: 'Redact',
steps: [
{ instruction: 'Open the session and start an export (**More session actions** → **Export**).' },
{ instruction: 'Toggle **Sensitive Data Redaction** on in the export options.' },
{ instruction: 'Preview to confirm passwords, IPs, and credentials are masked.' },
{ instruction: 'Download the redacted export.' },
],
},
],
relatedSlugs: ['export-session'],
},
{
slug: 'revoke-share-link',
title: 'Revoke a session share link',
icon: Link2Off,
summary: 'Cut off access to a previously shared session.',
category: 'documentation',
sections: [
{
title: 'Revoke',
steps: [
{ instruction: 'Open the session whose share you want to revoke.' },
{ instruction: 'Click **More session actions** → **Share** to see the active link.' },
{ instruction: 'Click **Revoke** next to the link. Anyone holding the URL loses access immediately.' },
],
},
],
relatedSlugs: ['share-session-link'],
},
// ─────────────────────────────────────────────────────────────────────
// Authoring flows
// ─────────────────────────────────────────────────────────────────────
{
slug: 'create-troubleshooting-flow',
title: 'Create a troubleshooting flow',
icon: Box,
summary: 'Spin up a branching decision tree from scratch.',
category: 'authoring',
sections: [
{
title: 'Create',
steps: [
{ instruction: 'Click **Flows** in the sidebar.' },
{ instruction: 'Click **Create New** and choose **Troubleshooting Flow**.' },
{ instruction: 'Enter a name and an optional description.', tip: 'Name it after the problem it solves, e.g. "DNS Resolution Failure" — teammates search by symptom.' },
{ instruction: 'Click **Create**. The canvas editor opens with an empty root node.' },
],
},
],
relatedSlugs: ['add-nodes-and-branches', 'write-solution-node'],
},
{
slug: 'add-nodes-and-branches',
title: 'Add nodes and branches on the canvas',
icon: Workflow,
summary: 'Build out the decision tree.',
category: 'authoring',
sections: [
{
title: 'Build',
steps: [
{ instruction: 'In the canvas editor, click the **+** on any node to add a child.' },
{ instruction: 'Choose the type: **Question** (asks the engineer something), **Action** (instructs them to do something), or **Solution** (the resolution).' },
{ instruction: 'Type the node content. For **Question** nodes, add the answer **options** that branch to different paths.', tip: 'Keep questions specific. "Is the DNS server responding to nslookup?" beats "Check DNS".' },
{ instruction: 'Use **Undo** (Ctrl+Z) and **Redo** (Ctrl+Shift+Z) to revert mistakes.' },
],
},
],
relatedSlugs: ['write-solution-node', 'create-troubleshooting-flow'],
},
{
slug: 'write-solution-node',
title: 'Write a solution node',
icon: Flag,
summary: 'End a path with an actionable resolution.',
category: 'authoring',
sections: [
{
title: 'Write',
steps: [
{ instruction: 'Add a **Solution** node at the end of a path.' },
{ instruction: 'Write the resolution in plain language, with specific commands or steps the engineer should follow.' },
{ instruction: 'Save. A flow can have multiple solution nodes for different resolution paths.' },
],
},
],
relatedSlugs: ['add-nodes-and-branches'],
},
{
slug: 'create-procedural-flow',
title: 'Create a procedural flow',
icon: ClipboardList,
summary: 'Author a step-by-step procedure (project).',
category: 'authoring',
sections: [
{
title: 'Create',
steps: [
{ instruction: 'Click **Flows** → **Create New** → **Procedural Flow**.' },
{ instruction: 'Enter a name and description.' },
{ instruction: 'Click **Create**. The procedural editor opens.' },
{ instruction: 'Click **Add Step** for each task in the procedure. Drag steps to reorder.', tip: 'Group long procedures with **Section Headers** like "Preparation", "Execution", "Verification".' },
],
},
],
relatedSlugs: ['build-intake-form', 'run-procedural-flow'],
},
{
slug: 'build-intake-form',
title: 'Build an intake form for a procedural flow',
icon: FormInput,
summary: 'Collect inputs once, reuse across every step.',
category: 'authoring',
sections: [
{
title: 'Build',
steps: [
{ instruction: 'In the procedural editor, click **Add Field** in the intake form section.' },
{ instruction: 'Choose the field type: **Text**, **Textarea**, **Select**, **Number**, **URL**, or **Checkbox**.' },
{ instruction: 'Set the **variable name** (e.g. `client_name`, `server_ip`). Steps reference values by this name.' },
{ instruction: 'Mark fields as **Required** if they must be filled before the procedure starts.', tip: 'Reference variables in step instructions to auto-fill commands and notes.' },
],
},
],
relatedSlugs: ['create-procedural-flow'],
},
{
slug: 'organize-with-categories-tags',
title: 'Organize flows with categories and tags',
icon: Tag,
summary: 'Make flows findable for the rest of the team.',
category: 'authoring',
sections: [
{
title: 'Organize',
steps: [
{ instruction: 'Open a flow and click into its name or settings area to edit metadata.' },
{ instruction: 'Assign a **category** (e.g. "Networking", "Active Directory") to group it on the **Flows** page.' },
{ instruction: 'Add **tags** for searchability — "DNS", "VPN", "Firewall". Tags are shared across your team.', tip: 'Use consistent tag spelling so the search picks up everyone\'s flows.' },
],
},
],
relatedSlugs: ['manage-team-categories'],
},
// ─────────────────────────────────────────────────────────────────────
// Reusable assets
// ─────────────────────────────────────────────────────────────────────
{
slug: 'save-to-solutions-library',
title: 'Save a step to the Solutions Library',
icon: BookmarkPlus,
summary: 'Promote a one-off step into a reusable building block.',
category: 'reusable-assets',
sections: [
{
title: 'Save',
steps: [
{ instruction: 'In the procedural flow editor, click **Save to Library** on a step you want to reuse.' },
{ instruction: 'Give it a name and an optional category.' },
{ instruction: 'The step is now available to import into any procedural flow.' },
],
},
],
relatedSlugs: ['import-from-solutions-library'],
},
{
slug: 'import-from-solutions-library',
title: 'Import a Solutions Library entry into a flow',
icon: Bookmark,
summary: 'Drop a saved step into the procedure you\'re building.',
category: 'reusable-assets',
sections: [
{
title: 'Import',
steps: [
{ instruction: 'Open **Flows** and switch to the **Solutions Library** tab to browse what\'s available.' },
{ instruction: 'From the procedural editor, click **Import from Library** when adding a step.' },
{ instruction: 'Search or browse, then click **Import**. The imported step is a copy — editing it won\'t affect the library version.' },
],
},
],
relatedSlugs: ['save-to-solutions-library'],
},
{
slug: 'generate-script-from-template',
title: 'Generate a script from a template',
icon: Terminal,
summary: 'Fill in parameters and get a ready-to-run script.',
category: 'reusable-assets',
sections: [
{
title: 'Generate',
steps: [
{ instruction: 'Click **Scripts** in the sidebar.' },
{ instruction: 'Browse or search the **Script Library**. Click a template to preview the script.' },
{ instruction: 'Click **Configure** and fill in the parameter values (server name, IP, credentials, etc.).' },
{ instruction: 'Click **Generate**. Copy the result to your clipboard or download it.', tip: 'Run generated scripts in a test environment before production.' },
],
},
],
relatedSlugs: ['manage-script-templates'],
},
{
slug: 'manage-script-templates',
title: 'Manage script templates',
icon: Settings,
summary: 'Create, edit, and delete templates for the team.',
category: 'reusable-assets',
sections: [
{
title: 'Manage',
steps: [
{ instruction: 'On the **Scripts** page, click **Manage** at the top.' },
{ instruction: 'Click **New Template** and enter a name, category, script body, and configurable parameters.' },
{ instruction: 'Edit or delete existing templates from the same page. PowerShell, Bash, Python, and other languages are supported.' },
],
},
],
relatedSlugs: ['generate-script-from-template'],
},
{
slug: 'build-script-from-scratch',
title: 'Build a script from scratch with Script Builder',
icon: TerminalSquare,
summary: 'Describe what you need, iterate via chat, save it for the team.',
category: 'reusable-assets',
sections: [
{
title: 'Build',
steps: [
{ instruction: 'Click **Scripts** in the sidebar.' },
{ instruction: 'Click **Build New Script** at the top.' },
{ instruction: 'Describe what the script needs to do in plain language. Script Builder generates an initial draft.' },
{ instruction: 'Iterate via chat — ask Script Builder to add error handling, change languages, or refactor.' },
{ instruction: 'Test the result, then click **Save** to add it to your team\'s Script Library.', tip: 'You can hand off to Script Builder from inside a pilot session via "Open in Script Builder" — context carries over.' },
],
},
],
relatedSlugs: ['generate-script-from-template', 'manage-script-templates'],
},
// ─────────────────────────────────────────────────────────────────────
// AI assistance
// ─────────────────────────────────────────────────────────────────────
{
slug: 'open-suggested-flow',
title: 'Open a flow suggested by the AI',
icon: Sparkles,
summary: 'Jump into a relevant team flow without breaking your session.',
category: 'ai-assistance',
sections: [
{
title: 'Open',
steps: [
{ instruction: 'While chatting with the AI in a pilot session, watch for **Suggested Flow** cards beneath the AI\'s responses.' },
{ instruction: 'The cards appear when the AI matches a pattern in your team\'s flow library.' },
{ instruction: 'Click a card to open that flow. It loads in context so you can run it without losing the current session.' },
],
},
],
relatedSlugs: ['ask-ai-mid-session', 'navigate-troubleshooting-flow'],
},
// ─────────────────────────────────────────────────────────────────────
// PSA integrations
// ─────────────────────────────────────────────────────────────────────
{
slug: 'connect-connectwise',
title: 'Connect ConnectWise to ResolutionFlow',
icon: Plug,
summary: 'Wire up your PSA so sessions can post back to tickets.',
category: 'psa',
sections: [
{
title: 'In ConnectWise',
steps: [
{ instruction: 'Sign in to ConnectWise PSA as an admin.' },
{ instruction: 'Go to **System → Members → API Members** and create a new API member.', tip: 'Create a dedicated API member with minimal permissions for security.' },
{ instruction: 'Generate an **API key pair** (public + private key) for the member.' },
{ instruction: 'Note your **Company ID** and **Site URL** (e.g. `na.myconnectwise.net`).' },
],
},
{
title: 'In ResolutionFlow',
steps: [
{ instruction: 'Open **Acct → Integrations**.' },
{ instruction: 'Enter a display name, the Site URL, Company ID, public key, and private key.' },
{ instruction: 'Click **Connect**. Run a quick **Test Connection** afterward to confirm.' },
],
},
],
relatedSlugs: ['map-connectwise-members', 'test-connectwise-connection'],
},
{
slug: 'map-connectwise-members',
title: 'Map ConnectWise members to ResolutionFlow teammates',
icon: Users,
summary: 'Make sure ticket notes are credited to the right person.',
category: 'psa',
sections: [
{
title: 'Map',
steps: [
{ instruction: 'Open **Acct → Integrations** and switch to the **Member Mapping** tab.' },
{ instruction: 'Click **Auto-Match by Email** to pair users automatically.' },
{ instruction: 'Manually adjust any unmatched or incorrectly matched members using the dropdowns.' },
{ instruction: 'Click **Save Mappings**. Mapped members are credited when ResolutionFlow posts notes back to tickets.' },
],
},
],
relatedSlugs: ['connect-connectwise'],
},
{
slug: 'test-connectwise-connection',
title: 'Test a ConnectWise connection',
icon: PlugZap,
summary: 'Confirm credentials are valid before going live.',
category: 'psa',
sections: [
{
title: 'Test',
steps: [
{ instruction: 'Open **Acct → Integrations** and find the connection you want to test.' },
{ instruction: 'Click **Test Connection**.' },
{ instruction: 'A success indicator confirms credentials are valid. If it fails, re-check the keys, Company ID, and Site URL.' },
],
},
],
relatedSlugs: ['connect-connectwise'],
},
// ─────────────────────────────────────────────────────────────────────
// Account & team admin
// ─────────────────────────────────────────────────────────────────────
{
slug: 'update-profile',
title: 'Update your profile',
icon: User,
summary: 'Change your display name, email, or password.',
category: 'account-admin',
sections: [
{
title: 'Edit',
steps: [
{ instruction: 'Click **Acct** in the sidebar (or your **avatar** in the top-right).' },
{ instruction: 'Click **Profile Settings**.' },
{ instruction: 'Update your display name, email, or password and save. Changes take effect immediately.' },
],
},
],
},
{
slug: 'manage-team-categories',
title: 'Manage team categories',
icon: FolderOpen,
summary: 'Create the category list everyone tags flows with. Account owner only.',
category: 'account-admin',
sections: [
{
title: 'Manage',
steps: [
{ instruction: 'Open **Acct → Team Categories**.' },
{ instruction: 'Click **Create Category**. Give it a name (e.g. "Networking", "Cloud") and a description.' },
{ instruction: 'Rename or delete categories as your team\'s needs evolve. Existing flows keep their assignment until reassigned.' },
],
},
],
relatedSlugs: ['organize-with-categories-tags'],
},
{
slug: 'set-chat-retention',
title: 'Set chat retention',
icon: Clock,
summary: 'Control how long AI conversations stick around. Account owner only.',
category: 'account-admin',
sections: [
{
title: 'Configure',
steps: [
{ instruction: 'Open **Acct → Chat Retention**.' },
{ instruction: 'Set **Retention Period (days)**. Chats older than this are deleted automatically. Range: 1-365 days.' },
{ instruction: 'Set **Max Conversations**. When this limit is exceeded, oldest unpinned chats are deleted.' },
{ instruction: 'Click **Save Settings**.', tip: 'Pinned conversations are never auto-deleted regardless of retention. Pin the ones you want to keep.' },
],
},
],
},
{
slug: 'invite-teammate',
title: 'Invite a teammate',
icon: UserPlus,
summary: 'Send an invite so a coworker can join your team. Account owner only.',
category: 'account-admin',
sections: [
{
title: 'Invite',
steps: [
{ instruction: 'Click **Acct** in the sidebar and scroll to the **Membership** section.' },
{ instruction: 'In the **Invites** form, enter the teammate\'s email.' },
{ instruction: 'Choose the role: **Engineer** or **Viewer**.' },
{ instruction: 'Click **Send Invite**. They get an email with a sign-up link. Pending invites appear under the form until accepted.', tip: 'Teammates can also self-join with the **Display Code** shown at the top of the Acct page if you share it with them.' },
],
},
],
},
// ─────────────────────────────────────────────────────────────────────
// Analytics
// ─────────────────────────────────────────────────────────────────────
{
slug: 'view-team-analytics',
title: 'View team analytics',
icon: BarChart3,
summary: 'See team-wide usage and resolution metrics.',
category: 'analytics',
sections: [
{
title: 'View',
steps: [
{ instruction: 'Click **Data** in the sidebar.' },
{ instruction: 'The default view shows team-wide metrics: total flows, active sessions, completion rates, and trends.' },
{ instruction: 'Use the date-range filter to focus on a specific period.' },
],
},
],
relatedSlugs: ['view-personal-stats'],
},
{
slug: 'view-personal-stats',
title: 'View your personal stats',
icon: TrendingUp,
summary: 'Track your own session count and completion times.',
category: 'analytics',
sections: [
{
title: 'View',
steps: [
{ instruction: 'Click **Data** in the sidebar.' },
{ instruction: 'Switch to the **My Stats** tab.' },
{ instruction: 'Track your session count, most-used flows, and average completion time.' },
],
},
],
relatedSlugs: ['view-team-analytics'],
},
]