@trillboards/edge-sdk 0.2.39 → 0.2.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/deploy/docker/{Dockerfile.cloud-sense → Dockerfile.connector} +52 -39
- package/deploy/docker/README.md +73 -1
- package/deploy/docker/connector-entrypoint.sh +46 -80
- package/deploy/macos/README.md +1 -1
- package/deploy/macos/test-install-pair.sh +9 -9
- package/deploy/systemd/install.sh +16 -1
- package/deploy/systemd/setup-litertlm.sh +201 -0
- package/deploy/systemd/trillboards-edge.service +8 -4
- package/deploy/systemd/trillboards-litertlm.service +46 -0
- package/deploy/windows/register-task.ps1 +6 -3
- package/deploy/windows/run-connector.ps1 +1 -1
- package/deploy/windows/trillboards-edge-task.vbs +5 -1
- package/dist/CloudSensingManager.d.ts +45 -19
- package/dist/CloudSensingManager.d.ts.map +1 -1
- package/dist/CloudSensingManager.js +89 -46
- package/dist/CloudSensingManager.js.map +1 -1
- package/dist/EdgeAgent.js +1 -1
- package/dist/SensingProfileClient.d.ts +9 -0
- package/dist/SensingProfileClient.d.ts.map +1 -1
- package/dist/SensingProfileClient.js +4 -0
- package/dist/SensingProfileClient.js.map +1 -1
- package/dist/SetupSessionClient.d.ts +0 -1
- package/dist/SetupSessionClient.d.ts.map +1 -1
- package/dist/autoSense.d.ts +42 -31
- package/dist/autoSense.d.ts.map +1 -1
- package/dist/autoSense.js +127 -99
- package/dist/autoSense.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +25 -84
- package/dist/cli.js.map +1 -1
- package/dist/combinedSense.d.ts +1 -3
- package/dist/combinedSense.d.ts.map +1 -1
- package/dist/combinedSense.js +0 -1
- package/dist/combinedSense.js.map +1 -1
- package/dist/config.d.ts +17 -64
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -10
- package/dist/config.js.map +1 -1
- package/dist/deployedCadence.d.ts +37 -75
- package/dist/deployedCadence.d.ts.map +1 -1
- package/dist/deployedCadence.js +45 -105
- package/dist/deployedCadence.js.map +1 -1
- package/dist/deployedCadenceSource.d.ts +0 -2
- package/dist/deployedCadenceSource.d.ts.map +1 -1
- package/dist/deployedCadenceSource.js +0 -1
- package/dist/deployedCadenceSource.js.map +1 -1
- package/dist/diagnose.d.ts +1 -1
- package/dist/diagnose.js +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/dist/localInferenceSchema.d.ts +19 -0
- package/dist/localInferenceSchema.d.ts.map +1 -1
- package/dist/localInferenceSchema.js +23 -0
- package/dist/localInferenceSchema.js.map +1 -1
- package/dist/localSensing.d.ts +48 -107
- package/dist/localSensing.d.ts.map +1 -1
- package/dist/localSensing.js +80 -171
- package/dist/localSensing.js.map +1 -1
- package/dist/sensingCatchRate.d.ts +246 -0
- package/dist/sensingCatchRate.d.ts.map +1 -0
- package/dist/sensingCatchRate.js +514 -0
- package/dist/sensingCatchRate.js.map +1 -0
- package/dist/sensingRunMode.d.ts +14 -11
- package/dist/sensingRunMode.d.ts.map +1 -1
- package/dist/sensingRunMode.js +9 -92
- package/dist/sensingRunMode.js.map +1 -1
- package/dist/setupMode.d.ts +0 -1
- package/dist/setupMode.d.ts.map +1 -1
- package/dist/setupMode.js +5 -3
- package/dist/setupMode.js.map +1 -1
- package/dist/startupDiscovery.d.ts +43 -0
- package/dist/startupDiscovery.d.ts.map +1 -0
- package/dist/startupDiscovery.js +72 -0
- package/dist/startupDiscovery.js.map +1 -0
- package/package.json +1 -1
- package/dist/CloudEscalationPolicy.d.ts +0 -143
- package/dist/CloudEscalationPolicy.d.ts.map +0 -1
- package/dist/CloudEscalationPolicy.js +0 -137
- package/dist/CloudEscalationPolicy.js.map +0 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# setup-litertlm.sh (Linux/systemd) — provision the LiteRT-LM on-device VLM
|
|
4
|
+
# runtime for the BYO-CCTV LOCAL-INFERENCE-ONLY connector.
|
|
5
|
+
#
|
|
6
|
+
# ── Why this file exists ────────────────────────────────────────────────────
|
|
7
|
+
#
|
|
8
|
+
# The systemd unit used to run `cloud-sense`, so Linux was the ONE platform that
|
|
9
|
+
# ignored the local-first policy macOS and Windows already followed — and it did
|
|
10
|
+
# so per FRAME. Measured 2026-08-12 over 255,812 image-bearing cloud VLM calls:
|
|
11
|
+
# $0.007008 per analyzed frame. At a 30s cadence that is ~$605/camera/month, so a
|
|
12
|
+
# 16-camera store cost ~$9,688/month against a $99-500 subscription.
|
|
13
|
+
#
|
|
14
|
+
# The unit now runs `auto-sense`, which is local-or-wait. Without a local runtime
|
|
15
|
+
# a Linux install would therefore WAIT forever, so provisioning one is not
|
|
16
|
+
# optional here — it is the other half of removing the cloud path. This is the
|
|
17
|
+
# Linux sibling of deploy/macos/scripts/setup-litertlm.sh and
|
|
18
|
+
# deploy/windows/setup-litertlm.ps1; the three pin the SAME litert-lm version and
|
|
19
|
+
# the `litert-lm-version-pin` guard fails CI if they drift apart.
|
|
20
|
+
#
|
|
21
|
+
# Steps:
|
|
22
|
+
# 1. Ensure `uv` (home-domain standalone installer, no sudo, no system Python).
|
|
23
|
+
# 2. Install/repair `litert-lm` at the PINNED version with uv-managed Python.
|
|
24
|
+
# 3. `litert-lm import` the Gemma 4 E2B model from the public HF repo (~2.4 GB).
|
|
25
|
+
# Unlike the macOS/Windows customer packages there is no bundled model to
|
|
26
|
+
# stage from — the npm install path ships no payload — so the download IS
|
|
27
|
+
# the install here, and it is enabled by default on this platform only.
|
|
28
|
+
# 4. Install + start the `litert-lm serve` systemd unit on :9379. The
|
|
29
|
+
# connector's LiteRtVlmProvider talks to it.
|
|
30
|
+
#
|
|
31
|
+
# Idempotent and safe to re-run. Run as the `trillboards` service user:
|
|
32
|
+
# sudo -u trillboards HOME=/opt/trillboards bash setup-litertlm.sh
|
|
33
|
+
set -u
|
|
34
|
+
|
|
35
|
+
USER_HOME="${HOME:-/opt/trillboards}"
|
|
36
|
+
LOG_DIR="${TRILLBOARDS_LOG_DIR:-/var/log/trillboards}"
|
|
37
|
+
LOCAL_BIN="$USER_HOME/.local/bin"
|
|
38
|
+
MODEL_ID="gemma-4-E2B-it.litertlm"
|
|
39
|
+
HF_REPO="litert-community/gemma-4-E2B-it-litert-lm"
|
|
40
|
+
SERVE_PORT="9379"
|
|
41
|
+
SERVE_UNIT="trillboards-litertlm"
|
|
42
|
+
LITERT_PYTHON="${LITERT_LM_PYTHON:-3.12}"
|
|
43
|
+
# PINNED litert-lm. This is not hygiene — the accelerator is selected by posting
|
|
44
|
+
# a `<model-id>,gpu` model id, upstream calls that syntax deprecated, and it has
|
|
45
|
+
# already changed twice without any release of ours: 0.14.0 (2026-07-08) dropped
|
|
46
|
+
# both the `,gpu` entry from `GET /v1/models` AND the parse (measured: 404), and
|
|
47
|
+
# 0.15.0 restored the parse but never the entry. An unpinned `--upgrade` means a
|
|
48
|
+
# customer's per-frame latency can change 1.7-6.6x on a reinstall we did not ship.
|
|
49
|
+
# Keep in lockstep with deploy/macos/scripts/setup-litertlm.sh,
|
|
50
|
+
# deploy/windows/setup-litertlm.ps1, LiteRtVlmProvider's LITERT_LM_PINNED_VERSION,
|
|
51
|
+
# and .github/contracts/litert-lm-tested-versions.json — the `litert-lm-version-pin`
|
|
52
|
+
# guard fails CI if they diverge or if this version has no measured entry there.
|
|
53
|
+
LITERT_LM_VERSION="${LITERT_LM_VERSION:-0.16.0}"
|
|
54
|
+
# On Linux there is no bundled model to fall back FROM, so the network import is
|
|
55
|
+
# the primary path rather than an engineering opt-in.
|
|
56
|
+
ALLOW_MODEL_DOWNLOAD="${TRILLBOARDS_ALLOW_MODEL_DOWNLOAD:-1}"
|
|
57
|
+
LITERT_DIR="${LITERT_LM_DIR:-$USER_HOME/.litert-lm}"
|
|
58
|
+
STORE_DIR="$LITERT_DIR/models/$MODEL_ID"
|
|
59
|
+
# Installed model version — must match the sensing_model_registry `gemma_4_e2b`
|
|
60
|
+
# row. The connector's edge-core ModelManager seeds this (via the marker written
|
|
61
|
+
# below) so its first OTA check does NOT re-download the already-installed model.
|
|
62
|
+
MODEL_VERSION="${GEMMA_VLM_VERSION:-1.0.0}"
|
|
63
|
+
VERSION_MARKER="$STORE_DIR/trillboards-bundled-version.json"
|
|
64
|
+
|
|
65
|
+
mkdir -p "$LOG_DIR" 2>/dev/null || LOG_DIR="$USER_HOME"
|
|
66
|
+
LOG="$LOG_DIR/litertlm-setup.log"
|
|
67
|
+
log() {
|
|
68
|
+
printf '[trillboards setup-litertlm] %s %s\n' "$(date '+%H:%M:%S')" "$*" >>"$LOG" 2>&1
|
|
69
|
+
printf '[trillboards setup-litertlm] %s\n' "$*"
|
|
70
|
+
}
|
|
71
|
+
fail() { log "ERROR: $*"; exit 1; }
|
|
72
|
+
local_ai_healthy() {
|
|
73
|
+
curl -fsS --max-time 3 "http://127.0.0.1:$SERVE_PORT/v1/models" 2>/dev/null \
|
|
74
|
+
| grep -Fq "$MODEL_ID"
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# One provisioning process at a time. A re-run of install.sh is a normal recovery
|
|
78
|
+
# path, so duplicate launches must collapse without duplicate 2.4 GB downloads.
|
|
79
|
+
LOCK_DIR="$LOG_DIR/litertlm-setup.lock"
|
|
80
|
+
if ! mkdir "$LOCK_DIR" 2>/dev/null; then
|
|
81
|
+
LOCK_PID="$(cat "$LOCK_DIR/pid" 2>/dev/null || echo '')"
|
|
82
|
+
if [ -n "$LOCK_PID" ] &&
|
|
83
|
+
kill -0 "$LOCK_PID" 2>/dev/null &&
|
|
84
|
+
ps -p "$LOCK_PID" -o command= 2>/dev/null | grep -q '[s]etup-litertlm.sh'; then
|
|
85
|
+
log "LiteRT-LM provisioning is already running (pid $LOCK_PID)"
|
|
86
|
+
exit 0
|
|
87
|
+
fi
|
|
88
|
+
rm -rf "$LOCK_DIR" 2>/dev/null || true
|
|
89
|
+
mkdir "$LOCK_DIR" 2>/dev/null || { log "provisioning is already starting elsewhere"; exit 0; }
|
|
90
|
+
fi
|
|
91
|
+
printf '%s\n' "$$" > "$LOCK_DIR/pid" 2>/dev/null || true
|
|
92
|
+
trap 'rm -rf "$LOCK_DIR" 2>/dev/null || true' EXIT
|
|
93
|
+
trap 'exit 130' INT
|
|
94
|
+
trap 'exit 143' TERM
|
|
95
|
+
|
|
96
|
+
log "starting LiteRT-LM provisioning (pinned $LITERT_LM_VERSION)"
|
|
97
|
+
|
|
98
|
+
# 0. Enterprise TLS for uv. uv ships bundled Mozilla roots and does NOT consult
|
|
99
|
+
# the system trust store, so on a network that inspects TLS this step is the
|
|
100
|
+
# first thing that fails — and it fails with a message about local AI, which is
|
|
101
|
+
# the wrong cause. Same reasoning as the connector's own runtime trust-store
|
|
102
|
+
# merge (see cctv-connector-enterprise-tls-proxy.md): trust MORE, never less.
|
|
103
|
+
export UV_SYSTEM_CERTS=1
|
|
104
|
+
export UV_NATIVE_TLS=1
|
|
105
|
+
|
|
106
|
+
# 1. uv (PATH first; else the official standalone installer, home-domain).
|
|
107
|
+
export PATH="$LOCAL_BIN:$USER_HOME/.cargo/bin:$PATH"
|
|
108
|
+
if ! command -v uv >/dev/null 2>&1; then
|
|
109
|
+
log "uv not found — installing via astral.sh standalone installer (no sudo)"
|
|
110
|
+
curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR="$LOCAL_BIN" sh >>"$LOG" 2>&1 \
|
|
111
|
+
|| log "WARN: uv install failed"
|
|
112
|
+
export PATH="$LOCAL_BIN:$USER_HOME/.local/share/uv/bin:$PATH"
|
|
113
|
+
fi
|
|
114
|
+
UV="$(command -v uv || echo "$LOCAL_BIN/uv")"
|
|
115
|
+
if ! command -v "$UV" >/dev/null 2>&1 && [ ! -x "$UV" ]; then
|
|
116
|
+
fail "uv is unavailable; cannot install the local AI runtime"
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
# 2. litert-lm CLI. Keep a healthy existing install AT THE PINNED VERSION, but
|
|
120
|
+
# actively repair a broken or drifted one. The version check is part of
|
|
121
|
+
# "healthy": a `list`-only check keeps every machine on whatever it happened to
|
|
122
|
+
# install first, which is exactly how the `,gpu` regression hid on our hosts.
|
|
123
|
+
LITERTLM="$LOCAL_BIN/litert-lm"
|
|
124
|
+
[ -x "$LITERTLM" ] || LITERTLM="$(command -v litert-lm || echo "$LITERTLM")"
|
|
125
|
+
INSTALLED_LITERT_VERSION=""
|
|
126
|
+
if [ -x "$LITERTLM" ]; then
|
|
127
|
+
INSTALLED_LITERT_VERSION="$("$LITERTLM" --version 2>/dev/null | tr -d '\r' | awk '{print $NF}')"
|
|
128
|
+
fi
|
|
129
|
+
if [ -x "$LITERTLM" ] && [ "$INSTALLED_LITERT_VERSION" = "$LITERT_LM_VERSION" ] \
|
|
130
|
+
&& "$LITERTLM" list >/dev/null 2>&1; then
|
|
131
|
+
log "litert-lm CLI is healthy at pinned $LITERT_LM_VERSION — keeping current install"
|
|
132
|
+
else
|
|
133
|
+
if [ -n "$INSTALLED_LITERT_VERSION" ] && [ "$INSTALLED_LITERT_VERSION" != "$LITERT_LM_VERSION" ]; then
|
|
134
|
+
log "litert-lm $INSTALLED_LITERT_VERSION differs from pinned $LITERT_LM_VERSION — reinstalling"
|
|
135
|
+
fi
|
|
136
|
+
log "installing/repairing litert-lm==$LITERT_LM_VERSION with uv-managed Python $LITERT_PYTHON"
|
|
137
|
+
if ! "$UV" tool install --python "$LITERT_PYTHON" --managed-python --force "litert-lm==$LITERT_LM_VERSION" >>"$LOG" 2>&1; then
|
|
138
|
+
fail "litert-lm install/repair failed"
|
|
139
|
+
fi
|
|
140
|
+
LITERTLM="$LOCAL_BIN/litert-lm"
|
|
141
|
+
[ -x "$LITERTLM" ] || LITERTLM="$(command -v litert-lm || echo "$LITERTLM")"
|
|
142
|
+
if [ ! -x "$LITERTLM" ] || ! "$LITERTLM" list >/dev/null 2>&1; then
|
|
143
|
+
fail "litert-lm remains unhealthy after repair"
|
|
144
|
+
fi
|
|
145
|
+
log "litert-lm CLI repaired at $("$LITERTLM" --version 2>/dev/null | awk '{print $NF}')"
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
# 3. Model. Idempotent: skip entirely if litert-lm already has it.
|
|
149
|
+
HAVE_MODEL=0
|
|
150
|
+
if "$LITERTLM" list 2>/dev/null | grep -q "$MODEL_ID"; then
|
|
151
|
+
log "model $MODEL_ID already present — skipping import"
|
|
152
|
+
HAVE_MODEL=1
|
|
153
|
+
else
|
|
154
|
+
[ "$ALLOW_MODEL_DOWNLOAD" = "1" ] || fail "local AI model is missing and the network import is disabled"
|
|
155
|
+
log "importing $MODEL_ID from $HF_REPO (~2.4 GB, public repo) — this takes a while"
|
|
156
|
+
if "$LITERTLM" import --from-huggingface-repo "$HF_REPO" "$MODEL_ID" >>"$LOG" 2>&1; then
|
|
157
|
+
log "model imported"
|
|
158
|
+
HAVE_MODEL=1
|
|
159
|
+
else
|
|
160
|
+
fail "model import failed — the connector will WAIT (and beacon) until this succeeds"
|
|
161
|
+
fi
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
# Record the installed version next to the store model so the connector's
|
|
165
|
+
# edge-core ModelManager seeds it and does not re-download on its first OTA check.
|
|
166
|
+
if [ "$HAVE_MODEL" -eq 1 ]; then
|
|
167
|
+
mkdir -p "$STORE_DIR" 2>/dev/null || true
|
|
168
|
+
printf '{"version":"%s","modelType":"gemma-vlm"}\n' "$MODEL_VERSION" > "$VERSION_MARKER" 2>/dev/null \
|
|
169
|
+
&& log "recorded installed version $MODEL_VERSION at $VERSION_MARKER" \
|
|
170
|
+
|| log "WARN: could not write version marker $VERSION_MARKER"
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# 4. Serve unit. Installed by install.sh (which has sudo); here we only start it
|
|
174
|
+
# when we can, so a re-run from the service user still recovers a stopped serve.
|
|
175
|
+
if command -v systemctl >/dev/null 2>&1; then
|
|
176
|
+
if systemctl list-unit-files "$SERVE_UNIT.service" >/dev/null 2>&1; then
|
|
177
|
+
systemctl restart "$SERVE_UNIT" >>"$LOG" 2>&1 \
|
|
178
|
+
|| sudo -n systemctl restart "$SERVE_UNIT" >>"$LOG" 2>&1 \
|
|
179
|
+
|| log "WARN: could not restart $SERVE_UNIT — start it with: sudo systemctl restart $SERVE_UNIT"
|
|
180
|
+
else
|
|
181
|
+
log "WARN: $SERVE_UNIT.service is not installed yet (install.sh installs it)"
|
|
182
|
+
fi
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
log "waiting for local AI health check on :$SERVE_PORT"
|
|
186
|
+
HEALTHY=0
|
|
187
|
+
for _attempt in $(seq 1 60); do
|
|
188
|
+
if local_ai_healthy; then HEALTHY=1; break; fi
|
|
189
|
+
sleep 2
|
|
190
|
+
done
|
|
191
|
+
if [ "$HEALTHY" -eq 1 ]; then
|
|
192
|
+
log "local AI is installed and healthy — the connector will run ON-DEVICE"
|
|
193
|
+
else
|
|
194
|
+
# NOT fatal. auto-sense waits and beacons, so an install that gets this far
|
|
195
|
+
# with the model on disk recovers by itself once the serve comes up.
|
|
196
|
+
log "WARN: Gemma is installed but the serve did not answer yet; auto-sense will"
|
|
197
|
+
log "WARN: keep probing every 60s and reports itself as 'waiting' meanwhile."
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
log "done"
|
|
201
|
+
exit 0
|
|
@@ -10,10 +10,14 @@ User=trillboards
|
|
|
10
10
|
Group=trillboards
|
|
11
11
|
WorkingDirectory=/opt/trillboards
|
|
12
12
|
ExecStartPre=/usr/bin/node -e "require('@trillboards/edge-sdk')"
|
|
13
|
-
# This
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
|
|
13
|
+
# LOCAL INFERENCE ONLY. This unit used to hardcode `cloud-sense`, which made the
|
|
14
|
+
# Linux path the one install that ignored the local-first policy every other
|
|
15
|
+
# platform already followed — and it did so per FRAME, at $0.007008 each.
|
|
16
|
+
# `auto-sense` probes the LiteRT-LM serve `install.sh` provisions (see
|
|
17
|
+
# setup-litertlm.sh + trillboards-litertlm.service) and runs on-device; while the
|
|
18
|
+
# model is still importing it WAITS and beacons rather than metering the cloud.
|
|
19
|
+
# The paired config is written by install.sh; the token is never baked.
|
|
20
|
+
ExecStart=/usr/bin/npx trillboards-edge auto-sense --config /etc/trillboards/config.json
|
|
17
21
|
Restart=always
|
|
18
22
|
RestartSec=10
|
|
19
23
|
StartLimitInterval=300
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
[Unit]
|
|
2
|
+
Description=Trillboards LiteRT-LM (on-device VLM serve for the BYO-CCTV connector)
|
|
3
|
+
Documentation=https://github.com/trillboards/packages
|
|
4
|
+
After=network-online.target
|
|
5
|
+
Wants=network-online.target
|
|
6
|
+
# The connector is useless without this on a local-inference-only build, but it
|
|
7
|
+
# must not be Requires=: auto-sense WAITS and beacons when the serve is down, and
|
|
8
|
+
# that is a better operator experience than systemd tearing the connector down.
|
|
9
|
+
Before=trillboards-edge.service
|
|
10
|
+
|
|
11
|
+
[Service]
|
|
12
|
+
Type=simple
|
|
13
|
+
User=trillboards
|
|
14
|
+
Group=trillboards
|
|
15
|
+
WorkingDirectory=/opt/trillboards
|
|
16
|
+
# Path is written by setup-litertlm.sh; the tool lands in the trillboards user's
|
|
17
|
+
# home-domain uv bin, never system-wide (no sudo pip, no root-owned venv).
|
|
18
|
+
ExecStart=/opt/trillboards/.local/bin/litert-lm serve --host 127.0.0.1 --port 9379
|
|
19
|
+
Restart=always
|
|
20
|
+
RestartSec=10
|
|
21
|
+
StandardOutput=journal
|
|
22
|
+
StandardError=journal
|
|
23
|
+
SyslogIdentifier=trillboards-litertlm
|
|
24
|
+
|
|
25
|
+
# Security hardening. Looser than the connector unit on purpose: litert-lm needs
|
|
26
|
+
# its model store and, on a GPU host, the render nodes.
|
|
27
|
+
NoNewPrivileges=true
|
|
28
|
+
ProtectSystem=strict
|
|
29
|
+
ProtectHome=false
|
|
30
|
+
ReadWritePaths=/opt/trillboards
|
|
31
|
+
PrivateTmp=true
|
|
32
|
+
|
|
33
|
+
# Bind ONLY to loopback (see ExecStart --host). The connector's LiteRtVlmProvider
|
|
34
|
+
# talks to 127.0.0.1:9379; nothing off-box has any business reaching this.
|
|
35
|
+
IPAddressAllow=localhost
|
|
36
|
+
IPAddressDeny=any
|
|
37
|
+
|
|
38
|
+
# GPU delegate access when the host has one. Harmless on a CPU-only box.
|
|
39
|
+
SupplementaryGroups=video render
|
|
40
|
+
|
|
41
|
+
Environment=HOME=/opt/trillboards
|
|
42
|
+
Environment=LITERT_LM_DIR=/opt/trillboards/.litert-lm
|
|
43
|
+
EnvironmentFile=-/etc/trillboards/env
|
|
44
|
+
|
|
45
|
+
[Install]
|
|
46
|
+
WantedBy=multi-user.target
|
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
#>
|
|
8
8
|
param(
|
|
9
9
|
[Parameter(Mandatory = $true)][string]$InstallDir,
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
|
|
10
|
+
# auto-sense: use on-device Gemma (LiteRT-LM) and wait locally while the model
|
|
11
|
+
# is provisioning, reporting camera health throughout. `cloud-sense` is NOT in
|
|
12
|
+
# the set any more: the connector is local-inference only, and ValidateSet
|
|
13
|
+
# rejecting the value at registration is better than a task that registers
|
|
14
|
+
# fine and then exits 1 on every start.
|
|
15
|
+
[ValidateSet("auto-sense", "local-sense")][string]$Mode = "auto-sense"
|
|
13
16
|
)
|
|
14
17
|
$ErrorActionPreference = "Stop"
|
|
15
18
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[CmdletBinding()]
|
|
6
6
|
param(
|
|
7
7
|
[Parameter(Mandatory = $true)][string]$InstallDir,
|
|
8
|
-
[ValidateSet("auto-sense", "local-sense"
|
|
8
|
+
[ValidateSet("auto-sense", "local-sense")][string]$Mode = "auto-sense"
|
|
9
9
|
)
|
|
10
10
|
|
|
11
11
|
$ErrorActionPreference = "Stop"
|
|
@@ -10,7 +10,11 @@ scriptDir = fso.GetParentFolderName(WScript.ScriptFullName)
|
|
|
10
10
|
installDir = fso.GetParentFolderName(scriptDir)
|
|
11
11
|
mode = "auto-sense"
|
|
12
12
|
If WScript.Arguments.Count > 0 Then mode = LCase(Trim(WScript.Arguments(0)))
|
|
13
|
-
|
|
13
|
+
' cloud-sense is gone (local-inference only). An existing scheduled task still
|
|
14
|
+
' passing it falls back to auto-sense here rather than failing to launch: this
|
|
15
|
+
' is the LAUNCHER, and on an unattended store PC a silent non-start is worse
|
|
16
|
+
' than running the mode we would have wanted anyway.
|
|
17
|
+
If mode <> "auto-sense" And mode <> "local-sense" Then
|
|
14
18
|
mode = "auto-sense"
|
|
15
19
|
End If
|
|
16
20
|
|
|
@@ -29,16 +29,6 @@ export interface SensingClient {
|
|
|
29
29
|
} & FrameDimensions): Promise<AudienceAnalyzeResponse>;
|
|
30
30
|
reportCameraHealth?(cameraHealth: CameraHealthReport): Promise<AudienceAnalyzeResponse>;
|
|
31
31
|
getEndpoint(): string;
|
|
32
|
-
/**
|
|
33
|
-
* Cloud escalations this client has made (LocalSensingClient only). Optional
|
|
34
|
-
* so the plain cloud client — which has nothing to escalate TO — implements
|
|
35
|
-
* nothing. Aggregated into `getSensingHealth()` because a frame leaving the
|
|
36
|
-
* premises has to be countable by the operator, not just documented.
|
|
37
|
-
*/
|
|
38
|
-
getEscalationStats?(): {
|
|
39
|
-
enabled: boolean;
|
|
40
|
-
escalated: number;
|
|
41
|
-
};
|
|
42
32
|
/**
|
|
43
33
|
* Frames this client analyzed ON THIS MACHINE (LocalSensingClient only).
|
|
44
34
|
*
|
|
@@ -342,6 +332,25 @@ export declare class CloudSensingManager extends EventEmitter {
|
|
|
342
332
|
private runStartedAtMs;
|
|
343
333
|
/** One decode-only probe at a time protects recorder session limits. */
|
|
344
334
|
private healthCaptureInFlight;
|
|
335
|
+
/**
|
|
336
|
+
* HEALTH-ONLY run: open the cameras, prove video, report camera health — and
|
|
337
|
+
* run NO inference at all.
|
|
338
|
+
*
|
|
339
|
+
* This is what `auto-sense` runs while it is WAITING for the on-device model.
|
|
340
|
+
* Before it existed, `waiting` started no manager, so the connector emitted no
|
|
341
|
+
* analyze, no camera health and no heartbeat: a machine whose model was still
|
|
342
|
+
* importing was byte-for-byte indistinguishable in the portal from a machine
|
|
343
|
+
* that was switched off. That is the single most expensive support call the
|
|
344
|
+
* local-only connector can generate, and it is generated by the HAPPY path
|
|
345
|
+
* (a first boot downloading 2.4 GB).
|
|
346
|
+
*
|
|
347
|
+
* It reports `sensingState:'unavailable'` — the camera is fine, the AI is not
|
|
348
|
+
* running — which is a field the server already accepts, so this needs no API
|
|
349
|
+
* change. It deliberately does NOT write `lastFailureClass`: that column is
|
|
350
|
+
* rendered to owners as "the reason your camera is broken", and a waiting
|
|
351
|
+
* model is not a camera fault (see ember-camera-health-taxonomy.md).
|
|
352
|
+
*/
|
|
353
|
+
private healthOnlyMode;
|
|
345
354
|
constructor(options: CloudSensingManagerOptions);
|
|
346
355
|
/**
|
|
347
356
|
* Retune a RUNNING connector's still-scene cadence.
|
|
@@ -482,13 +491,6 @@ export declare class CloudSensingManager extends EventEmitter {
|
|
|
482
491
|
oldestAgeMs: number | null;
|
|
483
492
|
perFeed: VlmCandidateBufferStats['perFeed'];
|
|
484
493
|
};
|
|
485
|
-
/**
|
|
486
|
-
* Frames sent to the cloud VLM for confirmation (local sensing with
|
|
487
|
-
* escalation enabled). 0 — and `cloudEscalationEnabled:false` — for a
|
|
488
|
-
* fully-local or cloud-sensing deployment.
|
|
489
|
-
*/
|
|
490
|
-
cloudEscalated: number;
|
|
491
|
-
cloudEscalationEnabled: boolean;
|
|
492
494
|
/**
|
|
493
495
|
* WHICH litert-lm delegate the on-device runtime is actually running, and
|
|
494
496
|
* why it is not the GPU when it is not.
|
|
@@ -521,14 +523,15 @@ export declare class CloudSensingManager extends EventEmitter {
|
|
|
521
523
|
candidatesBuffered: number;
|
|
522
524
|
/** Candidates of this feed's that the hold delivered to the model. */
|
|
523
525
|
candidatesServed: number;
|
|
524
|
-
cloudEscalated: number;
|
|
525
526
|
faceDetected: boolean;
|
|
526
527
|
currentIntervalMs: number;
|
|
527
528
|
}>;
|
|
528
529
|
};
|
|
529
530
|
isRunning(): boolean;
|
|
530
531
|
/** Open cameras, prove one frame, and start capture loops without one slow feed blocking others. */
|
|
531
|
-
start(
|
|
532
|
+
start(opts?: {
|
|
533
|
+
healthOnly?: boolean;
|
|
534
|
+
}): Promise<void>;
|
|
532
535
|
/** Stop all loops and close cameras. */
|
|
533
536
|
stop(): Promise<void>;
|
|
534
537
|
/**
|
|
@@ -565,6 +568,13 @@ export declare class CloudSensingManager extends EventEmitter {
|
|
|
565
568
|
* REPORTING rather than the rate of watching.
|
|
566
569
|
*/
|
|
567
570
|
private intervalFor;
|
|
571
|
+
/**
|
|
572
|
+
* What to report as the AI state when the camera is up but nothing has been
|
|
573
|
+
* analyzed yet. `idle` while sensing; `unavailable` while WAITING for a local
|
|
574
|
+
* model, because "idle" would claim an AI that is ready and simply between
|
|
575
|
+
* frames.
|
|
576
|
+
*/
|
|
577
|
+
private idleSensingState;
|
|
568
578
|
/**
|
|
569
579
|
* Per-feed phase step, derived from FEED COUNT and CADENCE instead of a fixed
|
|
570
580
|
* per-feed cap.
|
|
@@ -670,6 +680,22 @@ export declare class CloudSensingManager extends EventEmitter {
|
|
|
670
680
|
* legacy recorders to one extra short-lived ffmpeg pull at a time.
|
|
671
681
|
*/
|
|
672
682
|
private captureHealthFrame;
|
|
683
|
+
/**
|
|
684
|
+
* What one tick DOES: a full capture+inference pass, or — while waiting for a
|
|
685
|
+
* local model — a decode-only health probe that proves the camera and reports
|
|
686
|
+
* it, with no inference and no upload of the frame.
|
|
687
|
+
*
|
|
688
|
+
* Deliberately NOT `async`, for the same reason `captureAndPost` below is not
|
|
689
|
+
* — and this one was, briefly, which is how the rule got tested. Marking it
|
|
690
|
+
* `async` adds a microtask hop in front of EVERY capture, including the
|
|
691
|
+
* health-only path this dispatcher was added for and the normal path it was
|
|
692
|
+
* not supposed to touch. `CloudSensingManagerReconnect.test.ts` drained a
|
|
693
|
+
* fixed three `await Promise.resolve()` per fake-timer advance; one extra hop
|
|
694
|
+
* left the reconnect chain one turn short, the camera never re-opened, and a
|
|
695
|
+
* test with no behaviour change under it went red. Handing the promise
|
|
696
|
+
* straight back keeps the delta at zero where it belongs.
|
|
697
|
+
*/
|
|
698
|
+
private captureWork;
|
|
673
699
|
/**
|
|
674
700
|
* One cascade pass for a feed. Which pass depends on whether there is a
|
|
675
701
|
* cascade to name a candidate — see the class header for why the order
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudSensingManager.d.ts","sourceRoot":"","sources":["../src/CloudSensingManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EAEvB,KAAK,eAAe,EACpB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAoB,MAAM,gBAAgB,CAAC;AAErE,OAAO,KAAK,EAAoB,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEhG,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAsLtF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAS/E;AAqBD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,OAAO,CACL,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,GAChE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACpC,kBAAkB,CAAC,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxF,WAAW,IAAI,MAAM,CAAC;IACtB
|
|
1
|
+
{"version":3,"file":"CloudSensingManager.d.ts","sourceRoot":"","sources":["../src/CloudSensingManager.ts"],"names":[],"mappings":"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"}
|