feat: v0.2.1 wasm support on the gpui-pre line (merge gpui-pre-0.6) - #1
Open
hmziqagent wants to merge 120 commits into
Open
hmziqagent wants to merge 120 commits into
hmziqagent wants to merge 120 commits into
Conversation
Three landing grids used `grid lg:grid-cols-[...]` with no base `grid-cols-1`, so the implicit column sized to max-content and wide children (a long tab label, a long code line, the event-log panel) inflated the page to ~622px on mobile, forcing horizontal scroll. - HookTabs: add base grid-cols-1; make the tab nav scroll (min-w-0 max-w-full overflow-x-auto) and keep buttons from compressing (shrink-0 whitespace-nowrap). The nav is a flex item of Basecoat's .tabs, so min-w-0 is required for overflow-x-auto to engage. - AnnotatedFigure: add base grid-cols-1 so the <pre> scrolls instead of inflating its card to 529px. - CacheDeck: add base grid-cols-1 so the event-log panel fits. - architecture-section: `truncate` -> `sm:truncate` so the layer API list wraps on mobile instead of ellipsizing the content away. Desktop (lg) layouts are unchanged. Verified at 390/360/320px: document scrollWidth now equals the viewport (no horizontal scroll), and `bun run build` passes.
Adds .github/workflows/web-preview.yml: on every PR push touching web/** (or shared/**), build web/ and publish an isolated Cloudflare Pages PREVIEW via `wrangler pages deploy dist/client --project-name=gpui-query --branch=pr-<N>`, then post/update a sticky PR comment with the stable alias (pr-<N>.gpui-query.pages.dev) and the unique deployment URL. Production (master) is untouched — it still deploys only via deploy.yml. Fork PRs are skipped (no access to the Cloudflare secrets). Reuses the existing CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID. Validated with actionlint (clean). Note: a pull_request workflow only fires once the file is on the base branch, so this must merge to master before subsequent web PRs get preview URLs.
fix(web): stop horizontal overflow on mobile landing sections
…review ci: add Cloudflare Pages preview deploys on PRs
The #[cfg(not(debug_assertions))] fallback calls cx.new() without the AppContext trait in scope, so the crate fails to compile in any release build (cargo check/build --release). Dev builds never compile the branch, which masked it. Published 0.1.4 and 0.2.0 both carry this — any app taking gpui-query with the hook feature cannot build --release.
feat: wasm32 support (core + http with reqwest), CI guards, publish fixes
chore: release v0.2.1
sanitize matched the lowercased text against the mixed-case needle "/Users/", so macOS home paths leaked through QueryError::sanitized(). Needles are now matched case-insensitively per the documented (?i) semantics; the test that pinned the leak now asserts redaction, plus a new sanitize unit test. Also trims and tightens the core layer: - sanitize: merge duplicate redact helpers into one pass, one lowercase allocation per rule, const needle tables - key: pre-sized single allocation for to_path instead of O(n^2) concat - drop dead format_duration helper and its two unit tests; delegate record_stale_cache_hit to record_cache_hit; fold single-use helpers - strip audit-history comments, tighten doc comments, fix 5 broken rustdoc links in core - gitignore .z-proflow/ state dir
- gc_threshold * SUCCESS_GC_MULTIPLIER now saturates; with_gc_time(u64::MAX) no longer panics (debug) or wraps into a smaller success threshold that mass-evicts cached entries (release) - gc_with_time prunes persisted_meta down to keys still present in a query or infinite bucket, closing unbounded growth from churned Fetched::meta keys - perf: for_each_matching_entry collects upgraded entities in one pass; invalidate_matching only updates entities with a live last_updated_at (no observer notify storm on bulk invalidation); prepare_fetch/prefetch merge into a single entity.update lock cycle - collapse QueryBucket/InfiniteQueryBucket duplication into a generic ResourceBucket<R> + BucketResource trait in bucket/shared.rs; public API unchanged, ops/infinite_bucket are thin facades - strip audit/history comments from client + scoped tests, tighten docs to 1-3 lines; drop dead resource_with_sequencer test helper tests: 819 passed / 0 failed (unchanged); clippy -D warnings clean; client-scope rustdoc warnings at 0
- collapse use_query/use_query_with_policy into a private use_query_impl generic over FetchedLike<T>; merge fetch_query/fetch_query_with_policy into fetch_query_impl - unify mutation begin_and_spawn paths (legacy Fn(V) adapter preserves the single V::clone-per-attempt semantics); delete dead legacy runners run_mutation_loop/run_mutation_loop_with_callbacks; dedupe four identical callback blocks via fire_error_callbacks - strip audit/history narration from hook sources and scoped tests; tighten pub docs to 1-3 lines, doctests kept passing (hook scope 10/10) - fix the 10 hook/* rustdoc warnings: unresolved QuerySignal/CachePolicy/ QueryOptions links and links to private begin_and_spawn items - reuse the destructured retry_policy local in use_query_impl (one fewer entity read per hook call) No public API changes; all restructuring is private. Gates on the commit tree: cargo test --all-features 819/0 (zero delta), clippy -D warnings clean, cargo doc warnings 12->2 (sole survivor is persist.rs, area 4 scope).
…in hydrate persist_with could lose the last mutation before teardown: a bump landing between the armed task's take() and clear(armed) stashed into the pending slot, saw armed=true, and skipped spawning while the armed task had already drained. Snapshot collection now happens at drain time via a foreground cx.spawn task that disarms before collecting, so a bump either waits on a task that collects after it or arms a fresh one; the pending slot is gone and drop of PersistHandle still lets an armed task finish its save. hydrate rebuilt every stored key as a single segment, so PersistFilter::Exact/Prefix and set_query_data priming silently never matched multi-segment keys. Stored paths are now split back into segments on "::" (to_path was already joining with unescaped "::", so no previously-working key regresses). Perf: one serialization per debounce window instead of per bump (collection at drain time captures the latest state); hydrate loop reordered entries-outer/steps-inner so key reconstruction and filter/max_age run once per entry; dead TypeId dropped from DeserializerRegistry::steps. Trim: module doc de-historicized, pub docs tightened, persist.rs FilePersister intra-doc link replaced with plain text (last workspace doc warning), test narration stripped to short constraint comments with setup deduped locally; all 16 test fns and asserts kept. Gates: cargo test --all-features 819/0 (zero delta), clippy -D warnings clean, cargo doc 0 warnings.
- max-age/s-maxage/stale-while-revalidate digit-overflow now saturates to u64::MAX per RFC 9111 1.2.2 instead of failing the whole fetch - no-store/no-cache dominates from any position: parse errors deferred until after the directive scan (RFC 9111 5.2.2) - directive splitting is quote-aware (backslash escapes included), so quoted-string commas can no longer smuggle in a max-age directive - duplicate directives resolve first-occurrence-wins per RFC 9111 4.2.1 - store_fresh now locks meta then bodies, matching fetch, closing an AB-BA deadlock between the two sync critical sections - malformed Cache-Control on a 200 degrades to serve-with-NoCache instead of discarding a good body; InvalidPolicy stays in the pub enum - freshness lifetime uses checked_add so hydrated CacheMeta cannot panic - perf: eq_ignore_ascii_case directive matching, move cached_meta on 304, store_fresh is sync, reqwest backend takes the header map - 10 new adversarial tests (parsing + fetch-level)
fix: audit campaign across the query lifecycle
Keeps the workspace pin on registry gpui-pre so the bridge stays on the starter's single-gpui graph; the release line's perf campaign and bench harness land unchanged on top.
gpui-pre 0.3.x hands back the closure's value directly where zed's gpui wraps it in a Result, so the persist flush loop's two-step unwrap fails to compile on the bridge.
The release line targets zed's gpui where Entity update/read_with hand back Results and Application::new exists; the gpui-pre 0.3.x snapshot returns values directly and renames the constructor. Drop the unit let-bindings, dedupe the release-only AppContext import, and ignore the affected README doctests so the bridge stays CI-green.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Brings the
feat/wasm-supportwork (published as v0.2.1) onto thegpui-pre-0.6line and merges it tomaster.gpui-pre-0.6was carrying two commits the wasm branch lacked:6b8fdd1— release-profileAppContextimport fix forcx.new()inuse_query_manual81b0a33— depend ongpui-pre(package) instead of crates.iogpui ^0.2.2This PR merges the two lines (clean auto-merge; the workspace refactor on the wasm branch picked up the gpui-pre pin at the root:
gpui = { package = "gpui-pre", version = "0.3" }) and bumps the crate version to0.2.1to match the release. Head is1449ef2.Why this matters: the published crates.io 0.2.1 still declares
gpui ^0.2.2(crates.iogpui), which pulls a second, incompatible gpui into any gpui-pre consumer's graph. This branch keeps exactly one gpui. The[patch.crates-io]pin in gpui-starter can be dropped once a published release targetsgpui-predirectly.What's in the wasm support
runtime-rng, wasm uses the js backend;mutation.rsdead-code handling for no-caller wasm paths)gpui-query-httpcrate (reqwest backend, wasm-compatible)gpui-query-persistupdateswasm-check.yml,cargo-test.yml, release workflow updatesVerification
Consumed end-to-end by gpui-starter PR #14, pinned at
rev=1449ef2: wasm check, native--all-featurescheck, 204/204 lib tests, fmt, wasm dev build + browser boot (0 console errors, canvas rendering) all green against this exact rev.