Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.altnautica.com/llms.txt

Use this file to discover all available pages before exploring further.

A plugin can only do what its manifest declares and the operator approves. This page lists the full permission set, the risk bands they map to, and how the install dialog presents them.

Risk bands

BandTriggerVisual
LowNo critical or high permission requested.Plain badge.
MediumReads battery / GPS / mavlink raw stream, writes to recordings.Yellow badge.
HighReads or writes the host filesystem outside the plugin’s data dir, opens network sockets.Orange badge.
CriticalSends MAVLink commands, arms the vehicle, modifies missions in flight.Red badge with warning icon.
The band is computed automatically from the most-privileged permission in the manifest. Operators see it on every install dialog and on every plugin’s detail page.

Agent permissions

PermissionBandLets the plugin…
event.subscribeLowReceive events the agent or other plugins publish.
event.publishLowPublish events to the agent bus.
mavlink.readMediumRead parsed MAVLink messages from the FC.
mavlink.writeCriticalSend arbitrary MAVLink to the FC. Includes vehicle.command.
vehicle.commandCriticalSend canonical commands (ARM, DISARM, RTL, MODE_SET).
mission.readMediumRead mission, geofence, rally points.
mission.writeHighModify mission, geofence, rally points.
telemetry.subscribe.*LowSubscribe to a normalized topic (battery, gps, etc.). The * is the topic name.
recording.writeMediumAdd markers to active recordings.
filesystem.hostHighRead or write outside the plugin’s own data dir.
network.outboundHighOpen outbound TCP / UDP / HTTP sockets.
usb.readMediumOpen a USB device by vendor / product id.
usb.writeHighWrite to a USB device.
serial.readMediumRead from a UART.
serial.writeHighWrite to a UART.
vision.frame.readMediumSubscribe to camera frames from the Vision Engine.

GCS permissions

PermissionBandLets the plugin…
ui.slot.fc-tabLowMount a panel in the FC tab.
ui.slot.video-overlayLowRender an overlay on top of live video.
ui.slot.sidebar-leftLowMount a panel in the left sidebar.
ui.slot.sidebar-rightLowMount a panel in the right sidebar.
ui.slot.status-barLowAdd an item to the bottom status bar.
ui.slot.command-tabLowMount under the Command tab.
ui.slot.planner-tabLowMount under the Planner tab.
ui.slot.hardware-tabLowMount under the Hardware tab.
ui.slot.settings-sectionLowRender a settings section.
ui.slot.notificationLowPublish to the host notification rail.
ui.slot.drone-detail-tabLowMount a per-drone tab inside the drone detail view.
ui.slot.telemetry-detailLowMount in the per-channel telemetry detail panel.
command.sendCriticalIssue a canonical vehicle command from the GCS half.
mission.readMediumRead the active mission state.
mission.writeHighModify the active mission.
telemetry.subscribe.*LowSubscribe to a host-normalized telemetry topic.
recording.writeMediumWrite recording markers.
cloud.readLowRead public cloud config.

Required vs optional

permissions:
  - id: telemetry.subscribe.battery
    required: true
  - id: recording.write
    required: false
Required permissions are pinned on in the install dialog; the operator cannot install while leaving them off. Optional permissions default to off and are flipped on by the operator only when wanted.

Two-stage install

  1. The operator drags a .adosplug into the install dialog.
  2. The host calls POST /api/plugins/parse (agent) or the equivalent GCS bridge call. The host returns a manifest summary with the requested permissions, the signer id, and the risk band.
  3. The dialog renders the summary plus a permission grid. The operator flips optional toggles and clicks Install.
  4. Only then does the host call POST /api/plugins/install, which actually unpacks the archive and writes state to disk.
A plugin that never makes it past step 3 leaves no traces.

Re-prompt on update

Installing version 1.1 of a plugin that requests one new optional permission re-opens the install dialog with only the new permission highlighted. Existing grants are preserved; the operator just decides whether to grant the new one. Removing permissions in v1.1 is silent. The host drops the no-longer-declared grants.

Capability tokens on the wire

Every privileged RPC carries a capability id in the envelope. The host bridge:
  1. Resolves the required capability from the method name. For telemetry.subscribe, the required cap is telemetry.subscribe.<topic> derived from args.topic.
  2. Looks up the granted set for the plugin.
  3. Rejects the call with permission_denied if the required cap is not in the set.
The plugin cannot forge a capability by lying in the envelope; the host always re-resolves from the method.