fix(workspace): default PLATFORM_URL to host.docker.internal in all modules
KI-014 follow-on: inside a workspace container, localhost refers to the container itself, not the platform. Four files had the Docker-aware if-branch correct but fell through to localhost:8080 as the non-Docker fallback — effectively making the Docker path the ONLY path that works, since local dev on Mac/Linux can also resolve host.docker.internal via the Docker daemon's built-in resolver. Fix: unify the default to host.docker.internal in both branches, so the env-var override always works and no caller ever silently falls back to the wrong address. - a2a_cli.py: else branch hardcoded localhost → host.docker.internal - consolidation.py: same - coordinator.py: same - builtin_tools/temporal_workflow.py: two inline os.environ.get defaults replaced with a _platform_url() helper for DRY + consistent detection Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
f34cc2783a
commit
8ea7f0a837
@ -28,7 +28,7 @@ WORKSPACE_ID = _WORKSPACE_ID_raw
|
|||||||
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
else:
|
else:
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://localhost:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
|
|
||||||
|
|
||||||
async def discover(target_id: str) -> dict | None:
|
async def discover(target_id: str) -> dict | None:
|
||||||
|
|||||||
@ -29,7 +29,7 @@ WORKSPACE_ID = _WORKSPACE_ID_raw
|
|||||||
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
else:
|
else:
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://localhost:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
|
|
||||||
# Cache workspace ID → name mappings (populated by list_peers calls)
|
# Cache workspace ID → name mappings (populated by list_peers calls)
|
||||||
_peer_names: dict[str, str] = {}
|
_peer_names: dict[str, str] = {}
|
||||||
|
|||||||
@ -54,6 +54,16 @@ import httpx
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def _platform_url() -> str:
|
||||||
|
"""Return the platform URL, defaulting to host.docker.internal when running
|
||||||
|
inside a Docker container (where localhost refers to the container, not the
|
||||||
|
host). External callers can always override via the PLATFORM_URL env var.
|
||||||
|
"""
|
||||||
|
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
||||||
|
return os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
|
return os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
|
|
||||||
# ─────────────────────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
# Constants
|
# Constants
|
||||||
# ─────────────────────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
@ -79,12 +89,12 @@ async def _fetch_latest_checkpoint(workspace_id: str) -> Optional[dict]:
|
|||||||
workspace_id: The workspace to query.
|
workspace_id: The workspace to query.
|
||||||
|
|
||||||
Reads:
|
Reads:
|
||||||
PLATFORM_URL Platform base URL (default ``http://localhost:8080``).
|
PLATFORM_URL Platform base URL (default ``http://host.docker.internal:8080``).
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
from platform_auth import auth_headers as _auth_headers # type: ignore[import]
|
from platform_auth import auth_headers as _auth_headers # type: ignore[import]
|
||||||
|
|
||||||
platform_url = os.environ.get("PLATFORM_URL", "http://localhost:8080")
|
platform_url = _platform_url()
|
||||||
url = f"{platform_url}/workspaces/{workspace_id}/checkpoints/latest"
|
url = f"{platform_url}/workspaces/{workspace_id}/checkpoints/latest"
|
||||||
async with httpx.AsyncClient(timeout=5.0) as client:
|
async with httpx.AsyncClient(timeout=5.0) as client:
|
||||||
resp = await client.get(url, headers=_auth_headers())
|
resp = await client.get(url, headers=_auth_headers())
|
||||||
@ -125,12 +135,12 @@ async def _save_checkpoint(
|
|||||||
payload: Optional JSON-serialisable dict stored as JSONB.
|
payload: Optional JSON-serialisable dict stored as JSONB.
|
||||||
|
|
||||||
Reads:
|
Reads:
|
||||||
PLATFORM_URL Platform base URL (default ``http://localhost:8080``).
|
PLATFORM_URL Platform base URL (default ``http://host.docker.internal:8080``).
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
from platform_auth import auth_headers as _auth_headers # type: ignore[import]
|
from platform_auth import auth_headers as _auth_headers # type: ignore[import]
|
||||||
|
|
||||||
platform_url = os.environ.get("PLATFORM_URL", "http://localhost:8080")
|
platform_url = _platform_url()
|
||||||
url = f"{platform_url}/workspaces/{workspace_id}/checkpoints"
|
url = f"{platform_url}/workspaces/{workspace_id}/checkpoints"
|
||||||
body: dict = {
|
body: dict = {
|
||||||
"workflow_id": workflow_id,
|
"workflow_id": workflow_id,
|
||||||
|
|||||||
@ -21,7 +21,7 @@ logger = logging.getLogger(__name__)
|
|||||||
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
else:
|
else:
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://localhost:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
_WORKSPACE_ID_raw = os.environ.get("WORKSPACE_ID")
|
_WORKSPACE_ID_raw = os.environ.get("WORKSPACE_ID")
|
||||||
if not _WORKSPACE_ID_raw:
|
if not _WORKSPACE_ID_raw:
|
||||||
raise RuntimeError("WORKSPACE_ID environment variable is required but not set")
|
raise RuntimeError("WORKSPACE_ID environment variable is required but not set")
|
||||||
|
|||||||
@ -25,7 +25,7 @@ logger = logging.getLogger(__name__)
|
|||||||
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
else:
|
else:
|
||||||
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://localhost:8080")
|
PLATFORM_URL = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
_WORKSPACE_ID_raw = os.environ.get("WORKSPACE_ID")
|
_WORKSPACE_ID_raw = os.environ.get("WORKSPACE_ID")
|
||||||
if not _WORKSPACE_ID_raw:
|
if not _WORKSPACE_ID_raw:
|
||||||
raise RuntimeError("WORKSPACE_ID environment variable is required but not set")
|
raise RuntimeError("WORKSPACE_ID environment variable is required but not set")
|
||||||
|
|||||||
@ -63,7 +63,7 @@ async def main(): # pragma: no cover
|
|||||||
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_VERSION"):
|
||||||
platform_url = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
platform_url = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
else:
|
else:
|
||||||
platform_url = os.environ.get("PLATFORM_URL", "http://localhost:8080")
|
platform_url = os.environ.get("PLATFORM_URL", "http://host.docker.internal:8080")
|
||||||
awareness_config = get_awareness_config()
|
awareness_config = get_awareness_config()
|
||||||
|
|
||||||
# 0. Initialise OpenTelemetry (no-op if packages not installed)
|
# 0. Initialise OpenTelemetry (no-op if packages not installed)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user