Skip to content

feat(sidebar): group inactive chats by project - #7

Closed
0xSolarPunk wants to merge 629 commits into
mainfrom
feat/inactive-project-sidebar-groups
Closed

0xSolarPunk wants to merge 629 commits into
mainfrom
feat/inactive-project-sidebar-groups

Conversation

@0xSolarPunk

Copy link
Copy Markdown
Owner

Before

  • In project-and-activity mode, inactive chats appeared in one flat cross-project section.
  • Folder context was repeated on each inactive row, without project-level collapse or reorder boundaries.

Before: inactive chats in one flat section

flowchart LR
    chats[Chats] --> active[Active project groups]
    chats --> inactive[Inactive section]
    inactive --> flat[Flat mixed project list]
    chats --> archived[Archived flat list]
Loading

After

  • Inactive chats now sit under Inactive and are grouped by project or folder.
  • Active and inactive project collapse state is independent, nested project grouping is retained, and reorder scopes stay within each inactive project.
  • Archived chats remain flat under Archived.

After: inactive chats grouped by project

flowchart LR
    chats[Chats] --> classify{Activity}
    classify --> active[Active project groups]
    classify --> inactive[Inactive section]
    inactive --> folders[Project or folder groups]
    classify --> archived[Archived flat list]
Loading

The row model now applies the existing project grouping context inside the Inactive section, with section-specific collapse keys and reorder scopes. Deterministic before and after screenshots document the visible behavior.

Files

  • Sidebar row model and virtual-row contracts
  • Sidebar collapse wiring and project header behavior
  • Regression coverage for grouping, nesting, collapse, sorting, and search transitions
  • Deterministic before and after screenshots

Tests

  • Focused sidebar suites: 93 passed
  • bun run check: passed; 0 Svelte errors and two existing warnings
  • bun run start --port 0: production build completed before the smoke timeout
  • git diff --check, impact, and scope checks: passed
  • bun run test: limited by the existing reader-worker v9 test timing out; no sidebar failure observed

Prompted by: yk (@chiayong)

cfal added 30 commits August 4, 2026 05:45
Unifies Git diff display settings with the responsive action menu so Compare, History, and Changes remain usable at narrow widths, with regression coverage for menu ordering and overflow behavior.
* Improve Garcon CLI discovery and metadata

* Preserve explicit chat titles during generation
* test(integration): add FakeChatCompletionsModel scripted model double

Scripted stand-in for the model behind real chat-completions CLIs. The
Chat Completions API is generic, not Pi-specific, so this double is written
for reuse: Pi consumes it now and opencode will later.

Mirrors FakeClaudeModel/FakeCodexModel semantics: a turn script queue with
held turns (response gated until release), request recording (user texts,
tool results), fault injection (http-error, stream-error), and cleanup
assertions (assertSettled fails on unconsumed turns, unreleased holds, or
recorded protocol violations). Outbound SSE conforms to the chunk sequence
the real Pi CLI parses (role delta, content/tool_calls deltas with index,
finish_reason, usage, [DONE]); inbound validation checks the conversation
contract while staying lenient about extra fields.

Script exhaustion responds 500 and records a violation so CLI auto-retry
terminates deterministically and cleanup fails on unexpected requests.

Verified against the real pinned pi binary: a tool-call turn and a final
reply complete with no violations.

* test(integration): add scripted Pi environment at the pinned CLI

Runs the real pinned Pi CLI against FakeChatCompletionsModel: models.json
points the CLI's openai-completions provider at the fake, so CLI behavior
(process lifecycle, local tool execution, session persistence) stays real
while every model choice is deterministic.

Isolation relies on the fixture HOME alone: both the spawned CLI and the
in-server SDK discovery resolve ~/.pi/agent inside the temp home, so the
user's real ~/.pi is never touched. The pi bin is a node shim, so the
fixture PATH gets the runner's node directory (same pattern live-codex.ts
already uses for the codex shim in CI).

Pins the integration-tests pi devDependency at 0.80.10 -- the version the
server currently ships -- so the baseline suite locks true current
behavior; the upgrade bumps it together with the server deps.

Provides scriptedPiStartRequest/scriptedPiRunRequest builders mirroring the
Claude/Codex live request helpers.

* test(integration): lock Pi JSON-transport baseline behavior

Suite A: 17 tests that pin every observable behavior of the current Pi
integration before the RPC transport switch. Written and green against the
0.80.10 CLI; they gate the upgrade and the switch.

Coverage:
- lifecycle: session identity established before the first turn settles
  (locked native-path shape), tool events precede terminal WS events,
  transcript/preview accumulation across turns on one session file,
  catalog model discovery and explicit-model requirement, single-query
  title generation through the untouched --mode text path
- queue: FIFO drain, pause/resume, duplicate clientRequestId, cancelled
  entries never reach the model
- stop: current Pi order is stopping -> idle -> stopped (differs from
  Claude's stopping -> stopped -> idle); locked explicitly. A stop before
  Pi persists anything leaves the next --session lookup unresolvable --
  that wart is deliberately not locked (the RPC runtime establishes
  identity before the first prompt)
- persistence: graceful/crash restart stability, whole-session fork
  isolation, provider-neutral transcript search
- failures: observed current contract -- a failed model request surfaces
  an ErrorMessage, the run still finishes, and the CLI makes three more
  orphaned auto-retry attempts (~15s apart, four total per process) that
  Garcon does not see; tests script all four attempts and drain them via
  an observable request count so retries cannot eat later scripted turns

Adds piNativeSession to scripted-pi support for workspace-registry
inspection, mirroring the fixture's direct-agent helpers.

* test(integration): allow clearing provoked fake-model protocol violations

Tests that deliberately exhaust the scripted queue (the failure suite's
wedge case) record violations on purpose; clearProtocolViolations lets
them reset the ledger before recovery assertions without touching the
script queue or pending holds.

* chore(pi): upgrade pinned Pi packages to 0.83.0

Bumps all four lockstep @earendil-works/pi-* dependencies in
server-agents/pi and the integration-tests CLI devDependency together, so
the scripted lane and the server SDK never form a version mix that does
not ship.

Upgrade gate results:
- Suite A (17 tests) green against the 0.83.0 CLI: no observable drift in
  lifecycle, queue, stop, persistence, search, or failure behavior
- root unit suites green (3441 tests), covering the Pi SDK surfaces the
  integration imports (model discovery, session parsing, fork)
- build-exe:compile and build-exe:smoke:linux-x64 pass with the new
  embedded pi-coding-agent package metadata

The only breaking change in the 0.80.10 -> 0.83.0 range is a bundled
TypeBox alias upgrade that affects Pi extensions, which Garcon does not
use.

* feat(pi): add long-lived RPC steering runtime

* test(integration): cover Pi RPC lifecycle and steering

* docs(pi): promote scripted integration tier

* test(integration): cover legacy Pi session resume
* fix(chat): serialize direct message admission

* fix(chat): harden direct admission gating
Harden OpenCode event-stream recovery and add hermetic real-binary scripted coverage without touching user configuration or sessions.
Expose provider-neutral chat snapshots and CLI status/wait commands so interrupted agent consultations can be observed and reattached without reading Garcon storage directly.
Hide the snippet template preview when constrained mobile space would crowd out the result list, and keep a dismissed inline trigger suppressed until its prefix is removed.
* Update TanStack Virtual for chat geometry fixes

* Establish stable chat feed projection identities

* Virtualize chat transcripts with durable interaction state

* Exercise virtual transcript behavior in browser tests

* Harden transcript page and permission projection

* Stabilize virtual transcript scroll operations

* Complete virtual feed resilience and browser coverage

* Harden transcript recovery and transient cleanup

* Stabilize virtual feed geometry and navigation

* Deduplicate live feed announcement lineages

* Serialize virtual feed navigation and layout settling

* Stabilize virtual feed announcements across hidden surfaces

* Strengthen virtual feed test isolation and mount assertions

* Prioritize explicit virtual feed navigation

* Wait for asynchronous chat layout before navigation

* Retain active permission announcement lineages

* Exercise target navigation during live appends

* Honor user intent across transcript navigation

* Incrementally reconcile deep chat feed tails

* Announce live responses from historical chat windows

* Exercise incremental deep feed reconciliation

* Preserve expanded transcript state during live replay

* Keep deep feed projection snapshots coherent

* Filter detached feed status by visible response type

* Preserve expanded transcript windows across transient rows

* Tighten feed response provenance coverage

* Narrow deep projection test row types

* Reset expanded windows on generation snapshots

* Reset cross-generation transcript visibility

* Stabilize virtual feed viewport geometry

* Isolate transcript virtualization browser scenarios

* Preserve virtual feed tails in constrained viewports

* Prioritize transcript jumps over visibility restore

* Stabilize transcript virtualization Chromium coverage

* Avoid reactive churn on duplicate transcript batches

* Batch streamed transcript announcements

* Prove virtual feed count shrink safety

* Expand and isolate transcript Chromium coverage

* Preserve transcript intent across virtual restores

* Prove virtual transcript interaction durability

* Prefetch transcript history and preserve the live edge

* Cover virtual transcript switching paging and reloads

* Remeasure virtual rows after transcript shrink

* Avoid unnecessary transcript fill probes

* Harden virtual transcript reload and switching

* Localize code block chat announcements

* Fix virtual feed remeasurement during scrolling

* Cover virtual feed compaction geometry

* Gate browser tests on the current web build

* Apply upstream TanStack stale measurement fix

* Remove the virtual feed count-shrink reset protocol

* Reject web builds with changing inputs

* Cover virtual feed controller lifecycle

* web/components/chat/__tests__: use synchronous virtualizer instance in tests

* Hold the chat feed paint gate through the staged initial reveal

Revealing after the first settled batch let every remaining reveal batch
re-anchor the end in plain view, and the overlay scrollbar thumb was never
gated at all, so chat switches flickered through intermediate scroll
positions and thumb sizes before settling at the bottom.

* Guard virtual feed hidden restores and cover cancellation paths

Explicit end scrolls and destroy now cancel the hidden reading offset per
the cancellation ledger, destroyed controllers no longer arm pending end
scrolls, and hidden-restore offset writes revalidate surface identity so a
replacement during an in-flight restore cannot scroll the new surface to
the old offset. Adds direct coverage for user-intent cancellation, the
detached text-scale anchor branch, single subscription teardown, and
projection count-shrink emitting no global reset.

* Strengthen Chromium transcript stability and switch-paint coverage

Samples every frame across chat switches to reject content painted away
from the physical end or visible through the initial paint gate, holds the
data revision across the stable-layout window, and adds pinned hide/show,
hidden text-scale, and post-shrink later-publication scenarios.

* Close build-gate coverage gaps

Gates the git-history Chromium suite on a current web build, fixes the
vacuous concurrent-change cache test, covers corrupt and wrong-version
build markers, tightens the build-cache type declarations, and renames the
stale Chromium workflow job label.

* Anchor pinned end restores before paint and drop the cache completeness probe

Pinned publications wrote their end correction one animation frame after
commit, painting a frame at the pre-mutation offset for every late history
chunk or streamed publication; the correction now lands after the sizer
commits but before paint, with the convergence loop verifying later frames.
The viewport-fill probe also treated itemSizeCache membership as proof of
measurement, so wrappers rendered exactly at their estimate probed forever;
rendered keys now resolve to their exact estimates.

* Reverify the pinned end after show and extract virtual anchor helpers

The pinned show path's end convergence can be superseded by a concurrent
show-time publication, stranding the viewport short of the physical end
after late measurements; the scroll controller now rechecks the end once
after fill and layout settle. Anchor capture and root-offset observation
move to the runtime module, and the Lightpanda paging test awaits the
initial paint gate instead of asserting instant readiness.

* Label stable-layout scenarios and bound the pinned show recheck loop

Settle diagnostics now name the failing scenario, and the show-time end
recheck retries across up to three layout-settle windows so deferred scale
invalidation that lands after the first recheck still converges.

* Repin the end after late root-offset changes and name settle scenarios

A root-offset change while pinned at the end moves the physical end outside
TanStack's anchoring with no repin owner; the margin observer now restores
the end when the viewport rested there. Stable-layout diagnostics carry the
failing scenario name inside the thrown error.

* patches/@TanStack%2Fvirtual-core@3.17.7.patch: fix virtualizer measuring stale elements after index shifts

* show full cached transcript immediately on chat switch

Remove the staged initial-reveal batching so activating a cached chat
publishes the bounded transcript window atomically; virtualization still
limits mounted row work.

Harden the TanStack virtual-core patch to ignore delayed in-range resize
entries whose stale index now resolves to a key owned by another connected
element, preventing misattributed row sizes during history prepends. Add
patch contract and geometry stability coverage.

* prefetch earlier transcript history while a turn is processing

* web/components/chat: preserve reading anchor and gate end restore on committed rows

* fix(web): stabilize virtual transcript geometry

* Declare virtual core test dependency

* Stabilize transcript generation geometry test

* Synchronize native transcript scale fixture
* Cover exact-once Codex Stop recovery

* Reconcile native and live messages by exact identity
* Stabilize detached transcript scrolling

* Extract virtual restore policy

* Gate virtual transcript reveal on viewport coverage
* Stabilize automatic chat history loading

* Fix Lightpanda history paging coverage
Allow garcon-cli to discover named workspace aliases that resolve to sibling workspace directories while retaining rejection of symlinks that escape the Garcon config root.
Git Compare now remembers the last successfully loaded symbolic range independently for each chat and selected repository or worktree during the current client session, restoring it after chat switches and view close/reopen while intentionally resetting after a page reload.
cfal and others added 28 commits September 6, 2026 06:39
* refactor(workspace): define responsive geometry policy

* feat(workspace): measure host geometry

* feat(workspace): enforce geometry-aware split admission

* fix(workspace): key directional split menu items

* feat(workspace): project undersized layouts compactly

* feat(workspace): bound partition resizing by usable geometry

* test(workspace): cover responsive window geometry in Chromium

* fix(workspace): preserve compact recovery focus

* fix(workspace): preflight keyed terminal splits

* test(workspace): stabilize geometry-dependent browser coverage

* test(workspace): size multi-window browser fixtures

* refactor(workspace): clarify responsive geometry decisions

* refactor(workspace): clarify compact presentation controls

* test(workspace): tighten responsive geometry harnesses

* test(workspace): align responsive fixtures with canonical layout

* test(workspace): respect split geometry in browser fixtures

* test(git): use split-capable Lightpanda viewports

* test(workspace): await fullscreen projection release

* test(workspace): retain canonical layout fixture assumptions

* style(workspace): format responsive window changes

* test(e2e): verify Lightpanda workspace geometry

* style(workspace): format visibility projections

* test(e2e): validate resized Lightpanda geometry

* fix(workspace): suspend hidden compact controllers

* fix(workspace): preserve compact navigation focus

* fix(workspace): stabilize compact presentation lifecycle

* fix(workspace): bound persisted window tabs

* fix(workspace): preserve bounded persisted layouts

* fix(workspace): retain focus when compact mode exits

* fix(workspace): resume controllers when compact host detaches

* refactor(workspace): simplify responsive policy plumbing

* fix(workspace): bound persisted terminal recovery

* feat(workspace): support eight windows and simplify compact navigation

* refactor(workspace): extract window tab state helpers

* feat(workspace): merge windows when the host becomes too small

Keep the current window and active tab, move portable tabs into it, and preserve chat drafts through the existing transfer path. Persist the reduced layout and reuse the existing tab overflow menu.

Remove compact projection and navigation machinery. Keep geometry admission, the eight-window ceiling, and bounded parsing with a workspace-wide tab budget.

* feat(workspace): add localized close all other windows action

* refactor(workspace): clarify window close guards and handlers
* perf(search): memoize sidebar search projections

* fix(search): preserve prefix revalidation signals

* feat(search): add compact prefix projections

* perf(search): use compact preview paging

* perf(search): reduce preparation and expose query latency

* test(search): lock deep-search performance budgets

* test(search): register deep performance cases

* refactor(search): isolate service query metrics

* refactor(search): split sidebar search support

* test(search): exercise client prefix deadline

* fix(search): derive snippet body bound

* test(search): align store harness Svelte

* ci(search): prepare web modules for scale gate

* test(search): await page-zero debounce boundary

* refactor(search): simplify validation ownership
* fix(sidebar): align bottom-pinned activity order

* feat(settings): explain pinned activity ordering

* refactor(settings): rely on visible pinned label

* docs(sidebar): clarify filtered activity ordering

* refactor(server): narrow chat sort settings dependency

* docs(sidebar): explain filtered pin sorting
)

