You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Service HTTP listeners bind Ipv4Addr::LOCALHOST unconditionally (crates/daemon/src/service_supervisor.rs). There is no way to expose a service beyond the machine running the daemon, so an HTTP service can only be reached by something already on that host — or by a tunnel the operator sets up entirely outside Construct.
The daemon already has tunnel machinery (crates/daemon/src/tunnel/) for the owner surface. The service module does not reference it at all.
The Slack channel (#1127) sidesteps this by dialing out over Socket Mode, which is why a Slack service works today with no exposure story. That makes this less urgent than it was, but it leaves the generic HTTP channel — described in the design as "the compatibility floor: anything that can POST authenticated JSON can integrate before a dedicated channel exists" — reachable only from localhost, which is precisely when a compatibility floor is least useful.
The hard part is not binding a different address; it is that exposing a service publicly changes its threat model. Worth settling as its own decision record:
The design's Consequences require that the service route class never widen to the owner control surface, which keeps its interactive login boundary. A shared exposure path must preserve that separation.
Service HTTP listeners bind
Ipv4Addr::LOCALHOSTunconditionally (crates/daemon/src/service_supervisor.rs). There is no way to expose a service beyond the machine running the daemon, so an HTTP service can only be reached by something already on that host — or by a tunnel the operator sets up entirely outside Construct.The daemon already has tunnel machinery (
crates/daemon/src/tunnel/) for the owner surface. The service module does not reference it at all.The Slack channel (#1127) sidesteps this by dialing out over Socket Mode, which is why a Slack service works today with no exposure story. That makes this less urgent than it was, but it leaves the generic HTTP channel — described in the design as "the compatibility floor: anything that can POST authenticated JSON can integrate before a dedicated channel exists" — reachable only from localhost, which is precisely when a compatibility floor is least useful.
The hard part is not binding a different address; it is that exposing a service publicly changes its threat model. Worth settling as its own decision record: