@trillboards/edge-sdk 0.2.67 → 0.2.68
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/deploy/macos/README.md +5 -5
- package/deploy/macos/TrillboardsSetupApp.m +16 -16
- package/deploy/macos/build-macos-pkg.sh +7 -7
- package/deploy/macos/pair.command +21 -21
- package/deploy/macos/scripts/postinstall +4 -2
- package/deploy/macos/test-install-pair.sh +4 -4
- package/deploy/windows/README.md +2 -2
- package/deploy/windows/bundle-windows-installer.ps1 +1 -1
- package/deploy/windows/installer.nsi +19 -13
- package/deploy/windows/setup-litertlm.ps1 +1 -1
- package/deploy/windows/trillboards-pair.cmd +17 -17
- package/deploy/windows/trillboards-setup.ps1 +18 -18
- package/dist/CloudSensingManager.d.ts +18 -0
- package/dist/CloudSensingManager.d.ts.map +1 -1
- package/dist/CloudSensingManager.js +39 -0
- package/dist/CloudSensingManager.js.map +1 -1
- package/dist/ConnectorStatusClient.d.ts +59 -0
- package/dist/ConnectorStatusClient.d.ts.map +1 -1
- package/dist/ConnectorStatusClient.js +9 -0
- package/dist/ConnectorStatusClient.js.map +1 -1
- package/dist/EdgeAgent.js +1 -1
- package/dist/autoSense.d.ts +14 -0
- package/dist/autoSense.d.ts.map +1 -1
- package/dist/autoSense.js +23 -0
- package/dist/autoSense.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/connectorUpdate.d.ts +53 -0
- package/dist/connectorUpdate.d.ts.map +1 -1
- package/dist/connectorUpdate.js +91 -2
- package/dist/connectorUpdate.js.map +1 -1
- package/dist/diagnose.d.ts +1 -1
- package/dist/diagnose.js +1 -1
- package/dist/hostSpecs.d.ts +115 -0
- package/dist/hostSpecs.d.ts.map +1 -0
- package/dist/hostSpecs.js +264 -0
- package/dist/hostSpecs.js.map +1 -0
- package/dist/sensingRunMode.d.ts +16 -0
- package/dist/sensingRunMode.d.ts.map +1 -1
- package/dist/sensingRunMode.js.map +1 -1
- package/dist/setupMode.d.ts +7 -11
- package/dist/setupMode.d.ts.map +1 -1
- package/dist/setupMode.js +27 -31
- package/dist/setupMode.js.map +1 -1
- package/package.json +1 -1
package/deploy/macos/README.md
CHANGED
|
@@ -21,7 +21,7 @@ What lands on disk (home-domain, **no sudo / no admin password**):
|
|
|
21
21
|
share/ensure-litertlm.sh background local-AI retry supervisor
|
|
22
22
|
share/apply-update.sh signed-pkg updater with rollback
|
|
23
23
|
share/models/gemma-4-E2B-it.litertlm required customer local VLM (removed after import)
|
|
24
|
-
~/Applications/
|
|
24
|
+
~/Applications/Sense Anything Connector.app native customer setup window (opened automatically)
|
|
25
25
|
~/Library/Application Support/Trillboards/trillboards.config.json (after pair, 0600)
|
|
26
26
|
~/Library/Logs/Trillboards/edge.{out,err}.log
|
|
27
27
|
~/Library/LaunchAgents/com.trillboards.edge.plist (after pair)
|
|
@@ -45,13 +45,13 @@ delivered **only by pairing** — it is never baked into the `.pkg`.
|
|
|
45
45
|
no admin password. (Equivalent CLI: `installer -pkg <pkg> -target
|
|
46
46
|
CurrentUserHomeDirectory`.)
|
|
47
47
|
3. The installer installs and verifies the connector and included local AI
|
|
48
|
-
model. Only then does **
|
|
49
|
-
**Start setup**. The app opens the signed-in
|
|
48
|
+
model. Only then does **Sense Anything Connector** open automatically. Select
|
|
49
|
+
**Start setup**. The app opens the signed-in Sense Anything camera wizard,
|
|
50
50
|
finds recorders on the local network, and validates each channel before any
|
|
51
51
|
camera screens are created. Black, disconnected, and unreadable inputs are
|
|
52
52
|
ignored. After the working cameras are saved, the already-installed local AI
|
|
53
|
-
begins sensing and the connector starts at every login. Reopen **
|
|
54
|
-
|
|
53
|
+
begins sensing and the connector starts at every login. Reopen **Sense
|
|
54
|
+
Anything Connector** from
|
|
55
55
|
`~/Applications` to resume or repair setup.
|
|
56
56
|
|
|
57
57
|
That's it. To check it's sensing: `tail -f ~/Library/Logs/Trillboards/edge.out.log`.
|
|
@@ -73,7 +73,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
73
73
|
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
|
|
74
74
|
(void)notification;
|
|
75
75
|
self.lastStage = @"welcome";
|
|
76
|
-
self.portalURL = @"https://app.senseanything.com/
|
|
76
|
+
self.portalURL = @"https://app.senseanything.com/sense/cameras";
|
|
77
77
|
self.setupStarted = NO;
|
|
78
78
|
[NSDistributedNotificationCenter.defaultCenter addObserver:self
|
|
79
79
|
selector:@selector(activateSetupWindow:)
|
|
@@ -209,8 +209,8 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
209
209
|
TrillboardsSetupDelegate *strongSelf = weakSelf;
|
|
210
210
|
if (!strongSelf || strongSelf.terminating || [strongSelf.lastStage isEqualToString:@"ready"] || [strongSelf.lastStage isEqualToString:@"error"] || [strongSelf.lastStage isEqualToString:@"local_ai_error"]) return;
|
|
211
211
|
NSString *message = exitCode >= 0
|
|
212
|
-
? [NSString stringWithFormat:@"The camera setup helper exited with code %ld. Try again; if it repeats, send setup-app.log to
|
|
213
|
-
: @"The camera setup helper stopped unexpectedly. Try again; if it repeats, send setup-app.log to
|
|
212
|
+
? [NSString stringWithFormat:@"The camera setup helper exited with code %ld. Try again; if it repeats, send setup-app.log to Sense Anything support.", (long)exitCode]
|
|
213
|
+
: @"The camera setup helper stopped unexpectedly. Try again; if it repeats, send setup-app.log to Sense Anything support.";
|
|
214
214
|
[strongSelf showLocalError:@"Setup stopped before finishing" message:message];
|
|
215
215
|
});
|
|
216
216
|
}
|
|
@@ -221,7 +221,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
221
221
|
styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable
|
|
222
222
|
backing:NSBackingStoreBuffered
|
|
223
223
|
defer:NO];
|
|
224
|
-
self.window.title = @"
|
|
224
|
+
self.window.title = @"Sense Anything Connector";
|
|
225
225
|
self.window.minSize = NSMakeSize(760, 540);
|
|
226
226
|
self.window.maxSize = NSMakeSize(760, 540);
|
|
227
227
|
[self.window center];
|
|
@@ -232,7 +232,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
232
232
|
sidebar.layer.backgroundColor = NSColor.controlBackgroundColor.CGColor;
|
|
233
233
|
[root addSubview:sidebar];
|
|
234
234
|
|
|
235
|
-
NSTextField *brand = [self label:@"
|
|
235
|
+
NSTextField *brand = [self label:@"Sense Anything" size:16 weight:NSFontWeightSemibold frame:NSMakeRect(24, 480, 145, 28)];
|
|
236
236
|
[sidebar addSubview:brand];
|
|
237
237
|
|
|
238
238
|
NSArray<NSString *> *names = @[@"Welcome", @"Account", @"Recorder", @"Cameras", @"Local AI", @"Ready"];
|
|
@@ -297,7 +297,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
297
297
|
- (void)showWelcome {
|
|
298
298
|
self.lastStage = @"welcome";
|
|
299
299
|
self.headline.stringValue = @"Set up this computer for CCTV";
|
|
300
|
-
self.detail.stringValue = @"Connect your
|
|
300
|
+
self.detail.stringValue = @"Connect your Sense Anything account, find your recorder, and verify every camera before screens are created.";
|
|
301
301
|
self.statusValue.stringValue = @"About 5 minutes";
|
|
302
302
|
self.statusValue.font = [NSFont systemFontOfSize:25 weight:NSFontWeightSemibold];
|
|
303
303
|
self.metric.stringValue = @"Keep this computer and the recorder on the same network.";
|
|
@@ -324,7 +324,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
324
324
|
[self.lastStage isEqualToString:@"account_attention"]) {
|
|
325
325
|
[self openURL:self.portalURL];
|
|
326
326
|
} else if ([self.lastStage isEqualToString:@"ready"]) {
|
|
327
|
-
[self openURL:@"https://app.senseanything.com/
|
|
327
|
+
[self openURL:@"https://app.senseanything.com/sense/cameras"];
|
|
328
328
|
} else if ([self.lastStage isEqualToString:@"local_ai_error"]) {
|
|
329
329
|
[NSApp terminate:nil];
|
|
330
330
|
} else if ([self.lastStage isEqualToString:@"welcome"] || [self.lastStage isEqualToString:@"error"]) {
|
|
@@ -340,7 +340,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
340
340
|
NSString *logPath = [logDirectory stringByAppendingPathComponent:@"setup-app.log"];
|
|
341
341
|
NSFileManager *files = NSFileManager.defaultManager;
|
|
342
342
|
if (![files isExecutableFileAtPath:pairer]) {
|
|
343
|
-
[self showLocalError:@"Setup app is incomplete" message:@"Reinstall the
|
|
343
|
+
[self showLocalError:@"Setup app is incomplete" message:@"Reinstall the Sense Anything Connector, then try again."];
|
|
344
344
|
return;
|
|
345
345
|
}
|
|
346
346
|
[files createDirectoryAtPath:stateDirectory withIntermediateDirectories:YES attributes:nil error:nil];
|
|
@@ -351,7 +351,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
351
351
|
self.lastStage = @"starting";
|
|
352
352
|
self.setupStarted = YES;
|
|
353
353
|
self.headline.stringValue = @"Starting camera setup";
|
|
354
|
-
self.detail.stringValue = @"Connecting securely to
|
|
354
|
+
self.detail.stringValue = @"Connecting securely to Sense Anything.";
|
|
355
355
|
self.statusValue.stringValue = @"Please wait";
|
|
356
356
|
self.metric.stringValue = @"No Terminal or command window is required.";
|
|
357
357
|
self.progress.doubleValue = 8;
|
|
@@ -362,7 +362,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
362
362
|
arguments:@[@"--setup", @"--status-file", statePath]
|
|
363
363
|
logPath:logPath
|
|
364
364
|
error:&error]) {
|
|
365
|
-
[self showLocalError:@"Could not start setup" message:@"Reinstall the
|
|
365
|
+
[self showLocalError:@"Could not start setup" message:@"Reinstall the Sense Anything Connector, then try again."];
|
|
366
366
|
return;
|
|
367
367
|
}
|
|
368
368
|
}
|
|
@@ -422,11 +422,11 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
422
422
|
} else if ([stage isEqualToString:@"account_attention"]) {
|
|
423
423
|
self.metric.stringValue = @"No cameras were added. It is safe to switch accounts.";
|
|
424
424
|
} else if ([stage isEqualToString:@"local_ai"]) {
|
|
425
|
-
self.metric.stringValue = @"Checking the private model installed with
|
|
425
|
+
self.metric.stringValue = @"Checking the private model installed with Sense Anything.";
|
|
426
426
|
} else if ([stage isEqualToString:@"local_ai_error"]) {
|
|
427
|
-
self.metric.stringValue = @"Reinstall
|
|
427
|
+
self.metric.stringValue = @"Reinstall the Sense Anything Connector; your camera pairing is saved.";
|
|
428
428
|
} else if ([stage isEqualToString:@"ready"]) {
|
|
429
|
-
self.metric.stringValue = @"
|
|
429
|
+
self.metric.stringValue = @"Sense Anything starts automatically when this computer logs in.";
|
|
430
430
|
} else if ([stage isEqualToString:@"error"]) {
|
|
431
431
|
self.metric.stringValue = @"Details: Library/Logs/Trillboards/setup-app.log";
|
|
432
432
|
} else {
|
|
@@ -436,7 +436,7 @@ static BOOL acquireSetupInstanceLock(void) {
|
|
|
436
436
|
self.progress.doubleValue = [self progressForStage:stage];
|
|
437
437
|
[self updateSteps:[self stepForStage:stage]];
|
|
438
438
|
if ([stage isEqualToString:@"waiting_for_account"]) {
|
|
439
|
-
self.actionButton.title = @"Open
|
|
439
|
+
self.actionButton.title = @"Open Sense Anything";
|
|
440
440
|
self.actionButton.enabled = YES;
|
|
441
441
|
} else if ([stage isEqualToString:@"account_attention"]) {
|
|
442
442
|
self.actionButton.title = @"Switch account";
|
|
@@ -536,7 +536,7 @@ static int runCancellationSmokeTest(void) {
|
|
|
536
536
|
fprintf(stderr, "Native setup cancellation smoke test left a process running.\n");
|
|
537
537
|
return 1;
|
|
538
538
|
}
|
|
539
|
-
fprintf(stdout, "
|
|
539
|
+
fprintf(stdout, "Sense Anything Connector cancellation smoke test passed.\n");
|
|
540
540
|
return 0;
|
|
541
541
|
}
|
|
542
542
|
|
|
@@ -571,7 +571,7 @@ static int runTemporaryDirectorySmokeTest(void) {
|
|
|
571
571
|
}
|
|
572
572
|
rmdir(created);
|
|
573
573
|
free(template);
|
|
574
|
-
fprintf(stdout, "
|
|
574
|
+
fprintf(stdout, "Sense Anything Connector temporary-directory smoke test passed.\n");
|
|
575
575
|
return 0;
|
|
576
576
|
}
|
|
577
577
|
|
|
@@ -179,7 +179,7 @@ PAYLOAD="$STAGE/$INSTALL_SUBDIR" # …/Library/Trillboards/edge
|
|
|
179
179
|
SCRATCH="$DIST_DIR/scratch-$ARCH_LABEL"
|
|
180
180
|
PKG_OUT="$DIST_DIR/${INSTALLER_NAME}.pkg"
|
|
181
181
|
COMPONENT_PKG="$SCRATCH/${APP_NAME}-component.pkg"
|
|
182
|
-
SETUP_APP="$STAGE/Applications/
|
|
182
|
+
SETUP_APP="$STAGE/Applications/Sense Anything Connector.app"
|
|
183
183
|
|
|
184
184
|
log() { printf '\033[1;34m[build]\033[0m %s\n' "$*"; }
|
|
185
185
|
warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*"; }
|
|
@@ -438,11 +438,11 @@ fi
|
|
|
438
438
|
# while the existing, proven setup engine runs invisibly in the background.
|
|
439
439
|
SETUP_APP_MACOS="$SETUP_APP/Contents/MacOS"
|
|
440
440
|
SETUP_APP_RESOURCES="$SETUP_APP/Contents/Resources"
|
|
441
|
-
SETUP_APP_BIN="$SETUP_APP_MACOS/
|
|
441
|
+
SETUP_APP_BIN="$SETUP_APP_MACOS/Sense Anything Connector"
|
|
442
442
|
mkdir -p "$SETUP_APP_MACOS" "$SETUP_APP_RESOURCES"
|
|
443
443
|
cp "$PKG_ROOT/deploy/branding/SenseAnythingConnector.icns" \
|
|
444
444
|
"$SETUP_APP_RESOURCES/SenseAnythingConnector.icns"
|
|
445
|
-
log "Building native
|
|
445
|
+
log "Building native Sense Anything Connector.app…"
|
|
446
446
|
if [ "$UNIVERSAL" -eq 1 ]; then
|
|
447
447
|
clang -fobjc-arc -Wall -Wextra -Werror -O2 -mmacosx-version-min=12.0 -arch arm64 -arch x86_64 -framework Cocoa \
|
|
448
448
|
"$PKG_ROOT/deploy/macos/TrillboardsSetupApp.m" -o "$SETUP_APP_BIN" \
|
|
@@ -470,18 +470,18 @@ cat > "$SETUP_APP/Contents/Info.plist" <<PLIST
|
|
|
470
470
|
<plist version="1.0">
|
|
471
471
|
<dict>
|
|
472
472
|
<key>CFBundleDevelopmentRegion</key><string>en</string>
|
|
473
|
-
<key>CFBundleDisplayName</key><string>
|
|
474
|
-
<key>CFBundleExecutable</key><string>
|
|
473
|
+
<key>CFBundleDisplayName</key><string>Sense Anything Connector</string>
|
|
474
|
+
<key>CFBundleExecutable</key><string>Sense Anything Connector</string>
|
|
475
475
|
<key>CFBundleIdentifier</key><string>com.trillboards.cctv-setup</string>
|
|
476
476
|
<key>CFBundleIconFile</key><string>SenseAnythingConnector</string>
|
|
477
477
|
<key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
|
|
478
|
-
<key>CFBundleName</key><string>
|
|
478
|
+
<key>CFBundleName</key><string>Sense Anything Connector</string>
|
|
479
479
|
<key>CFBundlePackageType</key><string>APPL</string>
|
|
480
480
|
<key>CFBundleShortVersionString</key><string>$VERSION</string>
|
|
481
481
|
<key>CFBundleVersion</key><string>$VERSION</string>
|
|
482
482
|
<key>LSMinimumSystemVersion</key><string>12.0</string>
|
|
483
483
|
<key>NSHighResolutionCapable</key><true/>
|
|
484
|
-
<key>NSLocalNetworkUsageDescription</key><string>
|
|
484
|
+
<key>NSLocalNetworkUsageDescription</key><string>Sense Anything uses your local network to find your camera recorder and validate its camera feeds.</string>
|
|
485
485
|
</dict>
|
|
486
486
|
</plist>
|
|
487
487
|
PLIST
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# Three modes:
|
|
7
7
|
# Native app (`--setup --status-file <path>`):
|
|
8
8
|
# runs validate-first setup without Terminal or AppleScript dialogs and
|
|
9
|
-
# reports credential-free progress to
|
|
9
|
+
# reports credential-free progress to Sense Anything Connector.app.
|
|
10
10
|
# Legacy GUI (no arguments):
|
|
11
11
|
# osascript prompts for the pairing code, runs the bundled
|
|
12
12
|
# `trillboards-edge pair`, bootstraps the per-user LaunchAgent, and shows
|
|
@@ -137,7 +137,7 @@ dialog_get_code() {
|
|
|
137
137
|
# Returns the entered code on stdout, or exits 2 if cancelled.
|
|
138
138
|
osascript <<'OSA' 2>/dev/null
|
|
139
139
|
try
|
|
140
|
-
set theResult to display dialog "Paste your
|
|
140
|
+
set theResult to display dialog "Paste your Sense Anything pairing code" & return & "(Get one from the Sense Anything portal → Add a camera → Install.)" default answer "" with title "Sense Anything — Pair this Mac" buttons {"Cancel", "Pair"} default button "Pair" with icon note
|
|
141
141
|
set theCode to text returned of theResult
|
|
142
142
|
return theCode
|
|
143
143
|
on error
|
|
@@ -154,7 +154,7 @@ OSA
|
|
|
154
154
|
dialog_choose_mode() {
|
|
155
155
|
osascript <<'OSA' 2>/dev/null
|
|
156
156
|
try
|
|
157
|
-
set theResult to display dialog "Connect this Mac's cameras to
|
|
157
|
+
set theResult to display dialog "Connect this Mac's cameras to Sense Anything." & return & return & "Start setup: this window shows a code, you type it in the portal, and the portal checks every camera BEFORE anything is created." with title "Sense Anything — Camera setup" buttons {"Cancel", "Classic code…", "Start setup"} default button "Start setup" with icon note
|
|
158
158
|
if button returned of theResult is "Start setup" then
|
|
159
159
|
return "setup"
|
|
160
160
|
else
|
|
@@ -167,10 +167,10 @@ OSA
|
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
dialog_info() { # $1 = message
|
|
170
|
-
osascript -e "display dialog \"$1\" with title \"
|
|
170
|
+
osascript -e "display dialog \"$1\" with title \"Sense Anything\" buttons {\"OK\"} default button \"OK\" with icon note" >/dev/null 2>&1 || true
|
|
171
171
|
}
|
|
172
172
|
dialog_error() { # $1 = message
|
|
173
|
-
osascript -e "display dialog \"$1\" with title \"
|
|
173
|
+
osascript -e "display dialog \"$1\" with title \"Sense Anything — Pairing failed\" buttons {\"OK\"} default button \"OK\" with icon stop" >/dev/null 2>&1 || true
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
# The ONE true remediation for "config dir/file owned by another account" — the
|
|
@@ -186,7 +186,7 @@ dialog_error() { # $1 = message
|
|
|
186
186
|
# consumed one. The pre-write guards fire BEFORE the code is spent → default.
|
|
187
187
|
perm_remediation_msg() {
|
|
188
188
|
cat <<MSG
|
|
189
|
-
|
|
189
|
+
Sense Anything can't save its settings because
|
|
190
190
|
$APP_SUPPORT
|
|
191
191
|
(or the config file inside it) is owned by another account — the installer ran
|
|
192
192
|
with admin rights. This is NOT a code problem.
|
|
@@ -268,7 +268,7 @@ if [ -e "$APP_SUPPORT" ] && [ ! -w "$APP_SUPPORT" ]; then
|
|
|
268
268
|
fi
|
|
269
269
|
if [ -e "$APP_SUPPORT" ] && [ ! -w "$APP_SUPPORT" ]; then
|
|
270
270
|
if is_ui; then
|
|
271
|
-
write_ui_status error "Camera settings need permission" "Reinstall
|
|
271
|
+
write_ui_status error "Camera settings need permission" "Reinstall Sense Anything for this account. If the problem continues, contact Sense Anything support."
|
|
272
272
|
elif is_headless; then
|
|
273
273
|
printf '[trillboards-pair] ERROR: %s\n' "$(perm_remediation_msg)" >&2
|
|
274
274
|
else
|
|
@@ -289,7 +289,7 @@ if [ -e "$CONFIG" ] && [ ! -w "$CONFIG" ]; then
|
|
|
289
289
|
fi
|
|
290
290
|
if [ -e "$CONFIG" ] && [ ! -w "$CONFIG" ]; then
|
|
291
291
|
if is_ui; then
|
|
292
|
-
write_ui_status error "Camera settings need permission" "Reinstall
|
|
292
|
+
write_ui_status error "Camera settings need permission" "Reinstall Sense Anything for this account. If the problem continues, contact Sense Anything support."
|
|
293
293
|
elif is_headless; then
|
|
294
294
|
printf '[trillboards-pair] ERROR: %s\n' "$(perm_remediation_msg)" >&2
|
|
295
295
|
else
|
|
@@ -325,7 +325,7 @@ if [ -f "$CONFIG" ] && [ "$(count_feeds_missing_rtsp)" = "0" ]; then
|
|
|
325
325
|
;;
|
|
326
326
|
2|5)
|
|
327
327
|
plog "resume: saved config, connection check failed (rc=$VERIFY_RC)"
|
|
328
|
-
MSG="This Mac already has a saved
|
|
328
|
+
MSG="This Mac already has a saved Sense Anything pairing, but it can't reach Sense Anything right now. Check the internet connection, then run this helper again — you will NOT need a new code."
|
|
329
329
|
if is_ui; then write_ui_status error "This computer is offline" "Check the internet connection, then try again. Your saved pairing is still secure."; elif is_headless; then echo "[trillboards-pair] $MSG" >&2; else dialog_error "$MSG"; fi
|
|
330
330
|
exit 1
|
|
331
331
|
;;
|
|
@@ -375,7 +375,7 @@ if [ "${SETUP_MODE:-0}" = "1" ]; then
|
|
|
375
375
|
elif [ "$SETUP_RC" -eq 3 ]; then
|
|
376
376
|
plog "setup: server 404 (rc=3) — classic fallback"
|
|
377
377
|
if is_ui; then
|
|
378
|
-
write_ui_status error "Setup is temporarily unavailable" "Try again shortly or contact
|
|
378
|
+
write_ui_status error "Setup is temporarily unavailable" "Try again shortly or contact Sense Anything support."
|
|
379
379
|
exit 1
|
|
380
380
|
fi
|
|
381
381
|
if ! CODE="$(dialog_get_code)"; then exit 0; fi
|
|
@@ -390,7 +390,7 @@ if [ "${SETUP_MODE:-0}" = "1" ]; then
|
|
|
390
390
|
exit 1
|
|
391
391
|
else
|
|
392
392
|
plog "setup: failed (rc=$SETUP_RC)"
|
|
393
|
-
if is_ui; then write_ui_status error "Setup needs attention" "Try again. If the problem continues, contact
|
|
393
|
+
if is_ui; then write_ui_status error "Setup needs attention" "Try again. If the problem continues, contact Sense Anything support."; else dialog_error "Setup hit an error. Details were saved to: $LOG_DIR/pairing.log — send that file to Sense Anything support if it keeps happening."; fi
|
|
394
394
|
exit 1
|
|
395
395
|
fi
|
|
396
396
|
fi
|
|
@@ -404,10 +404,10 @@ if [ -n "${CODE:-}" ]; then
|
|
|
404
404
|
PAIR_ARGS=(pair --code "$CODE" --config "$CONFIG")
|
|
405
405
|
[ -n "$API_BASE" ] && PAIR_ARGS+=(--api-base "$API_BASE")
|
|
406
406
|
|
|
407
|
-
SAVED_UNVERIFIED_MSG="Paired and saved, but this Mac can't reach
|
|
407
|
+
SAVED_UNVERIFIED_MSG="Paired and saved, but this Mac can't reach Sense Anything right now. Fix the internet connection, then run this helper again — it resumes automatically and you will NOT need a new code."
|
|
408
408
|
# rc=7: the API REJECTED the fresh pairing (auth) — unlike rc=6 the saved
|
|
409
409
|
# config is unusable and the owner genuinely needs a new code.
|
|
410
|
-
AUTH_REJECTED_MSG="
|
|
410
|
+
AUTH_REJECTED_MSG="Sense Anything rejected this new pairing. Generate a FRESH code in the portal and run this helper again."
|
|
411
411
|
|
|
412
412
|
if is_headless; then
|
|
413
413
|
echo "[trillboards-pair] pairing (headless)…"
|
|
@@ -483,7 +483,7 @@ if [ "${MISSING_RTSP:-0}" -gt 0 ] 2>/dev/null; then
|
|
|
483
483
|
$CONFIG
|
|
484
484
|
then run 'trillboards-edge auto-sense' (or re-run this pairing helper) to start. The background agent was NOT started yet so it won't crash-loop on an incomplete config."
|
|
485
485
|
if is_ui; then
|
|
486
|
-
write_ui_status error "Camera links are incomplete" "One or more cameras still need a stream link. Contact
|
|
486
|
+
write_ui_status error "Camera links are incomplete" "One or more cameras still need a stream link. Contact Sense Anything support."
|
|
487
487
|
elif is_headless; then
|
|
488
488
|
echo "[trillboards-pair] $MISSING_RTSP feed(s) missing rtspUrl — NOT bootstrapping LaunchAgent. Add URL(s) to $CONFIG then run auto-sense." >&2
|
|
489
489
|
else
|
|
@@ -494,26 +494,26 @@ fi
|
|
|
494
494
|
|
|
495
495
|
# The config is complete and verified. Local AI was installed before this wizard
|
|
496
496
|
# opened; confirm it is still healthy before starting the camera service.
|
|
497
|
-
write_ui_status local_ai "Checking local AI" "The cameras are ready. Verifying the private AI service installed with
|
|
497
|
+
write_ui_status local_ai "Checking local AI" "The cameras are ready. Verifying the private AI service installed with Sense Anything."
|
|
498
498
|
if ! verify_local_ai_setup; then
|
|
499
|
-
write_ui_status local_ai_error "Local AI needs attention" "The included local AI could not be started. Reinstall
|
|
499
|
+
write_ui_status local_ai_error "Local AI needs attention" "The included local AI could not be started. Reinstall the Sense Anything Connector; your camera pairing is saved."
|
|
500
500
|
exit 1
|
|
501
501
|
fi
|
|
502
502
|
|
|
503
|
-
write_ui_status starting_service "Starting
|
|
503
|
+
write_ui_status starting_service "Starting Sense Anything" "Installing and verifying the background camera service."
|
|
504
504
|
|
|
505
505
|
# "Bootstrapped" alone is not success — verify the agent PROCESS is actually
|
|
506
506
|
# running before telling the owner anything is running (the Windows twin of this
|
|
507
507
|
# lie left a 16-camera install "paired" with a never-registered task).
|
|
508
508
|
if bootstrap_agent && wait_agent_running; then
|
|
509
509
|
plog "agent: bootstrapped + running"
|
|
510
|
-
MSG="Paired and running. Local AI is installed and healthy.
|
|
511
|
-
write_ui_status ready "Camera setup is complete" "
|
|
510
|
+
MSG="Paired and running. Local AI is installed and healthy. Sense Anything starts automatically at login."
|
|
511
|
+
write_ui_status ready "Camera setup is complete" "Sense Anything and private local AI are running in the background."
|
|
512
512
|
if is_ui; then :; elif is_headless; then echo "[trillboards-pair] LaunchAgent running ($LABEL)"; else dialog_info "$MSG"; fi
|
|
513
513
|
exit 0
|
|
514
514
|
fi
|
|
515
515
|
|
|
516
516
|
plog "agent: bootstrap or start FAILED (not running after wait)"
|
|
517
|
-
MSG="Paired successfully, but the background agent did not start. Your pairing IS saved — nothing is lost. Try restarting this Mac (the agent starts at login). If it still fails, send this file to
|
|
518
|
-
if is_ui; then write_ui_status error "Cameras paired, service not running" "Restart this Mac, then open
|
|
517
|
+
MSG="Paired successfully, but the background agent did not start. Your pairing IS saved — nothing is lost. Try restarting this Mac (the agent starts at login). If it still fails, send this file to Sense Anything support: $LOG_DIR/pairing.log (plus edge.err.log in the same folder)."
|
|
518
|
+
if is_ui; then write_ui_status error "Cameras paired, service not running" "Restart this Mac, then open Sense Anything Connector again. Your pairing is saved."; elif is_headless; then echo "[trillboards-pair] ERROR: $MSG" >&2; else dialog_error "$MSG"; fi
|
|
519
519
|
exit 1
|
|
@@ -119,9 +119,11 @@ log "bundled local AI is installed and healthy"
|
|
|
119
119
|
# so customers never see Terminal or a command window. The app itself is
|
|
120
120
|
# part of the signed payload under ~/Applications.
|
|
121
121
|
APPS_DIR="$USER_HOME/Applications"
|
|
122
|
-
SETUP_APP="$APPS_DIR/
|
|
122
|
+
SETUP_APP="$APPS_DIR/Sense Anything Connector.app"
|
|
123
|
+
LEGACY_SETUP_APP="$APPS_DIR/Trillboards CCTV Setup.app"
|
|
123
124
|
LEGACY_PAIR_LAUNCHER="$APPS_DIR/Trillboards Pair.command"
|
|
124
125
|
rm -f "$LEGACY_PAIR_LAUNCHER" 2>/dev/null || true
|
|
126
|
+
rm -rf "$LEGACY_SETUP_APP" 2>/dev/null || true
|
|
125
127
|
if [ "$IS_UPGRADE" -eq 1 ]; then
|
|
126
128
|
log "paired connector upgrade detected; setup remains closed"
|
|
127
129
|
elif [ -d "$SETUP_APP" ] && [ -x "$EDGE_ROOT/bin/trillboards-pair" ]; then
|
|
@@ -158,6 +160,6 @@ fi
|
|
|
158
160
|
if [ "$IS_UPGRADE" -eq 1 ]; then
|
|
159
161
|
log "done. Connector update installed; existing pairing preserved."
|
|
160
162
|
else
|
|
161
|
-
log "done. Connector and local AI installed;
|
|
163
|
+
log "done. Connector and local AI installed; Sense Anything Connector opened automatically."
|
|
162
164
|
fi
|
|
163
165
|
exit 0
|
|
@@ -39,8 +39,8 @@ LOG_DIR="$HOME/Library/Logs/Trillboards"
|
|
|
39
39
|
LA_PLIST="$HOME/Library/LaunchAgents/com.trillboards.edge.plist"
|
|
40
40
|
LABEL="com.trillboards.edge"
|
|
41
41
|
# Customer-facing native setup application installed under the user's home.
|
|
42
|
-
SETUP_APP="$HOME/Applications/
|
|
43
|
-
SETUP_APP_BIN="$SETUP_APP/Contents/MacOS/
|
|
42
|
+
SETUP_APP="$HOME/Applications/Sense Anything Connector.app"
|
|
43
|
+
SETUP_APP_BIN="$SETUP_APP/Contents/MacOS/Sense Anything Connector"
|
|
44
44
|
LEGACY_PAIR_LAUNCHER="$HOME/Applications/Trillboards Pair.command"
|
|
45
45
|
UID_N="$(id -u)"
|
|
46
46
|
|
|
@@ -77,7 +77,7 @@ file_mode() {
|
|
|
77
77
|
# ─── Teardown (idempotent) — runs on EXIT so partial runs still clean up ──────
|
|
78
78
|
teardown() {
|
|
79
79
|
diag "teardown…"
|
|
80
|
-
pkill -x '
|
|
80
|
+
pkill -x 'Sense Anything Connector' >/dev/null 2>&1 || true
|
|
81
81
|
[ -n "$CS_PID" ] && kill "$CS_PID" >/dev/null 2>&1 || true
|
|
82
82
|
[ -n "$STUB_PID" ] && kill "$STUB_PID" >/dev/null 2>&1 || true
|
|
83
83
|
pkill -f "$STUB_JS" >/dev/null 2>&1 || true
|
|
@@ -94,7 +94,7 @@ teardown() {
|
|
|
94
94
|
trap teardown EXIT
|
|
95
95
|
|
|
96
96
|
# Pre-clean anything left by a prior aborted run BEFORE we start.
|
|
97
|
-
pkill -x '
|
|
97
|
+
pkill -x 'Sense Anything Connector' >/dev/null 2>&1 || true
|
|
98
98
|
launchctl bootout "gui/$UID_N/$LABEL" >/dev/null 2>&1 || true
|
|
99
99
|
rm -f "$LA_PLIST"
|
|
100
100
|
rm -rf "$HOME/Library/Trillboards" "$APP_SUPPORT" "$LOG_DIR"
|
package/deploy/windows/README.md
CHANGED
|
@@ -44,9 +44,9 @@ serves every Windows 10/11 — no per-arch builds.
|
|
|
44
44
|
2. Run it. Production installers are Authenticode-signed with Azure Trusted
|
|
45
45
|
Signing and the release workflow verifies the signature before publishing.
|
|
46
46
|
3. Installer copies the connector, installs and verifies the included local AI,
|
|
47
|
-
registers the startup tasks, then opens **
|
|
47
|
+
registers the startup tasks, then opens **Sense Anything Connector** without a
|
|
48
48
|
command window.
|
|
49
|
-
4. Select **Start setup**. The app opens the
|
|
49
|
+
4. Select **Start setup**. The app opens the Sense Anything camera wizard, discovers
|
|
50
50
|
local recorders, and validates each channel. Black, disconnected, and
|
|
51
51
|
unreadable inputs are ignored; only working camera feeds become screens.
|
|
52
52
|
5. Sensing starts with the already-installed local AI; cloud inference is off
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
!error "APP_ICON not defined (pass /DAPP_ICON=...)"
|
|
25
25
|
!endif
|
|
26
26
|
|
|
27
|
-
!define APP_NAME "
|
|
27
|
+
!define APP_NAME "Sense Anything Connector"
|
|
28
28
|
!define TASK_NAME "TrillboardsEdge"
|
|
29
29
|
!define LITERT_TASK_NAME "TrillboardsLiteRtLm"
|
|
30
30
|
!define MUI_ICON "${APP_ICON}"
|
|
@@ -51,14 +51,14 @@ Icon "${APP_ICON}"
|
|
|
51
51
|
UninstallIcon "${APP_ICON}"
|
|
52
52
|
SetCompressor /SOLID lzma
|
|
53
53
|
ShowInstDetails show
|
|
54
|
-
BrandingText "
|
|
54
|
+
BrandingText "Sense Anything"
|
|
55
55
|
|
|
56
56
|
!include "MUI2.nsh"
|
|
57
57
|
!include "FileFunc.nsh"
|
|
58
58
|
|
|
59
59
|
!define MUI_ABORTWARNING
|
|
60
|
-
!define MUI_WELCOMEPAGE_TITLE "Connect your
|
|
61
|
-
!define MUI_WELCOMEPAGE_TEXT "This installs the
|
|
60
|
+
!define MUI_WELCOMEPAGE_TITLE "Connect your cameras to Sense Anything"
|
|
61
|
+
!define MUI_WELCOMEPAGE_TEXT "This installs the Sense Anything Connector and its included private local AI. Camera pairing opens after both are installed and verified. Cloud inference stays off unless explicitly enabled."
|
|
62
62
|
!insertmacro MUI_PAGE_WELCOME
|
|
63
63
|
!insertmacro MUI_PAGE_INSTFILES
|
|
64
64
|
|
|
@@ -72,7 +72,7 @@ BrandingText "Trillboards"
|
|
|
72
72
|
!define MUI_FINISHPAGE_RUN
|
|
73
73
|
!define MUI_FINISHPAGE_RUN_FUNCTION LaunchSetupAppUnlessUnattended
|
|
74
74
|
!define MUI_FINISHPAGE_RUN_TEXT "Set up my CCTV cameras now"
|
|
75
|
-
!define MUI_FINISHPAGE_TEXT "The connector and private local AI are installed. Continue in the
|
|
75
|
+
!define MUI_FINISHPAGE_TEXT "The connector and private local AI are installed. Continue in the Sense Anything Connector app to pair your cameras."
|
|
76
76
|
!insertmacro MUI_PAGE_FINISH
|
|
77
77
|
|
|
78
78
|
Function LaunchSetupAppUnlessUnattended
|
|
@@ -136,7 +136,7 @@ Function .onInit
|
|
|
136
136
|
; forever. The default answer dismisses the box; the Abort on the next line
|
|
137
137
|
; is what actually decides the outcome, so a silent run FAILS here rather
|
|
138
138
|
; than proceeding without a model.
|
|
139
|
-
MessageBox MB_ICONSTOP|MB_OK "This installer is missing its included local AI model. Download the complete
|
|
139
|
+
MessageBox MB_ICONSTOP|MB_OK "This installer is missing its included local AI model. Download the complete Sense Anything Connector and try again." /SD IDOK
|
|
140
140
|
SetErrorLevel 2
|
|
141
141
|
Abort
|
|
142
142
|
${EndIf}
|
|
@@ -178,7 +178,7 @@ Section "Install"
|
|
|
178
178
|
nsExec::ExecToLog 'powershell -NoProfile -ExecutionPolicy Bypass -File "$PLUGINSDIR\install-update.ps1" -InstallDir "$INSTDIR" -StagingDir "$INSTDIR\.update-staging"'
|
|
179
179
|
Pop $0
|
|
180
180
|
${If} $0 != 0
|
|
181
|
-
MessageBox MB_ICONSTOP|MB_OK "
|
|
181
|
+
MessageBox MB_ICONSTOP|MB_OK "Sense Anything setup could not be updated safely. Your previous connector was restored. Please retry the installer." /SD IDOK
|
|
182
182
|
SetErrorLevel 3
|
|
183
183
|
Abort
|
|
184
184
|
${EndIf}
|
|
@@ -189,7 +189,7 @@ Section "Install"
|
|
|
189
189
|
; is synchronous and required: pairing is never offered while AI is absent or
|
|
190
190
|
; still downloading in the background.
|
|
191
191
|
${IfNot} ${FileExists} "$ModelSource"
|
|
192
|
-
MessageBox MB_ICONSTOP|MB_OK "The local AI model included with this installer could not be found. Download a fresh
|
|
192
|
+
MessageBox MB_ICONSTOP|MB_OK "The local AI model included with this installer could not be found. Download a fresh Sense Anything Connector." /SD IDOK
|
|
193
193
|
SetErrorLevel 2
|
|
194
194
|
Abort
|
|
195
195
|
${EndIf}
|
|
@@ -197,7 +197,7 @@ Section "Install"
|
|
|
197
197
|
nsExec::ExecToLog '"$WINDIR\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -File "$INSTDIR\bin\setup-litertlm.ps1" -BundledModelPath "$ModelSource" -RequireBundledModel'
|
|
198
198
|
Pop $0
|
|
199
199
|
${If} $0 != 0
|
|
200
|
-
MessageBox MB_ICONSTOP|MB_OK "Private local AI could not be installed. Camera pairing has not started. Download a fresh installer or contact
|
|
200
|
+
MessageBox MB_ICONSTOP|MB_OK "Private local AI could not be installed. Camera pairing has not started. Download a fresh installer or contact Sense Anything support." /SD IDOK
|
|
201
201
|
SetErrorLevel 4
|
|
202
202
|
Abort
|
|
203
203
|
${EndIf}
|
|
@@ -232,10 +232,13 @@ Section "Install"
|
|
|
232
232
|
${EndIf}
|
|
233
233
|
${EndIf}
|
|
234
234
|
|
|
235
|
-
; Start Menu shortcuts.
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
235
|
+
; Start Menu shortcuts. Remove the pre-rebrand entries during an upgrade.
|
|
236
|
+
Delete "$SMPROGRAMS\Trillboards\Trillboards CCTV Setup.lnk"
|
|
237
|
+
Delete "$SMPROGRAMS\Trillboards\Uninstall Trillboards Edge.lnk"
|
|
238
|
+
RMDir "$SMPROGRAMS\Trillboards"
|
|
239
|
+
CreateDirectory "$SMPROGRAMS\Sense Anything"
|
|
240
|
+
CreateShortcut "$SMPROGRAMS\Sense Anything\Sense Anything Connector.lnk" "$WINDIR\System32\wscript.exe" '$\"$INSTDIR\bin\trillboards-setup.vbs$\"' "$INSTDIR\SenseAnythingConnector.ico" 0
|
|
241
|
+
CreateShortcut "$SMPROGRAMS\Sense Anything\Uninstall Sense Anything Connector.lnk" "$INSTDIR\uninstall.exe"
|
|
239
242
|
|
|
240
243
|
; Uninstaller + Add/Remove Programs entry (per-user hive).
|
|
241
244
|
WriteUninstaller "$INSTDIR\uninstall.exe"
|
|
@@ -263,6 +266,9 @@ Section "Uninstall"
|
|
|
263
266
|
Delete "$SMPROGRAMS\Trillboards\Trillboards CCTV Setup.lnk"
|
|
264
267
|
Delete "$SMPROGRAMS\Trillboards\Uninstall Trillboards Edge.lnk"
|
|
265
268
|
RMDir "$SMPROGRAMS\Trillboards"
|
|
269
|
+
Delete "$SMPROGRAMS\Sense Anything\Sense Anything Connector.lnk"
|
|
270
|
+
Delete "$SMPROGRAMS\Sense Anything\Uninstall Sense Anything Connector.lnk"
|
|
271
|
+
RMDir "$SMPROGRAMS\Sense Anything"
|
|
266
272
|
RMDir /r "$INSTDIR"
|
|
267
273
|
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\TrillboardsEdge"
|
|
268
274
|
SectionEnd
|
|
@@ -324,7 +324,7 @@ if (-not $haveSetupMutex) {
|
|
|
324
324
|
}
|
|
325
325
|
}
|
|
326
326
|
if (-not $haveSetupMutex) {
|
|
327
|
-
Fail-LocalAi "The local AI installation did not finish. Reinstall
|
|
327
|
+
Fail-LocalAi "The local AI installation did not finish. Reinstall the Sense Anything Connector."
|
|
328
328
|
$setupMutex.Dispose()
|
|
329
329
|
exit 1
|
|
330
330
|
}
|