Craft Agents v0.4.2 版本解析:GitHub Copilot 接入、Mermaid 引擎重构与原生数据表格能力
【免费下载链接】craft-agents-oss项目地址: https://gitcode.com/GitHub_Trending/cr/craft-agents-oss
本篇技术指南以 v0.4.2 版本发布说明 为骨架,围绕 Craft Agents 桌面客户端的四大核心更新展开:GitHub Copilot 作为替代 LLM 提供商的接入、完全重构的 Mermaid 图表引擎、原生数据表格(datatable / spreadsheet)与transform_data工具、以及 Codex 集成的稳定性修复。读者读完本文将掌握这些新特性的使用方法、底层实现机制与适用场景,并能在实际会话中直接复现其中的代码与配置示例。
版本概览
v0.4.2 是 Craft Agents 早期演进中的一个重要里程碑,定位是功能大增、稳定性修复密集的版本。版本摘要明确给出三大主题:
- GitHub Copilot Support:新增 GitHub Copilot 作为替代 LLM 提供商,支持完整的 OAuth 认证;
- Mermaid Overhaul:彻底重绘图表引擎,用 ELK 布局替换 Dagre;
- Data Tables:原生数据表格与电子表格渲染,配套
transform_data数据变换工具。
除此之外,该版本还包含连接与提供商改进、Codex 集成修复、一批 Bug 修复、依赖升级以及构建与基础设施调整。
仓库中同一目录下的其他发布说明(如 0.4.1.md、0.4.3.md)可以用于对照观察功能演进脉络,而本文聚焦 0.4.2 本身。
GitHub Copilot 支持:新的替代 LLM 提供商
核心更新内容
v0.4.2 将 GitHub Copilot 引入为替代 LLM 提供商(alternative provider),这意味着它并非取代默认模型,而是在默认提供商的配置之上,为用户提供一个可切换的新选项。版本说明中列出的关键改动包括:
- 完整的 OAuth 认证:通过标准的 OAuth 流程接入 Copilot,而非简单填入 API Key;
- 新的连接配置界面:用于配置提供商以及在多个提供商之间切换;
- 提供商专属图标:为 Claude、Copilot、OpenAI、Ollama、OpenRouter 和 Vercel 提供各自的图标;
- 切换提供商时的会话锁警告:防止在切换过程中造成会话上下文或凭证的混淆。
源码佐证
从源码结构看,Copilot 的接入沿用了仓库统一的提供商抽象体系:
- 认证层:OAuth 相关实现集中在 packages/shared/src/auth 目录,其中 oauth.ts 定义了通用 OAuth 流程,oauth.test.ts 与 oauth.e2e.test.ts 覆盖了对应的单元与端到端测试,说明 v0.4.2 的 "full OAuth authentication" 并不是孤立实现,而是构建在既有认证基础设施之上;
- 连接配置逻辑:桌面端连接建立流程位于 connection-setup-logic.ts,其测试 connection-setup-logic.test.ts 与 Electron 侧的 connection-setup-logic.test.ts 均覆盖了多提供商场景;
- 提供商图标:渲染层的 provider-icons.ts 维护各提供商图标映射,对应版本说明中 "Provider-specific icons for Claude, Copilot, OpenAI, Ollama, OpenRouter, and Vercel" 的描述;
- 提供商选择界面:ProviderSelectStep.tsx 是引导流程中的提供商选择步骤,用户可以在此完成提供商之间的切换。
使用建议
在 v0.4.2 及后续版本中,接入 Copilot 的路径是:打开连接/配置界面(或引导流程的 ProviderSelectStep)→ 选择 Copilot → 完成 OAuth 授权 → 回到会话。注意切换提供商时界面会给出会话锁警告,建议在切换前结束当前会话或确认无未保存的上下文,避免凭证与模型上下文错配。
连接与提供商改进:默认模型升级与认证增强
版本说明的 "Connection & Provider Improvements" 小节围绕连接体验做了四个层面的增强:
- 精炼 LLM 连接配置界面:与新增 Copilot 连接界面属于同一轮 UI 调整;
- 默认模型更新为 Claude Opus 4.6:模型解析与映射逻辑在 packages/shared/src/config/models.ts 中维护。当前源码中可以看到模型别名映射表,例如
claude-opus-4-6被归一化映射到claude-opus-4-8(见 models.ts),这印证了仓库在持续演进默认/推荐 Opus 系列模型;相关解析逻辑的测试位于 models.test.ts 与 models-pi.test.ts; - OAuth token 刷新改进:与 packages/shared/src/auth 目录下的 token 管理(如 oauth-flow-store.ts)相关联,确保长时间会话中凭证不过期导致中断;
- API 源的多请求头认证支持:面向自定义 API 源(Source)的能力增强,在 packages/shared/src/sources 目录的认证相关代码中有对应支撑。
原生数据表格:datatable、spreadsheet 与 transform_data
三种表格形态的取舍
v0.4.2 引入了两个新的 Markdown 块级组件,配合既有的 Markdown 表格,Craft Agents 现在提供三种展示结构化数据的方式。仓库内的>{ "title": "Recent Transactions", "columns": [ { "key": "date", "label": "Date", "type": "date" }, { "key": "amount", "label": "Amount", "type": "currency" }, { "key": "status", "label": "Status", "type": "badge" } ], "rows": [ { "date": "2025-01-15", "amount": 250.00, "status": "Completed" } ] }
仅 rows 格式:
{ "rows": [ { "date": "2025-01-15", "amount": 250.00, "status": "Completed" } ] }裸数组格式:
[ { "date": "2025-01-15", "amount": 250.00, "status": "Completed" } ]合并语义:使用"src"时,Markdown 块内内联的columns与title优先于文件中的同名值——这样可以在块里定义列类型,同时从文件读取行数据。
引用输出文件
transform_data成功后会返回输出文件的绝对路径,直接把这个路径作为"src"值填入块中,不要手工拼接相对路径:
```datatable { "src": "/absolute/path/returned/by/transform_data", "title": "Recent Transactions", "columns": [ { "key": "date", "label": "Date", "type": "date" }, { "key": "amount", "label": "Amount", "type": "currency" }, { "key": "status", "label": "Status", "type": "badge" } ] } ```完整工作流示例
以 "展示上月全部 Stripe 交易" 为例:
Step 1:通过 MCP 工具调用 Stripe API,得到大型 JSON 响应,保存为long_responses/stripe_result.txt;
Step 2:调用transform_data抽取并结构化数据:
transform_data({ language: "python3", script: "import json, sys\nwith open(sys.argv[1]) as f:\n data = json.load(f)\nrows = [{\n 'id': t['id'],\n 'date': t['created'],\n 'amount': t['amount'] / 100,\n 'status': t['status'].title(),\n 'customer': t.get('customer_email', 'N/A')\n} for t in data.get('data', data.get('transactions', []))]\nwith open(sys.argv[-1], 'w') as f:\n json.dump({'rows': rows}, f)", inputFiles: ["long_responses/stripe_result.txt"], outputFile: "transactions.json" })Step 3:使用transform_data返回的绝对路径输出 datatable 块(示例见上文 "引用输出文件" 小节,列改为id/date/amount/status/customer)。
常用模式速查
JSON API 响应 → Datatable(Python):
import json, sys with open(sys.argv[1]) as f: data = json.load(f) # 兼容常见 API 响应结构 items = data.get('data', data.get('items', data.get('results', data))) if not isinstance(items, list): items = [items] rows = [{ 'id': item['id'], 'name': item.get('name', ''), 'created': item.get('created_at', ''), } for item in items] with open(sys.argv[-1], 'w') as f: json.dump({'rows': rows}, f)CSV/TSV → Spreadsheet(Python):
import csv, json, sys with open(sys.argv[1]) as f: reader = csv.DictReader(f) rows = list(reader) # 从 CSV 表头自动推断列 columns = [{'key': k, 'label': k.replace('_', ' ').title(), 'type': 'text'} for k in rows[0].keys()] if rows else [] with open(sys.argv[-1], 'w') as f: json.dump({'columns': columns, 'rows': rows}, f)多源连接(Join):sys.argv[1:-1]传多个输入文件,例如同时读取long_responses/users.txt与long_responses/orders.txt,按user_id关联后输出orders-with-customers.json。
过滤与聚合:在脚本内用defaultdict按类别分组求和,先聚合再展示,避免把原始明细行全部灌入上下文。
Node.js 替代写法:无 Python 环境时可用process.argv[2]读输入、process.argv.at(-1)写输出,配合fs.readFileSync/fs.writeFileSync。
安全与约束(源码级验证)
transform_data的实现位于 transform-data.ts,源码明确体现了版本说明所称的 "processing large datasets via scripts" 背后的安全边界:
- 隔离子进程:脚本在子进程中运行,环境变量剥离了 API Key 等敏感信息(
createScriptRuntimeEnv,见 sandbox-env.ts); - 30 秒超时:源码中定义了
TRANSFORM_DATA_TIMEOUT_MS = 30_000(transform-data.ts),超时脚本会被终止; - 路径沙箱:
outputFile必须落在会话data/目录内(isPathWithinDirectoryForCreation),输入文件必须位于会话目录或 skills 目录内(isPathWithinDirectory),../之类的路径穿越会被拦截(transform-data.ts),底层实现见 path-security.ts; - 禁止网络访问:脚本应保持本地计算,数据获取应通过 MCP 工具完成;
- 被屏蔽的环境变量:
ANTHROPIC_API_KEY、CLAUDE_CODE_OAUTH_TOKEN、AWS_*、GITHUB_TOKEN、OPENAI_API_KEY、GOOGLE_API_KEY、STRIPE_SECRET_KEY、NPM_TOKEN。
渲染层实现
UI 侧,Markdown.tsx 在 Markdown 解析时识别datatable与spreadsheet代码块,并分别包装为MarkdownDatatableBlock与MarkdownSpreadsheetBlock(见 Markdown.tsx),这是 v0.4.2 "native data tables" 的渲染落地。
Mermaid 图表引擎重构:Dagre 到 ELK
更新要点
v0.4.2 对图表渲染引擎做了整体替换:
- 用ELK(Eclipse Layout Kernel)布局引擎替换 Dagre,图表布局质量更好;
- 改进边的路由、捆绑与逼近方向(edge routing、bundling、approach directions);
- 全图类型支持多行标签;
- 新的形状系统:圆形、菱形、六边形、体育场形(stadium)、状态形等;
- ASCII 渲染改进,支持ANSI 颜色;
- 更好的子图方向覆盖(subgraph direction override)与断连图处理。
依赖层面,版本说明明确 "Added elkjs for diagram layouts",仓库的锁文件 bun.lock 中同样可以检索到elkjs相关条目,证实该依赖确实随本版本引入。
语法参考(结合仓库指南)
仓库内的 mermaid.md 是一份完整的 Mermaid 语法参考,以下是 v0.4.2 引擎重构后依然生效的核心语法与最佳实践。
流程图节点形状:
| 语法 | 形状 |
|---|---|
A[text] | 矩形 |
A(text) | 圆角矩形 |
A{text} | 菱形(决策) |
A([text]) | 体育场形 |
A((text)) | 圆形 |
A[[text]] | 子程序 |
A[(text)] | 圆柱(数据库) |
A{{text}} | 六边形 |
A>text] | 非对称旗形 |
A[/text\] | 梯形 |
A[\text/] | 梯形(反向) |
A(((text))) | 双圆 |
箭头类型:
| 语法 | 样式 |
|---|---|
--> | 实线箭头 |
--- | 实线(无箭头) |
-.-> | 虚线箭头 |
-.- | 虚线 |
==> | 粗箭头 |
=== | 粗线 |
<--> | 双向实线 |
<-.-> | 双向虚线 |
<==> | 双向粗线 |
带标签的边与子图:
子图方向覆盖(对应版本说明 "subgraph direction overrides" 改进):
状态图、时序图、类图、ER 图与 XY 图表:完整语法均可参照 mermaid.md,其中:
- 状态图使用
stateDiagram-v2头,支持状态描述、复合状态与direction LR覆盖; - 时序图使用
sequenceDiagram头,支持->>/-->>/-)等消息类型、激活(+/-)、Note、loop/alt/opt/par块; - 类图使用
classDiagram头,支持可见性修饰符(+/-/#/~)、关系符号与基数; - ER 图使用
erDiagram头,支持PK/FK/UK属性标记与基数记法; - XY 图使用
xychart-beta(或xychart-beta horizontal),支持title、x-axis、y-axis、bar、line指令,如:
最佳实践
- 优先横向布局:流程图用
graph LR而非graph TD;状态图加direction LR;只有组织架构图、继承关系等层级性场景才用TD/BT; - 一图一主题:复杂图表拆分为多个独立图;
- 使用描述性标签:节点文本应说明语义(如
A[User submits form]); - 复杂图表先用
mermaid_validate校验:会话工具 mermaid-validate.ts 提供mermaid_validate({ code: "..." })语法校验,避免输出错误图表; - 标签含特殊字符时加引号:
A["Label with (parentheses)"]; - 常见错误排查:流程图必须带方向(
graph TD而不是裸graph)、括号必须闭合、箭头语法要对照上表。
Codex 集成修复:打包与运行稳定性
v0.4.2 在 Codex 集成上做了一批修复,集中在打包后的运行环境:
- 修复打包应用中 Codex 二进制路径解析:开发环境下路径可用,但打包后相对路径会失效,本版本修复了该解析逻辑;
- Windows 上把 codex.exe 移到 extraResources:避免运行时出现 EBUSY 错误(文件占用冲突);
- Codex 会话的技能内容注入:不再依赖原生发现机制(native discovery),改由显式注入技能内容;
- OAuth 会话的静默失败与标题生成修复;
- 构建验证:在 SDK 打包阶段检查 Codex 二进制是否存在。
这类修复与 Electron 打包流程(electron-builder.yml)以及构建后处理脚本 afterPack.cjs 密切相关——extraResources正是 electron-builder 用于携带运行时资源的标准机制。
Bug 修复、依赖升级与构建基础设施
Bug 修复清单解读
| 修复项 | 意义 |
|---|---|
OAuth 浏览器启动 ENOENT,改用shell.openExternal | 解决部分平台上 OAuth 授权页无法拉起的问题;当前 Electron 主进程多处使用shell.openExternal(如 window-manager.ts、platform.ts),印证了这一修复方向 |
| 工作区切换时主题不更新 | 修复了主题状态未跟随工作区刷新的问题,主题解析与迁移逻辑见 packages/shared/src/colors 与 theme.ts |
| Dock 角标与窗口图标路径在打包应用中的问题 | 与 electron-builder.yml 的图标资源配置相关 |
| Sentry 只上报 console 错误而非警告 | 降低告警噪声,Sentry 初始化位于渲染层入口 main.tsx 附近 |
| PowerShell 安装脚本改用 YAML 清单 | 安装脚本 install-app.ps1 的清单格式调整 |
| 渲染进程在浏览器包中误导入 Node.js fs 模块 | 修复 webui 等浏览器环境的打包兼容问题,相关 shim 见 webui/src/shims |
| 会话持久化中的元数据竞态条件 | 会话存储层(packages/shared/src/sessions/storage.ts)的写入顺序问题修复 |
| 大响应处理整合 | 统一大响应处理路径,相关基础设施见 large-response.ts |
依赖升级
| 依赖 | 版本变化 | 说明 |
|---|---|---|
| claude-agent-sdk | ^0.2.37 | Agent SDK 升级,同时 "Unified title generation through agent SDK infrastructure" 说明标题生成统一走 SDK 通道 |
| electron-updater | ^6.8.0 | 自动更新能力升级 |
| elkjs | 新增 | 图表布局引擎,配合 Mermaid 重构 |
仓库当前 packages/shared/package.json 中的@anthropic-ai/claude-agent-sdk版本已演进到0.3.197,可见 SDK 依赖随版本持续升级。
构建与基础设施调整
- 默认工作区源配置:提供默认的 workspace sources 配置,降低新用户上手成本;
- 统一标题生成:通过 agent SDK 基础设施完成,移除重复实现;
- 移除废弃的 PlanningAdvisor:清理旧规划组件;
- 移除 headless 模式:整合进主 Agent 流程,减少双路径维护成本。
总结
v0.4.2 是 Craft Agents 在"多提供商 + 富展示 + 引擎自研"方向上迈出的一大步:GitHub Copilot 的 OAuth 接入让用户多了一个可切换的 LLM 选择;datatable/spreadsheet/transform_data构成了从大型数据到可交互表格的完整链路(安全边界由 transform-data.ts 的路径沙箱与子进程隔离保障);Mermaid 引擎从 Dagre 迁移到 ELK 提升了图表布局质量,配合 mermaid.md 的语法参考可直接上手;而 Codex 集成与各类 Bug 修复则夯实了打包与运行稳定性。对照 0.4.3.md 及后续发布说明,可以看到这些能力如何在后继版本中持续演进。
对于想要深入验证本文内容的读者,建议从以下入口入手:
- 数据表格完整指南:data-tables.md
- Mermaid 语法参考:mermaid.md
- transform_data 实现:transform-data.ts
- 表格渲染组件:Markdown.tsx
- 提供商连接逻辑:connection-setup-logic.ts
- 模型映射:models.ts
【免费下载链接】craft-agents-oss项目地址: https://gitcode.com/GitHub_Trending/cr/craft-agents-oss
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考