Default shared dialog triggers to button semantics so compact provider navigation inside the chat form cannot submit the draft.

Co-authored-by: yongkangc <chiayongtcac@gmail.com>
Co-authored-by: cfal <cfal@users.noreply.github.com>
* docs: define best-effort provider compaction rows

* test(claude): cover live automatic compaction rows

* feat(opencode): show live automatic compaction rows

* feat(pi): show live automatic compaction rows

* refactor(opencode): isolate compaction row selection

* fix(opencode): keep compaction failures internal

* refactor(opencode): clarify compaction event routing

* refactor(pi): simplify compaction payload validation

* docs: align compaction row conformance catalog

* test(opencode): cover automatic compaction routing

* docs(opencode): clarify compaction failure isolation
* feat: add durable per-chat preamble selections

* feat(web): configure preambles per chat

* docs: define per-chat preamble ledger semantics

* docs: record per-chat preamble design

* test: stabilize preamble selection coverage
* perf(web): add repeatable performance measurements

* perf(web): deduplicate composer height measurement

* perf(web): reuse unchanged sidebar row model

* perf(web): avoid deep session collection proxies

* refactor(web): simplify AppShell breakpoint subscription

* refactor(web): remove unused Sidebar filter implementation

* perf(web): lazy-load the file editor runtime

