inline-core 1.1.1__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.
Files changed (77) hide show
  1. inline_core/__init__.py +7 -0
  2. inline_core/components/__init__.py +1 -0
  3. inline_core/components/conditioning.py +20 -0
  4. inline_core/components/interfaces.py +91 -0
  5. inline_core/config.py +33 -0
  6. inline_core/device/__init__.py +1 -0
  7. inline_core/device/auto.py +35 -0
  8. inline_core/device/detect.py +41 -0
  9. inline_core/device/memory.py +168 -0
  10. inline_core/device/policy.py +82 -0
  11. inline_core/device/types.py +31 -0
  12. inline_core/errors.py +42 -0
  13. inline_core/graph/__init__.py +1 -0
  14. inline_core/graph/cache.py +83 -0
  15. inline_core/graph/descriptor.py +81 -0
  16. inline_core/graph/executor.py +102 -0
  17. inline_core/graph/primitives.py +137 -0
  18. inline_core/graph/registry.py +61 -0
  19. inline_core/graph/runners.py +72 -0
  20. inline_core/graph/schema.py +136 -0
  21. inline_core/graph/topo.py +49 -0
  22. inline_core/graph/validate.py +56 -0
  23. inline_core/importer/__init__.py +1 -0
  24. inline_core/importer/comfy.py +162 -0
  25. inline_core/media.py +11 -0
  26. inline_core/models/__init__.py +8 -0
  27. inline_core/models/catalog.py +98 -0
  28. inline_core/models/zimage/__init__.py +11 -0
  29. inline_core/models/zimage/requirements.py +180 -0
  30. inline_core/models/zimage/runner.py +386 -0
  31. inline_core/parallel/__init__.py +13 -0
  32. inline_core/parallel/config.py +50 -0
  33. inline_core/parallel/group.py +136 -0
  34. inline_core/parallel/launch.py +44 -0
  35. inline_core/parallel/protocol.py +53 -0
  36. inline_core/parallel/registry.py +31 -0
  37. inline_core/parallel/worker.py +75 -0
  38. inline_core/runtime/__init__.py +1 -0
  39. inline_core/runtime/context.py +31 -0
  40. inline_core/runtime/file_store.py +51 -0
  41. inline_core/runtime/progress.py +83 -0
  42. inline_core/runtime/run.py +113 -0
  43. inline_core/runtime/store.py +18 -0
  44. inline_core/sampling/__init__.py +1 -0
  45. inline_core/sampling/batch.py +116 -0
  46. inline_core/server/__init__.py +1 -0
  47. inline_core/server/__main__.py +61 -0
  48. inline_core/server/app.py +327 -0
  49. inline_core/server/assets.py +47 -0
  50. inline_core/server/bootstrap.py +21 -0
  51. inline_core/server/frontend.py +37 -0
  52. inline_core/server/manager.py +195 -0
  53. inline_core/server/rpc.py +60 -0
  54. inline_core/server/run_store.py +155 -0
  55. inline_core/server/serialize.py +144 -0
  56. inline_core/studio/__init__.py +7 -0
  57. inline_core/studio/assets.py +194 -0
  58. inline_core/studio/config.py +29 -0
  59. inline_core/studio/fal.py +237 -0
  60. inline_core/studio/frames.py +552 -0
  61. inline_core/studio/generation.py +136 -0
  62. inline_core/studio/graph_build.py +109 -0
  63. inline_core/studio/handlers.py +236 -0
  64. inline_core/studio/models.py +173 -0
  65. inline_core/studio/moodboard.py +400 -0
  66. inline_core/studio/schema.py +278 -0
  67. inline_core/studio/store.py +291 -0
  68. inline_core/studio/timeline/__init__.py +6 -0
  69. inline_core/studio/timeline/compose.py +130 -0
  70. inline_core/studio/timeline/ffmpeg.py +76 -0
  71. inline_core/studio/timeline/render.py +120 -0
  72. inline_core/studio/timeline/resolve.py +189 -0
  73. inline_core/takes.py +31 -0
  74. inline_core-1.1.1.dist-info/METADATA +35 -0
  75. inline_core-1.1.1.dist-info/RECORD +77 -0
  76. inline_core-1.1.1.dist-info/WHEEL +4 -0
  77. inline_core-1.1.1.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,189 @@
