-
Thanks ! - Flight + stay SRPs now ship the data-table-style filter toolbar.
- New
<SrpFilterToolbar>replicates the data-table filter chrome we run on the chat side (AddFilterButtonwith a base-ui<Menu>+<MenuSub>per column, then an active-filters chip strip below). State lives in URL search params so SRPs stay server-component-friendly:useSrpFiltersreads/writes?<columnId>=v1,v2per column and?q=for search. - Flight SRP wires two faceted filters: Airline (multi-select, derived from
offer.owner) and Stops (single-select: Direct / 1 stop / 2+). Search hits airline names, IATA codes, and segment origin/destination codes. - Stay SRP wires Star rating (multi-select) and Price (single-select, per-night buckets: <$100, $100–$200, $200–$400, $400+). Search hits accommodation name, city, and country code.
- Filtered count is reflected in the result header and pagination: "N offers (of M)" when filters narrow the set.
- New
-
Thanks ! - "Plan with Travelese" buttons on destination, journey, and inspiration pages now hand off into chat with the page's substrate cell pre-loaded: the agent knows on its first turn that you're looking at Bordeaux, which UNESCO sites + wine regions + Michelin restaurants are attached, and your intent. No more generic "How can I help" opener after a click from a place page.
Locked handoff URL contract:
chat.travelese.ai/chat?q=<prompt>&slug=<slug-path>&intent=<intent>. Nokinddiscriminator. Chat is the trust boundary: server-sidelookupSubstrate(slug)hydrates the cell from@travelese/location/registriesand persists it to the newchats.metadata.handoffjsonb column. The travelAgent'ssystemPromptreads chat.metadata.handoff on every turn (prompt-cached via promptCacheKey=chatId) and prepends an "Arrival Context" block to the agent instructions.chatstable gains a nullablemetadata jsonbcolumn (migration0009_chats_metadata.sql).trpc.chats.createschema accepts an optionalmetadatarecord; the create mutation passes it through to drizzle. -
Thanks ! -
@travelese/locationnow refuses to leak server-only modules into client bundles.Pulling
next/headersinto a client component (via the location root barrel) was crashing chat's<PlaceCard>and<LocaleSettings>builds. The root barrel is nowserver-only; client components importCOUNTRIESandCountryRowfrom@travelese/location/countriesdirectly.Splits the root barrel: `@travelese/location` is server-only, `@travelese/location/countries` is client-safe. Corrects `currencies[].symbol` to be honestly nullable on `CountryRow`, matching the underlying JSON. Adds `RouterInputs` / `RouterOutputs` exports to chat's tRPC client and translates the journey-module shim's `useMeQuery` from the v10 hook proxy to v11 `useQuery(trpc.auth.me.queryOptions(...))`. -
Thanks ! - Staging build unblocked: type fixes + i18n middleware simplified.
packages/internationalization/proxy.tsnow matches thenext-internationaldocs verbatim: drops the custom@formatjs/intl-localematcher+negotiatorresolver that no longer satisfied the lib's typedresolveLocaleFromRequestcontract. Locale matching falls back to the library's built-in Accept-Language parser (first token, region-stripped).- `apps/web/src/lib/org-by-slug.ts`: replaced the undefined `G_ADVENTURES_STUB` reference with a `TOUR_OPERATORS` lookup so `/org/g-adventures` resolves instead of crashing the build - `apps/web/src/components/flights/flights-landing-panels.tsx`: rewrote a `.map().filter()` predicate-narrowing path as `.flatMap` so TypeScript can prove the `RegistryCardEntry[]` return type without a cast - `apps/web/src/components/hero.tsx`: `aria-hidden="true"` → `aria-hidden` to satisfy Phosphor's stricter boolean prop type - `packages/internationalization/proxy.ts`: doc-minimal `createI18nMiddleware` config -
Thanks ! - Staging deploys unblocked.
A handful of stale type signatures and a removed location-package subpath were failing the staging typecheck gate. Cleaned up so the deploy pipeline goes through.
Exports `CountryRow` from `@travelese/location` and corrects `currencies[].symbol` to be nullable so consumers can drop the `as unknown as` casts. Replaces the stale `@travelese/location/countries-intl` import in chat locale settings. Translates `` and `` patterns into the base-ui shapes used by `@travelese/ui`. -
Thanks ! - Logged-in users now see prices in their saved currency across every web surface: destination journey cards, flight SRP, stay SRP: regardless of where their IP geolocates. Previously the server resolver fell back to
cf-ipcountryeven when the user had explicitly chosen (say) USD in Settings → General; this is the root cause of G Adventures journeys showing AUD for users browsing from outside Australia.The fix layers
trpc.preferences.getinto the server-side currency resolver inapps/web/src/app/[locale]/layout.tsx:preferences.currencynow wins over geo, with a graceful fallback for anonymous users. -
Thanks ! - xAI is retiring eight Grok slugs at 2026-05-15 12:00 PT:
grok-4-1-fast-reasoning,grok-4-1-fast-non-reasoning,grok-4-fast-reasoning,grok-4-fast-non-reasoning,grok-4-0709,grok-code-fast-1,grok-3, andgrok-imagine-image-pro. After that moment xAI silently redirects the old slugs togrok-4.3(priced at $1.25/$2.50 per 1M tokens), which is a price change for some workloads.Pre-migrated in
packages/ai/src/providers.ts. Reasoning workloads point atgrok-4.3; non-reasoning workloads point atgrok-4.20-non-reasoning. The retiring slugs (grok-4-1-fast-reasoning,grok-4-1-fast-non-reasoning) stay aliased to the new generation in the model map so any in-flight reference resolves cleanly. We control the cost shape rather than accepting xAI's default redirect.Source:
-
Thanks ! - Chat /journeys now renders your real bookings on the week and month grid.
Status filters and the journey detail sheet work end-to-end; the page used to hang on load. Recurring journeys are off the menu (we don't book recurring travel).
Translates the chat journey module off the legacy booker port: kills `cal-shims.ts`, switches types to `RouterOutputs` (UI never imports from `@travelese/database`), renders journey items (transports / stays / activities / meals) as time blocks via a new `journey.itemsInRange` procedure, rewrites the journey detail sheet against the Drizzle Journey shape with collaborators fetched through `journey.byId`, wraps the journeys view in `` (fixes the page-hang), and strips upstream mentions from filter primitives + journey-list-item. Foundations live in `apps/chat/src/modules/journeys/lib/{constants,hooks,server-trans,use-me-query,utils}.ts`.