* perf(web): lazy-load terminal runtimes

* fix(web): recover lazy runtime load failures

* fix(web): retry failed breakpoint transitions

* fix(web): exercise nested sidebar benchmark grouping

* docs(web): finalize performance remediation plan

* fix(web): preserve lazy terminal activation intent

* docs(web): link performance remediation pull request

* test(web): activate renderer focus harnesses

* fix(web): recover terminal reattach after list failure

* fix(web): keep terminal transport suspended after logout

* fix(web): defer terminal recovery while logged out

* test(web): update sidebar reactivity fixture

* fix(web): restore responsive shell transitions
Garcon-managed OpenCode shell commands now receive their invocation-scoped native session ID through a bundled plugin while preserving existing OpenCode configuration and plugins. The plugin is packaged for source and compiled runtimes with focused unit and scripted integration coverage.
* fix(server): restore chat settings contract

* ci: require server typechecking
* fix(chat): switch chats before archiving

* fix(chat): optimistically project archived chats

* refactor(chat): clarify archive flow
* Add automatic preamble agent and tag filters

* Refine preamble selection experience

* Simplify preamble selection internals
* refactor(projects): define on-demand resolution contracts

* feat(execution): admit work against available projects

* feat(web): resolve project context on demand

* test(integration): cover unavailable project recovery

