Found live on AB: the build failed (its CLT is broken), the compiled binary was then copied in by hand — and the listener never noticed. It had seen 'build in flight' and stopped scheduling retries, waiting for ensureCaptureBinary's onReady, which only fires on SUCCESS. The tile said 'Capture tool building…' indefinitely with a working binary on disk; only a module remount recovered it. onReady stays as the fast path; the 30 s retry now stays armed in every not-ready state, so a failed build keeps re-checking and a binary that arrives from outside (scp'd to a machine that can't compile) is picked up within half a minute. Reproduced the exact shape in a swiftc-less environment: build fails, binary copied in at 3 s, retry at 30 s spawns it (the capture's own unknown-device answer proves the real binary ran) — previously a permanent deadlock. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
229 lines
5.4 KiB
JSON
229 lines
5.4 KiB
JSON
{
|
||
"id": "propresenter-timers",
|
||
"name": "Timers",
|
||
"version": "1.5.1",
|
||
"proddash": ">=1.4.0",
|
||
"description": "Timers, Clocks, and LTC From configured Modules",
|
||
"provides": [
|
||
"timers"
|
||
],
|
||
"permissions": [
|
||
{
|
||
"kind": "microphone",
|
||
"reason": "Decoding SMPTE LTC timecode from an audio input on this machine"
|
||
},
|
||
{
|
||
"kind": "local-network",
|
||
"reason": "Reaching ProPresenter on this network"
|
||
}
|
||
],
|
||
"client": "client.js",
|
||
"server": "server.js",
|
||
"style": "style.css",
|
||
"minSize": {
|
||
"w": 2,
|
||
"h": 1
|
||
},
|
||
"defaultSize": {
|
||
"w": 4,
|
||
"h": 3
|
||
},
|
||
"configGroups": {
|
||
"ProPresenter": {
|
||
"toggle": "ppEnabled",
|
||
"help": "The timers configured in ProPresenter, read over its network API. Enable the network in ProPresenter's Preferences › Network and enter the host and port shown there. Switch it off on a day ProPresenter isn't running and nothing is polled."
|
||
},
|
||
"LTC Timecode": {
|
||
"toggle": "ltcEnabled",
|
||
"help": "SMPTE LTC decoded from an audio input on this machine, shown as a running timecode. Pick the device and the channel the timecode arrives on; macOS has to grant ProdDash the microphone (see the launcher's Permissions)."
|
||
},
|
||
"PCO Plan": {
|
||
"toggle": "pcoEnabled",
|
||
"help": "Timers the PCO Plan module offers — service elapsed, current item, countdown to service — appear here under a PCO Plan heading when that module is installed and configured. Nothing to set up on this side."
|
||
}
|
||
},
|
||
"configSchema": {
|
||
"ppEnabled": {
|
||
"type": "switch",
|
||
"label": "ProPresenter timers",
|
||
"group": "ProPresenter",
|
||
"default": true
|
||
},
|
||
"propresenter": {
|
||
"type": "endpoint",
|
||
"label": "ProPresenter",
|
||
"group": "ProPresenter",
|
||
"default": {
|
||
"host": "",
|
||
"port": 1025
|
||
}
|
||
},
|
||
"password": {
|
||
"type": "password",
|
||
"label": "API password",
|
||
"group": "ProPresenter",
|
||
"default": "",
|
||
"help": "Only if a password is set in ProPresenter's network preferences."
|
||
},
|
||
"ltcEnabled": {
|
||
"type": "switch",
|
||
"label": "LTC timecode",
|
||
"group": "LTC Timecode",
|
||
"default": false
|
||
},
|
||
"ltcDevice": {
|
||
"type": "select",
|
||
"label": "Audio device",
|
||
"group": "LTC Timecode",
|
||
"showWhen": "ltcEnabled",
|
||
"default": "",
|
||
"optionsRoute": "/ltc/devices"
|
||
},
|
||
"ltcChannel": {
|
||
"type": "number",
|
||
"label": "Channel",
|
||
"group": "LTC Timecode",
|
||
"showWhen": "ltcEnabled",
|
||
"default": 1,
|
||
"help": "The channel on that device carrying the timecode, counted from 1."
|
||
},
|
||
"pcoEnabled": {
|
||
"type": "switch",
|
||
"label": "PCO Plan timers",
|
||
"group": "PCO Plan",
|
||
"default": true
|
||
},
|
||
"timerFont": {
|
||
"type": "select",
|
||
"label": "Timer font",
|
||
"group": "Display",
|
||
"default": "default",
|
||
"options": [
|
||
{
|
||
"value": "default",
|
||
"label": "Default (system)"
|
||
},
|
||
{
|
||
"value": "monospace",
|
||
"label": "Monospace — steadier changing digits"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"instanceGroups": {
|
||
"Show": {
|
||
"collapsed": true,
|
||
"columns": 2
|
||
},
|
||
"Clock": {
|
||
"collapsed": false,
|
||
"columns": 2
|
||
},
|
||
"Colours": {
|
||
"collapsed": true,
|
||
"columns": 2
|
||
}
|
||
},
|
||
"instanceSchema": {
|
||
"showNames": {
|
||
"type": "switch",
|
||
"label": "Names",
|
||
"default": true,
|
||
"group": "Show"
|
||
},
|
||
"showStatus": {
|
||
"type": "switch",
|
||
"label": "Status lines",
|
||
"default": true,
|
||
"group": "Show"
|
||
},
|
||
"showDetail": {
|
||
"type": "switch",
|
||
"label": "Detail lines",
|
||
"default": true,
|
||
"group": "Show"
|
||
},
|
||
"showSeconds": {
|
||
"type": "switch",
|
||
"label": "Seconds",
|
||
"default": true,
|
||
"group": "Show"
|
||
},
|
||
"leadingZeros": {
|
||
"type": "switch",
|
||
"label": "Leading zeros",
|
||
"default": false,
|
||
"group": "Show"
|
||
},
|
||
"groupBySource": {
|
||
"type": "switch",
|
||
"label": "Group by source",
|
||
"default": false,
|
||
"group": "Show"
|
||
},
|
||
"showHeadings": {
|
||
"type": "switch",
|
||
"label": "Source headings",
|
||
"default": true,
|
||
"group": "Show",
|
||
"showWhen": "groupBySource"
|
||
},
|
||
"clock24h": {
|
||
"type": "switch",
|
||
"label": "24-hour",
|
||
"default": true,
|
||
"group": "Clock"
|
||
},
|
||
"clockSeconds": {
|
||
"type": "switch",
|
||
"label": "Seconds",
|
||
"default": true,
|
||
"group": "Clock"
|
||
},
|
||
"clockDate": {
|
||
"type": "switch",
|
||
"label": "Date",
|
||
"default": false,
|
||
"group": "Clock"
|
||
},
|
||
"dateShortDay": {
|
||
"type": "switch",
|
||
"label": "Short day",
|
||
"default": false,
|
||
"group": "Clock",
|
||
"showWhen": "clockDate"
|
||
},
|
||
"dateShortMonth": {
|
||
"type": "switch",
|
||
"label": "Short month",
|
||
"default": false,
|
||
"group": "Clock",
|
||
"showWhen": "clockDate"
|
||
},
|
||
"runningColor": {
|
||
"type": "color",
|
||
"label": "Running",
|
||
"default": "#2ee59a",
|
||
"group": "Colours"
|
||
},
|
||
"warningColor": {
|
||
"type": "color",
|
||
"label": "Warning",
|
||
"default": "#f0b429",
|
||
"group": "Colours"
|
||
},
|
||
"overrunColor": {
|
||
"type": "color",
|
||
"label": "Overrun",
|
||
"default": "#f4433c",
|
||
"group": "Colours"
|
||
},
|
||
"idleColor": {
|
||
"type": "color",
|
||
"label": "Idle",
|
||
"default": "#8b98a5",
|
||
"group": "Colours"
|
||
}
|
||
}
|
||
}
|