ghostai-connect 0.0.1__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.
- ghostai_connect-0.0.1/LICENSE +21 -0
- ghostai_connect-0.0.1/PKG-INFO +68 -0
- ghostai_connect-0.0.1/README.md +51 -0
- ghostai_connect-0.0.1/ghostai_connect.egg-info/PKG-INFO +68 -0
- ghostai_connect-0.0.1/ghostai_connect.egg-info/SOURCES.txt +9 -0
- ghostai_connect-0.0.1/ghostai_connect.egg-info/dependency_links.txt +1 -0
- ghostai_connect-0.0.1/ghostai_connect.egg-info/entry_points.txt +2 -0
- ghostai_connect-0.0.1/ghostai_connect.egg-info/top_level.txt +1 -0
- ghostai_connect-0.0.1/ghostai_connect_stub.py +101 -0
- ghostai_connect-0.0.1/pyproject.toml +38 -0
- ghostai_connect-0.0.1/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Dymium, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ghostai-connect
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Placeholder for the GhostAI Connect client: explains how to get it and checks that the GhostAI relay is reachable. Contains no client code.
|
|
5
|
+
Author-email: GhostAI <support@dymium.io>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://ghostai.dymium.io
|
|
8
|
+
Keywords: ghostai,connector,relay
|
|
9
|
+
Classifier: Development Status :: 1 - Planning
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Dynamic: license-file
|
|
17
|
+
|
|
18
|
+
# ghostai-connect (placeholder)
|
|
19
|
+
|
|
20
|
+
This release holds the `ghostai-connect` name on PyPI for GhostAI. **It is not
|
|
21
|
+
the GhostAI Connect client** and contains none of its code. It cannot open a
|
|
22
|
+
tunnel.
|
|
23
|
+
|
|
24
|
+
GhostAI Connect is the small client a GhostAI customer runs next to their own
|
|
25
|
+
Ollama or vLLM server. It opens an outbound-only WebSocket connection to the
|
|
26
|
+
GhostAI relay, so no inbound firewall rule is needed.
|
|
27
|
+
|
|
28
|
+
## Getting the real client
|
|
29
|
+
|
|
30
|
+
Contact GhostAI at support@dymium.io, or ask your GhostAI administrator. The
|
|
31
|
+
client is provided as either:
|
|
32
|
+
|
|
33
|
+
- a wheel file: `pip install ./ghostai_connect-<version>-py3-none-any.whl`
|
|
34
|
+
- a signed container image, `ghcr.io/dymium-io/ghostai-connect` (access is
|
|
35
|
+
granted by GhostAI). Verify it with `cosign verify` before you run it.
|
|
36
|
+
|
|
37
|
+
Then enroll it with the single-use token from the GhostAI admin console.
|
|
38
|
+
|
|
39
|
+
When the client is published here, `pip install --upgrade ghostai-connect`
|
|
40
|
+
replaces this placeholder.
|
|
41
|
+
|
|
42
|
+
## What this package does
|
|
43
|
+
|
|
44
|
+
```console
|
|
45
|
+
$ pip install ghostai-connect
|
|
46
|
+
$ ghostai-connect
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
It prints the instructions above, then checks that the GhostAI relay is
|
|
50
|
+
reachable from your network. The check sends one HTTPS request to
|
|
51
|
+
`relay-connector.alpha.dymium.io` with a 5-second timeout. It sends no
|
|
52
|
+
credentials and opens no connector session. It exits `0` when the relay is
|
|
53
|
+
reachable and `1` when it is not. Any other subcommand, such as `run` or
|
|
54
|
+
`enroll`, exits `2`.
|
|
55
|
+
|
|
56
|
+
| Option | Meaning |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `--relay-url URL` | Check a different relay (default: `$GHOSTAI_CONNECT_RELAY_URL`, else `wss://relay-connector.alpha.dymium.io/connector/ws`) |
|
|
59
|
+
| `--timeout SECONDS` | How long to wait for the relay (default: 5) |
|
|
60
|
+
| `--no-check` | Print the instructions only, with no network access |
|
|
61
|
+
| `--version` | Print the version |
|
|
62
|
+
|
|
63
|
+
Python 3.8 or later, standard library only, no dependencies.
|
|
64
|
+
|
|
65
|
+
## License
|
|
66
|
+
|
|
67
|
+
MIT, for this placeholder's own code only. The license of the GhostAI Connect
|
|
68
|
+
client is set by that client's own releases.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# ghostai-connect (placeholder)
|
|
2
|
+
|
|
3
|
+
This release holds the `ghostai-connect` name on PyPI for GhostAI. **It is not
|
|
4
|
+
the GhostAI Connect client** and contains none of its code. It cannot open a
|
|
5
|
+
tunnel.
|
|
6
|
+
|
|
7
|
+
GhostAI Connect is the small client a GhostAI customer runs next to their own
|
|
8
|
+
Ollama or vLLM server. It opens an outbound-only WebSocket connection to the
|
|
9
|
+
GhostAI relay, so no inbound firewall rule is needed.
|
|
10
|
+
|
|
11
|
+
## Getting the real client
|
|
12
|
+
|
|
13
|
+
Contact GhostAI at support@dymium.io, or ask your GhostAI administrator. The
|
|
14
|
+
client is provided as either:
|
|
15
|
+
|
|
16
|
+
- a wheel file: `pip install ./ghostai_connect-<version>-py3-none-any.whl`
|
|
17
|
+
- a signed container image, `ghcr.io/dymium-io/ghostai-connect` (access is
|
|
18
|
+
granted by GhostAI). Verify it with `cosign verify` before you run it.
|
|
19
|
+
|
|
20
|
+
Then enroll it with the single-use token from the GhostAI admin console.
|
|
21
|
+
|
|
22
|
+
When the client is published here, `pip install --upgrade ghostai-connect`
|
|
23
|
+
replaces this placeholder.
|
|
24
|
+
|
|
25
|
+
## What this package does
|
|
26
|
+
|
|
27
|
+
```console
|
|
28
|
+
$ pip install ghostai-connect
|
|
29
|
+
$ ghostai-connect
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
It prints the instructions above, then checks that the GhostAI relay is
|
|
33
|
+
reachable from your network. The check sends one HTTPS request to
|
|
34
|
+
`relay-connector.alpha.dymium.io` with a 5-second timeout. It sends no
|
|
35
|
+
credentials and opens no connector session. It exits `0` when the relay is
|
|
36
|
+
reachable and `1` when it is not. Any other subcommand, such as `run` or
|
|
37
|
+
`enroll`, exits `2`.
|
|
38
|
+
|
|
39
|
+
| Option | Meaning |
|
|
40
|
+
|---|---|
|
|
41
|
+
| `--relay-url URL` | Check a different relay (default: `$GHOSTAI_CONNECT_RELAY_URL`, else `wss://relay-connector.alpha.dymium.io/connector/ws`) |
|
|
42
|
+
| `--timeout SECONDS` | How long to wait for the relay (default: 5) |
|
|
43
|
+
| `--no-check` | Print the instructions only, with no network access |
|
|
44
|
+
| `--version` | Print the version |
|
|
45
|
+
|
|
46
|
+
Python 3.8 or later, standard library only, no dependencies.
|
|
47
|
+
|
|
48
|
+
## License
|
|
49
|
+
|
|
50
|
+
MIT, for this placeholder's own code only. The license of the GhostAI Connect
|
|
51
|
+
client is set by that client's own releases.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ghostai-connect
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Placeholder for the GhostAI Connect client: explains how to get it and checks that the GhostAI relay is reachable. Contains no client code.
|
|
5
|
+
Author-email: GhostAI <support@dymium.io>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://ghostai.dymium.io
|
|
8
|
+
Keywords: ghostai,connector,relay
|
|
9
|
+
Classifier: Development Status :: 1 - Planning
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Dynamic: license-file
|
|
17
|
+
|
|
18
|
+
# ghostai-connect (placeholder)
|
|
19
|
+
|
|
20
|
+
This release holds the `ghostai-connect` name on PyPI for GhostAI. **It is not
|
|
21
|
+
the GhostAI Connect client** and contains none of its code. It cannot open a
|
|
22
|
+
tunnel.
|
|
23
|
+
|
|
24
|
+
GhostAI Connect is the small client a GhostAI customer runs next to their own
|
|
25
|
+
Ollama or vLLM server. It opens an outbound-only WebSocket connection to the
|
|
26
|
+
GhostAI relay, so no inbound firewall rule is needed.
|
|
27
|
+
|
|
28
|
+
## Getting the real client
|
|
29
|
+
|
|
30
|
+
Contact GhostAI at support@dymium.io, or ask your GhostAI administrator. The
|
|
31
|
+
client is provided as either:
|
|
32
|
+
|
|
33
|
+
- a wheel file: `pip install ./ghostai_connect-<version>-py3-none-any.whl`
|
|
34
|
+
- a signed container image, `ghcr.io/dymium-io/ghostai-connect` (access is
|
|
35
|
+
granted by GhostAI). Verify it with `cosign verify` before you run it.
|
|
36
|
+
|
|
37
|
+
Then enroll it with the single-use token from the GhostAI admin console.
|
|
38
|
+
|
|
39
|
+
When the client is published here, `pip install --upgrade ghostai-connect`
|
|
40
|
+
replaces this placeholder.
|
|
41
|
+
|
|
42
|
+
## What this package does
|
|
43
|
+
|
|
44
|
+
```console
|
|
45
|
+
$ pip install ghostai-connect
|
|
46
|
+
$ ghostai-connect
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
It prints the instructions above, then checks that the GhostAI relay is
|
|
50
|
+
reachable from your network. The check sends one HTTPS request to
|
|
51
|
+
`relay-connector.alpha.dymium.io` with a 5-second timeout. It sends no
|
|
52
|
+
credentials and opens no connector session. It exits `0` when the relay is
|
|
53
|
+
reachable and `1` when it is not. Any other subcommand, such as `run` or
|
|
54
|
+
`enroll`, exits `2`.
|
|
55
|
+
|
|
56
|
+
| Option | Meaning |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `--relay-url URL` | Check a different relay (default: `$GHOSTAI_CONNECT_RELAY_URL`, else `wss://relay-connector.alpha.dymium.io/connector/ws`) |
|
|
59
|
+
| `--timeout SECONDS` | How long to wait for the relay (default: 5) |
|
|
60
|
+
| `--no-check` | Print the instructions only, with no network access |
|
|
61
|
+
| `--version` | Print the version |
|
|
62
|
+
|
|
63
|
+
Python 3.8 or later, standard library only, no dependencies.
|
|
64
|
+
|
|
65
|
+
## License
|
|
66
|
+
|
|
67
|
+
MIT, for this placeholder's own code only. The license of the GhostAI Connect
|
|
68
|
+
client is set by that client's own releases.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
ghostai_connect_stub.py
|
|
4
|
+
pyproject.toml
|
|
5
|
+
ghostai_connect.egg-info/PKG-INFO
|
|
6
|
+
ghostai_connect.egg-info/SOURCES.txt
|
|
7
|
+
ghostai_connect.egg-info/dependency_links.txt
|
|
8
|
+
ghostai_connect.egg-info/entry_points.txt
|
|
9
|
+
ghostai_connect.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ghostai_connect_stub
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""Placeholder for the GhostAI Connect client.
|
|
2
|
+
|
|
3
|
+
This distribution holds the ``ghostai-connect`` name on PyPI. It contains none
|
|
4
|
+
of the connector's code: it prints how to get the real client and checks that
|
|
5
|
+
the GhostAI relay is reachable from this network. Standard library only.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import http.client
|
|
12
|
+
import os
|
|
13
|
+
import ssl
|
|
14
|
+
import sys
|
|
15
|
+
from urllib.parse import urlsplit
|
|
16
|
+
|
|
17
|
+
__version__ = "0.0.1"
|
|
18
|
+
|
|
19
|
+
DEFAULT_RELAY_URL = "wss://relay-connector.alpha.dymium.io/connector/ws"
|
|
20
|
+
|
|
21
|
+
HOW_TO_GET = """\
|
|
22
|
+
ghostai-connect {version} is a placeholder that holds this name on PyPI.
|
|
23
|
+
It is not the GhostAI Connect client and cannot open a tunnel.
|
|
24
|
+
|
|
25
|
+
To get the real client, contact GhostAI (support@dymium.io) or your GhostAI
|
|
26
|
+
administrator. It is provided as either:
|
|
27
|
+
- a wheel file: pip install ./ghostai_connect-<version>-py3-none-any.whl
|
|
28
|
+
- a signed container image, ghcr.io/dymium-io/ghostai-connect (access is
|
|
29
|
+
granted by GhostAI; verify it with cosign before you run it)
|
|
30
|
+
Then enroll it with the single-use token from the GhostAI admin console.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def check_relay(url: str, timeout: float) -> tuple[bool, str]:
|
|
35
|
+
"""Send one unauthenticated HTTPS GET to the relay's connector endpoint.
|
|
36
|
+
|
|
37
|
+
A plain GET (no WebSocket upgrade) is answered with a 404 by the relay
|
|
38
|
+
process itself, which proves DNS, outbound 443, TLS and the load balancer
|
|
39
|
+
without opening a connector session or presenting any credential.
|
|
40
|
+
"""
|
|
41
|
+
try:
|
|
42
|
+
parts = urlsplit(url)
|
|
43
|
+
scheme = {"wss": "https", "ws": "http"}.get(parts.scheme, parts.scheme)
|
|
44
|
+
if scheme not in ("https", "http") or not parts.hostname:
|
|
45
|
+
return False, "not a ws://, wss://, http:// or https:// URL"
|
|
46
|
+
if scheme == "https":
|
|
47
|
+
conn: http.client.HTTPConnection = http.client.HTTPSConnection(
|
|
48
|
+
parts.hostname, parts.port, timeout=timeout,
|
|
49
|
+
context=ssl.create_default_context(),
|
|
50
|
+
)
|
|
51
|
+
else:
|
|
52
|
+
conn = http.client.HTTPConnection(parts.hostname, parts.port, timeout=timeout)
|
|
53
|
+
try:
|
|
54
|
+
conn.request("GET", parts.path or "/",
|
|
55
|
+
headers={"User-Agent": f"ghostai-connect-stub/{__version__}"})
|
|
56
|
+
status = conn.getresponse().status
|
|
57
|
+
finally:
|
|
58
|
+
conn.close()
|
|
59
|
+
except (OSError, ValueError, http.client.HTTPException) as exc:
|
|
60
|
+
return False, f"unreachable ({type(exc).__name__}: {exc})"
|
|
61
|
+
if status >= 500:
|
|
62
|
+
return False, f"the load balancer answered HTTP {status}; the relay is unavailable right now"
|
|
63
|
+
return True, (f"reachable (HTTP {status}; a plain HTTPS request to the "
|
|
64
|
+
"WebSocket endpoint is expected to be refused)")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def main(argv: list[str] | None = None) -> int:
|
|
68
|
+
parser = argparse.ArgumentParser(
|
|
69
|
+
prog="ghostai-connect",
|
|
70
|
+
description="Placeholder for the GhostAI Connect client: explains how to "
|
|
71
|
+
"get the real client and checks that the GhostAI relay is reachable.",
|
|
72
|
+
)
|
|
73
|
+
parser.add_argument(
|
|
74
|
+
"--version", action="version",
|
|
75
|
+
version=f"%(prog)s {__version__} (placeholder, not the GhostAI Connect client)",
|
|
76
|
+
)
|
|
77
|
+
parser.add_argument(
|
|
78
|
+
"--relay-url", default=os.environ.get("GHOSTAI_CONNECT_RELAY_URL", DEFAULT_RELAY_URL),
|
|
79
|
+
help="relay endpoint to check (default: $GHOSTAI_CONNECT_RELAY_URL or %(default)s)",
|
|
80
|
+
)
|
|
81
|
+
parser.add_argument("--timeout", type=float, default=5.0,
|
|
82
|
+
help="seconds to wait for the relay (default: %(default)s)")
|
|
83
|
+
parser.add_argument("--no-check", action="store_true",
|
|
84
|
+
help="skip the relay reachability check")
|
|
85
|
+
args, unsupported = parser.parse_known_args(argv)
|
|
86
|
+
|
|
87
|
+
print(HOW_TO_GET.format(version=__version__))
|
|
88
|
+
ok = True
|
|
89
|
+
if not args.no_check:
|
|
90
|
+
ok, detail = check_relay(args.relay_url, args.timeout)
|
|
91
|
+
print(f"Relay check: {args.relay_url}\n {detail}")
|
|
92
|
+
|
|
93
|
+
if unsupported:
|
|
94
|
+
print(f"\n'ghostai-connect {' '.join(unsupported)}' is not available in this "
|
|
95
|
+
"placeholder. Install the real client (see above).", file=sys.stderr)
|
|
96
|
+
return 2
|
|
97
|
+
return 0 if ok else 1
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
if __name__ == "__main__":
|
|
101
|
+
sys.exit(main())
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
# Name-holding placeholder for the GhostAI Connect client. Contains none of the
|
|
6
|
+
# client's code (ghostai_connect/), so the license below covers only
|
|
7
|
+
# ghostai_connect_stub.py. The version stays 0.0.x so any real release
|
|
8
|
+
# supersedes it; .github/workflows/publish-pypi-stub.yml refuses to upload
|
|
9
|
+
# anything else.
|
|
10
|
+
[project]
|
|
11
|
+
name = "ghostai-connect"
|
|
12
|
+
dynamic = ["version"]
|
|
13
|
+
description = "Placeholder for the GhostAI Connect client: explains how to get it and checks that the GhostAI relay is reachable. Contains no client code."
|
|
14
|
+
readme = "README.md"
|
|
15
|
+
license = "MIT"
|
|
16
|
+
license-files = ["LICENSE"]
|
|
17
|
+
requires-python = ">=3.8"
|
|
18
|
+
authors = [{ name = "GhostAI", email = "support@dymium.io" }]
|
|
19
|
+
keywords = ["ghostai", "connector", "relay"]
|
|
20
|
+
classifiers = [
|
|
21
|
+
"Development Status :: 1 - Planning",
|
|
22
|
+
"Environment :: Console",
|
|
23
|
+
"Operating System :: OS Independent",
|
|
24
|
+
"Programming Language :: Python :: 3",
|
|
25
|
+
]
|
|
26
|
+
dependencies = []
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://ghostai.dymium.io"
|
|
30
|
+
|
|
31
|
+
[project.scripts]
|
|
32
|
+
ghostai-connect = "ghostai_connect_stub:main"
|
|
33
|
+
|
|
34
|
+
[tool.setuptools]
|
|
35
|
+
py-modules = ["ghostai_connect_stub"]
|
|
36
|
+
|
|
37
|
+
[tool.setuptools.dynamic]
|
|
38
|
+
version = { attr = "ghostai_connect_stub.__version__" }
|