par-term-emu-core-rust 0.27.0__tar.gz → 0.29.0__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 (139) hide show
  1. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/CHANGELOG.md +40 -0
  2. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/Cargo.lock +27 -26
  3. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/Cargo.toml +3 -1
  4. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/PKG-INFO +48 -1
  5. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/README.md +47 -0
  6. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/API_REFERENCE.md +31 -3
  7. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/CONFIG_REFERENCE.md +5 -3
  8. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/VT_SEQUENCES.md +1 -1
  9. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/VT_TECHNICAL_REFERENCE.md +2 -2
  10. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/pyproject.toml +1 -1
  11. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/python/par_term_emu_core_rust/__init__.py +1 -1
  12. par_term_emu_core_rust-0.29.0/src/badge.rs +616 -0
  13. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/lib.rs +7 -0
  14. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/pty.rs +151 -0
  15. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/terminal.rs +319 -2
  16. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/types.rs +10 -1
  17. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/shell_integration.rs +76 -0
  18. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/mod.rs +204 -6
  19. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/sequences/osc.rs +485 -28
  20. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/tmux_control.rs +75 -2
  21. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/uv.lock +1 -1
  22. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/.claude/agents/rust-python-terminal-expert.md +0 -0
  23. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/AGENTS.md +0 -0
  24. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/LICENSE +0 -0
  25. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/QUICKSTART.md +0 -0
  26. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/build.rs +0 -0
  27. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/debug/diagnose_corruption.py +0 -0
  28. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/debug/test_debug_features.py +0 -0
  29. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/debug/test_wide_chars.py +0 -0
  30. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/ADVANCED_FEATURES.md +0 -0
  31. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/ARCHITECTURE.md +0 -0
  32. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/BUILDING.md +0 -0
  33. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/CROSS_PLATFORM.md +0 -0
  34. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/DOCUMENTATION_STYLE_GUIDE.md +0 -0
  35. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/FONTS.md +0 -0
  36. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/GRAPHICS_TESTING.md +0 -0
  37. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/MACROS.md +0 -0
  38. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/MATURIN_BEST_PRACTICES.md +0 -0
  39. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/REGIONAL_FLAG_LIMITATION.md +0 -0
  40. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/RUST_USAGE.md +0 -0
  41. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/SECURITY.md +0 -0
  42. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/STREAMING.md +0 -0
  43. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/docs/TESTING_KITTY_ANIMATIONS.md +0 -0
  44. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/future-optimizations.md +0 -0
  45. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/proto/terminal.proto +0 -0
  46. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/pyrightconfig.json +0 -0
  47. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/python/par_term_emu_core_rust/debug.py +0 -0
  48. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/requirements-dev.txt +0 -0
  49. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/ansi_utils.rs +0 -0
  50. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/bin/streaming_server.rs +0 -0
  51. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/cell.rs +0 -0
  52. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/color.rs +0 -0
  53. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/color_utils.rs +0 -0
  54. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/conformance_level.rs +0 -0
  55. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/cursor.rs +0 -0
  56. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/debug.rs +0 -0
  57. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/grapheme.rs +0 -0
  58. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/graphics/animation.rs +0 -0
  59. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/graphics/iterm.rs +0 -0
  60. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/graphics/kitty.rs +0 -0
  61. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/graphics/mod.rs +0 -0
  62. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/graphics/placeholder.rs +0 -0
  63. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/grid.rs +0 -0
  64. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/html_export.rs +0 -0
  65. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/macros.rs +0 -0
  66. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/mouse.rs +0 -0
  67. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/pty_error.rs +0 -0
  68. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/pty_session.rs +0 -0
  69. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/color_utils.rs +0 -0
  70. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/conversions.rs +0 -0
  71. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/enums.rs +0 -0
  72. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/mod.rs +0 -0
  73. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/python_bindings/streaming.rs +0 -0
  74. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/JetBrainsMono-Regular.ttf +0 -0
  75. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/NotoEmoji-Regular.ttf +0 -0
  76. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/config.rs +0 -0
  77. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/error.rs +0 -0
  78. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/font_cache.rs +0 -0
  79. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/formats/bmp.rs +0 -0
  80. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/formats/jpeg.rs +0 -0
  81. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/formats/mod.rs +0 -0
  82. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/formats/png.rs +0 -0
  83. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/formats/svg.rs +0 -0
  84. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/mod.rs +0 -0
  85. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/renderer.rs +0 -0
  86. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/shaper.rs +0 -0
  87. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/screenshot/utils.rs +0 -0
  88. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/sixel.rs +0 -0
  89. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/broadcaster.rs +0 -0
  90. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/client.rs +0 -0
  91. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/error.rs +0 -0
  92. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/mod.rs +0 -0
  93. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/proto.rs +0 -0
  94. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/protocol.rs +0 -0
  95. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/server.rs +0 -0
  96. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/streaming/terminal.pb.rs +0 -0
  97. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/colors.rs +0 -0
  98. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/graphics.rs +0 -0
  99. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/notification.rs +0 -0
  100. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/progress.rs +0 -0
  101. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/sequences/csi.rs +0 -0
  102. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/sequences/dcs.rs +0 -0
  103. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/sequences/esc.rs +0 -0
  104. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/sequences/mod.rs +0 -0
  105. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/terminal/write.rs +0 -0
  106. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/text_utils.rs +0 -0
  107. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/src/unicode_width_config.rs +0 -0
  108. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/theme.css +0 -0
  109. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/__next.__PAGE__.txt +0 -0
  110. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/__next._full.txt +0 -0
  111. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/__next._head.txt +0 -0
  112. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/__next._index.txt +0 -0
  113. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/__next._tree.txt +0 -0
  114. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/0e7e54b03353fc64.js +0 -0
  115. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/2f236954d6a65e12.js +0 -0
  116. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/6a145f7d64f5cf03.js +0 -0
  117. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/6bd3cb3b56d06ca6.js +0 -0
  118. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/808d100a753cdcf2.js +0 -0
  119. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/a27b4f205d48ece2.css +0 -0
  120. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  121. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/a6dad97d9634a72d.js.map +0 -0
  122. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/e1140cc73d7c6ca2.js +0 -0
  123. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/ed8d72bcbb9aa3b2.js +0 -0
  124. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/chunks/turbopack-b9888d6049f35c64.js +0 -0
  125. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/qD3YDPAUHYDX2LyueNPUO/_buildManifest.js +0 -0
  126. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/qD3YDPAUHYDX2LyueNPUO/_clientMiddlewareManifest.json +0 -0
  127. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_next/static/qD3YDPAUHYDX2LyueNPUO/_ssgManifest.js +0 -0
  128. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_not-found/__next._full.txt +0 -0
  129. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_not-found/__next._head.txt +0 -0
  130. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_not-found/__next._index.txt +0 -0
  131. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_not-found/__next._not-found.__PAGE__.txt +0 -0
  132. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_not-found/__next._not-found.txt +0 -0
  133. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_not-found/__next._tree.txt +0 -0
  134. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/_not-found.txt +0 -0
  135. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/favicon.ico +0 -0
  136. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/index.txt +0 -0
  137. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/manifest.json +0 -0
  138. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/web_term/theme.css +0 -0
  139. {par_term_emu_core_rust-0.27.0 → par_term_emu_core_rust-0.29.0}/xterm-issue-draft.md +0 -0
