Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
a5225c6
feat: add `hs stream` command for live WebSocket entity streaming (Ph…
vimmotions Mar 23, 2026
7c3256d
feat: add filtering, --first, --select, --ops, --no-dna, --count to h…
vimmotions Mar 23, 2026
6c11402
feat: add --save/--load snapshot recording and replay to hs stream (P…
vimmotions Mar 23, 2026
af897c3
feat: add EntityStore with history, --history, --at, --diff flags (Ph…
vimmotions Mar 23, 2026
de9a7ea
feat: add interactive TUI mode for hs stream (Phase 5)
vimmotions Mar 23, 2026
22329e9
fix: properly handle subscribed frames on binary WebSocket channel
vimmotions Mar 23, 2026
b82bcb0
fix: route all keypresses to filter input when filter mode is active
vimmotions Mar 23, 2026
c4f1d0a
feat: TUI filter searches across all entity data values, not just keys
vimmotions Mar 23, 2026
c1737b7
fix: clamp selected index to filtered list when filter text changes
vimmotions Mar 23, 2026
bcf73d7
fix: auto-scroll entity list to keep selected item visible
vimmotions Mar 23, 2026
85558b3
feat: add vim motion commands to TUI
vimmotions Mar 23, 2026
0aa7f05
fix: persist ListState so scrolling works in both directions
vimmotions Mar 23, 2026
7852659
fix: disambiguate list position from entity version in timeline bar
vimmotions Mar 23, 2026
fa78016
fix: remove duplicate entity count from header
vimmotions Mar 23, 2026
9dfdbca
chore: Remove plan
vimmotions Mar 23, 2026
c86869e
fix: move --duration deadline into tokio::select! arm for precise timing
vimmotions Mar 23, 2026
1e775ba
fix: use full dot-path as key in --select to prevent data loss on col…
vimmotions Mar 23, 2026
dee8fdc
fix: make TUI raw-frame toggle (r) actually render raw frames
vimmotions Mar 23, 2026
b870c88
fix: add panic hook to restore terminal on TUI crash
vimmotions Mar 23, 2026
7796054
perf: use HashSet for O(1) entity key deduplication in TUI
vimmotions Mar 23, 2026
ed7a071
fix: resolve clippy warnings in filter module
vimmotions Mar 23, 2026
dbb03db
fix: emit snapshot_complete NO_DNA event for binary WebSocket frames
vimmotions Mar 23, 2026
7d654c5
fix: prevent panic on multi-byte UTF-8 entity keys in truncate_key
vimmotions Mar 23, 2026
58f53d0
fix: prevent silent connection to wrong stack when multiple stacks co…
vimmotions Mar 23, 2026
811cb7a
fix: --first without --where now exits after first frame/entity
vimmotions Mar 23, 2026
0076355
docs: clarify operator parsing order and value splitting in filter DSL
vimmotions Mar 23, 2026
bf05ff5
fix: snapshot_complete NO_DNA event tracks received frames, not filte…
vimmotions Mar 23, 2026
b1d46da
fix: reject --load --tui with clear error, replace process::exit with…
vimmotions Mar 23, 2026
84ea4fc
fix: remove always-on SnapshotRecorder to prevent unbounded memory gr…
vimmotions Mar 23, 2026
ab6bd9b
fix: --duration help text accurately reflects it stops the stream
vimmotions Mar 23, 2026
796d5ac
fix: surface deserialization error when loading corrupt snapshot files
vimmotions Mar 23, 2026
d885322
fix: apply --where filter and --first to Delete operations
vimmotions Mar 23, 2026
90e6175
fix: emit snapshot_complete NO_DNA event when --no-snapshot is used
vimmotions Mar 23, 2026
882b21d
fix: TUI snapshot save preserves frame timing, raw mode handles snaps…
vimmotions Mar 23, 2026
c0d707c
fix: delay first ping tick by 30s instead of firing immediately
vimmotions Mar 23, 2026
9af158a
fix: gate record_with_ts behind tui feature to avoid dead_code warning
vimmotions Mar 23, 2026
fe47712
fix: normalize op_str to lowercase in --ops filter comparison
vimmotions Mar 23, 2026
81f410e
fix: address final review feedback (5 items)
vimmotions Mar 23, 2026
e4cfbe3
fix: emit snapshot_complete in replay NoDna mode
vimmotions Mar 23, 2026
2f3fd5b
fix: disable raw mode on terminal setup failure
vimmotions Mar 23, 2026
703f4b4
fix: stop dropping frames while TUI is paused
vimmotions Mar 23, 2026
ff68c57
fix: include snapshot operations in --ops filter
vimmotions Mar 23, 2026
5161913
fix: use derived Deserialize for SnapshotHeader instead of manual par…
vimmotions Mar 23, 2026
e892f46
fix: TUI update_count increments per entity, not per snapshot frame
vimmotions Mar 23, 2026
29a08b7
docs: note that field? treats null as absent in --where help text
vimmotions Mar 23, 2026
8832ff3
feat: add detail pane scrolling with Ctrl+e/Ctrl+y and PageDown/PageUp
vimmotions Mar 23, 2026
e968560
fix: --ops filter suppresses output but always populates entity state
vimmotions Mar 23, 2026
77ed9e7
docs: document --raw --where limitation for snapshot batch frames
vimmotions Mar 23, 2026
1094aec
fix: validate snapshot version on load
vimmotions Mar 23, 2026
e7c247e
fix: clear pending_count on g prefix, add resize handling comment
vimmotions Mar 23, 2026
e36d1ea
fix: always attempt all terminal cleanup steps on TUI exit
vimmotions Mar 23, 2026
56bf945
fix: snapshot_complete fallback guard uses received_snapshot not upda…
vimmotions Mar 23, 2026
ab2b650
fix: warn when snapshot file has no 'frames' key
vimmotions Mar 23, 2026
57b328e
fix: validate WebSocket URL scheme before connecting
vimmotions Mar 23, 2026
3f7d37a
fix: warn when --diff and --history are combined
vimmotions Mar 23, 2026
3f5c40d
fix: emit snapshot_complete before first live frame in NO_DNA mode
vimmotions Mar 24, 2026
f8bd75e
fix: reject TUI-incompatible flags with clear error messages
vimmotions Mar 24, 2026
7af7ede
fix: deserialize snapshot in single pass to avoid cloning entire JSON
vimmotions Mar 24, 2026
758f870
fix: NotRegex returns true for absent fields, consistent with NotEq
vimmotions Mar 24, 2026
9b64a7a
fix: use VecDeque for raw_frames to avoid O(n) drain from front
vimmotions Mar 24, 2026
2355eb6
fix: remove mouse capture from TUI to restore terminal copy-paste
vimmotions Mar 24, 2026
db3519d
refactor: extract snapshot_complete emission into helper function
vimmotions Mar 24, 2026
44ecc5a
fix: TUI deep search also matches JSON field names, not just values
vimmotions Mar 24, 2026
4a4ba17
fix: simplify snapshot empty-frames warning (both branches were ident…
vimmotions Mar 24, 2026
2592b81
fix: use try_send for TUI frame channel to prevent blocking when paused
vimmotions Mar 24, 2026
364beea
fix: reset history_position and scroll_offset on entity delete
vimmotions Mar 24, 2026
62d61d7
fix: replay emits snapshot_complete at correct boundary, not after al…
vimmotions Mar 24, 2026
2e0971e
fix: warn eagerly at startup when --history/--at/--diff lack --key
vimmotions Mar 24, 2026
206cb65
fix: show dropped frame count in TUI header when channel is full
vimmotions Mar 24, 2026
9eb8423
fix: use checked arithmetic for history index to prevent overflow
vimmotions Mar 24, 2026
4e98995
fix: restore default panic hook after TUI exits
vimmotions Mar 24, 2026
0bbbe75
perf: cache filtered_keys result, invalidate on filter change or new …
vimmotions Mar 24, 2026
bf56841
test: add coverage for !=, >=, <=, !~ operators and two-char precedence
vimmotions Mar 24, 2026
fd6da59
fix: always attempt all terminal cleanup steps on TUI exit
vimmotions Mar 24, 2026
31f392a
fix: validate WebSocket URL scheme for all resolved URLs, not just --url
vimmotions Mar 24, 2026
2a07b72
fix: debug_assert on filtered_keys() to catch missing ensure_filtered…
vimmotions Mar 24, 2026
369e630
fix: snapshot duration from frame timestamps, normalize create→upsert…
vimmotions Mar 24, 2026
c74f88d
fix: pending_g, delete history retention, snapshot cap, entity_count
vimmotions Mar 24, 2026
4ae07d3
fix: ignore ctrl/alt combos in filter input, add Ctrl+U/Ctrl+W
vimmotions Mar 24, 2026
9e610e2
fix: ops create normalization, entity_count timing, atomic snapshot w…
vimmotions Mar 24, 2026
64b308b
fix: subscribed frame fallback, atomic write, early validation, filte…
vimmotions Mar 24, 2026
cc5cea8
fix: float equality, visible_rows off-by-one, dead code, filename col…
vimmotions Mar 24, 2026
38be0c5
fix: snapshot recorder limit warning only prints once
vimmotions Mar 24, 2026
f4b6522
fix: selection drift on delete, reject --raw/--no-dna with --tui, rem…
vimmotions Mar 24, 2026
a90d95b
fix: NoDna connected event emitted after connect, replay tagged with …
vimmotions Mar 24, 2026
8dccbb1
fix: TUI filter flag rejection, disconnect detection, float eq, WS close
vimmotions Mar 24, 2026
6945298
fix: count line cleanup, Windows rename, document snapshot entity_count
vimmotions Mar 24, 2026
1d41852
fix: scope Windows rename workaround with cfg, clean up tmp on failure
vimmotions Mar 24, 2026
7ebddc1
perf: shared StdoutWriter, single-parse text frames, dedup diff_at lo…
vimmotions Mar 24, 2026
97f8a6b
fix: replay snapshot_complete guard, docs for select/diff/colorize, r…
vimmotions Mar 24, 2026
0c412fb
fix: flush stdout per write, streaming snapshot, key coloring, pendin…
vimmotions Mar 24, 2026
f5f5fbc
Merge branch 'main' into vim/hyp-184-cli-hs-follow-command-for-websoc…
vimmotions Mar 25, 2026
df04438
feat: context-aware j/k navigation in TUI detail mode
vimmotions Mar 25, 2026
53ca311
fix: stable history position during live streaming in TUI
vimmotions Mar 25, 2026
c3acf3a
feat: compact inline array rendering in TUI detail pane
vimmotions Mar 25, 2026
1bc31cc
feat: dynamic entity sorting in TUI with S/O key bindings
vimmotions Mar 25, 2026
8e560f8
fix: clamp detail scroll to content height, show line indicator
vimmotions Mar 25, 2026
817f389
fix: swap sort/save key bindings for ergonomics
vimmotions Mar 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
266 changes: 258 additions & 8 deletions Cargo.lock

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ path = "src/main.rs"
default = []
# Enable local development mode (uses http://localhost:3000 instead of production API)
local = []
# Enable interactive TUI for `hs stream --tui`
tui = ["ratatui", "crossterm"]

[dependencies]
clap = { version = "4.5", features = ["derive", "cargo"] }
Expand All @@ -33,6 +35,7 @@ indicatif = "0.17"
console = "0.15"
hyperstack-interpreter = { version = "0.5.10", path = "../interpreter" }
hyperstack-idl = { path = "../hyperstack-idl", version = "0.1.5" }
hyperstack-sdk = { path = "../rust/hyperstack-sdk", version = "0.5.10" }
reqwest = { version = "0.11", default-features = false, features = ["json", "blocking", "rustls-tls"] }
dirs = "5.0"
rpassword = "7.3"
Expand All @@ -41,4 +44,9 @@ flate2 = "1.0"
tar = "0.4"
uuid = { version = "1.0", features = ["v4"] }
regex = "1.10"
tokio = { version = "1.0", features = ["rt-multi-thread", "sync", "time", "macros", "signal"] }
futures-util = { version = "0.3", features = ["sink"] }
tokio-tungstenite = { version = "0.21", default-features = false, features = ["connect", "rustls-tls-webpki-roots"] }
ratatui = { version = "0.29", optional = true }
crossterm = { version = "0.28", optional = true }

1 change: 1 addition & 0 deletions cli/src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ pub mod idl;
pub mod sdk;
pub mod stack;
pub mod status;
pub mod stream;
pub mod telemetry;
pub mod up;
Loading
Loading