simulo 0.31.1__tar.gz → 0.31.2__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.
Files changed (61) hide show
  1. {simulo-0.31.1/src/simulo.egg-info → simulo-0.31.2}/PKG-INFO +1 -1
  2. {simulo-0.31.1 → simulo-0.31.2}/pyproject.toml +1 -1
  3. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/builtin_aliases.py +8 -15
  4. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/cli.py +52 -20
  5. {simulo-0.31.1 → simulo-0.31.2/src/simulo.egg-info}/PKG-INFO +1 -1
  6. {simulo-0.31.1 → simulo-0.31.2}/MANIFEST.in +0 -0
  7. {simulo-0.31.1 → simulo-0.31.2}/PYPI.md +0 -0
  8. {simulo-0.31.1 → simulo-0.31.2}/setup.cfg +0 -0
  9. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/__init__.py +0 -0
  10. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/__init__.py +0 -0
  11. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/_arguments.py +0 -0
  12. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/_mounts.py +0 -0
  13. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/_runner.py +0 -0
  14. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/_secure_downloads.py +0 -0
  15. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/app.py +0 -0
  16. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/asset.py +0 -0
  17. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/asset_api.py +0 -0
  18. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/asset_package.py +0 -0
  19. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/asset_pins.py +0 -0
  20. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/bundle.py +0 -0
  21. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/cancel_api.py +0 -0
  22. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/config.py +0 -0
  23. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/credentials.py +0 -0
  24. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/discovery.py +0 -0
  25. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/export_api.py +0 -0
  26. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/facades.py +0 -0
  27. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/http.py +0 -0
  28. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/identity_api.py +0 -0
  29. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/install_samples.py +0 -0
  30. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/jobs_api.py +0 -0
  31. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/learning.py +0 -0
  32. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/login.py +0 -0
  33. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/mode.py +0 -0
  34. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/onnx_bundle.py +0 -0
  35. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/outputs.py +0 -0
  36. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/packaging.py +0 -0
  37. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/policies_api.py +0 -0
  38. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/preflight_api.py +0 -0
  39. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/preflight_render.py +0 -0
  40. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/preview_report.py +0 -0
  41. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/registry.py +0 -0
  42. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/runtime.py +0 -0
  43. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/runtime_display.py +0 -0
  44. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/stub.py +0 -0
  45. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/submit_api.py +0 -0
  46. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/templates/__init__.py +0 -0
  47. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/templates/training/play.py.tmpl +0 -0
  48. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/templates/training/preview.py.tmpl +0 -0
  49. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/templates/training/simuloignore.tmpl +0 -0
  50. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/templates/training/task.py.tmpl +0 -0
  51. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/templates/training/train.py.tmpl +0 -0
  52. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/view_fragment.py +0 -0
  53. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/view_session_api.py +0 -0
  54. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/_client/volume.py +0 -0
  55. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/callbacks.py +0 -0
  56. {simulo-0.31.1 → simulo-0.31.2}/src/simulo/py.typed +0 -0
  57. {simulo-0.31.1 → simulo-0.31.2}/src/simulo.egg-info/SOURCES.txt +0 -0
  58. {simulo-0.31.1 → simulo-0.31.2}/src/simulo.egg-info/dependency_links.txt +0 -0
  59. {simulo-0.31.1 → simulo-0.31.2}/src/simulo.egg-info/entry_points.txt +0 -0
  60. {simulo-0.31.1 → simulo-0.31.2}/src/simulo.egg-info/requires.txt +0 -0
  61. {simulo-0.31.1 → simulo-0.31.2}/src/simulo.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simulo
3
- Version: 0.31.1
3
+ Version: 0.31.2
4
4
  Summary: Python SDK and CLI for cloud-native robotics simulation, reinforcement learning, and robot policy training on managed GPUs.
5
5
  Author-email: Simulo Team <team@simulo.ai>
6
6
  License: BSD-3-Clause
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "simulo"
7
- version = "0.31.1"
7
+ version = "0.31.2"
8
8
  description = "Python SDK and CLI for cloud-native robotics simulation, reinforcement learning, and robot policy training on managed GPUs."
9
9
  readme = "PYPI.md"
10
10
  requires-python = ">=3.11"
@@ -9,21 +9,12 @@ equivalent has been seeded — pointing the user at the ``simulo/robot/...`` idi
9
9
  Two pieces:
10
10
 
11
11
  * :data:`BUILTIN_ASSET_ALIASES` — the ``<builtin-name> -> <catalog-ref>`` table.
