What Is This Tool
The TL Agent Intake Form is a four-step wizard embedded in the MSP AI Resource Hub. It provides a structured, validated pathway for any team member or client lead to submit an AI agent build request without needing to understand the underlying technical stack.
Completed submissions are serialized into a JSON payload and routed to the Relay pipeline — a three-stage review process that enforces viability checks (Relay), security sign-off (Gate), and build authorization (Deploy). When proxy is live, the payload is POST'd to a local server; in DEMO mode it is held in memory and presented in the summary view for manual copy.
The form inherits the MSP AI Resource Hub design system: JetBrains Mono, Exo 2, Inter, dark background #020406, with the same topbar nav pull from ../nav.js as all sibling pages. A static fallback nav is rendered in the HTML and overridden at runtime by nav.js.
Integration Status
| Integration | Direction | Status | Notes |
|---|---|---|---|
| Local Proxy POST | Outbound | Activates When Proxy Live | POST /api/intake/submit — payload delivery to pipeline backend |
| nav.js Parent Nav | Inbound | Live | Loaded via script src="../nav.js" — static fallback renders if absent |
| Draft Recovery Endpoint | Outbound | Activates When Proxy Live | GET /api/intake/drafts/:userId — not yet implemented server-side |
| Status Polling Endpoint | Outbound | Activates When Proxy Live | GET /api/intake/status/:reqId — planned, not yet live |
| Clipboard Copy | Client-only | Live | navigator.clipboard — works in all modern browsers over HTTPS/localhost |
| CW Manage CSAT | N/A | No Endpoint | CW Manage does not expose a CSAT API. Relay review status must be tracked manually. |
Architecture & Data Flow
The intake form is a single-file, self-contained HTML page. It shares the MSP AI Resource Hub parent directory structure and inherits navigation from ../nav.js. No external JS framework is used. All state is held in script-scope variables — no localStorage, no sessionStorage.
LIVE_MODE Flag
Step 1 · Requester Info
Captures the identity and organizational context of the person submitting the request. Used for routing notifications and Relay contact if more information is needed.
| Field | Required | Validation | Notes |
|---|---|---|---|
| Full Name | Required | Non-empty string | Free text; no format enforcement |
| Department | Required | Non-empty string | Helps Relay route to correct team lead |
| Required | Regex: /^[^\s@]+@[^\s@]+\.[^\s@]+$/ | Used for Relay notification (when live) | |
| Client / Account | Optional | None | If blank, displays "None specified" in summary |
Step 2 · Agent Brief
Core description of what the requested agent should do. Designed for non-technical language — Relay translates the brief into a technical spec during viability review.
| Field | Required | Notes |
|---|---|---|
| Agent Name / Working Title | Required | Becomes the identifier for the request through the pipeline |
| Description | Required | Plain-language description — no jargon required |
| Expected Output / Success Metric | Optional | Quantifiable outcome if known; displayed in summary |
| Trigger Type (pill select) | Required | Single-select: Manual, Scheduled, Event-Driven, User Message, Webhook, Unknown |
Step 3 · Systems & Integrations
Multi-select checklist of every platform the agent needs to interact with. All selections feed directly into Gate's security review. The phase tags (PH1, PH2, PH3, Core) indicate rollout priority in the platform integration roadmap.
| Category | Systems | Phase Tags |
|---|---|---|
| Endpoint & Network | Ninja RMM, CW Automate, Auvik, Meraki, FortiGate | PH1 / PH2 |
| Security Platforms | SentinelOne, Huntress, RocketCyber, Duo, Mimecast, Cisco Umbrella, Keeper | PH1 / PH2 |
| Backup & BCDR | Acronis, Axcient, Cove, Datto, StorageCraft | PH2 / PH3 |
| Business Operations | ConnectWise PSA, BrightGauge, IT Glue, Hudu, Liongard, ScalePad, M365/Teams, SharePoint | PH1 / PH2 / PH3 / Core |
| Other / Custom | Free-text field — comma-separated | N/A |
Step 3 has no required validation — it is valid to proceed with zero systems selected if the agent's system dependencies are unknown at intake time. Gate will flag this during review.
Step 4 · Risk & Priority
Determines Gate routing severity and Relay sequencing. Both fields are required before submission is allowed.
| Field | Options | Effect |
|---|---|---|
| PII / Sensitive Data | Yes / No | Yes: sets Gate flag in summary, displays warning banner in routing panel. Mandatory Gate sign-off before Deploy. |
| Priority | High / Medium / Low | High: immediate pipeline slot. Medium: next sprint cycle. Low: backlog / Phase 2+. |
| Additional Notes | Optional textarea | Compliance notes, data residency, dependencies — surfaced in summary for Gate review |
Summary & Routing Panel
Rendered after a successful submission (DEMO or LIVE). The form and progress rail are hidden; the summary panel replaces them. It contains a generated Request ID, timestamp, full data review grid, and a pipeline routing visualization.
REQ-YYYYMMDD-NNNNGenerated client-side. Server may re-assign a canonical ID on successful POST.
Config Fields
All configuration is at the top of the <script> block in the HTML file. No separate config file exists.
| Variable | Default | Effect When Changed |
|---|---|---|
| LIVE_MODE | false | true = real fetch POST; mode badge switches to green LIVE; loadDashboard() and refreshAll() activate |
| PROXY_BASE | http://localhost:3000 | Base URL for all proxy endpoints. Update to match your local or remote proxy address. |
| SUBMIT_URL | PROXY_BASE + '/api/intake/submit' | Derived — do not edit directly; change PROXY_BASE instead |
LIVE_MODE = true at the top of the script block. Ensure your proxy is running and the /api/intake/submit endpoint returns HTTP 200 or 201 on success. The mode badge in the topbar will switch from yellow DEMO to green LIVE automatically.
API Endpoints
All endpoints route through the local proxy at http://localhost:3000 (configurable via PROXY_BASE).
Accepts the full serialized intake payload as JSON. Expected response: HTTP 200 or 201. Any non-2xx response or network error triggers the error banner. Payload schema: reqId, timestamp, name, email, department, client, agentName, description, outcome, trigger, systems[], pii, priority, notes.
Called by loadDashboard() when LIVE_MODE = true. Intended to populate draft recovery for returning users. Endpoint not yet implemented server-side. Wire the response into a pre-fill routine when ready.
Polled every 30 seconds by startAutoRefresh(30000) in LIVE mode. Intended to return current Relay / Gate / Deploy stage for the submitted request and update the routing panel. Endpoint planned but not yet live.
Documented Limitations
These are genuine architectural limitations, not implementation gaps. They are also documented as comments in the source.
| Limitation | Impact | Workaround |
|---|---|---|
| No CW Manage CSAT endpoint | Cannot auto-surface Relay / Gate review status from CW | Track pipeline stage manually in CW ticket or separate Relay queue |
| Client-generated reqId | Request ID is not server-authoritative in DEMO mode | Server should re-assign canonical ID in POST response; client should display server-returned ID in LIVE mode |
| No persistent storage in browser | In-progress drafts are lost on page reload | Use Copy Summary before closing. Draft recovery endpoint (GET /api/intake/drafts) planned for LIVE mode. |
| nav.js is parent-relative | If page is served from a different directory, nav will not load | Static fallback nav renders correctly — no functionality lost, just dynamic menu items |
| Clipboard API requires HTTPS or localhost | Copy Summary silently fails on non-secure origins | Serve from localhost or HTTPS. Fallback: user can manually select and copy summary text. |
Proxy Activation Checklist
Complete all steps before flipping LIVE_MODE to true.
-
Local proxy server is running at
http://localhost:3000(or update PROXY_BASE to match actual address) -
POST /api/intake/submitendpoint is implemented and returns HTTP 200 or 201 with a server-assigned reqId -
CORS is configured on proxy to accept requests from the Hub's origin (or served same-origin)
-
Payload schema is accepted: reqId, timestamp, name, email, department, client, agentName, description, outcome, trigger, systems[], pii, priority, notes
-
Test POST with curl or Postman before enabling LIVE_MODE in the HTML
-
Set
LIVE_MODE = truein the script block and reload the page -
Confirm mode badge in topbar shows green LIVE label
-
Submit a test request end-to-end and verify payload arrives at proxy
-
(Optional) Implement
GET /api/intake/drafts/:userIdfor draft recovery, then wire into loadDashboard() -
(Optional) Implement
GET /api/intake/status/:reqIdfor pipeline status polling, then enable refreshAll() response handling
Troubleshooting
Error banner shown after submit
Cause: LIVE_MODE = true but proxy is not reachable or returned a non-2xx response. Fix: Confirm proxy is running at PROXY_BASE. Check browser network tab for the failed POST. Use error banner message to confirm endpoint URL. In the interim, use "Copy Summary" to preserve the request.
Nav bar shows fallback static links
Cause: ../nav.js is not found at the relative path. Fix: Ensure the file is served from the correct subdirectory with nav.js one level up. Check browser console for 404 on nav.js. Static fallback nav remains fully functional.
Copy Summary does nothing
Cause: Page is served over HTTP (not HTTPS or localhost). The Clipboard API requires a secure context. Fix: Serve from localhost or over HTTPS. Alternatively, the user can manually select and copy the text from the summary panel.
Form validation not clearing after correction
Cause: field-error class is applied per-field and only removed on the next goTo() validation pass. Fix: This is expected behavior. Fix the field value and click Next again — validation re-runs on navigation.
reqId duplicates on rapid re-submit
Cause: Client-side reqId uses random 4-digit suffix with date prefix. Collision probability is low but non-zero. Fix: In LIVE mode, the server should return a server-authoritative ID and the client should use that for display and polling. The client-generated ID is a fallback for DEMO mode only.
Systems selection not appearing in summary
Cause: No sys-item elements have the .selected class at time of submit. This is valid — Step 3 has no required validation. Fix: Summary will display "No systems selected." Gate will flag this during review. No action needed unless systems were intended to be selected.