* fix(web): stabilize project resolution lifecycles

* style(integration): align unavailable project test

* fix(projects): harden directory availability checks

* test(projects): pin adapter error contracts

* fix(execution): gate private work by project availability

* fix(execution): preserve deferred control queueing

* test(events): cover unavailable project notices

* fix(execution): avoid hidden private queue pauses

* fix(execution): recheck queue pause eligibility

* test(codex): update execution coordinator fixtures

* test(web): provide project resolution context

* fix(web): harden project resolution ownership

* test: align project resolution gates after rebase

* test(e2e): isolate project surface demand

* test(execution): align drainer fixtures after rebase

* fix(web): preserve project surfaces during refresh

* fix(commands): propagate relocation session commit failures

* fix(messages): classify unavailable project targets

* fix(web): fence async project interactions

* fix(web): close project lifecycle races

* test(files): initialize project availability

* fix(web): fence project recovery refreshes

* fix(git): retain interrupted checkout invalidation

* fix(web): harden project resolution regressions
* Polish new chat preamble experience

* Fix new chat focus and browser checks

* Streamline new chat preamble preview

* Harden new chat preamble polish

* Restore preamble picker focus promptly

* Refresh preamble previews on catalog invalidation

* Recover preamble defaults after preview failure

* Harden preamble picker preview recovery

* Refresh late stale preamble previews

* Refresh stale preamble picker defaults
* Fix concurrent web build cache publication

* Use filesystem lock for web builds
* Enforce unique chat assignments across workspaces

* Reuse loaded chats from workspace actions

