Repository navigation
Zus88 Top Top App Account Zus88 Offers A You Promotions
Download the zus888 app for ios and android fast myr deposits via touch n go ewallet Zus88 Experience Malaysia 2026 Baccarat Aplikasi Zus88 Offers A Badminton Sportsbook The full casino and sportsbook access on your malaysian mobile device.
Zus88 malaysia slot games with exclusive promo deals, zus88 experience malaysia game app with fast account access, looking for a working zus88 apk download this guide shows malaysian Zus88 Malaysia Turun Slot Zus88 Is An Everywhere Sportsbook android users exactly how to get the zus88 android app from the correct zus88 download link install it safely and fix the most common installation errors.
Zus888 App Zus888 Free Fully Optimised For Trusted Class Sharpest
Zus88 top online casino malaysia free credit offers, zus88 is an online casino platform in malaysia offering hundreds of free games and exclusive free credit rewards Zus88 Apk Download Touch Ios Games Muat Turun Aplikasi Optimised for members register today to explore the games and discover available member promotions.
From the malaysia super league to live dealer tables zus88 brings together the sharpest odds the smoothest payouts and the most trusted gaming experience all in one deep ocean blue platform Zus88 Malaysia Account App Deals Muat Turun Aplikasi Lebih For built for players in kl penang jb and everywhere in between.
Zus88 Malaysia Muat Top Zus88 Is An Dengan Common Built
Zus88 offers a comprehensive betting experience covering live casino games such as baccarat and roulette thousands of malaysia themed slots sports betting on the malaysia super league english premier league badminton and e sports titles like mobile legends and dota Zus88 Malaysia Turun Baccarat Muat Turun Aplikasi Bonus Ocean 2.
Zus88 muat turun muat turun aplikasi rasmi zus88 android, fully optimised for android and ios whether you re in kuala lumpur penang or johor bahru play anywhere anytime real human agents available round the clock via live chat average Zus88 Muat Turun 2026 Deals Zus88 Is Tables Games response time 3 5 minutes no chatbot runaround.
Muat turun aplikasi rasmi zus88 daftar akaun percuma dan tuntut bonus alu aluan eksklusif yang hanya tersedia untuk pengguna aplikasi lebih 500 permainan menanti anda dalam genggaman, zus88 latest version 2026 app update version history guide, aplikasi zus888 Zus88 Muat Turun App Version How To Get Anytime Epl membawa live casino slot dan sportsbook ke telefon anda muat turun untuk android atau ios daftar dengan touch n go grabpay boost dan fpx di wilayah yang disokong.
Zus88 Malaysia 2026 Promo Muat Turun Aplikasi Blue Untuk
Zus88 malaysia s premier online casino for baccarat Zus88 Top Online Malaysia Premier Game Muat Turun Round Link Akaun and roulette, zus88 apk download malaysia android installation guide 2026, zus88 fresh game website in malaysia with fast entry.
Conversation
Fixes the interface audit (dialogs that fit small windows and return focus, readable error text with a next step, zoom keys, focus rings, live status, Radix tabs, one type scale) and the review changes on top: a resizable sidebar with an icon footer, the + in the title row, pinned tiles that stay put, drag-and-drop sorting of folders, bots and rooms, folder rename, delete and nested folders, right-click menus in one menu style, and a room details panel with its members. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The latest updates on your projects. Learn more about Vercel for GitHub.
|
One error shape (what failed, what to do, the cause) replaces raw text in chat, rooms, providers and the roster; Electron's IPC prefix never reaches the screen. A lost engine connection shows a reconnecting bar and, when the socket never opens, a screen with Try again. Crashes show a recoverable screen instead of a blank window, renderer and main failures go to the log file, a corrupt settings.json is kept aside, and saves are all-or-nothing. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Talyx remembers the bot or room that was open and opens it again on launch. On a first run, or when the open bot or room goes away, it opens Talyx itself, so the empty welcome screen only shows for a roster with no bots. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Loading shows placeholder shapes in the layout of what is coming, after a moment so quick loads never flash. Empty states offer their next step: New routine, Add provider, New bot in an empty folder. A bot never talked to shows its description (or Add a description), its model and starter prompts that fill the composer; a new room shows its bots and two starters. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
One set of easings and durations in theme.css: things appear with ease-out (180 ms), leave with ease-in (120 ms) and move with ease-in-out (200 ms). Menus grow from their trigger, the details and room panels slide in while the chat narrows, folders, banners and error lines open by height, pages and loaded content fade in, and roster rows glide to their new place after a reorder, pin or drop. Switching chats and your own message stay instant; reduced motion turns it all off. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Open-ended starters (Ask a bot to …, @bot what do you think about …) still fill the composer to finish. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Deleted bots and rooms take their chats, room views, unread and activity marks and cached details with them, so a new bot with a deleted one's name starts clean. A failed action keeps showing until the next action instead of vanishing on the next poll: the roster error is split into loadError (polls) and actionError (changes). Bot details are shared by the chat intro and the details panel, and a save drops them, so the intro shows what was just saved. Model lists load once per profile for every menu, and drop when providers change or the engine reconnects. Polls that find nothing new no longer redraw: unchanged bots, rooms and folders keep their objects, an empty roster or room poll leaves the store alone, pages read the store through selectors, and row menus are built when they open. Row times tick once a minute on their own. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The demo bundles AppShell, which now imports values from src/shared. There the nearest tsconfig extends @electron-toolkit, which Vercel does not install, so the site build failed. src/shared now has its own tsconfig, as src/renderer does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
- The roster renders on every new snapshot again, so rows reordered on another client glide and the next local move starts from the right place. - A failed action goes when its dialog or the details panel closes, or when another bot is chosen; in the roster banner it offers Dismiss, since a reload would not redo it. - The chat intro reads a bot's details each time it opens and again after a save, instead of keeping them for the session. - A poll that read the same roster keeps the snapshot; per-item reuse is gone, since no row was memoized to use it. - A model list that fails to reload no longer shows the old list too. - Only the gateway's and socket's own wording counts as the engine out of reach, not a provider's "not connected" or "offline". - A click on the sidebar's edge without a drag leaves the width as is. - The cleanup of deleted bots' chats and rooms' views is tested. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Choosing a bot or room in the roster clears a failed action's message, but the store's select no longer does: the fallback select after a deleted chat (or the restored selection at start) hid a failure the user never saw, such as a room's layout cleanup after its delete. Two more gateway messages count as the engine out of reach. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Uh oh!
There was an error while loading. Please reload this page.
* docs: design and plan for the agents pivot Design document and the HTML plan (twelve PRs, screen mockups, avatar reference, flows, website changes) for turning Talyx into the app that tallies agents on a stock engine. Work lands on the pivot branch as a stack of PRs; pivot merges into main once 1.0 is in daily use. Co-Authored-By: Claude Fable 5.1 <[email protected]> * chore: clear the deck for the agents pivot (#6) * chore: clear the deck for the agents pivot Delete everything Talyx did as a file organizer so every later pivot PR adds to an empty, building app: sorting, watch folders, history, search, the hotkey assistant, voice, the MCP server, the Claude providers, the welcome tour, notices, the tray and SQLite. The old app stays on branch legacy/file-organizer and tag v0.11.0-legacy. What remains is the shell: AppShell, the shared ui kit, theme and fonts, the JSON settings store, Settings reduced to Appearance, and one Agents page that says "Nothing here yet". Dependencies only the deleted code used are removed. Version 1.0.0-alpha.1. CLAUDE.md, README and the community files describe the new purpose, and the pivot design spec now refers to the backend only as the engine. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep the website demo building on the empty shell The landing-page demo imported the deleted sort, watch, history and ask pages. It now renders AppShell with the Agents page for every scene until the website PR rebuilds it for the pivot. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: address review findings on the cleared deck - Compare pre-release versions so 1.0.0-alpha.1 still hears about newer releases; the old parser rejected any version with a suffix. - Reopen the window when a second launch arrives after it was closed on macOS, instead of calling show() on a destroyed window. - Remove leftovers of deleted features: the dev bridge guard for the API key channel, the onboarding stepper, the permission allowlist entries (mic, clipboard, notifications) no page uses, macOS permission advice in release.sh, and ignore entries for models, licence keys and evals. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: handle a second launch only once the main window exists A launch during the splash created its own window before showMainWindow made the real one. The handler is now registered after startup, shares the reopen path with activate, and restores a minimized window. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: talk to the engine from Talyx, with a chat round-trip (#7) * feat: attach to the engine gateway and prove a chat round-trip Main runs the engine as talyx-engine (the enginePath setting, then PATH, then the per-OS user bin), attaches with `gateway ensure --json` and mints one-use tickets through the profile's control socket. It opens the gateway websocket itself and relays it over engine:socket-* IPC, and proxies REST over engine:http. It never owns or kills the gateway. The renderer vendors the engine desktop app's protocol client and API wrappers from v0.22.5 into shared/engine, behind a small host facade with reconnect, replay and session re-resume. Wire strings and metadata keys that carry the engine's own name are built at runtime from `talyx-engine --version`; a test fails if the name appears in the repo. Adds the Engine (debug) page, the "Talyx needs its engine" first-run state, and README notes that pin engine 0.22.5 and explain re-syncing. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: close late sockets, follow a re-ensured gateway, keep fallbacks Review fixes for the engine bridge: - A socket the page closed while main was still opening it is closed in main too, and a full socket table drops its oldest socket instead of refusing new ones. - REST requests go to the gateway that answered the re-ensure, not the port cached before it. - A chosen engine file no longer turns off the PATH and user-bin lookups, so a moved file cannot lock Talyx out. - Page lifecycle listeners are added once per page, not per socket. - Windows reports that it cannot attach yet, a non-executable command is an error rather than "missing", and a hand-edited enginePath that is not absolute is ignored. - The debug page says when the gateway runs older code. - The website build installs nanostores, which the demo now imports, and the demo shows an attached engine. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep engine REST calls and their ticket on the gateway A request path such as /api/..//other.host resolved to another host when the URL was joined as a string, and the one-use ticket went with it. The path is now checked after dot segments resolve and set on the gateway's own URL. Adds tests for the escape and for the main-process socket table (subprotocols, duplicate ids, the 16-socket cap, sends to closed sockets). Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: record sends in the fake engine socket The empty stub failed no-empty-function, so npm run lint exited 1. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: show your bots in a roster with pins and folders (#8) * feat: show the roster of bots, pins and folders The left side of the agents screen: a tally line, pinned tiles, project folders with nesting and counts, bot rows with their last message, and group rows. Pins, folders and room placement are saved in the profiles' ui_meta through the engine, with revision checks so two clients never overwrite each other. Folders are rebuilt from today's sections on the first run. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: check the engine once when two screens ask at the same time The roster and the engine gate both ran the engine check on startup, which connected the socket twice and failed the roster's first request with "connection changed". Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: address review of the roster - Make a second connect a no-op while the socket is open or connecting, so no caller can fail calls in flight (replaces the useEngine guard) - Show roster errors through i18n keys, thrown as RosterError - Test the roster's engine access and folder counts; split the combined action test - Fix the interaction fixture, which went blank behind the engine gate - Smaller pieces in Roster, FolderGroup and rosterControls; store actions for editing a profile and clearing an error - Menus no longer offer the folder an item is already in - Unpinning writes only `pinned`; drop unused metadata helpers Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: wait for the request to reach the engine before reconnecting Also rename a shadowed variable in the roster drop handler. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: chat with your bots, with cards, a composer and unread marks (#9) * feat: mark bots unread when their chat moves in the background Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: build the chat transcript from history and session events Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: open, send and answer in a bot's chat Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: route session events and cards into the open chats Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: show a bot's chat with cards and a composer Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: dictate into the composer Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: describe the chat in the guide and the design Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep the chat consistent under reloads, races and failed sends Addresses the branch review: a stale reload no longer overwrites a newer one and events that land during a reload are replayed over it; a new replay epoch restarts the sequence; two quick sends share one Bot Chat; a failed send gives the draft back; leaving a chat stops the microphone; open clarify questions take typed answers; cards are announced; the microphone grant is audio only; engine notices render as quiet lines; a bot's first chat opened by a delivery marks it unread, and a reply you already read does not. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: decline requests the chat cannot show and guard new-chat chips The prompt handler accepted every request the engine sent, so ones the chat cannot show (sudo, secrets, sessions no chat has open) were never declined and the bot waited out its deadline. A model or reasoning level picked before a chat existed was shown but never applied; the chips now wait for the first send. A failed reload also stops buffering live events. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: edit your bots in a details panel and create new ones (#10) * feat: load and save bot details, routines and new bots through the engine Use cases for the details panel and the create dialog: profiles.describe and profiles.configure for description, SOUL and model (with the engine's costly-model confirm), cron.manage for routines, profiles.create plus the bot metadata for a new bot in its folder. Tested against the engine double. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: edit a bot in the details panel and create bots from the roster The name pill opens a 340px panel that pushes the chat: Details (title, description, model, routines with switches), Look (placeholder until the avatars PR) and Soul, with Cancel and Save. The roster's + adds a bot with name, folder and model. The model picker is shared with the composer. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: describe the details panel and the create dialog Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep the costly-model ask when the engine marks the model unapplied Addresses the merge-check review: a model waiting on confirmation no longer reads as a failed save, a save that finishes after you moved to another bot's panel leaves that panel open, and tests now pin a plain model change, a taken name that never reaches the engine, and out-of-range schedule times. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: open group rooms, send to them and see who is answering (#11) * fix: center the engine check and hide the sidebar while it runs The first look for the engine fills the window with the logo and one line, with no sidebar to click. The missing and error states center in the page: the gate's box had no height inside the Agents page. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: use the 9-route-provider model in the engine doubles The router's team-* models were replaced by one combo, 9-route-provider. The second test model, for the costly-model confirm, is the made-up paid-model. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: describe group rooms and the router's single model Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: open hosted group rooms, send to them and see who is answering Rooms come from the engine's groups.* RPCs. An open room polls groups.state and the new groups.log rows every 2 s, since the engine pushes no room events. The transcript reuses the chat's: every bot reply sits in a bubble, and a room names each sender with its avatar. Messages another bot delivers into a chat show the same way instead of as a raw line. Member approvals, Retry and Discard are answered in the room; images upload through the room's attachment store. The roster creates rooms (2 to 6 bots, a folder), pins a room to the top of its folder (talyx-room-pins), deletes one after a confirmation naming it, and marks a room with new messages. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep room sends visible and their errors on screen Addresses the merge-check review: a send's error is no longer wiped by the next poll; a send, stop or answer waits out a read already on its way, so the new row shows at once; an image's manifest uses the name and type the engine stored; deleting a room closes its dialog once the room is gone, then cleans the layout; the activity line names who answers and who is next; the manager-handle rule lives in the chat feature with a test. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep room action errors apart from read errors Addresses the second merge-check round: a failed send, stop or answer keeps its reason until an action works, and a poll no longer clears or replaces it; Try again appears only for a failed read, where it does something. The fixture's upload returns the stored name and type, as the engine does. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: name every room action in the action-error comments Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * fix: show pinned rooms as tiles beside the pinned bots (#12) * fix: put a pinned room above everything in its folder Pin to top only reordered the rooms among themselves, and a folder lists its bots before its rooms, so a pinned room barely moved. It now leads the folder, bots included. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: show pinned rooms as tiles beside the pinned bots, centered A pinned room now leaves its folder for the pinned tiles at the top, after the pinned bots, the way a pinned bot does. A row that is not full is centered, and names truncate inside their tile instead of running into the next one (this also fixes long bot names). Pin and Unpin read as they do for bots. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: line up the Unassigned count with the other folders Unassigned has no folder menu, so its count sat further right; an empty gap the menu's width keeps the counts in one column. Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: drop the agents tally line above the pinned tiles Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: unpin a room that is moved to a folder Addresses the merge-check review: a pinned room moved or dropped into a folder stayed pinned, so the move looked like it did nothing. It now leaves the pins, as a pinned bot does. The tile width comment names its tie to the gap between tiles. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: switch a room's model from its composer (#13) * feat: switch a room's model and fix the chat's model picker The engine refuses a model change through config.set; it takes a session.mutate fenced by the session's revision and generation. The bot chat's model chip now uses that, so picking a model works again. A room's composer gets a model chip. Each member answers through its own room session, whose model is fixed when it is created; the chip shows the model they share or "Mixed models", and a pick switches every idle member's session (resume, mutate, then detach, even on failure). Members that are answering or waiting on you are skipped and named. The host no longer subscribes a detached session again after a redial. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: switch room members through the engine client's model change Addresses the merge-check review. The engine client already turns a model config.set into the engine's fenced session.mutate, with one retry and the engine's cost confirmation, so the bot chat's chip worked and is restored as it was. A room switch now resumes each idle member's session, sets its model the same way, and detaches. A model the engine wants confirmed counts as not switched, with its message; a failed detach no longer undoes a switch, and the host forgets a session before detaching it. An unreadable member is left out of the room's reading, only the newest reading lands, and the chip is off while a switch runs. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: manage model providers and Talyx's default model in Settings (#14) * feat: manage model providers and Talyx's default model in Settings Settings gets a Providers section: the active router and other custom endpoints, saved API keys (masked, reveal on request) and signed-in accounts, with Add provider for an API key, an account sign-in (device code, pasted code, or an external tool's command) or a custom OpenAI-compatible endpoint. Keys and endpoints go to Talyx first and then to every bot, since each profile keeps its own; sign-ins are made once on Talyx, which every profile reads. A Default model section sets Talyx's model, which new bots copy. Every model picker now lists only a custom endpoint's saved models, so the router's combo is not buried under the hundreds of models it routes to. An endpoint written straight into config.yaml can be edited only with its key typed again (the engine's save would otherwise drop it on every bot) and cannot be removed here. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: confirm a costly default model and keep removals and menus honest The default model now asks first when the engine wants a yes for a costly model, instead of reporting a change the engine never saved. Removing a key or an endpoint counts a bot that never had it as done rather than naming it as a failure. An endpoint edit adds models, since the engine never drops a saved one, and the form says so. The default model menu reloads after a provider change, and a revealed key is hidden again once the list reloads. The test double now merges models, answers 404 for a missing key and asks before a costly model, as the engine does. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: give every bot a block avatar that shows what it is doing (#15) * feat: draw every bot as an isometric block avatar Bots get block avatars drawn in SVG: six shapes, twelve hues, a tick face that shows idle, working, waiting and offline. Talyx is the logo as a black-and-white block. The Look tab and the create dialog pick shape, colour, "Match the name" and the face; a save exports a 1024px PNG as the profile's avatar. Bots without a saved look are drawn from a hash of their profile id; nothing is written back. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: export a new look before saving it, so a failed export can retry A failed avatar export left the look saved and Save disabled, so the same Save could never run again. The export now runs first; a failure saves nothing. Talyx's look saves only its face flag, the hero's first turn frame no longer steps backwards, and an unused prop is gone. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: give the app the Talyx look (#16) * feat: give the app the Talyx look Solid ground, violet only on live marks, pill buttons, tone-step surfaces instead of hairlines, one shared field component, and a composer and bubbles that hold up at 390px. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: clear the merge-check findings on the Talyx look One tone step in both themes, a stronger focus ring shown the same way on every control, dark form controls, pill shapes in the sidebar chrome, a window ground that follows theme switches, borderless toasts, a visible selected state on pinned tiles, and the unused theme tokens and button variants removed. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: drop the toast border for real Sonner's border rule sits outside the CSS layers, so the layered border-0 utility never won; mark it important. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: polish the app: accessible UI, sortable roster, clear errors (Zus88 Top Top App Account Zus88 Offers A You Promotions) * feat: polish the app: accessible UI, resizable sidebar, sortable roster Fixes the interface audit (dialogs that fit small windows and return focus, readable error text with a next step, zoom keys, focus rings, live status, Radix tabs, one type scale) and the review changes on top: a resizable sidebar with an icon footer, the + in the title row, pinned tiles that stay put, drag-and-drop sorting of folders, bots and rooms, folder rename, delete and nested folders, right-click menus in one menu style, and a room details panel with its members. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: say what failed and what to do everywhere, and log it One error shape (what failed, what to do, the cause) replaces raw text in chat, rooms, providers and the roster; Electron's IPC prefix never reaches the screen. A lost engine connection shows a reconnecting bar and, when the socket never opens, a screen with Try again. Crashes show a recoverable screen instead of a blank window, renderer and main failures go to the log file, a corrupt settings.json is kept aside, and saves are all-or-nothing. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: give the whole-app crash screen words that match its one button Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: show a details save failure once, in the panel Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: always open a chat: the last one, else Talyx Talyx remembers the bot or room that was open and opens it again on launch. On a first run, or when the open bot or room goes away, it opens Talyx itself, so the empty welcome screen only shows for a roster with no bots. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: skeletons while loading, and empty states that show the next step Loading shows placeholder shapes in the layout of what is coming, after a moment so quick loads never flash. Empty states offer their next step: New routine, Add provider, New bot in an empty folder. A bot never talked to shows its description (or Add a description), its model and starter prompts that fill the composer; a new room shows its bots and two starters. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: lay out an empty folder like a bot row that adds a bot Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: quick, quiet motion across the app One set of easings and durations in theme.css: things appear with ease-out (180 ms), leave with ease-in (120 ms) and move with ease-in-out (200 ms). Menus grow from their trigger, the details and room panels slide in while the chat narrows, folders, banners and error lines open by height, pages and loaded content fade in, and roster rows glide to their new place after a reorder, pin or drop. Switching chats and your own message stay instant; reduced motion turns it all off. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: send a whole starter prompt on click Open-ended starters (Ask a bot to …, @bot what do you think about …) still fill the composer to finish. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep roster and chat state in step with the engine Deleted bots and rooms take their chats, room views, unread and activity marks and cached details with them, so a new bot with a deleted one's name starts clean. A failed action keeps showing until the next action instead of vanishing on the next poll: the roster error is split into loadError (polls) and actionError (changes). Bot details are shared by the chat intro and the details panel, and a save drops them, so the intro shows what was just saved. Model lists load once per profile for every menu, and drop when providers change or the engine reconnects. Polls that find nothing new no longer redraw: unchanged bots, rooms and folders keep their objects, an empty roster or room poll leaves the store alone, pages read the store through selectors, and row menus are built when they open. Row times tick once a minute on their own. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: let the website build the renderer's shared sidebar constants The demo bundles AppShell, which now imports values from src/shared. There the nearest tsconfig extends @electron-toolkit, which Vercel does not install, so the site build failed. src/shared now has its own tsconfig, as src/renderer does. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: address review of the state changes - The roster renders on every new snapshot again, so rows reordered on another client glide and the next local move starts from the right place. - A failed action goes when its dialog or the details panel closes, or when another bot is chosen; in the roster banner it offers Dismiss, since a reload would not redo it. - The chat intro reads a bot's details each time it opens and again after a save, instead of keeping them for the session. - A poll that read the same roster keeps the snapshot; per-item reuse is gone, since no row was memoized to use it. - A model list that fails to reload no longer shows the old list too. - Only the gateway's and socket's own wording counts as the engine out of reach, not a provider's "not connected" or "offline". - A click on the sidebar's edge without a drag leaves the width as is. - The cleanup of deleted bots' chats and rooms' views is tested. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep a failed action showing through a selection made for the user Choosing a bot or room in the roster clears a failed action's message, but the store's select no longer does: the fallback select after a deleted chat (or the restored selection at start) hid a failure the user never saw, such as a room's layout cleanup after its delete. Two more gateway messages count as the engine out of reach. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * chore: keep docs/superpowers local and out of git (#18) Specs and plans are working notes; they stay on disk and are gitignored from now on. Co-authored-by: Claude Opus 5.5 <[email protected]> * feat: ship Talyx 1.0: setup for new users, engine 0.22.7, in-app updates, Linux builds (#19) * fix: harden the app before the 1.0 build - Bump Electron to 44.10.2 (distrusts the compromised eMudhra intermediates) and zod to 4.6.7; npm audit fix for dev tooling. - Serve the packaged renderer over app://talyx/ instead of file:// and turn off the grantFileProtocolExtraPrivileges fuse, so a page can no longer read other files on disk. - Packaged builds get their own menu without Toggle Developer Tools. - Add a permission check handler; allow clipboard writes for the Copy buttons, keep the camera refused. - A page can send on or close only the engine sockets it opened. - Validate theme:set-native with zod. - release.sh uploads SHA256SUMS next to the DMGs. - The CSP test also pins img-src and script-src on both pages. Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: give dev runs their own name and night icon A dev run is called Talyx Dev and shows a night-sky version of the logo in the dock and on its window, so it is never mistaken for the installed app. userData is pinned before the rename, so both still share one settings.json. The icon lives in build/, which is never packaged. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: design the 1.0 onboarding From first launch to a first chat: install the engine (exact commands with Copy, or Install with live output), connect a model provider, make a first bot. The install commands live in a release asset pinned by a hash committed in Talyx; the local copy is gitignored. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: tell how the engine's version fits the one Talyx is built for Add EXPECTED_ENGINE_VERSION and engineVersionFit (numeric compare), and carry the version `--version` reported on the error status, so a later setup screen can tell an older engine from one that failed to attach. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: run the engine install steps with live output Run the install commands one after another in the user's login shell, streaming stdout and stderr per command, stopping at the first failure, and killing the whole process group on cancel. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: load the pinned engine install steps Main fetches the engine install commands from the release asset (the local file in dev) and refuses them unless their SHA-256 matches the constant committed in Talyx. Size capped at 64 KiB, 10 s timeout, win32 unsupported. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: expose the engine install to the window Add setup:install-steps, setup:install-run and setup:install-cancel with output and exit events. Main runs only the pinned steps it loaded itself, one install at a time, sent to the page that started it and cancelled when that page goes or Talyx quits. Add the setupDone setting, defaulting to false. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: log how the engine install ended Log the exit of an install run: finished, cancelled, or the failing command index and exit code. Never the commands or their output. Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: release the pinned engine install steps The app only runs install steps whose hash is pinned in code, so the release refuses to build unless the gitignored engine-install.json at the repo root matches that pin. The file is copied into dist/, listed in SHA256SUMS and uploaded as a release asset, which is where the app fetches it at runtime. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: decide which setup step comes first Pure logic for the first undone setup step, setup visibility and provider presence, plus the setup and install stores. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: say what a new bot does The create-bot form gains a "What it does" field, written into the bot's SOUL. The form moves out of the dialog into features/bots so the setup flow can render it inline; the dialog is now a thin wrapper. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: walk a new user through setup First-run flow (Welcome, engine, provider, first bot) with a step bar in the title row, the engine screens shared with the engine gate's new "Install the engine" button, and pure mappings for which screen and which step come next. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep setup's widgets apart and head every screen The provider step takes Settings' providers form as a slot the app fills, so no widget imports another. Waiting screens get a visually hidden heading that takes focus like the others. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: test setup on the fixture, nudge for a provider, run setup again The roster fixture takes ?setup=missing|offline|mismatch|fail|old|windows and runs the setup flow against a scripted install. Talyx's chat asks for a model provider while none exists, and Settings can open setup again at Welcome even when every step is already done. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: read provider presence on every attach, wait before Get started The chat's provider nudge needs to know whether a provider exists in every session, not only the one that ran setup. Run setup again clears the facts and Get started waits until they are read again, so done steps are skipped. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: fall back to bash for login shells that are not POSIX csh, fish and nushell cannot run the install commands, so the runner uses bash (or sh) for them. An unexpected run failure logs only the error's name and code. The release re-checks the install file's hash on the copy it uploads, and installStepsSource is tested for the pinned release URL and the size cap. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: re-check the engine after any install, cap and clean its output The finished install's engine check runs from the install store, so leaving the screen mid-install no longer misses it. Output keeps its last 200,000 characters and shows without colour escapes or progress-bar redraws; Copy keeps the raw text. The engine gate offers the install on an attach error, Continue anyway shows only for an old engine that attaches, and the fixture's windows mode starts from Windows' real attach error. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: map the setup code and the release's install file pin Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: keep docs/superpowers local and out of git Specs and plans are working notes; they stay on disk and are gitignored from now on. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: credit the engine in the README One small line at the end of the README names the engine Talyx runs on. Everywhere else it stays "the engine", and the naming test allows the name only there. Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: guard the install file's version and commit at release runInstall takes optional run options (explicit env, login or plain shell); the IPC caller passes null and keeps today's behavior. The install-file hash pin moves to installPin.ts with sha256Hex. release.sh now also checks the file's engineVersion against EXPECTED_ENGINE_VERSION and that it pins exactly one commit, on both the repo copy and the dist copy. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: tell the user when the engine speaks another protocol The gateway endpoint check now throws EngineProtocolError for another runtime protocol or a missing session-authority capability; status() reports it as reason 'protocol'. A newer engine gets "Get the latest Talyx" and Try again, a same or unknown version the restart hint and Try again; an older one keeps the Update offer. Adds ?setup=protocol. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: show which engine runs and offer the update after setup The attached status names the absolute engine file Talyx runs (a PATH hit resolved to its file). An older engine after setup gets a notice over the page that opens the Update flow; an install that leaves an older copy running says where it is and offers the newly installed one (engine:use-installed). A stale gateway's restart command is built from the resolved path, shell-quoted, with Try again beside Copy. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: show the exact gateway restart command for the engine that runs The stale-gateway hint named the bare command while Copy copied the resolved path's, so a user typing what the screen said could restart an older copy's gateway. With a known path the hint now shows the quoted command itself; the bare wording stays where no path is known. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: add an isolated real-engine smoke suite npm run test:smoke installs the pinned engine from the shipped install file into a fresh temp home and drives it through Talyx's own engine code: version, attach inside the home, socket RPC, rooms protocol, a throwaway profile, REST shapes, then a teardown that stops the gateway and requires no process left. Skipped unless TALYX_SMOKE_INSTALL_FILE is set. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: harden the smoke suite's teardown and endpoint checks Teardown cancels an unfinished install and always runs the leftover process check, even when gateway stop fails. Every endpoint Talyx mints for is checked to be inside the temp home. Unparseable socket frames are ignored and the engine name is regex-escaped before scrubbing. Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: re-sync the engine client to 0.22.7 Port the upstream v0.22.5..v0.22.7 delta into the vendored client and its protocol tests, keeping every Talyx change. New upstream: clarify batch on prompt.submit, owner server requests in resume snapshots, heartbeat stall grace, cron cancel and catch-up types, room context and activity fields. Upstream's new renderer socket opener is cut (main opens the socket). README points at the new tag and asks for the smoke summary before an engine bump merges. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: drop re-sent reply text from engine 0.22.7 streams Engine 0.22.7 stamps a turn's message.start and message.delta with turn_id, segment and offset, and re-sends frames under new seqs on a reconnect replay or a superseded attempt. The transcript now applies stamped text by position, the rule the engine's own client uses: an applied range adds nothing, an overlap keeps its unseen tail, and a re-sent start of the same turn opens no new reply. Unstamped frames from older engines keep the seq-only rule. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: carry the engine's clarify-batch contract test Port upstream v0.22.7's canonical clarify-batch test through Talyx's socket relay: prompt.submit carries clarify_batch only when client.capabilities advertises canonical_clarify_batch. The fake engine API now greets each socket with gateway.ready and can answer capabilities as an older engine. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: run on engine 0.22.7 Raise the expected engine to 0.22.7 (the minimum and the tested version), pin the new install file hash, and move the tests, fixtures and README to match. The old-after fixture now mirrors an engine one release below the pin (0.22.5). Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep the landing demo and fixture notes on engine 0.22.7 The website demo's engine status now takes the expected version instead of a literal, so it never shows the older-engine notice after a bump. Fixture comments and README reworded. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: engine 0.22.7, setup installs it, smoke before engine bumps README: setup screen installs and links the engine; the smoke test runs before an engine bump. CLAUDE.md: document test:smoke and tests/smoke/. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: check the engine calls Talyx really makes The smoke suite's REST check split into roster (unscoped /api/profiles) and providers (the four reads loadProviders makes, scoped to default); routines now go through cron.manage like routines.ts instead of REST. Rooms protocol is pinned to 2, seen on engine 0.22.7. Failures name the REST call or RPC method. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: name the HTTP status of a failed smoke call A failed REST call in the smoke suite now reads `<METHOD> <path>: HTTP <status> <detail>`; other errors are unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: close the final review findings on engine updates Always open the latest Talyx release for a newer engine, add Continue anyway to the still-older screen, show a specific message when no installed engine is found, keep the page mounted when the older-engine notice comes and goes, and make the smoke summary visible on a passing run. Also: login-shell comment, README engine wording, demo engine path, smoke service-unit check ignores a stray HOME. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: read release highlights and pick the installer for this computer Parse the Highlights and What's Changed sections of the release body, pick the installer for the running platform and arch, and drop assets that are not served from the Talyx repository. A release is downloadable only with both an installer and SHA256SUMS. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: download and verify a Talyx update in the app Main keeps one UpdateState, broadcast on updater:state: it downloads the installer it picked to the downloads folder, checks it against the release's SHA256SUMS before giving it its name, and opens it only when verified. pickAsset no longer guesses another architecture's file. Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: put release highlights at the top of the draft release release.sh reads the gitignored release-highlights.md, warns on lines the update button cannot parse, and passes it as --notes-file next to --generate-notes so the highlights sit above GitHub's generated notes. Without the file it warns and keeps the generated notes only. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: one footer button for Talyx and engine updates The footer's refresh gives way to an update button while a Talyx release or an engine older than the pin is pending (engine first). Hover or click opens a popover with each item and its action: download, cancel, open the installer, try again, the release page, or install the engine through the gate's install screens. The older-engine notice, the update row and the toast are gone. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: leave the engine install screens when an install is cancelled The gate's install request now also clears when an install the screen saw ends in a cancel, so the gate shows the chat or the missing-engine screen again. The update button's name says its state, and isEngineCurrent moves to the shared engine module for both features. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: click through the update button on the fixture Add ?update=<mode> to the roster fixture: the app's sidebar footer with a scripted updater double (timed download, checksum failure, no installer, older engine) and README notes. The old-after rows no longer describe the removed older-engine notice. Co-Authored-By: Claude Opus 5.5 <[email protected]> * test: stub the log call and scope the window.open fake on the fixture Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: harden the update download and the open-installer failure path A failed Open the installer moves the state to failed instead of staying ready, with domain errors in place of generic ones. The size cap is injectable and tested, the response reader is cancelled when a write or hash step fails, and release asset URLs are compared in normalised form so dot segments cannot leave the repository prefix. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: describe the in-app update download and its SHA-256 check Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: show the engine in Settings Settings opens with an Engine section: state, version, the path it runs, the restart hint for a stale gateway, Check again, Choose file, and an Install or Update button that hands off to the engine gate. The pure engineSummary in features/setup decides what shows. Co-Authored-By: Claude Opus 5.5 <[email protected]> * feat: start Talyx at login Settings gets a Startup switch. macOS uses the login item API; Linux writes or removes ~/.config/autostart/talyx.desktop. The setting is stored as launchAtLogin, applied by main before it is saved (a refusal keeps the old value and rejects), and re-read from the OS on launch of a packaged build. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: escape the autostart Exec path at both levels The Exec value is quoted and then string-escaped, so a backslash is doubled on top of the quoting rule. A path with a control character is refused, and the Startup switch hides on platforms without a login item. Co-Authored-By: Claude Opus 5.5 <[email protected]> * chore: Talyx 1.0.0 with Linux builds Bump to 1.0.0, add Linux AppImage and deb (x64) targets and build:linux, and update the docs. Built both targets locally on macOS. Co-Authored-By: Claude Opus 5.5 <[email protected]> * ci: build and draft releases on GitHub Actions The Release workflow builds the macOS DMGs and the Linux AppImage and deb, runs the real-engine smoke test on Linux, and drafts v<version> with the install file and SHA256SUMS. The install-file check and highlights helper move to scripts/release-lib.sh, shared with release.sh. Adds the 1.0 release notes and documents the workflow and its secret. Co-Authored-By: Claude Opus 5.5 <[email protected]> * ci: share the secret step and pin the release actions write_install_file_from_secret in release-lib.sh replaces the step copied into three jobs. Actions are pinned to commit SHAs, checkouts keep no credentials, and CLAUDE.md's release paragraphs are grouped. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: make the Linux update executable and save the OS's login-item state The AppImage is chmod 755 before it is shown in its folder. Launch at login saves what the OS reports, an enabled Linux entry is rewritten at launch so Exec follows a moved AppImage, and Settings has one Check again button. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: fix stale Windows, privacy and settings text; release.sh adds the notes A local release now has the same body as the workflow: highlights, the fixed notes, then generated notes. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: CONTRIBUTING says 1.0 runs on macOS and Linux Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix: keep the landing demo working and update deb installs from the release page - The website demo reads the update state on mount; its fake API now answers it. - On Linux only an AppImage downloads in the app; a deb install gets the release page. - A same-version release whose assets or notes changed refreshes an idle update state. - CLAUDE.md lists setup, the update button and the new main files. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: say deb installs update from the release page Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> * docs: work lands on main now that the pivot is done Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Fable 5.1 <[email protected]>
After PR 9 the app looked right but did not hold up: dialogs were cut off in small windows, focus fell to the page after a dialog or card closed, error text was hard to read and said nothing about what to do, and the sidebar and roster had rough edges in daily use. This is the finishing-touches branch: it fixes the interface audit, the review changes on top of it, and error handling across the app.
Interface audit
Sidebar and roster
+sits in the title row; pinned tiles stay put while the folders scroll; no layout shift when the scrollbar comes and goes.Error handling
confirm_required.~/Library/Logs/talyx/main.log) through a newlog:errorchannel. Logged: error text and IDs, never messages.settings.jsonis moved aside instead of overwritten, and settings are written all-or-nothing. A failed settings save shows a toast.Loading, empty states and motion
State
src/sharedhas its own tsconfig, assrc/rendererdoes, so the demo can bundle the sidebar constants.Checked on the synthetic roster fixture and read-only against the real app; typecheck, lint and 543 unit tests pass. Reviewed by Claude Opus 5.5 and Composer 2.5 (Cursor) over three rounds.
Created with Claude Opus 5.5 in Claude Code.
🤖 Generated with Claude Code