12
- **PR-13 populated this table for real**, from a live GPU seeding run
13
- (``scripts/seed-global-catalog.py``, run against a real control plane + a
14
- real worker on the local 3090): every entry below is a builtin whose USD
15
- closure localized AND whose real cloud validation (settle + actuation
16
- probes) actually PASSED. A ``BUILTIN_ROBOT_CONFIGS`` name that isn't here
17
- (``cartpole``, ``franka``, ``humanoid``, ``unitree_go2``, ``ur10`` as of
18
- PR-13) genuinely has NOT been seeded — it failed real validation or could
19
- not be localized into a self-contained package — so the scan below finds
20
- nothing for it and NO notice is printed; that ``builtin://`` ref still
21
- resolves through the legacy path. Do not add entries here by hand: a name
22
- belongs in this table only once ``scripts/seed-global-catalog.py`` has
23
- actually published + validated its ``simulo/robot/<name>`` catalog entry
24
- (the script's own ``update_alias_table`` appends here, additively, keyed
25
- on the SAME name it published under — see that script for the current
26
- seed report), or the notice would send users to a ref that 404s.
12
+ Every entry was published by the catalog seeding script and passed real
13
+ validation. A builtin that is not here has not, so the scan below prints no
14
+ notice for it and its ``builtin://`` reference still resolves the old way.
15
+ Add entries only after a real publish and validation (the seeding script
16
+ appends them itself); otherwise the notice would send users to a catalog
17
+ reference that does not exist.
27
18
 
28
19
  * :func:`scan_source_for_builtin_aliases` — a textual scan of the packaged source
29
20
  files at submit, returning every ``(builtin_name, catalog_ref)`` pair whose
