urun-cli 0.6.2__tar.gz → 0.6.3__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 (33) hide show
  1. {urun_cli-0.6.2 → urun_cli-0.6.3}/CHANGELOG.md +9 -0
  2. {urun_cli-0.6.2 → urun_cli-0.6.3}/PKG-INFO +1 -1
  3. {urun_cli-0.6.2 → urun_cli-0.6.3}/pyproject.toml +1 -1
  4. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/scratch.py +49 -11
  5. {urun_cli-0.6.2 → urun_cli-0.6.3}/.gitignore +0 -0
  6. {urun_cli-0.6.2 → urun_cli-0.6.3}/LICENSE +0 -0
  7. {urun_cli-0.6.2 → urun_cli-0.6.3}/README.md +0 -0
  8. {urun_cli-0.6.2 → urun_cli-0.6.3}/SECURITY.md +0 -0
  9. {urun_cli-0.6.2 → urun_cli-0.6.3}/hatch_build.py +0 -0
  10. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/__init__.py +0 -0
  11. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/_bin/README.md +0 -0
  12. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/api.py +0 -0
  13. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/buildlogs.py +0 -0
  14. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/catalog.py +0 -0
  15. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/cli.py +0 -0
  16. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/client_tokens.py +0 -0
  17. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/config.py +0 -0
  18. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/deps.py +0 -0
  19. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/dev.py +0 -0
  20. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/devconsole.py +0 -0
  21. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/devstream.py +0 -0
  22. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/discovery.py +0 -0
  23. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/errors.py +0 -0
  24. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/fleet.py +0 -0
  25. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/frontend_launch.py +0 -0
  26. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/launch_auth.py +0 -0
  27. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/manifest.py +0 -0
  28. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/nodes.py +0 -0
  29. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/openai_proxy_bin.py +0 -0
  30. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/repo_deps.py +0 -0
  31. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/retry.py +0 -0
  32. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/runtime_health.py +0 -0
  33. {urun_cli-0.6.2 → urun_cli-0.6.3}/src/urun/serve.py +0 -0
@@ -1,3 +1,12 @@
1
+ ## 0.6.3
2
+
3
+ - Bump the vendored `urun-openai` binary pin to `@urun-sh/openai@0.5.0` — the
4
+ **`omp` agent launcher** (`urun compat omp -p "..."`, the direct
5
+ extension lane: no proxy subprocess, omp loads `@urun-sh/openai/pi-extension`
6
+ via its own `-e` mechanism and selects the app with `--model urun/<slug>`)
7
+ ships through the installed CLI's vendored bundle. Pin + integrity advanced
8
+ in the same commit (supply-chain contract, see `scripts/openai_proxy.pin`).
9
+
1
10
  # Changelog
2
11
 
3
12
  ## 0.5.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: urun-cli
3
- Version: 0.6.2
3
+ Version: 0.6.3
4
4
  Summary: End-user CLI for deploying apps to urun
5
5
  Project-URL: Homepage, https://urun.sh
6
6
  Project-URL: Repository, https://github.com/urun-sh/urun-cli
@@ -20,7 +20,7 @@ name = "urun-cli"
20
20
  # so every merge remains on the already-published version until this value is
21
21
  # advanced. Wiring semantic-release into CI remains separate work; this patch
22
22
  # bump is the minimal release unblock for the three post-v0.6.0 fixes.
23
- version = "0.6.2"
23
+ version = "0.6.3"
24
24
  description = "End-user CLI for deploying apps to urun"
25
25
  readme = "README.md"
26
26
  requires-python = ">=3.11"
@@ -341,6 +341,49 @@ def _scratch_venv_path(name: str) -> str:
341
341
  return f"{SCRATCH_STORAGE_ROOT}/{name}/venv"
342
342
 
343
343
 