@@ -5,6 +5,43 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.29.0] - 2026-02-04
9
+
10
+ ### Added
11
+ - **OSC 7 Enhancements**: Percent-decoding, username/hostname parsing, port stripping, query/fragment removal, and path validation for `file://` URLs
12
+ - **Session Variable Sync**: OSC 7 now updates badge/session variables (`path`, `hostname`, `username`) so badge formats immediately reflect directory changes
13
+ - **CWD History Context**: CWD change log now records hostname and username; Python `CwdChange` exposes these fields
14
+ - **CWD Change Events**: New `TerminalEvent::CwdChanged` (and Python `cwd_changed` poll_events entry) fires on OSC 7 or manual `record_cwd_change`
15
+ - **Username Handling**: Shell integration stores optional username from `user@host` OSC 7 payloads
16
+
17
+ ### Changed
18
+ - **API**: `record_cwd_change` now accepts optional `hostname` and `username` (defaults preserved); badge/session variables cleared when hostname/username unset
19
+ - **Dependencies**: Added `percent-encoding` and `url` crates for robust OSC 7 parsing
20
+
21
+ ### Fixed
22
+ - **Badge Accuracy**: Badge variables `\(path)` and `\(hostname)` now stay in sync when updated via OSC 7
23
+ - **UTF-8 Paths**: Paths with spaces or Unicode characters from OSC 7 are correctly percent-decoded
24
+
25
+ ## [0.28.0] - 2026-02-03
26
+
27
+ ### Added
28
+ - **Badge Format Support (OSC 1337 SetBadgeFormat)**: iTerm2-style badge support for terminal overlays
29
+ - New `badge` module with `SessionVariables` struct for session information
30
+ - OSC 1337 SetBadgeFormat sequence parsing with base64-encoded format strings
31
+ - Variable interpolation using `\(variable)` syntax (e.g., `\(username)@\(hostname)`)
32
+ - Supports session prefix: `\(session.variable)` and direct: `\(variable)`
33
+ - Built-in variables: `hostname`, `username`, `path`, `job`, `last_command`, `profile_name`, `tty`, `columns`, `rows`, `bell_count`, `selection`, `tmux_pane_title`, `session_name`, `title`
34
+ - Custom variables via `set_custom(name, value)`
35
+ - Security validation rejects shell injection patterns (`$()`, backticks, pipes, etc.)
36
+ - Python bindings: `badge_format()`, `set_badge_format()`, `clear_badge_format()`, `evaluate_badge()`, `get_badge_session_variable()`, `set_badge_session_variable()`, `get_badge_session_variables()`
37
+ - Session variables auto-sync with terminal state (title, dimensions, bell count)
38
+ - Reference: [iTerm2 Badge Documentation](https://iterm2.com/documentation-badges.html)
39
+
40
+ ### Fixed
41
+ - **Tmux Control Mode CRLF Handling**: Fixed parser to strip `\r` from `\r\n` line endings sent by tmux
42
+ - **Tmux Output Trailing Spaces**: Fixed `%output` notifications to preserve trailing spaces (regression from `.trim()` call)
43
+ - **OSC 133 Exit Code Parsing**: Fixed exit code extraction from `OSC 133 ; D ; <exit_code> ST` sequences
44
+
8
45
  ## [0.27.0] - 2026-02-01
9
46
 
10
47
  ### Added
@@ -782,6 +819,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
782
819
  - **Unicode Support**: Full Unicode including emoji and wide characters
783
820
  - **Python Integration**: PyO3 bindings for Python 3.12+
784
821
 
822
+ [0.28.0]: https://github.com/paulrobello/par-term-emu-core-rust/compare/v0.27.0...v0.28.0
823
+ [0.27.0]: https://github.com/paulrobello/par-term-emu-core-rust/compare/v0.26.0...v0.27.0
824
+ [0.26.0]: https://github.com/paulrobello/par-term-emu-core-rust/compare/v0.25.0...v0.26.0
785
825
  [0.25.0]: https://github.com/paulrobello/par-term-emu-core-rust/compare/v0.24.0...v0.25.0
786
826
  [0.24.0]: https://github.com/paulrobello/par-term-emu-core-rust/compare/v0.23.0...v0.24.0
787
827
  [0.23.0]: https://github.com/paulrobello/par-term-emu-core-rust/compare/v0.22.1...v0.23.0
@@ -99,9 +99,9 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
99
99
 
100
100
  [[package]]
101
101
  name = "arc-swap"
102
- version = "1.8.0"
102
+ version = "1.8.1"
103
103
  source = "registry+https://github.com/rust-lang/crates.io-index"
104
- checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e"
104
+ checksum = "9ded5f9a03ac8f24d1b8a25101ee812cd32cdc8c50a4c50237de2c4915850e73"
105
105
  dependencies = [
106
106
  "rustversion",
107
107
  ]
@@ -437,9 +437,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
437
437
 
438
438
  [[package]]
439
439
  name = "bytes"
440
- version = "1.11.0"
440
+ version = "1.11.1"
441
441
  source = "registry+https://github.com/rust-lang/crates.io-index"
442
- checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
442
+ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
443
443
 
444
444
  [[package]]
445
445
  name = "cc"
@@ -498,9 +498,9 @@ dependencies = [
498
498
 
499
499
  [[package]]
500
500
  name = "clap"
501
- version = "4.5.56"
501
+ version = "4.5.57"
502
502
  source = "registry+https://github.com/rust-lang/crates.io-index"
503
- checksum = "a75ca66430e33a14957acc24c5077b503e7d374151b2b4b3a10c83b4ceb4be0e"
503
+ checksum = "6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31a"
504
504
  dependencies = [
505
505
  "clap_builder",
506
506
  "clap_derive",
@@ -508,9 +508,9 @@ dependencies = [
508
508
 
509
509
  [[package]]
510
510
  name = "clap_builder"
511
- version = "4.5.56"
511
+ version = "4.5.57"
512
512
  source = "registry+https://github.com/rust-lang/crates.io-index"
513
- checksum = "793207c7fa6300a0608d1080b858e5fdbe713cdc1c8db9fb17777d8a13e63df0"
513
+ checksum = "7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238"
514
514
  dependencies = [
515
515
  "anstream",
516
516
  "anstyle",
@@ -837,9 +837,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
837
837
 
838
838
  [[package]]
839
839
  name = "flate2"
840
- version = "1.1.8"
840
+ version = "1.1.9"
841
841
  source = "registry+https://github.com/rust-lang/crates.io-index"
842
- checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369"
842
+ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
843
843
  dependencies = [
844
844
  "crc32fast",
845
845
  "miniz_oxide",
@@ -1192,14 +1192,13 @@ dependencies = [
1192
1192
 
1193
1193
  [[package]]
1194
1194
  name = "hyper-util"
1195
- version = "0.1.19"
1195
+ version = "0.1.20"
1196
1196
  source = "registry+https://github.com/rust-lang/crates.io-index"
1197
- checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f"
1197
+ checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
1198
1198
  dependencies = [
1199
1199
  "base64 0.22.1",
1200
1200
  "bytes",
1201
1201
  "futures-channel",
1202
- "futures-core",
1203
1202
  "futures-util",
1204
1203
  "http",
1205
1204
  "http-body",
@@ -1768,7 +1767,7 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
1768
1767
 
1769
1768
  [[package]]
1770
1769
  name = "par-term-emu-core-rust"
1771
- version = "0.27.0"
1770
+ version = "0.29.0"
1772
1771
  dependencies = [
1773
1772
  "anyhow",
1774
1773
  "axum",
@@ -1783,6 +1782,7 @@ dependencies = [
1783
1782
  "image",
1784
1783
  "libc",
1785
1784
  "parking_lot",
1785
+ "percent-encoding",
1786
1786
  "portable-pty",
1787
1787
  "proptest",
1788
1788
  "prost",
@@ -1807,6 +1807,7 @@ dependencies = [
1807
1807
  "tracing-subscriber",
1808
1808
  "unicode-segmentation",
1809
1809
  "unicode-width",
1810
+ "url",
1810
1811
  "uuid",
1811
1812
  "vte",
1812
1813
  ]
@@ -2433,9 +2434,9 @@ dependencies = [
2433
2434
 
2434
2435
  [[package]]
2435
2436
  name = "regex"
2436
- version = "1.12.2"
2437
+ version = "1.12.3"
2437
2438
  source = "registry+https://github.com/rust-lang/crates.io-index"
2438
- checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
2439
+ checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
2439
2440
  dependencies = [
2440
2441
  "aho-corasick",
2441
2442
  "memchr",
@@ -2445,9 +2446,9 @@ dependencies = [
2445
2446
 
2446
2447
  [[package]]
2447
2448
  name = "regex-automata"
2448
- version = "0.4.13"
2449
+ version = "0.4.14"
2449
2450
  source = "registry+https://github.com/rust-lang/crates.io-index"
2450
- checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
2451
+ checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
2451
2452
  dependencies = [
2452
2453
  "aho-corasick",
2453
2454
  "memchr",
@@ -2456,9 +2457,9 @@ dependencies = [
2456
2457
 
2457
2458
  [[package]]
2458
2459
  name = "regex-syntax"
2459
- version = "0.8.8"
2460
+ version = "0.8.9"
2460
2461
  source = "registry+https://github.com/rust-lang/crates.io-index"
2461
- checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
2462
+ checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c"
2462
2463
 
2463
2464
  [[package]]
2464
2465
  name = "reqwest"
@@ -3594,9 +3595,9 @@ dependencies = [
3594
3595
 
3595
3596
  [[package]]
3596
3597
  name = "webpki-root-certs"
3597
- version = "1.0.5"
3598
+ version = "1.0.6"
3598
3599
  source = "registry+https://github.com/rust-lang/crates.io-index"
3599
- checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc"
3600
+ checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca"
3600
3601
  dependencies = [
3601
3602
  "rustls-pki-types",
3602
3603
  ]
@@ -3940,18 +3941,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524"
3940
3941
 
3941
3942
  [[package]]
3942
3943
  name = "zerocopy"
3943
- version = "0.8.37"
3944
+ version = "0.8.38"
3944
3945
  source = "registry+https://github.com/rust-lang/crates.io-index"
3945
- checksum = "7456cf00f0685ad319c5b1693f291a650eaf345e941d082fc4e03df8a03996ac"
3946
+ checksum = "57cf3aa6855b23711ee9852dfc97dfaa51c45feaba5b645d0c777414d494a961"
3946
3947
  dependencies = [
3947
3948
  "zerocopy-derive",
3948
3949
  ]
3949
3950
 
3950
3951
  [[package]]
3951
3952
  name = "zerocopy-derive"
3952
- version = "0.8.37"
3953
+ version = "0.8.38"
3953
3954
  source = "registry+https://github.com/rust-lang/crates.io-index"
3954
- checksum = "1328722bbf2115db7e19d69ebcc15e795719e2d66b60827c6a69a117365e37a0"
3955
+ checksum = "8a616990af1a287837c4fe6596ad77ef57948f787e46ce28e166facc0cc1cb75"
3955
3956
  dependencies = [
3956
3957
  "proc-macro2",
3957
3958
  "quote",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "par-term-emu-core-rust"
3
- version = "0.27.0"
3
+ version = "0.29.0"
4
4
  edition = "2021"
5
5
  rust-version = "1.75"
6
6
  authors = ["Paul Robello <probello@gmail.com>"]
@@ -57,6 +57,8 @@ regex = "1.12.2"
57
57
  serde = { version = "1.0.228", features = ["derive"] }
58
58
  serde_json = "1.0.149"
59
59
  serde_yaml = "0.9.34"
60
+ percent-encoding = "2.3.2"
61
+ url = "2.5.8"
60
62
 
61
63
  # Streaming server dependencies
62
64
  tokio = { version = "1.49", features = ["full"], optional = true }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: par-term-emu-core-rust
3
- Version: 0.27.0
3
+ Version: 0.29.0
4
4
  Classifier: License :: OSI Approved :: MIT License
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Development Status :: 4 - Beta
@@ -50,6 +50,53 @@ A comprehensive terminal emulator library written in Rust with Python bindings f
50
50
 
51
51
  [!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/probello3)
52
52
 
53
+ ## What's New in 0.28.0
54
+
55
+ ### 🏷️ Badge Format Support (OSC 1337 SetBadgeFormat)
56
+
57
+ iTerm2-style badge support for terminal overlays with variable interpolation:
58
+
59
+ ```python
60
+ from par_term_emu_core_rust import Terminal
61
+
62
+ term = Terminal(80, 24)
63
+
64
+ # Set badge format with variables
65
+ term.set_badge_format(r"\(username)@\(hostname)")
66
+
67
+ # Set session variables
68
+ term.set_badge_session_variable("username", "alice")
69
+ term.set_badge_session_variable("hostname", "server1")
70
+
71
+ # Evaluate badge - returns "alice@server1"
72
+ badge = term.evaluate_badge()
73
+ print(f"Badge: {badge}")
74
+
75
+ # Get all session variables
76
+ vars = term.get_badge_session_variables()
77
+ print(f"Columns: {vars['columns']}, Rows: {vars['rows']}")
78
+ ```
79
+
80
+ **New Methods:**
81
+ - `badge_format()` - Get current badge format template
82
+ - `set_badge_format(format)` - Set badge format with `\(variable)` placeholders
83
+ - `clear_badge_format()` - Clear badge format
84
+ - `evaluate_badge()` - Evaluate badge with session variables
85
+ - `get_badge_session_variable(name)` - Get a session variable value
86
+ - `set_badge_session_variable(name, value)` - Set a custom session variable
87
+ - `get_badge_session_variables()` - Get all session variables as a dictionary
88
+
89
+ **Built-in Variables:**
90
+ `hostname`, `username`, `path`, `job`, `last_command`, `profile_name`, `tty`, `columns`, `rows`, `bell_count`, `selection`, `tmux_pane_title`, `session_name`, `title`
91
+
92
+ **Security:** Badge formats are validated to reject shell injection patterns (backticks, `$()`, pipes, etc.)
93
+
94
+ ### 🔧 Tmux Control Mode Fixes
95
+
96
+ - Fixed CRLF line ending handling (strips `\r` from `\r\n` line endings)
97
+ - Fixed `%output` notifications to preserve trailing spaces
98
+ - Fixed OSC 133 exit code parsing from `OSC 133 ; D ; <exit_code> ST`
99
+
53
100
  ## What's New in 0.27.0
54
101
 
55
102
  ### 🔄 Tmux Control Mode Auto-Detection
@@ -13,6 +13,53 @@ A comprehensive terminal emulator library written in Rust with Python bindings f
13
13
 
14
14
  [!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/probello3)
15
15
 
16
+ ## What's New in 0.28.0
17
+
18
+ ### 🏷️ Badge Format Support (OSC 1337 SetBadgeFormat)
19
+
20
+ iTerm2-style badge support for terminal overlays with variable interpolation:
21
+
22
+ ```python
23
+ from par_term_emu_core_rust import Terminal
24
+
25
+ term = Terminal(80, 24)
26
+
27
+ # Set badge format with variables
28
+ term.set_badge_format(r"\(username)@\(hostname)")
29
+
30
+ # Set session variables
31
+ term.set_badge_session_variable("username", "alice")
32
+ term.set_badge_session_variable("hostname", "server1")
33
+
34
+ # Evaluate badge - returns "alice@server1"
35
+ badge = term.evaluate_badge()
36
+ print(f"Badge: {badge}")
37
+
38
+ # Get all session variables
39
+ vars = term.get_badge_session_variables()
40
+ print(f"Columns: {vars['columns']}, Rows: {vars['rows']}")
41
+ ```
42
+
43
+ **New Methods:**
44
+ - `badge_format()` - Get current badge format template
45
+ - `set_badge_format(format)` - Set badge format with `\(variable)` placeholders
46
+ - `clear_badge_format()` - Clear badge format
47
+ - `evaluate_badge()` - Evaluate badge with session variables
48
+ - `get_badge_session_variable(name)` - Get a session variable value
49
+ - `set_badge_session_variable(name, value)` - Set a custom session variable
50
+ - `get_badge_session_variables()` - Get all session variables as a dictionary
51
+
52
+ **Built-in Variables:**
53
+ `hostname`, `username`, `path`, `job`, `last_command`, `profile_name`, `tty`, `columns`, `rows`, `bell_count`, `selection`, `tmux_pane_title`, `session_name`, `title`
54
+
55
+ **Security:** Badge formats are validated to reject shell injection patterns (backticks, `$()`, pipes, etc.)
56
+
57
+ ### 🔧 Tmux Control Mode Fixes
58
+
59
+ - Fixed CRLF line ending handling (strips `\r` from `\r\n` line endings)
60
+ - Fixed `%output` notifications to preserve trailing spaces
61
+ - Fixed OSC 133 exit code parsing from `OSC 133 ; D ; <exit_code> ST`
62
+
16
63
  ## What's New in 0.27.0
17
64
 
18
65
  ### 🔄 Tmux Control Mode Auto-Detection
@@ -140,6 +140,25 @@ Create a new terminal with specified dimensions.
140
140
  - `reset()`: Reset terminal to default state
141
141
  - `title() -> str`: Get terminal title
142
142
 
143
+ #### Badge Format (OSC 1337 SetBadgeFormat)
144
+ - `badge_format() -> str | None`: Get current badge format template
145
+ - `set_badge_format(format: str | None)`: Set badge format template with `\(variable)` placeholders
146
+ - `clear_badge_format()`: Clear badge format
147
+ - `evaluate_badge() -> str | None`: Evaluate badge format with session variables
148
+ - `get_badge_session_variable(name: str) -> str | None`: Get a session variable by name
149
+ - `set_badge_session_variable(name: str, value: str)`: Set a custom session variable
150
+ - `get_badge_session_variables() -> dict[str, str]`: Get all session variables
151
+
152
+ **Built-in Variables:** `hostname`, `username`, `path`, `job`, `last_command`, `profile_name`, `tty`, `columns`, `rows`, `bell_count`, `selection`, `tmux_pane_title`, `session_name`, `title`
153
+
154
+ **Example:**
155
+ ```python
156
+ term.set_badge_format(r"\(username)@\(hostname)")
157
+ term.set_badge_session_variable("username", "alice")
158
+ term.set_badge_session_variable("hostname", "server1")
159
+ badge = term.evaluate_badge() # "alice@server1"
160
+ ```
161
+
143
162
  #### Cursor Control
144
163
  - `cursor_position() -> tuple[int, int]`: Get cursor position (col, row)
145
164
  - `cursor_visible() -> bool`: Check if cursor is visible
@@ -262,6 +281,7 @@ Create a new terminal with specified dimensions.
262
281
  - `accept_osc7() -> bool`: Check if OSC 7 (CWD) is accepted
263
282
  - `set_accept_osc7(accept: bool)`: Set whether to accept OSC 7 sequences
264
283
  - `shell_integration_state() -> ShellIntegration`: Get shell integration state
284
+ - `record_cwd_change(new_cwd: str, hostname: str | None = None, username: str | None = None)`: Manually record a CWD change (updates history + session variables)
265
285
  - `disable_insecure_sequences() -> bool`: Check if insecure sequences are disabled
266
286
  - `set_disable_insecure_sequences(disable: bool)`: Disable insecure/dangerous sequences
267
287
  - `answerback_string() -> str | None`: Get the configured ENQ answerback payload (None if disabled)
@@ -390,10 +410,11 @@ Extended shell integration features beyond basic OSC 133:
390
410
  - `end_command_execution(exit_code: int)`: Mark end of command with exit code
391
411
  - `get_current_command() -> CommandExecution | None`: Get currently executing command
392
412
  - `get_shell_integration_stats() -> ShellIntegrationStats`: Get shell integration statistics
393
- - `get_cwd_changes() -> list[CwdChange]`: Get working directory change history
413
+ - `get_cwd_changes() -> list[CwdChange]`: Get working directory change history (includes hostname/username)
394
414
  - `clear_cwd_history()`: Clear CWD history
395
415
  - `set_max_cwd_history(max: int)`: Set CWD history limit
396
- - `record_cwd_change(cwd: str)`: Record working directory change
416
+ - `record_cwd_change(cwd: str, hostname: str | None = None, username: str | None = None)`: Record working directory change
417
+ - `poll_events()`: Now also returns `cwd_changed` events with `old_cwd`, `new_cwd`, `hostname`, `username`, `timestamp`
397
418
 
398
419
  ### Clipboard Extended
399
420
 
@@ -510,6 +531,10 @@ VT compliance testing:
510
531
  - `use_alt_screen()`: Switch to alternate screen buffer (programmatic, not via escape codes)
511
532
  - `use_primary_screen()`: Switch to primary screen buffer (programmatic)
512
533
  - `poll_events() -> list[str]`: Poll for pending terminal events
534
+ - `set_event_subscription(kinds: list[str] | None)`: Filter which terminal events are returned by `poll_subscribed_events()` (None clears filter)
535
+ - `clear_event_subscription()`: Clear event filter (all events are returned)
536
+ - `poll_subscribed_events() -> list[dict]`: Drain events that match subscription filter
537
+ - `poll_cwd_events() -> list[dict]`: Drain only CWD change events (fields: new_cwd, old_cwd?, hostname?, username?, timestamp)
513
538
  - `update_animations()`: Update animation frames (for blinking cursor, text, etc.)
514
539
  - `debug_info() -> str`: Get debug information string
515
540
  - `detect_urls(text: str) -> list[DetectedItem]`: Detect URLs in text
@@ -878,7 +903,10 @@ Working directory change event.
878
903
 
879
904
  **Properties:**
880
905
  - `cwd: str`: New working directory path
881
- - `timestamp: int`: Change timestamp (Unix timestamp in seconds)
906
+ - `old_cwd: str | None`: Previous working directory (if any)
907
+ - `hostname: str | None`: Hostname associated with the new path (None for localhost)
908
+ - `username: str | None`: Username from `user@host` portion of OSC 7 (if provided)
909
+ - `timestamp: int`: Change timestamp (Unix timestamp in milliseconds)
882
910
 
883
911
  ### DamageRegion
884
912
 
@@ -256,9 +256,11 @@ These settings control potentially sensitive or insecure terminal features at th
256
256
  - Use in untrusted/sandboxed environments
257
257
 
258
258
  **OSC 7 Directory Tracking:**
259
- - Generally safe to keep enabled
260
- - Used for shell integration and smart directory tracking
261
- - Disable if you don't need this feature
259
+ - Parses `file://[user@]host[:port]/path` URLs from shells (e.g., PROMPT_COMMAND)
260
+ - Percent-decodes paths/usernames and strips query/fragment
261
+ - Updates shell integration + badge/session variables (`\(path)`, `\(hostname)`, `\(username)`)
262
+ - Records CWD history with timestamps and host/user context
263
+ - Generally safe to keep enabled; disable if you don't need this feature
262
264
 
263
265
  ---
264
266
 
@@ -296,7 +296,7 @@ Operating System Command sequences for advanced features (format: `OSC Ps ; Pt S
296
296
  - `OSC 2;title ST` - Set window title only
297
297
  - `OSC 21;title ST` - Push title to stack (or `OSC 21 ST` to push current title)
298
298
  - `OSC 22 ST` / `OSC 23 ST` - Pop window/icon title from stack
299
- - `OSC 7;file://host/path ST` - Set current working directory (URL-encoded)
299
+ - `OSC 7;file://[user@]host[:port]/path ST` - Set current working directory (percent-decoded; strips query/fragment; `localhost` is treated as None)
300
300
 
301
301
  ### Hyperlinks and Clipboard
302
302
 
@@ -741,7 +741,7 @@ where `ST` is either `ESC \` or `BEL` (`\x07`)
741
741
 
742
742
  | Sequence | Operation | Notes |
743
743
  |----------|-----------|-------|
744
- | `OSC 7 ; file://host/cwd ST` | Set working directory | Can be disabled via `accept_osc7` |
744
+ | `OSC 7 ; file://[user@]host[:port]/cwd ST` | Set working directory | Percent-decodes path/username, strips query/fragment, ignores `localhost`, records hostname & username in session variables, can be disabled via `accept_osc7` |
745
745
 
746
746
  **Format:** `file://hostname/path` (URL-encoded path)
747
747
 
@@ -1338,7 +1338,7 @@ The terminal provides comprehensive support for complex Unicode grapheme cluster
1338
1338
  | OSC 8 Hyperlinks | ✅ Full | `src/terminal/sequences/osc.rs` | With deduplication |
1339
1339
  | OSC 52 Clipboard | ✅ Full | `src/terminal/sequences/osc.rs` | Read/write with security controls |
1340
1340
  | OSC 133 Shell Integration | ✅ Full | `src/terminal/sequences/osc.rs` | Prompt/command/output markers |
1341
- | OSC 7 Directory Tracking | ✅ Full | `src/terminal/sequences/osc.rs` | URL-encoded paths |
1341
+ | OSC 7 Directory Tracking | ✅ Full | `src/terminal/sequences/osc.rs` | Percent-decoded paths, username, hostname, session variable sync, CWD history |
1342
1342
  | OSC 9;4 Progress Bar | ✅ Full | `src/terminal/sequences/osc.rs`, `src/terminal/progress.rs` | ConEmu/Windows Terminal style progress |
1343
1343
  | Underline styles | ✅ Full | `src/terminal/sequences/csi.rs` | 6 different styles |
1344
1344
 
@@ -6,7 +6,7 @@ build-backend = "maturin"
6
6
 
7
7
  [project]
8
8
  name = "par-term-emu-core-rust"
9
- version = "0.27.0"
9
+ version = "0.29.0"
10
10
  description = "A comprehensive terminal emulator library in Rust with Python bindings - supports true color, alt screen, mouse reporting, bracketed paste, and full Unicode"
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.12"
@@ -84,7 +84,7 @@ except ImportError:
84
84
  encode_client_message = None
85
85
  decode_client_message = None
86
86
 
87
- __version__ = "0.27.0"
87
+ __version__ = "0.29.0"
88
88
  __all__ = [
89
89
  "AmbiguousWidth",
90
90
  "Attributes",