Files
guru-connect/specs/native-remote-control/shape.md
Mike Swanson e3e95f8fa7
Some checks failed
Build and Test / Build Server (Linux) (push) Has been cancelled
Build and Test / Build Agent (Windows) (push) Has been cancelled
Build and Test / Security Audit (push) Has been cancelled
Build and Test / Build Summary (push) Has been cancelled
Run Tests / Test Server (push) Has been cancelled
Run Tests / Test Agent (push) Has been cancelled
Run Tests / Code Coverage (push) Has been cancelled
Run Tests / Lint and Format Check (push) Has been cancelled
chore: sync repository to current working state
Brings azcomputerguru/guru-connect up to the authoritative working copy that
had been maintained in the claudetools monorepo: Phase 1 security and
infrastructure (middleware, metrics, utils, token blacklist, deployment
scripts, security audits) plus the native-remote-control integration spec.
Preserves the repo .gitignore, .cargo, and server/static/downloads.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 06:15:29 -07:00

89 lines
5.8 KiB
Markdown

# Native Remote Control — GC↔RMM Integration Contract & Embedded Viewer — Shape & Constraints
## What this is
guru-connect (GC) is a **standalone product** — a ScreenConnect/Splashtop-style remote-support
tool that must work fully on its own, with its **own release pipeline, cadence, and development
cycle**, independent of GuruRMM (RMM).
This feature establishes and maintains the **integration contract** that lets RMM embed GC as an
**integrated session viewer** — a technician launches a live remote-control session on a managed
endpoint from inside the RMM dashboard, and the GC session viewer renders **inside RMM's UI**
while GC and RMM remain separately developed products. The deliverable is therefore not a one-off
broker wiring; it is a **durable, versioned boundary** (owned by GC) plus the broker that consumes
it. "Keep integration front of mind" = GC treats this contract as a first-class, supported surface
that it does not break as it evolves on its own cadence.
## What this is NOT (out of scope)
- **File transfer** — no drag/drop or browse-and-copy during a session (deferred).
- **Session recording** — no session-to-video capture for audit/compliance (deferred).
- **Non-Windows agents** — macOS/Linux remote-control endpoints are out of scope; the GC agent is
Windows-only today. Windows-first. (Multi-monitor IS in scope.)
- **Not coupling the two products.** This must NOT merge GC into the RMM agent, share build
pipelines, or make either product unbuildable/unreleasable without the other. GC must still ship
and run standalone with zero RMM dependency.
- Not a replacement for RMM's generic admin `tunnel` scaffold (terminal/file/registry channels) —
that is a separate text-channel feature; this is video remote control.
## In scope
- **A versioned GC integration contract** (`/api/integration/v1/...`) owned and documented by GC,
with a capability/version discovery endpoint so RMM can detect what a given GC build supports and
degrade gracefully. This is the keystone of the feature.
- **Embedded session viewer** — RMM hosts GC's web viewer inside its dashboard (scoped iframe /
panel), not only the native `guruconnect://` launch.
- Unattended remote control of managed endpoints (primary RMM use case).
- Attended remote control with an end-user consent prompt.
- Multi-monitor (display switching) — GC already reports `display_count`.
- Short-lived, per-session viewer credentials (no long-lived viewer tokens).
## Hard constraints
- **GC stays standalone.** Independent pipeline/cadence preserved. The integration contract is
additive to GC and must not introduce any RMM build/runtime dependency into GC.
- **Stability via versioning, not lockstep.** Because the two products release on different cadences,
the contract is **semver'd** and exposes `GET /api/integration/capabilities`. RMM version-gates
features off that response; GC never breaks a published contract version without a major bump.
- **No external apps / no supply-chain exposure.** Remote control runs entirely on our Rust stack.
The RMM agent obtains the GC agent binary only from GC's own release channel and **verifies a
SHA-256 checksum before launch** (reuse GC's `releases.checksum_sha256`). No third-party downloads.
- **Embedding must not weaken security.** The viewer is framable only by an explicit RMM-origin
allowlist via scoped `frame-ancestors` / `X-Frame-Options` on the viewer route(s); the global
`frame-ancestors 'none'` (`security_headers.rs:30`) stays for every other route.
- **No hardcoded secrets.** Integration key, per-machine agent keys, viewer tokens come from
env/SOPS, never source. No endpoint URLs in TOML/config files — env vars only.
- **Single static binary, no runtime deps**; Windows 7 SP1+ target preserved for the GC agent.
## Key decisions
- **GC owns the integration contract.** It lives in the GC repo (this spec + a versioned
`CONTRACT.md` / OpenAPI doc), is exposed under `/api/integration/v1/`, and is GC's responsibility
to keep stable. RMM is purely a consumer.
- **Decouple cadences with capability discovery.** `GET /api/integration/capabilities` returns the
contract version + a feature map (e.g. `embedded_viewer`, `consent_prompt`, `per_machine_keys`).
RMM reads it at integration time and only offers what the connected GC build supports. This is how
"in-sync" is achieved without lockstep releases.
- **Broker model (RMM orchestrates the separate GC agent).** Reuses GC's existing engine as-is;
aligns naturally with two independent products. Endpoints both agents stay separate binaries.
- **Stable cross-product identity = RMM `device_id`.** The RMM agent launches the GC agent passing
RMM's `device_id` as the GC `agent_id`, so the broker's pre-created session deterministically
matches the endpoint (`agent/src/device_id.rs` survives reinstalls).
- **Embedded viewer over native-only.** GC exposes an embed-mode `viewer.html` (scoped framing +
`postMessage` lifecycle events for the RMM host); the native `guruconnect://` handler remains a
fallback. This is what makes GC a true "integrated session viewer."
- **Per-machine agent keys replace the shared `AGENT_API_KEY`** (`relay/mod.rs:187` flags this as
future work); programmatic **session pre-create + short-lived viewer token** are added because GC
has neither today; **consent** for attended mode is new (`ConsentRequest`/`ConsentResponse`).
## Priority
P2 — important, near-term. The contract/capability layer (Tasks 1) is the part to get right first,
because it is the long-lived surface both products depend on.
## Roadmap reference
`projects/msp-tools/guru-rmm/docs/FEATURE_ROADMAP.md:635-675` — "Remote Access" (supersedes the
"Remote desktop (RDP/VNC proxy) - P3" line with our own stack). `docs/UI_GAPS.md:155-186`.
GC side: this spec + the new `CONTRACT.md` become GC's integration-surface roadmap entry.