Repository navigation
Star Hike floor with per agent looks, a Codex folder OK, and fixes - #763
Open
chaitanyagiri wants to merge 43 commits into
Open
chaitanyagiri wants to merge 43 commits into
chaitanyagiri wants to merge 43 commits into
Conversation
… resize A pty resize is not free on the other end: Codex answers any change of rows or cols by replaying its whole transcript, and the terminal's host changes height whenever the composer under it does, as well as on every tick of a window or splitter drag. Every renderer side resize now goes through one coalescer per pty (ptyResizeCoalescer.ts): the pty is told only once the grid has been quiet for 150 ms, and only if the settled grid differs from the one the burst started from. A disposed terminal drops its pending resize. The font size refit compares the grid before and after, like the other fits. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A native select takes the app's text colour, near-white in the dark theme, but Chromium painted its box and its option list from the light UA scheme the app pins, so the dark theme showed white text on white. The dark theme now declares the dark UA scheme, and every select, option and optgroup takes its surface and text from the theme tokens (paper-100, ink-900; a disabled option ink-500), matching the other inputs in both themes. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A coffee break ends with the mug carried home, and an agent that is still idle then gets up and wanders. A wandering agent is not seated, so the café picked it straight back up: a lone idle agent did nothing but walk to coffee and back. After a break ends or is cut short the agent now rests 3 to 5 minutes before the café may take it again (coffeeGap.ts). Errands and the rest of desk life are unchanged. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
…window React unmounts the whole root on an error no boundary catches, so one broken panel blanked the window while main and the agents went on running. ErrorBoundary draws what failed in place of its children, as Pam's P7 draws it (Classic): an "error" tag, a plain line, the error as the code gives it, and a way back. A panel boundary offers "Try again" and draws its children again; the root boundary (main.tsx) offers "Reload the window". That reload sets the one shot flag a project switch leaves, so it lands back on the open project, where the hive keeps the agents still running. The error is written to the console. Strings, en, ar, zh-CN (new): error.tag, error.app, error.panel, error.tryAgain, error.reload. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
Git for Windows' `worktree remove --force` deletes through a junction, so a worktree's linked node_modules could empty the folder it points to. removeWorktree now removes every link inside as a link first, and refuses (nothing touched, the links already removed counted) when the path is itself a link, cannot be read, is not a linked worktree of the repository, or holds a link or folder that cannot be removed or read. A refusal is written to the hive log once (worktree-removal-refused), and the worker cleanup stops retrying it until the app starts again. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
…acing it A config.json, registry.json or tasks.json that did not parse was read as empty or as the defaults, and the next write saved that over the person's settings, agents or cards. Now each is read through damagedFile: - Damaged (does not parse, or is not a JSON object): kept as it is, the text judged copied aside once per spell as <name>.damaged-<local time>, and writes to it pause. A config or agent list write is skipped and logged once; a board write is refused with a message to repair and retry. - Not readable just now (busy, locked): no damage and no copy. This run's last good value is used (a copy); with none yet it is read 3 more times, 50 ms apart, once per spell. A board write says to try again. integrity:issues lists damaged files by name, with their copies, for a banner; integrity:reveal shows a listed one in the file manager by name only. The task IPC and voice task actions return a refusal instead of throwing. Board writes are atomic now. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
… capped Each hive Codex agent's own config.toml is a copy of the person's. The copy now turns every enabled plugin off (each adds its tools, skills and instructions to every request, none of which a hive coding agent uses) and caps each tool output the model sees at 4000 tokens (tool_output_token_limit, replacing a top-level value in the seed). Line based, so the person's comments and other keys stay; their own ~/.codex/config.toml is only read. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
The app can run on the CPU for anyone without a usable GPU, and prefer
the GPU when one is there. The mode is saved in config.json
(graphicsMode) and read once at startup, before app ready, with a plain
read: a missing or damaged config.json is Auto. CPU only turns hardware
acceleration off for the run; GPU only changes the floors' WebGL power
preference; a change applies after a restart.
graphics:status gives the mode in force, the saved one, Chromium's GPU
compositing and how many agent terminals a restart would stop;
graphics:setMode saves; graphics:restart relaunches through the normal
teardown. A 'graphics' row goes to the hive log once Chromium knows.
shared/graphicsMode.renderingState gives the indicator a kind for keyed
words (gpu with its name, cpu, fallback under auto or gpu, unknown)
instead of English text. gpuNameOf reads macOS's ANGLE Metal string as
the GPU's name ("Apple M2 Pro"), where the general form read "ANGLE".
Ported from Prozzta/guppyos 02d0d50 (MIT)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The second floor's theme id, 'starhike', joins the officeTheme type in config.ts and the voice settings list in realtimeActions.ts, so the theme picker can save it and voice can set it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ript The terminal's scrollback is not a record of the conversation (resizes and replays repaint it), so a History tab can read the CLI's own transcript instead: hive:history gives one bounded page of an agent's conversation (Claude Code, Codex, Antigravity), as short normalised items with byte offset cursors for older pages and following new lines. The window names an agent id, never a path. Main finds the transcript from the hook's transcript_path or the registry session id, and uses a path only where it resolves, links followed, inside that engine's own store (Claude's projects folder, the agent's CODEX_HOME and the session folders it links to, Antigravity's brain folder). A Codex agent with a session id is only ever shown that session's rollout; the newest rollout is a guess made only for an agent with none. A found file is kept per agent; a miss is looked up again after 3 s. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A bare TOML key is only letters, digits, '_' and '-'. The plugin header pattern also took '.' and '@', so [plugins.browser.settings] matched as a plugin named "browser.settings": an enabled = true in it was flipped, and a sub-table with no enabled key got enabled = false inserted. Bare names are now [A-Za-z0-9_-]+; quoted names are unchanged. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A theme pack is data only (theme.json, a Tiled map, tilesets, a crew sheet, crew lines), bundled from themes/<id> by an import.meta glob and drawn by the stations floor in scene/themes. OfficeFloor dispatches: a usable stations pack draws StationFloor, anything else draws the office exactly as before. A pack that cannot load shows the office with one line over it; the reasons go to the console. - scene/themes: the stations engine (manifest, Tiled reader, compositor, crew, seats, coffee props, bubbles, panels, static cache, damage tracking, framing). The cloud is its own file (stationBubble.ts), so the office keeps its own ThoughtBubble. - No colour override block: uiTokens is left out of the manifest, the catalogue and the pack. - Fed no liveness and no heavy lock yet: each agent shows its own status. - Camera: optional frame and settle; with neither, the office is fitted as before. - themeRegistry: ThemeId is a built-in or a pack id; getTheme reads own keys only. The picker stays on the built-ins until main knows the id. - Agent.appearanceByTheme (type only): nothing sets it yet, so every agent shows the pack's default look. - themes/starhike: the pack, with LICENSE-ARTWORK.md verbatim. Credit in README, LICENSE-ASSETS and assets/ATTRIBUTION.md. - New key stationFloor.packFailed in en, ar and zh-CN. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
The second floor's theme id, 'starhike', joins the officeTheme type in config.ts and the voice settings list in realtimeActions.ts, so the theme picker can save it and voice can set it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The window wrote a card's whole humanQA list from a copy up to 5 s old, so an entry the god added since was undone. Main now answers or dismisses ONE entry, the one the card showed, on the latest tasks.json: - hive:answerQuestion and hive:answerQuestions (Dismiss all in one write). A request names the question by q and askedAt, else q and its position; an answer also carries the option labels the card showed. A question that changed or closed, or a done card, is 'gone' and nothing is written. No text and no pick, or several picks without "multi": true, is 'invalid'. - An answer is sent once it is saved; main sends the god's notice, and a notice that fails is logged, never reported as not sent. - src/shared/humanQuestion.ts: options (up to 8, a recommended one, single or multi pick, a note), openQuestion, the text-only closed rule (only an answer with text or a dismissal closes an entry) and the done card (asks nothing), for the window to share. - The PROTOCOL and the god prompt describe options, recommended and multi, and say to append a new entry rather than change one already asked. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
One global officeTheme meant switching the floor in one project switched it in all of them. Main now keeps a map, officeThemeByHive, keyed by each project's home folder: - A project with no entry shows the global theme it showed before, so nothing moves on upgrade. An entry for a pack this build lacks is kept and falls back at render. - config:setProjectTheme saves the current project's theme, then reads it back: a damaged or busy config.json answers 'not-saved' with the theme still in force. Main merges the map, so two windows cannot erase each other's choice. - A Windows path, drive or UNC, matches whatever its case; a POSIX path keeps its case. - Moving the home folder takes the project's theme with it; a new project in a reused folder does not inherit an old entry. - Voice sets the current project's theme, never the global key, from the themes the picker offers, and says so when the save could not be made. - src/shared/projectTheme.ts: the catalogue, registerPackThemes for theme packs, resolveProjectTheme and floorSceneTheme, for the window to share. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
Main had no render-process-gone handler, so when a window's view died the window stayed blank while the agents went on running. Now: - Main reloads the view and keeps a one shot notice for that window (window:takeRecoveryNotice): when, Electron's reason, and the streak. The window shows its own words for the reason. - The reloaded page's preload reads window:recoveringSync once, so it opens on the live project rather than the launch hive picker. - A view that dies three times within 60 s stays down instead of reloading in a loop; each death is logged as render-process-gone. - With the view down, closing the window or quitting asks natively, the same choice the page's quit modal gives, so the app can still be quit. - window:reloadAfterError: the root error boundary's reload, through main, so that page also says it was restored. A reload only: no recreated window and no memory or crash dump tracking. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
Every hive Codex start passes --dangerously-bypass-hook-trust, so a project .codex that Codex loads runs with no review: its MCP servers start with the agent and its hooks run on the first turn. Main now checks before every hive Codex start (first, resume, respawn) and holds the start until the person allows the folder: - Held when a project .codex carries MCP servers, hooks (config.toml or hooks.json), command rules, or a file that cannot be read or does not parse. Confinement keys alone start. Fail safe: every .codex from the agent's folder up counts, whatever the person's own trust list says, and for a linked worktree the main checkout's hooks count too. The agent's own CODEX_HOME and the person's ~/.codex are not project layers. - The OK is per folder, spelled as in the main checkout, so one OK covers every worktree of that project; withdrawing removes it. Saved and read back: a damaged config.json answers 'not-saved'. - The check runs before any worktree is made, so a held start leaves nothing behind. The spawn answers with codexHold; codexHold:list and a push give the card its notices, with what each layer carries as ids; codexHold:allow, dismiss, allowed and withdraw serve the card and Settings. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A wake typed into Codex's folder-trust screen, where `n` means Quit. Before an automatic write to a Codex terminal, the window now reads its screen (src/shared/codexScreen.ts) and holds on every screen it can name: - the startup draft (the session header still shows `model: loading`, or a resume is starting): trust, sign in and the update prompt come then; - a popup or selection list at the bottom (a key hint, a selected choice, a header): folder trust, approvals, rate limits, pickers; - a footer a keystroke owns (`again to quit`, `esc close`, ...). The queue waits on such a screen and never counts it as a failed send; a write already under way waits up to 60 s, then fails rather than type. The app never answers a popup. A screen it cannot name is typed into as before: the strict "only the exact empty composer" rule is Codex 0.157's model, and on the 0.153 line a second placeholder, a header scrolled out of the buffer or a footer without the status line would hold every delivery for good. Limits: a terminal never opened has no screen to read, and main's inbox watchdog types without one, both as before. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
The preload HarnessConfig.officeTheme still listed only the six TV-show ids, so the theme picker could not save 'starhike' through updateConfig. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Star Hike's seed gives the orchestrator a look and no name on purpose, so the person's own orchestrator keeps its nickname. isProjectThemeSeed required a name, so registerPackThemes dropped the seed. A name is now optional: when given, and the body id always, a non-blank string of at most 40 characters, the manifest's own rule. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
The preload HarnessConfig.officeTheme still listed only the six TV-show ids, so the theme picker could not save 'starhike' through updateConfig. Co-Authored-By: Claude Opus 5.5 <[email protected]>
A wake typed into a /side conversation's empty composer went into the side
thread, not the agent's turn: hold it ('side-conversation'), read from the
lowest row that starts with '› ' being Codex's SIDE_PLACEHOLDER.
The import screen ('Bring over supported setup from another coding agent')
has a list form hint, '<key> to move, <key> to select, c to customize', and
toggle rows ('› [x] MCP servers'), so neither step was read as a popup and
the wake was typed into it. A comma list of two or more '<key> to <verb>'
items counts as a hint on the last non empty row only, since prose has the
same shape; a '[mark] ' toggle with any mark counts as a choice.
Ported from Prozzta/guppyos 02d0d50 (MIT)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- The picker shows The Office and Star Hike always; the five TV-show
floors join the list only while their switch is on, and the switch
row now sits under the cards. Star Hike's card carries the art
credit, a link that opens in the browser.
- floorSceneTheme(id, tvShowOffices): a pack always draws its own
floor, a TV-show map only with the switch on, anything else the
office. App start and the picker both use it.
- manifest: "credit" {text, url} is a known key. The url must be https;
anything else is ignored with a warning. It reaches the catalogue
entry the picker reads.
- manifest: projectDefaults.orchestrator.name is optional. When given
it is still a short string; without it the seed is a look only, so
the orchestrator keeps its own name. Star Hike loads with no warning.
- store/config: officeTheme accepts 'starhike'.
- officeTheme.desc reworded in en, ar and zh-CN.
Ported from Prozzta/guppyos 02d0d50 (MIT)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- On a pack floor whose pack has a builder, the Character row becomes the look builder: body, skin, shirt and hair colours, a custom colour per part, presets, and a live preview. The Office and the TV-show floors keep the character grid. - Add Agent on a pack floor starts with an empty name; a preset fills it only while it is still empty. The hire keeps the look it previewed. - Edit Agent never renames, and saves the look only when it is changed there. - SpritePortrait paints the pack look for an agent, a draft or the sample; with a character alone it stays the Office character. While a pack is loading it paints nothing. - useHive keeps the orchestrator's looks across its respawn at start. - appearanceByTheme is saved with the roster. - New keys looks.title, looks.sub, looks.body, looks.colours, looks.skin, looks.shirt, looks.hair, looks.custom, looks.presets and addAgent.sections.identity.hintPack in en, ar and zh-CN. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
…rst look - AgentCard takes the agent's id and looks. On a pack floor the portrait tile shows the figure the floor draws for that agent, from the same resolver, in the same tile. On the Office, or when the pack cannot load, it keeps the Office character; while the pack loads the tile stays empty. AgentStrip passes both. - useOrchestratorThemeLook: an orchestrator with no look on the active pack gets the pack's seed look once, stored like any other look and editable. Its name is never touched. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
…inement, and on the made worktree
Three gaps where a hive Codex start ran project settings unreviewed:
- Codex also loads .codex/agents/ (a role file can carry mcp_servers) and
.codex/hooks/. Every entry of either counts ('agents', 'hooks'), and an
unreadable folder holds. In a linked worktree, hooks/ is read from the
main checkout too, like hooks.json. Past 20 entries, one item counts the
rest ('more').
- Only sandbox_mode and approval_policy are overridden by the agent's own
--sandbox and --ask-for-approval. Every other config.toml key holds and is
named ('setting'): shell_environment_policy sets the environment of every
command, sandbox_workspace_write and permissions widen access, notify runs
a program after every turn.
- The first check runs on the cwd before the worktree is made, but the
worktree is the base branch's committed tree. The made worktree is
checked once more before Codex starts; a hold takes the worktree back and
then returns the same hold, keyed by the folder the person started in.
Ported from Prozzta/guppyos 02d0d50 (MIT)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The window half (the stations floor and the Star Hike pack, the floor picker, pack looks for agents) joins the main half, so main can register the bundled theme packs with the window's own manifest validator. Conflicts, resolved to the main half's per project themes: - config.ts, preload: officeTheme stays the fallback theme beside officeThemeByHive (one 'starhike' kept in the preload union). - realtimeActions.ts: officeTheme stays out of SETTING_POLICY; voice sets the current project's theme (setThemeByVoice). - terminalPool.ts: both imports kept (codexScreen and ptyResizeCoalescer). Co-Authored-By: Claude Opus 5.5 <[email protected]>
…wn validator main/packThemes.ts reads every themes/<dir>/theme.json into the main bundle and registers the packs as project themes before any config is read (the first import of index.ts). main/packThemeEntries.ts keeps only manifests that pass the window's validateManifest, folders in name order, the first pack of an id winning, so main accepts a pack id exactly when the window does. The orchestrator seed is the validated manifest's; Star Hike's has no name, so it is a look only. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
…hen nothing is on it After the second check holds, the worktree is taken back but its agent/<slug> branch stayed, so the start after an Allow could not make its worktree again and ran in the shared folder. The worktree's branch is read before the take back; after removeWorktree succeeds it is deleted only when it is the app's name for that path, is not the base, and git rev-list --count <base>..<branch> gives 0 (counted against the base, not HEAD, which a detached main checkout does not point at). A count git cannot give, or anything ahead, keeps it. Teardown and respawn are as before. Co-Authored-By: Claude Opus 5.5 <[email protected]>
P2: the window picks a new project's floor before "create project", but a
fresh home change relaunches the app, so it cannot save the theme after.
changeHome(newHome, 'fresh', projectTheme) now takes it: the theme must be
a known id ('invalid-theme' otherwise) and the folder missing or holding
nothing but .DS_Store ('not-empty', or 'unreadable' when it cannot be read
as a folder); then the new home's entry in officeThemeByHive is that theme.
A move ignores it and keeps its own. The pack's orchestrator seed stays
with the window.
Ported from Prozzta/guppyos 02d0d50 (MIT)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ch keeps every agent - App start sets the floor from this project's theme: its own entry, else the global one (resolveProjectTheme), then floorSceneTheme from shared/projectTheme. The window's own copy of that rule is gone. - The window registers the valid bundled packs as project themes: the catalogue's first load does it, before first render. - Office Theme in Settings: a line names the project; The Office and the packs are always listed, the TV-show floors while their switch is on. A pick waits for Save, with a "switches on Save" chip and one line saying what Save does. The delete dialog and its kill and archive flow are gone: every agent stays, only the look changes. - Save stores the pick for this project through setProjectTheme and shows the theme main reads back. When it could not be stored (the settings file damaged or busy), the old floor stays and one line says so. - New keys officeTheme.onSave, officeTheme.forProject, officeTheme.keepsAgents and officeTheme.notSaved in en, ar and zh-CN. The twelve keys only the delete dialog used are removed. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A new project, from the folder picker or from Settings' Start fresh, now asks which floor it gets: the Office or a theme pack. Each row shows the floor and the orchestrator who starts there; the choice goes to main with the fresh start. A folder main refuses (not empty, or it cannot be read) shows in a row under the list and create waits, and Settings keeps its local state until main has said yes. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
When main holds a Codex start because the folder carries its own .codex settings, the window now shows what was found there and asks. The card lists each folder with one row per kind of file and words on what that kind can do, then allow or not now. It shows in Add Agent in place of the error line, and over a held agent's own terminal; allow records the folder and starts the agent again. Settings, Agents & Models lists the starts waiting for an OK and the folders allowed, with withdraw. Restore team says a held agent waits in Settings instead of printing main's reason. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A question with options now shows them as a list to pick from: one pick or several, the recommended one tagged, a short detail under each. The button names the answer before it is sent, and a note can go with the picks. Each question carries a kind tag and when it was asked, with its first line as a bold headline. Answers and dismisses go through main with the question they were made for. When the question changed or closed first, the answer is not sent: the card says so and keeps what was written to copy, and a closed card stays in its place, read only, until dismissed. The office floor counts open questions by the same rule. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
After the window recovers on its own, a small notice says when it happened, with OK to close it. While main holds config.json, tasks.json or registry.json as damaged, a banner names the file, says changes to it are paused, names the copy main kept when there is one, and offers to show the file; it goes once the file reads again. Settings says why Save is off while config.json is paused. The error screen's reload asks main to reload the window. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
The question's headline, body, option text, answer box and kept text set their direction from their own text only when the window is in Arabic, as every other content site does, so an English card never flips on a line of Arabic. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
Settings, General, Environment gets a Graphics row: Auto, GPU or CPU only, kept by Save like the other rows. A line under it names what draws the app now: the graphics card by name, the processor, or the processor because no graphics card worked. A saved change applies after a restart; the row offers one and asks first when agents are running. When the mode does not save, the row says nothing changed. The floors ask for the faster graphics card under GPU and note the card they got, for that line. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
A History tab after Terminal shows the agent's own record of its session, read only, and follows new turns. Prompts and replies sit in boxes with an even 1px border and a PROMPT or REPLY chip; a compacted or checkpoint line is a rule with its words in the middle, and a slash command shows its name in code type. Load older sits at the top, Jump to latest shows when scrolled up, and the footer names the engine the record comes from. An engine that keeps no record, an agent with nothing yet, and a record that does not read each get their own line. A render error stays inside the tab's error box. Below 520px the closed tabs show their icon only. Text from the record takes dir auto only in Arabic; tool lines stay left to right. New words in en, ar and zh-CN: sidebar.history, history.*, and where.history for the error box. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ten in
The locale test wants the same key tree in every language and every
interpolation variable kept in translation. graphics.confirm_one was missing
in zh-CN, and its English form carried {{count}} while the Arabic one form
says the number in words. As with codexLayer.more_one, the one form now says
1 with nothing to fill in: English writes 1, Arabic is unchanged, and zh-CN
keeps the key with 1 written in so the key trees stay equal.
Ported from Prozzta/guppyos 02d0d50 (MIT)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…d, Ask Me options, History, Graphics and the failure notices Tests for this branch's changes: worktree removal through links, damaged files kept, Codex agent config and screen reading, held Codex starts and their card, Ask Me options in main and the window, view recovery and the notices, the Graphics mode and its row, History in main and the tab, the stations floor, looks on cards, the floor picker and a new project's floor, dark dropdowns, the coffee rest, the error box and terminal resizes. Two existing tests follow the new code: Ask Me answers through main's one question call, and the Arabic direction check covers AskMeQuestion. Co-Authored-By: Claude Opus 5.5 <[email protected]>
removeWorktree now says how many links it removed as links before the worktree went; the node_modules link counts as one. Co-Authored-By: Claude Opus 5.5 <[email protected]>
On a theme pack floor the agent card and the floor drew an agent's picked look, but the detail header, the Command Center header, its agent list, its closed agents list and the focus mode sidebar row still drew the Office character. Those five now pass the agent, as the card does, so the same agent looks the same everywhere. Size and tile are unchanged. Pickers, Add and Edit Agent, onboarding and the look builder stay as they are. No new words. Ported from Prozzta/guppyos 02d0d50 (MIT) Co-Authored-By: Claude Opus 5.5 <[email protected]>
The detail header, the Command Center header, its agent list and archived list, and the focus mode sidebar row hand SpritePortrait the agent's id, character and looks, as the card does; pickers still pass a character alone. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This branch has not been deployed
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.
What & why
This brings a second office floor, Star Hike, to Community, with a set of fixes and small features that land with it. They are in one PR on purpose, so they can be checked and merged together.
Star Hike floor. A starship bridge floor drawn from a theme pack, beside The Office. Each project keeps its own floor, picked in Settings (Save is the confirm) or when a new project starts. A floor switch keeps every agent: names, memory and work stay, only the look changes. In Add Agent and Edit Agent an agent gets its own look for the pack floor. Every portrait of an agent (its card, the strip, the detail header, the Command Center and the focus mode sidebar) draws the same figure as the floor. The art and the map are Artwork by Prozzta (https://github.com/Prozzta/guppyos), under the pack's own licence, credited in the floor picker, the pack's theme.json and LICENSE-ARTWORK.md,
src/renderer/src/assets/ATTRIBUTION.md, LICENSE-ASSETS and the README. The ported commits carry "Ported from Prozzta/guppyos 02d0d50 (MIT)".Behaviour changes
.codexholds its own settings, rules, hooks or agents waits for an OK first. Add Agent shows a card in place of the error line, with one row per kind of file found there and what that kind can do; "allow this folder and start" records the folder and starts the agent, "not now" keeps the dialog with what was typed. One OK covers the project's worktrees. A held agent's own terminal shows the same card. Settings, Agents & Models lists the starts waiting for an OK and the folders allowed, with withdraw.Small features and fixes
Type of change
Evidence
Both builds ran on their own empty user data folder, with the same two agents: the orchestrator and Pia, a
/bin/catagent in a scratch folder. Same window size.Before
main, light: The Office floor, the orchestrator and Pia, their cards and the strip.main, dark.main, Settings: the office theme section offers TV show floors only.After
This branch, light: the project switched to Star Hike in Settings. Pia was given its own look in Add Agent (top bun, violet shirt); the floor, its card, the strip and the detail header draw the same figure, and the orchestrator wears the pack's captain look. The panel shows the HISTORY tab with the other tabs folded to icons.
This branch, dark.
Settings: the Graphics row says what is drawing the app; the floor picker shows Star Hike as current, with its credit.
Add Agent with a Codex agent in a folder whose
.codexhas its own settings and a rules file: the start waits on the card. "not now" kept the dialog open with the name typed, and no Codex process started.How I tested it
npm run typecheck,npm run check:links,node --test --test-concurrency=1 test/*.test.cjsandnpm run buildon this branch: typecheck clean, links check clean, 1157 tests with 1156 passing, 0 failing and 1 skipped, build passes.mainand this branch and ran each on its own empty user data folder (--user-data-dir), never a real one. On each: added the same/bin/catagent, took the shots above in light and dark. On this branch: picked Star Hike in Settings and saved, gave the agent a look in Add Agent, opened the HISTORY tab, and started a Codex agent in a folder with its own.codexup to the card, then pressed "not now" and cancelled.Limits
Credit (optional)
Discord:
X:
Checklist
npm run typecheckpasses.npm run test:focusedpasses.npm run buildsucceeds.commented-out code, or unrelated formatting churn in it.
DESIGN.md/tokens.ts— no ad-hoc colors,spacing, or fonts.
ATTRIBUTION.md.🤖 Generated with Claude Code