Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@

### 新增

- 开发空间对话右侧栏:可折叠,空状态「开始一个面板」,从文件 / 审查 / 后台任务 / 浏览器 / 终端起步。输入框「+」打开同一组面板,「使用权限」提供默认权限 / 自动审批 / 完全访问并随对话发送。
- 开发空间对话区历史横杠:沿滚动条一侧显示回合刻度,悬停看摘要,点击跳到对应消息;打开右侧栏后仍可见。
- 模型页本机大模型:Ollama 已安装但未运行时显示「启动 Ollama」(Windows 走已知安装路径的 `Ollama.exe` / `ollama app` / `ollama serve`);缺少可自动处理的依赖时提供「一键下载安装」,否则说明需手动安装;「搜索本机模型」后台扫描 `.gguf` / `.ggml`(以及明确的本地 LLM safetensors 目录),结果进入本机列表并可注册到 Ollama 供对话切换。
- 组织页双向互生长:FreeOS 资产经 `/api/freeos/ingest`(共享写入令牌,无需边车登录墙)落到 openXYOS 员工/人才/插件/技能表;控制面导出再装配回 FreeOS。循环在边车健康时不再把「已推送到控制面」写成 false。
- 组织页可从本地语料或 ima / 云知识库指针一键生产尚未入部门的专家 / 智能助手;本地模型一键下载后会注册到 Ollama 供应商。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,12 @@
}
}

.toolbarLeading {
display: flex;
align-items: center;
flex-shrink: 0;
}

