Commit Graph

251 Commits

Author SHA1 Message Date
Pine 7e9969ec00 修复:登录后仍 401 / 身份状态不正确的根因链路
- auth_token_store: load 读取源统一为 session 文件优先(消除两文件不同步);
  save 后自动失效 server_client 的 5 秒 token 缓存(invalidate_token_cache 此前零调用)
- auth.py: 微信/小程序扫码登录成功后补写完整 session(与主登录路径对齐)
- auth.ts: 受保护接口复用统一 request 封装(401 会话自愈,不再裸抛导致权限/身份静默缺失)
- authStore: init 检测 token 与旧 profile 的 sub 不一致时以 token 为准(防账号残留错配)
- request: 401 确认重新登录时同步清空内存 authStore 身份
- auth.test: 适配统一 request(headers.get)
2026-09-13 16:13:32 +08:00
Pine e5a9366d94 修复:401 不再静默清空登录态强退,改为会话自愈 + 友好提示
- request.ts 401 处理重构:
  1) 先自愈:从 /auth/session(桌面端后端持久化登录态)取回有效 token 写入
     localStorage,重试原请求一次(业务接口有效,登录类 /auth/* 不参与)
  2) 自愈失败:弹「登录状态已失效」确认框,用户确认后才清 token 跳登录,
     不再任何 401 即静默 clearAuthToken + 强制跳转
- 覆盖进入「我的企业」等强鉴权页面时因 token 残留/失效被误判退出登录的场景
- 测试:request 22/22 通过(含自愈重试、自愈失败提示、auth 递归防护)
2026-09-13 15:44:13 +08:00
Pine 27f1b7ff24 设置-模型:PineAgents 模型卡片系列/图标改为读取算力中心真实数据
- 移除 seriesOf 前缀/版本剥离推断系列(数据库为准,被否决方案)
- 系列分组:useComputeModelMeta 匹配算力模型元数据 series,未匹配归入「未分组」且固定排最后
- 模型图标:icon_file || supplier_icon_file(真实图片),未匹配回退渐变首字母
- 系列头:显示数据库系列图标(series_icon_file || series_icon)
- 测试 5/5 通过,tsc 通过
2026-09-13 15:27:55 +08:00
Pine 513e40dd40 fix(boot): Color 改用元组构造 Color(r,g,b,a) 2026-09-13 15:20:00 +08:00
Pine 094dfff9c6 fix(boot): 修正 Color 导入路径为 tauri::window::Color 2026-09-13 15:17:12 +08:00
Pine f9230c07d1 fix(boot): 初始化页进度条严格单调递增 + 消除导航黑屏
- 进度逻辑重写:checking 阶段 1.5s 快速到 80-90% 随机值,随后每 1.5s +1% 缓慢爬升到 97%,
  彻底移除原 85-92% 随机波动(会导致 90%→80% 回退)
- ready 阶段 0.4s 迅速到 100%,所有阶段用 Math.max 保证绝不回退
- CSS 移除 width transition(JS 已按帧驱动,transition 导致进度条与数字不同步抖动),
  圆点 7px→5px 适配轨道高度
- Rust 端 webview 设置深色背景 #0f172a,与启动页一致,消除 window.location.replace
  导航间隙的闪白/黑屏
2026-09-13 15:00:30 +08:00
Pine 6d042bc5c5 桌面端:模型元数据增强——聊天/设置模型项接入算力中心真实系列与图标
- 新增 utils/computeModelMeta.ts(useComputeModelMeta):从 /api/opc/compute/models
  读取算力中心模型元数据(series/icon_file/supplier_icon_file),按 id/name 建立索引
- 新增 components/computeModel/ModelMetaBadges.tsx:模型图标+系列徽标(匹配不到回退原渲染)
- Chat/ModelSelector 模型项:显示模型图标(icon_file||supplier_icon_file)+系列徽标
- CandidateModelSection 候选模型:追加系列徽标
- Settings/Models(智能体设置):ModelsSection/RemoteModelManageModal 模型下拉带系列前缀
- 算力-模型(Compute.tsx):模型项图标补充供应商图标兜底 supplier_icon_file
2026-09-13 14:38:30 +08:00
Pine a2f230d7f4 fix(compute-desktop): 系列分组排序——未分组固定排最后 2026-09-13 14:14:48 +08:00
Pine 1ace97b2eb fix(compute-desktop): 系列渲染从数据库读取——去除按前缀推断
- auth.ts 新增 getOpcComputeSeries(公开系列接口)并补全模型类型字段
- 分组 key 用 m.series(DB),去掉 seriesOf 前缀推断(函数已删)
- 系列头图标优先取系列表 icon,其次模型级 series_icon_file
2026-09-13 13:37:17 +08:00
Pine 5c7e9a13c9 feat(desktop): 权限详情强制刷新、园区成员判定与通讯录/授权管理
- getPermissions 带 nocache=1,避免权限变更后读到旧 company_member_of
- jwt 新增 getUserParks/isParkMember 园区归属判定
- 通讯录与 AgentGrants 页面能力增强
2026-09-13 11:14:38 +08:00
Pine edc4400fa4 feat(desktop): 算力中心 API 接入信息 4 端点展示(含 tsc 清理)
- API tab 扩为 Base URL / OpenAI Bearer / Anthropic x-api-key / Models 四行
- 清理 Sidebar parkAdmin、communicationStore、BackendLoadingPage 未使用代码,tsc 全绿
2026-09-13 11:14:37 +08:00
Pine d790699b11 fix(enterprise): 算力页成员余额列名改为「可用算力」
后端已改为返回引擎实时真实余额(个人充值+企业分配),列名同步更准确。
2026-09-11 21:54:07 +08:00
Pine 123ba0d0fa feat: 桌面端认证/通信/tauri 后端更新 + README
- auth/jwt/header 认证流程更新,会话与令牌处理增强
- 通信(ChatWindow/ConversationList/Network)更新
- tauri backend.rs/remote.rs、tauri.conf.json 更新
- pineagents app 路由(agent_gate/opc)与配置更新
2026-09-11 21:17:48 +08:00
Pine bbae20107f fix(router): lazyImportWithRetry 支持单文件页面的 .tsx/.ts 扩展名匹配
AgentGrants.tsx 是 Settings 下唯一的单文件页面(其余均为目录),
lazyImportWithRetry 的 glob key 解析只尝试了 /index.tsx、/index.ts,
未尝试 .tsx/.ts 后缀,导致 glob 未命中后回退到 @vite-ignore 运行时
动态 import,生产环境请求 404 → 返回 HTML → 'text/html' is not a
valid JavaScript MIME type → 页面渲染崩溃。
增加 .tsx/.ts 扩展名候选,与目录形式并列尝试。
2026-09-10 19:41:19 +08:00
Pine d03e3e12eb fix: 修复智能体互通页面TypeScript构建错误(PageHeader props/未使用变量/类型转换),完成前端构建 2026-09-10 15:02:05 +08:00
Pine d9dcbf214c fix(models): 移除 OpenCode 不可用的免费模型并增强错误提示
- OpenCode *-free 免费模型在第三方 API 直连时被上游硬性拒绝
  (400 MissingSessionID: free tier can only be used in OpenCode),
  选中后必然 MODEL_EXECUTION_ERROR;从内置列表与探测结果中移除
- 模型选择器过滤掉无可用模型的 provider(含仅剩非对话模型的情况)
- convert_model_exception 对服务商限制类错误(only be used in /
  model is unavailable / missing session / upstream request failed)
  给出明确中文提示,不再只显示「模型执行失败」
2026-09-10 14:04:40 +08:00
Pine 42ce8d3d83 feat: 智能体互通功能完整实现——新增Agent/Network互通列表页(在线智能体展示+搜索+过滤)、跨端调用聊天页(复用ChatWindow+agent_task发送)、路由/菜单配置、智能体管理页增加授权管理入口、AgentGrants页增加三级权限模型说明 2026-09-10 13:24:51 +08:00
Pine 8fd3bcc89d fix(login): 验证码发送失败时同样进入60s倒计时并禁用按钮,配合服务端冷却避免触发阿里云流控 2026-09-10 12:19:28 +08:00
Pine 81e7e0f946 feat(agent-gate): 桌面端前端——IM 调用智能体入口(企业目录选择器+agent_task 发送)、agent_reply 状态卡片、智能体授权管理页(/agent-grants)+路由菜单 2026-09-10 10:33:59 +08:00
Pine 23694f6e12 chore: 更新应用图标(本地打包重新生成) 2026-09-09 05:15:04 +08:00
Pine 4cda138747 fix: #1 消息中心前端——侧边栏沟通未读角标 + 站内消息轮询与点击已读
- Sidebar '沟通'菜单显示会话未读总数角标(communicationStore 驱动)
- /opc/messages 页:30s 轮询刷新 + 点击单条调 POST /opc/messages/read 标记已读并即时更新
- authApi 补 getOpcMessagesUnread / markOpcMessagesRead(配套 server-core 新接口)
- OpcList 支持可选 onItemClick
2026-09-09 04:57:34 +08:00
Pine 28188f59dd fix: 云超服待修复清单 #2-#21 批量修复
- #2 活动详情页返回按钮去重(移除 OpcPageHeader 假按钮)
- #4/#5 企业成员加入时间/提交时间 ISO 格式化(dayjs)
- #6 智能体列表名称列补启用/禁用 Tag(i18n 五语言)
- #7 编辑不存在的智能体返回可读中文提示
- #8 模型管理 Provider 图标 24→32
- #9 SKILL.md frontmatter YAML 错误中文友好提示(含行号)
- #10 补 PUT /skills/pool/{name}/automation 路由(auto_sync 持久化+即时同步),修复 405
- #11 技能池"浏览市场"死链改为 /skills?view=market
- #12 安全规则操作列 width 100→160 + fixed right
- #13 自定义规则增删改即时自动保存(updateToolGuard),切页不丢失
- #14 补 GET /agent-stats/llm-tool-trend 路由(复用 by_date),Token 页 404 修复
- #15-#21 插件安装异常统一友好化:URL 非 ASCII 规范化、HTTPError/URLError/BadZipFile/zip 结构分别映射中文提示、剥离命令行前缀
2026-09-09 04:49:55 +08:00
Pine c0fa57c21c fix(chat): 对话模型选择器过滤非文本模型并修复免费层 provider 误显示
- buildEligibleProviders 不再无条件放行 is_free_tier provider:
  无 key 且未连接 OAuth 的免费层(openrouter/gemini/zhipu/github-models 等)
  不再显示,避免选中后调用 401/403 报错
- 新增 isNonChatModelId 过滤 TTS/ASR/embedding/图像生成/视频生成等
  非对话模型(qwen3-tts-flash/qwen3-asr-flash/qwen-image/kling 等),
  与后端 _is_non_chat_model 规则保持一致
- 后端 _NON_CHAT_SUBSTRINGS 补充 video-generation(kling 系列)
2026-09-09 04:13:38 +08:00
Pine dc65eeaec6 服务管理页审核体验:明确「审核通过后自动上架」
- 状态标签 pending 改「审核中」;列表内显示提示「审核通过后自动上架,
  无需其他操作」
- 重新上架:个人提交后提示「已提交重新上架审核,审核通过后自动上架」
2026-09-09 03:16:28 +08:00
Pine 8a88a1d1f8 修复服务封面上传 422:桌面端 /service-market POST 透传 multipart
- 根因:hall.py service_market_post 用 forward()(JSON only)转发 multipart 上传,
  body 被丢弃 → server-core 收到空请求 → 422 missing file
- service-market POST 增加 Content-Type 分流:multipart/form-data 走 forward_upload
  透传文件(保留字段名与 Bearer JWT),JSON 仍走 forward
- 封面必填标识:label 显式加红星(antd5 裸 label 的 required 类不渲染星号),
  与下一步强制校验保持一致
2026-09-09 02:56:52 +08:00
Pine 0f95f5e0e5 修复服务发布封面上传:antd Upload 改用 customRequest 上传真实 File
- 原 Upload 未设 customRequest/action,默认向当前页 URL(/console/opc/hall/services/publish)
  发 POST → uvicorn 静态服务 405 Method Not Allowed
- onChange 手动 uploadMedia(file.originFileObj) 时机不稳导致后端收到空 file → 422
- 改为 customRequest 直接上传真实 File 到 /api/service-market/upload(一次上传,
  OSS 直链回填 cover);onChange 仅处理移除清空
2026-09-09 02:46:58 +08:00
LinJie a2e5e13bce feat(pack): 统一 CLI 为 yunopc-hub、桌面品牌对齐,并补充 README 打包/增量更新文档
- Windows/macOS 打包脚本与 pineagents.spec:CLI 可执行名由 qwenpaw 改为 yunopc-hub
- NSIS 安装器:CLI 注册命令与多语言文案统一为 yunopc-hub / YunOPC-Hub / 云超服
- 桌面 OS(MenuBar/BootScreen/DesktopOS):品牌标识改用 BRAND 单一来源
- README:补充规范化版本号设置、macOS/Windows 一键构建、增量更新完整命令

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-09-08 13:06:49 +08:00
Pine 8ed5db361c chore: 更新 Tauri 图标文件 2026-09-08 11:15:49 +08:00
Pine 11282ed3d6 fix(vite.config): 将 SVG 加载器从 file 更改为 dataurl,以兼容 macOS/Windows 2026-09-08 11:08:48 +08:00
Pine dcdcb9d199 fix(about): 修正产品logo路径为绝对路径 2026-09-08 10:50:56 +08:00
Pine 2727fc6285 feat(constants): 更新 DEMO_API_BASE_URL 为生产地址 2026-09-08 10:20:17 +08:00
Pine 172ea59649 feat(ui): 语言切换/循环模式/项目目录/设置页/插件市场/聊天组件等前端更新 2026-09-08 00:11:22 +08:00
Pine 7ff5c11c08 feat(plugins): pineagents 插件目录下载/加载与版本兼容;前端插件API更新 2026-09-08 00:11:14 +08:00
Pine 8b2e320974 feat(portal): 园区承运/企业/OPC财务与通知页面更新 2026-09-08 00:11:07 +08:00
Pine 0c59bc0c5c feat(activities): OPC活动功能三页面+API+路由菜单 2026-09-08 00:11:01 +08:00
Pine 0341730668 feat(desktop): 深色科技风启动初始化页;Tauri v2 dmg配置修复;AppCenter createPortal解决覆盖;CORS白名单补8093 2026-09-08 00:10:41 +08:00
Pine f7bcbfa170 ui: 算力中心平台中继令牌说明改为平台中继接口
避免在 UI 上出现'平台中继令牌'字样(该令牌由系统管理,不对外展示)。
后端已过滤该令牌的列表展示和删除操作。
2026-09-08 00:08:36 +08:00
Pine d384bf256a fix: 修复清理调试日志后残留的 console.log( 语法错误 2026-09-07 23:34:54 +08:00
Pine 114b5fa484 chore: 移除外链调试页 /ext-debug 及相关调试日志
- 删除 ExternalLinkDebugPage.tsx 调试页
- 移除 App.tsx / builtinRoutes.tsx 中的 /ext-debug 路由注册
- 移除 Sidebar.tsx 底部「外链调试」入口按钮
- 清理 osRouteStore/osWindowStore/WebPage/openExternalLink 中的
  [ext-debug] 调试日志
2026-09-07 23:33:48 +08:00
Pine f2871a2153 fix: 移除禁用系统浏览器后未使用的 invoke/常量 import 2026-09-07 23:30:13 +08:00
Pine f135a07ebe build: macOS 打包脚本确保生成 DMG 安装包
根因:build_macos_pyinstaller.sh Step 3 显式指定 --bundles app,覆盖了
tauri.conf.json 里的 dmg target,只生成 .app 然后手动打 ZIP,完全没生成 DMG。

修复:
1. --bundles app → --bundles app,dmg(同时构建 .app 和 .dmg)
2. Step 4 增加 DMG 产物收集:从 bundle/dmg/*.dmg 复制到 dist/,
   命名 YunOPC-Hub-{VERSION}-macOS.dmg,输出大小和路径
3. 构建完成摘要增加 DMG 路径
4. package.json 增加快捷脚本:tauri:dev / tauri:build /
   tauri:build:mac / tauri:build:mac:debug
5. tauri.conf.json bundle.macOS.dmg 增加专业配置:
   windowSize [640,440] + applicationFolder=true(DMG 内显示
   /Applications 快捷方式,支持拖拽安装)

macOS DMG 打包依赖系统自带 hdiutil,无需额外安装。
2026-09-07 23:29:53 +08:00
Pine c8a704d65d security: 桌面端绝对禁止调用系统浏览器
堵死所有系统浏览器调用路径:
1. Rust open_external_link 命令改为 no-op(不再调用 app.shell().open,只记录日志)
2. capabilities 移除 shell:allow-open 权限(前端无法直接调用 shell.open)
3. 前端 fallbackToSystem 改为 no-op(容器打开失败时仅日志,不做任何外部打开)
4. 前端 openExternalLinkInternal 的 tauri 分支不再 invoke 系统浏览器命令
5. WebPage 容器移除「系统浏览器打开」按钮(blocked 提示保留但无操作按钮)

配合原生层 on_new_window=Deny(已在上次提交)+ 前端 window.open 守卫 + <a> 点击拦截器,
形成完整的系统浏览器禁用策略:所有外部 HTTP(S) 链接统一由应用内容器 WebPage 沙箱接管。
2026-09-07 23:22:28 +08:00
Pine 4496bac2db fix: 原生层拦截 new_window=Deny,彻底阻止系统浏览器双开
- tauri.conf.json windows=[]:不再自动创建主窗口
- lib.rs setup 中用 WebviewWindowBuilder 手动创建主窗口,builder 上设置
  .on_new_window(|_, _| NewWindowResponse::Deny)——从原生层阻止 window.open /
  target=_blank 被 Tauri 转给系统浏览器(这是唯一可靠的方式,Webview 实例的
  on_new_window 被 unstable feature 门控不可用)
- 窗口配置保持原样:标题云超服、1280x800、最小 960x600、可调整大小
- 配合前端 window.open 守卫 + <a> 点击拦截器,形成原生+前端双层拦截
2026-09-07 23:08:04 +08:00
Pine 0132cbfd04 fix: 前端 window.open 守卫从源头阻止 Tauri 新窗口/系统浏览器双开
- 新增 windowOpenGuard.ts:覆盖 window.open,外部 HTTP(S) 链接统一走
  openExternalLink(应用内容器 WebPage 沙箱),同源/相对/mailto/tel 放行
- App 启动时 installWindowOpenGuard() + 预加载黑白名单规则
- 回退 Rust 端 unstable feature / on_new_window 方案(API 被 unstable 门控,
  编译路径复杂;前端守卫更可靠且无需重新打包 Tauri)
- 配合 interceptBlankLinkClicks(<a> 点击 capture preventDefault)形成完整接管
2026-09-07 22:57:21 +08:00
Pine 62375ed7db fix: tauri.conf new_window 配置路径修正(WindowConfig 直接字段,非 webview 子对象) 2026-09-07 22:43:55 +08:00
Pine fe0af6f964 fix: 网页容器三问题修复
1. 双重打开:tauri.conf webview.new_window=deny,阻止 target=_blank/window.open
   被 Tauri 转给系统浏览器(需重新打包 Tauri 生效)
2. 黑名单未静默:openExternalLink/openInAppWebView 加同步缓存黑名单判定
   (getCachedUrlRulesSync + classifyUrl),命中立即 return 无任何动作;
   App 启动预加载 loadUrlRules,避免首次点击异步等待
3. 加载慢:iframe 不再 visibility:hidden,立即渲染;loading 改半透明覆盖层;
   blockedTimer 6s→15s 减少误报系统浏览器打开
2026-09-07 22:38:58 +08:00
Pine c32490e213 feat: URL 名单支持通配 *.gov.cn 与正则 /pattern/ 判定
- parseHostList 保留正则/通配形态
- hostRuleMatches:正则 /pattern/、通配 *、普通域名后缀匹配三态
2026-09-07 22:25:25 +08:00
Pine 641d2f19ff feat: URL 黑白名单接入应用端(黑名单静默拦截)
- urlTrust:loadUrlRules 读取 site.url_whitelist/blacklist;classifyUrl 返回
  block/trusted/third-party(黑名单优先)
- openExternalLink / openInAppWebView / 全局锚点拦截器:命中黑名单静默不打开
- WebPage 判定改用 classifyUrl;黑名单防御直接关闭
2026-09-07 22:19:36 +08:00
Pine 2290c103db fix: 白屏崩溃 + shell.open 权限
1. WebViewOverlayHost 内 WebPage 是 lazy 组件,脱离 Suspense 边界渲染
   → React 抛错整树卸载(纯背景无内容)。包 Suspense fallback=null。
2. Rust 端 app.shell().open 缺 shell:allow-open 权限
   → invoke open_external_link 被拒(shell.open not allowed)。补权限。
2026-09-07 22:05:19 +08:00
Pine f27085ac6b fix: 网页容器覆盖层宿主上移到全局(BrowserRouter 内)
根因:诊断页 /ext-debug 在 MainLayout 外壳之外,覆盖层宿主只挂在
MainLayout 顶层,诊断页里 open 容器后无宿主渲染 → 只有 invoke 系统浏览器
可用。将 WebViewOverlayHost 移到 BrowserRouter 内(所有路由共享),
移除 MainLayout 内宿主避免双渲染。
2026-09-07 21:16:19 +08:00