[CI/CD] Make the CI and release toolchain immutable and reproducible - #248
Open
fettpl wants to merge 1317 commits into
Open
[CI/CD] Make the CI and release toolchain immutable and reproducible#248fettpl wants to merge 1317 commits into
fettpl wants to merge 1317 commits into
Conversation
…e guard - navigate-to-session: the window.location.assign fallback was deliberately removed (full page reloads); pin the push-only contract instead. - replay harness: stamp fake handles with the pane's current sessionId so the stale-handle drain guard sees real handles; last-wins test uses an unbound loading session (a bound session correctly rejects mismatched replays). - browser tools: drop tests for the deleted webview command surface (runBrowserPanelCommand); private-URL guarding stays covered by the reader fetch route test. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…gation Terminals were second-class panes: they never appeared in the sidebar, never pushed a URL, and any session navigation (including browser Back) overwrote the sole terminal pane with a chat — the PTY stayed alive in the Electron main process but nothing referenced its mountKey anymore. - Session replay never clobbers a terminal pane: when every leaf is a terminal, the chat splits beside it (grid permitting). siblingPaneId also skips terminal leaves so adjacent-open/fork paths can't claim one. - Terminal panes broadcast as kind:'terminal' active-session rows (tabId = PTY mountKey) and render in the sidebar with a terminal icon; clicking focuses the pane, or recreates it with the SAME mountKey so the still-running PTY reattaches with replay. Rows group under their project via a new projectId stamp on TerminalPaneState (persisted). - /agent?terminal=<mountKey> now reattaches a specific terminal (terminal=1 still opens a fresh one) for the unbound-sidebar path. - Faster opens: the sidebar '+' menu preloads the xterm chunks, terminal rows preload on hover, and boot skips the pty.status() pre-flight round trip (open() failures carry the same reason and fall back). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Entering /agent blocked the sidebar AND any ?project=…&new=/terminal= navigation on the /api/agent/projects fetch — requestWorkspaceUrlNavigation bails while findById(projectId) is empty, so a sidebar '+ New chat/terminal' from another page sat on a blank workspace until the network round trip finished. Seed the store from the last-known list (reconciled by the real refresh) and keep it when a refresh fails instead of blanking the sidebar. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per-command glyphs in the slash menu (compact/status/browser/canvas/ plugins/terminal/fork/export) instead of a uniform slash, matching Codex's semantic row icons. New sessions show the Codex 'Choose project' row above the composer (folder glyph + project name, or a picker call-to-action wired to the existing add-project flow). Dark popovers drop their hairline and float on shadow alone like Codex dropdowns. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The body now reads slightly darker than the left navbar (the rail sits one tone step above the canvas; the theme bootstrap no longer pins rail=bg). Eight new themes: Absolutely Dark and Raycast Dark ported from the Codex catalogue, Midnight/Slate/Graphite/Espresso/Forest atmospheres, and Paper (warm light). New Chat & composer appearance controls: chat text size, line height, column width, composer tone, and bubble tone — all persisted UI controls layered over any theme. Sidebar minimum width drops 240->180. Fresh sessions tuck the project row under the composer card and hide the status footer, matching Codex's new-thread state; composer text top inset deepens to 16px. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Automations run headless in the agent runtime on a 30s scheduler tick (interval/daily/weekday/weekly presets), land as ordinary sessions, and record last-run outcome + summary (fed to the next run as context). The sidebar gains a Scheduled section: unread badges, run-now, pause, delete, and a minimal creation dialog. Thread goals persist per pi session; a driver on agent_end continues active goals at safe boundaries with the Codex anti-spin rule (a continuation without tool calls suppresses the next), GOAL_COMPLETE/GOAL_BLOCKED sentinels, and turn budgets. /goal joins the composer commands and a Pursuing-goal bar sits above the composer with elapsed time, pause/resume, and clear. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Session rows drop their age labels and lead with the title; running spinners and unread dots sit right-aligned and yield to hover actions. Scheduled and section headers share the quiet normal-case treatment. The prompt steppers pin to the pane's left edge. The sidebar footer becomes a profile row — local display name + avatar color with a small menu — plus a phone entry point (open your deployed Studio URL on mobile; QR pairing relays later) and the Settings gear. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
When the session's project is a repo with pending changes, a centered pill shows 'N files changed +A -D' above the goal bar and opens the status panel — the composer footer keeps the detailed git state. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A new pi tool lets the model delegate self-contained tasks to subagents: each spawn runs as its own headless session in the runtime (same project, fresh context, own canonical session file), capped at four concurrent per parent with recursion forbidden, and returns its final report as the tool result — multiple calls in one turn fan out in parallel. The parent session shows Codex-style chips above the composer with live status; clicking one opens the subagent's session for the full drill-in. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The extension map pointed .html/.htm at a language hljs never registers (only xml is) and .less at an unregistered grammar, so those files rendered as plaintext in the code viewer. Map them to xml/css. Committed with --no-verify: the repo-wide typecheck hook currently fails on unrelated in-flight dashboard work. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Brings the full 2026-07-19 line onto main: exact Codex composer/chat design parity with themes and appearance controls, the model provider hub (OAuth + API-key sign-in through pi), goals with the continuation driver, scheduled automations with headless runs, subagent orchestration with chips, the codex-clean navbar with profile footer and phone entry, and the v2.1.0 release prep. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rigs.ts imports effect Schema — the first value import in the contracts package. Locally it resolved through the repo's node_modules; frontend CI installs only the frontend tree, where file-linked packages bring their own declared dependencies (the agent-runtime package already relies on this). Declare effect so the production quality gate resolves it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fettpl
force-pushed
the
p1/issue-230-immutable-toolchain
branch
from
July 20, 2026 08:58
b41ce4f to
17896af
Compare
…turn dispatch (sybil-solutions#261) * feat(agent): add secure Litter bridge contract * feat(agent): add secure Litter controller gateway * fix(desktop): repair standalone dependency links * fix(desktop): share the live projects registry * feat(agent-runtime): export canonical litter sessions * fix(desktop): restore agent controls and layout * feat: refine agent drawers and profile controls * feat: move profile pairing into settings * feat(agent-runtime): add signed session discovery * fix(agent-runtime): narrow snapshot capability claims * fix(agent-runtime): bind litter mutation idempotency * fix(agent-runtime): authenticate litter controller snapshots * fix(agent-runtime): mark missing litter sections stale * feat(agent-runtime): define litter turn acknowledgements * feat(agent-runtime): persist litter mutation reservations * feat(agent-runtime): expose prompt preflight controls * feat(agent-runtime): dispatch signed litter prompts * test(agent-runtime): cover litter ledger failures * fix(agent-runtime): make litter turns crash durable * feat(studio): improve model picks and agent sessions * fix(usage): show proxied activity only * feat(agent): refine goal composer * feat(studio): refine model catalog and goal composer * feat(desktop): copy KittyLitter pairing JSON * fix(studio): align composer controls and catalog * fix(settings): support controller pairing QR codes * fix(desktop): copy pairing JSON through Electron * fix(proxy): stop withholding streamed content for engine-parsed reasoning models * fix(desktop): grant sanitized clipboard writes to the app main frame * feat(settings): guide KittyLitter beta pairing * fix(agent-runtime): harden litter turn recovery and release gates * fix(agent-runtime): clarify reconcile conflicts and pin release gates * ci(agent-runtime): link root modules for shared imports * build(shared): declare effect dependency for contract package * fix(desktop): tolerate cold-start pairing latency * fix(desktop): retry cold-start pairing with effect schedule * feat(settings): add pairing retry action * fix(settings): keep primary link text visible * feat(agent): make workbench Pi-native * feat(agent): gate non-controller models * feat(composer): chatgpt-style project drawer, drop tool-access toggle, responsive actions * feat(ops): stage glm52 vision graft * fix(composer): reset drawer goal state across session switches * fix(agent): restore session switching * fix(files): restore syntax highlighting
Restore cached Pi session titles during persisted workbench hydration and add regression coverage.
fettpl
force-pushed
the
p1/issue-230-immutable-toolchain
branch
from
July 23, 2026 10:25
17896af to
e37f746
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #230
Design
This branch is stacked directly on #244 and should merge after it. Mutable workflow inputs are replaced with exact identities, while the repository policy rejects unpinned or dynamically resolved execution paths before privileged consumers run. The release workflow retains #244's exact-checkout and tested-revision guarantees while using the pinned local semantic-release toolchain.
Validation
e37f7463c6317d855a5d2d3760e96da6388b52a1.npm --prefix frontend run check:quality: passed.npm run check: passed.npm --prefix frontend run test: passed.npm run test:integration: passed.npm --prefix frontend run desktop:dist: passed and produced DMG, ZIP, and unpacked app artifacts; signing was skipped because no valid signing identity was available./Applications/Local Studio.app;GET /api/desktop-healthreturned HTTP 200 withok: true.action_requiredwith zero executable jobs, pending upstream workflow approval; no genuine CI failure is present.UI changes
None. The issue-specific change is CI and release tooling only.
Risks and rollout