.toolbarActions {
display: flex;
align-items: center;
Expand Down
61 changes: 49 additions & 12 deletions dashboard/src/components/BrowserWorkspace/ChatDockPanelShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ import type { MenuProps } from "antd";
import { useTranslation } from "react-i18next";
import {
Check,
Columns2,
Maximize2,
Minimize2,
MoreVertical,
PanelBottom,
PanelRight,
PanelRightClose,
PictureInPicture2,
X,
} from "lucide-react";
import { beginPointerDragSession } from "../../hooks/usePointerDragSession";
import type { PanelMode } from "./index";
Expand All @@ -37,8 +37,13 @@ interface ChatDockPanelShellProps {
style?: React.CSSProperties;
/** Left-side title (filename / “远程浏览器”). */
title?: React.ReactNode;
/** Leading control before the title (e.g. add-panel +). */
leadingActions?: React.ReactNode;
/** Content actions left of the layout/close group (mode, refresh, download…). */
toolbarActions?: React.ReactNode;
/** Widen / restore the right dock (desktop). */
onExpand?: () => void;
expandActive?: boolean;
children: React.ReactNode;
}

Expand Down Expand Up @@ -116,7 +121,10 @@ const ChatDockPanelShell: React.FC<ChatDockPanelShellProps> = ({
onClose,
style,
title,
leadingActions,
toolbarActions,
onExpand,
expandActive = false,
children,
}) => {
const { t } = useTranslation();
Expand Down Expand Up @@ -449,6 +457,9 @@ const ChatDockPanelShell: React.FC<ChatDockPanelShellProps> = ({
onPointerDown={handlePopupDragStart}
style={toolbarStyle}
>
{leadingActions ? (
<div className={styles.toolbarLeading}>{leadingActions}</div>
) : null}
<div className={styles.toolbarTitle}>{title}</div>
<div className={styles.toolbarSpacer} />
{toolbarActions ? (
Expand Down Expand Up @@ -507,18 +518,44 @@ const ChatDockPanelShell: React.FC<ChatDockPanelShellProps> = ({
aria-label={t("browserWorkspace.panelLayout", "面板布局")}
onPointerDown={(e) => e.stopPropagation()}
>
<MoreVertical size={16} strokeWidth={1.8} />
<Columns2 size={16} strokeWidth={1.8} />
</button>
</Dropdown>
<button
type="button"
className={styles.toolbarIconBtn}
onClick={onClose}
onPointerDown={(e) => e.stopPropagation()}
aria-label={t("common.close", "关闭")}
>
<X size={14} strokeWidth={1.8} />
</button>
{onExpand && mode === "right" ? (
<Tooltip
title={
expandActive
? t("chat.rightRail.shrink", "恢复面板宽度")
: t("chat.rightRail.expandWide", "加宽面板")
}
>
<button
type="button"
className={styles.toolbarIconBtn}
onClick={onExpand}
onPointerDown={(e) => e.stopPropagation()}
aria-label={
expandActive
? t("chat.rightRail.shrink", "恢复面板宽度")
: t("chat.rightRail.expandWide", "加宽面板")
}
aria-pressed={expandActive}
>
<Maximize2 size={16} strokeWidth={1.8} />
</button>
</Tooltip>
) : null}
<Tooltip title={t("chat.rightRail.collapse", "收起右侧栏")}>
<button
type="button"
className={styles.toolbarIconBtn}
onClick={onClose}
onPointerDown={(e) => e.stopPropagation()}
aria-label={t("chat.rightRail.collapse", "收起右侧栏")}
>
<PanelRightClose size={16} strokeWidth={1.8} />
</button>
</Tooltip>
</div>
{windowControlsSpacerPx > 0 ? (
<span
Expand Down
42 changes: 42 additions & 0 deletions dashboard/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1387,6 +1387,48 @@
"title": "Expert details"
},
"composerMore": "More tools",
"rightRail": {
"title": "Right sidebar",
"startTitle": "Start a panel",
"startDesc": "Open files, review, a resource monitor, the built-in browser, or a terminal on the right, and keep chatting on the left.",
"footerHint": "Use the + button at the top to pick more panel types",
"collapse": "Collapse right sidebar",
"expand": "Expand right sidebar",
"expandWide": "Widen panel",
"shrink": "Restore panel width",
"addPanel": "Add a panel",
"openFiles": "Open files",
"openFilesHint": "Files",
"openReview": "Open review",
"openReviewHint": "Review",
"openTasks": "Open background tasks",
"openTasksHint": "Background tasks",
"openBrowser": "Open browser",
"openBrowserHint": "Browser",
"openTerminal": "Open terminal",
"openTerminalHint": "Terminal",
"reviewEmpty": "Nothing to review yet",
"reviewEmptyHint": "Tool calls and edits from this chat will show up here.",
"reviewNeedSession": "Pick a conversation to see the review trail.",
"tasksEmpty": "No background tasks yet",
"tasksEmptyHint": "Scheduled jobs and running work will appear here.",
"tasksOpenPage": "Manage scheduled tasks",
"taskOn": "On",
"taskOff": "Off",
"dockReviewTitle": "Review",
"dockTasksTitle": "Background tasks"
},
"permissionMode": {
"label": "Use permissions",
"default": "Default permissions",
"defaultHint": "Follow the current security policy when running tools.",
"auto": "Auto-approve",
"autoHint": "Run commands automatically inside the protected workspace sandbox. Actions that cross the sandbox are judged by the auto-reviewer; high-risk ones may be blocked or need confirmation.",
"full": "Full access",
"fullHint": "Allow higher-privilege actions. High-risk commands may still be blocked by security policy.",
"fullConfirmTitle": "Switch to full access?",
"fullConfirm": "Full access relaxes tool approval for this conversation. Confirm you trust this task."
},
"knowledgePicker": "Knowledge bases",
"knowledgePickerSearch": "Search knowledge bases",
"knowledgePickerEmpty": "No knowledge bases available",
Expand Down
42 changes: 42 additions & 0 deletions dashboard/src/locales/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -1387,6 +1387,48 @@
"title": "专家详情"
},
"composerMore": "更多工具",
"rightRail": {
"title": "右侧栏",
"startTitle": "开始一个面板",
"startDesc": "在右侧打开文件、审查、资源监视器、内置浏览器或终端,与左侧对话并行工作。",
"footerHint": "可通过顶部 + 按钮选择更多面板类型",
"collapse": "收起右侧栏",
"expand": "展开右侧栏",
"expandWide": "加宽面板",
"shrink": "恢复面板宽度",
"addPanel": "添加面板",
"openFiles": "打开文件",
"openFilesHint": "文件",
"openReview": "打开审查",
"openReviewHint": "审查",
"openTasks": "打开后台任务",
"openTasksHint": "后台任务",
"openBrowser": "打开浏览器",
"openBrowserHint": "浏览器",
"openTerminal": "打开终端",
"openTerminalHint": "终端",
"reviewEmpty": "还没有可审查的操作",
"reviewEmptyHint": "和助手对话后,工具调用与改动会显示在这里。",
"reviewNeedSession": "先选一段对话,才能查看审查记录。",
"tasksEmpty": "当前没有后台任务",
"tasksEmptyHint": "定时任务和正在运行的工作会显示在这里。",
"tasksOpenPage": "管理定时任务",
"taskOn": "已启用",
"taskOff": "已停用",
"dockReviewTitle": "审查",
"dockTasksTitle": "后台任务"
},
"permissionMode": {
"label": "使用权限",
"default": "默认权限",
"defaultHint": "按当前安全策略询问或执行工具。",
"auto": "自动审批",
"autoHint": "在受保护的工作区沙箱内自动执行命令;需要越过沙箱边界的操作交给自动审查器判断,高风险操作可能被拒绝或要求确认。",
"full": "完全访问",
"fullHint": "允许更高权限的操作;高风险命令仍可能被安全策略拦截。",
"fullConfirmTitle": "切换到完全访问?",
"fullConfirm": "完全访问会放宽本对话的工具审批。请确认你信任这次任务。"
},
"knowledgePicker": "知识库",
"knowledgePickerSearch": "搜索知识库",
"knowledgePickerEmpty": "暂无可用知识库",
Expand Down
10 changes: 5 additions & 5 deletions dashboard/src/pages/Chat/chatMessages.partial.less
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@
flex-direction: column;
}

/* Left gutter so the in-thread turn timeline ticks do not cover bubbles.
/* Inline-end gutter so scroll-track ticks do not cover bubbles.
Prefer parent `.chatMainWithTurnRail` (title + composer + list). This local
class remains as a fallback when MessageList is mounted alone. */
.messageListWrapperWithRail {
--chat-turn-rail-gutter: 48px;

.messageListInner {
padding-inline-start: var(--chat-turn-rail-gutter);
padding-inline-end: var(--chat-column-pad-x, 24px);
padding-inline-start: var(--chat-column-pad-x, 24px);
padding-inline-end: var(--chat-turn-rail-gutter);

@media (max-width: 863px) {
padding-inline-start: var(--chat-column-pad-x, 24px);
@media (max-width: 559px) {
padding-inline-end: var(--chat-column-pad-x, 24px);
}
}
}
Expand Down
Loading
Loading