@@ -45,7 +36,9 @@ from typing import Dict, List, Tuple
45
36
  BUILTIN_ASSET_ALIASES: Dict[str, str] = {
46
37
  "anymal": "simulo/robot/anymal-c",
47
38
  "anymal_c": "simulo/robot/anymal-c",
39
+ "cartpole": "simulo/robot/cartpole",
48
40
  "h1": "simulo/robot/unitree-h1",
41
+ "humanoid": "simulo/robot/humanoid",
49
42
  "jetbot": "simulo/robot/jetbot",
50
43
  "pick_and_place": "simulo/robot/pick-and-place",
51
44
  "unitree_h1": "simulo/robot/unitree-h1",
@@ -168,7 +168,7 @@ from simulo._client.asset_package import (
168
168
  slugify_name,
169
169
  validate_asset_name,
170
170
  )
171
- from simulo._client.asset_pins import collect_asset_refs
171
+ from simulo._client.asset_pins import collect_asset_refs, resolve_and_pin_assets
172
172
  from simulo._client.builtin_aliases import format_builtin_deprecation_notice, scan_source_for_builtin_aliases
173
173
  from simulo._client.bundle import build_manifest
174
174
  from simulo._client.cancel_api import CancelApiClient, CancelApiHTTPError
@@ -1706,8 +1706,8 @@ def _render_preflight_outcome(app_file: Path, outcome: PreflightOutcome) -> int:
1706
1706
 
1707
1707
 
1708
1708
  def _cmd_prepare(args: argparse.Namespace) -> int:
1709
- """``simulo prepare <app>`` — build the manifest and ask the platform
1710
- whether this app would submit cleanly, before uploading a single byte.
1709
+ """``simulo prepare <app>`` — build the manifest, resolve its assets when
1710
+ authenticated, and ask whether the app would submit cleanly before upload.
1711
1711
 
1712
1712
  Never uploads a package, never creates a job — safe to run as often as
1713
1713
  you like before ``simulo run``. It DOES import your app file to discover
@@ -1723,22 +1723,46 @@ def _cmd_prepare(args: argparse.Namespace) -> int:
1723
1723
  if not app_file.is_file():
1724
1724
  raise SystemExit(f"No such app file: {app_file}")
1725
1725
  project_root = app_file.parent
1726
- app = discover(app_file)
1727
- if not isinstance(app, App):
1728
- raise TypeError(f"Discovered object is not a simulo.App: {app!r}")
1729
- _validate_app_job_file(app, app_file)
1730
- # Builds the manifest only — no source tree copy, no tar, no upload. The
1731
- # #285 platform-pinned-package denylist (``build_manifest``'s own
1732
- # ``SystemExit``) still applies here exactly as it does at `simulo run`;
1733
- # it is a DIFFERENT, client-side-only mechanism from the preflight HTTP
1734
- # call below and must never be confused with a preflight finding (see
1735
- # the preflight API/rendering separation verified by the CLI tests).
1736
- manifest = build_manifest(app, app_file, project_root)
1726
+ with capture_constructed_assets() as captured_assets:
1727
+ app = discover(app_file)
1728
+ if not isinstance(app, App):
1729
+ raise TypeError(f"Discovered object is not a simulo.App: {app!r}")
1730
+ _validate_app_job_file(app, app_file)
1731
+ # Builds the manifest only — no source tree copy, no tar, no upload. The
1732
+ # #285 platform-pinned-package denylist (``build_manifest``'s own
1733
+ # ``SystemExit``) still applies here exactly as it does at `simulo run`;
1734
+ # it is a DIFFERENT, client-side-only mechanism from the preflight HTTP
1735
+ # call below and must never be confused with a preflight finding (see
1736
+ # the preflight API/rendering separation verified by the CLI tests).
1737
+ manifest = build_manifest(app, app_file, project_root, extra_assets=captured_assets)
1737
1738
  manifest_data = json.loads(manifest.to_json())
1738
1739
  asset_refs = collect_asset_refs(manifest_data)
1739
- base_url, token = _resolve_client_context()
1740
+ try:
1741
+ base_url, token = _resolve_client_context()
1742
+ except credentials.TokenRefreshError as exc:
1743
+ if not _caused_by(exc, http.HttpUnavailable):
1744
+ raise
1745
+ # Asset resolution and preflight are optional checks. Preserve a
1746
+ # rejected refresh as a hard authentication error, while allowing a
1747
+ # network-only refresh failure to use the saved target without sending
1748
+ # the expired bearer.
1749
+ stale_creds = credentials.load_credentials()
1750
+ base_url, token = config.resolve_base_url(stale_creds), None
1751
+ resolved_assets: Optional[list[dict[str, str]]] = [] if not asset_refs else None
1752
+ if asset_refs:
1753
+ if token is None:
1754
+ print("Asset references were not checked.", file=sys.stderr)
1755
+ else:
1756
+ try:
1757
+ resolved_assets = resolve_and_pin_assets(SubmitApiClient(base_url, token=token), asset_refs)
1758
+ except http.HttpUnavailable:
1759
+ print("Asset references were not checked.", file=sys.stderr)
1760
+ except http.HttpHTTPError as exc:
1761
+ if exc.status != 404 and not 500 <= exc.status <= 599:
1762
+ raise
1763
+ print("Asset references were not checked.", file=sys.stderr)
1740
1764
  client = PreflightApiClient(base_url, token=token)
1741
- outcome = client.evaluate(manifest, assets=[] if not asset_refs else None)
1765
+ outcome = client.evaluate(manifest, assets=resolved_assets)
1742
1766
  return _render_preflight_outcome(app_file, outcome)
1743
1767
 
1744
1768
 
@@ -2825,6 +2849,13 @@ def _cmd_result(args: argparse.Namespace) -> int:
2825
2849
  if exc.status == 404:
2826
2850
  display_ref = _human_job_ref(job_id)
2827
2851
  hint_ref = display_ref if display_ref.startswith("job_") else "<JOB_ID>"
2852
+ if (job_record or {}).get("job_type") == "export":
2853
+ print(
2854
+ f"{_human_job_subject(job_id)} produces a bundle rather than a result. "
2855
+ f"List its outputs with `simulo outputs {hint_ref}`.",
2856
+ file=sys.stderr,
2857
+ )
2858
+ return 1
2828
2859
  print(
2829
2860
  f"No result for {display_ref}: {_safe_cli_error_text(exc.message)}\n"
2830
2861
  "A result exists once the job has finished and returned one — check `simulo jobs` "
@@ -8104,10 +8135,11 @@ def _build_parser() -> argparse.ArgumentParser:
8104
8135
  prepare = sub.add_parser(
8105
8136
  "prepare",
8106
8137
  help=(
8107
- "Check a Simulo app against the platform BEFORE submitting it — builds the manifest "
8108
- "and asks the platform whether it would work (pip version conflicts, invalid job "
8109
- "timeouts, and more). Imports your app file, same as `simulo run`. Never uploads "
8110
- "anything and never creates a job."
8138
+ "Check a Simulo app against the platform BEFORE submitting it. Builds the manifest "
8139
+ "and, when signed in, resolves its catalog asset references before asking whether it "
8140
+ "would work (pip version conflicts, invalid job timeouts, and more). Signed-out or "
8141
+ "unreachable asset checks are reported and skipped. Imports your app file, same as "
8142
+ "`simulo run`. Never uploads anything and never creates a job."
8111
8143
  ),
8112
8144
  )
8113
8145
  prepare.add_argument("app_file", help="Path to the Python file declaring the simulo.App.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simulo
3
- Version: 0.31.1
3
+ Version: 0.31.2
4
4
  Summary: Python SDK and CLI for cloud-native robotics simulation, reinforcement learning, and robot policy training on managed GPUs.
5
5
  Author-email: Simulo Team <team@simulo.ai>
6
6
  License: BSD-3-Clause
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes