Commit graph

830 commits

Author SHA1 Message Date
Pascal André
a2e203754d
fix(ui): restore queued message status presentation
Restore CodeNomad's existing QUEUED badge and animated Sending text inside queued user message bubbles. The presentation now follows the shared queue menu state so persisted V2 inbox prompts retain the historical UI after their optimistic sending status settles.

Steer and consumed history messages keep their existing appearance. Validated with the UI typecheck, focused message-status tests, diff checks, and a complete Tauri release/NSIS build.
2026-08-26 01:09:28 +02:00
Pascal André
46cc4f992f
fix(v2): align prompt menus with delivery state
Keep CodeNomad's existing message appearance while selecting actions from the real prompt lifecycle: sending and queued prompts remain queue-state messages, steering prompts can return to queue, and consumed messages regain history actions.

Pending prompts now expose only steer-or-queue and remove actions. Remove the previously added pending-prompt edit path and prevent copy, speech, fork, or revert actions before consumption.

Validated with the UI typecheck, delivery-state unit coverage, and OpenCode projection tests.
2026-08-25 23:37:37 +02:00
Pascal André
75b2259e44
fix(v2): preserve native pending message appearance
Remove the added queue delivery badge from pending prompt bubbles. Pending prompts keep CodeNomad's existing message presentation while their contextual queue, edit, and remove actions remain available.

Validated with the UI typecheck and OpenCode data projection tests.
2026-08-25 23:17:39 +02:00
Pascal André
829768b9d3
fix(v2): retain authoritative form updates
Suppress only structurally unchanged duplicate form sync results so active field drafts remain mounted without discarding schema or global routing-location changes.

Restore keyed inline form rendering for genuine definition changes and cover stable duplicates, changed schemas, and late locations in the form lifecycle test.

Validated with the UI typecheck and focused form lifecycle tests.
2026-08-25 22:57:52 +02:00
Pascal André
dde642bc1b
fix(v2): keep queued prompts and forms stable
Render pending inbox prompts in their existing message bubbles with queue, steer, edit, and remove actions instead of maintaining a separate queue panel.

Keep duplicate form sync results from replacing the active form object, preventing local field state from resetting and avoiding the resulting virtual timeline height correction.

Validated with UI and server typechecks, focused form, projection, shortcut, bottom-pin, and virtual-follow tests, plus the production UI build.
2026-08-25 22:56:16 +02:00
Pascal André
36be70ac38
fix(v2): make queue mutations reconnect-safe
Remove queue reordering because the native inbox contract cannot perform it atomically and suffix replacement could duplicate or prematurely execute prompts. Serialize visible queue actions and keep edit replacement limited to the native admit-then-cancel safety guarantee.

Rebind mounted inbox observers after a reconnect generation, isolate per-session inbox refresh failures, avoid duplicate Shell refreshes, and exclude hidden queued prompts from transcript search. Queue an alternate submission when another admission is still in flight.

Validated with UI and server typechecks, 84 focused session/data tests, 46 shortcut/scroll tests, and a production UI build.
2026-08-25 22:44:57 +02:00
Pascal André
b2fa1ba7de
fix(v2): stabilize prompt delivery and reconnect state
Make Enter steer immediately by default while keeping newline modifiers and a rare Ctrl/Cmd+Shift+Enter queue path. Render only authoritative queued inbox prompts in the queue panel, preserve their order during edits and reordering, and keep queued admissions out of the conversation timeline and bottom-pin calculations.

Prevent completed explicit scroll pins from replaying, preserve active turn agent/model state while queued work is admitted, update the current session command contract, and reconcile loaded inboxes plus Shell resources after browser or native reconnects.

Follow the @opencode-ai/client beta channel in manifests and documentation while retaining the concrete lockfile resolution. Refresh the Desktop comparison and migration capability notes against the reviewed upstream V2 baseline.

Validated with UI/server typechecks, 76 targeted Node tests, server and UI production builds, and a complete Tauri Windows release/NSIS build.
2026-08-25 22:36:53 +02:00
Pascal André
aef4452be4
chore(v2): set the official 0.20 prerelease baseline
Set every workspace and desktop package to 0.20.0-dev-v2 so local packaged builds use the isolated V2 identity without temporary version overrides or runtime environment variables.

Teach Electron and Tauri channel detection to recognize both the baseline form ending in -dev-v2 and dated release versions such as -dev-v2-20260825-abcdef12. CI can continue replacing the baseline with unique prerelease versions.

Validated with workspace and server typechecks, Electron startup tests, the targeted Tauri identity test, and a complete Tauri release build.
2026-08-25 16:05:02 +02:00
Pascal André
7e53fc0ee3
fix(desktop): persist OpenCode selection before shutdown
Normalize the legacy opencode system command to opencode2 in both server persistence and UI settings so the selected PATH runtime remains visible and authoritative after restart.

Track config, state, and instance-data writes in the shared UI storage adapter and wait for them during native shutdown before acknowledging Tauri's flush request. Remove duplicate binary-selection writes from the selector so its parent remains the single persistence owner.

Validated with UI and server typechecks, targeted storage, preference, shutdown-capture, settings, and binary resolver tests, plus a Tauri release build.
2026-08-25 15:50:44 +02:00
Pascal André
df5adf7405
feat(v2): manage queued prompts and compaction results
Expose native inbox list, cancel, queue, and steer operations through the reviewed workspace proxy. Follow-up prompts submitted while a session is active now enter the native queue, where users can steer, remove, or edit them without losing the current draft.

Queued edits preserve native files, agents, skills, hidden prompt suffixes, and metadata by admitting the replacement before cancelling the original. Since V2 has no inbox update mutation, edited prompts move safely to the queue tail instead of relying on local transcript state.

Render compaction progress with a spinner, completed summaries as Markdown, and terminal failures as alerts while continuing to suppress high-frequency compaction deltas. Update every locale and the migration capability table.

Validated with UI and server typechecks, targeted inbox/projection/send/normalizer tests, the UI production build, and a Tauri release build.
2026-08-25 14:59:16 +02:00
Pascal André
430ed2a3a3
fix(ui): restore model and session authority
Move model search into the picker popover and keep the favorites filter beside it. Add an Advanced preference, translated across every locale, that hides only supplemental provider credit balances by default.

Reconcile terminal native events against session.active with generation guards so stale completions cannot stop continuing work. Keep inbox admission from prematurely confirming optimistic sends and follow the V2 previous/next message cursor contract in both directions.

Cover provider balance visibility, terminal reconciliation races, optimistic send settlement, and message pagination. Validation: 52 focused tests, full UI and Electron typecheck, 287 runnable UI tests, 126 browser integration tests, and release Tauri build.
2026-08-25 10:54:14 +02:00
Pascal André
3c35688a12
fix(tauri): keep native navigation authoritative
Prevent the loading renderer from navigating again when the CLI becomes ready. Rust already serializes startup navigation through the client-state queue, and the duplicate renderer navigation could mount competing app documents and create an orphaned same-folder workspace during session restoration.

Keep CLI error and status reporting in the loading screen while leaving successful navigation exclusively to the native host. Add a source-level regression check that rejects ready-event and window.location navigation in the loading renderer.

Validated with the targeted Node test and the @codenomad/ui TypeScript typecheck.
2026-08-25 08:22:11 +02:00
Pascal André
b541aad636
fix(v2): restore workspace and session UI authority
Create a fresh logical workspace for every same-folder launch while preserving shared native location ownership, independent restore cancellation, bounded creation, and final-owner eviction.

Treat aborted background session inventory as cancellation instead of a fatal sidebar error. Reset Virtua's index measurements when a 200-message resident page is replaced so bottom pinning targets the actual transcript end without remounting the follow controller.

Refresh the V2 migration and comparison notes for the current session, worktree, provider quota, Shell, and packaging behavior. Coverage includes full server and focused UI matrices, server/UI typechecks, the UI production build, and regression tests for each failure.
2026-08-24 17:26:41 +02:00
Pascal André
f54edd4dc7
fix(ui): inherit the model selector background
Keep the inline searchable model input transparent so the outer sidebar selector remains the single visual surface without restoring the nested padding or border.

Validated with the UI TypeScript check and git diff checks.
2026-08-24 16:09:16 +02:00
Pascal André
5c367f6cf5
fix(ui): align the model field with sidebar selectors
Remove the nested search-input chrome from the inline searchable model control. The outer selector already owns the border and padding, so the model field now matches adjacent sidebar controls without changing keyboard search behavior.

