Skip to content

Commit 6fa50fa

Browse files
committed
Squashed commit of the following:
commit 569701fd15f0697cd605c6b0d840a6c34ff913bd Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 19:56:11 2026 +0200 Fixed desktop auto-update install/restart flow across all platforms - Added 'installing' status to DesktopUpdateStatus for UI feedback during handoff - Split quitAndInstall() call to be platform-aware: Windows uses (true, true), macOS/Linux use no args - Removed manual win.destroy() loop before quitAndInstall() to preserve Electron lifecycle - Wired electronAutoUpdater.on('before-quit-for-update') to shared prepareForAppQuit() teardown - Added prepareForAppQuit() helper in main.ts to deduplicate before-quit/SIGINT/SIGTERM logic - Added 'open-download' button action for Linux non-AppImage builds as GitHub releases fallback - Added reduceDesktopUpdateStateOnInstallStart() state machine reducer - Added tests for installing state, Linux non-AppImage fallback, and allowed platforms commit 997fadd6d718524fae663fcfa234809ee88cf219 Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 19:32:21 2026 +0200 Fixed Windows packaged desktop: replaced dir symlink with NTFS junction for node_modules - Added pathResolver.platform.ts with pure BackendModulesLinkPlan resolver: Windows uses absolute-target junction, POSIX uses relative dir symlink - Replaced ensureBackendModulesSymlink() with ensureBackendModulesPath() in pathResolver.ts with Windows junction + cpSync fallback, POSIX unchanged - Added platform.ts build-time helpers (detectHostBuildPlatform, shellOptionForPlatform, isWindowsBuildPlatform, etc.) for early platform detection in build pipeline - Updated build.ts to use shellOptionForPlatform/isWindowsBuildPlatform instead of inline process.platform === 'win32' checks - Replaced raw child.kill() calls with killBackendProcess() in backendManager.ts for Windows-safe process tree termination via taskkill /T /F - Added unit tests for resolveBackendModulesLinkPlan (win32/darwin/linux) commit ca5c420312d1cacb931755c15598de0e00d82f32 Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:48:51 2026 +0200 Fixed Icons.tsx: removed duplicate inline icon bodies that conflicted with Icons.editor re-exports commit 76eceb7993d3d1fa898ede3b17f7050b209c9a70 Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:39:44 2026 +0200 Squashed commit of the following: commit 8fd5797b054d803a7b473fdc4b1d3f8e3aefa7ff Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:35:30 2026 +0200 Fixed plan step status normalization: map Claude SDK in_progress to inProgress The Claude SDK emits TodoWrite todos with status "in_progress" (snake_case), but RUNTIME_PLAN_STEP_STATUSES uses camelCase "inProgress". The validity check was failing silently and falling back to "pending" for all in-progress steps. Added explicit snake_case → camelCase normalization before the RUNTIME_PLAN_STEP_STATUSES inclusion check in extractPlanStepsFromTodoInput. commit 0a69f1a68ad7d1ad37b6b9ed1e52901431cdb21f Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:25:34 2026 +0200 Updated AGENTS.md: added keybindings table and 500-line file length rule - Added Keybindings section documenting all default shortcuts defined in keybindings.ts (mod+shift+g = diff bar toggle, mod+j = terminal toggle, mod+b = sidebar, mod+k = command palette, mod+n = new chat, etc.) - Added 500-line file length limit to Maintainability section with dot-notation splitting convention (Foo.ts, Foo.logic.ts, Foo.utils.ts) to prevent monolithic files and keep concerns separated commit b7d00aafd67a89b9d5a2e2a9d8caaa55d5714a3e Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:25:15 2026 +0200 Split oversized files by concern to enforce 500-line max file length rule ClaudeAdapter.test.ts (3078 lines) split into 8 focused test suites: - ClaudeAdapter.test.helpers.ts: shared FakeClaudeQuery + harness infra - ClaudeAdapter.stream.test.ts: stream event mapping - ClaudeAdapter.stream.plan.test.ts: plan step labels + Task tool classification - ClaudeAdapter.lifecycle.test.ts: interruption, stop, token/usage - ClaudeAdapter.text.test.ts: text segmentation - ClaudeAdapter.threadid.test.ts: thread ID fabrication + approval lifecycle - ClaudeAdapter.session.test.ts: resume IDs, model updates, permission mode - ClaudeAdapter.plan.test.ts: ExitPlanMode, AskUserQuestion, observability Web file splits: - MessagesTimeline.tsx → extracted MessagesTimeline.rows.tsx - MessagesTimeline.virtualization.browser.tsx → extracted .test.helpers.tsx and .virtualization.scenarios.ts - Icons.tsx → extracted editor SVG icons to Icons.editor.tsx - Sidebar.logic.ts → extracted Sidebar.sort.logic.ts - TerminalViewport.tsx → extracted .keybindings.ts and .links.ts - keybindings.models.test.ts → extracted .test.helpers.ts and .resolution.test.ts Fixed TerminalViewport.links.ts ILinkProvider callback type: unknown → ILink[] | undefined to satisfy xterm's ILinkProvider interface contract. commit 8e5b428b03aefcaa2910732792030206f8b8cce3 Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:24:44 2026 +0200 Adapted web app upstream changes: editor picker UI, chat view hooks, diff panel, and keybindings - Adapted OpenInPicker + CompactComposerControlsMenu: new "open in editor" picker component with compact menu variant and browser test - Adapted ChatViewContent, ChatViewComposer, and chat-view hooks: thread-derived state, runtime hooks, effects hooks reorganization - Adapted DiffPanel, PlanSidebar, and ComposerFooterLeading upstream updates - Fixed pre-existing TS2322 in input.tsx: cast props on nativeInput branch to satisfy React.ComponentPropsWithRef<"input"> constraint - Adapted keybindings.models.ts new entries, session.activity.logic.ts, useHandleNewThread.ts, select.tsx, and index.css additions commit ee114200337d603a70c566f2a8fa1d475422b11c Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:24:23 2026 +0200 Fixed bun dev crash from missing migration columns and adapted server-side upstream changes - Added migration 021 with ALTER TABLE guards for 4 missing columns in thread_shell_summary projection: latest_user_message_at, pending_approval_count, pending_user_input_count, has_actionable_proposed_plan — fixes UPDATE crash on first startup - Adapted ProjectionPipeline.projector.pendingApprovals.ts: pending approval/user-input count logic and actionable plan detection - Adapted ClaudeAdapter.stream.turn.ts and ClaudeAdapter.utils.ts for improved turn lifecycle and Claude event mapping helpers - Adapted open.ts editor/shell utility and contracts/workspace/editor.ts new editor type entries from upstream t3code commit 4f0c569ed85811517d407656473c06e58f590a94 Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 15:20:07 2026 +0200 Make provider logo colors adapt to dark mode for visibility commit 87a8936c92ed4c718ce000b06340d4e9cbd38075 Author: Youpele Michael <mjayjesus@gmail.com> Date: Wed Apr 15 00:38:09 2026 +0200 Fixed: Windows bootstrap installer crash in interactive mode and added regression tests Start-Process -ArgumentList rejected an empty array when running install.ps1 without BIGCODE_INSTALL_SILENT=1. Split into two branches: silent mode passes "/S" explicitly, interactive mode omits -ArgumentList entirely. Added TypeScript content-based smoke test (scripts/bootstrap-installer-smoke.ts) and PowerShell mock-based smoke test (scripts/bootstrap-installer-smoke.ps1) with CI jobs for both. commit 2fe175041e1c53cf1c0737b9e040c4f6d3781b29 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 20:13:30 2026 +0200 Updated: upstream sync — fix wsTransport test, consolidate buildTemporaryWorktreeBranchName, rename t3code prefix to bigcode Fix wsTransport test (apps/web/src/rpc/wsTransport.test.ts): - Removed 'environment' field from firstEvent/secondEvent payloads; ServerLifecycleWelcomePayload does not include it so Effect decode strips it, causing assertion mismatches. Expectations now match decoded shape. Consolidate buildTemporaryWorktreeBranchName into shared package (upstream 801b83e): - Added buildTemporaryWorktreeBranchName() to packages/shared/src/git.ts alongside the existing isTemporaryWorktreeBranch, using crypto.randomUUID instead of the web-only ~/lib/utils randomUUID. - Removed the duplicate local definition from ChatView.logic.ts (also drops the unused randomUUID import and the local WORKTREE_BRANCH_PREFIX shadow). - ChatView.sendTurn.logic.ts now imports from @bigcode/shared/git. Rename t3code worktree branch prefix and related identifiers to bigcode: - packages/shared/src/git.ts: WORKTREE_BRANCH_PREFIX = 'bigcode', updated doc comments. - apps/server/src/orchestration/Layers/ProviderCommandReactorHelpers.ts: WORKTREE_BRANCH_PREFIX + TEMP_WORKTREE_BRANCH_PATTERN updated. - Branch name literals in tests updated across: packages/contracts/src/orchestration/orchestration.test.ts apps/web/.../ChatView.browser/scriptsWorktree.integration-test.browser.tsx apps/web/src/components/git/GitActionsControl.logic.test.ts apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts apps/server/src/server.test.ts (8 occurrences) - Storage key renamed: COMPOSER_DRAFT_STORAGE_KEY = 'bigcode:composer-drafts:v1'; legacy key 't3code:composer-drafts:v1' preserved in COMPOSER_DRAFT_LEGACY_STORAGE_KEYS and wired into resolveStorage for automatic migration on first read. - Browser test fixtures updated to 'bigcode:client-settings:v1' and 'bigcode:last-editor'. - Keybindings fixture path changed to .bigcode-keybindings.json in 3 browser test files. - Codex client name: 'bigcode_desktop' in codexAppServer.ts and its test. - Git author/committer email: bigcode@users.noreply.github.com in CheckpointStore.ts. - fork-upstream-adapter.md: added t3code→bigCode renaming convention directive, added clarifier delegate, bumped temperature to 0.5. commit a003768ebd9bfc15afc039eb29dc153e723b5093 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 19:32:53 2026 +0200 Adapted web reconnect fixes and branch regression guard from upstream t3code - wsTransport: captured session before try block so reconnect detects stale sessions (94d13a2) - wsTransport: cleared slow RPC tracking on reconnect to prevent ghost toasts (f5ecca4) - GitActionsControl.logic: prevented semantic branch from regressing to temp worktree name (77fcad3) - isTemporaryWorktreeBranch: extracted to @bigcode/shared/git for web consumption - SidebarThreadRow: used latestUserMessageAt for more accurate thread timestamps (6f69934) - useThreadActions: stabilized archiveThread callback via handleNewThreadRef (6f69934) commit 1efde7d7bdd26a5fbf5e7f1cb5604826bb88e513 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 19:01:21 2026 +0200 Improve spacing in fork-upstream-adapter.md Insert blank lines for readability in .opencode/agents/fork-upstream-adapter.md: add an empty line after the "You should handle requests when:" heading and after the "After implementing:" heading to improve section separation. commit bf270f3543b42dcd2ce56dbf4b2c39c42d2bfd09 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 18:59:06 2026 +0200 Added Windows editor arg quoting and git status refresh after worktree bootstrap Adapted from upstream t3code #1805 and #2005. launchDetached now quotes each arg with double quotes on Windows (shell: true) to handle paths with spaces. Added refreshGitStatus call after worktree creation in wsBootstrap and after branch rename in ProviderCommandReactorSessionOps. Updated ProviderCommandReactor test to include GitStatusBroadcaster mock. commit 21a1b21441a4deec10ac6fb1148c41f1b247fb22 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 18:58:53 2026 +0200 Coalesced git status refreshes by remote and changed terminal.split shortcut Adapted from upstream t3code #1940. Replaced StatusUpstreamRefreshCacheKey (per-ref) with StatusRemoteRefreshCacheKey (per-remote) so sibling worktrees sharing the same remote share a single git fetch instead of each triggering a refspec-scoped fetch. Updated tests to match coalesced behavior. Changed terminal.split keybinding from mod+d to mod+shift+g. commit bfca9cfc2df8fc4cb973b3798b077ab0a4c98e24 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 18:58:45 2026 +0200 Fixed lost provider session recovery by gating on live session existence Adapted from upstream t3code #1938. Moved resolveActiveSession call before the existingSessionThreadId check in ensureSessionForThread, so the reactor no longer treats stale projected session state as an active session. Added gitStatusBroadcaster to SessionOpServices and refreshLocalStatus call after branch rename in maybeGenerateAndRenameWorktreeBranchForFirstTurn. commit 2be6759e1d09b0732a389bdedfe433c8fc6cef17 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 18:58:39 2026 +0200 Added token clamping, TodoWrite plan events, and ProviderStatusCache service Adapted from upstream t3code #1943 and #1541. normalizeClaudeTokenUsage now clamps usedTokens to contextWindow when it exceeds it, and includes totalProcessedTokens in the snapshot when it differs. Added isTodoTool and extractPlanStepsFromTodoInput to emit turn.plan.updated events during TodoWrite input streaming and content_block_stop. Created ProviderStatusCache Effect service (in-memory Ref-backed cache) for future use. commit aaccef1d007cbf93c0345f3a67ac02563b206299 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 18:58:31 2026 +0200 Improved shell PATH hydration with candidate iteration, launchctl fallback, and PATH merging Adapted from upstream t3code #1799. Adds listLoginShellCandidates, mergePathEntries, and readPathFromLaunchctl to @bigcode/shared/shell. Updated fixPath() in os-jank to iterate over shell candidates with per-shell error logging, merge shell PATH with inherited PATH (shell entries first, deduped), and fall back to launchctl on macOS when all shell reads fail. commit 49d758876b3b8b2abc49fdf16256c9befc4e7113 Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 14:10:17 2026 +0200 Added: Upstream sync infrastructure for t3code fork adaptation - Created fork-upstream-adapter subagent enforcing read → understand → adapt → verify workflow - Added Upstream Sync section to AGENTS.md documenting bigCode's intentional divergence from t3code - This infrastructure prevents direct copy-paste transplants and ensures changes are properly adapted to bigCode conventions (Effect patterns, subpath imports, package roles) commit a382aeb0c1a63ddece6a96879aa2b26b488586ad Author: Youpele Michael <mjayjesus@gmail.com> Date: Tue Apr 14 14:02:04 2026 +0200 Squashed commit of the following: commit 22ae871ea564f47a239a1736335d9ecd844f6b1e Author: Youpele Michael <mjayjesus@gmail.com> Date: Mon Apr 13 02:57:27 2026 +0200 Fixed packaged desktop app backend crash by inlining JS deps and symlinking _modules - Changed server tsdown config to bundle all dependencies except native addons (node-pty) and packages needing runtime require.resolve (@github/copilot-sdk) into a self-contained bin.mjs - Updated desktop artifact build to install only external deps via npm, then rename node_modules to _modules (electron-builder strips node_modules) - Added ensureBackendModulesSymlink() in desktop main process that creates a node_modules -> _modules symlink at runtime before spawning the backend (NODE_PATH does not work for ESM module resolution) commit 703d43bc9ced4773d6247302bd1a9bdc8b8f37a6 Author: Youpele Michael <mjayjesus@gmail.com> Date: Mon Apr 13 01:54:25 2026 +0200 Fixed packaged desktop backend startup by staging server runtime The installed desktop app was only copying apps/server/dist into Resources/server, but dist/bin.mjs still imported runtime packages such as effect and @effect/platform-node. That left the spawned backend process without a resolvable server-local node_modules tree, causing ERR_MODULE_NOT_FOUND on startup and preventing the packaged app from connecting to its local WebSocket backend. Updated the desktop artifact pipeline to copy the full apps/server directory into extraResources, generate a standalone staged apps/server/package.json, and run bun install --production inside the staged server directory so Resources/server/dist/bin.mjs ships with matching production dependencies in installed builds. commit f6a8b2b3ca60acf6fa4d558e0da7be0562bf0b97 Author: Youpele Michael <mjayjesus@gmail.com> Date: Mon Apr 13 01:14:01 2026 +0200 fixed packaged app server spawn: placed server dist outside asar via extraResources commit 8dee6558cd51e02d259084837f17b7183525d9d1 Author: Youpele Michael <mjayjesus@gmail.com> Date: Mon Apr 13 00:39:07 2026 +0200 Fixed native addon asar packaging and improved server crash diagnostics commit cde60d1dbcd40b1852dea095db524aa1b42687d8 Author: Youpele Michael <mjayjesus@gmail.com> Date: Mon Apr 13 00:05:38 2026 +0200 Removed finalize job from release workflow (no GitHub App configured) commit 1fc7bf536910d0ff8563f5153bf2991279607a82 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 23:35:34 2026 +0200 Removed npm CLI publishing from release workflow (desktop-only app) commit 6861ff20c7d443d4475d445f6cd652c2f7cfe1f8 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 23:19:41 2026 +0200 Fixed release workflow to publish GitHub Release even if npm fails commit 4c515eb9e2e41c807ffa2710530fd6a58a102690 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 22:46:05 2026 +0200 Update release.yml commit f4298932ba32db555f14692ad277a3c2451034ac Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 20:42:07 2026 +0200 Build server CLI and check dist/bin.mjs Update release workflow to run the build from apps/server (bun run --cwd apps/server build --verbose) instead of filtering packages. Adjust the CLI publish script to assert the CLI artifact is dist/bin.mjs (was dist/index.mjs). These changes align the release job with the server app's build output and ensure the publish step validates the correct binary path. commit ac406d325293ea42a2e55fdd7a1ad0001bf4c5d1 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 20:02:31 2026 +0200 Updated installer entrypoints to use stable bootstrap script URLs Replaced the user-facing desktop install commands in the README, download page, and release docs so they fetch install.sh and install.ps1 directly from the repository instead of GitHub release asset URLs that 404 before a stable release exists. This keeps GitHub Releases as the source of desktop binaries while making the bootstrap script entrypoint consistently reachable for macOS, Linux, and Windows users. commit 1f5467d6f6da0d2c3d5b5903c24e85a495bf49ff Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 19:38:20 2026 +0200 Updated: Removed browser tests from CI and documented local-only policy Removed the Playwright cache, browser runtime install, and browser test steps from the CI quality job so the pipeline only runs formatting, linting, typechecking, unit tests, and builds. Documented that browser tests are now local-only, updated the command guidance in docs/browser-tests.md, and clarified that both active and deferred browser test files are excluded from CI/CD. commit a98c8a416fd2034be3bccad579ba8f238ad62e94 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 18:42:17 2026 +0200 Squashed commit of the following: commit 08243090054b1714aae46ac3873cf3c34c92f3cc Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 18:41:30 2026 +0200 Updated sidebar swipe delete interactions and project removal cleanup Added a shared sidebar swipe-reveal interaction for thread and project rows so destructive actions stay consistent across touch, mouse, and trackpad input. Updated project removal to use the in-app confirmation dialog, cascade thread deletion through orchestration, preserve app-only deletion messaging, and clean up local draft, selection, terminal, and navigation state when projects are removed. commit 9a1ff8e68fbe44216e1f344ec5888174bf0d5091 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 14:36:40 2026 +0200 Squashed commit of the following: commit cd6f0fe1cdce573a5c08dd874c92495a5b0b4334 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 14:14:34 2026 +0200 Added: shared Searchbar for picker and branch search Created a shared Searchbar so the provider model picker, branch selector, and command input can reuse one search header instead of maintaining separate implementations. This keeps the ProviderModelPicker treatment as the visual source of truth while still letting specific consumers hide the search icon when they need to preserve their intended layout.\n\nAlso repaired branch filtering so results update while typing again, aligned the branch placeholder styling and copy with the provider picker, and updated the browser test selectors to match. Added focus-visible states and data-slot hooks so the shared controls stay accessible and easier to target in follow-up review fixes. commit 271aeebd0dac3e4f5489bc17304bcf315134cc8f Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 13:33:28 2026 +0200 Fixed: sent OpenCode image attachments as file parts Image attachments were reaching Copilot but not OpenCode, so persisted attachments now flow through the server adapter and are serialized into promptAsync as provider file parts backed by file URLs. This passes attachmentsDir into the OpenCode session dependencies, resolves stored image attachments during sendTurn, and adds a focused regression test so this mismatch does not regress.\n\nIt also includes a small Effect cleanup in ProviderNativeThreadTitleGeneration to keep typecheck green. Verification was completed successfully with bun fmt, bun lint, and bun typecheck, and the user confirmed the fix is now working. commit 9d63ef517578e15c149266a993df31504c38032f Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:43:41 2026 +0200 Updated: refined git workspace controls and editor link handling Git controls now keep draft-thread branch state aligned with the active workspace and present clearer checkout semantics for local versus worktree flows. The same cleanup improved wrapped terminal links, markdown file URLs, editor branding, and SSR-safe theming so desktop and web affordances behave more predictably. commit b37b0296edc4dd9dab71e458d54864791fdbe9f3 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:43:34 2026 +0200 Added: expanded composer skills, runtime controls, and timeline actions The composer now supports discovered skill triggers, selection-surround editing, and the new auto-accept-edits runtime option while preserving persisted draft state. This also moved changed-file expansion into thread UI state and exposed assistant copy actions so follow-up conversations stay easier to manage across turns. commit b1317846ea8648b3b362f5aa2e0ac07e3e77c86f Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:43:08 2026 +0200 Updated: retried websocket recovery and stabilized chat resize behavior Websocket recovery now retries snapshot and replay flows through shared transport-aware logic, and stalled reconnects restart from explicit coordinator rules instead of drifting into exhausted state. The same pass simplified chat footer sizing and browser coverage so resize-driven composer behavior stays predictable while transport reconnects recover. commit a9d34220e821e57f73ef9509f09ebf8be0896adb Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:42:52 2026 +0200 Added: wired a global command palette into app shortcuts Registered mod+k as a first-class keybinding, added command-palette state and UI, and routed root-level navigation through the new palette. This also tightened shortcut coverage and preserved contextual new-thread defaults when launching actions from anywhere in the app. commit f6eae3f3e49e7e617dc4e5bd0ed8b623f0cb4e1f Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:42:47 2026 +0200 Added: exposed provider discovery metadata and intermediate runtime mode Providers now publish discovered slash commands and Codex skills, while runtime mode handling distinguishes supervised, auto-accept-edits, and full-access behavior across Claude and Codex. The update also keeps provider snapshots and terminal env filtering aligned with the expanded server contract. commit 095d962690242904f3d596f0be25fa4c9f9f42a7 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:42:41 2026 +0200 Updated: hardened git status refresh around missing worktrees Git status and branch lookups now treat deleted or invalid working directories as non-repository states instead of surfacing brittle command failures. Also refreshed local git status after turn completion and tightened GitHub PR decoding so orchestration and stacked actions stay in sync with real workspace state. commit a178a6017574eeecade34a253fb634080f65f9b8 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:41:01 2026 +0200 Added: scanned desktop backend ports and image copy menu support Desktop startup now searches for an available loopback port starting from the stable default instead of reserving a random one. Also exposed Copy Image in the desktop context menu and covered both behaviors with focused tests. commit 8b147fe44506aa2b1beec310d7d7846ed27fb7d9 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sun Apr 12 03:35:13 2026 +0200 Fixed: restored branch picker selection for large branch lists The branch list request was succeeding, but the selector's virtualized combobox path was not rendering large result sets correctly and item activation still depended on local click handlers instead of the combobox selection flow. Removed the broken virtualized rendering path, routed checkout/create actions through Combobox onValueChange, and added a focused browser regression test covering large branch lists and successful checkout selection. Validated with bun fmt, bun lint, bun typecheck, bun run --cwd apps/web vitest run src/components/git/BranchToolbar.logic.test.ts, and bun run --cwd apps/web test:browser -- --run src/components/git/BranchToolbarBranchSelector.browser.tsx. commit 1201750c9ec905e1d8020a0fde13c7540473e1c3 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 21:38:03 2026 +0200 Deferred flaky ProviderModelPicker browser test and documented convention Renamed ProviderModelPicker.browser.tsx to ProviderModelPicker.deferred-browser.tsx so it falls outside the Vitest include glob (src/components/**/*.browser.tsx) and no longer blocks CI in headless Chromium. Added docs/browser-tests.md documenting the deferred-browser naming convention, the reason for the rename, and instructions for re-enabling the test once the root cause of the intermittent failure is resolved. commit c9eb06abd55d83a13e6b68f789af238a2dbf0bd9 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 20:50:19 2026 +0200 Changed default home dir from .t3 to .bigCode Switch the default application/state directory from ~/.t3 to ~/.bigCode across code, docs, and tests. Updated references include desktop BASE_DIR, server telemetry and os utilities, dev-runner default, web worktree tests, and documentation (scripts, keybindings, observability). Tests and examples were adjusted to expect ~/.bigCode where applicable. commit b5dc035104b18ee8205f0477303bdb1547513f3e Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 17:50:35 2026 +0200 Fixed brittle server tests and restored typed error propagation in assertValidCwd - cli-config.test.ts: corrected otlpServiceName from 't3-server' to 'bigcode-server' - GitHubCli.test.ts: fixed vi.mock path from '../../processRunner' to '../../utils/processRunner' so the mock actually intercepts the real import - codexAppServerManager.test.ts: replaced vi.spyOn on non-existent instance method with vi.mock('./codexVersionCheck') module mock; added missing 4th argument (undefined) to all sendRequest assertions to match the actual 4-arg call signature in turnOps() - ProviderCommandReactor.test.ts: wired workspaceRoot from createHarness input into project.create dispatch; passed workspaceRoot: baseDir in file-expansion test so buildPathReferenceBlock resolves correctly; changed thread.create title to 'New thread' so canReplaceThreadTitle returns true; added modelSelection to second thread-title test's turn.start dispatch so title generation is triggered - Manager.process.ts: removed Effect.orDie from assertValidCwd so TerminalCwdError propagates as a typed failure instead of a fiber defect; updated return type from Effect<void, never> to Effect<void, TerminalCwdError> - Manager.session.ts: imported TerminalCwdError and updated SessionApiContext.assertValidCwd signature to match the new typed return type commit febb1368f1cabb043901932bcd4291ed76f53279 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 17:19:34 2026 +0200 Fixed GitManager missing-directory handling and stale PR fixtures Unwrapped GitCommandError causes when detecting missing-directory status lookups so GitManager continues returning the explicit non-repo result after executor error wrapping changed. Also updated the GitManager tests to use a guaranteed-missing child path instead of deleting a scoped temp directory, and aligned the fork repository fixture with the current bigCode repository name. commit 8dfcccf76120e52d85a8bbcb2308eb0960634836 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 17:03:46 2026 +0200 Added missing GitManager invalidateStatus mock to server tests Updated the shared server router test harness to provide GitManager.invalidateStatus after websocket git RPC routing started refreshing git status through the manager. This keeps the seam tests aligned with the current GitManager contract and prevents UnimplementedError failures in CI when exercising git websocket methods. commit 42af91f1f61b99521778c9876bbdd4741110eb5f Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:54:46 2026 +0200 Update tests to reflect new provider options and fix context menu mock path commit 0a0fd47ffc1380877395f2f1fc6ba0d246b94950 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:54:41 2026 +0200 Show BigCode logo centered on empty state instead of text commit eacceb3174f65069400598e91c201643773d4115 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:38:59 2026 +0200 Updated CI to use GitHub-hosted Ubuntu runner Replaced the unavailable Blacksmith runner label with ubuntu-24.04 so the quality job can start reliably in this repository instead of waiting indefinitely for a matching runner. commit 7f051c82ebd365ce41d7036a80df16ad71205dc1 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:16:56 2026 +0200 Updated GitHub Actions release validation and quality gates Added release asset assembly on main so CI validates the final desktop release payload shape, and added the format check to tagged release preflight so public releases use the same quality gates as main. commit 827f319917627ca34a1e23ee3a88d83fa4b1a333 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:12:43 2026 +0200 Squashed commit of the following: commit 177da1839eb84b7419225d664fbde6d846927568 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:04:02 2026 +0200 Added GitHub-hosted desktop installers and release build automation Published install.sh and install.ps1 as GitHub release assets, updated CI to validate cross-platform desktop release builds on main, and documented the direct curl and PowerShell install flow. commit a56ceb5ae597d3a94e97f14b9a575f5e86fbe4f6 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 15:46:05 2026 +0200 Reorganized: Updated documentation structure and content Reorganized root-level markdown files and updated documentation: - Updated AGENTS.md: Added apps/desktop and apps/marketing to Package Roles section - Updated .plans/README.md: Expanded from 10 to 19 numbered plans, organized into Numbered Plans, Additional Plans, and Specs sections - Updated CONTRIBUTING.md: Clarified that feature requests are accepted via issues, but code contributions (PRs) are not actively accepted - Moved REMOTE.md and KEYBINDINGS.md from root to docs/ directory for better organization - Deleted TODO.md (minor task list better tracked elsewhere) commit 79f163d01ac78995bb15814295f0f0825a6ea511 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 15:02:40 2026 +0200 Updated: moved first-turn thread titles to server-owned provider-native generation Removed the client-side first-send title heuristic so draft threads keep their neutral placeholder until the server generates the real title. The first-turn orchestration flow now passes the turn's actual model selection into thread title generation instead of reading the global text-generation setting. Added native provider-specific title generation paths for Copilot and OpenCode while keeping existing git commit, PR, and branch generation fallback routing scoped to those operations. Tightened Copilot and OpenCode title extraction so JSON-like or fenced responses are unwrapped to the actual title text, and updated orchestration/browser tests to assert that the client no longer sends a synthetic thread.meta.update for first-send titles. commit e40449c906f1baa65d370c027f0b48bee730dbcb Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 04:50:36 2026 +0200 Updated: Simplified DiffPanel component by removing lazy loading Removed Suspense and lazy loading from the DiffPanel component to simplify the code and improve initial load consistency: - apps/web/src/routes/_chat.$threadId.tsx: - Replaced lazy() import with direct import - Removed Suspense wrapper and DiffLoadingFallback component - Renamed LazyDiffPanel to DeferredDiffPanel for clarity - Removed unused imports (Suspense, lazy, DiffPanelHeaderSkeleton, DiffPanelLoadingState, DiffPanelShell) - Fixed useEffect dependency array (removed unused threadId variable) The DiffPanel now loads synchronously when needed, eliminating the loading state flash and reducing component complexity. The deferred rendering is still controlled by the renderDiffContent flag to prevent unnecessary initialization. commit a55032040a558ace79a7d9b8a37f7ae4c2db76b6 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 04:50:30 2026 +0200 Updated: Changed diff.toggle keybinding and improved keyboard event capture handling Changed the diff.toggle command shortcut from mod+d to mod+shift+g across all keybinding configurations to avoid conflicts with other commands. Updated event listener registration to use capture phase ({ capture: true }) for more reliable keyboard shortcut handling: Files updated: - apps/server/src/keybindings/keybindings.ts: Changed diff.toggle from mod+d to mod+shift+g - apps/server/src/keybindings/keybindings.test.ts: Added assertion for new diff.toggle shortcut - apps/web/src/components/chat/view/ChatView.keybindings.logic.ts: Added capture: true to keydown handler - apps/web/src/components/sidebar/Sidebar.keyboardNav.logic.ts: Added capture: true to keydown/keyup handlers - apps/web/src/routes/_chat.tsx: Added capture: true to global keyboard shortcut handler - apps/web/src/models/keybindings/keybindings.models.test.ts: Updated all diff.toggle test assertions - packages/contracts/src/server/keybindings.test.ts: Updated test keybinding to use mod+shift+g The capture phase ensures keybinding handlers execute before bubbling-phase handlers, preventing shortcuts from being intercepted by child components. commit c920482aa5f569909a95815ad656412ad4ffa370 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 04:50:23 2026 +0200 Refactored: Split monolithic ChatView.browser.tsx into modular test files Replaced the single 2,948-line ChatView.browser.tsx test file with a structured ChatView.browser/ directory containing 12 focused modules. The split improves maintainability by separating concerns into logical groupings: - fixtures.ts: Pure data factories, snapshot builders, and viewport specifications - scenarioFixtures.ts: Specialized snapshot builders for complex test scenarios - dom.ts: DOM interaction helpers, keyboard shortcuts, and wait utilities - types.ts: Shared TypeScript interfaces and type definitions - context.tsx: Browser test context with MSW worker, RPC harness, and state management - mount.ts: Test mounting utilities and measurement helpers Test files (each under 500 lines): - timelineEstimator.integration-test.browser.tsx: Timeline virtualization height estimation tests - editorPicker.integration-test.browser.tsx: Editor/IDE picker integration tests - scriptsWorktree.integration-test.browser.tsx: Project scripts and worktree handling tests - composer.integration-test.browser.tsx: Composer interactions, terminal context, and send behavior - threading.integration-test.browser.tsx: Thread lifecycle, shortcuts, and sidebar navigation - layout.integration-test.browser.tsx: Footer layout and resize behavior tests - archivePlan.integration-test.browser.tsx: Archive actions and plan expansion tests Each test file now manages its own beforeAll/afterAll/beforeEach/afterEach lifecycle while sharing the extracted infrastructure modules. This follows the project's maintainability priority of avoiding duplicate logic and keeping files focused. commit c16499a92f4027e2ab4b3ae977905fe28fef05b8 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 02:15:35 2026 +0200 Added: surfaced discovered agents and expanded compact mentions for provider turns Added a discovery registry that scans provider-specific agent and skill definitions, publishes the catalog through server config updates, and exposes the new discovery types in shared contracts so the web app can autocomplete and render them. Updated the composer, mention parsing, and message timeline to support compact @agent::, @skill::, and workspace path references while keeping the stored user message text unchanged. Expanded those references on the server before sending a turn to providers so agent instructions, skill guidance, and referenced file contents are available as active context without mutating the persisted transcript. Added tests for provider input expansion, discovery-backed server state, mention logic, and message rendering, and included supporting refactors in terminal and git helpers needed to keep the new flow reliable. commit 923f6ae8c96d029914fcf95ef3b64aa03639b92d Author: Youpele Michael <mjayjesus@gmail.com> Date: Fri Apr 10 23:17:00 2026 +0200 Extracted hardcoded T3 server branding into shared constants in @bigcode/contracts - Created APP_BASE_NAME, APP_SERVER_NAME, and APP_SERVER_SLUG constants in packages/contracts/src/constants/branding.constant.ts - Replaced all hardcoded 'T3 server' or 'T3' references across server CLI, web WebSocket UI, RPC protocol, and transport error modules with the new APP_SERVER_NAME and APP_SERVER_SLUG constants - Re-exported branding constants from @bigcode/contracts barrel and web branding config - Updated websocket.constant.ts JSDoc to reference APP_SERVER_NAME commit fbf3b553a98b210e77ce4c5c828de222466298d9 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 15:03:41 2026 +0200 Squashed commit of the following: commit 79f163d01ac78995bb15814295f0f0825a6ea511 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 15:02:40 2026 +0200 Updated: moved first-turn thread titles to server-owned provider-native generation Removed the client-side first-send title heuristic so draft threads keep their neutral placeholder until the server generates the real title. The first-turn orchestration flow now passes the turn's actual model selection into thread title generation instead of reading the global text-generation setting. Added native provider-specific title generation paths for Copilot and OpenCode while keeping existing git commit, PR, and branch generation fallback routing scoped to those operations. Tightened Copilot and OpenCode title extraction so JSON-like or fenced responses are unwrapped to the actual title text, and updated orchestration/browser tests to assert that the client no longer sends a synthetic thread.meta.update for first-send titles. commit e40449c906f1baa65d370c027f0b48bee730dbcb Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 04:50:36 2026 +0200 Updated: Simplified DiffPanel component by removing lazy loading Removed Suspense and lazy loading from the DiffPanel component to simplify the code and improve initial load consistency: - apps/web/src/routes/_chat.$threadId.tsx: - Replaced lazy() import with direct import - Removed Suspense wrapper and DiffLoadingFallback component - Renamed LazyDiffPanel to DeferredDiffPanel for clarity - Removed unused imports (Suspense, lazy, DiffPanelHeaderSkeleton, DiffPanelLoadingState, DiffPanelShell) - Fixed useEffect dependency array (removed unused threadId variable) The DiffPanel now loads synchronously when needed, eliminating the loading state flash and reducing component complexity. The deferred rendering is still controlled by the renderDiffContent flag to prevent unnecessary initialization. commit a55032040a558ace79a7d9b8a37f7ae4c2db76b6 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 04:50:30 2026 +0200 Updated: Changed diff.toggle keybinding and improved keyboard event capture handling Changed the diff.toggle command shortcut from mod+d to mod+shift+g across all keybinding configurations to avoid conflicts with other commands. Updated event listener registration to use capture phase ({ capture: true }) for more reliable keyboard shortcut handling: Files updated: - apps/server/src/keybindings/keybindings.ts: Changed diff.toggle from mod+d to mod+shift+g - apps/server/src/keybindings/keybindings.test.ts: Added assertion for new diff.toggle shortcut - apps/web/src/components/chat/view/ChatView.keybindings.logic.ts: Added capture: true to keydown handler - apps/web/src/components/sidebar/Sidebar.keyboardNav.logic.ts: Added capture: true to keydown/keyup handlers - apps/web/src/routes/_chat.tsx: Added capture: true to global keyboard shortcut handler - apps/web/src/models/keybindings/keybindings.models.test.ts: Updated all diff.toggle test assertions - packages/contracts/src/server/keybindings.test.ts: Updated test keybinding to use mod+shift+g The capture phase ensures keybinding handlers execute before bubbling-phase handlers, preventing shortcuts from being intercepted by child components. commit c920482aa5f569909a95815ad656412ad4ffa370 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 04:50:23 2026 +0200 Refactored: Split monolithic ChatView.browser.tsx into modular test files Replaced the single 2,948-line ChatView.browser.tsx test file with a structured ChatView.browser/ directory containing 12 focused modules. The split improves maintainability by separating concerns into logical groupings: - fixtures.ts: Pure data factories, snapshot builders, and viewport specifications - scenarioFixtures.ts: Specialized snapshot builders for complex test scenarios - dom.ts: DOM interaction helpers, keyboard shortcuts, and wait utilities - types.ts: Shared TypeScript interfaces and type definitions - context.tsx: Browser test context with MSW worker, RPC harness, and state management - mount.ts: Test mounting utilities and measurement helpers Test files (each under 500 lines): - timelineEstimator.integration-test.browser.tsx: Timeline virtualization height estimation tests - editorPicker.integration-test.browser.tsx: Editor/IDE picker integration tests - scriptsWorktree.integration-test.browser.tsx: Project scripts and worktree handling tests - composer.integration-test.browser.tsx: Composer interactions, terminal context, and send behavior - threading.integration-test.browser.tsx: Thread lifecycle, shortcuts, and sidebar navigation - layout.integration-test.browser.tsx: Footer layout and resize behavior tests - archivePlan.integration-test.browser.tsx: Archive actions and plan expansion tests Each test file now manages its own beforeAll/afterAll/beforeEach/afterEach lifecycle while sharing the extracted infrastructure modules. This follows the project's maintainability priority of avoiding duplicate logic and keeping files focused. commit c16499a92f4027e2ab4b3ae977905fe28fef05b8 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 02:15:35 2026 +0200 Added: surfaced discovered agents and expanded compact mentions for provider turns Added a discovery registry that scans provider-specific agent and skill definitions, publishes the catalog through server config updates, and exposes the new discovery types in shared contracts so the web app can autocomplete and render them. Updated the composer, mention parsing, and message timeline to support compact @agent::, @skill::, and workspace path references while keeping the stored user message text unchanged. Expanded those references on the server before sending a turn to providers so agent instructions, skill guidance, and referenced file contents are available as active context without mutating the persisted transcript. Added tests for provider input expansion, discovery-backed server state, mention logic, and message rendering, and included supporting refactors in terminal and git helpers needed to keep the new flow reliable. commit 923f6ae8c96d029914fcf95ef3b64aa03639b92d Author: Youpele Michael <mjayjesus@gmail.com> Date: Fri Apr 10 23:17:00 2026 +0200 Extracted hardcoded T3 server branding into shared constants in @bigcode/contracts - Created APP_BASE_NAME, APP_SERVER_NAME, and APP_SERVER_SLUG constants in packages/contracts/src/constants/branding.constant.ts - Replaced all hardcoded 'T3 server' or 'T3' references across server CLI, web WebSocket UI, RPC protocol, and transport error modules with the new APP_SERVER_NAME and APP_SERVER_SLUG constants - Re-exported branding constants from @bigcode/contracts barrel and web branding config - Updated websocket.constant.ts JSDoc to reference APP_SERVER_NAME commit 377ef39db1bc3b9bf1c32b20ada94a37949d674e Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 03:13:57 2026 +0200 Squashed commit of the following: commit c16499a92f4027e2ab4b3ae977905fe28fef05b8 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 02:15:35 2026 +0200 Added: surfaced discovered agents and expanded compact mentions for provider turns Added a discovery registry that scans provider-specific agent and skill definitions, publishes the catalog through server config updates, and exposes the new discovery types in shared contracts so the web app can autocomplete and render them. Updated the composer, mention parsing, and message timeline to support compact @agent::, @skill::, and workspace path references while keeping the stored user message text unchanged. Expanded those references on the server before sending a turn to providers so agent instructions, skill guidance, and referenced file contents are available as active context without mutating the persisted transcript. Added tests for provider input expansion, discovery-backed server state, mention logic, and message rendering, and included supporting refactors in terminal and git helpers needed to keep the new flow reliable. commit 923f6ae8c96d029914fcf95ef3b64aa03639b92d Author: Youpele Michael <mjayjesus@gmail.com> Date: Fri Apr 10 23:17:00 2026 +0200 Extracted hardcoded T3 server branding into shared constants in @bigcode/contracts - Created APP_BASE_NAME, APP_SERVER_NAME, and APP_SERVER_SLUG constants in packages/contracts/src/constants/branding.constant.ts - Replaced all hardcoded 'T3 server' or 'T3' references across server CLI, web WebSocket UI, RPC protocol, and transport error modules with the new APP_SERVER_NAME and APP_SERVER_SLUG constants - Re-exported branding constants from @bigcode/contracts barrel and web branding config - Updated websocket.constant.ts JSDoc to reference APP_SERVER_NAME commit 02b7a73625c9ccebc6b878325be62574c863af97 Merge: c3e6da60 88a6683d Author: youpele52 <mjayjesus@gmail.com> Date: Fri Apr 10 01:13:23 2026 +0200 Added bundled Meslo Nerd Font with terminal appearance settings Added bundled Meslo Nerd Font with terminal appearance settings commit 69760eeed4c219437f8e4492dc53a50ee9c87012 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 21:52:30 2026 +0200 Squashed commit of the following: commit 1201750c9ec905e1d8020a0fde13c7540473e1c3 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 21:38:03 2026 +0200 Deferred flaky ProviderModelPicker browser test and documented convention Renamed ProviderModelPicker.browser.tsx to ProviderModelPicker.deferred-browser.tsx so it falls outside the Vitest include glob (src/components/**/*.browser.tsx) and no longer blocks CI in headless Chromium. Added docs/browser-tests.md documenting the deferred-browser naming convention, the reason for the rename, and instructions for re-enabling the test once the root cause of the intermittent failure is resolved. commit c9eb06abd55d83a13e6b68f789af238a2dbf0bd9 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 20:50:19 2026 +0200 Changed default home dir from .t3 to .bigCode Switch the default application/state directory from ~/.t3 to ~/.bigCode across code, docs, and tests. Updated references include desktop BASE_DIR, server telemetry and os utilities, dev-runner default, web worktree tests, and documentation (scripts, keybindings, observability). Tests and examples were adjusted to expect ~/.bigCode where applicable. commit b5dc035104b18ee8205f0477303bdb1547513f3e Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 17:50:35 2026 +0200 Fixed brittle server tests and restored typed error propagation in assertValidCwd - cli-config.test.ts: corrected otlpServiceName from 't3-server' to 'bigcode-server' - GitHubCli.test.ts: fixed vi.mock path from '../../processRunner' to '../../utils/processRunner' so the mock actually intercepts the real import - codexAppServerManager.test.ts: replaced vi.spyOn on non-existent instance method with vi.mock('./codexVersionCheck') module mock; added missing 4th argument (undefined) to all sendRequest assertions to match the actual 4-arg call signature in turnOps() - ProviderCommandReactor.test.ts: wired workspaceRoot from createHarness input into project.create dispatch; passed workspaceRoot: baseDir in file-expansion test so buildPathReferenceBlock resolves correctly; changed thread.create title to 'New thread' so canReplaceThreadTitle returns true; added modelSelection to second thread-title test's turn.start dispatch so title generation is triggered - Manager.process.ts: removed Effect.orDie from assertValidCwd so TerminalCwdError propagates as a typed failure instead of a fiber defect; updated return type from Effect<void, never> to Effect<void, TerminalCwdError> - Manager.session.ts: imported TerminalCwdError and updated SessionApiContext.assertValidCwd signature to match the new typed return type commit febb1368f1cabb043901932bcd4291ed76f53279 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 17:19:34 2026 +0200 Fixed GitManager missing-directory handling and stale PR fixtures Unwrapped GitCommandError causes when detecting missing-directory status lookups so GitManager continues returning the explicit non-repo result after executor error wrapping changed. Also updated the GitManager tests to use a guaranteed-missing child path instead of deleting a scoped temp directory, and aligned the fork repository fixture with the current bigCode repository name. commit 8dfcccf76120e52d85a8bbcb2308eb0960634836 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 17:03:46 2026 +0200 Added missing GitManager invalidateStatus mock to server tests Updated the shared server router test harness to provide GitManager.invalidateStatus after websocket git RPC routing started refreshing git status through the manager. This keeps the seam tests aligned with the current GitManager contract and prevents UnimplementedError failures in CI when exercising git websocket methods. commit 42af91f1f61b99521778c9876bbdd4741110eb5f Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:54:46 2026 +0200 Update tests to reflect new provider options and fix context menu mock path commit 0a0fd47ffc1380877395f2f1fc6ba0d246b94950 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:54:41 2026 +0200 Show BigCode logo centered on empty state instead of text commit eacceb3174f65069400598e91c201643773d4115 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:38:59 2026 +0200 Updated CI to use GitHub-hosted Ubuntu runner Replaced the unavailable Blacksmith runner label with ubuntu-24.04 so the quality job can start reliably in this repository instead of waiting indefinitely for a matching runner. commit 7f051c82ebd365ce41d7036a80df16ad71205dc1 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:16:56 2026 +0200 Updated GitHub Actions release validation and quality gates Added release asset assembly on main so CI validates the final desktop release payload shape, and added the format check to tagged release preflight so public releases use the same quality gates as main. commit 827f319917627ca34a1e23ee3a88d83fa4b1a333 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:12:43 2026 +0200 Squashed commit of the following: commit 177da1839eb84b7419225d664fbde6d846927568 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 16:04:02 2026 +0200 Added GitHub-hosted desktop installers and release build automation Published install.sh and install.ps1 as GitHub release assets, updated CI to validate cross-platform desktop release builds on main, and documented the direct curl and PowerShell install flow. commit a56ceb5ae597d3a94e97f14b9a575f5e86fbe4f6 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 15:46:05 2026 +0200 Reorganized: Updated documentation structure and content Reorganized root-level markdown files and updated documentation: - Updated AGENTS.md: Added apps/desktop and apps/marketing to Package Roles section - Updated .plans/README.md: Expanded from 10 to 19 numbered plans, organized into Numbered Plans, Additional Plans, and Specs sections - Updated CONTRIBUTING.md: Clarified that feature requests are accepted via issues, but code contributions (PRs) are not actively accepted - Moved REMOTE.md and KEYBINDINGS.md from root to docs/ directory for better organization - Deleted TODO.md (minor task list better tracked elsewhere) commit 79f163d01ac78995bb15814295f0f0825a6ea511 Author: Youpele Michael <mjayjesus@gmail.com> Date: Sat Apr 11 15:02:40 2026 +0200 Updated: moved first-turn thread titles to server-owned provider-native generation Removed the client-side first-send title heuristic so draft threads keep their neutral placeholder until the server generates the real title. The first-turn orchestration flow now passes the turn's actual model selection into thread title generation instead of reading the global text-generation setting. Added native provider-specific title generation paths for Copilot and OpenCode while keeping existing git commit, PR, and branch generation fallback routing scoped to those operations. Tightened Copilot and …
1 parent 8fd5797 commit 6fa50fa

File tree

16 files changed

+610
-56
lines changed

16 files changed

+610
-56
lines changed

apps/desktop/src/backend/backendManager.ts

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,44 @@ import {
77
writeBackendSessionBoundary,
88
} from "../logging/logging";
99
import {
10-
ensureBackendModulesSymlink,
10+
ensureBackendModulesPath,
1111
resolveBackendCwd,
1212
resolveBackendEntry,
1313
} from "../env/pathResolver";
1414
import type { RotatingFileSink } from "@bigcode/shared/logging";
1515
import { readPersistedBackendObservabilitySettings } from "../logging/logging";
1616

17+
// ---------------------------------------------------------------------------
18+
// Windows-safe process termination
19+
// ---------------------------------------------------------------------------
20+
21+
/**
22+
* Kills a child process in a platform-safe way.
23+
*
24+
* On Windows, `child.kill()` only terminates the top-level process — it does
25+
* NOT kill the process tree. If the child was spawned with `shell: true` it
26+
* also leaves the real process running behind a `cmd.exe` wrapper.
27+
* `taskkill /T /F` terminates the entire tree reliably on all Windows versions.
28+
*
29+
* On POSIX we fall back to standard signal delivery.
30+
*/
31+
function killBackendProcess(
32+
child: ChildProcess.ChildProcess,
33+
signal: NodeJS.Signals = "SIGTERM",
34+
): void {
35+
if (process.platform === "win32" && child.pid !== undefined) {
36+
try {
37+
ChildProcess.spawnSync("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
38+
stdio: "ignore",
39+
});
40+
return;
41+
} catch {
42+
// taskkill unavailable — fall through to direct kill.
43+
}
44+
}
45+
child.kill(signal);
46+
}
47+
1748
// ---------------------------------------------------------------------------
1849
// Module-level state
1950
// ---------------------------------------------------------------------------
@@ -107,9 +138,9 @@ export function startBackend(): void {
107138
const backendLogSink = _deps.getBackendLogSink();
108139
const captureBackendLogs = backendLogSink !== null;
109140

110-
// Ensure _modules → node_modules symlink exists for ESM resolution of
141+
// Ensure _modules → node_modules link exists for ESM resolution of
111142
// external native packages (e.g. @github/copilot-sdk, node-pty).
112-
ensureBackendModulesSymlink();
143+
ensureBackendModulesPath();
113144

114145
// Always pipe stderr so we can capture crash output for diagnostics,
115146
// regardless of whether a log sink is configured.
@@ -161,7 +192,7 @@ export function startBackend(): void {
161192
);
162193
bootstrapStream.end();
163194
} else {
164-
child.kill("SIGTERM");
195+
killBackendProcess(child);
165196
scheduleBackendRestart("missing desktop bootstrap pipe");
166197
return;
167198
}
@@ -221,10 +252,10 @@ export function stopBackend(): void {
221252

222253
if (child.exitCode === null && child.signalCode === null) {
223254
expectedBackendExitChildren.add(child);
224-
child.kill("SIGTERM");
255+
killBackendProcess(child);
225256
setTimeout(() => {
226257
if (child.exitCode === null && child.signalCode === null) {
227-
child.kill("SIGKILL");
258+
killBackendProcess(child, "SIGKILL");
228259
}
229260
}, 2_000).unref();
230261
}
@@ -266,11 +297,11 @@ export async function stopBackendAndWaitForExit(timeoutMs = 5_000): Promise<void
266297
}
267298

268299
backendChild.once("exit", onExit);
269-
backendChild.kill("SIGTERM");
300+
killBackendProcess(backendChild);
270301

271302
forceKillTimer = setTimeout(() => {
272303
if (backendChild.exitCode === null && backendChild.signalCode === null) {
273-
backendChild.kill("SIGKILL");
304+
killBackendProcess(backendChild, "SIGKILL");
274305
}
275306
}, 2_000);
276307
forceKillTimer.unref();
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import * as Path from "node:path";
2+
3+
import { describe, expect, it } from "vitest";
4+
5+
import { resolveBackendModulesLinkPlan } from "./pathResolver.platform";
6+
7+
describe("resolveBackendModulesLinkPlan", () => {
8+
const resourcesPath = "/Applications/bigCode.app/Contents/Resources";
9+
10+
describe("Windows (win32)", () => {
11+
it("returns junction link type", () => {
12+
const plan = resolveBackendModulesLinkPlan("win32", resourcesPath);
13+
expect(plan.linkType).toBe("junction");
14+
});
15+
16+
it("uses absolute modulesDir as linkTarget", () => {
17+
const plan = resolveBackendModulesLinkPlan("win32", resourcesPath);
18+
expect(Path.isAbsolute(plan.linkTarget)).toBe(true);
19+
expect(plan.linkTarget).toBe(plan.modulesDir);
20+
});
21+
22+
it("computes correct paths from resourcesPath", () => {
23+
const plan = resolveBackendModulesLinkPlan("win32", resourcesPath);
24+
expect(plan.serverDir).toBe(Path.join(resourcesPath, "server"));
25+
expect(plan.modulesDir).toBe(Path.join(resourcesPath, "server", "_modules"));
26+
expect(plan.nodeModulesPath).toBe(Path.join(resourcesPath, "server", "node_modules"));
27+
});
28+
});
29+
30+
describe("macOS (darwin)", () => {
31+
it("returns dir link type", () => {
32+
const plan = resolveBackendModulesLinkPlan("darwin", resourcesPath);
33+
expect(plan.linkType).toBe("dir");
34+
});
35+
36+
it("uses relative _modules as linkTarget", () => {
37+
const plan = resolveBackendModulesLinkPlan("darwin", resourcesPath);
38+
expect(plan.linkTarget).toBe("_modules");
39+
expect(Path.isAbsolute(plan.linkTarget)).toBe(false);
40+
});
41+
42+
it("computes correct paths from resourcesPath", () => {
43+
const plan = resolveBackendModulesLinkPlan("darwin", resourcesPath);
44+
expect(plan.serverDir).toBe(Path.join(resourcesPath, "server"));
45+
expect(plan.modulesDir).toBe(Path.join(resourcesPath, "server", "_modules"));
46+
expect(plan.nodeModulesPath).toBe(Path.join(resourcesPath, "server", "node_modules"));
47+
});
48+
});
49+
50+
describe("Linux (linux)", () => {
51+
it("returns dir link type", () => {
52+
const plan = resolveBackendModulesLinkPlan("linux", resourcesPath);
53+
expect(plan.linkType).toBe("dir");
54+
});
55+
56+
it("uses relative _modules as linkTarget", () => {
57+
const plan = resolveBackendModulesLinkPlan("linux", resourcesPath);
58+
expect(plan.linkTarget).toBe("_modules");
59+
expect(Path.isAbsolute(plan.linkTarget)).toBe(false);
60+
});
61+
62+
it("computes correct paths from resourcesPath", () => {
63+
const plan = resolveBackendModulesLinkPlan("linux", resourcesPath);
64+
expect(plan.serverDir).toBe(Path.join(resourcesPath, "server"));
65+
expect(plan.modulesDir).toBe(Path.join(resourcesPath, "server", "_modules"));
66+
expect(plan.nodeModulesPath).toBe(Path.join(resourcesPath, "server", "node_modules"));
67+
});
68+
});
69+
70+
describe("Windows with Windows-style paths", () => {
71+
const winResourcesPath = "C:\\Program Files\\bigCode\\resources";
72+
73+
it("produces absolute Windows junction target", () => {
74+
const plan = resolveBackendModulesLinkPlan("win32", winResourcesPath);
75+
expect(plan.linkType).toBe("junction");
76+
expect(plan.linkTarget).toBe(plan.modulesDir);
77+
expect(plan.modulesDir).toBe(Path.join(winResourcesPath, "server", "_modules"));
78+
});
79+
});
80+
});
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/**
2+
* Pure, platform-aware backend module path resolver.
3+
*
4+
* This module is the single place that decides HOW `_modules` is made visible
5+
* to the packaged backend's Node.js ESM resolver as `node_modules`.
6+
*
7+
* ## Background
8+
*
9+
* electron-builder silently strips directories named `node_modules` from
10+
* `extraResources` copies. The build script works around this by renaming
11+
* the server's `node_modules` to `_modules` before electron-builder runs.
12+
* At runtime the desktop main process must recreate a path that Node.js ESM
13+
* resolution can find (it walks up the directory tree looking for
14+
* `node_modules/`). `NODE_PATH` is NOT used because Node.js ESM ignores it —
15+
* only CJS honours `NODE_PATH`.
16+
*
17+
* ## Strategy by platform
18+
*
19+
* | Platform | Link type | Target format |
20+
* |---------------|------------|---------------|
21+
* | macOS / Linux | `dir` | relative |
22+
* | Windows | `junction` | absolute |
23+
*
24+
* Windows directory symlinks require Developer Mode or admin privileges, so
25+
* we use NTFS **junctions** instead. Junctions:
26+
* - Do NOT require elevated privileges or Developer Mode on any modern Windows.
27+
* - Must point to an **absolute** path on the same NTFS volume.
28+
* - Are NOT traversed across volumes (fine here — both sides are inside the
29+
* app's `Resources/` directory).
30+
*
31+
* If junction creation also fails (unlikely, but defensive), the plan includes
32+
* a `fallback` strategy: copy `_modules` to `node_modules` so the packaged
33+
* backend can always start. This is heavier but ensures correctness on
34+
* locked-down machines.
35+
*/
36+
37+
import * as Path from "node:path";
38+
39+
// ---------------------------------------------------------------------------
40+
// Types
41+
// ---------------------------------------------------------------------------
42+
43+
/**
44+
* The link type passed to `fs.symlinkSync` / `fs.symlink`.
45+
* `"junction"` is a Windows-only NTFS junction (no privilege needed).
46+
* `"dir"` is a standard directory symlink (POSIX standard).
47+
*/
48+
export type ModuleLinkType = "junction" | "dir";
49+
50+
/**
51+
* The complete plan for making `_modules` resolvable as `node_modules`.
52+
* The plan is pure data; execution is handled by `ensureBackendModulesPath`.
53+
*/
54+
export interface BackendModulesLinkPlan {
55+
/** Absolute path to the server directory inside `Resources/`. */
56+
readonly serverDir: string;
57+
/** Absolute path to the `_modules` directory that was staged by the build. */
58+
readonly modulesDir: string;
59+
/** Absolute path where `node_modules` should appear. */
60+
readonly nodeModulesPath: string;
61+
/**
62+
* The value passed as the `target` argument to `fs.symlinkSync`.
63+
* - POSIX: relative string `"_modules"` (keeps bundle relocatable).
64+
* - Windows: absolute path to `_modules` (junctions require absolute targets).
65+
*/
66+
readonly linkTarget: string;
67+
/** The `type` argument for `fs.symlinkSync`. */
68+
readonly linkType: ModuleLinkType;
69+
}
70+
71+
// ---------------------------------------------------------------------------
72+
// Pure resolver (no I/O, fully testable)
73+
// ---------------------------------------------------------------------------
74+
75+
/**
76+
* Computes a `BackendModulesLinkPlan` for the given platform.
77+
*
78+
* @param platform `process.platform` value (`"win32"`, `"darwin"`, `"linux"`, …)
79+
* @param resourcesPath The Electron `process.resourcesPath` value for packaged
80+
* builds, or any directory in dev contexts.
81+
*/
82+
export function resolveBackendModulesLinkPlan(
83+
platform: string,
84+
resourcesPath: string,
85+
): BackendModulesLinkPlan {
86+
const serverDir = Path.join(resourcesPath, "server");
87+
const modulesDir = Path.join(serverDir, "_modules");
88+
const nodeModulesPath = Path.join(serverDir, "node_modules");
89+
90+
if (platform === "win32") {
91+
// Windows junctions must point to an absolute target.
92+
return {
93+
serverDir,
94+
modulesDir,
95+
nodeModulesPath,
96+
linkTarget: modulesDir,
97+
linkType: "junction",
98+
};
99+
}
100+
101+
// macOS / Linux: use a relative symlink so the .app bundle stays relocatable.
102+
return {
103+
serverDir,
104+
modulesDir,
105+
nodeModulesPath,
106+
linkTarget: "_modules",
107+
linkType: "dir",
108+
};
109+
}

0 commit comments

Comments
 (0)