ProdCom is a sandboxed Mac App Store app whose HTTP API lives inside it, behind the UserDefaults switch applicationAPIEnabled — absent means off, and a running ProdCom does not notice the switch changing; it reads it at launch. So when the tile says "unreachable" on a booth where ProdCom runs on the same Mac, there are two causes and two fixes: ProdCom is not running (open it), or it is running with the API off (set the switch, quit it, open it again). The module's server now does both, behind two Admin switches, both on: "Start ProdCom when it is offline" and "Restart ProdCom to turn its API on". On a connection-level failure (never an HTTP answer) the supervisor runs up to three attempts five seconds apart: not running → open -g -b; running with the switch off → write it, read it back, ask ProdCom to quit (Apple Event, SIGTERM after 5 s), open it again — at most once per outage; running with the switch on → keep probing, and only blame the port if that is still true on the third look, because a quitting ProdCom still shows in pgrep. A successful run nudges the module to reconnect at once. It gives up with a tile message until ProdCom answers again, and does nothing at all for a ProdCom on another machine or off macOS. The launcher gains the Apple Events entitlement and usage string so the polite quit can be granted; if it is denied, SIGTERM does the job. Verified live on the dev Mac against ProdCom 2.3.4: not running + switch absent → opened, switch written, restarted, Live after two attempts; an operator's Cmd-Q → reopened. 71 fake-driven tests (node --test), the OS layer included through an injectable execFile. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
46 lines
1.7 KiB
Plaintext
46 lines
1.7 KiB
Plaintext
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CFBundleName</key>
|
|
<string>ProdDash</string>
|
|
<key>CFBundleDisplayName</key>
|
|
<string>ProdDash</string>
|
|
<key>CFBundleExecutable</key>
|
|
<string>ProdDash</string>
|
|
<key>CFBundleIdentifier</key>
|
|
<string>org.waterschurch.proddash</string>
|
|
<key>CFBundlePackageType</key>
|
|
<string>APPL</string>
|
|
<key>CFBundleShortVersionString</key>
|
|
<string>1.0.0</string>
|
|
<key>CFBundleVersion</key>
|
|
<string>1.0.0</string>
|
|
<key>ProdDashLauncherVersion</key>
|
|
<string>1.0.0</string>
|
|
<key>CFBundleIconFile</key>
|
|
<string>AppIcon</string>
|
|
<key>LSApplicationCategoryType</key>
|
|
<string>public.app-category.utilities</string>
|
|
<key>LSMinimumSystemVersion</key>
|
|
<string>13.0</string>
|
|
<!-- Menu-bar app: no Dock icon, no app menu. -->
|
|
<key>LSUIElement</key>
|
|
<true/>
|
|
<key>NSHighResolutionCapable</key>
|
|
<true/>
|
|
<!-- The prompts this app exists to own. macOS shows these sentences
|
|
verbatim, so they say what ProdDash does with each permission. -->
|
|
<key>NSMicrophoneUsageDescription</key>
|
|
<string>ProdDash reads an audio input on this Mac to decode SMPTE LTC timecode for the Timers module.</string>
|
|
<key>NSAppleEventsUsageDescription</key>
|
|
<string>ProdDash asks ProdCom to quit and relaunches it when its Application API has been switched off.</string>
|
|
<key>NSLocalNetworkUsageDescription</key>
|
|
<string>ProdDash connects to production gear on this network — ProdCom, ProPresenter and anything else its modules are pointed at.</string>
|
|
<key>NSBonjourServices</key>
|
|
<array>
|
|
<string>_http._tcp</string>
|
|
</array>
|
|
</dict>
|
|
</plist>
|