surveillance builder detail (Surveillance Builder)



Surveillance Builder

Surveillance is one generic physical-world subsystem. Quick Ops, properties,
businesses, authored sites and permanent city locations use the same services.

Create a system:
    @surveillance/create corp_security = Corporate Security Cameras

Install cameras:
    @surveillance/camera corp_security.lobby = corp_security | here | Lobby Camera
    @surveillance/camera corp_security.loading = corp_security | #1234 | Loading Dock Camera

Install a physical console:
    @surveillance/console corp_security = here | Security Camera Console

New consoles fail closed. Configure view, control and erase separately:
    @surveillance/access #<console> = view | all()
    @surveillance/access #<console> = control | perm(Security)
    @surveillance/access #<console> = erase | perm(Admin)

Inspect and configure:
    @surveillance/list
    @surveillance/show corp_security
    @surveillance/name corp_security = New Display Name
    @surveillance/enable corp_security.lobby
    @surveillance/disable corp_security.lobby
    @surveillance/retention corp_security = 500
    @surveillance/retention corp_security = unlimited

Retire a physical camera while preserving stored footage:
    @surveillance/retire corp_security.lobby

Administrative footage erasure:
    @surveillance/erase corp_security = corp_security.lobby
    @surveillance/erase corp_security = all

The destructive staff erase operation requires Admin permission.

Player console commands, when the console grants the required access:
    surveillance
    surveillance monitor C01
    surveillance playback C01
    surveillance playback C01 P01
    surveillance enable C01
    surveillance disable C01
    surveillance erase C01 P01
    surveillance erase C01 all

Stable system/camera IDs are separate from display names and DBREFs.
Cxx/Pxx values are local display IDs only.

The physical camera and recording services are NET-agnostic. NET exposure uses
the generic device-endpoint layer; Quick Ops is only one binding consumer.

For a permanent builder-owned NET host, first create a host area named
cameras using the NET builder workflow. Then bind a physical camera:

    @surveillance/netbind corp_security.lobby =
        corp_net/corp_host/cameras | 1 | read

Optional capabilities are: read, enable, disable, erase_all. Read is mandatory.
Mutation capabilities are never granted automatically.

Remove that persistent endpoint with:

    @surveillance/netunbind corp_security.lobby = corp_net/corp_host

The binding lives in the generic persistent NET builder registry and is replayed
after reload/restart. It does not create a duplicate camera or duplicate footage.