344
+ def _scratch_storage_mounts(
345
+ runtime_container: dict[str, Any], name: str
346
+ ) -> tuple[list[dict[str, Any]], dict[str, Any] | None]:
347
+ """The storage mounts the venv overlay needs, for either render shape.
348
+
349
+ Returns ``(init_mounts, runtime_extra)``:
350
+
351
+ * LEGACY full-root render (``/mnt/storage-backend`` mounted whole): the
352
+ init container reuses that mount and the runtime container already sees
353
+ the scratch venv through it — ``runtime_extra`` is ``None``.
354
+ * SCOPED render (tenant isolation: only subPath mounts such as ``.uv``):
355
+ the init container gets the ``.uv`` mount (the source venv, read-only,
356
+ as rendered) plus a READ-WRITE subPath mount of the platform scratch
357
+ prefix ``.scratch/<name>`` at the scratch venv's parent dir (kubelet
358
+ creates a missing RW subPath dir); the runtime container needs that
359
+ same RW mount to reach ``URUN_DEPS_VENV`` — returned as
360
+ ``runtime_extra``. No full-root mount is ever added to a scoped pod.
361
+ """
362
+ mounts = runtime_container.get("volumeMounts", [])
363
+ full_root = [m for m in mounts if m.get("mountPath") == "/mnt/storage-backend"]
364
+ if full_root:
365
+ return copy.deepcopy(full_root), None
366
+ uv = [m for m in mounts if m.get("subPath") == ".uv"]
367
+ if not uv:
368
+ raise UrunError(
369
+ "--wheel needs the runtime container to mount the deps venv store "
370
+ "(/mnt/storage-backend whole, or the scoped .uv subPath) — no such mount found"
371
+ )
372
+ if uv[0].get("readOnly") is not True:
373
+ raise UrunError(
374
+ "--wheel refuses a scoped render whose .uv subPath is writable: the shared "
375
+ "deps-venv store must be read-only on tenant pods (a writable .uv would let "
376
+ "the scratch pod modify every app's venv)"
377
+ )
378
+ scratch_mount = {
379
+ "name": uv[0]["name"],
380
+ "mountPath": f"{SCRATCH_STORAGE_ROOT}/{name}",
381
+ "subPath": f".scratch/{name}",
382
+ "readOnly": False,
383
+ }
384
+ return [copy.deepcopy(uv[0]), copy.deepcopy(scratch_mount)], scratch_mount
385
+
386
+
344
387
  def venv_overlay_init_container(
345
388
  runtime_container: dict[str, Any], wheel_spec: str, name: str
346
389
  ) -> dict[str, Any]:
@@ -375,21 +418,12 @@ def venv_overlay_init_container(
375
418
  'touch "$dst/.scratch-ready"\n'
376
419
  'echo "[scratch] venv overlay ready: $dst"\n'
377
420
  )
378
- storage_mounts = [
379
- mount
380
- for mount in runtime_container.get("volumeMounts", [])
381
- if mount.get("mountPath") == "/mnt/storage-backend"
382
- ]
383
- if not storage_mounts:
384
- raise UrunError(
385
- "--wheel needs the runtime container to mount /mnt/storage-backend "
386
- "(no storage mount found)"
387
- )
421
+ init_mounts, _runtime_extra = _scratch_storage_mounts(runtime_container, name)
388
422
  return {
389
423
  "name": "scratch-venv-overlay",
390
424
  "image": runtime_container["image"],
391
425
  "command": ["sh", "-c", script],
392
- "volumeMounts": copy.deepcopy(storage_mounts),
426
+ "volumeMounts": init_mounts,
393
427
  }
394
428
 
395
429
 
@@ -470,6 +504,10 @@ def derive_scratch_sts(
470
504
  overlay = venv_overlay_init_container(runtime, wheel_spec, name)
471
505
  pod_spec.setdefault("initContainers", []).append(overlay)
472
506
  forced_env["URUN_DEPS_VENV"] = _scratch_venv_path(name)
507
+ _init_mounts, runtime_extra = _scratch_storage_mounts(runtime, name)
508
+ if runtime_extra is not None:
509
+ # Scoped render: the runtime container must reach the overlaid venv.
510
+ runtime.setdefault("volumeMounts", []).append(copy.deepcopy(runtime_extra))
473
511
 
474
512
  env_list = runtime.setdefault("env", [])
475
513
  present = {e.get("name") for e in env_list}
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