fix: tunnel URLs, session naming, git control bar placement

- Exclude api.trycloudflare.com from tunnel URL regex (both tunnel.py and
  docker/tunnel.py). Real tunnel subdomains are 10+ random chars.
- Fix missing get_backend_network_name import in services/tunnel.py by
  using hardcoded BACKEND_NETWORK constant.
- Add auto-numbering to session display names: project/repo/tool #N when
  duplicates exist for the same project/repo/tool type.
- Move GitToolbar from full-width workspace header into WorkspaceSidebar
  above the FileBrowser, so git controls appear in the file browser area.
- Remove stale ToolConfig import from instance_lifecycle.py (model was
  removed in earlier dev work); _fetch_tool_configs returns empty defaults.

Quality gates: tsc pass (0 errors), build pass, Python syntax pass
Tests: 127/131 passed (4 pre-existing failures)
This commit is contained in:
Developer
2026-06-03 20:50:28 +00:00
parent b6f89f9df0
commit ae02e97fa0
5 changed files with 71 additions and 65 deletions
@@ -4,6 +4,7 @@ import type { ToolType } from "../../../types/tool-type";
import { FileBrowser } from "./FileBrowser";
import { CommitPanel } from "../git/CommitPanel";
import { InstanceList } from "../session/InstanceList";
import { GitToolbar } from "./GitToolbar";
interface WorkspaceSidebarProps {
projectId: string;
@@ -11,7 +12,12 @@ interface WorkspaceSidebarProps {
repositories: GitRepository[];
gitStatus: GitStatus | null;
toolTypes: ToolType[];
currentBranch: string;
branches: string[];
hasRemote: boolean;
onRepoChange: (repoId: string) => void;
onBranchChange: (branch: string) => void;
onRefresh: () => void;
onCommit: () => void;
}
@@ -21,11 +27,25 @@ export const WorkspaceSidebar = ({
repositories,
gitStatus,
toolTypes,
currentBranch,
branches,
hasRemote,
onRepoChange,
onBranchChange,
onRefresh,
onCommit,
}: WorkspaceSidebarProps) => {
return (
<aside className="workspace-sidebar">
<GitToolbar
projectId={projectId}
repoId={repoId}
currentBranch={currentBranch}
branches={branches}
hasRemote={hasRemote}
onBranchChange={onBranchChange}
onRefresh={onRefresh}
/>
<div className="sidebar-section">
<label className="form-field">
Repository
+14 -21
View File
@@ -12,7 +12,6 @@ import {
import { WorkspaceSidebar } from "../components/features/git";
import { FileEditor } from "../components/features/git/FileEditor";
import { WorkspaceHeader } from "../components/features/workspace/WorkspaceHeader";
import { GitToolbar } from "../components/features/git/GitToolbar";
import { LoadingState, ErrorState } from "../components/ui";
import { listToolTypes } from "../api/tool-types";
@@ -161,26 +160,6 @@ export const RepoWorkspace = () => {
{status === "ready" && repositories.length > 0 && (
<>
{selectedRepoId && (
<GitToolbar
projectId={projectId!}
repoId={selectedRepoId}
currentBranch={currentBranch}
branches={branches}
hasRemote={Boolean(selectedRepo?.remote_url)}
onBranchChange={(branch) => {
setCurrentBranch(branch);
const newParams = new URLSearchParams(searchParams);
newParams.set("branch", branch);
setSearchParams(newParams);
}}
onRefresh={() => {
void loadBranches();
void loadGitStatus();
window.dispatchEvent(new CustomEvent("refresh-file-tree"));
}}
/>
)}
<div className="workspace-layout">
{selectedRepoId && (
<WorkspaceSidebar
@@ -189,7 +168,21 @@ export const RepoWorkspace = () => {
repositories={repositories}
gitStatus={gitStatus}
toolTypes={toolTypes}
currentBranch={currentBranch}
branches={branches}
hasRemote={Boolean(selectedRepo?.remote_url)}
onRepoChange={handleRepoChange}
onBranchChange={(branch) => {
setCurrentBranch(branch);
const newParams = new URLSearchParams(searchParams);
newParams.set("branch", branch);
setSearchParams(newParams);
}}
onRefresh={() => {
void loadBranches();
void loadGitStatus();
window.dispatchEvent(new CustomEvent("refresh-file-tree"));
}}
onCommit={() => {
void loadGitStatus();
window.dispatchEvent(new CustomEvent("refresh-file-tree"));