@ai-setting/roy-agent-core 1.7.75 → 1.7.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/env/agent/agent-component.js +2 -2
- package/dist/env/agent/index.js +2 -2
- package/dist/env/event-source/event-source-handlers.js +9 -8
- package/dist/env/event-source/index.js +10 -9
- package/dist/env/index.js +16 -15
- package/dist/env/prompt/index.js +4 -3
- package/dist/env/prompt/prompts-index.d.ts +11 -9
- package/dist/env/task/backend/index.js +45 -1
- package/dist/env/task/backend/task-store-backend.d.ts +12 -0
- package/dist/env/task/backend/types.d.ts +19 -0
- package/dist/env/task/delegate/delegate-tool.js +4 -3
- package/dist/env/task/delegate/index.js +4 -3
- package/dist/env/task/hooks/contexts.d.ts +12 -1
- package/dist/env/task/hooks/task-hook-points.d.ts +8 -3
- package/dist/env/task/index.d.ts +1 -0
- package/dist/env/task/index.js +17 -7
- package/dist/env/task/mcp/index.js +6 -2
- package/dist/env/task/mcp/task-mcp-server.d.ts +1 -1
- package/dist/env/task/plugins/fake-user-message-helper.d.ts +10 -2
- package/dist/env/task/plugins/index.d.ts +1 -0
- package/dist/env/task/plugins/index.js +18 -6
- package/dist/env/task/plugins/lark-card-patch-notifier.js +1 -1
- package/dist/env/task/plugins/task-op-watermark-plugin.d.ts +112 -0
- package/dist/env/task/prompt/index.js +2 -1
- package/dist/env/task/prompt/task-discipline.d.ts +1 -1
- package/dist/env/task/storage/index.js +2 -2
- package/dist/env/task/storage/sqlite-task-store.d.ts +54 -0
- package/dist/env/task/task-component.d.ts +95 -0
- package/dist/env/task/tools/cancel-tool.d.ts +12 -4
- package/dist/env/task/tools/completion-copy.d.ts +92 -0
- package/dist/env/task/tools/index.d.ts +1 -0
- package/dist/env/task/tools/index.js +5 -2
- package/dist/env/task/tools/operation/operation-types.d.ts +13 -13
- package/dist/env/task/tools/pre-complete-tool.d.ts +32 -0
- package/dist/env/task/tools/task-types.d.ts +49 -17
- package/dist/env/task/types.d.ts +13 -1
- package/dist/env/workflow/plugins/index.js +2 -2
- package/dist/env/workflow/types/event.d.ts +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +26 -16
- package/dist/shared/@ai-setting/{roy-agent-core-n9q1encx.js → roy-agent-core-0v27y99n.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-60jbrfye.js → roy-agent-core-3gpygqcx.js} +30 -6
- package/dist/shared/@ai-setting/roy-agent-core-4rtg69cn.js +26 -0
- package/dist/shared/@ai-setting/{roy-agent-core-djpq6yb0.js → roy-agent-core-9vhq7fvv.js} +6 -2
- package/dist/shared/@ai-setting/{roy-agent-core-3e6gg17d.js → roy-agent-core-9vxh6f8h.js} +169 -30
- package/dist/shared/@ai-setting/{roy-agent-core-jg65qnwa.js → roy-agent-core-aa2j7bk9.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-29b6hc39.js → roy-agent-core-cmprygrp.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-snvh4s2p.js → roy-agent-core-ew6qb5yx.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-abqhkbn3.js → roy-agent-core-ezvpreqz.js} +23 -0
- package/dist/shared/@ai-setting/roy-agent-core-h21gngxf.js +247 -0
- package/dist/shared/@ai-setting/{roy-agent-core-p3zv1mx5.js → roy-agent-core-hd3n57zs.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-11shp00p.js → roy-agent-core-m46fe3x4.js} +21 -31
- package/dist/shared/@ai-setting/{roy-agent-core-ntq0gz7q.js → roy-agent-core-q813vafd.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-4gr3k7qg.js → roy-agent-core-rhtdspx6.js} +140 -29
- package/dist/shared/@ai-setting/{roy-agent-core-y7x2qzwc.js → roy-agent-core-rsn44n9y.js} +10 -6
- package/dist/shared/@ai-setting/{roy-agent-core-hnyk1by7.js → roy-agent-core-vffccgf6.js} +152 -33
- package/dist/shared/@ai-setting/{roy-agent-core-nmx9934r.js → roy-agent-core-w0qjeq2v.js} +1 -1
- package/package.json +1 -1
- package/dist/shared/@ai-setting/roy-agent-core-f77k3gqt.js +0 -71
package/dist/index.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export { cascadeStopSessionTree, type CascadeStopOptions, type CascadeStopResult
|
|
|
31
31
|
export { createMemoryAgentTools, } from "./env/memory/tools/memory-agent-tools";
|
|
32
32
|
export type { SearchSessionsParams, GetSessionParams, WriteMemoryParams, } from "./env/memory/tools/memory-agent-tools";
|
|
33
33
|
export { getBuiltInPrompt, getBuiltInPromptNames, } from "./env/prompt/prompts-index";
|
|
34
|
-
export { TaskComponent, SQLiteTaskStore, getDefaultTaskDbPath, } from "./env/task";
|
|
34
|
+
export { TaskComponent, SQLiteTaskStore, getDefaultTaskDbPath, TASK_COMPLETED_STATUS_WORD, TASK_CANCELLED_STATUS_WORD, TASK_ARCHIVED_STATUS_WORD, TASK_DELIVERABLE_RECORDED, } from "./env/task";
|
|
35
35
|
export type { Task, TaskOperation, TaskStatus, TaskPriority, ActionType, CreateTaskOptions, UpdateTaskOptions, ListTasksOptions, CreateOperationOptions, ListOperationsOptions, TaskConfig, } from "./env/task/types";
|
|
36
36
|
export { TaskTagPlugin, createAutoTaskPlugin, type AutoTaskPluginConfig, } from "./env/task/plugins";
|
|
37
37
|
export { TaskHookPoints, type TaskHookPoint, } from "./env/task/hooks";
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PromptComponent,
|
|
3
3
|
PromptStore
|
|
4
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
4
|
+
} from "./shared/@ai-setting/roy-agent-core-cmprygrp.js";
|
|
5
5
|
import {
|
|
6
6
|
LLMComponent,
|
|
7
7
|
LLMConfigSchema,
|
|
@@ -62,21 +62,21 @@ import {
|
|
|
62
62
|
BaseEnvironment,
|
|
63
63
|
generateDescendingId,
|
|
64
64
|
generateId
|
|
65
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
65
|
+
} from "./shared/@ai-setting/roy-agent-core-ew6qb5yx.js";
|
|
66
66
|
import {
|
|
67
67
|
TaskComponent
|
|
68
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
68
|
+
} from "./shared/@ai-setting/roy-agent-core-rhtdspx6.js";
|
|
69
69
|
import"./shared/@ai-setting/roy-agent-core-2akfd64z.js";
|
|
70
70
|
import"./shared/@ai-setting/roy-agent-core-jm136jzh.js";
|
|
71
|
-
import"./shared/@ai-setting/roy-agent-core-
|
|
71
|
+
import"./shared/@ai-setting/roy-agent-core-aa2j7bk9.js";
|
|
72
72
|
import"./shared/@ai-setting/roy-agent-core-fttgm52a.js";
|
|
73
|
-
import"./shared/@ai-setting/roy-agent-core-
|
|
73
|
+
import"./shared/@ai-setting/roy-agent-core-q813vafd.js";
|
|
74
74
|
import"./shared/@ai-setting/roy-agent-core-8gxth0eh.js";
|
|
75
|
-
import"./shared/@ai-setting/roy-agent-core-
|
|
75
|
+
import"./shared/@ai-setting/roy-agent-core-vffccgf6.js";
|
|
76
76
|
import"./shared/@ai-setting/roy-agent-core-p5cz9m8v.js";
|
|
77
77
|
import {
|
|
78
78
|
EventSourceComponent
|
|
79
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
79
|
+
} from "./shared/@ai-setting/roy-agent-core-0v27y99n.js";
|
|
80
80
|
import {
|
|
81
81
|
BountyIMInstance,
|
|
82
82
|
COMMAND_PREFIX,
|
|
@@ -108,7 +108,7 @@ import {
|
|
|
108
108
|
timerHandler,
|
|
109
109
|
translateCardActionToCommand,
|
|
110
110
|
writeFallbackModelList
|
|
111
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
111
|
+
} from "./shared/@ai-setting/roy-agent-core-3gpygqcx.js";
|
|
112
112
|
import {
|
|
113
113
|
BUILT_IN_EVENT_SOURCE_TYPES,
|
|
114
114
|
BUILT_IN_EVENT_SOURCE_TYPE_LIST,
|
|
@@ -132,7 +132,7 @@ import {
|
|
|
132
132
|
import {
|
|
133
133
|
TaskTagPlugin,
|
|
134
134
|
createAutoTaskPlugin
|
|
135
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
135
|
+
} from "./shared/@ai-setting/roy-agent-core-rsn44n9y.js";
|
|
136
136
|
import {
|
|
137
137
|
EventStoreImpl,
|
|
138
138
|
getSharedEventStore,
|
|
@@ -142,11 +142,11 @@ import {
|
|
|
142
142
|
import {
|
|
143
143
|
getBuiltInPrompt,
|
|
144
144
|
getBuiltInPromptNames
|
|
145
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
145
|
+
} from "./shared/@ai-setting/roy-agent-core-9vxh6f8h.js";
|
|
146
146
|
import {
|
|
147
147
|
SQLiteTaskStore,
|
|
148
148
|
getDefaultTaskDbPath
|
|
149
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
149
|
+
} from "./shared/@ai-setting/roy-agent-core-ezvpreqz.js";
|
|
150
150
|
import {
|
|
151
151
|
TaskHookPoints
|
|
152
152
|
} from "./shared/@ai-setting/roy-agent-core-1pg0fepg.js";
|
|
@@ -157,9 +157,15 @@ import {
|
|
|
157
157
|
TASK_DISCIPLINE_LIFECYCLE,
|
|
158
158
|
TASK_DISCIPLINE_OPERATION,
|
|
159
159
|
TASK_DISCIPLINE_PROMPT
|
|
160
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
161
|
-
import
|
|
162
|
-
|
|
160
|
+
} from "./shared/@ai-setting/roy-agent-core-m46fe3x4.js";
|
|
161
|
+
import {
|
|
162
|
+
TASK_ARCHIVED_STATUS_WORD,
|
|
163
|
+
TASK_CANCELLED_STATUS_WORD,
|
|
164
|
+
TASK_COMPLETED_STATUS_WORD,
|
|
165
|
+
TASK_DELIVERABLE_RECORDED
|
|
166
|
+
} from "./shared/@ai-setting/roy-agent-core-4rtg69cn.js";
|
|
167
|
+
import"./shared/@ai-setting/roy-agent-core-hd3n57zs.js";
|
|
168
|
+
import"./shared/@ai-setting/roy-agent-core-w0qjeq2v.js";
|
|
163
169
|
import {
|
|
164
170
|
WorkflowComponent
|
|
165
171
|
} from "./shared/@ai-setting/roy-agent-core-v87njmq7.js";
|
|
@@ -206,7 +212,7 @@ import"./shared/@ai-setting/roy-agent-core-jagkferh.js";
|
|
|
206
212
|
import {
|
|
207
213
|
AgentComponent,
|
|
208
214
|
AgentComponentConfigSchema
|
|
209
|
-
} from "./shared/@ai-setting/roy-agent-core-
|
|
215
|
+
} from "./shared/@ai-setting/roy-agent-core-9vhq7fvv.js";
|
|
210
216
|
import {
|
|
211
217
|
ToolComponent,
|
|
212
218
|
ToolRegistry,
|
|
@@ -221,7 +227,7 @@ import {
|
|
|
221
227
|
getXDGPath,
|
|
222
228
|
getXDGPaths
|
|
223
229
|
} from "./shared/@ai-setting/roy-agent-core-qxnbvgwe.js";
|
|
224
|
-
import"./shared/@ai-setting/roy-agent-core-
|
|
230
|
+
import"./shared/@ai-setting/roy-agent-core-h21gngxf.js";
|
|
225
231
|
import"./shared/@ai-setting/roy-agent-core-0snm5hc5.js";
|
|
226
232
|
import {
|
|
227
233
|
buildOpencodeHeaders,
|
|
@@ -677,6 +683,10 @@ export {
|
|
|
677
683
|
TASK_DISCIPLINE_LIFECYCLE,
|
|
678
684
|
TASK_DISCIPLINE_GOALS,
|
|
679
685
|
TASK_DISCIPLINE_COMPLETE,
|
|
686
|
+
TASK_DELIVERABLE_RECORDED,
|
|
687
|
+
TASK_COMPLETED_STATUS_WORD,
|
|
688
|
+
TASK_CANCELLED_STATUS_WORD,
|
|
689
|
+
TASK_ARCHIVED_STATUS_WORD,
|
|
680
690
|
SpanStatus,
|
|
681
691
|
SpanKind,
|
|
682
692
|
SkillComponent,
|
|
@@ -10,17 +10,17 @@ import {
|
|
|
10
10
|
createPerTaskGroupChatPlugin,
|
|
11
11
|
extractPerTaskChatId,
|
|
12
12
|
extractPerTaskChatName
|
|
13
|
-
} from "./roy-agent-core-
|
|
13
|
+
} from "./roy-agent-core-rsn44n9y.js";
|
|
14
14
|
import {
|
|
15
15
|
getSharedEventStore
|
|
16
16
|
} from "./roy-agent-core-na18zwj0.js";
|
|
17
17
|
import {
|
|
18
18
|
createLarkCliWorkflowNotifyHook
|
|
19
|
-
} from "./roy-agent-core-
|
|
19
|
+
} from "./roy-agent-core-hd3n57zs.js";
|
|
20
20
|
import {
|
|
21
21
|
LarkCardPatchNotifier,
|
|
22
22
|
buildTaskCard
|
|
23
|
-
} from "./roy-agent-core-
|
|
23
|
+
} from "./roy-agent-core-w0qjeq2v.js";
|
|
24
24
|
import {
|
|
25
25
|
notifyReactFailure
|
|
26
26
|
} from "./roy-agent-core-6cy43nss.js";
|
|
@@ -3327,6 +3327,32 @@ function renderRuleNoticeSection(ruleNotice, headline) {
|
|
|
3327
3327
|
return `❌ **回执未送达**(原因:${ruleNotice.error ?? "unknown"})
|
|
3328
3328
|
` + `→ 用户目前**还不知道**「${headline}」这件事,必须由你在回复里讲清楚,` + `并且不要假装系统已经通知过。`;
|
|
3329
3329
|
}
|
|
3330
|
+
function renderActionSection(notifyType, taskId, scopeWord) {
|
|
3331
|
+
const completeCall = taskId !== "?" ? `task_complete(task_id=${taskId})` : `task_complete(task_id=<用 task_search 找回的任务号>)`;
|
|
3332
|
+
if (notifyType === "task.background.completed") {
|
|
3333
|
+
return `**第一步 —— 验收(⚠️ 不可跳过)**:Task #${taskId} 的最终验收由**你**(default agent)负责 —— sub-agent 只负责干完活并调 task_pre_complete 提交待验证(status=to_validate),**判定权在你**(Task #5073 两阶段验收)。
|
|
3334
|
+
1. \`task_get(task_id=${taskId})\` **核对实际产出**:读 goal / delivery / 操作记录链(交付物在 \`context.deliverable_storage_path\` 和 operation 的 Deliverable 行里),再对照真实产出(文件是否存在、测试是否通过、review 结论是什么)。⚠️ **不接受 sub-agent 的自述作为验收依据** —— 它说"做完了"不算,产出在才算。
|
|
3335
|
+
2. **逐条对照 goals 的编号子项**(文件断言 / 进程断言 / 测试断言 / 状态断言),一条一条核。
|
|
3336
|
+
3. 全部达成 → **必须实际调用** \`${completeCall}\` 把任务落终态(completed)。
|
|
3337
|
+
⚠️ **只回消息不算完成** —— 任务会一直挂在 \`to_validate\`,下游(任务卡片 / goal 检查 / 进度统计)都读不到最终状态。
|
|
3338
|
+
⚠️ 本工具**不带**交付物参数(交付物通道 = task_pre_complete)—— 若发现交付物缺失,重新委托补做,不要在这一步补传。
|
|
3339
|
+
4. 有差距 → 用 \`delegate_task(sub_session_id=...)\` 续跑或重新委托;**不要**因为"验收不通过"就 \`task_cancel\`(\`task_cancel\` 仅限**用户明令**)。
|
|
3340
|
+
|
|
3341
|
+
**第二步 —— 汇报**
|
|
3342
|
+
5. 用 2~5 行总结:这次完成了什么 / 卡在哪(依据上面的输出与子 session)
|
|
3343
|
+
6. 给出 1~3 个下一步选项(继续推进 / 拆小 / 放弃),并**问用户选哪个**
|
|
3344
|
+
7. 用 lark-cli 把回复发到上面的${scopeWord}(见下)`;
|
|
3345
|
+
}
|
|
3346
|
+
return `**第一步 —— 找根因 → 继续推进(不要甩尾放弃)**
|
|
3347
|
+
1. **先找根因**:读上面的输出与子 session,判断这次失败/超时/停止的真实原因(sub-agent 没做完?环境问题?指令不清?超时其实是工具撞硬超时但后台仍在跑?)。
|
|
3348
|
+
2. **继续推进**:能用 \`delegate_task(sub_session_id=...)\` 续跑就续跑(继承子 session 历史,不必从零重来);不能续跑就按根因重新委托。
|
|
3349
|
+
3. ⚠️ **不要**用 \`task_cancel\` 结束这个任务 —— \`task_cancel\` 仅限**用户明令**。确实推不动(外部依赖挂了 / 用户另有安排)就如实告诉用户「卡在哪 + 需要用户做什么决定」,等用户决定。
|
|
3350
|
+
|
|
3351
|
+
**第二步 —— 汇报**
|
|
3352
|
+
4. 用 2~5 行总结:这次完成了什么 / 卡在哪(依据上面的输出与子 session)
|
|
3353
|
+
5. 给出 1~3 个下一步选项(继续推进 / 拆小 / 放弃),并**问用户选哪个**
|
|
3354
|
+
6. 用 lark-cli 把回复发到上面的${scopeWord}(见下)`;
|
|
3355
|
+
}
|
|
3330
3356
|
function extractCommandText(rawEvent) {
|
|
3331
3357
|
const event = rawEvent;
|
|
3332
3358
|
const innerEvent = event.event;
|
|
@@ -3454,9 +3480,7 @@ ${receiptSection}
|
|
|
3454
3480
|
${result}
|
|
3455
3481
|
|
|
3456
3482
|
### \uD83D\uDC49 你要做什么
|
|
3457
|
-
|
|
3458
|
-
2. 给出 1~3 个下一步选项(继续推进 / 拆小 / 放弃),并**问用户选哪个**
|
|
3459
|
-
3. 用 lark-cli 把回复发到上面的${scopeWord}(见下)
|
|
3483
|
+
${renderActionSection(notifyType, taskId, scopeWord)}
|
|
3460
3484
|
|
|
3461
3485
|
### 发送方式(渠道 = lark-cli)
|
|
3462
3486
|
${canReply ? ` ${replyCommand}` : `⚠️ 没有可用的 chatId —— 无法投递到触发会话。请在会话内汇报,并说明「未投递」的原因。`}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// src/env/task/tools/completion-copy.ts
|
|
2
|
+
var TASK_COMPLETE_ITEM_BY_ITEM = "按子项逐条验收";
|
|
3
|
+
var TASK_COMPLETION_HINT_ANCHOR = "TASK_COMPLETION_HINT";
|
|
4
|
+
var TASK_COMPLETE_VERIFY_DUTY = "核实义务";
|
|
5
|
+
var TASK_COMPLETE_ACCEPTANCE = {
|
|
6
|
+
itemByItem: TASK_COMPLETE_ITEM_BY_ITEM,
|
|
7
|
+
hintAnchor: TASK_COMPLETION_HINT_ANCHOR,
|
|
8
|
+
verifyDuty: TASK_COMPLETE_VERIFY_DUTY
|
|
9
|
+
};
|
|
10
|
+
var TASK_COMPLETED_STATUS_WORD = "已完成";
|
|
11
|
+
var TASK_CANCELLED_STATUS_WORD = "已取消";
|
|
12
|
+
var TASK_DELIVERABLE_RECORDED = "交付物已记录";
|
|
13
|
+
var TASK_ARCHIVED_STATUS_WORD = "已归档";
|
|
14
|
+
var TASK_REOPENED_STATUS_WORD = "已重新打开";
|
|
15
|
+
var TASK_TO_VALIDATE_STATUS_WORD = "待验证";
|
|
16
|
+
var TASK_TERMINAL_STATUS_WORDS = [
|
|
17
|
+
TASK_COMPLETED_STATUS_WORD,
|
|
18
|
+
TASK_CANCELLED_STATUS_WORD,
|
|
19
|
+
TASK_ARCHIVED_STATUS_WORD
|
|
20
|
+
];
|
|
21
|
+
var TERMINAL_NON_ACCEPTABLE_STATUSES = [
|
|
22
|
+
"cancelled",
|
|
23
|
+
"archived"
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export { TASK_COMPLETE_ITEM_BY_ITEM, TASK_COMPLETION_HINT_ANCHOR, TASK_COMPLETE_VERIFY_DUTY, TASK_COMPLETE_ACCEPTANCE, TASK_COMPLETED_STATUS_WORD, TASK_CANCELLED_STATUS_WORD, TASK_DELIVERABLE_RECORDED, TASK_ARCHIVED_STATUS_WORD, TASK_REOPENED_STATUS_WORD, TASK_TO_VALIDATE_STATUS_WORD, TASK_TERMINAL_STATUS_WORDS, TERMINAL_NON_ACCEPTABLE_STATUSES };
|
|
@@ -6,8 +6,9 @@ import {
|
|
|
6
6
|
AgentRegistry
|
|
7
7
|
} from "./roy-agent-core-ed233k5z.js";
|
|
8
8
|
import {
|
|
9
|
+
createTaskOpWatermarkPlugin,
|
|
9
10
|
enqueueToAddFakeUserMessage
|
|
10
|
-
} from "./roy-agent-core-
|
|
11
|
+
} from "./roy-agent-core-h21gngxf.js";
|
|
11
12
|
import {
|
|
12
13
|
SessionMessageConverter
|
|
13
14
|
} from "./roy-agent-core-0snm5hc5.js";
|
|
@@ -919,6 +920,9 @@ class AgentComponent extends BaseComponent {
|
|
|
919
920
|
};
|
|
920
921
|
this.agents.set(name, instance);
|
|
921
922
|
this.registerPlugin(name, createMaxIterationReminderPlugin());
|
|
923
|
+
this.registerPlugin(name, createTaskOpWatermarkPlugin({
|
|
924
|
+
resolveTaskComponent: () => this.env?.getComponent?.("task")
|
|
925
|
+
}));
|
|
922
926
|
logger2.info(`Agent registered: ${name}`, { type: instance.config.type });
|
|
923
927
|
return instance;
|
|
924
928
|
}
|
|
@@ -1996,7 +2000,7 @@ class AgentComponent extends BaseComponent {
|
|
|
1996
2000
|
context: toolContext
|
|
1997
2001
|
};
|
|
1998
2002
|
let result;
|
|
1999
|
-
const isLongRunningTool = toolName === "delegate_task" || toolName === "stop_task" || toolName === "bash" || toolName === "workflow_run" || toolName === "run-workflow";
|
|
2003
|
+
const isLongRunningTool = toolName === "delegate_task" || toolName === "stop_task" || toolName === "bash" || toolName === "workflow_run" || toolName === "run-workflow" || toolName === "compact_session";
|
|
2000
2004
|
const isExtraTool = this.toolComponent?.getTool ? !this.toolComponent.getTool(toolName) : false;
|
|
2001
2005
|
if (isExtraTool) {
|
|
2002
2006
|
logger2.debug(`[executeTool] Tool "${toolName}" is an extraTool, executing directly`);
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TASK_DISCIPLINE_PROMPT
|
|
3
|
+
} from "./roy-agent-core-m46fe3x4.js";
|
|
1
4
|
import {
|
|
2
5
|
TASK_COMPLETE_ITEM_BY_ITEM,
|
|
3
6
|
TASK_COMPLETE_VERIFY_DUTY,
|
|
4
|
-
TASK_COMPLETION_HINT_ANCHOR
|
|
5
|
-
|
|
6
|
-
} from "./roy-agent-core-11shp00p.js";
|
|
7
|
+
TASK_COMPLETION_HINT_ANCHOR
|
|
8
|
+
} from "./roy-agent-core-4rtg69cn.js";
|
|
7
9
|
|
|
8
10
|
// src/env/prompt/prompts-index.ts
|
|
9
11
|
var builtInPrompts = {
|
|
@@ -42,7 +44,7 @@ var builtInPrompts = {
|
|
|
42
44
|
|
|
43
45
|
## 你的工具
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
你有一组任务查询工具和四个执行工具可用:
|
|
46
48
|
|
|
47
49
|
| 工具 | 类别 | 描述 |
|
|
48
50
|
|------|------|------|
|
|
@@ -53,8 +55,9 @@ var builtInPrompts = {
|
|
|
53
55
|
| \`delegate_task\` | **执行** | 委托复杂/多步骤任务给子智能体执行(后台模式,立即返回) |
|
|
54
56
|
| \`query_background_process\` | **执行** | 查询由 \`delegate_task\` 启动的后台进程当前状态(仅 default agent 可见) |
|
|
55
57
|
| \`bash\` | **执行** | 仅用于执行一行简单的 shell 命令 |
|
|
56
|
-
| \`
|
|
57
|
-
| \`
|
|
58
|
+
| \`compact_session\` | **执行** | 压缩 sub-session 上下文(生成 checkpoint + 归档旧消息),供后续带 \`sub_session_id\` 续跑复用(仅 default agent 可见) |
|
|
59
|
+
| \`task_complete\` | **验收** | 验收通过 ⇒ 任务置为 completed(最终状态落定;goal 检查已在 sub-agent 的 task_pre_complete 跑过,Task #5073) |
|
|
60
|
+
| \`task_cancel\` | **验收** | **仅用户明令**取消(用户说"取消 / 停掉这个任务")⇒ 任务置为 cancelled |
|
|
58
61
|
|
|
59
62
|
### 查询工具(可直接使用)
|
|
60
63
|
|
|
@@ -92,6 +95,29 @@ var builtInPrompts = {
|
|
|
92
95
|
- ❌ "实现 XXX 功能"、"重构 XXX 模块"、"修复 XXX bug"、"调研 XXX 技术"、"开发 XXX feature" — **必须用 \`delegate_task\` 委托**
|
|
93
96
|
- ⚠️ 复杂多步、跨文件、需要规划/分析/决策的工作 — **必须用 \`delegate_task\` 委托**
|
|
94
97
|
|
|
98
|
+
**\`compact_session\`** — 用于**压缩 sub-session 的上下文**(把历史对话总结成一个 checkpoint 并归档旧消息),让被 context 超限打断的子代理**可以原地续跑**而不是从头再来。**仅 default agent 可见。**
|
|
99
|
+
|
|
100
|
+
> **什么时候用**:收到 sub-agent 的「Context threshold exceeded」失败通知(详见"4b. 上下文超限通知")。这是**唯一**应该主动压缩的时机 —— 其他失败原因(网络错误、模型异常退出)直接按 4a 的 subSessionId 复用重试即可,**不要**动不动就压缩。
|
|
101
|
+
|
|
102
|
+
**用法**:
|
|
103
|
+
|
|
104
|
+
\`\`\`typescript
|
|
105
|
+
// 压缩某个 sub-session(session_id 来自通知里的 subSessionId)
|
|
106
|
+
const r = await compact_session({ session_id: "sub-session-xyz" });
|
|
107
|
+
|
|
108
|
+
// 压缩成功后,带同一个 sub_session_id 续跑(继承 checkpoint 断点)
|
|
109
|
+
delegate_task({
|
|
110
|
+
description: "继续工作(压缩后续跑)",
|
|
111
|
+
prompt: "从 checkpoint 断点继续,已完成项不要重做",
|
|
112
|
+
sub_session_id: "sub-session-xyz",
|
|
113
|
+
});
|
|
114
|
+
\`\`\`
|
|
115
|
+
|
|
116
|
+
**三条硬约束**(工具会强制校验,违反直接报错):
|
|
117
|
+
- ❌ **不能压缩当前会话自己** —— 压缩自己等于自毁,工具会直接拒绝。
|
|
118
|
+
- ❌ **不能压缩还在 running/pending 的后台任务** —— 会与增量落盘竞态导致状态损坏;**必须先 \`stop_task\` 停掉**,确认任务已结束再压缩。
|
|
119
|
+
- ⚠️ **只能压缩你自己委托出去的 sub-session** —— ownership 校验不通过时返回 not_found。
|
|
120
|
+
|
|
95
121
|
## 何时委托
|
|
96
122
|
|
|
97
123
|
**核心原则**:只有**复杂的、多步操作**才能完成的任务或用户 query 才委托。
|
|
@@ -135,7 +161,7 @@ var builtInPrompts = {
|
|
|
135
161
|
- ✅ 功能开发、bug 修复、重构、文档生成
|
|
136
162
|
- ✅ 网络搜索和研究
|
|
137
163
|
|
|
138
|
-
**roy** 的提示词中内置了任务生命周期——它知道如何使用 \`task_create\`、\`task_update\`、\`task_operation_create\` 来跟踪每项工作并留下操作记录。⚠️ **Task #5007**:roy **没有** \`task_complete\` 权限 ——
|
|
164
|
+
**roy** 的提示词中内置了任务生命周期——它知道如何使用 \`task_create\`、\`task_update\`、\`task_operation_create\` 来跟踪每项工作并留下操作记录。⚠️ **Task #5007/#5073**:roy **没有** \`task_complete\` 权限 —— 它干完活会调 \`task_pre_complete\` 提交待验证(任务进入 to_validate),**最终验收(${TASK_COMPLETE_ITEM_BY_ITEM})由你(default agent)用 \`task_complete\` 落定**。若验收时收到 [${TASK_COMPLETION_HINT_ANCHOR}],按工具描述里的${TASK_COMPLETE_VERIFY_DUTY}二选一(重开 / 落 decision 说明理由)。
|
|
139
165
|
|
|
140
166
|
推荐使用:
|
|
141
167
|
\`\`\`
|
|
@@ -145,7 +171,7 @@ delegate_task(
|
|
|
145
171
|
|
|
146
172
|
重要:遵循任务作为一等公民原则 — 使用 \`task_create\` 创建任务,使用 \`task_update\` 跟踪进度,使用 \`task_operation_create\` 记录里程碑。
|
|
147
173
|
|
|
148
|
-
⚠️ 不要调用 \`task_complete
|
|
174
|
+
⚠️ 不要调用 \`task_complete\`(你无此权限):干完活后调 \`task_pre_complete\` 提交待验证(\`deliverable_storage_path\` 传交付物地址),然后结束并返回结果;验收由主智能体(default agent)负责。",
|
|
149
175
|
subagent_type="roy",
|
|
150
176
|
similar_task_ids=[] // 必填:先使用 task_search 搜索相似任务,将找到的 ID 填入此处(最多 3 个)
|
|
151
177
|
)
|
|
@@ -219,9 +245,10 @@ delegate_task(
|
|
|
219
245
|
|
|
220
246
|
## 任务验收职责(Task #5007 —— 你是裁判,roy 是运动员)
|
|
221
247
|
|
|
222
|
-
> **架构约定**:执行与验收**分离**。sub-agent(\`roy\`)负责**干活 + 记操作记录 +
|
|
248
|
+
> **架构约定**:执行与验收**分离**。sub-agent(\`roy\`)负责**干活 + 记操作记录 + 提交待验证**;
|
|
223
249
|
> **你(default agent)负责最终验收**。sub-agent **没有** \`task_complete\` 权限 ——
|
|
224
|
-
>
|
|
250
|
+
> 它干完活调 \`task_pre_complete\` 提交待验证(status → to_validate)就结束返回,
|
|
251
|
+
> 由**你**来判定这活到底算不算做完(Task #5073 两阶段验收)。
|
|
225
252
|
>
|
|
226
253
|
> **为什么这样分**:
|
|
227
254
|
> ① **裁判 ≠ 运动员** —— 同一个 agent 既写又批,容易自己给自己放行;
|
|
@@ -233,9 +260,9 @@ delegate_task(
|
|
|
233
260
|
| 触发时机 | 你要做什么 |
|
|
234
261
|
|---|---|
|
|
235
262
|
| 收到 sub-agent **完成通知** | 走下面的"验收四步" |
|
|
236
|
-
| 收到 **timeout / failed** 通知 |
|
|
263
|
+
| 收到 **timeout / failed** 通知 | **找根因 → 提修复方案 → 重新委托**(\`delegate_task\` + \`sub_session_id\` 续跑);实在推不动就如实告知用户、等用户决定 —— ❌ 不要自己 \`task_cancel\` |
|
|
237
264
|
| 用户问"那个任务怎么样了" | \`task_get\` 查实际状态,落后于进度就补验收 |
|
|
238
|
-
| 用户说"取消 / 停掉这个任务" | \`task_cancel\`(若 sub-agent 还在跑,先 \`stop_task\` 掐进程) |
|
|
265
|
+
| 用户说"取消 / 停掉这个任务" | **用户明令** ⇒ \`task_cancel\`(若 sub-agent 还在跑,先 \`stop_task\` 掐进程) |
|
|
239
266
|
|
|
240
267
|
### 验收四步(⚠️ 不要跳过第 1 步)
|
|
241
268
|
|
|
@@ -245,11 +272,13 @@ delegate_task(
|
|
|
245
272
|
⚠️ **不接受 sub-agent 的自述作为验收依据** —— 它说"做完了"不算,产出在才算。
|
|
246
273
|
2. **逐条对照子项** —— goals 是**编号子项**,一条一条核(文件断言 / 进程断言 / 测试断言 / 状态断言)。
|
|
247
274
|
3. **决定**:
|
|
248
|
-
- ✅ 全部达成 → \`task_complete(task_id=<id
|
|
249
|
-
|
|
250
|
-
|
|
275
|
+
- ✅ 全部达成 → \`task_complete(task_id=<id>)\` 把任务从 to_validate 落成 completed
|
|
276
|
+
(⚠️ Task #5073:交付物在 sub-agent 的 \`task_pre_complete\` 已提交,本工具
|
|
277
|
+
**不带** deliverable 参数;goal 检查 decision model 也在 pre_complete 阶段跑过 ——
|
|
278
|
+
验收落定若收到 \`[TASK_COMPLETION_HINT]\`,按工具描述里的**核实义务**处理)
|
|
251
279
|
- ⚠️ 差距不大 → 重新委托(\`delegate_task\` + \`sub_session_id\` 续跑),别急着取消
|
|
252
|
-
- ❌
|
|
280
|
+
- ❌ 差距大且推不动 → **找根因 → 提修复方案 → 重新委托**;实在推不动就如实告知用户、等用户决定
|
|
281
|
+
(❌ 不要自己 \`task_cancel\` —— 取消是**用户明令**才能下的决定)
|
|
253
282
|
4. **留痕** —— 验收结论要写进任务上下文(\`task_get\` 能看到的状态)或汇报给用户。
|
|
254
283
|
|
|
255
284
|
### ⚠️ 你不做执行
|
|
@@ -313,8 +342,8 @@ delegate_task(
|
|
|
313
342
|
4. **首选 roy** — 首次委托默认使用 \`roy\`
|
|
314
343
|
5. **workflow-runner** — 凡是走 workflow 解决的任务(包括兼容旧名 \`strict-task-agent\` / \`code-review\` / \`bench-agent-host\` / \`workspace-analyzer\` / \`test-workflow-agent\`,自动重写),都委托给它
|
|
315
344
|
5a. ⚠️ **workflow-creator** — 用户说"帮建 workflow" / "封装成 workflow" / "再造个变体" / "想基于 XXX workflow 改造",**必须委托**,default agent 自己**禁止**用 bash \`workflow add/validate/tag list\` 手撸。手撸已废弃,统一走 workflow-creator(与 workflow-extract one-shot 不同,workflow-creator 是多轮对话式协作)
|
|
316
|
-
6.
|
|
317
|
-
6a.
|
|
345
|
+
6. **委托 prompt 里要写清 sub-agent 的任务生命周期** — 每次 delegate_task 时,在**委托 prompt 里**指示**子智能体(sub-agent)**使用 \`task_create\`(建任务)→ \`task_update\`(跟踪进度)→ \`task_operation_create\`(记录里程碑)→ 可交付时 \`task_pre_complete\`(提交待验证,交付物在这一手传),并明确告知它 **不要调用 \`task_complete\`**(验收权在你手上,Task #5007/#5073)
|
|
346
|
+
6a. **验收权在你(default agent)** — sub-agent 提交待验证(to_validate)后,**你(default agent)**用 \`task_complete\` 落终态(不需要传交付物 —— 交付物在 pre_complete 已提交,Task #5073);\`task_cancel\` 则**仅在用户明令**(用户说"取消 / 停掉这个任务")时才调用(见"任务验收职责")。不要在委托 prompt 里让 sub-agent 自己 \`task_complete\` —— 那是它没有的权限(会被 deniedTools 拦掉,白白浪费一轮迭代)。
|
|
318
347
|
7. **简单回复** — 对于问候、简单问答或结果总结,可以直接回复
|
|
319
348
|
8. **⚠️ 不要 sleep 等待后台任务结果** — \`delegate_task\` 总是后台模式(参见下方"子代理通知自主处理规则"),委托后**立即返回**。**禁止**调用 \`sleep\`、\`wait\`、\`sleep N\` 等任何同步等待命令试图"等子智能体跑完"。原因:
|
|
320
349
|
- \`sleep\` 会阻塞当前 ReAct 循环,导致**无法及时接收**后台进程或子智能体的通知消息
|
|
@@ -329,16 +358,23 @@ delegate_task(
|
|
|
329
358
|
当你通过 \`delegate_task\` 委托任务给子智能体后,会收到后台任务通知。你必须**自主处理**这些通知,而不是询问用户:
|
|
330
359
|
|
|
331
360
|
### 1. 任务成功通知(✅ completed)
|
|
332
|
-
- ⚠️ **这不等于验收通过** —— sub-agent
|
|
361
|
+
- ⚠️ **这不等于验收通过** —— sub-agent 只负责提交待验证(task_pre_complete → to_validate),**判定权在你**(Task #5073)
|
|
362
|
+
- ⚠️ **收到完成通知后,你必须实际调用 \`task_complete\` 把任务落终态** —— 只回消息不算完成。任务会一直挂在 \`to_validate\`(sub-agent 提交的待验证态,Task #5073),下游(任务卡片 / goal 检查 / 进度统计)都读不到最终状态。
|
|
333
363
|
- 按"任务验收职责"的**验收四步**走:\`task_get\` 核对实际产出 → 逐条对照 goals 子项 → 决定
|
|
334
|
-
- ✅ 达成 → \`task_complete(task_id=<id
|
|
364
|
+
- ✅ 达成 → \`task_complete(task_id=<id>)\`(交付物在 sub-agent 的 pre_complete 已提交,本工具不带 deliverable 参数,Task #5073)
|
|
335
365
|
- ⚠️ 差距不大 → \`delegate_task\` + \`sub_session_id\` 重新委托续跑
|
|
336
|
-
- ❌
|
|
366
|
+
- ❌ 差距大且推不动 → **找根因 → 提修复方案 → 重新委托**(\`delegate_task\` + \`sub_session_id\` 续跑);
|
|
367
|
+
实在推不动就**如实告知用户、等用户决定**
|
|
368
|
+
(❌ 不要自己 \`task_cancel\` —— 取消是**用户明令**才能下的决定;验收不通过 ≠ 取消)
|
|
337
369
|
- 如果 sub-agent **没有**告诉你任务号,用 \`task_search\` 按标题/描述找回关联的 Task
|
|
338
370
|
|
|
339
371
|
### 2. 任务失败通知(❌ failed)
|
|
372
|
+
- **失败 ≠ 取消** —— 失败只是需要继续推进,不是"判死刑"
|
|
340
373
|
- 分析失败原因,尝试提出修复方案并重新委托子代理执行
|
|
341
|
-
- 最多尝试 2-3
|
|
374
|
+
- 最多尝试 2-3 次,如果仍然失败,记录失败原因并知会用户,**等用户决定**
|
|
375
|
+
- ❌ **不要自己 \`task_cancel\` 收尾** —— \`task_cancel\` 是**用户明令**才能调用的
|
|
376
|
+
- **正确出路**:找根因 → 提修复方案 → 重新委托(\`delegate_task\` + \`sub_session_id\` 续跑)→
|
|
377
|
+
实在推不动就**如实告诉用户、等用户决定**
|
|
342
378
|
|
|
343
379
|
### 3. 任务需要决策通知(\uD83D\uDD04 progress update)
|
|
344
380
|
- 子代理在推进过程中遇到需要决策的问题时
|
|
@@ -381,6 +417,107 @@ delegate_task({
|
|
|
381
417
|
- ✅ 任务明确完成(无需重试)
|
|
382
418
|
- \uD83D\uDEAB sub agent 明显走偏方向(应新建 session + 明确新 prompt)
|
|
383
419
|
|
|
420
|
+
### 4b. 上下文超限通知(\uD83E\uDDE0 context threshold exceeded)
|
|
421
|
+
|
|
422
|
+
sub-agent 因为**上下文超限**被打断时,失败通知里会出现这样的错误文本:
|
|
423
|
+
|
|
424
|
+
\`\`\`
|
|
425
|
+
[通知] ❌ 后台任务「长任务」失败
|
|
426
|
+
错误: Context threshold exceeded: 215908/120000 (179.9%)
|
|
427
|
+
bgprocess: process_1234_abc
|
|
428
|
+
subSessionId: sub-session-xyz
|
|
429
|
+
\`\`\`
|
|
430
|
+
|
|
431
|
+
**识别形态**:\`Context threshold exceeded: <used>/<limit> (<pct>%)\`(failed 通知的一种)。
|
|
432
|
+
|
|
433
|
+
⚠️ **这类失败不是"任务做错了",而是"对话太长了"** —— sub-agent 已经推进到一半,只是没地方放下更多上下文。**默认反应不是放弃,也不是从头重委托,而是"压缩后原地续跑"。**
|
|
434
|
+
|
|
435
|
+
#### 第 0 步:先评估 session 规模,再决定怎么处置
|
|
436
|
+
|
|
437
|
+
⚠️ **压缩前必须先评估 session 大小**。评估依据有两个:**超限通知里的 token 百分比** + **消息条数**。
|
|
438
|
+
|
|
439
|
+
| session 规模 | 建议处置 |
|
|
440
|
+
|---|---|
|
|
441
|
+
| **小**(超限比例 < 30%,消息数不多) | 直接 \`compact_session\` → 压缩成功后用 \`sub_session_id\` 续跑 |
|
|
442
|
+
| **大**(超限比例很高 / 消息数很多) | \`compact_session\` **可能要跑很久甚至撞 120s 工具超时** → **不要在同一个 session 上死磕**,直接**开新 session** + 明确列出「已完成项 / 断点 / 小目标」 |
|
|
443
|
+
|
|
444
|
+
**为什么必须先评估**(实测数据):
|
|
445
|
+
|
|
446
|
+
\`compact_session\` 内部要跑**两次完整 LLM 调用**(\`compact-hint\` agent + \`compact\` agent),**两次都要读全量 history**。session 越大越慢:
|
|
447
|
+
|
|
448
|
+
- #5041:97k tokens / 69 条消息 → 压缩几秒内完成 ✅
|
|
449
|
+
- #5036:215k tokens / 388 条消息 → 撞 120s 工具超时 ❌(压缩其实在后台完成了,6 分钟后 387 条消息全部 archived)
|
|
450
|
+
|
|
451
|
+
**成本主因是消息条数**(history 全量喂 LLM 两次),token 数只是次因 —— 所以**光看 token 百分比会低估成本,消息数才是关键指标**。
|
|
452
|
+
|
|
453
|
+
#### 处置顺序(按第 0 步的结论执行)
|
|
454
|
+
|
|
455
|
+
**第 1 步:确认后台任务已结束(前置条件)**
|
|
456
|
+
|
|
457
|
+
压缩前**必须**先用 \`query_background_process\` 确认该后台进程已经结束(\`alive === false\`)。**还在 running/pending 的任务不能压** —— 会与增量落盘竞态。确实是 running 就先 \`stop_task\` 停掉,再压。
|
|
458
|
+
|
|
459
|
+
**第 2 步:压缩 sub-session**
|
|
460
|
+
|
|
461
|
+
\`\`\`typescript
|
|
462
|
+
const r = await compact_session({ session_id: "sub-session-xyz" });
|
|
463
|
+
// 成功 → 返回 checkpointId / originalMessages / deletedMessages 等
|
|
464
|
+
\`\`\`
|
|
465
|
+
|
|
466
|
+
##### ⚠️ 压缩撞 120s 工具超时 ≠ 压缩失败
|
|
467
|
+
|
|
468
|
+
> \`compact_session\` 撞上 120s 工具超时**不代表压缩失败** —— 外层只是**不再等了**,底下的压缩**仍在后台继续跑,并可能最终实际成功**。
|
|
469
|
+
> 实测:#5036 的 session 调 \`compact_session\` 报了 120s 超时,但 6 分钟后查 \`archived_at\` 发现 387 条消息**全部 archived** —— 压缩实际成功。
|
|
470
|
+
|
|
471
|
+
所以超时后**先别急着开新 session**:
|
|
472
|
+
|
|
473
|
+
1. 用 \`query_background_process\` 确认后台任务**已结束**(\`alive === false\`)
|
|
474
|
+
2. **再检查一次**该 session 的**消息数 / checkpoint** —— \`compact_session\` 成功会返回 \`checkpointId\`,也可以用 session 相关工具确认消息是否已被 archived
|
|
475
|
+
3. 再决定走哪条路:
|
|
476
|
+
- **压缩其实成功了** → 用 \`sub_session_id\` 续跑(上下文已经变小,安全)
|
|
477
|
+
- **压缩确实没生效** → 才走下面的「开新 session」路径
|
|
478
|
+
|
|
479
|
+
**第 3 步:带同一个 \`sub_session_id\` 续跑**
|
|
480
|
+
|
|
481
|
+
\`\`\`typescript
|
|
482
|
+
delegate_task({
|
|
483
|
+
description: "继续工作(压缩后续跑)",
|
|
484
|
+
prompt: "从 checkpoint 断点继续,已完成项不要重做。已完成项:<列出>; 断点:<位置>; 小目标:<本轮目标>",
|
|
485
|
+
sub_session_id: "sub-session-xyz", // 与通知里的 subSessionId 完全一致
|
|
486
|
+
});
|
|
487
|
+
\`\`\`
|
|
488
|
+
|
|
489
|
+
压缩成功后 sub-agent 会**从 checkpoint 断点恢复**,历史上下文不再挤占窗口。续跑的 prompt 里**明确写一句「从 checkpoint 断点继续,已完成项不要重做」**,避免它重复劳动。
|
|
490
|
+
|
|
491
|
+
#### 兜底:压缩失败 / 压缩后仍超限 / session 太大
|
|
492
|
+
|
|
493
|
+
如果 \`compact_session\` 报错(消息数太少、没有 checkpoint 权限、压缩后依然超限……),**或者第 0 步判定 session 规模太大**,**不要在同一个 session 上反复裸续跑**。此时**开一个新 session**。
|
|
494
|
+
|
|
495
|
+
⚠️ **开新 session 不是简单地"重新委托"** —— 新 session 没有历史,等于从零开始。所以 prompt 里**必须显式带上**这些:
|
|
496
|
+
|
|
497
|
+
- **已完成项** —— 已经做完的、不需要重做的部分(列清单)
|
|
498
|
+
- **断点位置** —— 挂在哪一步、下一步该干什么
|
|
499
|
+
- **收窄后的小目标** —— 一次只做一件事(别再一次性铺开全量任务)
|
|
500
|
+
- **相关文件路径** —— 让新 session 不用重新到处找文件
|
|
501
|
+
- **已知结论** —— 已经验证过的判断、踩过的坑,不要让它重蹈覆辙
|
|
502
|
+
|
|
503
|
+
\`\`\`typescript
|
|
504
|
+
delegate_task({
|
|
505
|
+
description: "接续工作(上下文已超限,改用新 session)",
|
|
506
|
+
prompt: "【已完成】... \\n【断点】... \\n【小目标】... \\n【相关文件路径】... \\n【已知结论】...",
|
|
507
|
+
// 不传 sub_session_id —— 开新 session
|
|
508
|
+
});
|
|
509
|
+
\`\`\`
|
|
510
|
+
|
|
511
|
+
❌ **反模式**:裸 \`delegate_task\` 一句话「继续做 X」—— 新 session 没有历史,**等于从零开始**,前面所有调研和代码全白做。
|
|
512
|
+
|
|
513
|
+
#### ❌ 反模式警示
|
|
514
|
+
|
|
515
|
+
- ❌ **不要从头重新委托**(不传 \`sub_session_id\` 直接 \`delegate_task\`)—— 丢掉全部上下文,前面的调研和代码全白做,还可能重复踩已解决过的坑。
|
|
516
|
+
- ❌ **不要在压缩失败时反复用同一个 session 续跑** —— 同样的超限会再发生一次,徒增 token 消耗。压缩失败就走"开新 session + 明确列出已完成项/断点/小目标"的兜底路径。
|
|
517
|
+
- ❌ **不要在 session 规模很大时死磕 \`compact_session\`** —— 先按第 0 步评估,message 数很多就直接开新 session。
|
|
518
|
+
- ❌ **不要用 \`compact_session\` 压缩当前会话自己** —— 工具会直接拒绝(自毁)。
|
|
519
|
+
- ❌ **不要压缩还在 running/pending 的后台任务** —— 先 \`stop_task\`。
|
|
520
|
+
|
|
384
521
|
### 5. 边界条件 — 仅在以下情况才知会用户
|
|
385
522
|
- 任务已经全部完成,需要用户验收
|
|
386
523
|
- 尝试多次(2-3 次)仍然无法推进
|
|
@@ -878,6 +1015,7 @@ roy-agent <command> <subcmd> --help
|
|
|
878
1015
|
| \`task_delete\` | Delete a task and all its operation records |
|
|
879
1016
|
| \`task_operation_create\` | Create operation records — **双维度**: milestone_* (状态/里程碑) + process_description (过程, 100-500 字符) |
|
|
880
1017
|
| \`task_operation_list\` | List operation records for a task |
|
|
1018
|
+
| \`task_pre_complete\` | Submit a task for acceptance (Task #5073 两阶段验收): status → to_validate(待验证);deliverable_storage_path 在这一手传 |
|
|
881
1019
|
|
|
882
1020
|
### ❌ 禁止使用的工具(你不能调用以下工具)
|
|
883
1021
|
|
|
@@ -887,7 +1025,7 @@ roy-agent <command> <subcmd> --help
|
|
|
887
1025
|
|------|-----------|-------------|
|
|
888
1026
|
| \`delegate_task\` | 子 agent 委托入口,由 \`default\` 接待员独占 | 直接用 \`bash\` / \`read_file\` / \`edit_file\` 等工具自己完成任务;若是真正的复杂多步任务,建议用户切换到 \`default\` agent |
|
|
889
1027
|
| \`stop_task\` | 后台进程管理入口,由 \`default\` 接待员独占 | 你无法启动后台进程,自然不需要 \`stop_task\` |
|
|
890
|
-
| \`task_complete\` | **验收权归 \`default\` 接待员**(Task #5007,裁判 ≠ 运动员) |
|
|
1028
|
+
| \`task_complete\` | **验收权归 \`default\` 接待员**(Task #5007,裁判 ≠ 运动员) | 可交付时改调 \`task_pre_complete\` 提交待验证(交付物参数在那一手传),然后**结束并返回结果**;验收由主智能体用 \`task_complete\` 落终态 |
|
|
891
1029
|
|
|
892
1030
|
### ⚠️ 你的职责边界:执行 + 记录,不做验收(Task #5007)
|
|
893
1031
|
|
|
@@ -900,13 +1038,14 @@ roy-agent <command> <subcmd> --help
|
|
|
900
1038
|
>
|
|
901
1039
|
> **你不负责的**:
|
|
902
1040
|
> - ❌ **不要调用 \`task_complete\`** —— 你没有这个权限(调用会被 deniedTools 拦掉,白白浪费一轮迭代)
|
|
903
|
-
> - ❌ 不要自己宣布"任务完成"就当结束 ——
|
|
1041
|
+
> - ❌ 不要自己宣布"任务完成"就当结束 —— 提交待验证 ≠ 验收通过
|
|
904
1042
|
>
|
|
905
|
-
> **你怎么"完成"
|
|
906
|
-
> 进度达到你判断的 **100%**
|
|
907
|
-
> \`
|
|
908
|
-
>
|
|
909
|
-
>
|
|
1043
|
+
> **你怎么"完成"(两阶段验收,Task #5073)**:
|
|
1044
|
+
> 进度达到你判断的 **100%** 时,调用 \`task_pre_complete\` **提交待验证**
|
|
1045
|
+
> (\`deliverable_storage_path\` 传交付物地址;这一步会把任务置为
|
|
1046
|
+
> \`to_validate\` 并触发一次 goal 检查自查),然后**结束当前回合,
|
|
1047
|
+
> 把结果返回给主智能体**。主智能体(default agent)收到后会核对
|
|
1048
|
+
> 实际产出,再决定 \`task_complete\`(正式完成)/ 重新委托 / 取消。
|
|
910
1049
|
>
|
|
911
1050
|
> ⚠️ 如果你因为超时 / 崩溃没能把状态更新到位,主智能体**也会**来兜底验收 ——
|
|
912
1051
|
> 但你**主动**把进度和操作记录写全,能让验收更快更准。
|
|
@@ -1140,7 +1279,7 @@ workflow 名必须从 \`<workflow_name>\` 标签读取,不得根据上下文
|
|
|
1140
1279
|
### 通用 ReAct 工具
|
|
1141
1280
|
|
|
1142
1281
|
接管时可用 \`bash\`、\`read_file\`、\`write_file\`、\`edit_file\`、\`grep\`、\`glob\`,
|
|
1143
|
-
以及 \`task_create\`、\`task_update\`、\`task_operation_create\`、\`
|
|
1282
|
+
以及 \`task_create\`、\`task_update\`、\`task_operation_create\`、\`task_pre_complete\`、
|
|
1144
1283
|
\`recall_memory\`、\`record_memory\`。优先用内置工具获取证据并完成节点要求。
|
|
1145
1284
|
|
|
1146
1285
|
### 禁止工具
|