Validated with the UI TypeScript check, production UI build, and git diff checks.
2026-08-24 16:02:04 +02:00
Pascal André
b12166edf2
fix(ui): keep compaction deltas off the render path
Stop projecting the complete resident message window for every session.compaction.delta event. The SDK reducer still receives every chunk, while the visible compaction start and terminal ended or failed boundaries continue to refresh immediately.

This removes repeated normalization, hydration, timeline invalidation, and message-block reconstruction that could monopolize the renderer and prevent prompt updates, tab changes, and session navigation during compaction.

Add integration coverage proving intermediate deltas remain out of the UI store, are reduced exactly once and in order, and become visible at the next projection before the final terminal summary replaces them. Validated with UI typecheck, the 124-test browser matrix, focused OpenCode projection tests, UI and Tauri production builds, and git diff checks.
2026-08-24 15:24:51 +02:00
Pascal André
a640081364
fix(v2): harden shared OpenCode lifecycle and session recovery
Prevent duplicate workspace ownership, bound concurrent creation and cleanup, and preserve canonical Windows and WSL identity while using the shared OpenCode V2 service.

Keep session history directory-scoped for global projects, serialize native event projection, restore prompts and pending requests safely, expose interrupted generations, and remove unsupported direct Google credential handling.

Make Electron and Tauri server resources reproducible from the root lockfile, retain the pinned beta SDK contract, and update CI and architecture documentation for the shared-service model.

Validated with full UI, server, Electron, Rust, packaging, typecheck, Tauri build, and live prompt, permission, Form, compaction, and interruption smoke coverage.
2026-08-24 05:27:31 +02:00
Pascal André
af84de30c2
fix(opencode): follow the latest beta channel
Replace the server and UI client pins with the npm beta dist-tag and regenerate both supported lockfiles from the current published channel. Update migration and architecture documentation so no specific beta build or obsolete next-channel wording is treated as CodeNomad's target.

Resolve the CLI beta dist-tag from the npm registry before calculating update availability, while invoking package managers with @opencode-ai/cli@beta. Verify the installed CLI against the observed concrete version and accept a newer build when the channel advances during installation.

Adapt UI event types to the current generated SessionStatusUpdated declaration. Cover channel-based commands, registry failures, stale installs, concurrent updates, and mid-update channel advancement; validate server/UI/Electron typechecks, server and UI suites, and the UI production build.
2026-08-23 22:11:48 +02:00
Pascal André
384506438c
feat(server): show xAI and OAuth quota without guessing a model
Read xAI usage from the provider API and keep OAuth quota refresh from inventing a selected model. The usage panel maps credits_balance onto the existing credits row.
2026-08-23 18:20:57 +02:00
Pascal André
01f23e2caa
fix(ui): stop the model picker from inventing a selection
The combobox used to seed and auto-select from leftover input. Search is now a plain field, so opening the picker no longer changes the current model.

The agent shortcut opens the list instead of submitting Enter. Provider auth calls go through the active catalog location.
2026-08-23 18:20:57 +02:00
Pascal André
be268f7c04
fix(ui): replace the resident 200-message window instead of growing it
Home and Fin now fetch oldest or latest and swap the visible page. Older and newer pages do the same. Live events only land on the latest window so history stays still.

A restored history cursor that returns no messages no longer marks the session loaded. Open retries latest, which was why transcripts went black after refresh.

Stale Solid reads during that load are ignored. Tests cover window planning, replace-on-failure, and the empty-cursor retry.
2026-08-23 18:20:52 +02:00
Pascal André
021dee3422
fix(ui): keep settled forms and permissions from coming back
A successful reply or cancel is now local authority. Sync and SSE cannot requeue that prompt unless the server still lists it. Failed mutations resync instead of leaving the queue stuck.

Poll liveness every 30s while a session is working or a prompt is open, and include session plus form locations in the pending-request scan.
2026-08-23 18:19:24 +02:00
Pascal André
87417db963
fix(ui): stop Solid stale reads from blanking session switches
Keyed Show on session and message objects threw during batch updates, which cancelled the switch and left the transcript empty. Gate those branches on ids or booleans, unmount hidden session views, and keep assistant model metadata optional.

Selecting a child with no resolved root now falls back to the session itself so the list click still activates.
2026-08-23 18:18:16 +02:00
Pascal André
00fcee388f
fix(ui): truncate shell output at safe boundaries
Keep the four MiB display cap without retaining split UTF-16 surrogates or partial ANSI CSI, OSC, DCS, APC, and PM control strings. Handle ESC-backslash terminators and CAN/SUB cancellation so visible output is preserved.

Validated with four shell-store tests, including Unicode and ANSI boundary probes, plus the UI typecheck.
2026-08-21 18:56:56 +02:00
Pascal André
12563d250c
fix(ui): preserve shell output truncation boundaries
Advance the retained output boundary past split UTF-16 surrogates and partial ANSI CSI sequences. Truncated shell output no longer begins with malformed Unicode or a literal escape fragment.

Validated with four shell-store tests and the UI TypeScript check.
2026-08-21 18:04:08 +02:00
Pascal André
4c702cdf36
fix(ui): bound retained shell output
Keep only the newest four MiB in the shell output dialog and skip ANSI reparsing when a poll returns no new bytes. The native output file remains unchanged and the existing truncation notice is shown when the display cap is reached.

This prevents long-running verbose shells from growing renderer memory without bound or repeatedly reparsing unchanged output.

Validated with the shell store test and UI TypeScript check.
2026-08-21 17:21:12 +02:00
Pascal André
3445de6b20
fix(ui): restore shell status and reasoning details
Expose native OpenCode shell output from the Status panel, keep shell records visible when removal fails, and render distinct process cards with explicit output and removal actions. Cover terminal timeout and killed states in every supported locale.

Parse canonical reasoning headings separately from their detail so the heading is not duplicated in expanded output, and disable expansion when no detail exists.

Validated with all 518 UI tests and the UI TypeScript check.
2026-08-21 16:11:14 +02:00
Pascal André
08dd380e58
fix(v2): preserve shared service and worktree authority
Keep one pinned OpenCode V2 background service, validate every proxied workspace location and cursor, and route host and WSL service discovery through bounded authenticated lifecycle adapters.

Evacuate every paginated worktree session before Git deletion, roll moves back when removal fails, and reconcile UI worktree state only after the server confirms deletion. Native session and shell ownership remains scoped without creating or stopping a daemon per workspace.

Validated with the complete server suite (284 passed, 2 skipped), server typecheck, and the UI worktree deletion authority test.
2026-08-21 16:07:37 +02:00
Pascal André
2f087705d4
fix(ui): restore V2 sessions without blocking first paint
Publish native root session pages before descendant inventory enrichment, preserve native cursor authority across refresh and history pagination, and reconcile complete message snapshots without racing newer runtime state.

Hydrate restored session branches concurrently by ancestry level and gate initial session/message work only on project identity rather than supplemental MCP and plugin metadata. This keeps saved selections and transcripts responsive across multiple restored workspaces while retaining authoritative cleanup.

Validated with 43 targeted UI tests covering session request authority, message pagination, metadata replacement, and message-store restoration, plus the UI TypeScript check.
2026-08-21 16:00:43 +02:00
Pascal André
290ad3d586
fix(v2): harden state authority across reconnects
Preserve native V2 session and message cursor semantics while keeping restored history, concurrent roots, drafts, and interruption state authoritative across reconnects and client replacement. Historical scroll restoration and conversation search now load older pages safely with bounded, retryable progress, and partition commits reject snapshots above the native 256 MiB budget.

Serialize workspace location eviction against creation, release failed initial daemon identities, and translate WSL certificate paths under one deadline. Electron and Tauri now retain window persistence through failed shutdown or close operations, fence navigation generations, bound CLI cleanup, and keep remote-window origin and TLS authority isolated across concurrent reuse.

Refresh the architecture guide for the current Forms-based V2 client and strict Electron/Tauri parity. Coverage includes 277 server tests, 333 UI tests, 163 Electron tests, 117 Tauri tests, all TypeScript typechecks, Rust formatting, and complete Windows Electron ZIP and Tauri NSIS builds.
2026-08-21 02:07:48 +02:00
Pascal André
6ef68ed69e
refactor(v2): remove verified dead migration code
Delete unused client-connection notifications, spawn classifications, WSL metadata, workspace creation fields, one-element event sets, and renderer helpers left behind by the V2 restructuring.

Remove obsolete Shell rename translations and test-only fixtures or captures that had no production caller. Preserve shared-daemon ownership, WSL launch behavior, restore state, pagination, and multi-window lifecycle semantics.

The cleanup removes 257 lines while adding 23 lines of direct replacements. Focused server and UI suites, all native host suites, typechecks, the UI build, and independent diff review passed.
2026-08-21 00:28:55 +02:00
Pascal André
34179162df
fix(v2): close current desktop parity gaps
Load continuation message pages with the native cursor alone, hide deprecated models, and tolerate failed plugin records that do not carry an ID.

Match official Desktop URL handling by limiting native external openers to web and mail schemes. Connect wildcard-bound shared services through loopback while preserving strict authentication and non-loopback rejection.

Remove the inactive unrestricted Tauri asset scope and add focused regression coverage for cursor requests, model/plugin projection, URL schemes, and wildcard service discovery.

Validated with focused UI/server tests, all 158 Electron native tests, all 104 Tauri tests, package typechecks, the UI production build, Rust formatting, and diff checks.
2026-08-21 00:28:09 +02:00
Pascal André
52a9589f60
fix(ui): keep session hydration state accurate
Show the initial loading state while the native session cursor is still unresolved, including the metadata hydration window before the list request starts.

Remove the misleading load-more label from the pagination sentinel because the shared fetch flag tracks initial and refresh requests rather than cursor requests. Native cursor handling remains authoritative, including terminal empty pages.

Validated with UI typecheck, focused pagination and request-authority tests, and the production UI build.
2026-08-20 21:49:37 +02:00
Pascal André
db0464f702
fix(v2): stabilize catalog and transcript loading
Coalesce concurrent provider and agent catalog requests per OpenCode location while preserving one trailing refresh after reconnect, authentication, or catalog invalidation. Fence stale responses with monotonic request generations and cancel removed-instance flights so reused workspace IDs cannot install obsolete providers, agents, models, or commands.

Load only the selected session transcript instead of eagerly requesting every descendant. Keep thread cost and token totals complete from native session aggregates, including newly paginated descendants, while retaining cursor-based transcript history loading.

Strip upstream WWW-Authenticate and Proxy-Authenticate challenges alongside response cookies so OpenCode authentication cannot trigger the browser's native Basic Auth dialog. Coverage exercises coalescing, invalidation, location switches, instance-ID reuse, lazy transcripts, native totals, and real 401 proxy responses.
2026-08-20 20:18:39 +02:00
Pascal André
2c9ced635e
fix(v2): harden reconnect and desktop state recovery
Preserve the OpenCode data controller across reconnects, require the native server.connected handshake, restore native cursor pagination for sessions and messages, and route global Forms through their validated worktree locations.

Make partitioned client state tolerate corrupt inactive leaves and store unsent attachment payloads as bounded content-addressed chunks without silently rewriting drafts. Align Electron and Tauri commit limits and shutdown-generation fencing.

Tighten SSE CORS, proxy ownership checks, remote-window navigation, process exit classification, and pre-navigation renderer flushing. Ordinary backend shutdown now detaches local workspaces without evicting shared OpenCode locations.

Coverage includes server proxy/event/lifecycle tests, UI pagination and restoration tests, Electron native lifecycle/security tests, and the full Tauri Rust suite.
2026-08-20 17:28:52 +02:00
Pascal André
b5f3fc6e82
feat(v2): unify global service and desktop windows
Use the official host and WSL OpenCode service lifecycle instead of private daemon ownership. Workspace deletion now evicts only the selected location while shared sessions, agents, messages, and executions remain available to other windows.

Add profile-scoped singleton multi-window support for Electron and Tauri, isolate local window UI state in a durable partition graph, and preserve migration, fencing, bounded persistence, and cross-host ownership semantics. New Window and New Instance are exposed together in the native Window menu.

Harden renderer authority, remote profiles, SSE identity, idle attention, git-status concurrency, SideCar sandboxing, shutdown, generated Tauri ACLs, documentation, and CI coverage.

Validated with server, UI, Electron, and Tauri test matrices; TypeScript checks; cargo fmt; production Electron/server/Tauri builds; diff checks; and a packaged Windows smoke covering singleton focus, --new-window, one shared backend, menu placement, and slot hash verification.
2026-08-20 08:41:27 +02:00
Pascal André
5484f9c990
fix(v2): use native shells for background processes
Migrate the Status panel from interactive PTYs to the location-scoped shell API, refresh shell state after lifecycle events and reconnects, and route locationless shell events by their owned working directory.

Allowlist shell routes explicitly and verify ShellInfo.cwd before every ID-scoped request, including trailing-slash aliases, while preserving native output cursor parameters. Keep PTYs separate for interactive terminal use.

Load project metadata before the first session inventory, preserve native projected message order, invalidate inactive transcripts instead of reloading every transcript after reconnect, and keep native shutdown terminal without latching ordinary navigation flushes.

Update V2 documentation and CI test paths. Validated with UI and server typechecks, 15 focused UI tests, 35 focused server tests, and git diff --check.
2026-08-19 16:11:47 +02:00
Pascal André
109a8ee37a
fix(ui): reconcile prompt admission identity
Use the inbox identifier returned by OpenCode as the authoritative message identity instead of assuming every compatible CLI preserves the client-provided optimistic ID. This prevents the optimistic and admitted prompts from remaining as duplicate bubbles when their IDs differ.

Delete the replaced store record through a Solid produce update so the old key is actually removed. Covered by the optimistic send lifecycle suite and validated with the UI typecheck.
2026-08-19 15:24:24 +02:00
Pascal André
a2d5df96f5
fix(forms): allow required custom select values
Disable native select required validation once a non-option custom value is present, so required long-option forms can submit through the existing schema validation.

Validated with UI typecheck, focused form protocol tests, and git diff --check.
2026-08-19 09:05:15 +02:00
Pascal André
affdb96f14
fix(v2): keep forms and worktree deletion fail-safe
Render the floating Form fallback whenever its inline tool target is unresolved, and allow required custom select answers to pass native validity checks. This prevents native Forms from leaving sessions permanently blocked.

Recheck affected session activity before each evacuation move and immediately before Git removal so execution starting after preflight aborts and rolls the transaction back. Validated with root typechecks, focused Form and projection tests, evacuation tests, and server typecheck.
2026-08-19 06:26:54 +02:00
Pascal André
3b5f443073
style(ui): remove trailing whitespace
Keep the V2 migration diff clean so git diff --check succeeds as claimed by the gatekeeper validation.
2026-08-19 06:22:40 +02:00
Pascal André
af22f58ca6
fix(ui): replace optimistic prompt after native projection
Confirm same-ID user messages when createData exposes their native projected parts. This removes the client-only optimistic parts before applying the server representation, preventing every submitted prompt from rendering twice inside one message.

Add a regression that starts with an optimistic text part, applies the native inbox event, and asserts only the projected prompt remains. Validated with UI typecheck and 17 focused projection, send lifecycle, and request authority tests.
2026-08-19 06:13:01 +02:00
Pascal André
ef70a8b799
fix(v2): harden reconciliation and worktree rollback
Scope global Form actions to the logical workspace location without hydrating a synthetic global session. Keep successfully loaded message sessions eligible for later reconnect retries and traverse project descendants independently of parent worktree subpaths.

Treat native session moves as asynchronous operations, block active worktree sessions, verify complete project inventory before Git removal, and roll all accepted moves back if verification or Git deletion fails.

Validated with server and UI typechecks, 255 passing server tests plus 3 platform skips, 31 affected UI tests, and git diff --check.
2026-08-19 02:38:57 +02:00
Pascal André
249a96e7c0
fix(v2): close native integration review gaps
Merge live createData projections into REST history and reset their event cache for every internal stream generation. Load sessions by validated project scope across all descendant depths and apply native active state to later root pages.

Pin the updater and standalone server lockfile to the startup-compatible client version. Decode and authorize native session cursors, permit global Form actions, and prevent the WSL stop path from invoking the client's host PID fallback.

Make worktree deletion server-authoritative by inventorying the complete native project, moving affected session families with verification and rollback, and failing direct delete calls closed when evacuation cannot complete.

Validated with server and UI typechecks, 254 server tests plus 3 platform skips, 247 UI CI-partition tests, 122 Electron native tests, server/UI/Electron production builds, standalone server lockfile installation, Tauri cargo check --locked, and git diff --check.
2026-08-19 02:32:59 +02:00
Pascal André
4359b4bfe9
fix(v2): align with current OpenCode client contract
Pin the server and UI client to the installed beta runtime and reject mismatched CLI versions before shared-service startup. Delegate proven shared-service shutdown to Service.stop while retaining CodeNomad lease, peer, registration, endpoint, and process-identity checks.

Adopt native Forms and the client/solid data reducer for live messages, tools, permissions, and input forms. Propagate internal stream generations into authoritative reconnect reconciliation and replace directory-wide session scans with native project cursor pagination.

Fail worktree deletion when session evacuation fails and deduplicate canonical workspace folders instead of exposing non-isolated duplicate instances. Update migration notes and CI coverage for the reviewed contract.

Validated with server/UI/Electron typechecks, 244 UI partition tests, 122 Electron native tests, 248 server tests plus 3 platform skips (the sole Windows cleanup race passed in isolation), UI/server/Electron builds, Tauri cargo check --locked, and git diff --check.
2026-08-19 01:50:39 +02:00
Pascal André
4c65e60fa9
test(v2): remove redundant migration coverage
Reduce the V2 test matrix to CodeNomad-owned behavior instead of repeating generated OpenCode request shapes, mock choreography, equivalent endpoint permutations, and source-level helper wiring.

Retain representative happy paths and the boundaries that protect workspace ownership, traversal and credentials, PID and WSL lifecycle proof, shutdown timeouts, permission isolation, restore handoff, deletion authority, streaming reconciliation, and persisted client state.

This removes 2,818 net test and CI lines. The full server suite passes with 249 tests and 3 platform skips; the PR UI matrices pass with 204 standard and 53 browser-conditioned tests, both server and UI typechecks pass, and git diff checks are clean.
2026-08-18 23:49:35 +02:00
Pascal André
775c6c6ca1
refactor(v2): remove dead migration scaffolding
Delete the obsolete pre-MVP roadmap and task references now that Git preserves that development history, while retaining current V2 operational and architecture guidance.

Remove behavior-neutral server and UI plumbing that has no remaining caller: unused workspace options and cached endpoint state, redundant auto-accept metadata, an unused PTY get adapter, and a one-use message-loading helper. Keep lifecycle proof, restore gates, timeline projection, and targeted invalidation because they still enforce runtime behavior.

Validated with server and UI typechecks, the full server suite (308 passed, 3 skipped), focused UI matrices, browser-conditioned UI tests, production server/UI build, diff checks, caller searches, and an independent regression review.
2026-08-18 23:21:43 +02:00
Pascal André
a820f80be3
fix(ui): keep native forms visually stable
Keep tool-targeted V2 forms inline from the moment their metadata arrives instead of briefly opening the permission-center fallback while message state catches up.

Render the pending form directly in place of the tool-call chrome so users see one stable response surface without a stray disclosure chevron. Global and inactive-session forms retain the floating fallback.

Validated with the UI typecheck, the 83-test restore/form integration matrix, a production Tauri build, and git diff checks.
2026-08-18 21:42:07 +02:00
Pascal André
68abdc6d2b
fix(i18n): describe active plugin state
Update the empty plugin-status copy in every supported locale now that the panel reports runtime-active plugin IDs rather than configured package entries.

The UI typecheck and diff check pass.
2026-08-18 21:19:38 +02:00
Pascal André
97d4645388
fix(ui): stabilize V2 runtime status panels
Keep provider usage visible across status-panel remounts and reuse fresh results for the normal polling interval so message refreshes cannot collapse the panel into a loading state.

Treat compaction as the boundary for the visible agent plan, source plugin status from active V2 plugin IDs instead of configured package entries, and reserve the background-shell panel for native PTYs.

Propagate session interruption to active descendants and replace the placeholder busy check with the real working/compacting status. Focused tests cover active plugin filtering, compacted plans, and descendant interruption; the complete UI test matrix, UI typecheck, and production build pass.
2026-08-18 21:03:56 +02:00