Matthias Nott
8 days ago ab0d321182330174e6c7a79f8ae9380bc49a202d
release: 1.1.0, and fix the two defects that made OTA install impossible

pubspec 1.0.0+1 -> 1.1.0+2. The version had not moved since c9739ac, so the
build carrying the session launcher, all-project search, switch-topic re-home
and persistent last-host reconnect still announced itself as 1.0.0. That is not
cosmetic for this app: the OTA landing page is the only feedback available to
someone installing from a phone with no laptop, and it would have read
identically before and after the upgrade.

deploy.sh --ota posted to http://127.0.0.1:8765/api/apps. The AIBroker daemon's
PAILot MQTT broker binds 8765, so the publish went to a listener that does not
speak HTTP and curl returned nothing. Now 8767, matching aibroker 0.31.0.

deploy.sh also printed the install URL without its port. `aibroker ota up` maps
/install/ and /api/ under the tailnet-only listener on :8443; port 443 on the
same host is a Funnel carrying the Todoist webhook and nothing else. Measured:
:8443 -> 200, :443 -> 404. So the command handed you a dead link, and only ever
on the road, where checking it is hardest.

Verified end to end over the tailnet after publishing 1.1.0 — /api/apps,
landing page and manifest.plist all report 1.1.0, and the manifest's IPA URL
carries the :8443. That last one matters because iOS fails silently on a
manifest host or port mismatch.
2 files modified
changed files
pubspec.yaml patch | view | blame | history
tools/deploy.sh patch | view | blame | history
pubspec.yaml
....@@ -1,7 +1,7 @@
11 name: pailot
22 description: "Voice-first AI communicator"
33 publish_to: 'none'
4
-version: 1.0.0+1
4
+version: 1.1.0+2
55
66 environment:
77 sdk: ^3.11.1
tools/deploy.sh
....@@ -89,7 +89,9 @@
8989 VERSION="$(grep -E '^version:' pubspec.yaml | sed -E 's/version:[[:space:]]*//; s/\+.*//' | head -1)"
9090 echo ""
9191 echo "=== Publishing to aibroker-ota hub (Tailscale) ==="
92
- resp="$(curl -sf -X POST http://127.0.0.1:8765/api/apps \
92
+ # 8767, not 8765. The AIBroker daemon's PAILot MQTT broker owns 8765, so this
93
+ # POST went to an MQTT listener and curl came back with nothing.
94
+ resp="$(curl -sf -X POST http://127.0.0.1:8767/api/apps \
9395 -F slug=pailot -F name=PAILot -F bundleId=com.tekmidian.pailot \
9496 -F "version=${VERSION:-1.0.0}" -F platform=ios -F "file=@${IPA}" 2>&1)" || {
9597 echo "ERROR: publish failed — is the hub up? Run: aibroker ota up" >&2; exit 1; }
....@@ -97,12 +99,17 @@
9799 ts="tailscale"; command -v tailscale >/dev/null 2>&1 || ts="/Applications/Tailscale.app/Contents/MacOS/Tailscale"
98100 host="$("$ts" status --json 2>/dev/null | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{console.log(JSON.parse(s).Self.DNSName.replace(/\.$/,""))}catch{}})' 2>/dev/null || true)"
99101 echo ""
102
+ # The :8443 is not optional. `aibroker ota up` maps /install/ and /api/ under
103
+ # the TAILNET-ONLY listener on 8443; port 443 on the same host is a Funnel
104
+ # carrying the Todoist webhook and nothing else. Printing the URL without the
105
+ # port sent you to that Funnel, which 404s — and it did so on the road, which
106
+ # is the only place this command is ever used.
100107 if [[ -n "$host" ]]; then
101108 echo " Install on any tailnet device — open in Safari:"
102
- echo " https://${host}/install/pailot/"
109
+ echo " https://${host}:8443/install/pailot/"
103110 else
104111 echo " Published. Open the install page in Safari on a tailnet device:"
105
- echo " https://<your-mac-tailnet-host>/install/pailot/"
112
+ echo " https://<your-mac-tailnet-host>:8443/install/pailot/"
106113 fi
107114 echo ""
108115 echo "=== Done (OTA). Tap Install in Safari, then force-quit & reopen PAILot. ==="