alissa-tools-github-revloop 0.31.12__tar.gz → 0.31.13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {alissa_tools_github_revloop-0.31.12/src/main/alissa_tools_github_revloop.egg-info → alissa_tools_github_revloop-0.31.13}/PKG-INFO +1 -1
- alissa_tools_github_revloop-0.31.13/src/main/alissa/tools/github/revloop/version +1 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/webui/__main__.py +4 -3
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/webui/server.py +28 -1
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13/src/main/alissa_tools_github_revloop.egg-info}/PKG-INFO +1 -1
- alissa_tools_github_revloop-0.31.12/src/main/alissa/tools/github/revloop/version +0 -1
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/LICENSE +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/MANIFEST.in +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/NOTICE +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/README.md +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/requirements.txt +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/setup.cfg +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/setup.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/__init__.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/__main__.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/alissa.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/alissa_client.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/bows.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/config.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/fleet_vitals.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/ghclient.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/loop.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/loop_events.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/parking.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/proc.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/prompts.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/prreview.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/state.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/trust.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/version.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/webui/__init__.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/webui/auth.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/webui/page.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/webui/sources.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa/tools/github/revloop/webui/sysinfo.py +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa_tools_github_revloop.egg-info/SOURCES.txt +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa_tools_github_revloop.egg-info/dependency_links.txt +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa_tools_github_revloop.egg-info/entry_points.txt +0 -0
- {alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/src/main/alissa_tools_github_revloop.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.31.13
|
|
@@ -20,7 +20,7 @@ from ..config import Config, load_config_file, resolve_config_path
|
|
|
20
20
|
from ..fleet_vitals import FleetVitalsPusher
|
|
21
21
|
from ..version import version
|
|
22
22
|
from .auth import Auth, PasscodeUnset, require_passcode
|
|
23
|
-
from .server import App, make_server
|
|
23
|
+
from .server import App, bind_url, make_server
|
|
24
24
|
from .sources import Sources
|
|
25
25
|
|
|
26
26
|
# The default bind port. Deliberately NOT the devloop console's 8787: the two
|
|
@@ -52,7 +52,8 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
52
52
|
p.add_argument("--version", action="version",
|
|
53
53
|
version=f"%(prog)s {version.value}")
|
|
54
54
|
p.add_argument("--host", default="127.0.0.1", metavar="ADDR",
|
|
55
|
-
help="bind address (default: 127.0.0.1 -- localhost only)"
|
|
55
|
+
help="bind address (default: 127.0.0.1 -- localhost only); "
|
|
56
|
+
"an IPv6 literal binds IPv6, and `::` takes IPv4 too")
|
|
56
57
|
p.add_argument("--port", type=int, default=DEFAULT_PORT, metavar="PORT",
|
|
57
58
|
help=f"bind port (default: {DEFAULT_PORT})")
|
|
58
59
|
p.add_argument("--workspace-root", type=Path, default=None, metavar="PATH",
|
|
@@ -131,7 +132,7 @@ def main(argv: "list[str] | None" = None) -> int:
|
|
|
131
132
|
|
|
132
133
|
print(
|
|
133
134
|
f"alissa-revloop-ui {version.value} -- serving on "
|
|
134
|
-
f"
|
|
135
|
+
f"{bind_url(args.host, args.port)} (passcode required); "
|
|
135
136
|
f"watching {config.workspace_root}",
|
|
136
137
|
flush=True,
|
|
137
138
|
)
|
|
@@ -35,6 +35,7 @@ from __future__ import annotations
|
|
|
35
35
|
|
|
36
36
|
import json
|
|
37
37
|
import re
|
|
38
|
+
import socket
|
|
38
39
|
import sqlite3
|
|
39
40
|
import sys
|
|
40
41
|
import time
|
|
@@ -576,8 +577,34 @@ _REDIRECT_HOME = (
|
|
|
576
577
|
)
|
|
577
578
|
|
|
578
579
|
|
|
580
|
+
class _IPv6Server(ThreadingHTTPServer):
|
|
581
|
+
"""The console on an IPv6 address (issue #163). `::` is the container
|
|
582
|
+
default because Railway's private network (`*.railway.internal`) resolves
|
|
583
|
+
to IPv6 only, and an AF_INET socket refuses those peers outright.
|
|
584
|
+
IPV6_V6ONLY is cleared explicitly rather than inherited from
|
|
585
|
+
net.ipv6.bindv6only, so `::` also takes IPv4 (as v4-mapped peers) on any
|
|
586
|
+
host; on a specific address like `::1` the option is moot."""
|
|
587
|
+
|
|
588
|
+
address_family = socket.AF_INET6
|
|
589
|
+
|
|
590
|
+
def server_bind(self) -> None:
|
|
591
|
+
try:
|
|
592
|
+
self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
|
|
593
|
+
except (AttributeError, OSError):
|
|
594
|
+
pass # no dual-stack on this platform: `::` serves IPv6 only
|
|
595
|
+
super().server_bind()
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def bind_url(host: str, port: int) -> str:
|
|
599
|
+
"""The URL a bind serves, brackets around an IPv6 literal."""
|
|
600
|
+
return f"http://[{host}]:{port}" if ":" in host else f"http://{host}:{port}"
|
|
601
|
+
|
|
602
|
+
|
|
579
603
|
def make_server(app: App, host: str, port: int) -> ThreadingHTTPServer:
|
|
580
|
-
|
|
604
|
+
# An IPv6 literal (anything with a ':') needs an AF_INET6 socket; an IPv4
|
|
605
|
+
# address or a hostname keeps the stdlib's AF_INET default.
|
|
606
|
+
cls = _IPv6Server if ":" in host else ThreadingHTTPServer
|
|
607
|
+
server = cls((host, port), Handler)
|
|
581
608
|
server.daemon_threads = True
|
|
582
609
|
server.app = app # type: ignore[attr-defined]
|
|
583
610
|
return server
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.31.12
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{alissa_tools_github_revloop-0.31.12 → alissa_tools_github_revloop-0.31.13}/requirements.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|