ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

holaOS Artifacts / Output 模块改造实战指南:从待办计划到源码落地

holaOS Artifacts / Output 模块改造实战指南:从待办计划到源码落地 人工智能AI AgentAI 应用前端后端即时通讯交互助手工具调用【免费下载链接】holaOSOpen-source agentic workspace enterprises can make their own. Connect the systems you already run — 100 integrations, MCP, chat tools, apps, browser, local files — with shared memory. Any agent (Claude Code, Codex), any model, or BYOK. Set up in clicks, not months. Local-first: your data never leaves your machines.项目地址https://gitcode.com/GitHub_Trending/ho/holaOS点击查看免费下载本文以 docs/artifacts-output-fix-plan.md 这份内部待办与修改方法计划文档为骨架逐一展开其列出的 Bug、功能改进、决策待拍板与暂缓项并结合 holaOS 桌面端与 runtime 的真实源码apps/desktop/electron/、apps/desktop/src/、runtime/给出实现细节、路径依据与可验证证据。读完你将掌握Agent 产出文件的 workspace 路径约束机制、浏览器 overflow 弹窗的原生菜单改造思路、HTML 产出的预览与归类优化方向以及从零到落地完整的 Artifact 模板存储 / IPC / 创建流程复用实现方案。一、计划文档背景与状态图例这份文档是一份面向 holaOSArtifacts / Output 模块的治理清单覆盖产物产出、展示、预览、模板复用这条核心链路。文档使用四类状态图例标记每一项的推进状态 Bug —— 已确认的缺陷需修复✨ 功能 / 改进 —— 已确认方向的功能或体验优化 决策待拍板 —— 方向已讨论、需要 PM 确认范围后实施⏸️ 暂缓 —— 有意推迟后续再做。文档还单列了已剔除清单记录讨论后确认不属于本任务范围的事项避免后续重复评估。本文按这四类分组逐项讲解并在每项中给出当前仓库源码中可验证的落点。二、核心链路 BugAgent 产出文件必须落在 workspace 内2.1 现象与根因#1文档记录了一个被定性为核心链路问题的 Bug现象让 Agent 写 doc文件被写到了沙箱 / 工作目录之外实际 workspace 文件夹是空的。根因方向runtime/harness的 file-write 工具在拼接写入路径时没有以 workspace 根目录为基准解析而是沿用了进程 cwd。Agent 的所有产出文件都必须落在/holaboss/workspace/workspace_id/内。排查重点harness 的工作目录设置 write_file工具的路径拼接涉及runtime/harness-host / api-server 的文件写入可能联动后端沙箱 cwd。备注文档标注〔需 runtime 侧排查后再定确切改法〕即定位精确根因后再确定修复写法。2.2 与 #2 的关系PM 确认#2 与 #1 是同一个问题随 #1 一起排查修复即可不单列。这提醒我们待办清单中形似独立的两条可能经核实后是同因同改治理时先合并去重再排期。2.3 源码侧的印证路径解析始终以 workspace 根为基准虽然本 Bug 指向 runtime 侧但桌面端主进程apps/desktop/electron/main.ts的既有实现早已把workspace 根目录解析作为文件操作的硬约束可作为修复参照resolveLocalWorkspaceRoot(workspaceId)负责解析某个 workspace 的根目录resolveWorkspaceScopedExplorerPath(sourceRelPath, workspaceId)将用户提交的相对路径强制限定在 workspace 根内再做解析例如在saveOutputAsArtifactTemplatemain.ts中先调用它拿到absolutePath再检查existsSync才继续拷贝resolveSessionDeliveryRoot(workspaceId, sessionId, workspaceRoot)main.ts进一步规定会话产出物落在哪里项目绑定的会话写到项目自身目录workspace 根之外其他情况一律落到 workspace 根。这段注释明确写着Mirrors the runtimes sessionOutputRoot so a file written here is found by resolveOutputAbsolutePath later即与 runtime 的sessionOutputRoot保持一致确保 Agent 写出的文件能被输出解析逻辑重新找到。因此修复 #1 的关键就是让 runtime/harness 的写入逻辑与这套约定对齐写入目标一律以workspaceRoot为基准拼接而不是进程 cwd。三、浏览器 overflow 弹窗弃用自定义 HTML改用原生菜单#33.1 现状问题浏览器 ... 更多菜单当前是一个手写 HTML CSS 的自定义 WebContents 弹窗对应文档描述的browser-pane/popups.ts中createOverflowPopupHtml(themeCss)约 455-527 行通过browser:toggleOverflowPopup打开。自定义样式与系统观感不一致导致视觉奇怪。3.2 改造方案弃用自定义 HTML 弹窗改为Electron 原生菜单Menu.buildFromTemplate([ { label: Downloads, click: openDownloads }, { label: History, click: openHistory }, { label: Import browser profile, click: openImportProfile }, ]).popup({ window, x, y });在锚点位置弹出系统原生下拉不写任何 HTML/CSS原有三个动作openDownloads / openHistory / openImportProfile直接挂到菜单项的click上涉及文件按文档指引apps/desktop/electron/browser-pane/popups.ts删除createOverflowPopupHtml路径toggleOverflowPopup改为弹原生 Menu、apps/desktop/electron/overflowPopupPreload.ts可一并移除。3.3 当前仓库状态与取舍从当前仓库源码结构看apps/desktop/electron/browser-pane/目录目录列表已不存在popups.ts仅保留 overflowPopupPreload.ts其contextBridge.exposeInMainWorld(overflowPopup, ...)仍存在说明该自定义弹窗实现很可能已被移除或重构——实施时以现有代码为准。文档还明确记录了取舍原生 Menu 用主题色受限跟随系统但这正是纯 native 不加样式的收益。四、产出预览能力盘点pptx 只读预览与 HTML 输出的现状、优化空间4.1 pptx 只做只读预览#4方向已定文档给出明确结论pptx只做只读预览不做 editoreditor 成本高无需额外开发保持现状。这是范围收敛的典型决策避免在低 ROI 方向上投入编辑器级工作量。4.2 HTML 输出基础已支持重点是找优化空间#5文档先澄清了一个误解PM 原以为html 文件没支持经核实html/htm 已包含在DOCUMENT_EXTENSIONS中已被归类为 Document 且能用内置 tab 打开——基础能力已经支持因此任务从从零支持转为找优化空间。源码证据就在 ArtifactBrowserModal.tsxconst DOCUMENT_EXTENSIONS new Set([ md, mdx, markdown, txt, doc, docx, rtf, odt, html, htm, ]);而 kind 归类逻辑中扩展名落入DOCUMENT_EXTENSIONS时返回document与其它类型spreadsheet / pdf / code并列。可见浏览器 / Artifact 展示层对 HTML 的归类确实存在但仍有以下优化空间真正的网页预览打开 html 文件时渲染为网页而非纯文本 / 编辑器贴近这是个网页的直觉单列 Web page kind把 HTML 从 Documents 中拆出独立类别图标 / 标签更准确支持内容型 HTML 输出渲染html_content字段无对应文件的输出而不是只认文件。涉及文件按文档指引ArtifactBrowserModal.tsx归类 / kind、apps/desktop/src/components/layout/shell/useOpenWorkspaceOutput.ts打开 / 预览。文档将此项标记为低优先级锦上添花基础可用可作为后续迭代的排期参考。五、Artifacts 列表体验Apps 空状态引导与 Pin 全覆盖5.1 Apps 类型空状态加入口#6现状Apps filter 下没有内容时缺少引导。修改方法在 ArtifactsPane 的 Apps 过滤为空时渲染一个引导入口连接 / 安装 app 的 CTA。涉及文件apps/desktop/src/components/panes/ArtifactsPane.tsx文档备注增强版在release/2026.612分支。空状态 CTA 是列表型界面最常见的可用性缺口这里的原则是空列表也要给下一步动作。5.2 让能 pin 的地方尽量都有 pin#7目标PM 拍板Pin 收藏不必新建概念只要凡是展示 artifact / 文件 / output 的表面都提供 pinstar入口保持一致。现状盘点已知已有——artifact 行 star、文件树右键 Pin to sidebar需要排查补齐的候选——Recent 列表项、聊天内联 Outputs 行、文件预览FilePreviewPane、搜索结果等。统一做法复用toggleFavoriteAtomisFavoriteAtom在缺失处加一致的 star 按钮 / 菜单项。源码印证apps/desktop/src/components/layout/shell/state/favorites.ts定义了统一的收藏状态模型——第 108 行注释明确Descriptor accepted by toggleFavoriteAtom——also the prop shape any…即该 atom 同时充当组件 props 形状第 138 行为toggleFavoriteAtom定义。当前仓库中已有多个展示表面复用该模型apps/desktop/src/components/layout/shell/PinStarButton.tsx—— 通用 star 按钮组件apps/desktop/src/components/layout/shell/Sidebar.tsx—— 侧边栏文件树右键 Pin to sidebar 即来自此apps/desktop/src/components/panes/ArtifactsPane.tsx—— artifact 行 starapps/desktop/src/components/panes/InstalledAppsList.tsx—— 已安装 Apps 列表。可见 #7 的统一复用 atom思路已在多数表面落地剩余工作是盘点并补齐Recent / 内联 Outputs / FilePreviewPane / 搜索结果等尚未覆盖的入口。六、决策落地只删除浏览器书签栏的 Folders 按钮#8PM 决定导入保留、书签保留有意义——书签栏继续显示散装书签只删掉 Folders 那个弹层按钮。修改方法按文档指引在BrowserPane.tsx移除bookmarkTree.folders.length 0时渲染的那段 FoldersPopover约 1059-1087 行。书签栏showBookmarkStrip和散装书签rootBookmarks保持不动bookmarkTree.folders数据可以保留不用也可顺手不再渲染。范围约束不动BrowserProfileImportButton/ 导入流程 / 书签栏其余部分。这是一个最小化改动的典型样例功能上只需要删除一个入口明确圈定不改的边界导入、书签数据、书签栏渲染避免改动蔓延。需要说明的是按文档指引的BrowserPane.tsx在当前仓库apps/desktop/src/components/panes/下已无法直接检索到对应文件书签相关实现可能已迁移或重构实施时请以当前分支实际代码为准定位那一段 Popover 渲染。七、Artifact 模板从设计建议到完整源码实现#9已落地7.1 现状与目标文档先厘清了现状已查清现有 Save as templateSaveTemplateDialog Sidebar 2743 行 IPCworkspace:saveAsTemplate→saveWorkspaceAsTemplate是workspace 级模板把整个 workspace 目录拷到userData/local-templates/id/供新建 workspace复用没有artifact单个产出物级别的模板机制。目标让用户把某个 artifactdocx / pptx / xlsx / report 等存成可复用模板下次创建同类产出直接套用。7.2 设计建议的五步方案文档给出了 5 步实现方法逐条如下存储镜像现有 local-templates 模式新增userData/local-artifact-templates/templateId/内放 ① 该 artifact 的文件副本 ②template.jsonmanifestoutput_type/title/extension/ 来源 metadata / emoji / 描述。入口存在 artifact 行的⋯菜单加 Save as artifact template复用 ArtifactRow 行操作菜单弹一个轻量 dialog 收名称 / 描述复用SaveTemplateDialog模式。IPC新增workspace:saveArtifactAsTemplate拷文件 写 manifest、workspace:listArtifactTemplates、workspace:deleteArtifactTemplate在main.ts仿saveWorkspaceAsTemplate实现。入口用在 Output 创建选择器Sidebar 约 3574-3624 行的 Folder / Markdown / Word / … picker末尾追加 From template…列出已存的 artifact 模板选中后把模板文件拷进当前 workspace 作为新文件再交给 agent / editor。可选agent 复用把 artifact 模板登记进 workspace.yaml / skills让 agent 创建同类产出时能引用模板结构。7.3 当前仓库中的完整落地源码证据关键发现该功能在当前仓库中已经完整实现落点在apps/desktop/electron/main.ts与文档建议基本一一对应存储根目录artifactTemplatesRoot()main.ts L15145返回path.join(app.getPath(userData), artifact-templates)—— 与文档建议的local-artifact-templates同思路实际目录名用了artifact-templates列出模板listArtifactTemplates()main.ts L15157遍历根目录下的每个子目录读取template.json校验id/name后按createdAt倒序返回预览readArtifactTemplatePreview()main.ts L15225—— 图片类扩展名png/jpg/jpeg/gif/webp/svg/bmp/avif返回 base64 dataURL单文件 2MB 返回 none文本类扩展名md/markdown/txt/html/htm/csv/tsv/json/xml/yaml/yml/css/ts/tsx/js/jsx/py返回前 1200 字符的文本预览对templateId做了..// 路径分隔符注入校验保存模板saveOutputAsArtifactTemplate()main.ts L15273—— 校验workspaceId/filePath/name必填用resolveWorkspaceScopedExplorerPath解析源文件保证在 workspace 根内slugifyArtifactTemplate(name) Date.now().toString(36)生成模板 ID拷贝文件为contentext并写出 manifest从模板创建createOutputFromArtifactTemplate()main.ts L15362—— 读取模板 manifest解析目标 workspace 根与resolveSessionDeliveryRoot会话产出目录把contentext拷入 workspace 作为新文件删除模板deleteArtifactTemplate()main.ts L15418。**IPC 通道main.ts L28670-L28703**已注册五个IPC 通道功能workspace:listArtifactTemplates列出全部模板workspace:readArtifactTemplatePreview读取模板预览图片 dataURL / 文本摘要workspace:saveOutputAsTemplate把某个 output 保存为模板workspace:createOutputFromTemplate从模板创建新输出workspace:deleteArtifactTemplate删除模板渲染进程侧apps/desktop/electron/preload.ts第 2202 行起通过contextBridge暴露listArtifactTemplates等对应方法前端可直接调用。manifesttemplate.json字段源码可见的ArtifactTemplateRecordPayload实际字段id、name、description、category、ext、outputType默认document、fileName源文件 basename、createdAtISO 字符串以及内部追加的contentFileName与schemaVersion。文档建议的output_type / title / extension / emoji / 描述字段在实际实现中演化为上述字段集合。7.4 待拍板事项文档备注中请 PM 确认两点先做 1-4 步存 在创建流程里复用即可第 5 步 agent 复用作为后续另外确认artifact 模板是 per-workspace 还是全局共享。从当前源码看模板存储落在userData全局目录即全局共享方案第 5 步的 agent 复用登记进 workspace.yaml / skills在当前仓库中未见对应实现仍属后续可选项。八、暂缓项与已剔除清单8.1 暂缓docx editor 操作图标清晰化docx 已支持 editor操作图标可读性提升暂缓后续再做。文档没有展开具体图标清单仅记录后续再做的状态避免在排期上遗留未决但未记录的悬空项。8.2 已剔除讨论后确认非任务文档明确排除以下条目防止后续误纳入范围editor 崩溃—— 实际没有此问题创建 → 弹对话框 → agent 跑统一流程—— 暂时不用可复用小组件—— 非确认任务看图识别录入 Notion / 看图自动填输入框—— 没有此任务plugin onboarding 表单Sam—— 不在本范围。这类已剔除清单的价值在于把讨论过的候选永久归档标注否决理由为后续评审省去重复论证。九、相关源码索引本文引用的核心证据文件仓库根相对路径计划文档本体docs/artifacts-output-fix-plan.mdAgent 产出路径解析 / workspace 约束apps/desktop/electron/main.tsresolveLocalWorkspaceRoot、resolveWorkspaceScopedExplorerPath、resolveSessionDeliveryRoot见 L15157-L15389 附近Artifact 模板完整实现apps/desktop/electron/main.ts存储 / 预览 / 保存 / 创建 / 删除与 IPC 注册段、preload 桥接产出归类与扩展名清单ArtifactBrowserModal.tsx 与 kind 判定收藏模型与 Pin 入口favorites.ts、PinStarButton.tsx、Sidebar.tsx、ArtifactsPane.tsx产出打开 / 预览逻辑useOpenWorkspaceOutput.ts浏览器 pane 目录原生菜单改造落点apps/desktop/electron/browser-pane/小结这份计划文档的价值不在于列出了多少条待办而在于每一条都给出了现象 → 根因 / 决策 → 修改方法 → 涉及文件的完整闭环并明确标注了状态Bug / 功能 / 待拍板 / 暂缓 / 已剔除。对照当前仓库源码可以看到核心的 Agent 产出路径约束已成为文件操作的统一前置校验resolveWorkspaceScopedExplorerPathHTML 产出的基础归类早已在DOCUMENT_EXTENSIONS中支持Pin 入口已通过toggleFavoriteAtom在多个表面复用而Artifact 模板#9已经从设计建议完整落地为main.ts中的五条 IPC manifest 机制。对于尚未实施的项原生菜单改造、Apps 空状态 CTA、Pin 补齐、Folders 按钮删除本文给出的源码位置与边界说明可直接作为后续实施的起点。赞分享人工智能AI AgentAI 应用前端后端即时通讯交互助手工具调用【免费下载链接】holaOSOpen-source agentic workspace enterprises can make their own. Connect the systems you already run — 100 integrations, MCP, chat tools, apps, browser, local files — with shared memory. Any agent (Claude Code, Codex), any model, or BYOK. Set up in clicks, not months. Local-first: your data never leaves your machines.项目地址https://gitcode.com/GitHub_Trending/ho/holaOS点击查看免费下载相关推荐AgentScope最佳实践代码组织与模块设计AgentScope最佳实践代码组织与模块设计 引言为什么需要良好的代码组织 在构建复杂的多智能体系统时代码组织质量直接决定了项目的可维护性、可扩展性和人工智能大模型AI Agent多智能体Agent 框架Agent 编排工具调用RAGMCP 服务语音opencodex 管理 API 本地认证与安全 DTO 实战指南从 Phase 3 计划到源码落地opencodex 管理 API 本地认证与安全 DTO 实战指南从 Phase 3 计划到源码落地 本文基于仓库开发日志中的实施计划 devlog/_finWebiny Webhook 投递保留期配置deliveryRetentionDays落地指南从实施计划到源码验证Webiny Webhook 投递保留期配置deliveryRetentionDays落地指南从实施计划到源码验证 本文围绕 Webiny 开源仓库中的一CMS后端前端上一篇PPTTimerWindows平台终极演讲计时器让PPT演示时间掌控如呼吸般自然下一篇专业级OBS多平台直播插件obs-multi-rtmp完全配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表