omdev 0.0.0.dev500__py3-none-any.whl → 0.0.0.dev506__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.

Potentially problematic release.


This version of omdev might be problematic. Click here for more details.

@@ -130,6 +130,8 @@ class NaiveMarkdownLiveStream(MarkdownLiveStream):
130
130
 
131
131
 
132
132
  class IncrementalMarkdownLiveStream(MarkdownLiveStream):
133
+ # @omlish-llm-author "gemini-3-pro"
134
+
133
135
  def __init__(
134
136
  self,
135
137
  *,
@@ -147,40 +149,239 @@ class IncrementalMarkdownLiveStream(MarkdownLiveStream):
147
149
  ip_out = self._inc_parser.feed2(s)
148
150
 
149
151
  if ip_out.new_stable:
150
- # try:
151
- # srs = getattr(self, '_srs')
152
- # except AttributeError:
153
- # setattr(self, '_srs', srs := [])
154
- # from ...markdown.tokens import token_repr, flatten_tokens
155
- # srs.extend(map(token_repr, flatten_tokens(ip_out.new_stable)))
156
-
152
+ # Render the stable lines
157
153
  stable_lines = self._console_render(markdown_from_tokens(ip_out.new_stable))
158
- stable_lines.append(' ') # FIXME: lame hack
159
- self._live.console.print(rich.text.Text.from_ansi('\n'.join(stable_lines), no_wrap=True))
154
+
155
+ # Overlap Detection
156
+ already_printed_count = min(self._lines_printed_to_scrollback, len(stable_lines))
157
+
158
+ if already_printed_count < len(stable_lines):
159
+ new_stable_lines = stable_lines[already_printed_count:]
160
+ # Ensure no_wrap=True is used here to match strict line counting
161
+ self._live.console.print(rich.text.Text.from_ansi('\n'.join(new_stable_lines), no_wrap=True))
162
+
163
+ # Adjust counter
160
164
  self._lines_printed_to_scrollback = max(0, self._lines_printed_to_scrollback - len(stable_lines))
161
165
 
162
166
  unstable_lines = self._console_render(markdown_from_tokens(ip_out.unstable))
163
167
 
164
- # Calculate how many lines fit in the live window
165
168
  available_height = self._console.height - 2
166
-
167
- # Determine which lines overflow and need to be printed to scrollback
168
169
  total_lines = len(unstable_lines)
170
+
169
171
  if total_lines > available_height:
170
- # Lines that should be in scrollback
171
- lines_for_scrollback = total_lines - available_height
172
+ # We calculate lines allowed in scrollback, but we subtract 1. This ensures the very bottom line (often a
173
+ # transient border) stays in the Live window and is not committed to history until more content pushes it
174
+ # up.
175
+ lines_for_scrollback = max(0, total_lines - available_height - 1)
172
176
 
173
- # Print any new lines that weren't already printed
174
177
  if lines_for_scrollback > self._lines_printed_to_scrollback:
175
178
  new_lines_to_print = unstable_lines[self._lines_printed_to_scrollback:lines_for_scrollback]
176
- self._live.console.print(rich.text.Text.from_ansi('\n'.join(new_lines_to_print)))
179
+
180
+ # Ensure no_wrap=True is used here to prevent auto-wrap from creating "phantom" lines that desync our
181
+ # line counts.
182
+ self._live.console.print(rich.text.Text.from_ansi('\n'.join(new_lines_to_print), no_wrap=True))
183
+
177
184
  self._lines_printed_to_scrollback = lines_for_scrollback
178
185
 
179
- # Show only the bottom portion in the live window
180
186
  visible_lines = unstable_lines[-available_height:]
181
187
 
182
188
  else:
183
189
  visible_lines = unstable_lines
184
190
 
185
- # Update the live display
186
191
  self._live.update(rich.text.Text.from_ansi('\n'.join(visible_lines)))
192
+
193
+
194
+ class SteppedIncrementalMarkdownLiveStream(MarkdownLiveStream):
195
+ # @omlish-llm-author "gemini-3-pro"
196
+
197
+ def __init__(
198
+ self,
199
+ *,
200
+ parser: ta.Optional['md.MarkdownIt'] = None,
201
+ console: ta.Optional['rich.console.Console'] = None,
202
+ scroll_step: int | None = None,
203
+ ) -> None:
204
+ super().__init__(
205
+ parser=parser,
206
+ console=console,
207
+ )
208
+
209
+ self._inc_parser = IncrementalMarkdownParser(parser=self._parser)
210
+ self._scroll_step = scroll_step
211
+
212
+ def feed(self, s: str) -> None:
213
+ ip_out = self._inc_parser.feed2(s)
214
+
215
+ ##
216
+ # Handle stable content
217
+
218
+ if ip_out.new_stable:
219
+ stable_lines = self._console_render(markdown_from_tokens(ip_out.new_stable))
220
+
221
+ # Overlap Detection: Determine how many lines of this now-stable block were already pushed to scrollback
222
+ # while they were in the "unstable" phase.
223
+ already_printed_count = min(self._lines_printed_to_scrollback, len(stable_lines))
224
+
225
+ if already_printed_count < len(stable_lines):
226
+ new_stable_lines = stable_lines[already_printed_count:]
227
+ # Force no_wrap=True to ensure 1:1 line counting
228
+ self._live.console.print(rich.text.Text.from_ansi('\n'.join(new_stable_lines), no_wrap=True))
229
+
230
+ # Adjust the global scrollback counter. We effectively shift the "start" of the unstable window down by the
231
+ # size of the stable block.
232
+ self._lines_printed_to_scrollback = max(0, self._lines_printed_to_scrollback - len(stable_lines))
233
+
234
+ ##
235
+ # Handle unstable content
236
+
237
+ unstable_lines = self._console_render(markdown_from_tokens(ip_out.unstable))
238
+ total_lines = len(unstable_lines)
239
+ available_height = self._console.height - 2
240
+
241
+ # Calculate the absolute minimum lines that MUST be in scrollback to fit the current content. We subtract 1 to
242
+ # hold back the bottom-most line (e.g., table borders) from history until it is pushed up by further content.
243
+ min_needed_scrollback = max(0, total_lines - available_height - 1)
244
+
245
+ if min_needed_scrollback > self._lines_printed_to_scrollback:
246
+ # We need to scroll. Calculate how much.
247
+ diff = min_needed_scrollback - self._lines_printed_to_scrollback
248
+
249
+ # Use the step size if configured, otherwise just satisfy the immediate difference. If the difference is
250
+ # larger than the step (e.g., big paste), we jump the full difference.
251
+ step = self._scroll_step if self._scroll_step is not None else 1
252
+ jump_size = max(diff, step)
253
+
254
+ # Calculate the new target scrollback index. We must clamp this to 'total_lines - 1' to ensure we never push
255
+ # the strictly held-back last line into history.
256
+ max_pushable_index = max(0, total_lines - 1)
257
+ target_scrollback = min(self._lines_printed_to_scrollback + jump_size, max_pushable_index)
258
+
259
+ if target_scrollback > self._lines_printed_to_scrollback:
260
+ new_lines_to_print = unstable_lines[self._lines_printed_to_scrollback:target_scrollback]
261
+ self._live.console.print(rich.text.Text.from_ansi('\n'.join(new_lines_to_print), no_wrap=True))
262
+ self._lines_printed_to_scrollback = target_scrollback
263
+
264
+ # Update the live display. We slice from '_lines_printed_to_scrollback' to the end. If we just performed a large
265
+ # 'jump', this will naturally result in fewer lines than 'available_height', creating the desired visual "void"
266
+ # at the bottom.
267
+ visible_lines = unstable_lines[self._lines_printed_to_scrollback:]
268
+ self._live.update(rich.text.Text.from_ansi('\n'.join(visible_lines)))
269
+
270
+
271
+ ##
272
+
273
+
274
+ class ClaudeIncrementalMarkdownLiveStream(MarkdownLiveStream):
275
+ # @omlish-llm-author "claude-opus-4-5"
276
+
277
+ def __init__(
278
+ self,
279
+ *,
280
+ parser: ta.Optional['md.MarkdownIt'] = None,
281
+ console: ta.Optional['rich.console.Console'] = None,
282
+ ) -> None:
283
+ super().__init__(
284
+ parser=parser,
285
+ console=console,
286
+ )
287
+
288
+ from ...markdown.incparse import ClaudeIncrementalMarkdownParser # noqa
289
+ self._inc_parser = ClaudeIncrementalMarkdownParser(parser=self._parser)
290
+ self._last_unstable_line_count = 0
291
+
292
+ def _enter_contexts(self) -> None:
293
+ super()._enter_contexts()
294
+
295
+ # Override to configure Live with explicit vertical overflow handling
296
+ self._live = self._enter_context(rich.live.Live(
297
+ rich.text.Text(''),
298
+ console=self._console,
299
+ refresh_per_second=10,
300
+ vertical_overflow='crop',
301
+ ))
302
+
303
+ def feed(self, s: str) -> None:
304
+ ip_out = self._inc_parser.feed2(s)
305
+
306
+ if ip_out.new_stable:
307
+ # Stop live display to commit stable content cleanly
308
+ self._live.stop()
309
+
310
+ # Render and print stable content to true scrollback
311
+ stable_lines = self._console_render(markdown_from_tokens(ip_out.new_stable))
312
+ for line in stable_lines:
313
+ self._console.print(rich.text.Text.from_ansi(line), highlight=False)
314
+
315
+ # Reset tracking state since we're starting fresh with new unstable content
316
+ self._last_unstable_line_count = 0
317
+ self._lines_printed_to_scrollback = 0
318
+
319
+ # Restart live display
320
+ self._live.start()
321
+
322
+ # Render current unstable content
323
+ unstable_lines = self._console_render(markdown_from_tokens(ip_out.unstable))
324
+ current_line_count = len(unstable_lines)
325
+
326
+ # Calculate available display height
327
+ available_height = self._console.height - 2
328
+
329
+ # Handle content that exceeds available height. Key insight: never commit unstable content to scrollback since
330
+ # it may change.
331
+ if current_line_count > available_height:
332
+ # Only show the bottom portion that fits
333
+ visible_lines = unstable_lines[-available_height:]
334
+ else:
335
+ visible_lines = unstable_lines
336
+
337
+ # Handle shrinking content: if we had more lines before and now have fewer, we need to ensure the live region is
338
+ # properly cleared.
339
+ if current_line_count < self._last_unstable_line_count:
340
+ # Pad with empty lines to prevent artifacts from previous longer content. This ensures the live region fully
341
+ # overwrites its previous state.
342
+ lines_to_clear = min(
343
+ self._last_unstable_line_count - current_line_count,
344
+ available_height - len(visible_lines),
345
+ )
346
+ if lines_to_clear > 0:
347
+ visible_lines = visible_lines + [''] * lines_to_clear
348
+
349
+ self._last_unstable_line_count = current_line_count
350
+
351
+ # Update the live display
352
+ display_text = '\n'.join(visible_lines)
353
+ self._live.update(rich.text.Text.from_ansi(display_text))
354
+
355
+
356
+ class GptIncrementalMarkdownLiveStream(MarkdownLiveStream):
357
+ # @omlish-llm-author "gpt-5.2"
358
+
359
+ def __init__(
360
+ self,
361
+ *,
362
+ parser: ta.Optional['md.MarkdownIt'] = None,
363
+ console: ta.Optional['rich.console.Console'] = None,
364
+ ) -> None:
365
+ super().__init__(
366
+ parser=parser,
367
+ console=console,
368
+ )
369
+
370
+ from ...markdown.incparse import GptIncrementalMarkdownParser # noqa
371
+ self._inc_parser = GptIncrementalMarkdownParser(parser=self._parser)
372
+
373
+ def feed(self, s: str) -> None:
374
+ ip_out = self._inc_parser.feed2(s)
375
+
376
+ # Permanently commit only content the parser marked as stable. This avoids *all* "scrollback delta accounting"
377
+ # and the associated duplication/gap bugs when the rendered tail shrinks / reflows / reinterprets (streaming
378
+ # markdown is non-monotonic).
379
+ if ip_out.new_stable:
380
+ # Print stable renderables directly through Rich (avoid ANSI round-tripping / splitlines). Use end="" so we
381
+ # don't inject extra blank lines beyond what the markdown renderable produces.
382
+ self._live.console.print(markdown_from_tokens(ip_out.new_stable), end='')
383
+
384
+ # Show the remaining (unstable) tail in the live region. We intentionally do *not* try to "spill overflow of
385
+ # unstable to scrollback", since those lines are not provably stable and may retroactively change; printing them
386
+ # would violate correctness.
387
+ self._live.update(markdown_from_tokens(ip_out.unstable))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev500
3
+ Version: 0.0.0.dev506
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,9 +14,9 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev500
17
+ Requires-Dist: omlish==0.0.0.dev506
18
18
  Provides-Extra: all
19
- Requires-Dist: black~=25.12; extra == "all"
19
+ Requires-Dist: black~=26.1; extra == "all"
20
20
  Requires-Dist: pycparser~=2.23; extra == "all"
21
21
  Requires-Dist: pcpp~=1.30; extra == "all"
22
22
  Requires-Dist: docutils~=0.22; extra == "all"
@@ -27,11 +27,11 @@ Requires-Dist: mypy~=1.19; extra == "all"
27
27
  Requires-Dist: gprof2dot~=2025.4; extra == "all"
28
28
  Requires-Dist: segno~=1.6; extra == "all"
29
29
  Requires-Dist: rich~=14.2; extra == "all"
30
- Requires-Dist: textual~=7.0; extra == "all"
30
+ Requires-Dist: textual~=7.3; extra == "all"
31
31
  Requires-Dist: textual-dev~=1.8; extra == "all"
32
32
  Requires-Dist: textual-speedups~=0.2; extra == "all"
33
33
  Provides-Extra: black
34
- Requires-Dist: black~=25.12; extra == "black"
34
+ Requires-Dist: black~=26.1; extra == "black"
35
35
  Provides-Extra: c
36
36
  Requires-Dist: pycparser~=2.23; extra == "c"
37
37
  Requires-Dist: pcpp~=1.30; extra == "c"
@@ -48,7 +48,7 @@ Provides-Extra: qr
48
48
  Requires-Dist: segno~=1.6; extra == "qr"
49
49
  Provides-Extra: tui
50
50
  Requires-Dist: rich~=14.2; extra == "tui"
51
- Requires-Dist: textual~=7.0; extra == "tui"
51
+ Requires-Dist: textual~=7.3; extra == "tui"
52
52
  Requires-Dist: textual-dev~=1.8; extra == "tui"
53
53
  Requires-Dist: textual-speedups~=0.2; extra == "tui"
54
54
  Dynamic: license-file
@@ -1,6 +1,6 @@
1
- omdev/.omlish-manifests.json,sha256=v-w4De6oXGrwxviG20OgLm2GOoUNQFvxGFq2OqTCMf8,11671
1
+ omdev/.omlish-manifests.json,sha256=5Iang5DNd0hsSQQnKms9H4OA_xphlpE1SOWk6NNePOE,11671
2
2
  omdev/README.md,sha256=IxhRiW6wAsK4XKR9lmOlpkTbX8vcNcQwqal8HelK0yU,3326
3
- omdev/__about__.py,sha256=nMssA9q43dzIMvRbHaq2jSy1S6XNbApJ0SE9SBAXNbA,1322
3
+ omdev/__about__.py,sha256=VvUiwWTVeZ3cQDNaFD-3L3juUvkoLH-o7WR4DfXGexE,1321
4
4
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  omdev/cmake.py,sha256=gu49t10_syXh_TUJs4POsxeFs8we8Y3XTOOPgIXmGvg,4608
6
6
  omdev/imgur.py,sha256=oqei705LhSnLWQTOMHMHwRecRXcpSEP90Sg4SVINPQ0,3133
@@ -214,7 +214,7 @@ omdev/manifests/building.py,sha256=M3IHQljk0ca0J32-xNTOcFVvW07s_7fHQ7sGsCJeurU,1
214
214
  omdev/manifests/dumping.py,sha256=WUIZDvOyO25AhnCPn5Nxj2OkMcZa1LRjGuCnpyx8AL8,4506
215
215
  omdev/manifests/main.py,sha256=Gch-ZmvzXyfQRZp_h56RL_hn1T_qG5ZhGCJYp57Hzro,2179
216
216
  omdev/markdown/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
217
- omdev/markdown/incparse.py,sha256=zldzPESdrgaoIjBLL9ZPZY11riXCY_3Ti4YDeLtz24Y,3824
217
+ omdev/markdown/incparse.py,sha256=SUDYAGS0BF2wADlLyIvqL_1tCNF4KOKeqQqzOKxFlCA,17952
218
218
  omdev/markdown/tokens.py,sha256=YwFUhxaun4_BiKYXrrX3CBka4ruqdh8Ogl7G8hGvlLA,1483
219
219
  omdev/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
220
220
  omdev/mypy/debug.py,sha256=VskRcr9trNhyPG2ErZZ7IX_v1DLKTLBOjp34o-fEWaM,3294
@@ -287,26 +287,28 @@ omdev/py/tools/mkrelimp.py,sha256=kQAADYW1f1Y2WbIuqWOFNWJl96oT7nqW38XPCkLIyjQ,40
287
287
  omdev/py/tools/pipdepup.py,sha256=3s3rTlj0KcVriEw_x3wLuoqQnRjdPCydDWW7fhliUl4,20082
288
288
  omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
289
289
  omdev/pyproject/__main__.py,sha256=gn3Rl1aYPYdiTtEqa9ifi0t-e4ZwPY0vhJ4UXvYdJDY,165
290
- omdev/pyproject/cli.py,sha256=qrFlVI_s_viIWE_vmccNNVuQaQP9-cArLJDP2ClqwTM,8753
291
- omdev/pyproject/configs.py,sha256=baNRwHtUW8S8DKCxuKlMbV3Gduujd1PyNURxQ48Nnxk,2813
290
+ omdev/pyproject/cli.py,sha256=erEo9VT7c-Fwtq0lJbb_IkWBPqBAAtiui8Xna93yk3Y,7874
291
+ omdev/pyproject/configs.py,sha256=jrHIRHW5pLU5FI8Yz7TJJfFJ2UQE20fEshwT0qDcCws,2825
292
292
  omdev/pyproject/inject.py,sha256=Von8_8ofkITLoCEwDHNRAwY0AEdFQg7r2ILS8kcTMuY,325
293
293
  omdev/pyproject/pkg.py,sha256=BrC8DQFIQ1ZKFGoNAJ2wdK8PB8N_fpCVaKFKDh82w4s,19460
294
294
  omdev/pyproject/reqs.py,sha256=ZMx-UFQXiSkV0gVpO81zJPa-djvvBrvmY-1kFzxioNk,3369
295
295
  omdev/pyproject/venvs.py,sha256=PNgfVrGlw9NFKJgUyzyWH5H5nAIzUDPTHRVUNBM0bKs,2187
296
+ omdev/pyproject/versions.py,sha256=em85cHKpp9dHL-k4CyjCvM6_ZEJbaQd1sN6RHfbjlPw,1016
296
297
  omdev/pyproject/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
297
298
  omdev/pyproject/resources/docker-dev.sh,sha256=DHkz5D18jok_oDolfg2mqrvGRWFoCe9GQo04dR1czcc,838
298
299
  omdev/pyproject/resources/python.sh,sha256=rFaN4SiJ9hdLDXXsDTwugI6zsw6EPkgYMmtacZeTbvw,749
299
300
  omdev/pyproject/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
300
301
  omdev/pyproject/tools/aboutdeps.py,sha256=XmvSKsn3kdY0K2Llh-jhNskm4sK46Y8fWnUlPXBrI34,1592
302
+ omdev/pyproject/tools/pyversions.py,sha256=CV6qV5nlrt1or7OQVf3bYIKLfyEdjmgedQVVlr-DroM,1047
301
303
  omdev/rs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
302
304
  omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
303
- omdev/scripts/ci.py,sha256=YhYd0S2osBCOvgdZu_BHD8-qS6PBmFnlBgjK81jQaMg,448272
304
- omdev/scripts/interp.py,sha256=CvrxfmIuZ6xsL8PcebgKaqCiVm-WT5Z5I8ByhWIstt4,174830
305
- omdev/scripts/pyproject.py,sha256=oSSX0LXPKN5av_uq9e1Vb9WccqkA0hlWscKtoBRbGRY,371173
305
+ omdev/scripts/ci.py,sha256=nvRAD4zoEhtHuyMcuEjpD0u8VQ464w_cZ268AHRFV6k,448422
306
+ omdev/scripts/interp.py,sha256=FWgA_JAXOZkfOf6-y9GZdrZRl6iAtT6Q5ga3-cAdAEA,174980
307
+ omdev/scripts/pyproject.py,sha256=UHkDHGOlAuBC3BWLD3JWnBKPgvrrTbQ1A28YdQd4KLg,371851
306
308
  omdev/scripts/slowcat.py,sha256=PwdT-pg62imEEb6kcOozl9_YUi-4KopvjvzWT1OmGb0,2717
307
309
  omdev/scripts/tmpexec.py,sha256=t0nErDRALjTk7H0X8ADjZUIDFjlPNzOOokmjCjBHdzs,1431
308
310
  omdev/scripts/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
309
- omdev/scripts/lib/inject.py,sha256=oygdsbyucoy6f4giWw-H-bYSmHvhywX2gaTrOuf5L_I,55188
311
+ omdev/scripts/lib/inject.py,sha256=TSwiXPkLll9wdltttHjaFyrdwBA5goyDKXZDkK_jk-s,55338
310
312
  omdev/scripts/lib/logs.py,sha256=NHUFy2I4--mm1S2XefH0V9w4HDKCqxHtE1gCVT5WP2w,67003
311
313
  omdev/scripts/lib/marshal.py,sha256=m6lZYAebgyiXz-yO9NQ1doo2Ths2dvQJH4Gu79hA7dg,48289
312
314
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
@@ -322,7 +324,7 @@ omdev/tools/prof.py,sha256=-nei6BgAQpaSfVi5cqeRXPc9zIAW-DgMJxnKoD520Zg,3560
322
324
  omdev/tools/qr.py,sha256=1p4tMJmImDa4YTQQNPwQPkM8FnhGRYj6J79BJR-MNHo,1742
323
325
  omdev/tools/shadow.py,sha256=4E2ilxa16liIvQxvgU37ITkOMrP6ufShRQfeW7wwtRc,1697
324
326
  omdev/tools/shell.py,sha256=5hF_8DCtB3XrzJSfmQDsr7X3Fi9KRV4M70q9qp0KREA,2341
325
- omdev/tools/sqlrepl.py,sha256=TcLJlElzfXqYUkfIOwhJHtXiQjXOg4xBTwSoSRDpNkg,5758
327
+ omdev/tools/sqlrepl.py,sha256=b0YzE1Z5Zox97J-aFpolqYCI-sXX2i6rRf-XD6NJHRc,8131
326
328
  omdev/tools/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
327
329
  omdev/tools/git/__main__.py,sha256=gI87SBUgTkKUcUM-RtZWnei-UUDDqzbr5aPztb-gvbE,168
328
330
  omdev/tools/git/cli.py,sha256=P2uzPavBmbklgc_it7XB1d9TrmSo29g-A1MzUePkoOo,17697
@@ -363,7 +365,7 @@ omdev/tui/apps/markdown/__main__.py,sha256=Xy-G2-8Ymx8QMBbRzA4LoiAMZqvtC944mMjFE
363
365
  omdev/tui/apps/markdown/cli.py,sha256=K1vH7f3ZqLv4xTPluhJBEZH8nx8n42_vXIALEV07Q50,469
364
366
  omdev/tui/rich/__init__.py,sha256=2WPxYFGWqwxxLdFBqWpU2nS2DmT7LLFUWXHOrqbqjnQ,1331
365
367
  omdev/tui/rich/console2.py,sha256=BYYLbbD65If9TvfPI6qUcMQKUWJbuWwykEzPplvkf6A,342
366
- omdev/tui/rich/markdown2.py,sha256=fBcjG_34XzUf4WclBL_MxvBj5NUwvLCANhHCx3R0akw,6139
368
+ omdev/tui/rich/markdown2.py,sha256=c6A9a9YAtff4uAZzl3_1JiBVpepT5iGqf8tfSdHY1-c,14899
367
369
  omdev/tui/textual/__init__.py,sha256=U1TSKwGgLU_P--9q9iNylFxkNbOef6ZAcGlU9elPmfo,11722
368
370
  omdev/tui/textual/app2.py,sha256=j_Naee14VqvJo3ujxiafva6ILkhHBYYYet066vM5WdY,294
369
371
  omdev/tui/textual/devtools.py,sha256=iGs4zQo-o2ncspRk4IYyuvYKGC2ZVkYyPy8ugy7wvf4,5137
@@ -378,9 +380,9 @@ omdev/tui/textual/autocomplete/widget.py,sha256=1UgWqDT0d9wD6w7MNaZBjgj0o9FohYXy
378
380
  omdev/tui/textual/debug/__init__.py,sha256=RW9-Toj5_JnXBJCnRiXpXLpRA__MxG01xW1h_iNuUTY,189
379
381
  omdev/tui/textual/debug/dominfo.py,sha256=1iH1xbZY-zUoIyfmdvSzVNjGqeeOnBcjeDI2V1Xn3rg,4401
380
382
  omdev/tui/textual/debug/screen.py,sha256=w4cbRJWemcu5jBomGDmVtgtjiaWOS1Wkw1Mc6mu-5Zc,594
381
- omdev-0.0.0.dev500.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
382
- omdev-0.0.0.dev500.dist-info/METADATA,sha256=fiCGLsJUucH2fOHkoQysgb-UVJe6znlno9c5XmKK2NQ,5374
383
- omdev-0.0.0.dev500.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
384
- omdev-0.0.0.dev500.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
385
- omdev-0.0.0.dev500.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
386
- omdev-0.0.0.dev500.dist-info/RECORD,,
383
+ omdev-0.0.0.dev506.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
384
+ omdev-0.0.0.dev506.dist-info/METADATA,sha256=-JBWJ65uIhhMinlsBPjrg_JJrobPzIkX4v5epiaEjig,5372
385
+ omdev-0.0.0.dev506.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
386
+ omdev-0.0.0.dev506.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
387
+ omdev-0.0.0.dev506.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
388
+ omdev-0.0.0.dev506.dist-info/RECORD,,