【BUG反馈】任务执行了快15小时了,现在一直卡在最后一步 #5339
Replies: 3 comments
|
如何解决 |
|
目前来看,deepseek harness在面对复杂任务总是会卡死,workbuddy则正常执行 |
|
这个案例我觉得很典型,也正好和最近我在 DSH 上做的一些实验有点关联。 我现在越来越倾向于一个比较简单的判断: 不要让模型去负责那些 Harness 本身可以确定的事情。 比如你这个磁盘清理插件的提示词,里面提前规定了非常多东西:目录结构、文件名、错误码、默认参数、回滚方式、Windows 权限处理、测试结构、发布流程……这些当然可以让模型更容易一次性写出“看起来完整”的项目,但代价是 Prompt 本身越来越像一份完整的工程设计文档。 而且里面有一部分其实不太适合依赖模型自己判断。 比如:
这些事情如果 Harness 能从真实运行过程里确认,就没必要再写进一大段规则,让模型自己记住。 最近刚好做了一轮很小的 Runtime 实验,方向也是这个:让 DSH 的 Event 保留真实发生过的事情,再从这些事实得到一些很小的判断,比如“这一步有没有真正产生进展”。 这样会出现一个比较简单的分工: 比如工具返回: 不一定就意味着: 反过来: 也不一定意味着: 所以最近实验里比较强调:
这也可能是你的插件后面一个值得尝试的方向:Prompt 可以尽量只描述真正需要模型参与的部分,而把那些可以由 Harness 确定的事实留给 Runtime。 我做的项目比较小,主要就是在探索这一层: https://github.com/goatliamia/dsh-runtime-capabilities 现在还在实验阶段,不过你的这个场景我觉得挺适合拿来试一下。尤其是这种带真实文件操作、回滚、权限和副作用的工具,比纯代码生成更容易看出 Runtime 到底有没有价值。 很想看看你后面实际做出来以后,这类能力边界会怎么长出来。 |
Uh oh!
There was an error while loading. Please reload this page.
昨天晚上我使用deepseekharness开发,过去24小时了,现在任务一直在执行最后一步,但是api_无任何变化,

提示词如下
【角色设定】
你现在是一位资深的 DeepSeek Harness 插件开发专家,精通 Cordis 框架、defineTool 工具注册机制、Schemastery Schema 校验和 Windows 文件系统操作。请帮我编写一个名为 dsh-smart-disk-cleaner 的 Harness 原生工具插件,目标是发布为可上架的正式 Bundle。
【设计哲学——安全第一,清理第二,清理可还原】
本插件的核心原则是:任何破坏性操作都不可自动执行,必须经过用户确认;所有已执行的操作都必须可回滚。
参考项目 https://github.com/vudsen/ai-disk-cleaner 的三阶段架构:
扫描阶段:快速遍历目录,将文件树加载到内存
分析阶段:将扫描结果暴露为工具供 Agent(大模型)调用,由 LLM 智能识别垃圾文件并标记
执行阶段:结合 LLM 分析结果,由用户确认后执行清理或迁移操作
【插件类型判断】
本插件属于 Tool 类型(纯 Host 端后台能力),不需要 Client 端 UI。Agent 在对话中调用工具完成扫描、分析、清理、迁移等操作,结果以文本/表格形式返回对话界面。
【项目结构规范】
请严格按照以下目录结构生成代码:
文本
编辑
dsh-smart-disk-cleaner/
├── src/
│ ├── index.ts # 插件入口,导出 name / inject / Config / apply
│ ├── scanner.ts # 目录扫描与空间分析模块
│ ├── quarantine.ts # 隔离区管理模块(移入/恢复/列表)
│ ├── migrator.ts # 符号链接迁移模块
│ ├── safety.ts # 安全校验模块(黑名单/权限检查)
│ ├── logger.ts # 审计日志模块(基于 ctx.logger 封装)
│ └── types.ts # 所有 TypeScript 类型/接口定义
├── tests/
│ ├── scanner.test.ts
│ ├── safety.test.ts
│ └── quarantine.test.ts
├── package.json
├── tsconfig.json
├── tsdown.config.ts
├── cordis.patch.yml # Bundle 配置层文件(发布用)
├── cordis.yml # 本地开发调试用(--patch 加载)
├── .gitignore
├── LICENSE
├── README.md
└── CHANGELOG.md
【package.json 规范】
必须包含以下关键字段:
json
编辑
{
"name": "dsh-smart-disk-cleaner",
"version": "0.1.0",
"type": "module",
"main": "lib/index.js",
"files": ["lib", "cordis.patch.yml"],
"scripts": {
"build": "tsdown",
"prepare": "tsdown",
"test": "vitest run",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"proper-lockfile": "^4.1.2"
},
"devDependencies": {
"@deepseek-ai/cordis": "workspace:^",
"@deepseek-ai/dsh-tools": "workspace:^",
"@deepseek-ai/schemastery": "workspace:^",
"typescript": "^5.0.0",
"tsdown": "latest",
"vitest": "latest"
},
"dsh": {
"bundle": {
"patch": "./cordis.patch.yml"
}
}
}
【tsconfig.json 规范】
json
编辑
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "lib",
"rootDir": "src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"isolatedModules": true
},
"include": ["src"],
"exclude": ["node_modules", "lib", "tests"]
}
【tsdown.config.ts 规范】
typescript
编辑
import { defineConfig } from 'tsdown'
export default defineConfig({
entry: ['src/index.ts'],
format: 'esm',
dts: true,
sourcemap: true,
clean: true,
external: [
'@deepseek-ai/cordis',
'@deepseek-ai/dsh-tools',
'@deepseek-ai/schemastery',
],
})
【.gitignore 规范】
文本
编辑
node_modules/
lib/
*.tsbuildinfo
.dsh/
.DS_Store
*.log
【Config 配置规范(Schemastery Schema)】
在 src/index.ts 中,使用 @deepseek-ai/schemastery 定义插件配置:
typescript
编辑
import Schema from '@deepseek-ai/schemastery'
export interface Config {
blacklist: string[]
excludeDirs: string[]
quarantineRetentionHours: number
maxScanResults: number
migrateSpaceBuffer: number
}
export const Config = Schema.object({
blacklist: Schema.array(Schema.string()).default([
'C:\Windows',
'C:\Program Files',
'C:\Program Files (x86)',
'C:\ProgramData',
'C:\$Recycle.Bin',
'C:\System Volume Information'
]),
excludeDirs: Schema.array(Schema.string()).default([
'node_modules', '.git', 'pycache', '.venv'
]),
quarantineRetentionHours: Schema.number().default(72),
maxScanResults: Schema.number().default(50),
migrateSpaceBuffer: Schema.number().default(1.1),
})
用户可在 cordis.patch.yml 的 config: 字段覆盖任意默认值。
【插件入口规范】
src/index.ts 必须严格遵循以下结构:
typescript
编辑
import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'
import Schema from '@deepseek-ai/schemastery'
export const name = 'dsh-smart-disk-cleaner'
export const inject = ['tools']
// Config 接口 + Schema 定义(如上)
export function apply(ctx: Context, config: Config) {
// 1. 注册工具
ctx.tools.register(defineTool({ /* ... */ }))
// 2. 用 ctx.effect() 管理生命周期资源
ctx.effect(() => {
// 启动隔离区过期清理定时器等
const timer = setInterval(() => { /* 清理过期隔离文件 */ }, 3600000)
return () => {
clearInterval(timer)
ctx.logger.info('[smart-disk-cleaner] 定时器已清理')
}
})
}
【核心工作流程——对齐 AIDiskCleaner 的三阶段架构】
阶段一:扫描(Scan)
插件提供 scan 动作,递归遍历指定目录,返回占用空间最大的前 N 个文件/文件夹(N 从 config.maxScanResults 读取,默认 50)。
内存保护:扫描过程中设置内存上限(如最多缓存 10 万个文件条目),超出时停止遍历并返回已扫描结果 + 警告信息,防止 OOM。
扫描结果以 JSON 格式返回,每个结果包含:
absolutePath:文件的绝对路径
size:文件大小(字节)
lastModified:最后修改时间(ISO 8601 格式)
isDirectory:是否为目录
depth:相对于扫描根目录的深度
阶段二:AI 智能风险分级(由 Agent 完成,非插件代码)
插件的 scan 动作只负责返回扫描结果。风险分级由 Harness Agent(大模型)根据扫描到的文件路径、文件名、扩展名等信息,在对话中自动分析并分为三类:
🟢 安全清理(如:.tmp、.log、.cache、旧安装包、浏览器缓存)
🟡 建议迁移(如:Docker 镜像、WSL 虚拟磁盘、本地大模型文件、开发工具缓存)
🔴 高危保留(如:.exe、.dll、.sys、注册表文件、当前运行程序的配置文件)
Agent 将分析结果以 Markdown 表格形式返回给用户,等待用户确认。
阶段三:执行操作(用户确认后)
根据 Agent 的分类结果和用户确认,插件执行以下操作:
功能一:安全删除(带隔离区机制)
delete 动作:不直接删除文件,而是移动到隔离区目录(路径使用 path.join(os.homedir(), '.dsh', 'quarantine') 解析,确保 Windows 兼容性),生成 QuarantineRecord 写入 quarantine-manifest.json
隔离区文件保留 config.quarantineRetentionHours 小时,过期后标记为可清理
restore 动作:根据 QuarantineRecord 将文件移回原始路径
quarantine-list 动作:返回当前隔离区所有记录,包含原始路径、移入时间、剩余保留时长
幂等性:对已存在于隔离区的文件重复执行 delete,应跳过并返回提示,不报错
功能二:无感迁移(符号链接技术)
migrate 动作:针对用户确认"建议迁移"的文件/目录
校验目标磁盘可用空间 ≥ 源文件总大小 × config.migrateSpaceBuffer
完整复制文件/目录到目标路径
校验完整性:对比源和目标的文件数量与总大小
删除原位置文件
在原位置创建符号链接(fs.symlink)指向新位置。必须根据 isDirectory 字段设置 type 参数:目录用 'dir',文件用 'file'
写入 MigrationRecord 到 migration-manifest.json
Windows 符号链接权限处理:
优先尝试创建符号链接(fs.symlink)
如果因权限不足(EPERM)失败,自动降级为创建 Junction(fs.symlink(target, path, 'junction')),Junction 不需要管理员权限
如果 Junction 也失败(如跨盘符文件场景),则放弃迁移并返回错误 ERR_SYMLINK_FAILED,提示用户以管理员身份运行或开启开发者模式
undo-migrate 动作:根据 MigrationRecord 反向操作——删除符号链接/Junction、将文件复制回原位、删除目标位置副本
并发安全:执行迁移前获取文件锁(使用 proper-lockfile),防止并发操作冲突
任一步骤失败则中止并回滚已执行步骤,确保不会出现"原文件已删、新文件未到位"的中间状态
功能三:操作审计日志
基于 DSH 内置的 ctx.logger 输出到控制台
同时写入持久化日志文件(路径:path.join(os.homedir(), '.dsh', 'logs', 'smart-disk-cleaner.log'))
格式:[ISO8601时间戳] [级别] [模块名] 消息内容
级别:INFO、WARN、ERROR、ROLLBACK
日志文件按天轮转,保留最近 30 天
【工具注册规范】
使用 defineTool 注册一个名为 smart_disk_cleaner 的工具,参数如下:
表格
参数 必填条件 JSON Schema 说明
action 始终必填 { type: 'string', enum: ['scan', 'delete', 'migrate', 'restore', 'quarantine-list', 'undo-migrate'] } 执行的操作类型
targetPath scan/delete/migrate { type: 'string' } 目标路径
destPath migrate/restore { type: 'string' } 迁移/恢复目标路径
fileList delete/migrate { type: 'array', items: { type: 'string' } } 用户确认要操作的文件路径列表
output 必须包含 render 函数:
typescript
编辑
output: {
schema: { type: 'string' },
render: (_args, value) => [{ type: 'text', text: value }],
}
【安全校验模块(safety.ts)】
黑名单从 config.blacklist 读取,每次执行 delete 或 migrate 前,对 fileList 中的每个路径逐一校验
路径比较使用 path.resolve() 标准化后再做前缀匹配,防止 C:\Windows.. 等绕过
命中黑名单则拒绝该条并返回结构化错误
校验用户当前进程是否有目标路径的读写权限,无权限则返回结构化错误
扫描时跳过黑名单路径,遇到无权限目录记录警告日志并跳过,不中断扫描
【错误码规范】
所有错误必须返回结构化对象 { error: true, code: string, message: string },错误码定义如下:
表格
错误码 含义
ERR_BLACKLIST_HIT 路径命中安全黑名单
ERR_PERMISSION_DENIED 无权限操作目标路径
ERR_PATH_NOT_FOUND 目标路径不存在
ERR_INSUFFICIENT_SPACE 目标磁盘空间不足
ERR_INTEGRITY_MISMATCH 迁移后文件完整性校验失败
ERR_SYMLINK_FAILED 符号链接创建失败(含权限不足)
ERR_LOCK_CONFLICT 文件锁冲突,操作被拒绝
ERR_ALREADY_QUARANTINED 文件已在隔离区中(幂等跳过)
ERR_QUARANTINE_EXPIRED 隔离区文件已过期
ERR_RESTORE_PATH_EXISTS 恢复时原路径已有同名文件
ERR_SCAN_MEMORY_LIMIT 扫描文件数超过内存保护上限
【类型系统规范】
在 src/types.ts 中必须定义以下接口,所有模块共享:
ScannedFile:{ absolutePath: string; size: number; lastModified: string; isDirectory: boolean; depth: number }
RiskLevel:'safe' | 'suggest-migrate' | 'dangerous'
QuarantineRecord:{ originalPath: string; quarantinedPath: string; movedAt: string; expiresAt: string; fileSize: number }
MigrationRecord:{ sourcePath: string; destPath: string; symlinkPath: string; symlinkType: 'file' | 'dir' | 'junction'; migratedAt: string; fileSize: number }
OperationLog:{ timestamp: string; action: string; targetPath: string; status: 'success' | 'failed' | 'rolled-back'; detail?: string }
【cordis.patch.yml 规范(发布用)】
yaml
编辑
insert:
name: dsh-smart-disk-cleaner
config:
quarantineRetentionHours: 72
maxScanResults: 50
【cordis.yml 规范(本地开发调试用)】
yaml
编辑
name: '/absolute/path/to/dsh-smart-disk-cleaner/src/index.ts'
config:
quarantineRetentionHours: 72
maxScanResults: 50
【测试规范】
在 tests/ 目录下使用 vitest 编写单元测试:
safety.test.ts:验证黑名单拦截(含路径绕过防护)、权限校验逻辑
quarantine.test.ts:验证移入隔离区、恢复、幂等性、过期清理
scanner.test.ts:验证扫描结果排序、排除规则生效、内存保护上限
在临时目录下构造测试文件,测试结束后自动清理
【README.md 规范(上架必备)】
README 是社区市场展示插件信息的主要来源,必须包含以下章节:
项目名称 + 一句话描述:如 dsh-smart-disk-cleaner — AI 驱动的磁盘智能清理 Harness 插件
功能特性:列出核心功能点(扫描、AI 分级、隔离区、符号链接迁移、审计日志)
安装方法:
bash
编辑
dsh plugin add dsh-smart-disk-cleaner
配置说明:列出 cordis.patch.yml 中所有可配置项及默认值
使用示例:给出 2-3 个典型对话场景(如"帮我扫描 C 盘"、"把 Docker 镜像迁移到 D 盘"、"恢复刚才删除的文件")
安全声明:明确说明黑名单机制、隔离区可还原设计、不会自动执行破坏性操作
Windows 符号链接权限说明:说明 Junction 自动降级策略及管理员模式提示
开发/贡献指南:pnpm install && pnpm build && pnpm test
License:MIT
【CHANGELOG.md 规范】
遵循 Keep a Changelog 格式,初始版本标记为 v0.1.0:
markdown
编辑
Changelog
All notable changes to this project will be documented in this file.
[0.1.0] - 2026-09-01
Added
【LICENSE 规范】
使用 MIT 许可证,年份为 2026,版权持有者为插件作者。
【上架发布流程】
插件开发完成后,按以下步骤发布到 npm 并上架社区市场:
构建验证:
bash
编辑
pnpm install && pnpm build && pnpm test
验证打包内容:
bash
编辑
pnpm pack --dry-run
确认 files 字段只包含 lib/ 和 cordis.patch.yml。
发布到 npm:
bash
编辑
pnpm login
pnpm publish --access public
发布后用户即可通过 dsh plugin add dsh-smart-disk-cleaner 安装。
推送到 GitHub 并添加 Topic:
必须添加 Topic:dsh-plugin(社区市场自动抓取的入口标签)
建议添加 Topic:deepseek-harness、disk-cleaner、windows
本地加载测试(发布前):
bash
编辑
pnpm dsh plugin --profile web add ./dsh-smart-disk-cleaner
pnpm dsh web --dump-config | grep smart-disk-cleaner
pnpm dsh web
社区市场自动收录:
完成 npm 发布 + GitHub Topic 打标后,dsh-market(dshmarketplace.dev)会通过 GitHub Actions 每 2 小时自动同步 dsh-plugin Topic 下的仓库,无需手动提交。
【交付要求】
先输出整体架构设计和模块依赖关系,说明各模块如何协作完成"扫描 → 分析 → 执行"三阶段流程
确认无误后,按上述目录结构提供完整的、可运行的源代码
提供构建与验证步骤:
pnpm install && pnpm build
pnpm dsh plugin --profile web add ./dsh-smart-disk-cleaner
pnpm dsh web --dump-config | grep smart-disk-cleaner
pnpm dsh web 启动后在对话中测试工具调用
提供发布步骤:pnpm pack 或 pnpm publish --access public
All reactions