inline-core 1.2.1__tar.gz → 1.2.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 (151) hide show
  1. {inline_core-1.2.1 → inline_core-1.2.2}/.gitignore +4 -0
  2. {inline_core-1.2.1 → inline_core-1.2.2}/PKG-INFO +1 -1
  3. {inline_core-1.2.1 → inline_core-1.2.2}/pyproject.toml +1 -1
  4. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/fetch.py +11 -4
  5. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_install.py +19 -0
  6. {inline_core-1.2.1 → inline_core-1.2.2}/.python-version +0 -0
  7. {inline_core-1.2.1 → inline_core-1.2.2}/CLAUDE.md +0 -0
  8. {inline_core-1.2.1 → inline_core-1.2.2}/README.md +0 -0
  9. {inline_core-1.2.1 → inline_core-1.2.2}/main.py +0 -0
  10. {inline_core-1.2.1 → inline_core-1.2.2}/scripts/reference.py +0 -0
  11. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/__init__.py +0 -0
  12. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/components/__init__.py +0 -0
  13. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/components/conditioning.py +0 -0
  14. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/components/interfaces.py +0 -0
  15. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/config.py +0 -0
  16. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/__init__.py +0 -0
  17. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/auto.py +0 -0
  18. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/detect.py +0 -0
  19. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/memory.py +0 -0
  20. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/policy.py +0 -0
  21. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/types.py +0 -0
  22. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/errors.py +0 -0
  23. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/__init__.py +0 -0
  24. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/api.py +0 -0
  25. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/constraints.py +0 -0
  26. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/handlers.py +0 -0
  27. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/importer.py +0 -0
  28. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/install.py +0 -0
  29. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/loader.py +0 -0
  30. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/manifest.py +0 -0
  31. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/models.py +0 -0
  32. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/paths.py +0 -0
  33. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/resolve.py +0 -0
  34. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/scanner.py +0 -0
  35. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/state.py +0 -0
  36. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/tools.py +0 -0
  37. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/__init__.py +0 -0
  38. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/cache.py +0 -0
  39. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/descriptor.py +0 -0
  40. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/executor.py +0 -0
  41. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/loader_runners.py +0 -0
  42. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/primitives.py +0 -0
  43. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/registry.py +0 -0
  44. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/runners.py +0 -0
  45. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/schema.py +0 -0
  46. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/topo.py +0 -0
  47. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/validate.py +0 -0
  48. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/importer/__init__.py +0 -0
  49. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/importer/comfy.py +0 -0
  50. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/media.py +0 -0
  51. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/__init__.py +0 -0
  52. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/catalog.py +0 -0
  53. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/loaders.py +0 -0
  54. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/requirements.py +0 -0
  55. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/sampling.py +0 -0
  56. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/__init__.py +0 -0
  57. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/primitives.py +0 -0
  58. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/provider.py +0 -0
  59. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/requirements.py +0 -0
  60. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/runner.py +0 -0
  61. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/__init__.py +0 -0
  62. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/config.py +0 -0
  63. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/group.py +0 -0
  64. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/launch.py +0 -0
  65. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/protocol.py +0 -0
  66. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/registry.py +0 -0
  67. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/worker.py +0 -0
  68. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/__init__.py +0 -0
  69. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/context.py +0 -0
  70. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/file_store.py +0 -0
  71. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/progress.py +0 -0
  72. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/run.py +0 -0
  73. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/store.py +0 -0
  74. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/sampling/__init__.py +0 -0
  75. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/sampling/batch.py +0 -0
  76. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/__init__.py +0 -0
  77. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/__main__.py +0 -0
  78. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/app.py +0 -0
  79. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/assets.py +0 -0
  80. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/bootstrap.py +0 -0
  81. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/frontend.py +0 -0
  82. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/manager.py +0 -0
  83. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/rpc.py +0 -0
  84. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/run_store.py +0 -0
  85. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/serialize.py +0 -0
  86. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/__init__.py +0 -0
  87. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/assets.py +0 -0
  88. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/config.py +0 -0
  89. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/fal.py +0 -0
  90. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/frames.py +0 -0
  91. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/generation.py +0 -0
  92. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/graph_build.py +0 -0
  93. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/handlers.py +0 -0
  94. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/models.py +0 -0
  95. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/moodboard.py +0 -0
  96. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/peaks.py +0 -0
  97. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/schema.py +0 -0
  98. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/store.py +0 -0
  99. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/__init__.py +0 -0
  100. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/compose.py +0 -0
  101. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/ffmpeg.py +0 -0
  102. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/render.py +0 -0
  103. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/resolve.py +0 -0
  104. {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/takes.py +0 -0
  105. {inline_core-1.2.1 → inline_core-1.2.2}/tests/helpers.py +0 -0
  106. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_cache.py +0 -0
  107. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_catalog.py +0 -0
  108. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_comfy_import.py +0 -0
  109. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_config.py +0 -0
  110. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_device_detect.py +0 -0
  111. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_executor.py +0 -0
  112. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_api.py +0 -0
  113. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_manifest.py +0 -0
  114. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_resolve.py +0 -0
  115. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_scanner.py +0 -0
  116. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_spine.py +0 -0
  117. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_state.py +0 -0
  118. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_file_store.py +0 -0
  119. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_frontend_serving.py +0 -0
  120. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_hidden_nodes.py +0 -0
  121. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_loader_runners.py +0 -0
  122. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_loaders.py +0 -0
  123. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_memory_policy.py +0 -0
  124. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_model_requirements.py +0 -0
  125. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_parallel_group.py +0 -0
  126. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_primitives.py +0 -0
  127. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_rpc_bridge.py +0 -0
  128. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_run_store.py +0 -0
  129. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_sampling.py +0 -0
  130. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_schema.py +0 -0
  131. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_server.py +0 -0
  132. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_assets.py +0 -0
  133. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_fal.py +0 -0
  134. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_frames.py +0 -0
  135. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_generation.py +0 -0
  136. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_models.py +0 -0
  137. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_moodboard.py +0 -0
  138. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_peaks.py +0 -0
  139. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_rpc.py +0 -0
  140. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_schema.py +0 -0
  141. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_store.py +0 -0
  142. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_timeline.py +0 -0
  143. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_take_bytes.py +0 -0
  144. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_topo.py +0 -0
  145. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_validate.py +0 -0
  146. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_xfuser_sampler.py +0 -0
  147. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_zimage_primitives.py +0 -0
  148. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_zimage_resolve.py +0 -0
  149. {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_zimage_runner.py +0 -0
  150. {inline_core-1.2.1 → inline_core-1.2.2}/uv.lock +0 -0
  151. {inline_core-1.2.1 → inline_core-1.2.2}/webui.sh +0 -0
@@ -6,6 +6,10 @@
6
6
  # Engine working data: the run DB and generated takes (also grows to gigabytes).
7
7
  /.inline/
8
8
 
9
+ # Installed community extensions - `extensions_dir()` defaults to ./extensions (state.json, the
10
+ # per-extension source/venv, and the .cache/git mirrors). Runtime data, never committed.
11
+ /extensions/
12
+
9
13
  # Studio app data + project workspace (when created under the repo) and local server logs.
10
14
  /.inline-studio-server/
11
15
  /InlineStudioProjects/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: inline-core
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: The generation engine behind Inline Studio.
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: numpy>=1.26
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  # PyPI name; the import package is `inline_core` (src/inline_core).
3
3
  name = "inline-core"
4
- version = "1.2.1"
4
+ version = "1.2.2"
5
5
  description = "The generation engine behind Inline Studio."
6
6
  readme = "README.md"
7
7
  requires-python = ">=3.11"
@@ -9,6 +9,7 @@ from __future__ import annotations
9
9
 
10
10
  import io
11
11
  import re
12
+ import shutil
12
13
  import subprocess
13
14
  import tarfile
14
15
  from dataclasses import dataclass
@@ -66,11 +67,17 @@ def _validate(url: str, ref: str) -> None:
66
67
 
67
68
 
68
69
  def _sync_mirror(url: str, mirror: Path) -> None:
70
+ # A valid bare mirror has HEAD at its top; a clone interrupted mid-write leaves objects/refs but
71
+ # no HEAD, and `git clone` would then refuse the non-empty directory ("already exists").
69
72
  if (mirror / "HEAD").is_file():
70
- # Re-point at the URL in case a registry entry moved the repo.
71
- _git("remote", "set-url", "origin", url, cwd=mirror)
72
- _git("fetch", "--prune", "--tags", "origin", "+refs/heads/*:refs/heads/*", cwd=mirror)
73
- return
73
+ try:
74
+ # Re-point at the URL in case a registry entry moved the repo.
75
+ _git("remote", "set-url", "origin", url, cwd=mirror)
76
+ _git("fetch", "--prune", "--tags", "origin", "+refs/heads/*:refs/heads/*", cwd=mirror)
77
+ return
78
+ except FetchError:
79
+ pass # A wedged mirror must not strand reinstall; drop it and re-clone below.
80
+ shutil.rmtree(mirror, ignore_errors=True)
74
81
  mirror.parent.mkdir(parents=True, exist_ok=True)
75
82
  _git("clone", "--bare", "--quiet", url, str(mirror))
76
83
 
@@ -369,6 +369,25 @@ def test_uninstall_removes_the_extension_from_disk_and_state(
369
369
  assert not installer._registry.has("demo/invert")
370
370
 
371
371
 
372
+ def test_reinstall_recovers_from_a_corrupt_cached_mirror(
373
+ installer: Installer, tmp_path: Path
374
+ ) -> None:
375
+ """A clone interrupted mid-write leaves a mirror with objects/refs but no HEAD. Uninstall never
376
+ touches the cache, so a plain re-clone would hit "destination already exists". Reinstall must
377
+ heal it instead of failing at fetch."""
378
+ repo = _make_repo(tmp_path, MANIFEST)
379
+ _install(installer, repo)
380
+ installer.uninstall("demo-extension")
381
+
382
+ mirror = next((installer.paths.cache / "git").glob("*.git"))
383
+ (mirror / "HEAD").unlink() # wedge the mirror the way an aborted clone would
384
+
385
+ result = _install(installer, repo)
386
+
387
+ assert result.name == "Demo Extension"
388
+ assert (mirror / "HEAD").is_file()
389
+
390
+
372
391
  def test_switching_to_an_uninstalled_version_is_refused(
373
392
  installer: Installer, tmp_path: Path
374
393
  ) -> None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes