feat: /goal命令能力支持,参考codex实现 (#1261)

* feat: /goal命令能力支持,参考codex实现

* fix: 修复promp和提示词不一致的问题

* fix: 修复 goal 功能多项 AI 审查问题

- prompt 中 update 行为描述与运行时不一致(no-op → error)
- src/commands/goal/ 使用相对路径导入,改为 src/* 别名
- /goal 命令标记 bridgeSafe 但含交互式对话框,改为 false
- useGoalContinuation 中 origin 使用 as unknown as string 强转,改为直接传字符串
- ResumeConversation 路径缺少 goal hydration,补齐恢复逻辑
- onCancel 在非查询状态下误暂停 goal,加 queryGuard 守卫
- resumeGoal 允许从终态恢复,收紧为仅允许 paused 状态
- buildGoalContextBlock 生成畸形 XML 属性,改为合法 budget 属性

* fix: 修复剩余AI审查的问题

* fix: 防止goal状态丢失

* fix: 修复Biome规范错误问题

* fix: 修复部分情况下goal无法启动的问题

* fix: 增加断网后状态默认设置为PAUSE机制、完成暂停-恢复状态切换,且正常进行前端渲染。设置达到max turn后处理逻辑。

* fix: 修复终端异常断开情况,resume续跑;修复用户消息排队信息被goal输出信息覆盖的问题。

* fix: apply biome formatting to pass CI lint check

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: skip slash command echo in setUserInputOnProcessing to prevent UI flash

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: moyu <moyu@kingsoft.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
moy16
2026-06-14 10:44:10 +08:00
committed by GitHub
parent 5bfe6fa590
commit 3e3e1de81b
28 changed files with 2248 additions and 30 deletions

View File

@@ -312,6 +312,7 @@ type ResumeLoadResult = {
prNumber?: number
prUrl?: string
prRepository?: string
goal?: import('../types/logs.js').GoalState
}
/**
@@ -471,6 +472,18 @@ export async function processResumedConversation(
opts.forkSession ? { ...result, worktreeSession: undefined } : result,
)
if (feature('GOAL') && result.goal) {
const { hydrateGoalFromTranscript } =
// eslint-disable-next-line @typescript-eslint/no-require-imports
require('../services/goal/goalStorage.js') as typeof import('../services/goal/goalStorage.js')
const goalsMap = new Map<UUID, import('../types/logs.js').GoalState>()
const sid = (opts.sessionIdOverride ??
result.sessionId ??
getSessionId()) as UUID
goalsMap.set(sid, result.goal)
hydrateGoalFromTranscript(goalsMap, sid)
}
if (!opts.forkSession) {
// Cd back into the worktree the session was in when it last exited.
// Done after restoreSessionMetadata (which caches the worktree state