@ai-setting/roy-agent-core 1.7.75 → 1.7.76

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.
Files changed (41) hide show
  1. package/dist/env/agent/agent-component.js +1 -1
  2. package/dist/env/agent/index.js +1 -1
  3. package/dist/env/event-source/event-source-handlers.js +5 -4
  4. package/dist/env/event-source/index.js +6 -5
  5. package/dist/env/index.js +11 -10
  6. package/dist/env/prompt/index.js +4 -3
  7. package/dist/env/prompt/prompts-index.d.ts +11 -9
  8. package/dist/env/task/backend/index.js +9 -1
  9. package/dist/env/task/delegate/delegate-tool.js +4 -3
  10. package/dist/env/task/delegate/index.js +4 -3
  11. package/dist/env/task/hooks/contexts.d.ts +12 -1
  12. package/dist/env/task/hooks/task-hook-points.d.ts +8 -3
  13. package/dist/env/task/index.d.ts +1 -0
  14. package/dist/env/task/index.js +15 -5
  15. package/dist/env/task/mcp/index.js +3 -2
  16. package/dist/env/task/plugins/index.js +4 -3
  17. package/dist/env/task/prompt/index.js +2 -1
  18. package/dist/env/task/prompt/task-discipline.d.ts +1 -1
  19. package/dist/env/task/task-component.d.ts +79 -0
  20. package/dist/env/task/tools/cancel-tool.d.ts +12 -4
  21. package/dist/env/task/tools/completion-copy.d.ts +92 -0
  22. package/dist/env/task/tools/index.d.ts +1 -0
  23. package/dist/env/task/tools/index.js +5 -2
  24. package/dist/env/task/tools/pre-complete-tool.d.ts +32 -0
  25. package/dist/env/task/tools/task-types.d.ts +49 -17
  26. package/dist/env/task/types.d.ts +13 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +21 -11
  29. package/dist/shared/@ai-setting/roy-agent-core-4rtg69cn.js +26 -0
  30. package/dist/shared/@ai-setting/{roy-agent-core-3e6gg17d.js → roy-agent-core-9vxh6f8h.js} +169 -30
  31. package/dist/shared/@ai-setting/{roy-agent-core-jg65qnwa.js → roy-agent-core-aa2j7bk9.js} +1 -1
  32. package/dist/shared/@ai-setting/{roy-agent-core-29b6hc39.js → roy-agent-core-cmprygrp.js} +1 -1
  33. package/dist/shared/@ai-setting/{roy-agent-core-n9q1encx.js → roy-agent-core-cxy143m4.js} +1 -1
  34. package/dist/shared/@ai-setting/{roy-agent-core-y7x2qzwc.js → roy-agent-core-ghnagzrh.js} +7 -3
  35. package/dist/shared/@ai-setting/{roy-agent-core-11shp00p.js → roy-agent-core-m46fe3x4.js} +21 -31
  36. package/dist/shared/@ai-setting/{roy-agent-core-djpq6yb0.js → roy-agent-core-q5r75vev.js} +1 -1
  37. package/dist/shared/@ai-setting/{roy-agent-core-60jbrfye.js → roy-agent-core-t3rrb959.js} +28 -4
  38. package/dist/shared/@ai-setting/{roy-agent-core-hnyk1by7.js → roy-agent-core-vffccgf6.js} +152 -33
  39. package/dist/shared/@ai-setting/{roy-agent-core-4gr3k7qg.js → roy-agent-core-z43aj03k.js} +120 -28
  40. package/dist/shared/@ai-setting/{roy-agent-core-snvh4s2p.js → roy-agent-core-zycadbpx.js} +1 -1
  41. package/package.json +1 -1
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-29b6hc39.js";
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-snvh4s2p.js";
65
+ } from "./shared/@ai-setting/roy-agent-core-zycadbpx.js";
66
66
  import {
67
67
  TaskComponent
68
- } from "./shared/@ai-setting/roy-agent-core-4gr3k7qg.js";
68
+ } from "./shared/@ai-setting/roy-agent-core-z43aj03k.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-jg65qnwa.js";
71
+ import"./shared/@ai-setting/roy-agent-core-aa2j7bk9.js";
72
72
  import"./shared/@ai-setting/roy-agent-core-fttgm52a.js";