* Simplify chat placement control flow

* Fix stale presentation focus assertion

* Update Lightpanda chat ownership expectations

* Target sidebar chat actions by identity

* Avoid Git dependency in chat reuse coverage
* Refactor shared chat research contracts

* Add explicit CLI lifecycle and chat research commands

* Simplify CLI chat research implementation
* Fix Files project path refresh

* Reset mobile search dialogs on drawer close

The search dialog cluster lives in the app-level search store, so it
survived the mobile drawer unmount and reopening the drawer returned
straight to the search dialog instead of the chat list. Add
SidebarSearchStore.resetDialogs(), which closes the whole cluster
(search dialog, manager, editor, delete confirmation) without the
suspend/resume origin paths so nothing can reopen, and trigger it from
an AppShell effect whenever the mobile drawer is closed.

* Render the mobile search dialog as a body-level modal

The search overlay rendered inside the sidebar drawer subtree, where
.mobile-shell's translateY transform makes it a fixed-position
containing block, so on real devices the overlay could end up confined
to the 85% drawer box instead of the screen. Add a bodyPortal
attachment that mounts the overlay at the end of document.body, and
give the portaled frame the same keyboard-aware geometry as
.mobile-shell (--app-height plus the visual-viewport offset) so it
fills the visible viewport with the keyboard open. The in-place path
used by desktop and the scheduled-chat picker is unchanged.

* Give the mobile search header a full-width input row

The search header packed the query input and four icon buttons into one
row, leaving the input unreadably narrow on phones. On mobile the input
now fills its own row with the close button beside it, and the help,
save, and manage actions move to a second row as equal-width labeled
buttons with 44px touch targets. Desktop keeps the single icon-button
row. The results region gains overscroll containment and safe-area
padding for the full-screen mobile overlay.

* Extract transcript match merging from the search store

The sidebar search store crossed the 1000-line architecture budget
after the dialog reset addition. Move the pure facet-filtering and
transcript-match merging helpers into transcript-search-merge.ts,
matching the existing search-result-order and transcript-search-request
helper modules.
* web: define concrete theme profile contracts

* web: add complete built-in theme profiles

* web: drive shared control styling from theme roles

* web: use contextual foregrounds in shared content

* web: prepare renderers for theme presentations

* web: activate configurable theme profile selection

Replace legacy appearance and colorblind switches with atomic fixed/system profile preferences. Project the resolved profile before paint and at runtime, wire renderer presentations, and expose scheme-safe profile selectors in settings and onboarding.

* web: synchronize Mermaid rendering with theme profiles

Key serialized renders by effective renderer palette, rerender live blocks only when that palette changes, and guard stale async completions. Define contrast-safe flowchart and Gantt state colors for standard and colorblind presentations.

* web: simplify theme profile coordination

* web: synchronize composer and status dock thinking pulses

* web: preserve terminal contrast with explicit ANSI backgrounds

* web: preserve Mermaid viewer state across theme changes

* web: remove obsolete appearance label

* web: synchronize processing indicators across chat surfaces

* web: correct theme interaction contrast and painting

* web: enforce profile contrast across semantic controls

* web: complete semantic contrast coverage

* web: enforce deleted-action contrast

* web: enforce inline diff contrast

* web: enforce virtual diff contrast

* web: align processing pulse cadence

* web: enforce highlighted diff contrast

* test: harden theme integration harnesses

* web: centralize theme preference selection

* test: align composer pulse contract

* fix: retain Mermaid diagrams during theme updates

* fix: align processing indicator pulse phase

* fix: normalize terminal theme backgrounds

* fix(theme): preserve accessible selection and menu contrast

* fix(theme): preserve editor selection contrast
Keep configured chat width caps on roomy panes while shrinking transcript and dock gutters in narrow tiled layouts, preserving readable content width and aligned chat controls.
* Support whole-minute scheduled prompt recurrence

Use one integer-minute contract across HTTP, scheduling, and the editor. Migrate v1/v2 schedules to v3 with exact private source backups and preserved cadence. Cover minute claims, unit conversion, migration, HTTP edits, and restart preservation.

* Fence queued server controls independently of receipts