1
+ """Resolve a director node's derived timeline from its wired connections — a port of the Studio
2
+ ``electron/main/timeline/resolve.ts``. Video inputs use the ``vin-*`` handles, user audio (L2) the
3
+ ``ain-*`` handles, in slot order. Each input resolves to a file (a frame's output or an asset), is
4
+ probed for duration, and laid out sequentially. Returns a display model + the ``ResolvedClip`` list
5
+ the compose engine renders. Filmstrip/waveform display extras are omitted (best-effort UI niceties).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from pathlib import Path
11
+ from typing import Any
12
+
13
+ from .. import assets as ax
14
+ from .. import frames as fr
15
+ from .. import moodboard as mb
16
+ from .compose import ResolvedClip
17
+ from .ffmpeg import ffmpeg_available, probe_media
18
+
19
+ _STILL_SECONDS = 4.0
20
+ _VIDEO_PREFIX = "vin-"
21
+ _AUDIO_PREFIX = "ain-"
22
+
23
+
24
+ def _slot_index(handle: Any, prefix: str) -> int | None:
25
+ if not isinstance(handle, str) or not handle.startswith(prefix):
26
+ return None
27
+ try:
28
+ return int(handle[len(prefix):])
29
+ except ValueError:
30
+ return None
31
+
32
+
33
+ def _safe_frame_name(conn: Any, frame_id: str) -> str:
34
+ try:
35
+ return fr.get_frame(conn, frame_id)["name"]
36
+ except ValueError:
37
+ return "frame"
38
+
39
+
40
+ def _resolve_source_ref(
41
+ conn: Any,
42
+ from_item: dict[str, Any] | None,
43
+ by_id: dict[str, dict[str, Any]],
44
+ connectors: list[dict[str, Any]],
45
+ depth: int = 0,
46
+ ) -> dict[str, Any] | None:
47
+ """A connector source item -> a media ref, walking frame/preview/trim/asset (trim attaches its
48
+ in/out window). ``depth`` guards trim->trim cycles."""
49
+ if from_item is None or depth > 8:
50
+ return None
51
+ kind = from_item["type"]
52
+ if kind == "frame" and from_item.get("frameId"):
53
+ out = fr.resolve_frame_file(conn, from_item["frameId"])
54
+ if out is None:
55
+ return None
56
+ return {
57
+ "sourceId": from_item["frameId"], "frameId": from_item["frameId"],
58
+ "filePath": out["filePath"], "kind": out["kind"],
59
+ "label": _safe_frame_name(conn, from_item["frameId"]), "trimIn": None, "trimOut": None,
60
+ }
61
+ if kind == "preview":
62
+ feed = next((k for k in connectors if k["toItemId"] == from_item["id"]), None)
63
+ feed_frame = by_id.get(feed["fromItemId"]) if feed else None
64
+ if feed_frame and feed_frame["type"] == "frame" and feed_frame.get("frameId"):
65
+ out = fr.resolve_frame_file(conn, feed_frame["frameId"])
66
+ if out is None:
67
+ return None
68
+ return {
69
+ "sourceId": feed_frame["frameId"], "frameId": feed_frame["frameId"],
70
+ "filePath": out["filePath"], "kind": out["kind"],
71
+ "label": _safe_frame_name(conn, feed_frame["frameId"]),
72
+ "trimIn": None, "trimOut": None,
73
+ }
74
+ return None
75
+ if kind == "trim":
76
+ feed = next((k for k in connectors if k["toItemId"] == from_item["id"]), None)
77
+ upstream = by_id.get(feed["fromItemId"]) if feed else None
78
+ ref = _resolve_source_ref(conn, upstream, by_id, connectors, depth + 1)
79
+ if ref is None:
80
+ return None
81
+ trim = (from_item.get("data") or {}).get("trim")
82
+ return {**ref, "trimIn": trim["inPoint"] if trim else None,
83
+ "trimOut": trim["outPoint"] if trim else None}
84
+ if kind == "asset" and from_item.get("assetId"):
85
+ asset = ax.asset_file(conn, from_item["assetId"])
86
+ if asset is None:
87
+ return None
88
+ return {
89
+ "sourceId": from_item["assetId"], "frameId": None, "filePath": asset["filePath"],
90
+ "kind": asset["kind"], "label": asset["name"], "trimIn": None, "trimOut": None,
91
+ }
92
+ return None
93
+
94
+
95
+ def resolve_timeline(
96
+ conn: Any, folder: Path, owner_item_id: str
97
+ ) -> tuple[dict[str, Any], list[ResolvedClip]]:
98
+ director = mb.get_item(conn, owner_item_id)
99
+ data = director.get("data") or {}
100
+ l1_volume = data.get("l1Volume", 1)
101
+ l2_volume = data.get("l2Volume", 1)
102
+ board = mb.list_board(conn)
103
+ by_id = {i["id"]: i for i in board["items"]}
104
+ incoming = [c for c in board["connectors"] if c["toItemId"] == owner_item_id]
105
+
106
+ def pick(prefix: str) -> list[dict[str, Any]]:
107
+ slotted = [
108
+ (c, _slot_index((c.get("data") or {}).get("targetHandle"), prefix)) for c in incoming
109
+ ]
110
+ return [c for c, slot in sorted(
111
+ (x for x in slotted if x[1] is not None), key=lambda x: x[1]
112
+ )]
113
+
114
+ display: dict[str, Any] = {"video": [], "l2": [], "l1Volume": l1_volume, "l2Volume": l2_volume}
115
+ clips: list[ResolvedClip] = []
116
+
117
+ def layout(conns: list[dict[str, Any]], track: int, volume: float) -> None:
118
+ cursor = 0.0
119
+ for conn_row in conns:
120
+ ref = _resolve_source_ref(
121
+ conn, by_id.get(conn_row["fromItemId"]), by_id, board["connectors"]
122
+ )
123
+ if ref is None:
124
+ continue
125
+ abs_path = folder / ref["filePath"]
126
+ if not abs_path.is_file():
127
+ continue
128
+ if ref["kind"] == "image":
129
+ probe = {"durationSec": _STILL_SECONDS, "hasAudio": False}
130
+ elif ffmpeg_available():
131
+ probe = probe_media(str(abs_path))
132
+ else:
133
+ probe = {"durationSec": _STILL_SECONDS, "hasAudio": ref["kind"] == "audio"}
134
+ full = probe["durationSec"] if probe["durationSec"] > 0 else _STILL_SECONDS
135
+
136
+ in_point, out_point = 0.0, full
137
+ if ref["kind"] != "image" and (ref["trimIn"] is not None or ref["trimOut"] is not None):
138
+ in_point = min(max(ref["trimIn"] or 0, 0), full)
139
+ raw_out = ref["trimOut"] or 0
140
+ out_point = min(raw_out, full) if raw_out > in_point else full
141
+ duration = max(0.04, out_point - in_point)
142
+
143
+ input_volume = (conn_row.get("data") or {}).get("volume", 1)
144
+ if not isinstance(input_volume, (int, float)):
145
+ input_volume = 1
146
+ input_volume = min(1, max(0, input_volume))
147
+ clip = {
148
+ "key": ref["sourceId"], "connectorId": conn_row["id"], "volume": input_volume,
149
+ "frameId": ref["frameId"], "label": ref["label"], "kind": ref["kind"],
150
+ "startTime": cursor, "duration": duration, "audioPeaks": None,
151
+ "peaksStart": 0, "peaksEnd": 1,
152
+ "thumbnail": ref["filePath"] if ref["kind"] == "image" else None,
153
+ }
154
+ (display["video"] if track == 0 else display["l2"]).append(clip)
155
+ clips.append(ResolvedClip(
156
+ kind=ref["kind"], abs_path=str(abs_path), track=track, start_time=cursor,
157
+ in_point=in_point, out_point=out_point, has_audio=bool(probe["hasAudio"]),
158
+ volume=volume * input_volume,
159
+ ))
160
+ cursor += duration
161
+
162
+ layout(pick(_VIDEO_PREFIX), 0, l1_volume)
163
+ layout(pick(_AUDIO_PREFIX), 1, l2_volume)
164
+ return display, clips
165
+
166
+
167
+ def resolve_trim(conn: Any, folder: Path, item_id: str) -> dict[str, Any] | None:
168
+ board = mb.list_board(conn)
169
+ by_id = {i["id"]: i for i in board["items"]}
170
+ feed = next((k for k in board["connectors"] if k["toItemId"] == item_id), None)
171
+ upstream = by_id.get(feed["fromItemId"]) if feed else None
172
+ ref = _resolve_source_ref(conn, upstream, by_id, board["connectors"])
173
+ if ref is None:
174
+ return None
175
+ abs_path = folder / ref["filePath"]
176
+ if not abs_path.is_file():
177
+ return None
178
+ if ref["kind"] == "image":
179
+ duration = _STILL_SECONDS
180
+ elif ffmpeg_available():
181
+ probe = probe_media(str(abs_path))
182
+ duration = probe["durationSec"] if probe["durationSec"] > 0 else 0.0
183
+ else:
184
+ duration = 0.0
185
+ return {
186
+ "key": ref["sourceId"], "kind": ref["kind"], "label": ref["label"],
187
+ "durationSec": duration, "mediaPath": ref["filePath"],
188
+ "thumbnail": ref["filePath"] if ref["kind"] == "image" else None, "audioPeaks": None,
189
+ }
inline_core/takes.py ADDED
@@ -0,0 +1,31 @@
1
+ """Immutable outputs (takes) and input references (asset refs). See docs/contract.md."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ from typing import Any, Literal
7
+
8
+ from .media import MediaKind
9
+
10
+
11
+ @dataclass(frozen=True)
12
+ class AssetRef:
13
+ """Input bytes: a content-addressed upload (`asset`) or a local file Core can read (`path`)."""
14
+
15
+ ref: Literal["asset", "path"]
16
+ id: str | None = None
17
+ path: str | None = None
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class Take:
22
+ """One immutable render produced by a node."""
23
+
24
+ id: str
25
+ run_id: str
26
+ node_id: str
27
+ kind: MediaKind
28
+ uri: str
29
+ hash: str
30
+ params: dict[str, Any] = field(default_factory=dict)
31
+ created_at: int = 0
@@ -0,0 +1,35 @@
1
+ Metadata-Version: 2.4
2
+ Name: inline-core
3
+ Version: 1.1.1
4
+ Summary: The generation engine behind Inline.
5
+ Requires-Python: >=3.11
6
+ Requires-Dist: numpy>=1.26
7
+ Requires-Dist: psutil>=5.9
8
+ Provides-Extra: dev
9
+ Requires-Dist: fastapi>=0.110; extra == 'dev'
10
+ Requires-Dist: httpx>=0.27; extra == 'dev'
11
+ Requires-Dist: imageio-ffmpeg>=0.4; extra == 'dev'
12
+ Requires-Dist: pyright>=1.1; extra == 'dev'
13
+ Requires-Dist: pytest>=8; extra == 'dev'
14
+ Requires-Dist: ruff>=0.6; extra == 'dev'
15
+ Requires-Dist: uvicorn[standard]>=0.29; extra == 'dev'
16
+ Provides-Extra: parallel
17
+ Requires-Dist: accelerate>=0.30; extra == 'parallel'
18
+ Requires-Dist: diffusers>=0.36; extra == 'parallel'
19
+ Requires-Dist: huggingface-hub>=0.23; extra == 'parallel'
20
+ Requires-Dist: nvidia-ml-py>=12; extra == 'parallel'
21
+ Requires-Dist: safetensors>=0.4; extra == 'parallel'
22
+ Requires-Dist: torch>=2.2; extra == 'parallel'
23
+ Requires-Dist: transformers>=4.44; extra == 'parallel'
24
+ Requires-Dist: xfuser>=0.4; extra == 'parallel'
25
+ Provides-Extra: server
26
+ Requires-Dist: fastapi>=0.110; extra == 'server'
27
+ Requires-Dist: imageio-ffmpeg>=0.4; extra == 'server'
28
+ Requires-Dist: uvicorn[standard]>=0.29; extra == 'server'
29
+ Provides-Extra: zimage
30
+ Requires-Dist: accelerate>=0.30; extra == 'zimage'
31
+ Requires-Dist: diffusers>=0.36; extra == 'zimage'
32
+ Requires-Dist: huggingface-hub>=0.23; extra == 'zimage'
33
+ Requires-Dist: safetensors>=0.4; extra == 'zimage'
34
+ Requires-Dist: torch>=2.2; extra == 'zimage'
35
+ Requires-Dist: transformers>=4.44; extra == 'zimage'
@@ -0,0 +1,77 @@
1
+ inline_core/__init__.py,sha256=jR3cTiYWWi9nTCtnpQ6hYHLQK2-l1X7Gr3Eq-XgwHsU,212
2
+ inline_core/config.py,sha256=_X0MG579jnGaeEGHKkrl7VrYIpsj8AdX5BblRo9SepY,1089
3
+ inline_core/errors.py,sha256=nl5Dj7p6KzWaMHf3qVerELCcLZQLg_Tfmg3B8nFqfSA,1143
4
+ inline_core/media.py,sha256=UQc0MsqLLJXZApEaxNo_2CFKtjb8cuFgTuLWRjHeI84,204
5
+ inline_core/takes.py,sha256=g4iy3ZcYZboyjuuXUukBdV6FphUrHPOmtKKe2RghgYc,723
6
+ inline_core/components/__init__.py,sha256=YKs9TmU716LV_7SY96TpLABsErs_s8EtAQaShp9-D6w,89
7
+ inline_core/components/conditioning.py,sha256=YyonAy9nS5DwTI4lb8EjU3anmUKDnPLXqzNDu33DrW0,500
8
+ inline_core/components/interfaces.py,sha256=-iHrg8od23VYUIjOyNC-QeOAoKpJ9IRdq9V1qMBuKr4,2331
9
+ inline_core/device/__init__.py,sha256=vD1zRGSDXPQIikMkf9X5OxOtMs9v5E5kdQYphVznv2s,94
10
+ inline_core/device/auto.py,sha256=Ozo3YKxX4Wfztv8kL5zm_iLzLAqQfbBcIsp5G7-xCsY,1117
11
+ inline_core/device/detect.py,sha256=P__jBeE4rb-kajekih11QP-li0n_j4uUv1ZP2kzus_0,1353
12
+ inline_core/device/memory.py,sha256=Lw-2p14wcNqHJco4zxqvffqVMESS7GnE9hfkxLSarL0,6686
13
+ inline_core/device/policy.py,sha256=g13xaSvyORKdKPckWxDegisTCvoT3gVNImePvSQoVDY,2258
14
+ inline_core/device/types.py,sha256=j6fc_yL4VDS-djheRXAxxkbY475bjYv4kjLc2_IRdi4,620
15
+ inline_core/graph/__init__.py,sha256=Zf0450y4qt0e9uVIwRIORIsC1FPHNIX_rSdkYck7qlU,99
16
+ inline_core/graph/cache.py,sha256=2Ps1ijelcUDrvGlyuGI6CGHMpdQcq74iBbMZtQ4uiHQ,2490
17
+ inline_core/graph/descriptor.py,sha256=MY6i_IBX1LSoTSBawagMZl6511vBwGgdMpWZz731JZ0,2259
18
+ inline_core/graph/executor.py,sha256=aqb522pd5_ldh2Aw5IYNbpp-dczZ3GeuUbKCq-Bxxo0,4371
19
+ inline_core/graph/primitives.py,sha256=7e_42NHatGAx-LkDqhRjUBT58fXi7KavFv4IJoiSDKE,4600
20
+ inline_core/graph/registry.py,sha256=9_hzEY_OvUWOUqi3o1naelfgF7uGWxmFbPXQF572nG8,2478
21
+ inline_core/graph/runners.py,sha256=irvdsYbBuWFnkjbiJPV0eYCXw_iH4Q3j9bwgMc7on3E,2140
22
+ inline_core/graph/schema.py,sha256=bM-gJpjtYF55zb7PFRujHv70UKsUBk6nTEAsoGInxOA,4520
23
+ inline_core/graph/topo.py,sha256=pzWOqfNFlcrg1CVcLzG0tT9jZl6qVdJYUWNbbCpfaMM,1468
24
+ inline_core/graph/validate.py,sha256=0SNXyH8Ph4ldBUzIYu4881PbziOCjDaEbZPNz3vbmQ8,2430
25
+ inline_core/importer/__init__.py,sha256=Y9ADQwwFq8GWeLTWdkUBgntA6vkTXOXVYFNHaXHr8Xw,98
26
+ inline_core/importer/comfy.py,sha256=FcGElrisCfNmeF5l3QSXp6qfkU1Rmb6rn-xVxwoOqAU,6299
27
+ inline_core/models/__init__.py,sha256=UtYYRKzAxZ-C8u-MuAfmwSrBPKyGSrbS2C7mcMSFgjA,389
28
+ inline_core/models/catalog.py,sha256=HJTFjq4ulfV3qOvoWsOEjshB-CHfe_v0neBXogth-C8,3864
29
+ inline_core/models/zimage/__init__.py,sha256=ZifzO8ZMCanplQEJLmUwfBAvr_mJHW3bqApsLPiPXjU,388
30
+ inline_core/models/zimage/requirements.py,sha256=jxQENhqOQRPcCOK5AoHccy4djOEhR-faQeh-xTHUTSQ,7230
31
+ inline_core/models/zimage/runner.py,sha256=UOpiKhxzdhMZYK_E1E1v4snlFEKCR0DS7t02EltTsug,15834
32
+ inline_core/parallel/__init__.py,sha256=nk6pclbayqbQfRMS64ww1_V0IsGNndP3A0GmzwH_iZI,550
33
+ inline_core/parallel/config.py,sha256=Cd73yghskxAJrmR-qo3mB2lsAaqwwumd6BMuo_ScJok,1473
34
+ inline_core/parallel/group.py,sha256=PRFyt9_oGvMHumBnaz6byHuZBggie5vvAKGXOCwnarE,5003
35
+ inline_core/parallel/launch.py,sha256=56jD69CTv8feSoL-bAvMrU5hk6H7lsnQ7eQAH8JVooY,1374
36
+ inline_core/parallel/protocol.py,sha256=hWrQZxF95qvme0BpzvhmXiUxkbWn3mMzV7l3s0bCxDg,1792
37
+ inline_core/parallel/registry.py,sha256=EIS_HHZYQTJb-vM7uw4J_cJ2qHB5HzuWB9nENMf6fKM,1062
38
+ inline_core/parallel/worker.py,sha256=tDCo6I9viLb0FX5TNSI8MvxXkrZyKEnJL-DALkISoa0,2802
39
+ inline_core/runtime/__init__.py,sha256=y8C-sM8VCrTusEpFnFQt8qiSBlYNbB54rBBXgPDfCns,87
40
+ inline_core/runtime/context.py,sha256=K7hBoW9r9JWRZMIfDirSVlJaf7dNwbmMI0Q98YLDsbI,694
41
+ inline_core/runtime/file_store.py,sha256=O1vzct5T7O50Pmyj-kO_QQG_RA15hSyeium4R7560Gk,1542
42
+ inline_core/runtime/progress.py,sha256=FFhDG43Tn9e1BLKPkVo6zP_Oah0FX4k1lpljwYga7dw,1749
43
+ inline_core/runtime/run.py,sha256=pikQokxtvkPlXbtKhtH8jlWxgCkk1lGn0BqpEelkCVc,3300
44
+ inline_core/runtime/store.py,sha256=sSRJ1iq0OaZgZxuez0N6H65PhxNIRTXSXIWWkLPqIx4,593
45
+ inline_core/sampling/__init__.py,sha256=RgupvqfbTTGD7Q6C7ot6OLkB_plgbdA-lQ3mKQnNyog,100
46
+ inline_core/sampling/batch.py,sha256=VT0FxNAchr4RF64SI1dtKMzyc-DbDfxOkKYiJa2G8lw,4043
47
+ inline_core/server/__init__.py,sha256=kGKP7AnFR5P3yRSgdsJbQAZl9dbW6vdm1375c8XwLO0,99
48
+ inline_core/server/__main__.py,sha256=iVqgj9hayCpjm4BLRTqHvakPVh6wFJVeYnAUECUIN-U,2194
49
+ inline_core/server/app.py,sha256=gpEHDpkgMq0VpEezTEVeLcIzbinEobiDB_outY3UiSE,13338
50
+ inline_core/server/assets.py,sha256=BLYGg0IDCDLmipJl9sMFNsRrsmSpWiu2HGyB2PE7CA8,1297
51
+ inline_core/server/bootstrap.py,sha256=OZA24PRcg-nNH_X5jiu-hKoVLQcZG5vaS4Ui33pAkw4,691
52
+ inline_core/server/frontend.py,sha256=_uwnHUyle84y9CgpdRvwfcqj72QAk0Gl_bf1p_DbJxs,1304
53
+ inline_core/server/manager.py,sha256=wieojfPLsmurdM4I2xMtnorJmNa0AlYuYgShsvoIxR0,7164
54
+ inline_core/server/rpc.py,sha256=QawFrg-f8PeronbeArIu64mjRid_eTAzcCaeowaLNGk,2430
55
+ inline_core/server/run_store.py,sha256=Tv23bLR9egGkh34bOvZs6ErCPV55zfHxMcbiwueddvc,6396
56
+ inline_core/server/serialize.py,sha256=B-kJtnm9CnBELClD9mJ3BE4KwyONkBzKsPLTnvcBlzE,4592
57
+ inline_core/studio/__init__.py,sha256=HLpAtZ__YKexuVUxE5V_vZCp-5ziCjR6-BfgBA2-l4c,470
58
+ inline_core/studio/assets.py,sha256=rgpfl-bhQH89PdmYDmbf5ncN-vE8immezZqJ1E1K6lg,6904
59
+ inline_core/studio/config.py,sha256=umgkmSRTbyi55HjAIeE2y9rHiWaFnUvnp599KX7Cs0E,1149
60
+ inline_core/studio/fal.py,sha256=k6fvAJXf7taIfjXa6SP5ve1GjWcAE9CQZoJw4Ec6hRw,10072
61
+ inline_core/studio/frames.py,sha256=JQ5y7rVrSR8F4kC_JJRdTEzUd420j3rE_3GlKpPrii0,19211
62
+ inline_core/studio/generation.py,sha256=wAcxt6WjCLz3GKqN68A0-0AhVnbr6DI9atA4vp_1EDE,5592
63
+ inline_core/studio/graph_build.py,sha256=oUI6W_360ANfeWfKbhBf0QrructSH5XTLq7Pje_QPEY,3984
64
+ inline_core/studio/handlers.py,sha256=OsLR5vRlY-2nvyO_f_ZP-2DMnva5f-j6I-nL9_lRubw,11259
65
+ inline_core/studio/models.py,sha256=xPFeaguQ2uHGJ5LTNih7eBPUXjNlcmxJs-RQjQrvaPk,7675
66
+ inline_core/studio/moodboard.py,sha256=axyecN-osYyMc6PHMa5zPl4BemliJOA5oZPbaGBm4jU,13697
67
+ inline_core/studio/schema.py,sha256=b1Pxh2FqtNIcgTFxKFs17dtYeV0N5qcDItTJaCPQIm8,10461
68
+ inline_core/studio/store.py,sha256=_1BTFxyuX2xM_J3TMsQIAmU4149YtMji_aOwTzFVJ5E,10875
69
+ inline_core/studio/timeline/__init__.py,sha256=Sl40NaBVACX24LFgzVt4eCKMS0Zcp5JHKD3z7aakTWs,357
70
+ inline_core/studio/timeline/compose.py,sha256=e6a1PU9H6YVdcNxciBBqX4EtE4YSCcEWaCzDyZN6Mg4,4654
71
+ inline_core/studio/timeline/ffmpeg.py,sha256=sP6DyZrADU3XvFRDgr_p9PVKY6gC2wYXoaaSkBpIeaU,2610
72
+ inline_core/studio/timeline/render.py,sha256=9VMSInQl9nsABCVH1g_1G6-055xZpn0PF1tpfL0x96I,4820
73
+ inline_core/studio/timeline/resolve.py,sha256=Ul8wyqABx3ahwsnhZTHCHmZz8ZWePii5O6c4IzGm8Kk,8006
74
+ inline_core-1.1.1.dist-info/METADATA,sha256=kWosbWSl_Ok7e--a55-2zOesoc8XkS0uPjAwXdo1Zf0,1477
75
+ inline_core-1.1.1.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
76
+ inline_core-1.1.1.dist-info/entry_points.txt,sha256=NSrAKL7Qu4Foag5hVHpYYCIVEAUkY9cz_NybvpqNZgw,67
77
+ inline_core-1.1.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.31.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ inline-studio = inline_core.server.__main__:main