73
73
  import"./shared/@ai-setting/roy-agent-core-ntq0gz7q.js";
74
74
  import"./shared/@ai-setting/roy-agent-core-8gxth0eh.js";
75
- import"./shared/@ai-setting/roy-agent-core-hnyk1by7.js";
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-n9q1encx.js";
79
+ } from "./shared/@ai-setting/roy-agent-core-cxy143m4.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-60jbrfye.js";
111
+ } from "./shared/@ai-setting/roy-agent-core-t3rrb959.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-y7x2qzwc.js";
135
+ } from "./shared/@ai-setting/roy-agent-core-ghnagzrh.js";
136
136
  import {
137
137
  EventStoreImpl,
138
138
  getSharedEventStore,
@@ -142,7 +142,7 @@ import {
142
142
  import {
143
143
  getBuiltInPrompt,
144
144
  getBuiltInPromptNames
145
- } from "./shared/@ai-setting/roy-agent-core-3e6gg17d.js";
145
+ } from "./shared/@ai-setting/roy-agent-core-9vxh6f8h.js";
146
146
  import {
147
147
  SQLiteTaskStore,
148
148
  getDefaultTaskDbPath
@@ -157,7 +157,13 @@ import {
157
157
  TASK_DISCIPLINE_LIFECYCLE,
158
158
  TASK_DISCIPLINE_OPERATION,
159
159
  TASK_DISCIPLINE_PROMPT
160
- } from "./shared/@ai-setting/roy-agent-core-11shp00p.js";
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";
161
167
  import"./shared/@ai-setting/roy-agent-core-p3zv1mx5.js";
162
168
  import"./shared/@ai-setting/roy-agent-core-nmx9934r.js";
163
169
  import {
@@ -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-djpq6yb0.js";
215
+ } from "./shared/@ai-setting/roy-agent-core-q5r75vev.js";
210
216
  import {
211
217
  ToolComponent,
212
218
  ToolRegistry,
@@ -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,
@@ -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 };
@@ -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
- TASK_DISCIPLINE_PROMPT
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
- | \`task_complete\` | **验收** | 验收通过 ⇒ 任务置为 completed(触发 goal 检查 decision model) |
57
- | \`task_cancel\` | **验收** | 验收不通过 / 用户要求 ⇒ 任务置为 cancelled |
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\` 权限 —— 它把进度推到 100% 即视为完成并结束返回,**最终验收(${TASK_COMPLETE_ITEM_BY_ITEM} + goal 检查 decision model)由你(default agent)来触发**。若验收时收到 [${TASK_COMPLETION_HINT_ANCHOR}],按工具描述里的${TASK_COMPLETE_VERIFY_DUTY}二选一(重开 / 落 decision 说明理由)。
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\`(你无此权限):进度达到 100% 后直接结束并返回结果,验收由主智能体(default agent)负责。",
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
- > 它把进度推到 100% 就结束返回,由**你**来判定这活到底算不算做完。
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** 通知 | 判断是否值得重试;不值得就 \`task_cancel\` |
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>, deliverable_storage_path="<交付物地址>")\`
249
- (这一步会触发 goal 检查的 decision model;可能收到 \`[TASK_COMPLETION_HINT]\`,
250
- 收到就按工具描述里的**核实义务**处理:重开 or 落 decision 说明理由)
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
- - ❌ 不值得继续 / 用户要求 → \`task_cancel(task_id=<id>, reason="<原因>")\`
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. **始终包含任务生命周期** — 每次委托时,指示子智能体使用 \`task_create\` → \`task_update\` → \`task_operation_create\`(⚠️ **不要**指示它用 \`task_complete\` —— 验收权在你手上,Task #5007)
317
- 6a. **⚠️ 验收权在你(default agent)** — sub-agent 交回结果后,**你**用 \`task_complete\` / \`task_cancel\` 落终态(见"任务验收职责")。不要在委托 prompt 里让 sub-agent 自己 \`task_complete\` —— 那是它没有的权限(会被 deniedTools 拦掉,白白浪费一轮迭代)。
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 只负责把进度推到 100%,**判定权在你**
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>, deliverable_storage_path="<交付物地址>")\`
364
+ - ✅ 达成 → \`task_complete(task_id=<id>)\`(交付物在 sub-agent 的 pre_complete 已提交,本工具不带 deliverable 参数,Task #5073)
335
365
  - ⚠️ 差距不大 → \`delegate_task\` + \`sub_session_id\` 重新委托续跑
336
- - ❌ 不值得继续 / 用户要求 → \`task_cancel(task_id=<id>, reason="<原因>")\`
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 次,如果仍然失败,记录失败原因并知会用户;确定不再继续时 \`task_cancel\` 收尾
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,裁判 ≠ 运动员) | 把进度推到 100%、记完操作记录,然后**结束并返回结果**;验收由主智能体用 \`task_complete\` 落终态 |
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%** 时,把 \`task_update(progress=100)\` 和最后一条
907
- > \`task_operation_create\` 落下,**然后结束当前回合,把结果返回给主智能体**。
908
- > 主智能体收到后会核对实际产出(文件在不在、测试过没过、review 结论),
909
- > 再决定 \`task_complete\` / 重新委托 / 取消。
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\`、\`task_complete\`、
1282
+ 以及 \`task_create\`、\`task_update\`、\`task_operation_create\`、\`task_pre_complete\`、
1144
1283
  \`recall_memory\`、\`record_memory\`。优先用内置工具获取证据并完成节点要求。
1145
1284
 
1146
1285
  ### 禁止工具
@@ -7,7 +7,7 @@ import {
7
7
  } from "./roy-agent-core-na18zwj0.js";
8
8
  import {
9
9
  builtInPrompts
10
- } from "./roy-agent-core-3e6gg17d.js";
10
+ } from "./roy-agent-core-9vxh6f8h.js";
11
11
  import {
12
12
  TaskHookPoints
13
13
  } from "./roy-agent-core-1pg0fepg.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  builtInPrompts
3
- } from "./roy-agent-core-3e6gg17d.js";
3
+ } from "./roy-agent-core-9vxh6f8h.js";
4
4
  import {
5
5
  getXDGPath
6
6
  } from "./roy-agent-core-qxnbvgwe.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  builtInHandlers
3
- } from "./roy-agent-core-60jbrfye.js";
3
+ } from "./roy-agent-core-t3rrb959.js";
4
4
  import {
5
5
  envKeyToConfigKey
6
6
  } from "./roy-agent-core-7hh0brvs.js";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./roy-agent-core-na18zwj0.js";
4
4
  import {
5
5
  WORKFLOW_EXTRACT_PROMPT
6
- } from "./roy-agent-core-3e6gg17d.js";
6
+ } from "./roy-agent-core-9vxh6f8h.js";
7
7
  import {
8
8
  createCompatibleDatabase,
9
9
  init_sqlite_task_store
@@ -1515,8 +1515,8 @@ class LayaCompletionPlugin {
1515
1515
  logger5.warn("[laya-completion] taskComponent not injected — skip");
1516
1516
  return;
1517
1517
  }
1518
- if (ctx.terminalStatus !== "completed") {
1519
- logger5.debug(`[laya-completion] terminalStatus=${ctx.terminalStatus} — skip (only completed)`);
1518
+ if (ctx.terminalStatus !== "completed" && ctx.terminalStatus !== "to_validate") {
1519
+ logger5.debug(`[laya-completion] terminalStatus=${ctx.terminalStatus} — skip (only completed / to_validate)`);
1520
1520
  return;
1521
1521
  }
1522
1522
  const task = ctx.task;
@@ -2116,6 +2116,10 @@ class LarkCliTaskNotifyHook {
2116
2116
  return;
2117
2117
  if (!this.isCardModeEnabled())
2118
2118
  return;
2119
+ const terminalStatus = data.terminalStatus;
2120
+ if (terminalStatus === "to_validate" || task.status === "to_validate") {
2121
+ return;
2122
+ }
2119
2123
  await this.sendCardFinish(task);
2120
2124
  }
2121
2125
  async onAfterDelete(ctx) {
@@ -1,12 +1,8 @@
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
- };
1
+ import {
2
+ TASK_COMPLETE_ITEM_BY_ITEM,
3
+ TASK_COMPLETE_VERIFY_DUTY,
4
+ TASK_COMPLETION_HINT_ANCHOR
5
+ } from "./roy-agent-core-4rtg69cn.js";
10
6
 
11
7
  // src/env/task/prompt/task-discipline.ts
12
8
  var TASK_DISCIPLINE_LIFECYCLE = `### Task Lifecycle (7 steps, 0-6)
@@ -59,12 +55,15 @@ var TASK_DISCIPLINE_LIFECYCLE = `### Task Lifecycle (7 steps, 0-6)
59
55
  - Update progress (0-100%) as the work advances
60
56
  - Update status: todo → active
61
57
  - Record \`current_status\` with human-readable progress
62
- - ⚠️ **不要**把 status 直接置为 \`completed\` —— 终态由验收方落(见步骤 6)
58
+ - ⚠️ **不要**把 status 直接置为 \`completed\` 或 \`to_validate\` ——
59
+ 终态由验收方落、待验证由 \`task_pre_complete\` 提交(见步骤 6)
63
60
 
64
61
  5. RECORD — operation records (see Operation Discipline below)
65
62
 
66
- 6. COMPLETE — 收尾分两种角色(Task #5007,验收权分离)
67
- - **执行方(roy sub-agent)**:进度达到你判断的 100% ⇒ \`task_update(progress=100)\`
63
+ 6. COMPLETE — 收尾分两种角色(Task #5007/#5073,验收权分离)
64
+ - **执行方(roy sub-agent)**:进度达到你判断的 100% ⇒
65
+ \`task_pre_complete\` **提交待验证**(\`deliverable_storage_path\`
66
+ 传交付物地址;status → to_validate,并触发一次 goal 检查自查)
68
67
  + 最后一条 \`task_operation_create\` ⇒ **结束并返回结果**。
69
68
  ❌ **不要调用 \`task_complete\`**(你无此权限)。
70
69
  - **验收方(default agent / 接待员)**:\`task_complete\` after item-by-item verification
@@ -163,8 +162,8 @@ Before calling \`task_complete\`, you MUST:
163
162
  (b) 确认已完成 → **用你手上有权限的写工具**落一条 \`decision\` 类操作记录
164
163
  (\`task_operation_create\`,milestone_type=decision,milestone_title=<一行结论>)
165
164
  说明子项实际已达成(说明理由)。若你没有该工具的权限(验收方场景),
166
- 就通过你的**委托工具**让 sub-agent 代写这条记录,或在 \`task_complete\`
167
- 的 \`deliverable_storage_path\` / 最终汇报里明确写出核实结论与证据。
165
+ 就通过你的**委托工具**让 sub-agent 代写这条记录,或在最终汇报里
166
+ 明确写出核实结论与证据。
168
167
  Never ignore it (不允许无视).
169
168
  ⚠️ **核实义务的两条路径都依赖写权限**(\`task_update\` / \`task_operation_create\`)。
170
169
  若这些工具对你**不可用**(如验收方不持有执行类工具),必须**改用委托**把动作
@@ -175,22 +174,13 @@ Before calling \`task_complete\`, you MUST:
175
174
  (milestone_type=decision) — the reason **must** land in the
176
175
  operation record (必须落到操作记录里), not merely a line in
177
176
  your final report (不能只在报告里带一句).
178
- 3. **Provide \`deliverable_storage_path\`** parameter with the deliverable's address.
179
- It may name **multiple paths** (multiple deliverables), space-separated
180
- (\`/tmp/report.md /tmp/diff.patch\`) — the judge splits on whitespace as
181
- well as \`,\` \`;\` \`、\` and \` + \`. A local path may also be written in its
182
- \`file://\` form (\`file:///tmp/report.md\`) — the scheme is stripped and the
183
- path kept. Declare **every** artefact you produced: a path left out reads
184
- as "not produced".
185
- - Feishu doc URL (e.g., https://my.feishu.cn/docx/abc)
186
- - Local file path (e.g., /tmp/report.md)
187
- - Git branch or worktree path (e.g., feature/my-feature)
188
- - GitHub commit URL or PR URL
189
- - Cloud drive URL (e.g., https://my.feishu.cn/file/abc)
190
- - Or any other locator that points to where the work product lives
191
-
192
- The \`deliverable_storage_path\` will be persisted to the task's
193
- \`context.deliverable_storage_path\` for future reference and traceability.`;
177
+ 3. Deliverables were submitted by the executor via \`task_pre_complete\`
178
+ (Task #5073 two-phase acceptance): they live in
179
+ \`context.deliverable_storage_path\` and the operation trail
180
+ (\`Deliverable: <path>\` lines). Cross-check them in step 2.
181
+ \`task_complete\` takes **no** deliverable parameter — if the
182
+ deliverables are missing from the record, re-delegate instead of
183
+ asking for a path here.`;
194
184
  var TASK_DISCIPLINE_PROMPT = [
195
185
  TASK_DISCIPLINE_LIFECYCLE,
196
186
  TASK_DISCIPLINE_OPERATION,
@@ -200,4 +190,4 @@ var TASK_DISCIPLINE_PROMPT = [
200
190
 
201
191
  `);
202
192
 
203
- export { TASK_COMPLETE_ITEM_BY_ITEM, TASK_COMPLETION_HINT_ANCHOR, TASK_COMPLETE_VERIFY_DUTY, TASK_COMPLETE_ACCEPTANCE, TASK_DISCIPLINE_LIFECYCLE, TASK_DISCIPLINE_OPERATION, TASK_DISCIPLINE_GOALS, TASK_DISCIPLINE_COMPLETE, TASK_DISCIPLINE_PROMPT };
193
+ export { TASK_DISCIPLINE_LIFECYCLE, TASK_DISCIPLINE_OPERATION, TASK_DISCIPLINE_GOALS, TASK_DISCIPLINE_COMPLETE, TASK_DISCIPLINE_PROMPT };
@@ -1996,7 +1996,7 @@ class AgentComponent extends BaseComponent {
1996
1996
  context: toolContext
1997
1997
  };
1998
1998
  let result;
1999
- const isLongRunningTool = toolName === "delegate_task" || toolName === "stop_task" || toolName === "bash" || toolName === "workflow_run" || toolName === "run-workflow";
1999
+ const isLongRunningTool = toolName === "delegate_task" || toolName === "stop_task" || toolName === "bash" || toolName === "workflow_run" || toolName === "run-workflow" || toolName === "compact_session";
2000
2000
  const isExtraTool = this.toolComponent?.getTool ? !this.toolComponent.getTool(toolName) : false;
2001
2001
  if (isExtraTool) {
2002
2002
  logger2.debug(`[executeTool] Tool "${toolName}" is an extraTool, executing directly`);