Allow already-recorded outcomes to use private controls without adding a second notice. Validate every control against the current transcript view at dequeue, dropping stale entries without blocking valid successors. Generalize the existing delivery name while preserving inter-agent routing and receipt behavior.

* Define bounded agent actions and same-chat schedule admission

Add strict single-child and schedule envelopes, escaped action bodies, and view-qualified result contracts. Separate delay and recurrence bounds, resolve first-run timing under the scheduler lock, and report uncertain persistence without retrying.

* Execute single-child starts and same-chat schedule commands

Commit private request evidence before actions, inherit the parent's path and permission for independent children, and persist delegation edges through normal admission. Record typed creation outcomes, identify preamble-retained children, and deliver view-fenced private replies without retries. Reconstruct historical evidence and correlation without replaying actions, with independent settings gates and composed regression coverage.

* Expose agent action controls and readable scheduled prompts

Add independent start and schedule gates with inherited-authority guidance. Decode scheduled action titles without changing saved prompts, and cover settings persistence and minute scheduling through the browser.

* Keep malformed command openers opaque to nested actions

Reject a raw nested opener while scanning envelope attributes. Preserve the outer family boundary so a nested self-closing command cannot expose a later side effect.

* Stop agent action admission when server shutdown begins

Latch controller shutdown permanently and close action admission before asynchronous teardown. Late provider emissions cannot persist work after the scheduler stops.

* Verify agent actions across provider and scheduling boundaries

Exercise child starts and private results through pinned providers, with Cursor covered at its unit-only boundary. Compose ledger publication, minute claims, and ordinary queue or skip admission, including malformed input and shutdown regressions.

* Pin synchronous agent admission fencing during shutdown

Assert that action controllers stop after the server shutdown latch and before queue teardown or the first await. This protects the production ordering independently of controller lifecycle tests.

* Keep nested command envelopes opaque until their outer close

Track recognized envelope nesting and fence malformed quoted openers so inner closing tags cannot expose later side effects. Preserve independent trailing commands only after a trustworthy outer boundary, with parser and composed scheduling regressions.

* Shield command boundaries inside unsupported XML markup

Skip comment, CDATA, and processing-instruction contents when recovering malformed command envelopes. Leave unclosed regions and unsupported declarations opaque so embedded closing tags cannot admit nested actions.

* Preserve Markdown fences in retained command envelopes

* Add abortable exact-turn receipt observation

Observe public terminal receipts atomically before retention can remove their output, and retire waiters on cancellation, private rejection, or retry replacement. Centralize sorted multi-chat locking for delegated admission.

* Prepare delegated starts and authorized resumes under ordered locks

Seed fixed transcript snapshots before child publication, persist custom titles before dispatch, and explicitly disable preambles for markup starts. Add cancellation-aware direct-child resume admission using current saved configuration, without exposing configuration overrides.

* Add a separate delegated-resume command setting

Expose a default-enabled resume gate under the agent-command master switch, with independent settings UI and complete persisted, HTTP, WebSocket, and browser fixtures.

* Report exact child turns and authorize delegated resume

Add correlated admission and terminal results with optional async-only acknowledgments. Keep resume restricted to direct delegation and current child settings, and wire transcript snapshots, custom titles, and preamble-free starts into the shared command path.

Capture bounded completion before acknowledgment delivery, preserve original correlation on native import, and distinguish confirmed preparation or compensation failures from uncertain admission. Add lifecycle, locking, privacy, and exact-output regressions.

* Exercise delegated results across providers and lifecycle boundaries

Verify exact acknowledgments and child-turn output through scripted Claude, Codex, Pi, and OpenCode. Cover same- and cross-agent snapshots, delegated resume, title persistence, interruption, deletion, restart callback loss, and native reload correlation without replay.

* Preserve agent outcome headings through native reload
* Fix mobile search modal interactions

* Cover mobile search modal regressions

* Simplify mobile search presentation
Nest inactive chats under project folders while keeping active and archived grouping behavior intact. Add regression coverage and deterministic before/after screenshots.
@0xSolarPunk

Copy link
Copy Markdown
Owner Author

Closing this fork-local PR because its base branch is behind upstream main and expanded the diff beyond this feature. The feature branch will be reopened against cfal/garcon:main.

@0xSolarPunk 0xSolarPunk closed this Sep 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants