Skip to content

feat: numerous bugfixes and features - #1037

Open
blackmammoth wants to merge 40 commits into
mainfrom
fix/upgrade-v2
Open

feat: numerous bugfixes and features#1037
blackmammoth wants to merge 40 commits into
mainfrom
fix/upgrade-v2

Conversation

@blackmammoth

@blackmammoth blackmammoth commented Jul 18, 2026

Copy link
Copy Markdown
Member

Closes PR #578. Closes PR #962. Closes PR #980. Closes PR #1055. Closes PR #985.

This pull request introduces several improvements and bug fixes related to session ID handling, worktree management, and dependency updates. The main focus is on ensuring that session and process management consistently use the correct session identifiers (distinguishing between app-level and provider-native IDs), adding support for Git worktree management, and updating dependencies for enhanced Markdown support.

Session and Process Management Improvements:

  • Refactored session and process key handling in both server/claude-sdk.js and server/cursor-cli.js to always use the provider-native session ID for SDK/CLI operations, while ensuring notifications and process maps use the app session ID when available. This prevents mismatches and ensures aborts and lookups work reliably across all code paths. [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17]

Worktree Management:

  • Added new API routes and service exports to support Git worktree management, including registering, deleting, and restoring worktree projects. This includes new exports in the projects module and new route registration in the main server. [1] [2] [3] [4]

Dependency and SDK Updates:

  • Added the remark-breaks package to improve Markdown line break handling and introduced a new test script for running server-side tests. [1] [2]

Claude Provider Synchronizer Fix:

  • Updated the Claude session synchronizer to also skip tool result transcripts (not just subagent transcripts) when indexing sessions, preventing session record corruption.

Bug Fixes:

  • Fixed a bug in mapCliOptionsToSDK to use providerSessionId instead of sessionId for correct SDK resume behavior. [1] [2]

Let me know if you have questions about any of these changes!

Summary by CodeRabbit

  • New Features
    • Added Git worktree management (create/open/merge/remove) with a new Worktrees panel and API endpoints.
    • Exposed provider session details and session token-usage via new APIs.
    • Added chat export (Markdown/HTML/PDF), image lightbox, expandable tool error display, and improved Markdown (single-newline hard breaks).
    • Introduced File Tree, voice, agent, plugins, settings, TaskMaster, and system update capabilities.
  • Bug Fixes
    • Improved Codex/Claude transcript parsing, WebSocket heartbeat/reconnect resilience, and shell/Pty lifecycle handling.

Guard retained PTY ownership so delayed close events cannot detach a replacement socket.

Terminate half-open sockets after a missed pong.

Cover both lifecycle paths with focused tests.
- show a "Run git init" button in Source Control when the project is not
  a git repository (new POST /api/git/init), hide the branch/refresh
  header controls in that state, and stop logging the expected no-repo
  state as a server error
- track commit-history loading separately so "No commits found" no longer
  flashes while commits are still being fetched
- hide "Create Initial Commit" when the reposi
- auto-refresh the window after a platform update ("This will refresh the
  window in N seconds") and cancel the refresh if the update fails
- handle non-JSON responses from /api/system/update so hosted/Docker
  deployments no longer surface "Unexpected token '<'" when the server
  restarts mid-update
…rror rows

Session routing: /session/<id> URLs could select the wrong project or show
nothing, because the frontend only searched the paginated project payloads
(first session page per project) and fell back to binding the session to
whatever project was selected.

- add GET /api/providers/sessions/:sessionId resolving a session (by app id,
  falling back to the provider-native id) to its metadata and owning project
- resolve unmatched URL sessions thro correct
  project, and renavigate provider-native alias ids to the canonical app id
- keep the selected-project placeholder only as a fallback for unknown ids

Chat errors and commands:

- Bash command rows no longer auto-ex and
  status badge signal the failure and output stays behind the chevron
- collapsed commands truncate to one line again: the global
  `.chat-message code` pre-wrap !imponcate`,
  so the command now renders in a span
- non-Bash tool error results render as a collapsed red row that expands
  to the full error content (new ToolErrorDisplay)
The chat websocket handler used to substitute the provider-native
session id into the spawn options, so runtimes keyed their process maps
by provider ids and abort/pending-approval lookups had to translate
back and forth. Now the app session id flows through everywhere, and
each runtime resolves the provider-native id itself via the new
sessionsService.resolveProviderSessionId() only where its CLI/SDK
actually needs it (resume flags, resumeThread, OpenCode's token DB).

- chat.send passes the app session id; the unused `resume` flag is gone
- chat.abort addresses runtimes by aps
  aborting a session's first run actually kill the runtime (previously
  abort was a no-op until the provider announced its native id)
- pending permission approvals are tr,
  removing the remap in chat.subscribe
- runtimes key process maps by the app session id when given, falling
  back to the captured provider id fo
- resolveResumeModel now receives the app id, matching how the
  active-model endpoint records session model changes
- run notifications (stopped/failed/permission) carry the app session
  id, matching frontend deep links
- Render user bubbles through the shared Markdown component with
  remark-breaks so typed line breaks are preserved
- Add explicit ul/ol/li styling so list markers render correctly in
  both user and assistant messages
- Open composer image attachments in the fullscreen lightbox on click
- Allow sending/queueing messages with images but no text
- Remove the AI commit message generator button from the git panel
…heck, and UI fixes

User messages:
- Render user messages as markdown with remark-breaks for line break preservation
- Add explicit ul/ol/li styling so list markers render correctly in both bubbles
- Enable sending/queueing messages with images but no text

Chat export:
- Add comprehensive export to Markdown, HTML, and PDF with beautiful formatting
- Export button in top-right corner of messages pane
- Include timestamps and message metadata in exports

Provider authentication:
- Check provider authentication before sending messages
- Show error with instructions: "Not logged in to [provider]. Please log in via
  Settings > Login in CloudCLI, or in the Shell tab."

Image attachments:
- Open composer image attachments in fullscreen lightbox on click (reuse existing
  lightbox from sent images)

UI fixes:
- Move QuickSettingsPanel to app-level (out of MainContent overflow context) to fix
  z-index layering on desktop and mobile
- Set panel z-index to z-[9999] with backdrop at z-[9998] to ensure it appears
  above all content including sidebars and file trees
- Remove AI commit message generator button from git panel source control tab
- Disable single-dollar math in remark-math to prevent dollar amounts (e.g., $20/psf)
  from being parsed as LaTeX; keep double-dollar display math ($$…$$) for math expressions
Drop the client-side "Not logged in to [provider]" gate that ran
before sending messages. The backend still validates provider
authentication, so this pre-flight check was redundant and blocked
sends on its own status lookup.
…merge

Add a Worktrees tab to the git panel for Crystal-style parallel workflows:

- Create worktrees in sibling <repo>-worktrees/<branch> folders, from a new
  or existing branch, with a live folder preview
- Register each worktree as a linked project ("repo · branch") so chat
  sessions, shell, files, and git all work inside it; one-click switching
- Squash or --no-ff merge a worktree back into the base branch, with
  optional cleanup (remove worktree + delete branch); conflicts are rolled
  back server-side and reported with the conflicting files
- Safe removal: archives the linked project, blocks dirty worktrees unless
  changes are explicitly discarded, never touches the main worktree

Backend: new server/modules/worktrees module (routes + list/create/open/
merge/remove services, barrel-only cross-module imports, node:test suite
with injected git runners) mounted at /api/worktrees.
@blackmammoth
blackmammoth requested a review from viper151 July 18, 2026 16:04
@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR restructures server startup around TypeScript modules and dependency-injected routes, adds provider runtime/session APIs, Git worktree and file-tree capabilities, CLI services, and related client UI integrations. It also updates chat rendering, exports, repository initialization, and WebSocket lifecycle handling.

Changes

Application modularization and runtime services

Layer / File(s) Summary
Server module composition
server/index.ts, server/modules/*, server/shared/*
Adds composition roots and route factories for authentication, agent, commands, file tree, Git, plugins, settings, system updates, TaskMaster, users, and voice.
Provider runtime and session APIs
server/modules/providers/*, server/modules/websocket/services/*
Unifies provider execution behind providerRuntimeService, separates app and provider-native session IDs, and adds session details and token-usage endpoints.
Git worktrees
server/modules/worktrees/*, src/components/git-panel/*
Adds worktree create, list, open, merge, and remove workflows with protected routes and Git panel controls.
Client and chat updates
src/components/chat/*, src/hooks/useProjectsState.ts, src/utils/api.js
Adds chat export, tool-error rendering, image lightboxes, markdown breaks, image-only submissions, file-tree URL migration, and backend session deep-link resolution.

Possibly related PRs

Suggested reviewers: viper151

Poem

I’m a rabbit hopping through code,
With worktrees branching down the road.
Sessions sync and sockets hum,
New chat tools and exports come.
Modules bloom from root to leaf—
A carrot-sized release of relief!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 36.88% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is related to the PR but too vague to describe the main change set clearly. Use a concise title that names the primary change, such as session ID handling, worktrees, and server module refactors.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/upgrade-v2

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread server/index.ts Fixed
Comment thread src/hooks/useProjectsState.ts Fixed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

🧹 Nitpick comments (3)
server/modules/providers/services/sessions.service.ts (1)

35-53: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Export the SessionDetails type.

If sessionsService is exported, keeping SessionDetails private might cause TypeScript declaration errors (TS4023: Exported variable has or is using private name) when generating .d.ts files, and it prevents downstream consumers (like the API route handlers) from importing the type explicitly.

Consider exporting the type.

♻️ Proposed refactor
-type SessionDetails = {
+export type SessionDetails = {
   /** Canonical app-facing session id (may differ from the looked-up id when a provider-native id was given). */
   sessionId: string;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/modules/providers/services/sessions.service.ts` around lines 35 - 53,
Export the SessionDetails type so the exported sessionsService API can reference
it safely in generated declarations and allow downstream consumers to import it
explicitly; change only the type declaration while preserving its existing
shape.
server/modules/worktrees/tests/worktree-open.service.test.ts (1)

95-122: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover the reactivated_archived creation outcome.

Add a case where createProject returns reactivated_archived, then verify restoreProject is called and the active row is returned. This guards the production branch that keeps reopened worktrees visible in the sidebar.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/modules/worktrees/tests/worktree-open.service.test.ts` around lines 95
- 122, Extend the openWorktreeAsProject tests with a case where createProject
returns the reactivated_archived outcome. Verify restoreProject is called for
the returned project and that the active project row/result is returned, while
preserving the existing new-project creation coverage.
src/components/chat/utils/chatExport.ts (1)

46-47: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Use a generic name for the assistant in exports.

The assistant is hardcoded as "Claude" in both the Markdown and HTML exports. Since the application supports multiple providers (e.g., Cursor, Codex, OpenCode), consider using a more generic term like "Assistant" or passing the active provider's name dynamically.

♻️ Proposed fixes

For Markdown export:

     } else if (msg.type === 'user') {
       markdown += '## You\n\n';
     } else if (msg.type === 'assistant') {
-      markdown += '## Claude\n\n';
+      markdown += '## Assistant\n\n';
     } else if (msg.type === 'error') {

For HTML export:

   const htmlContent = messages
     .map((msg) => {
-      const type = msg.type === 'user' ? '👤 You' : msg.type === 'assistant' ? '🤖 Claude' : `${msg.type}`;
+      const type = msg.type === 'user' ? '👤 You' : msg.type === 'assistant' ? '🤖 Assistant' : `${msg.type}`;
       const time = includeMeta && msg.timestamp ? `<p style="font-size: 12px; color: `#999`; margin-top: 8px;">${formatTimestamp(msg.timestamp)}</p>` : '';

Also applies to: 94-94

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/chat/utils/chatExport.ts` around lines 46 - 47, Update the
assistant export labels in the chat export logic, including the Markdown branch
around msg.type === 'assistant' and the corresponding HTML branch, to use a
provider-neutral name such as “Assistant” instead of the hardcoded “Claude”.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@server/index.js`:
- Around line 187-188: Add a rate limiter to the `/api/worktrees` mount
alongside `authenticateToken` and before `worktreesRoutes`, using the existing
shared throttle or an appropriate route-local limiter. Ensure all worktree
endpoints inherit the limit without changing authentication or route behavior.

In `@server/modules/providers/list/codex/codex-sessions.provider.ts`:
- Around line 565-582: Prevent orphan custom-tool results by checking
ignoredToolCallIds in the custom_tool_call_output handling before adding a
tool_result; update the provider logic around execToolCallIds and messages.push
accordingly. In server/modules/providers/tests/codex-sessions.test.ts lines
139-143, assert that plan-1 produces no tool_result.

In `@server/modules/websocket/services/shell-websocket.service.ts`:
- Around line 528-541: The message handlers retaining shellProcess must reject
input and resize events from stale sockets. Update the relevant input and resize
handling in the shell websocket service to require
ptySessionsMap.get(ptySessionKey)?.ws === ws before operating on the PTY, and
add a regression test covering stale input after socket replacement.

In `@server/modules/worktrees/services/worktree-git.service.ts`:
- Around line 193-202: Update countChangedFiles so failures from runGit are not
converted to a zero count; remove the catch or propagate an unknown/error
result. Adjust removeWorktree’s safety check to treat an unknown count as unsafe
and prevent non-forced removal unless the status check succeeds and confirms
zero changes.
- Around line 57-71: Update validateWorktreeBranchName to enforce Git ref-name
rules, rejecting double dots, trailing dots, repeated or leading/trailing
slashes, and any component ending in .lock while preserving trimming and
existing invalid-input errors. Extend the validation cases in
server/modules/worktrees/tests/worktree-git.service.test.ts around lines 72-79
to cover each rejected form and confirm valid branch names remain accepted.

In `@server/modules/worktrees/services/worktree-list.service.ts`:
- Around line 87-114: Limit concurrent worktree processing in the Promise.all
flow around the entries.map callback so Git operations do not launch for every
worktree at once. Replace the unbounded mapper with the project’s existing small
concurrency-limited mapping utility, preserving the WorktreeDescriptor
transformation and result ordering.

In `@server/modules/worktrees/services/worktree-merge.service.ts`:
- Around line 97-118: Update the catch block around the rollback in the worktree
merge flow to retain any error from runGit(['reset', '--merge'], repositoryRoot)
instead of suppressing it. When rollback fails, throw a distinct AppError that
reports rollback failure and preserves the rollback error details; only emit
WORKTREE_MERGE_CONFLICT with the “merge was aborted” message when the rollback
succeeds.

In `@server/modules/worktrees/services/worktree-remove.service.ts`:
- Around line 51-74: Model post-operation cleanup as partial success: in
server/modules/worktrees/services/worktree-remove.service.ts lines 51-74, make
the project archival step idempotent/compensating or preserve successful
worktree removal while returning archival failure details; in
server/modules/worktrees/services/worktree-merge.service.ts lines 121-130,
preserve successful merge status while reporting worktree-cleanup status or
expose a safely resumable cleanup operation. Use the existing removal, merge,
project archival, and cleanup service symbols without changing the primary Git
operation semantics.

In `@server/modules/worktrees/worktrees.routes.ts`:
- Around line 93-99: Update the merge request payload handling around
services.merge and the related branch/removal operations to validate boolean
fields rather than coercing them with Boolean(). Accept only actual boolean
values, preserving false when provided; use the existing safe default for
missing or invalid values so malformed strings such as "false" cannot enable
squash, removeAfterMerge, force deletion, or branch deletion.
- Around line 61-70: Move the worktree creation-and-registration workflow out of
the route handler into an application service that calls services.create, then
services.open, and compensates when opening fails by removing the newly created
worktree. Use created.createdBranch to ensure cleanup deletes only a branch
created by this operation, then have the route invoke that service and return
its result.

In `@server/routes/git.js`:
- Around line 423-428: Update the validateGitRepository handling in the
repository initialization flow to catch the error object, continue to git init
only for the specific typed/not-a-repository failure, and rethrow Git execution,
permission, ownership, corruption, and other errors. Keep setting
isAlreadyRepository only after successful validation.

In `@src/components/chat/utils/chatExport.ts`:
- Around line 177-187: Handle the null result from window.open in the PDF export
flow by notifying the user that the popup was blocked and the export could not
proceed. Update the existing win check in the export function while preserving
the current document-writing and delayed print behavior when a window is
successfully opened.
- Around line 97-98: Update the HTML escaping in the chat export flow around
contentStr/contentHTML to escape ampersands before escaping angle brackets,
while preserving the existing conversion of message content to a string. Ensure
entities such as &lt;script&gt; remain literal text in the exported HTML and
cannot be interpreted as markup.

In `@src/components/git-panel/hooks/useWorktreesController.ts`:
- Around line 145-259: Update openWorktree, mergeWorktree, and removeWorktree to
enforce a single in-flight worktree operation using a request-owned ref/token,
rejecting new operations while one is active. Ensure each operation’s cleanup
only clears busyWorktreePath and releases the guard when it still owns the
active token, preventing a newer or concurrent request from being interrupted.
- Around line 102-143: Update createWorktree and the related action around the
referenced lines to capture the selected project ID before the request, then
verify it still matches the current selectedProject before applying response
results. Discard stale responses by skipping onProjectSelect, onProjectsRefresh,
fetchWorktrees, and success handling when the project changed, while preserving
loading cleanup and error handling.
- Around line 102-180: Guard completion side effects against stale project
selections by capturing the initiating projectId in createWorktree and
openWorktree, then only call onProjectsRefresh, onProjectSelect, or
fetchWorktrees when it still matches the currently selected project; apply the
corresponding captured-projectId check in useGitPanelController.ts lines 728-759
before launching status, branch, and remote refreshes.

In `@src/components/git-panel/view/modals/NewWorktreeModal.tsx`:
- Around line 41-48: Update the NewWorktreeModal effect that sets
selectedBaseBranch so a null baseBranch falls back to the first available local
branch rather than ''. Keep the controlled select value synchronized with an
existing valid option, and ensure submission uses that selected branch instead
of sending null when the main worktree is detached.

In `@src/components/git-panel/view/worktrees/WorktreesView.tsx`:
- Around line 108-111: Update the actions container in WorktreesView so
non-current worktree actions are also visible on mobile and whenever one of
their controls receives keyboard focus, while preserving the existing
current/busy visibility behavior and hover transition for pointer interactions.

In `@src/hooks/useProjectsState.ts`:
- Around line 437-444: Reset sessionLookupRef.current to null whenever sessionId
changes, while preserving the existing one-attempt-per-ID guard during a
session's lifetime. Update the effect or dependency-driven logic near the
sessionIdRef synchronization and ensure revisiting a previously resolved
deep-linked session can execute the lookup and selection flow instead of exiting
early.
- Around line 844-944: Remove the early return that prevents session resolution
when projects.length is zero, allowing the session lookup effect containing
sessionLookupRef and api.sessionDetails to run with an empty active project
list. Preserve the existing backend lookup and synthesized-project behavior for
archived projects or users without active projects.

---

Nitpick comments:
In `@server/modules/providers/services/sessions.service.ts`:
- Around line 35-53: Export the SessionDetails type so the exported
sessionsService API can reference it safely in generated declarations and allow
downstream consumers to import it explicitly; change only the type declaration
while preserving its existing shape.

In `@server/modules/worktrees/tests/worktree-open.service.test.ts`:
- Around line 95-122: Extend the openWorktreeAsProject tests with a case where
createProject returns the reactivated_archived outcome. Verify restoreProject is
called for the returned project and that the active project row/result is
returned, while preserving the existing new-project creation coverage.

In `@src/components/chat/utils/chatExport.ts`:
- Around line 46-47: Update the assistant export labels in the chat export
logic, including the Markdown branch around msg.type === 'assistant' and the
corresponding HTML branch, to use a provider-neutral name such as “Assistant”
instead of the hardcoded “Claude”.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c273d69-3d68-4b1e-a65a-4cd1f1942bdd

📥 Commits

Reviewing files that changed from the base of the PR and between 27eaf01 and def9b78.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (76)
  • package.json
  • server/claude-sdk.js
  • server/cursor-cli.js
  • server/index.js
  • server/modules/database/index.ts
  • server/modules/projects/index.ts
  • server/modules/providers/list/claude/claude-session-synchronizer.provider.ts
  • server/modules/providers/list/codex/codex-sessions.provider.ts
  • server/modules/providers/provider.routes.ts
  • server/modules/providers/services/sessions-watcher.service.ts
  • server/modules/providers/services/sessions.service.ts
  • server/modules/providers/tests/codex-sessions.test.ts
  • server/modules/providers/tests/sessions-details.test.ts
  • server/modules/websocket/README.md
  • server/modules/websocket/services/chat-websocket.service.ts
  • server/modules/websocket/services/shell-websocket.service.ts
  • server/modules/websocket/services/websocket-server.service.ts
  • server/modules/websocket/tests/shell-websocket.service.test.ts
  • server/modules/websocket/tests/websocket-heartbeat.service.test.ts
  • server/modules/worktrees/index.ts
  • server/modules/worktrees/services/worktree-create.service.ts
  • server/modules/worktrees/services/worktree-git.service.ts
  • server/modules/worktrees/services/worktree-list.service.ts
  • server/modules/worktrees/services/worktree-merge.service.ts
  • server/modules/worktrees/services/worktree-open.service.ts
  • server/modules/worktrees/services/worktree-remove.service.ts
  • server/modules/worktrees/tests/worktree-create.service.test.ts
  • server/modules/worktrees/tests/worktree-git.service.test.ts
  • server/modules/worktrees/tests/worktree-merge.service.test.ts
  • server/modules/worktrees/tests/worktree-open.service.test.ts
  • server/modules/worktrees/tests/worktree-remove.service.test.ts
  • server/modules/worktrees/tests/worktrees.routes.test.ts
  • server/modules/worktrees/worktrees.module.ts
  • server/modules/worktrees/worktrees.routes.ts
  • server/openai-codex.js
  • server/opencode-cli.js
  • server/routes/git.js
  • server/shared/types.ts
  • src/components/app/AppContent.tsx
  • src/components/chat/hooks/useChatComposerState.ts
  • src/components/chat/tools/ToolRenderer.tsx
  • src/components/chat/tools/components/BashCommandDisplay.tsx
  • src/components/chat/tools/components/ToolErrorDisplay.tsx
  • src/components/chat/tools/components/index.ts
  • src/components/chat/tools/configs/toolConfigs.ts
  • src/components/chat/utils/chatExport.ts
  • src/components/chat/view/ChatInterface.tsx
  • src/components/chat/view/subcomponents/ChatComposer.tsx
  • src/components/chat/view/subcomponents/ChatExportMenu.tsx
  • src/components/chat/view/subcomponents/ChatMessageImages.tsx
  • src/components/chat/view/subcomponents/ChatMessagesPane.tsx
  • src/components/chat/view/subcomponents/ImageAttachment.tsx
  • src/components/chat/view/subcomponents/Markdown.tsx
  • src/components/chat/view/subcomponents/MessageComponent.tsx
  • src/components/code-editor/view/subcomponents/markdown/MarkdownPreview.tsx
  • src/components/git-panel/hooks/useGitPanelController.ts
  • src/components/git-panel/hooks/useWorktreesController.ts
  • src/components/git-panel/types/types.ts
  • src/components/git-panel/view/GitPanel.tsx
  • src/components/git-panel/view/GitRepositoryErrorState.tsx
  • src/components/git-panel/view/GitViewTabs.tsx
  • src/components/git-panel/view/changes/ChangesView.tsx
  • src/components/git-panel/view/changes/CommitComposer.tsx
  • src/components/git-panel/view/modals/MergeWorktreeModal.tsx
  • src/components/git-panel/view/modals/NewWorktreeModal.tsx
  • src/components/git-panel/view/modals/RemoveWorktreeModal.tsx
  • src/components/git-panel/view/worktrees/WorktreesView.tsx
  • src/components/main-content/types/types.ts
  • src/components/main-content/view/MainContent.tsx
  • src/components/quick-settings-panel/view/QuickSettingsPanelView.tsx
  • src/components/shell/hooks/useShellRuntime.ts
  • src/components/sidebar/view/subcomponents/SidebarContent.tsx
  • src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx
  • src/components/version-upgrade/view/VersionUpgradeModal.tsx
  • src/hooks/useProjectsState.ts
  • src/utils/api.js
💤 Files with no reviewable changes (1)
  • src/components/chat/view/ChatInterface.tsx

Comment thread server/index.ts
Comment thread server/modules/providers/list/codex/codex-sessions.provider.ts
Comment thread server/modules/websocket/services/shell-websocket.service.ts
Comment thread server/modules/worktrees/services/worktree-git.service.ts
Comment thread server/modules/worktrees/services/worktree-git.service.ts Outdated
Comment thread src/components/git-panel/hooks/useWorktreesController.ts
Comment thread src/components/git-panel/view/modals/NewWorktreeModal.tsx Outdated
Comment thread src/components/git-panel/view/worktrees/WorktreesView.tsx
Comment thread src/hooks/useProjectsState.ts
Comment thread src/hooks/useProjectsState.ts
Move provider-specific token calculations out of the legacy server entrypoint.
The backend now resolves storage details from the app session record.

Expose a session-id-only provider endpoint and cover every provider path
with focused tests.
Move provider SDK and CLI execution beside each provider implementation so
runtime ownership matches the existing auth, model, session, and MCP layout.

Dispatch runs, aborts, and Claude permission approvals through one typed
runtime service instead of wiring provider-specific functions in server/index.

Keep the stateful runtime entrypoint separate from the lower-level provider
barrel to prevent cycles through session and project services.
Track request-owned resources so cleanup cannot delete reused checkouts.

Compensate or report post-operation failures so retries do not repeat completed Git work.

Reject unsafe inputs and stale responses before they trigger unintended actions.

Keep exported chat content literal to prevent unsafe rendering.
Serialize worktree operations so requests cannot overwrite each other's busy state.

Use selectable branch defaults and expose actions across touch and keyboard input.
Comment thread server/modules/agent/agent.routes.ts Dismissed
Comment thread server/modules/agent/agent.routes.ts Dismissed
Comment thread server/modules/agent/agent.routes.ts Dismissed
Comment thread server/modules/agent/agent.routes.ts Dismissed
Comment thread server/modules/agent/agent.routes.ts Dismissed
Comment thread server/modules/taskmaster/taskmaster.routes.ts Dismissed
Comment thread server/modules/taskmaster/taskmaster.routes.ts Dismissed
Comment thread server/modules/taskmaster/taskmaster.routes.ts Dismissed
Comment thread server/modules/taskmaster/taskmaster.routes.ts Dismissed
Comment thread server/modules/taskmaster/taskmaster.routes.ts Dismissed
Copilot AI review requested due to automatic review settings July 28, 2026 18:27

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

Respect project .gitignore rules when building the @ mention list.

Keep the explorer and other file consumers unchanged.
Copilot AI review requested due to automatic review settings July 28, 2026 19:07

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

blackmammoth and others added 2 commits July 28, 2026 22:21
Key refreshes by stable project values so settings rerenders do not restart discovery.

Keep cached results visible while an explicit refresh is running.
When Claude invokes a Skill, the CLI injects the entire SKILL.md as a
synthetic user turn. Persisted transcripts tag it isMeta: true, but the
live SDK stream does not. Without a content-level check, the skill body
renders as a giant user bubble during the run and vanishes on reload.

The skill is already represented by the Skill tool call itself, so the
injected body should be filtered as internal content. Filter by the
"Base directory for this skill:" prefix that precedes the markdown.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
@blackmammoth blackmammoth linked an issue Jul 28, 2026 that may be closed by this pull request
Copilot AI review requested due to automatic review settings July 28, 2026 20:00

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

Copilot AI review requested due to automatic review settings July 28, 2026 20:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

Comment thread server/index.ts Dismissed
Copilot AI review requested due to automatic review settings July 28, 2026 20:47

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants