Commit Graph

112 Commits

Author SHA1 Message Date
Pine 0ce33b012f 任务完整详情页:阶段进度/流转时间线/里程碑/交付版本/验收/结算/沟通,路由接入 2026-09-05 09:25:05 +08:00
Pine 686fee9c69 任务系统前端 v2:发布表单 v2 字段、六段标书、接单/交付/退出、验收/返工按钮 2026-09-05 03:41:04 +08:00
Pine 0eb3bd8000 信用页切真实API:L1-L8等级/无上限总分/徽章墙/信用流水,移除全部MOCK数据 2026-09-05 03:06:04 +08:00
Pine 1e6930fd55 feat(个人主页): 开放来访者信息获取能力
- postMessage 桥新增 opc:page:get-visitor, 返回 opc:page:visitor
- 仅返回昵称/头像/简介, 不含用户ID/手机号等敏感信息
- 未登录返回 null
- init 数据中同时包含 visitor 字段, 页面可直接读取
- 开发提示词同步更新
2026-09-05 02:47:18 +08:00
Pine 511e6dbcfb feat(代理): 新增/pages/admin/{user_id}/logs审核日志代理 2026-09-05 01:42:13 +08:00
Pine 037c25fa1f feat(个人主页): 开发提示词+动作桥接+admin代理
- 前端桥接新增 opc:action:open-chat/share/copy-link 动作
- 编辑弹窗增加'复制开发提示词'按钮(从服务端获取)
- 修复 navigator.clipboard undefined fallback(textarea+execCommand)
- 代理新增 /pages/dev-prompt GET 和 /pages/admin/dev-prompt PUT
2026-09-05 00:46:59 +08:00
Pine f633708928 fix(个人主页): 退出按钮直接返回来源页,绕过iframe污染的历史栈
根因: Blob URL+allow-same-origin使iframe与父页面同源, iframe内部导航加入
浏览器联合会话历史。navigate(-1)先回退iframe历史而非父页面路由, 表现为
'iframe内返回上一级'而非退出usershome。

修复:
- 所有入口(HallTalents/Talent/Profile)导航到usershome时传递
  state: { from: 当前path+search }
- handleClose优先用location.state.from直接navigate(replace), 完全绕过历史栈
- 无from时fallback到navigate(-1), 再fallback到首页
2026-09-05 00:29:15 +08:00
Pine 96fb0482fd feat(导航状态): Hall和Talent页面tab状态同步到URL
- Hall: Tabs的activeKey从?tab=读取, 切换时setSearchParams(replace), 刷新/返回后恢复原tab
- Talent: Segmented的tab从?tab=读取, 同样同步URL
- 打开个人主页/应用后返回, URL中保留了原tab参数, 能正确恢复
2026-09-05 00:24:00 +08:00
Pine e8fd4ee913 fix(个人主页): 退出按钮改用React Router navigate替代history.back
用useNavigate().navigate(-1)替代window.history.back(),更可靠地
回到进入前页面;无历史时navigate('/', {replace:true})回首页。
2026-09-05 00:20:20 +08:00
Pine b13d5998fe fix(个人主页): 修复Blob URL的useEffect依赖数组TDZ错误
useEffect依赖数组用了page?.pageType,但const page声明在hook之后,
渲染时评估依赖数组触发Cannot access 'page' before initialization。
改为data?.page?.pageType,effect内部用data?.page取值。
2026-09-05 00:16:32 +08:00
Pine 1d0d0c6adb fix(个人主页): 用Blob URL替代srcDoc彻底解决hash路由白屏
根因: srcDoc的about:srcdoc不是有效URL, 用户HTML内hash路由<a href=#/page>点击时
浏览器尝试导航到about:srcdoc#/page, 导航失败导致iframe变about:blank白屏,
后续点击无任何元素可响应。加allow-same-origin无法解决此问题。

