stem-agent 0.1.0__py3-none-any.whl
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.
- stem_agent-0.1.0.dist-info/METADATA +62 -0
- stem_agent-0.1.0.dist-info/RECORD +12 -0
- stem_agent-0.1.0.dist-info/WHEEL +5 -0
- stem_agent-0.1.0.dist-info/entry_points.txt +3 -0
- stem_agent-0.1.0.dist-info/licenses/LICENSE.txt +26 -0
- stem_agent-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.txt +16 -0
- stem_agent-0.1.0.dist-info/top_level.txt +1 -0
- stem_agent_installer/__init__.py +3 -0
- stem_agent_installer/__main__.py +5 -0
- stem_agent_installer/cli.py +217 -0
- stem_agent_installer/payload/payload.json +12 -0
- stem_agent_installer/payload/stem-agent-0.1.0-free-alpha.zip +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: stem-agent
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: One complete scientific toolkit for coding agents, with verifiable workflows.
|
|
5
|
+
Author: Exergy Lab
|
|
6
|
+
License-Expression: LicenseRef-Proprietary
|
|
7
|
+
Project-URL: Homepage, https://exergy-lab.com
|
|
8
|
+
Project-URL: Product, https://exergy-lab.com/products
|
|
9
|
+
Project-URL: Support, https://exergy-lab.com/contact
|
|
10
|
+
Keywords: science,engineering,mathematics,mcp,coding-agents
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 11
|
|
18
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
19
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE.txt
|
|
23
|
+
License-File: THIRD_PARTY_NOTICES.txt
|
|
24
|
+
Dynamic: license-file
|
|
25
|
+
|
|
26
|
+
# STEM Agent Free
|
|
27
|
+
|
|
28
|
+
STEM Agent gives the coding agent you already use one complete scientific
|
|
29
|
+
toolkit, checked workflows, and a simple way to add specialized tools later.
|
|
30
|
+
The Free Alpha installs 40 standard scientific components and keeps calculated
|
|
31
|
+
results separate from independent verifier receipts.
|
|
32
|
+
|
|
33
|
+
STEM Agent is free to download and use. It remains proprietary software and is
|
|
34
|
+
not open source.
|
|
35
|
+
|
|
36
|
+
## Install
|
|
37
|
+
|
|
38
|
+
You need Python 3.12 and `pipx`. Then run:
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
pipx run stem-agent
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The installer verifies its embedded release bundle, creates separate worker
|
|
45
|
+
and verifier environments, checks all 40 components, runs a verified demo, and
|
|
46
|
+
creates a tested connection for each of the 15 coding agents listed on the
|
|
47
|
+
Exergy Lab home page.
|
|
48
|
+
|
|
49
|
+
Claude Code, Codex, GitHub Copilot CLI, Gemini CLI, Qwen Code, Prime-Agent,
|
|
50
|
+
Grok Build, Kimi Code, and Hermes Agent connect automatically when their CLI is
|
|
51
|
+
installed. OpenCode, DeepSeek Harness, MiniMax Code, and NAC receive exact
|
|
52
|
+
native configuration files without overwriting existing settings. Apodex Agent
|
|
53
|
+
Harness and Exoharness use the same installed tools through the stable local
|
|
54
|
+
command line because their current releases do not expose MCP clients.
|
|
55
|
+
|
|
56
|
+
The release workflow tests Windows 11 x64, Ubuntu 24.04 x64, and macOS 12 or
|
|
57
|
+
newer on both Apple Silicon and Intel before the package can publish.
|
|
58
|
+
|
|
59
|
+
No telemetry is sent. Use the local support and feedback commands to create an
|
|
60
|
+
inspectable, privacy-safe report that you choose whether to share.
|
|
61
|
+
|
|
62
|
+
Support: https://exergy-lab.com/contact
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
stem_agent-0.1.0.dist-info/licenses/LICENSE.txt,sha256=5padhjtfEtqGR0fq5Y33448N6gR_160IhoeYy6UIOpo,1346
|
|
2
|
+
stem_agent-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.txt,sha256=vZ0pMLVAsX7IaCke9saIPpYGUtfCvGhr38G-QtdpGis,884
|
|
3
|
+
stem_agent_installer/__init__.py,sha256=qBsM-405d36VSWUvn0irWSlAKbGwYc17YIW3EvnaVns,72
|
|
4
|
+
stem_agent_installer/__main__.py,sha256=PSQ4rpL0dG6f-qH4N7H-gD9igQkdHzH4yVZDcW8lfZo,80
|
|
5
|
+
stem_agent_installer/cli.py,sha256=AT3mIzdiwdbVmi_6TWicTkuEzXJ83iQfTTMUItGFc5E,8975
|
|
6
|
+
stem_agent_installer/payload/payload.json,sha256=hA1AxL5x1kEG97-VbDCrIK0-QbAX83MD4tpytul2UXI,462
|
|
7
|
+
stem_agent_installer/payload/stem-agent-0.1.0-free-alpha.zip,sha256=-RsEjW8D81EDnQ0ls5IGRV8DhG4tvGnio9dBHHmTZxU,196192
|
|
8
|
+
stem_agent-0.1.0.dist-info/METADATA,sha256=k4lS0OKyn0igm5EXd1yGEzB58xJdHnLfsrZxB8EOtMU,2562
|
|
9
|
+
stem_agent-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
10
|
+
stem_agent-0.1.0.dist-info/entry_points.txt,sha256=30QpUE4BxwW0Yhm9LRBMjne0qPaSk3l1zkWmptqQs6U,112
|
|
11
|
+
stem_agent-0.1.0.dist-info/top_level.txt,sha256=GNdXKc_nMm3W4J6hGID7n7q_AoB9_HVN0LRq7LX0Wuo,21
|
|
12
|
+
stem_agent-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
STEM Agent Free Alpha Proprietary License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Exergy Lab. All rights reserved.
|
|
4
|
+
|
|
5
|
+
STEM Agent is proprietary software. It is free to download and use under this
|
|
6
|
+
license, but it is not open source.
|
|
7
|
+
|
|
8
|
+
Exergy Lab grants each person or organization that obtains STEM Agent from an
|
|
9
|
+
authorized Exergy Lab distribution channel a non-exclusive, non-transferable,
|
|
10
|
+
revocable license to install and use the Free Alpha for personal, research,
|
|
11
|
+
educational, and internal business purposes at no charge.
|
|
12
|
+
|
|
13
|
+
You may not redistribute, sublicense, sell, rent, host for third parties,
|
|
14
|
+
publish, or create derivative works from STEM Agent, except with prior written
|
|
15
|
+
permission from Exergy Lab. You may not remove proprietary notices. Where a
|
|
16
|
+
restriction is prohibited by applicable law, it applies only to the maximum
|
|
17
|
+
extent permitted by that law.
|
|
18
|
+
|
|
19
|
+
STEM Agent is pre-release software. It is provided "as is", without warranties
|
|
20
|
+
or fitness guarantees. Outputs and verifier receipts are evidence about the
|
|
21
|
+
checks that were actually run; they are not a warranty of scientific truth or
|
|
22
|
+
authorization to rely on the software as the sole authority for safety-critical,
|
|
23
|
+
regulated, or consequential decisions.
|
|
24
|
+
|
|
25
|
+
Third-party software installed for use with STEM Agent remains subject to its
|
|
26
|
+
own license terms. This license neither replaces nor restricts those terms.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Third-party software notice
|
|
2
|
+
|
|
3
|
+
The STEM Agent bootstrap wheel contains Exergy Lab software and an Exergy Lab
|
|
4
|
+
release bundle. It does not embed the third-party scientific distribution
|
|
5
|
+
archives. During setup, the installer downloads a hash-locked dependency set
|
|
6
|
+
from the Python Package Index and installs it into the local worker runtime.
|
|
7
|
+
|
|
8
|
+
Each third-party component remains subject to its own license. The installed
|
|
9
|
+
license and notice files are retained in that component's Python distribution
|
|
10
|
+
metadata. The complete, versioned dependency set is recorded in the release
|
|
11
|
+
bundle's requirements lock and in the installation doctor report.
|
|
12
|
+
|
|
13
|
+
The 40 direct scientific components and the MCP runtime are declared in the
|
|
14
|
+
embedded STEM Agent product wheel. Transitive components are included in the
|
|
15
|
+
hash-locked requirements file. Exergy Lab does not claim ownership of any
|
|
16
|
+
third-party component.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
stem_agent_installer
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""Verify and install the public STEM Agent Free Alpha bundle."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
from hashlib import sha256
|
|
7
|
+
from importlib import resources
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
from pathlib import Path, PurePosixPath
|
|
11
|
+
import shutil
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
import tempfile
|
|
15
|
+
from typing import Any
|
|
16
|
+
import zipfile
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
PAYLOAD_SCHEMA = "stem-agent-public-pypi-installer-payload/1"
|
|
20
|
+
BUNDLE_SCHEMA = "stem-agent-product-bundle-manifest/2"
|
|
21
|
+
DISTRIBUTION_CHANNEL = "PUBLIC_FREE_ALPHA"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _file_sha256(path: Path) -> str:
|
|
25
|
+
digest = sha256()
|
|
26
|
+
with path.open("rb") as handle:
|
|
27
|
+
while chunk := handle.read(1024 * 1024):
|
|
28
|
+
digest.update(chunk)
|
|
29
|
+
return digest.hexdigest()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _safe_members(archive: zipfile.ZipFile, destination: Path) -> None:
|
|
33
|
+
resolved_destination = destination.resolve()
|
|
34
|
+
for member in archive.infolist():
|
|
35
|
+
normalized = member.filename.replace("\\", "/")
|
|
36
|
+
relative = PurePosixPath(normalized)
|
|
37
|
+
if (
|
|
38
|
+
relative.is_absolute()
|
|
39
|
+
or ".." in relative.parts
|
|
40
|
+
or not relative.parts
|
|
41
|
+
or relative.parts[0].endswith(":")
|
|
42
|
+
):
|
|
43
|
+
raise RuntimeError("the embedded STEM Agent bundle contains an unsafe path")
|
|
44
|
+
target = resolved_destination.joinpath(*relative.parts).resolve()
|
|
45
|
+
if target != resolved_destination and resolved_destination not in target.parents:
|
|
46
|
+
raise RuntimeError("the embedded STEM Agent bundle contains an unsafe path")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _verify_and_extract(
|
|
50
|
+
archive_path: Path, record: dict[str, Any], destination: Path
|
|
51
|
+
) -> dict[str, Any]:
|
|
52
|
+
if record.get("schema_version") != PAYLOAD_SCHEMA:
|
|
53
|
+
raise RuntimeError("the PyPI installer payload record is not recognized")
|
|
54
|
+
expected_name = record.get("bundle_filename")
|
|
55
|
+
if archive_path.name != expected_name:
|
|
56
|
+
raise RuntimeError("the embedded STEM Agent bundle name does not match its record")
|
|
57
|
+
observed_hash = _file_sha256(archive_path)
|
|
58
|
+
if observed_hash != record.get("bundle_sha256"):
|
|
59
|
+
raise RuntimeError("the embedded STEM Agent bundle failed its SHA-256 check")
|
|
60
|
+
if record.get("distribution_channel") != DISTRIBUTION_CHANNEL:
|
|
61
|
+
raise RuntimeError("the public Free Alpha distribution channel is missing")
|
|
62
|
+
if record.get("public_pypi_upload_allowed") is not True:
|
|
63
|
+
raise RuntimeError("the owner-authorized public PyPI boundary is missing")
|
|
64
|
+
if record.get("owner_authorized_public_distribution") is not True:
|
|
65
|
+
raise RuntimeError("public distribution has not been authorized")
|
|
66
|
+
if record.get("release_promoted") is not False:
|
|
67
|
+
raise RuntimeError("an unrecognized release state was supplied")
|
|
68
|
+
|
|
69
|
+
destination.mkdir(parents=True, exist_ok=False)
|
|
70
|
+
with zipfile.ZipFile(archive_path) as archive:
|
|
71
|
+
_safe_members(archive, destination)
|
|
72
|
+
archive.extractall(destination)
|
|
73
|
+
|
|
74
|
+
manifest_path = destination / "manifest.json"
|
|
75
|
+
if not manifest_path.is_file():
|
|
76
|
+
raise RuntimeError("the embedded STEM Agent bundle has no manifest")
|
|
77
|
+
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
|
|
78
|
+
if (
|
|
79
|
+
manifest.get("schema_version") != BUNDLE_SCHEMA
|
|
80
|
+
or manifest.get("product") != "STEM Agent"
|
|
81
|
+
or manifest.get("distribution_channel") != DISTRIBUTION_CHANNEL
|
|
82
|
+
or manifest.get("license") != "PROPRIETARY_FREE_ALPHA"
|
|
83
|
+
or manifest.get("supported_harness_count") != 15
|
|
84
|
+
or manifest.get("redistribution_authorized") is not True
|
|
85
|
+
or manifest.get("release_promoted") is not False
|
|
86
|
+
):
|
|
87
|
+
raise RuntimeError("the embedded bundle is not the public STEM Agent Free Alpha")
|
|
88
|
+
|
|
89
|
+
verified_artifacts = 0
|
|
90
|
+
for artifact in manifest.get("artifacts", []):
|
|
91
|
+
relative = PurePosixPath(str(artifact.get("relative_path", "")))
|
|
92
|
+
if relative.is_absolute() or ".." in relative.parts or not relative.parts:
|
|
93
|
+
raise RuntimeError("the embedded bundle manifest contains an unsafe artifact path")
|
|
94
|
+
artifact_path = destination.joinpath(*relative.parts)
|
|
95
|
+
if not artifact_path.is_file():
|
|
96
|
+
raise RuntimeError("the embedded STEM Agent bundle is incomplete")
|
|
97
|
+
if artifact_path.stat().st_size != artifact.get("size_bytes"):
|
|
98
|
+
raise RuntimeError("an embedded STEM Agent artifact has the wrong size")
|
|
99
|
+
if _file_sha256(artifact_path) != artifact.get("sha256"):
|
|
100
|
+
raise RuntimeError("an embedded STEM Agent artifact failed its SHA-256 check")
|
|
101
|
+
verified_artifacts += 1
|
|
102
|
+
|
|
103
|
+
if verified_artifacts == 0:
|
|
104
|
+
raise RuntimeError("the embedded STEM Agent bundle contains no recorded artifacts")
|
|
105
|
+
return {
|
|
106
|
+
"schema_version": "stem-agent-public-pypi-installer-verification/1",
|
|
107
|
+
"outcome": "VERIFIED",
|
|
108
|
+
"product": "STEM Agent",
|
|
109
|
+
"product_version": manifest["version"],
|
|
110
|
+
"distribution_channel": DISTRIBUTION_CHANNEL,
|
|
111
|
+
"bundle_sha256": observed_hash,
|
|
112
|
+
"manifest_sha256": _file_sha256(manifest_path),
|
|
113
|
+
"verified_artifact_count": verified_artifacts,
|
|
114
|
+
"supported_harness_count": 15,
|
|
115
|
+
"public_pypi_upload_allowed": True,
|
|
116
|
+
"owner_authorized_public_distribution": True,
|
|
117
|
+
"release_promoted": False,
|
|
118
|
+
"local_paths_included": False,
|
|
119
|
+
"credential_material_included": False,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _python_312_command() -> list[str]:
|
|
124
|
+
configured = os.environ.get("STEM_AGENT_PYTHON")
|
|
125
|
+
candidates: list[list[str]] = []
|
|
126
|
+
if configured:
|
|
127
|
+
candidates.append([configured])
|
|
128
|
+
if sys.version_info[:2] == (3, 12):
|
|
129
|
+
candidates.append([sys.executable])
|
|
130
|
+
if os.name == "nt":
|
|
131
|
+
launcher = shutil.which("py")
|
|
132
|
+
if launcher:
|
|
133
|
+
candidates.append([launcher, "-3.12"])
|
|
134
|
+
else:
|
|
135
|
+
executable = shutil.which("python3.12")
|
|
136
|
+
if executable:
|
|
137
|
+
candidates.append([executable])
|
|
138
|
+
|
|
139
|
+
for candidate in candidates:
|
|
140
|
+
completed = subprocess.run(
|
|
141
|
+
[
|
|
142
|
+
*candidate,
|
|
143
|
+
"-c",
|
|
144
|
+
"import sys; raise SystemExit(0 if sys.version_info[:2] == (3, 12) else 1)",
|
|
145
|
+
],
|
|
146
|
+
check=False,
|
|
147
|
+
stdout=subprocess.DEVNULL,
|
|
148
|
+
stderr=subprocess.DEVNULL,
|
|
149
|
+
)
|
|
150
|
+
if completed.returncode == 0:
|
|
151
|
+
return candidate
|
|
152
|
+
raise RuntimeError(
|
|
153
|
+
"Python 3.12 is required. Install it, then run this command again."
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _installer_command(bundle_root: Path, arguments: argparse.Namespace) -> list[str]:
|
|
158
|
+
command = [*_python_312_command(), str(bundle_root / "install.py")]
|
|
159
|
+
if arguments.install_root is not None:
|
|
160
|
+
command.extend(["--install-root", str(arguments.install_root)])
|
|
161
|
+
for option in (
|
|
162
|
+
"skip_agent_registration",
|
|
163
|
+
"skip_codex_registration",
|
|
164
|
+
"skip_claude_registration",
|
|
165
|
+
):
|
|
166
|
+
if getattr(arguments, option):
|
|
167
|
+
command.append("--" + option.replace("_", "-"))
|
|
168
|
+
return command
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _parser() -> argparse.ArgumentParser:
|
|
172
|
+
parser = argparse.ArgumentParser(
|
|
173
|
+
prog="stem-agent",
|
|
174
|
+
description=(
|
|
175
|
+
"Install STEM Agent Free and connect it to supported coding agents."
|
|
176
|
+
),
|
|
177
|
+
)
|
|
178
|
+
parser.add_argument("--install-root", type=Path)
|
|
179
|
+
parser.add_argument("--skip-agent-registration", action="store_true")
|
|
180
|
+
parser.add_argument("--skip-codex-registration", action="store_true")
|
|
181
|
+
parser.add_argument("--skip-claude-registration", action="store_true")
|
|
182
|
+
parser.add_argument(
|
|
183
|
+
"--verify-only",
|
|
184
|
+
action="store_true",
|
|
185
|
+
help="verify the embedded public release bundle without installing it",
|
|
186
|
+
)
|
|
187
|
+
parser.add_argument("--version", action="version", version="STEM Agent Free 0.1.0")
|
|
188
|
+
return parser
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def main(argv: list[str] | None = None) -> int:
|
|
192
|
+
arguments = _parser().parse_args(argv)
|
|
193
|
+
package_root = resources.files("stem_agent_installer")
|
|
194
|
+
payload_root = package_root.joinpath("payload")
|
|
195
|
+
record = json.loads(payload_root.joinpath("payload.json").read_text(encoding="utf-8"))
|
|
196
|
+
archive_resource = payload_root.joinpath(str(record.get("bundle_filename", "")))
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
with resources.as_file(archive_resource) as archive_path:
|
|
200
|
+
with tempfile.TemporaryDirectory(prefix="stem-agent-install-") as temporary:
|
|
201
|
+
bundle_root = Path(temporary) / "bundle"
|
|
202
|
+
verification = _verify_and_extract(Path(archive_path), record, bundle_root)
|
|
203
|
+
if arguments.verify_only:
|
|
204
|
+
print(json.dumps(verification, indent=2, sort_keys=True))
|
|
205
|
+
return 0
|
|
206
|
+
print("Verified the STEM Agent Free package.")
|
|
207
|
+
completed = subprocess.run(
|
|
208
|
+
_installer_command(bundle_root, arguments),
|
|
209
|
+
check=False,
|
|
210
|
+
)
|
|
211
|
+
return completed.returncode
|
|
212
|
+
except (OSError, RuntimeError, ValueError, zipfile.BadZipFile) as error:
|
|
213
|
+
raise SystemExit(f"STEM Agent installation stopped safely: {error}") from error
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
if __name__ == "__main__":
|
|
217
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bundle_filename": "stem-agent-0.1.0-free-alpha.zip",
|
|
3
|
+
"bundle_sha256": "f91b048d6f03f351039d0d25b39206455f03846e2dbc69e2a3d7411c79936715",
|
|
4
|
+
"bundle_size_bytes": 196192,
|
|
5
|
+
"distribution_channel": "PUBLIC_FREE_ALPHA",
|
|
6
|
+
"owner_authorized_public_distribution": true,
|
|
7
|
+
"product": "STEM Agent",
|
|
8
|
+
"product_version": "0.1.0",
|
|
9
|
+
"public_pypi_upload_allowed": true,
|
|
10
|
+
"release_promoted": false,
|
|
11
|
+
"schema_version": "stem-agent-public-pypi-installer-payload/1"
|
|
12
|
+
}
|
|
Binary file
|