修复: HTML模式用URL.createObjectURL(Blob)生成真正的URL作为iframe src,
hash导航/localStorage/所有Web API均正常工作。useEffect cleanup时revoke释放内存。
embed模式仍用原始URL。
2026-09-05 00:14:21 +08:00
Pine 78ef8a70e3 fix(个人主页): HTML模式沙箱加allow-same-origin修复白屏
根因: srcDoc模式缺少allow-same-origin, localStorage/sessionStorage/indexedDB被浏览器拦截。
用户的hash路由SPA切换到工作台/数据页时读写localStorage抛异常导致白屏。
修复: html模式沙箱加allow-same-origin。srcDoc的origin始终是唯一不透明origin,
与父页面不同源, 无法访问父页面DOM/数据, 安全无虞。
2026-09-05 00:10:11 +08:00
Pine 3ce364c29c fix(个人主页): 退出按钮返回进入前页面而非首页
iframe沙箱隔离保证父页面history不被污染,history.back()可安全回到进入前页面;无历史时fallback到首页
2026-09-05 00:04:20 +08:00
Pine fb4af3b304 style(个人主页): 页眉复用桌面标准样式+退出按钮直接退出
- 身份条复用桌面Header: 56px高/glass-bg-strong毛玻璃/blur(18px)/glass-ring底边
- 页面背景复用桌面应用: #f7f7f7 + 顶部四色径向渐变光晕
- 退出按钮忽略iframe内部任何历史状态,浏览器直接replace回首页
2026-09-05 00:02:59 +08:00
Pine ff64113856 feat(个人主页): 前端审核流程+能力数据桥接+URL模式无能力
- pagesApi新增submit/reviewList/review接口,类型新增reviewStatus等字段
- UserHomePage postMessage桥注入capabilityData(订单/证书等公开数据)给HTML
- 编辑弹窗: URL模式隐藏能力选择并提示; HTML模式选能力后加虚假接入处罚警告
- 上架流程改为: 保存草稿→提交审核→审核通过→上架; 身份条显示状态和操作按钮
- 移除直接上架开关, 修改已上架内容自动下架
- 代理新增/pages/me/submit和/admin审核接口
2026-09-04 23:52:02 +08:00
Pine 06a29f9b0f fix(个人主页): 回归纯sandbox隔离,移除注入脚本和父页面路由
- 移除沙箱拦截脚本注入、handleOpenUrl、opc:page:open-url postMessage
- 仅靠浏览器sandbox强制隔离:无allow-popups/allow-top-navigation
- 内部所有跳转仅限iframe内,window.open和target=_top被浏览器阻止
- 彻底消除父页面navigate导致的白屏
- srcDoc直接渲染用户HTML,不注入任何脚本
2026-09-04 23:37:52 +08:00
Pine 3cee99362e fix(个人主页): 相对路径在iframe内导航,禁止影响父页面
- handleOpenUrl 对相对路径(/order?xxx等)改为iframe内部导航(contentWindow.location.href)
- 不再调用父页面navigate导致白屏
- 仅/usershome/xxx和外部http(s)才跳出沙箱处理
2026-09-04 23:33:32 +08:00
Pine 5373eb796b fix(个人主页): 沙箱隔离修复—禁止内部跳转影响外部
- 移除 iframe sandbox 的 allow-popups,内部 window.open/target=_blank 不再开浏览器新标签
- 注入沙箱拦截脚本:捕获 window.open、_blank/_top/_parent 链接、表单提交,统一 postMessage 转发
- 父页面 handleOpenUrl 统一路由:/usershome/xxx 新开 usershome 页面,外部 http(s) 开新标签,相对路径站内导航
- embed 模式同样移除 allow-popups,第三方站内部导航仅限 iframe 内
- 彻底解决白屏和多级退出问题
2026-09-04 23:30:00 +08:00
Pine dad97fe749 feat(个人主页): 应用式全屏渲染+毛玻璃顶栏+入口环境适配
- UserHomePage 改为 position:fixed 全屏覆盖层(与 AppCenter embedPage 一致)
- 顶部身份条改为毛玻璃(半透明白+backdrop-filter blur),与应用主背景一致
- 右上角胶囊按钮上移至顶栏,浅色玻璃质感+蓝紫点缀
- 三处入口(人才大厅/人才页/个人中心)区分环境:OS桌面开窗口,浏览器布局 navigate 到 /usershome/:userId
- 返回按钮区分环境:OS关窗口,浏览器 history.back
- 头像加白边阴影,编辑按钮蓝紫渐变,徽章/信用标签蓝紫系
2026-09-04 23:23:28 +08:00
Pine 68665df2cf fix(pages): 个人主页改为标准路由 /usershome/:userId(复用应用式窗口启动),点击反馈+uid兜底;解决vite dev glob未扫描新文件导致窗口内容不渲染 2026-09-04 22:55:00 +08:00
Pine 7411ef404a feat(talent): 人才页新增「个人主页」tab — 展示公开名片状态并提供创建/编辑入口 2026-09-04 22:33:32 +08:00
Pine fde7d2f81a fix(pages): 修复人才点击跳转 — WindowRouter不解析:uid改用location解析;个人中心新增「我的个人主页」入口 2026-09-04 22:15:43 +08:00
Pine a493f71d2c feat(pages): 人才市场去抽屉直接跳个人主页;未自定义主页渲染平台默认名片(基础资料+服务+发起沟通) 2026-09-04 22:05:24 +08:00
Pine 8258316479 feat(pages): 新增OPC个人主页窗口 — 身份条+沙箱HTML/第三方嵌入+能力接入说明+人才市场入口 2026-09-04 21:52:29 +08:00
Pine 512414401c 子智能体前端 UI 接入:会话 source 透传 + 会话列表 subagent 独立分组;create_chat 端点透传 source/group/parent/root 2026-09-04 21:00:03 +08:00
Pine 3151198ebd 迁移上游子智能体功能线:ChatGroup 分组体系 + subagent_model 配置 + spawn 会话归属
- chats/models.py: SessionSource.subagent + ChatGroupKind/ChatGroup/default_chat_groups + ChatSpec 扩展 group_id/parent_session_id/root_session_id/last_finished_at + ChatsFile.groups
- chats/manager.py: group CRUD 方法(list/create/update/reorder/delete) + get_or_create_chat/create_chat 的 group 归属与校验
- chats/api.py: /chats/groups 端点(GET/POST/PUT order/PUT/DELETE)
- config.py+agents.py: AgentConfig.subagent_model 配置
- agent_management.py: _build_subagent_request_context 补 subagent_model→model_slot_override
- console.py: _chat_registration_fields 识别 spawn_subagent 请求并注册 subagent 会话
- constant.py: DEFAULT_SPAWN_FOREGROUND_TIMEOUT_SECONDS
- 前端 chat.ts: groups API 请求函数
2026-09-04 20:40:19 +08:00
Pine 9e273713a6 fix(agents): 删除降级仅限自建智能体,官方智能体受保护且 deletable=false
- 服务端删除 404(身份已不存在)时降级仅清理本地,但 pine_agents_official_ 前缀的官方智能体不降级,避免误删运营端维护的预置身份
- list 的 deletable 离线回退:官方预置智能体默认不可删(此前 fallback 为 True,前端会误显示删除按钮)
2026-09-04 17:49:00 +08:00
Pine 881de0d305 fix(ui): 移除各页面内容容器 max-width,宽屏下内容铺满内容区
问题:多个页面根容器带 max-width,屏幕放大后内容区最右侧大片空白。
逐个检查全部页面后确认并修复 11 处页面级宽度限制:

console 页面:
- Settings/Account:.page max-width 720px → 移除
- Settings/About:.aboutPage max-width 860px + 居中 → 移除

云超服门户(/opc/*)页面:
- Opc/Dashboard、Opc/OpcList、PortDashboard:.page max-width 1200px → 移除
- Opc/AgentChat、Opc/Profile:内联 maxWidth 720 → 移除
- Opc/Credit:内联 maxWidth 1100 + 居中 → 移除
- Opc/Talent:内联 maxWidth 640 → 移除

运营端/管理端:
- Operator/CSWorkbench:.page max-width 1200px → 移除
- Hub(hubMode 管理页):.content max-width 1480px + 居中 → 移除

保留不动:描述文字/表单卡片级行宽限制(Agent/Config、Agent/Skills、
kbAnswer 等,属可读性设计);模态框 max-width calc(100vw-32px)。

验证:布局层 .page-content 本就全宽 flex(无 max-width);浏览器实测
/account 根容器 720px 限制消失;tsc 0 错;portal/Operator/Account/About/
Hub 测试 23 全过。
2026-09-04 17:33:58 +08:00
Pine 932fe54c16 fix(chat): 助手身份显示当前智能体名称/头像,无则回退云超服
问题:聊天区助手名称/头像沿用上游硬编码 nick='QwenPaw'、
avatar='/qwenpaw.png'。前者把当前智能体(如'小园')显示成了'QwenPaw';
后者资源未随迁移携带,dev 下实际返回 SPA index.html(头像渲染破损)。

修复:
- 前端 Chat 页:welcome.nick/avatar 改为解析当前智能体——名称取
  selectedAgent.name,头像取 selectedAgent.avatar;智能体无名称/头像时
  回退云超服品牌 BRAND.name / BRAND.assistantAvatar(/pineagents-icon.svg)。
- 支持智能体头像字段(端到端):后端 AgentProfileConfig.avatar、
  AgentSummary.avatar、agents list/create/update 透传、agent_sync
  IDENTITY_FIELDS 加 avatar(云超服身份同步);前端 AgentSummary/
  AgentProfileConfig/CreateAgentRequest 类型补 avatar。
- branding.ts 新增 assistantAvatar 品牌头像常量(替代缺失的 /qwenpaw.png)。

验证:后端重启后 /agents 返回 avatar 字段;/pineagents-icon.svg 200
image/svg+xml(原 /qwenpaw.png 实为 SPA fallback 破损);前端 tsc 0 错;
Chat/agents/constants 32 文件 322 测试全过。
2026-09-04 17:11:29 +08:00
Pine 29b1c7a3da fix(files): 消除重复'文件'菜单,新 Files 页参考旧页补下载与路径
问题:上游合并后 /files(FilesWorkspace 新页)与 /workspace(旧版
核心文件页)同时存在于侧边栏,nav.files 与 nav.workspace 中文标签均为
'文件',导致'当前助理设置'分组下出现两个'文件'菜单;OS 桌面模式
OS_APPS 同样注册了两个'文件'应用。

修复:
- builtinMenu.ts / osApps.ts:移除 core.workspace 菜单项与应用注册,
  侧边栏只保留一个'文件'入口(/files 新页)。/workspace 路由保留可深链。
- FilesNavigator 工具栏:参考旧页新增'下载'按钮(/workspace/download
  打包下载工作区,复用旧页 message 流程,含 DownloadCancelledError 处理)。
- FilesPage 页头:参考旧页新增'工作区路径'副标题展示(经
  /workspace/coding-project 获取 workspace_dir,长路径截断 hover 见全)。

验证:tsc 0 错;files-workspace/os/layouts 39 文件 227 测试全过;下载端点
经 8093 代理返回 200 有效 zip。
2026-09-04 16:54:59 +08:00
Pine 70627c0484 fix(memory): 恢复 section 区分日记/知识库,修复合并回归
本地 workspace.py 的 /memory 端点在上游合并时丢失了 section 参数
(上游为 Literal[daily,digest]|None Query),AgentMdManager.list_memory_mds
也丢了 section 过滤与 _nested_root_to_exclude/_memory_root 助手。导致前端
Files 页'日记'(section=daily) 与'知识库'(section=digest) 两个 tab 都拿到
同一份 memory+digest 混合列表,日记里混入知识库文件,反之亦然。

修复:从上游完整恢复 section 语义——
- AgentMdManager:list_memory_mds(section) 按 section 限定 memory/ 或
  digest/ 根目录并排除嵌套目录;read/write_memory_md 增加可选 section 走
  明确的根目录;_memory_path_for_read_write 支持 section 优先路由;
  补回 _memory_root/_nested_root_to_exclude。
- workspace.py:GET/PUT /memory 与 /memory/{path} 增加
  section: Literal[daily,digest]|None = Query(None),透传给 manager。

验证:seed memory/daily-test.md + digest/wiki-test.md 后——
section=daily 仅返回 memory 文件;section=digest 仅返回 digest 文件;
无 section 返回合并列表(digest/ 前缀);section 读写落盘正确;测试文件已
清理;前端 tsc 0 错 + files-workspace 11 文件 61/61 通过;经 8093 代理
四个 tab 端到端返回真实数据。
2026-09-04 16:42:24 +08:00
Pine 9b5a5b9629 fix(build): cssStubPlugin 仅限 Vitest 生效,修复 Monaco 无样式
本地 vite.config 把上游的 Vitest-only cssStubPlugin 无条件挂进了主 plugins,
导致 dev 与生产构建都会把 node_modules 下的所有 CSS import 替换为空桩
(export default {})。上游实现是 ,
本次合并回归让 monaco-editor/min/vs/editor/editor.main.css 在真实构建中被
剥离——Monaco 无样式渲染、字体度量错误,光标/选区与渲染位置错位,
即 Files 工作区'位置错乱、无法准确编辑'。

修复:与上游对齐——isVitest = command==='serve' && mode==='test',插件仅
在 Vitest 下挂载;dev/build 走真实 CSS。配合上一提交补回的
monacoSetup.ts CSS 导入,Monaco 样式完整加载。

验证:dev server 输出 309KB 真实 editor.main.css(此前为空桩);
生产构建 dist/assets/index-*.css 含 .monaco-editor 规则 + codicon 字体;
vitest 2 文件 28/28 仍通过(isVitest 判定正确)。
2026-09-04 16:27:44 +08:00
Pine f8f2c20246 fix(files): 补回 Monaco editor.main.css,修复编辑器位置错乱
合并上游 Coding 迁移时丢失了 monacoSetup.ts 中的关键 CSS 导入:

(上游 v2.2.0 第 20 行,本地合并后缺失)。

由于 monacoSetup 用 loader.config({ monaco }) 指向本地 bundle(为离线而设),
@monaco-editor/react 不会像 CDN 模式那样自动注入 CSS。缺失样式表后 Monaco 以
错误字体度量渲染:光标/选区按 monospace 度量计算,而实际字形用默认字体绘制,
导致点击与光标位置错位——即位置错乱,无法准确编辑。

修复:按上游原样补回 CSS 导入(唯一与上游的差异,diff 已确认)。
验证:tsc 0 错;files-workspace + codingTabsStore vitest 12 文件 84/84;
dev server 已热更新,/node_modules/monaco-editor/min/vs/editor/editor.main.css
经 Vite 正常注入。
2026-09-04 15:27:33 +08:00
Pine 44d78105a9 feat(files): 完整移植上游 Files 工作区文件操作 API(修正迁移偏差)
重新审查迁移逻辑后的修正:本地文件操作应以「上游 QwenPaw 为准」,
此前把本地后端误当云端、曾计划把前端重映射到云端 /code-files 是错误方向。

本提交:
- 新增 src/pineagents/services/workspace_files.py(上游 workspace_files 完整移植,
  唯一本地改动:跳过 macOS 自定义文件夹图标资源 Icon\r)
- workspace.py 移植 7 个上游端点:GET /tree、GET /file-metadata、
  GET/PUT /file-content(乐观并发 ETag)、GET /file-download、
  GET /html-file-uri、POST /file-upload(保留冲突策略 overwrite/skip/rename)
- agent_context.py 移植请求级项目目录解析:get_project_dir_for_request /
  get_project_dirs_for_request,按 X-Chat-Id / X-Session-Project-Dir 头解析
  会话级绑定目录;_resolve_files_root 支持 root=workspace|project|project:<path>,
  project:<path> 走目录身份成员校验(os.path.samefile),越权返回 403
- /workspace/watch 改为按 root+会话头解析监视目录(此前固定 agent coding dir)
- coding_project.py 追加上游命名别名 router /workspace/project-directory
  (与 /workspace/coding-project 同一批 handler),API 面与上游对齐,
  后续上游合并不会因命名差异 404

验证:curl 全链路通过——tree/metadata/content 读写/乐观并发 409/下载/HTML URI/
上传/workspace 根/越权 403/无效会话目录 400/未知 chat 404;后端重启干净。
2026-09-04 15:08:19 +08:00
Pine feb1192a5f fix(tools): skip macOS Icon\r resource + escape control chars in list_directory
- Skip the per-folder custom-icon resource "Icon\r" (Icon + CR) which
  macOS stores in every folder that ever had a custom icon. It does not
  start with a dot, so it slipped past the dotfile filter and showed up
  as a phantom "Icon" entry; agents trying to ls/stat it got
  'No such file or directory' and misreported healthy dirs as broken
  (observed on /Volumes/Pine/opt).
- Escape control chars (\x0d etc.) in displayed entry names so the model
  can see the real name instead of an invisible CR.
2026-09-04 14:49:57 +08:00
Pine 8ff6ab8763 feat(tools): register list_directory agent tool for coding mode
The coding-mode prompt already documents list_directory as a file-IO tool,
but no such tool was registered, so agents calling it got
ToolNotFoundError. Add a real list_directory tool to file_io.py:

- Mirrors upstream qwenpaw.services.workspace_files.list_directory semantics
  (skip dotfiles/.git/.venv/__pycache__/node_modules, dirs first).
- Relative paths resolve from the agent workspace (consistent with
  read_file/write_file/edit_file); absolute paths used as-is.
- Caps output at 200 entries (500 hard ceiling) with omission notice so
  huge directories don't flood context.
- Governance policy 'ListDirectory' (read-only, default allow); registered
  via agents/tools/__init__.py, auto-collected by tool_descriptor.
2026-09-04 14:42:42 +08:00
Pine 55f8d9f81f feat(workspace): port session project-dirs, fix 404s, add Tauri dir picker
C-port the upstream /chats/{id}/project-dirs feature so the chat-scoped
project directory binding is fully functional on the cloud backend:

- services/project_directory.py (new): lean cloud adaptation of the
  upstream module — normalize (dedupe/resolve/max 10), meta read for the
  persisted override, effective resolution (session > agent > workspace),
  nesting detection.
- chats/manager.py: set_session_project_dirs + get_session_project_dirs
  persist the override in ChatSpec.meta[runtime_context] under the lock
  (one-way migration: list supersedes legacy scalar).
- chats/api.py: GET/PUT/DELETE /{chat_id}/project-dirs + deprecated
  /{chat_id}/project-dir views, with 422 on missing dirs and response
  models matching the merged frontend (exists/nested_with/is_workspace).
- runtime/builder.py: session override feeds the per-turn coding project
  dir (weakest source; fork/ACP still win), so bound directories actually
  take effect for the chat's tools.
- Fix A: frontend projectDirectoryApi paths /workspace/project-directory*
  -> /workspace/coding-project* (cloud backend already exposes these).
- Fix B: add POST /workspace/coding-project/browse-dirs/create for the
  file-browser 'new folder' action (validated name, 409/403/500 mapping).
- Tauri system directory picker: 'Choose folder' button in the project
  directory panel calls the @tauri-apps/plugin-dialog native directory
  dialog (capability dialog:allow-open already granted), queueing the
  pick as a session binding or the agent draft; hidden outside the Tauri
  runtime; i18n across all 6 locales.

Verified: backend restart + curl (GET/PUT/DELETE project-dirs, deprecated
views, browse-dirs/create, 422/409/400 cases), dev-proxy end-to-end,
frontend tsc clean, vitest 25/25, production build 2m06s.
2026-09-04 14:30:32 +08:00
Pine c41742e7ca fix(agents): AgentTable 改造——修复 RO 自反馈循环/列挤压/pin 图标语义
路线 A(antd 现代表格重构):
- ResizeObserver 自反馈循环:rAF 合并回调 + >1px 变化阈值,避免 setBodyHeight→Table 重排→容器高度变化→RO 再触发的持续重排(实测页面 1.5s 高度稳定)
- scroll.x 1620 硬编码 → max-content:列随内容自适应,窄容器出现横向滚动(实测内容宽 4296px/视口 1030px,此前 scrollWidth=clientWidth=541 列被挤压)
- pin 图标语义修正:已固定显示实心 Pin(fill=currentColor),未固定显示空心 Pin 邀请固定动作(此前反转:未固定显示 PinOff、已固定显示 Pin 与工具提示矛盾)
- 拖拽手柄补齐 aria-label(agent.dragHandleTooltip)
- 测试:新增 onPin 回传 currentPinned 断言、pin 图标实心/空心断言、拖拽手柄可访问性断言(7/7 通过)
- 验证:tsc 0 错误、build 通过、/agents 页面浏览器实测正常
2026-09-04 13:45:52 +08:00
Pine 29d2f5d966 docs: UPSTREAM_SYNC 补阶段 2/4 变更记录并修正阶段 3 commit 号(ee9f7a3→6000379)
- 补阶段 2(26e305e+59973f6)与阶段 4(8e6b3ab)记录
- 表格按阶段 0→5 顺序重排
2026-09-04 13:25:25 +08:00
Pine 8e6b3abac3 feat(channels/market): 阶段 4 渠道/市场层合并上游 v2.2.0
- PluginManager: 采用上游 useMarketPlugins(300行: 分页append/loadingMore/autoLoadBlocked/竞态AbortController/highlightFilter) + MarketPluginList(无限滚动LoadMoreSentinel+PluginViewToggle卡片/列表切换); OfficialPluginList.module.less 保留三处 var(--color-border) 定制+追加上游移动端@media; index.module.less 三向并合; 本地 index.tsx 保留(operator 权限 gate)
- Market: MarketPanel(新 install: MarketInstallController 接口)/useMarketInstall/useMarketSearch/SkillIcon/ResultCard 采用上游
- Channels: ChannelDrawer/channelConfig/constants 上游版; 定制点保留(channelIcons console=var(--color-primary)、PendingApprovalsDrawer var(--color-success))
- api/types/chat.ts 采用上游(ChatGroup/ChatSource/ChatGroupKind/group_id); pages/Agent/Skills/index.tsx 适配 useMarketInstall
- utils: chatGroups.ts + 14 个上游缺失工具测试补齐; CronJobs 测试补齐
- 测试修复: design-mock 补 Tabs 桩(上游 PluginViewToggle 依赖); MarketPluginList.test 采用上游版; skill.test 品牌映射云超服; lazyWithRetry.test 适配本地 dev-server 回退
- 验证: tsc 0 错误、build 通过、阶段 4 相关 45 测试文件 427 用例全过
2026-09-04 13:24:47 +08:00
Pine 60003796fc feat(settings): 阶段 3 统计/模型/记忆层合并上游 v2.2.0
- TokenUsage:全目录采用上游 lineChartChrome 重构(tokenUsageRows.ts+useDataAggregation+DataTables/SummaryCards),保留云超服配色 useTokenTypeConfig
- api/types/tokenUsage.ts:上游 cache_* 字段
- Settings/Models A 桶吸收增量:+apiKeyValidation、useProviders models_syncing 轮询、index.tsx manageModels URL、providerIcon +volcengine-cn-agentplan/mimo
- api/modules/agentStats.ts:+LlmToolDaily/getGlobalLlmToolTrend
- api/modules/agent.ts:updateAgentRunningConfig timeout 10min + test
- Chat 补漏:OAuthConfirmModal 上游防竞态重构、HarnessModelSelector.test explicit null effort
- tsc 0 错误,build 通过,阶段 3 相关测试全过
2026-09-04 12:23:34 +08:00
Pine 59973f65fd feat(chat): 阶段 2 收尾——B/C 桶剩余合并上游 v2.2.0
- Agent/Tools:+WebSearchConfigModal(web_search 配置),index.tsx 采用上游+主题色映射
- AgentStats:index.tsx 采用上游 agent 视角统计+主题色;SummaryCard formatValue;index.module.less 并合
- Agents:AgentModal 上游 Mail 配置+mailDomains;AgentTable 上游 ResizeObserver/fixed/Dnd + 保留 deletable 逻辑;index.module.less 并合
- SkillPool:useSkillPool 上游自动化状态;SkillPool/index+PoolSkillCard/Drawer/ListItem 采用上游
- TokenUsage:useTokenTypeConfig 上游 lineChartChrome+云超服配色
- CronJobs:上游 calendar.ts 模块化
- RemoteModelManageModal:上游统一提供商重构+ModelCapabilityTags/ModelConfigEditor
- Agent/Config ReMe:+ReMeStatusModal/EmbeddingModelCard/embeddingUtils/useEmbeddingVerification/memoryMaintenanceContext/useReMeRuntimeStatus;index+useAgentConfig 上游
- api/types:agentStats 上游 agent_* 字段;skill.ts 并合(本地扩展+上游自动化类型);agent.ts ReMe/Embedding 并合;provider.ts 补 status/discovered_count
- api/modules:agent.ts 补 testEmbedding;skill.ts 补 getPoolSkill/updatePoolSkillAutomation;tools.ts getToolConfig 补 params
- locales 全量补齐上游新增 key(zh/en +406,vi +226,my/th/lo 英文占位)
- tsc 0 错误,build 通过,阶段 2 相关 659 测试全过;全量 24 失败均预存在
2026-09-04 12:15:42 +08:00
Pine 26e305e805 feat(chat): 阶段 2 聊天体验移植上游 v2.2.0
- B 桶 Chat 系直接采用上游(含云超服主题色映射):HarnessModelSelector/ChatActionGroup/ChatHeaderTitle/LoopModeSelector/ApprovalLevelToggle/ChatSenderTabsPanel/BackgroundTaskPanel/ContextUsageIndicator/HarnessApprovalToggle/useToolCallControl/harness/provider api
- ToolCardShell 上游基底+补本地 inputProgress;merge_less.py 三向 LESS 并合 8 个 module.less
- ModelSelector 三 Tab 并合(上游重构基底+云超服 pineagents Tab,默认保留 pineagents)
- Chat/index.tsx 上游基底 + 10 依赖模块(InlineMarkdown 平铺版/RichFileReferenceInput/MediaDownload 等)
- 复制 upstream_only:turnUsage/turnUsageStore/sessionRoute/loopModeDescription/resolveLocalizedText
- api/types/provider.ts 双改并合(ProviderInfo 补 discovery 字段)
- 新增依赖 lexical@0.48.0+@lexical/react@0.48.0;vite.config 增加 DefaultCards/Audios 精确 alias
- locales 6 语言补齐 36 个上游 chat.* key(my/th/lo 英文占位)
- 测试采用上游版;ModelSelector.test 预设 pro tab 保留云超服默认 pineagents
- tsc 0 错误,build 通过,阶段 2 相关 344 测试全过
2026-09-04 11:55:51 +08:00
Pine b52c9b3303 阶段5补充: OS 市场应用路由适配本地 core.app-center
- osApps MARKETPLACE_APP.routeId: core.marketplace → core.app-center(本地市场 path=/apps),labelKey → nav.market
- osAppRegistry.test.ts 断言改用 MARKETPLACE_APP.routeId 对齐
- 6 osAppRegistry 测试全过
2026-09-04 10:39:39 +08:00
Pine ae3ab5feb5 阶段5: 完整引入上游 OS Shell + Hub + Mailbox
- os/ 67 文件(DesktopOS/Dock/Launcher/MenuBar/MissionControl/NotificationCenter/AppStore/Window 系统 + os*Store/hooks)
- pages/Hub + api/modules/hub.ts + ImportHubModal(已有)
- Inbox 采用上游 Mailbox(approvals/messages 双 Tab + MailAccessControlDrawer/useMailPendingCount/mailDetail),保留云超服 Harvest 组件
- App.tsx 引入 OS Shell 分支(isOsPath→DesktopOSPage, Router 外)+ /hub/admin 路由 + BackendModeRouter + RuntimeAvailabilityGuard,保留云超服 AuthGuard/chatSocket/OPC 主题/vi-th-my-lo
- 双改合并:usePluginLoader(loadPawApp)/pluginMarket(isMarketPluginApp)/registry store(removeBySource)/hostExternals(removePlugin)/LanguageSwitcher(persistRemotely+ja-ru-pt-id)/BackendLoadingPage(override props)/ApprovalCard(reasoning)/auth.ts(mode)/auth/gate.ts
- SidebarSettingsPanel 加 Desktop Mode 入口(OS Shell 切换)
- locales 合并 os/hub/projectDirectory/inbox/account(zh/en/vi 用上游,lo/my/th 用 en 占位)
- 验证:tsc 0 错误、build 通过(1m23s)、阶段5 新增 35 文件 271 测试全过;全量回归 30 失败均预存在(stash 验证)
2026-09-04 10:36:41 +08:00
Pine 8ecc37630a feat(pineagents): 跟随上游 v2.2.0 引入 Files 工作区并迁移 Coding 页(阶段 1)
- 引入 features/files-workspace + features/project-directory + pages/Files(上游 v2.2.0 纯增量)
- 新增依赖:three/3d-force-graph/three-spritetext/motion(MemoryGraph 3D 记忆图)
- 同步上游伴生模块(upstream_only):workspace.ts/git.ts/markdown.ts/codingTabsStore/useWorkspaceWatch/
  FilePreview/TabbedEditor/GitPanel/codingMode*/agents.ts/vite-env.d.ts/api/types/workspace
- api/types/agents.ts 按 A 桶裁决合并:保留云超服 deletable + 吸收上游 Mailbox/MemoryGraph 类型
- Coding 页迁入 Files:删除 pages/Coding/index.tsx + FileTree,/coding 路由移除,
  codingMode 模式导航重定向到 /files(Sidebar/Chat/builtinRoutes/CodingModeToggle)
- builtinMenu 增加 core.files 菜单入口(agent-group 下 order 5)
- locales 合并 files.* 键(zh/en/vi 用上游,lo/my/th 用 en 占位待翻译)
- 测试适配:ResponseArtifactList 深层 chat import 改为相对路径(本地 chat stub 配置所致)
- 验证:tsc 0 错误、vite build 通过、files-workspace/project-directory/stores/locales 测试通过
  (sidebarModeStore 失败为预存在、与本次无关)
2026-09-04 02:51:07 +08:00
Pine 922e20b0b5 chore: 上游同步基线工具与文档(sync-diff + UPSTREAM_SYNC)
- scripts/sync-diff.py: 上游三向 diff 分析工具(base/upstream/local 文件级分类)
- UPSTREAM_SYNC.md: 同步基线文档,含 83 个双改文件 A/B/C 裁决清单、三层代码组织规范、同步流程与验收门
2026-09-04 00:33:18 +08:00
Pine 6932470658 fix(constant): 更新 DEMO_API_BASE_URL 为本地地址以便于开发调试 2026-09-04 00:06:32 +08:00
Pine 7225e37033 feat(pineagents): 添加分类参数以支持精确过滤技能市场搜索结果 2026-09-03 23:26:33 +08:00
Pine 84f34f8e21 feat(apps): 云超服市场商品封面图(cover_url)支持
- 后端 _pineagents_live_plugin 映射 cover_url(server-core 商品封面)
- MarketPluginEntry 类型新增 cover_url
- AppMarket 市场卡片三种情况渲染:
  有封面 → 16:9 封面主视觉(替代图标位)
  无封面有图标 → 图标
  都没有 → 默认 glyph 占位
  封面/图标加载失败均回退下一级占位
2026-09-03 21:37:13 +08:00