dominds 1.10.1 → 1.10.3

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 (120) hide show
  1. package/dist/docs/dialog-system.md +3 -0
  2. package/dist/docs/dialog-system.zh.md +3 -0
  3. package/dist/docs/dominds-terminology.md +3 -0
  4. package/dist/docs/tellask-collab.md +6 -0
  5. package/dist/docs/tellask-collab.zh.md +6 -0
  6. package/dist/docs/txt-editing-tools.md +2 -1
  7. package/dist/docs/txt-editing-tools.zh.md +2 -1
  8. package/dist/llm/kernel-driver/drive.js +74 -30
  9. package/dist/minds/system-prompt.js +32 -25
  10. package/dist/problems.js +2 -0
  11. package/dist/runtime/driver-messages.js +10 -2
  12. package/dist/server/api-routes.js +10 -0
  13. package/dist/team.d.ts +7 -4
  14. package/dist/team.js +236 -9
  15. package/dist/tools/pending-tellask-reminder.js +26 -8
  16. package/dist/tools/prompts/ws_mod/en/principles.md +1 -1
  17. package/dist/tools/prompts/ws_mod/en/tools.md +1 -0
  18. package/dist/tools/prompts/ws_mod/zh/principles.md +1 -1
  19. package/dist/tools/prompts/ws_mod/zh/tools.md +1 -0
  20. package/dist/tools/prompts/ws_mod.en.md +1 -1
  21. package/dist/tools/prompts/ws_mod.zh.md +1 -1
  22. package/dist/tools/team_mgmt.js +22 -10
  23. package/dist/tools/txt.js +4 -15
  24. package/package.json +3 -3
  25. package/webapp/dist/assets/{_basePickBy-BTmAP1yh.js → _basePickBy-D4e8HPXg.js} +3 -3
  26. package/webapp/dist/assets/{_basePickBy-BTmAP1yh.js.map → _basePickBy-D4e8HPXg.js.map} +1 -1
  27. package/webapp/dist/assets/{_baseUniq-BkA36GAM.js → _baseUniq-D3NO53o9.js} +2 -2
  28. package/webapp/dist/assets/{_baseUniq-BkA36GAM.js.map → _baseUniq-D3NO53o9.js.map} +1 -1
  29. package/webapp/dist/assets/{arc-BBz5hYKW.js → arc-DJXAFkV5.js} +2 -2
  30. package/webapp/dist/assets/{arc-BBz5hYKW.js.map → arc-DJXAFkV5.js.map} +1 -1
  31. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CmJwv_ml.js → architectureDiagram-2XIMDMQ5-BUV1jSp7.js} +7 -7
  32. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CmJwv_ml.js.map → architectureDiagram-2XIMDMQ5-BUV1jSp7.js.map} +1 -1
  33. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Ts7Hwgip.js → blockDiagram-WCTKOSBZ-YsCUyoV2.js} +7 -7
  34. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Ts7Hwgip.js.map → blockDiagram-WCTKOSBZ-YsCUyoV2.js.map} +1 -1
  35. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BqLDJw6g.js → c4Diagram-IC4MRINW-ef4SiFoU.js} +3 -3
  36. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BqLDJw6g.js.map → c4Diagram-IC4MRINW-ef4SiFoU.js.map} +1 -1
  37. package/webapp/dist/assets/{channel-Dw01CGfa.js → channel-F-a_58aT.js} +2 -2
  38. package/webapp/dist/assets/{channel-Dw01CGfa.js.map → channel-F-a_58aT.js.map} +1 -1
  39. package/webapp/dist/assets/{chunk-4BX2VUAB-vYSDvcqd.js → chunk-4BX2VUAB-B2nr4ki0.js} +2 -2
  40. package/webapp/dist/assets/{chunk-4BX2VUAB-vYSDvcqd.js.map → chunk-4BX2VUAB-B2nr4ki0.js.map} +1 -1
  41. package/webapp/dist/assets/{chunk-55IACEB6-DtJVXukR.js → chunk-55IACEB6-C58gNCa3.js} +2 -2
  42. package/webapp/dist/assets/{chunk-55IACEB6-DtJVXukR.js.map → chunk-55IACEB6-C58gNCa3.js.map} +1 -1
  43. package/webapp/dist/assets/{chunk-FMBD7UC4-CQ54RPGO.js → chunk-FMBD7UC4-DKkNEljt.js} +2 -2
  44. package/webapp/dist/assets/{chunk-FMBD7UC4-CQ54RPGO.js.map → chunk-FMBD7UC4-DKkNEljt.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-JSJVCQXG-BdacBw09.js → chunk-JSJVCQXG-CGudn0go.js} +2 -2
  46. package/webapp/dist/assets/{chunk-JSJVCQXG-BdacBw09.js.map → chunk-JSJVCQXG-CGudn0go.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-KX2RTZJC-DYdGOMBz.js → chunk-KX2RTZJC-CKyXsodD.js} +2 -2
  48. package/webapp/dist/assets/{chunk-KX2RTZJC-DYdGOMBz.js.map → chunk-KX2RTZJC-CKyXsodD.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-NQ4KR5QH-CAkAZBmM.js → chunk-NQ4KR5QH-BfmmdiGT.js} +4 -4
  50. package/webapp/dist/assets/{chunk-NQ4KR5QH-CAkAZBmM.js.map → chunk-NQ4KR5QH-BfmmdiGT.js.map} +1 -1
  51. package/webapp/dist/assets/{chunk-QZHKN3VN-OzVsAi4S.js → chunk-QZHKN3VN-DNM5LBtS.js} +2 -2
  52. package/webapp/dist/assets/{chunk-QZHKN3VN-OzVsAi4S.js.map → chunk-QZHKN3VN-DNM5LBtS.js.map} +1 -1
  53. package/webapp/dist/assets/{chunk-WL4C6EOR-fguokweJ.js → chunk-WL4C6EOR-D8SI8pt9.js} +6 -6
  54. package/webapp/dist/assets/{chunk-WL4C6EOR-fguokweJ.js.map → chunk-WL4C6EOR-D8SI8pt9.js.map} +1 -1
  55. package/webapp/dist/assets/{classDiagram-VBA2DB6C-QGMFe0Es.js → classDiagram-VBA2DB6C-D3FqB_Pt.js} +7 -7
  56. package/webapp/dist/assets/{classDiagram-VBA2DB6C-QGMFe0Es.js.map → classDiagram-VBA2DB6C-D3FqB_Pt.js.map} +1 -1
  57. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-QGMFe0Es.js → classDiagram-v2-RAHNMMFH-D3FqB_Pt.js} +7 -7
  58. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-QGMFe0Es.js.map → classDiagram-v2-RAHNMMFH-D3FqB_Pt.js.map} +1 -1
  59. package/webapp/dist/assets/{clone-r2fKknvV.js → clone-BUUHbHWP.js} +2 -2
  60. package/webapp/dist/assets/{clone-r2fKknvV.js.map → clone-BUUHbHWP.js.map} +1 -1
  61. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Cag1LFBF.js → cose-bilkent-S5V4N54A-DaeIKBou.js} +2 -2
  62. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Cag1LFBF.js.map → cose-bilkent-S5V4N54A-DaeIKBou.js.map} +1 -1
  63. package/webapp/dist/assets/{dagre-KLK3FWXG-BoRbJZ_3.js → dagre-KLK3FWXG-D8Q4W86V.js} +7 -7
  64. package/webapp/dist/assets/{dagre-KLK3FWXG-BoRbJZ_3.js.map → dagre-KLK3FWXG-D8Q4W86V.js.map} +1 -1
  65. package/webapp/dist/assets/{diagram-E7M64L7V-C4LMoK7F.js → diagram-E7M64L7V-r0zYbLYT.js} +8 -8
  66. package/webapp/dist/assets/{diagram-E7M64L7V-C4LMoK7F.js.map → diagram-E7M64L7V-r0zYbLYT.js.map} +1 -1
  67. package/webapp/dist/assets/{diagram-IFDJBPK2-Coi8p0U_.js → diagram-IFDJBPK2-szokDrE6.js} +7 -7
  68. package/webapp/dist/assets/{diagram-IFDJBPK2-Coi8p0U_.js.map → diagram-IFDJBPK2-szokDrE6.js.map} +1 -1
  69. package/webapp/dist/assets/{diagram-P4PSJMXO-rYtOHq-X.js → diagram-P4PSJMXO-CLPxxRPD.js} +7 -7
  70. package/webapp/dist/assets/{diagram-P4PSJMXO-rYtOHq-X.js.map → diagram-P4PSJMXO-CLPxxRPD.js.map} +1 -1
  71. package/webapp/dist/assets/{erDiagram-INFDFZHY-DdjP8gqj.js → erDiagram-INFDFZHY-B9UtzgLz.js} +5 -5
  72. package/webapp/dist/assets/{erDiagram-INFDFZHY-DdjP8gqj.js.map → erDiagram-INFDFZHY-B9UtzgLz.js.map} +1 -1
  73. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgFoNe1-.js → flowDiagram-PKNHOUZH-DKh6YNZ2.js} +7 -7
  74. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgFoNe1-.js.map → flowDiagram-PKNHOUZH-DKh6YNZ2.js.map} +1 -1
  75. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CMEzfhH3.js → ganttDiagram-A5KZAMGK-LeXR30gk.js} +3 -3
  76. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CMEzfhH3.js.map → ganttDiagram-A5KZAMGK-LeXR30gk.js.map} +1 -1
  77. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-viKRvjr0.js → gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js} +8 -8
  78. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-viKRvjr0.js.map → gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js.map} +1 -1
  79. package/webapp/dist/assets/{graph-gVpOg_lE.js → graph-Dp4sOMhl.js} +3 -3
  80. package/webapp/dist/assets/{graph-gVpOg_lE.js.map → graph-Dp4sOMhl.js.map} +1 -1
  81. package/webapp/dist/assets/{index-tcVhUj6_.js → index-DQHhQbf3.js} +322 -61
  82. package/webapp/dist/assets/index-DQHhQbf3.js.map +1 -0
  83. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-P0b1XoV1.js → infoDiagram-LFFYTUFH-I-SK7jTK.js} +6 -6
  84. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-P0b1XoV1.js.map → infoDiagram-LFFYTUFH-I-SK7jTK.js.map} +1 -1
  85. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-D40APktA.js → ishikawaDiagram-PHBUUO56-Dq6VgWn-.js} +2 -2
  86. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-D40APktA.js.map → ishikawaDiagram-PHBUUO56-Dq6VgWn-.js.map} +1 -1
  87. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-D6aNNJVd.js → journeyDiagram-4ABVD52K-DRx1eYmm.js} +5 -5
  88. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-D6aNNJVd.js.map → journeyDiagram-4ABVD52K-DRx1eYmm.js.map} +1 -1
  89. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DQKvYmMb.js → kanban-definition-K7BYSVSG-uuizP_jn.js} +3 -3
  90. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DQKvYmMb.js.map → kanban-definition-K7BYSVSG-uuizP_jn.js.map} +1 -1
  91. package/webapp/dist/assets/{layout-FpBDmPYH.js → layout-BPS5Z_Mh.js} +5 -5
  92. package/webapp/dist/assets/{layout-FpBDmPYH.js.map → layout-BPS5Z_Mh.js.map} +1 -1
  93. package/webapp/dist/assets/{linear-peqpVuLQ.js → linear-C2pv6VZd.js} +2 -2
  94. package/webapp/dist/assets/{linear-peqpVuLQ.js.map → linear-C2pv6VZd.js.map} +1 -1
  95. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-CwvIH34J.js → mindmap-definition-YRQLILUH-DmztmMq2.js} +4 -4
  96. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-CwvIH34J.js.map → mindmap-definition-YRQLILUH-DmztmMq2.js.map} +1 -1
  97. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-lM7j5Uhe.js → pieDiagram-SKSYHLDU-B9-E1cph.js} +8 -8
  98. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-lM7j5Uhe.js.map → pieDiagram-SKSYHLDU-B9-E1cph.js.map} +1 -1
  99. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D7UU9Dp-.js → quadrantDiagram-337W2JSQ-y8snLk0o.js} +3 -3
  100. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D7UU9Dp-.js.map → quadrantDiagram-337W2JSQ-y8snLk0o.js.map} +1 -1
  101. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CsJFJ-cl.js → requirementDiagram-Z7DCOOCP-DpqFFg69.js} +4 -4
  102. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CsJFJ-cl.js.map → requirementDiagram-Z7DCOOCP-DpqFFg69.js.map} +1 -1
  103. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Dl4-eWCT.js → sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js} +2 -2
  104. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Dl4-eWCT.js.map → sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js.map} +1 -1
  105. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Bu3kNgJ9.js → sequenceDiagram-2WXFIKYE-D-qxDD9y.js} +4 -4
  106. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Bu3kNgJ9.js.map → sequenceDiagram-2WXFIKYE-D-qxDD9y.js.map} +1 -1
  107. package/webapp/dist/assets/{stateDiagram-RAJIS63D-CadfG4Au.js → stateDiagram-RAJIS63D-DuuYaUrj.js} +9 -9
  108. package/webapp/dist/assets/{stateDiagram-RAJIS63D-CadfG4Au.js.map → stateDiagram-RAJIS63D-DuuYaUrj.js.map} +1 -1
  109. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-CabV9tQH.js → stateDiagram-v2-FVOUBMTO-Du-pyDZk.js} +5 -5
  110. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-CabV9tQH.js.map → stateDiagram-v2-FVOUBMTO-Du-pyDZk.js.map} +1 -1
  111. package/webapp/dist/assets/{timeline-definition-YZTLITO2-XqBsdE-B.js → timeline-definition-YZTLITO2-egNUbGCq.js} +3 -3
  112. package/webapp/dist/assets/{timeline-definition-YZTLITO2-XqBsdE-B.js.map → timeline-definition-YZTLITO2-egNUbGCq.js.map} +1 -1
  113. package/webapp/dist/assets/{treemap-KZPCXAKY-Cc-MHIad.js → treemap-KZPCXAKY-B5iVcLdl.js} +5 -5
  114. package/webapp/dist/assets/{treemap-KZPCXAKY-Cc-MHIad.js.map → treemap-KZPCXAKY-B5iVcLdl.js.map} +1 -1
  115. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DPu_jSWi.js → vennDiagram-LZ73GAT5-Krw2StjR.js} +2 -2
  116. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DPu_jSWi.js.map → vennDiagram-LZ73GAT5-Krw2StjR.js.map} +1 -1
  117. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-8Dh_0DI4.js → xychartDiagram-JWTSCODW-C-gGxToR.js} +3 -3
  118. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-8Dh_0DI4.js.map → xychartDiagram-JWTSCODW-C-gGxToR.js.map} +1 -1
  119. package/webapp/dist/index.html +1 -1
  120. package/webapp/dist/assets/index-tcVhUj6_.js.map +0 -1
@@ -334,6 +334,9 @@ Result (second call):
334
334
 
335
335
  - **No registry lookup** - always creates a new subdialog
336
336
  - **Not registered** - no persistence across Tellasks
337
+ - **No assignment-update channel** - once emitted, it cannot be updated in place like Type B
338
+ - Another `tellaskSessionless` creates **another new transient subdialog**; it does not update, stop, or tell the earlier Type C sideline to stop
339
+ - If later correction, scope change, or earlier wrap-up may be needed, choose Type B `tellask` with `sessionSlug` from the start
337
340
  - The subdialog itself is fully capable **except** for `freshBootsReasoning({ tellaskContent: "..." })` FBR, which is tool-less and tellask-free (see `fbr.md`).
338
341
  - Only difference from TYPE B: no registry lookup/resume capability
339
342
  - Used for one-off, independent tasks
@@ -315,6 +315,9 @@ LLM 再次发出:tellask({ targetAgentId: "researcher", sessionSlug: "market-a
315
315
 
316
316
  - **无注册表查找** - 总是创建新的子对话
317
317
  - **不注册** - 在各次诉请之间不持久化
318
+ - **无任务安排更新通道** - 发出后不能像 TYPE B 那样就地更新同一路诉请要求
319
+ - 再次发起 `tellaskSessionless` 只会创建**另一条新的瞬态子对话**,不会更新、更不会要求先前那条 TYPE C 支线停止
320
+ - 若你后续可能需要改要求、纠偏或提前收口,应该从一开始就选择带 `sessionSlug` 的 TYPE B `tellask`
318
321
  - 子对话本身一般是“完整能力”的;但 `freshBootsReasoning({ tellaskContent: "..." })` FBR 是特例:无工具且禁止任何诉请(见 `fbr.zh.md`)。
319
322
  - 与 TYPE B 的唯一区别:无注册表查找/恢复能力
320
323
  - 用于一次性的、独立的任务
@@ -196,6 +196,9 @@ tellask({
196
196
  - EN (key property): “Fresh/one-shot” is not only “new context”; it also means **no continuation semantics** — later Tellasks are not expected to resume the same session context.
197
197
  - ZH(关键性质): “Fresh/一次性”不仅表示“新开上下文”,更表示:**没有后续续话语义** —— 后续诉请不应被期待能自动续接本次一次性诉请的上下文。
198
198
 
199
+ - EN (operational consequence): A Fresh Tellask has **no assignment-update channel**. Another `tellaskSessionless` creates a new transient sideline; it does not update or tell the earlier one to stop.
200
+ - ZH(操作后果): 一次性诉请**没有任务安排更新通道**。再次发起 `tellaskSessionless` 只会新建另一条瞬态支线,不会更新、更不会要求先前那条支线停止。
201
+
199
202
  - EN (practical guidance): If you need a follow-up after a Fresh Tellask, treat it as a new request and restate necessary context; if you need iterative follow-ups, use `Tellask Session` with `sessionSlug`.
200
203
  - ZH(实践建议): 如果你在一次性诉请后还要追问,应当把追问当作全新请求并补齐必要上下文;如果你需要可迭代的追问/推进,请使用 `Tellask Session` 并提供 `sessionSlug`。
201
204
 
@@ -33,6 +33,12 @@ These points reflect current behavior in `dialog-system.md`, `fbr.md`, and `dili
33
33
  - `Tellask Session`: `tellask({ targetAgentId: "<teammate>", sessionSlug: "<slug>", tellaskContent: "..." })`
34
34
  - `Fresh Tellask`: `tellaskSessionless({ targetAgentId: "<teammate>", tellaskContent: "..." })`
35
35
 
36
+ Important addition:
37
+
38
+ - Only `Tellask Session` has an assignment-update channel.
39
+ - `Fresh Tellask` has no such channel; another `tellaskSessionless` only creates another transient sideline and does not affect or tell the earlier owner to stop.
40
+ - If later correction, earlier wrap-up, or scope change may be needed, do not choose `Fresh Tellask`; use `tellask` with `sessionSlug` from the start.
41
+
36
42
  ### 2.2 What `Tellask Session` really means
37
43
 
38
44
  - `sessionSlug` gives resumable addressing and reusable context.
@@ -33,6 +33,12 @@
33
33
  - 长线诉请:`tellask({ targetAgentId: "<teammate>", sessionSlug: "<slug>", tellaskContent: "..." })`,可恢复上下文的多轮协作。
34
34
  - 一次性诉请:`tellaskSessionless({ targetAgentId: "<teammate>", tellaskContent: "..." })`,一次性、不可恢复。
35
35
 
36
+ 关键补充:
37
+
38
+ - 只有长线诉请有“更新任务安排”的通道。
39
+ - 一次性诉请没有这个通道;后续再开一个 `tellaskSessionless` 只会创建新的瞬态支线,不会影响旧支线继续执行,更不能要求旧主理人停止。
40
+ - 如果你后来可能需要改要求、提前收口或纠偏,就不该使用一次性诉请,而应从一开始就用带 `sessionSlug` 的长线诉请。
41
+
36
42
  ### 2.2 长线诉请的真实语义
37
43
 
38
44
  - `sessionSlug` 的作用是“会话寻址 + 历史复用”。
@@ -82,6 +82,7 @@ Chinese version: [中文版](./txt-editing-tools.zh.md)
82
82
  使用建议:先用 `read_file` 获取 `total_lines/size_bytes` 作为 `known_old_total_lines/known_old_total_bytes` 的对账输入。
83
83
  设计定位:用于“新内容很小(例如 <100 行)”或“明确为重置/生成物”的场景;其他情况优先 prepare/apply。
84
84
  护栏(强制):必须提供 `known_old_total_lines/known_old_total_bytes`(旧文件快照)才允许执行;若对账不匹配则拒绝覆盖。
85
+ `content_format`:可选文本提示,任意非空字符串都可接受(例如 `yaml` / `toml` / `json` / `markdown`)。
85
86
  护栏(默认拒绝):若正文疑似 diff/patch,且未显式声明 `content_format=diff|patch`,则默认拒绝并引导改用 prepare/apply(避免把 patch 文本误写进文件)。
86
87
  限制:不负责创建文件;创建空文件/新文件请用 `create_new_file`;创建“带非空初始内容”的新文件可用 `prepare_file_append create=true` → `apply_file_modification`。
87
88
 
@@ -136,7 +137,7 @@ Chinese version: [中文版](./txt-editing-tools.zh.md)
136
137
  > - `occurrence: ""` 或 `0`:不指定 occurrence。
137
138
  > - `match: ""`:使用默认 `contains`(注意:`match` 是 match mode,不是要匹配的文本/正则)。
138
139
  > - `read_file({ range: "", max_lines: 0 })`:分别表示“不指定范围 / 使用默认 500 行”。
139
- > - `overwrite_entire_file({ content_format: "" })`:表示“未显式声明内容格式”(此时若正文强特征疑似 diff/patch 将默认拒绝写入)。
140
+ > - `overwrite_entire_file({ content_format: "" })`:表示“未显式声明内容格式”(此时若正文强特征疑似 diff/patch 将默认拒绝写入);若显式提供任意非空标签(例如 `yaml`),工具会原样接受,但只有 `diff` / `patch` 具有放行 diff/patch 字面量的特殊语义。
140
141
  > - `ripgrep_*({ path: "", case: "", max_files: 0, max_results: 0 })`:分别表示“默认路径 '.' / 默认 smart-case / 使用默认上限”。
141
142
 
142
143
  ## 7. 规范化策略(当前实现)
@@ -82,6 +82,7 @@ updated: 2026-01-24
82
82
  使用建议:先用 `read_file` 获取 `total_lines/size_bytes` 作为 `known_old_total_lines/known_old_total_bytes` 的对账输入。
83
83
  设计定位:用于"新内容很小(例如 <100 行)"或"明确为重置/生成物"的场景;其他情况优先 prepare/apply。
84
84
  护栏(强制):必须提供 `known_old_total_lines/known_old_total_bytes`(旧文件快照)才允许执行;若对账不匹配则拒绝覆盖。
85
+ `content_format`:可选文本提示,任意非空字符串都可接受(例如 `yaml` / `toml` / `json` / `markdown`)。
85
86
  护栏(默认拒绝):若正文疑似 diff/patch,且未显式声明 `content_format=diff|patch`,则默认拒绝并引导改用 prepare/apply(避免把 patch 文本误写进文件)。
86
87
  限制:不负责创建文件;创建空文件/新文件请用 `create_new_file`;创建"带非空初始内容"的新文件可用 `prepare_file_append create=true` → `apply_file_modification`。
87
88
 
@@ -136,7 +137,7 @@ updated: 2026-01-24
136
137
  > - `occurrence: ""` 或 `0`:不指定 occurrence。
137
138
  > - `match: ""`:使用默认 `contains`(注意:`match` 是 match mode,不是要匹配的文本/正则)。
138
139
  > - `read_file({ range: "", max_lines: 0 })`:分别表示"不指定范围 / 使用默认 500 行"。
139
- > - `overwrite_entire_file({ content_format: "" })`:表示"未显式声明内容格式"(此时若正文强特征疑似 diff/patch 将默认拒绝写入)。
140
+ > - `overwrite_entire_file({ content_format: "" })`:表示"未显式声明内容格式"(此时若正文强特征疑似 diff/patch 将默认拒绝写入);若显式提供任意非空标签(例如 `yaml`),工具会原样接受,但只有 `diff` / `patch` 具有放行 diff/patch 字面量的特殊语义。
140
141
  > - `ripgrep_*({ path: "", case: "", max_files: 0, max_results: 0 })`:分别表示"默认路径 '.' / 默认 smart-case / 使用默认上限"。
141
142
 
142
143
  ## 7. 规范化策略(当前实现)
@@ -253,7 +253,7 @@ const TELLASK_SPECIAL_VIRTUAL_TOOLS = [
253
253
  {
254
254
  type: 'func',
255
255
  name: 'tellaskSessionless',
256
- description: 'Create a one-shot teammate sideline dialog.',
256
+ description: 'Create a one-shot teammate sideline dialog with no assignment-update channel; later tellaskSessionless calls create new dialogs rather than updating or stopping this one.',
257
257
  parameters: {
258
258
  type: 'object',
259
259
  properties: {
@@ -637,6 +637,7 @@ async function emitAssistantSaying(dlg, content) {
637
637
  await dlg.sayingFinish();
638
638
  }
639
639
  function buildPromptContentWithExactReplyToolName(args) {
640
+ const isFbrSubdialog = args.dlg instanceof dialog_1.SubDialog && args.dlg.assignmentFromSup.callName === 'freshBootsReasoning';
640
641
  const noActivePrefix = args.language === 'zh'
641
642
  ? '[Dominds 当前无跨对话回复义务]'
642
643
  : '[Dominds no active inter-dialog reply]';
@@ -644,6 +645,9 @@ function buildPromptContentWithExactReplyToolName(args) {
644
645
  const reminderPrefixes = ['[Dominds replyTellask required]', '[Dominds 必须调用回复工具]'];
645
646
  const directive = args.activeReplyDirective;
646
647
  if (!directive) {
648
+ if (isFbrSubdialog) {
649
+ return args.prompt.content;
650
+ }
647
651
  if (!(args.dlg instanceof dialog_1.SubDialog)) {
648
652
  return args.prompt.content;
649
653
  }
@@ -686,11 +690,47 @@ function buildPromptContentWithExactReplyToolName(args) {
686
690
  function isReplyTellaskCallName(name) {
687
691
  return (name === 'replyTellask' || name === 'replyTellaskSessionless' || name === 'replyTellaskBack');
688
692
  }
693
+ function isToolArgumentsObject(value) {
694
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
695
+ }
696
+ function prepareFuncCallArguments(argumentsStr) {
697
+ if (argumentsStr.trim() === '') {
698
+ return {
699
+ ok: true,
700
+ raw: {},
701
+ contextArguments: '{}',
702
+ };
703
+ }
704
+ let parsed;
705
+ try {
706
+ parsed = JSON.parse(argumentsStr);
707
+ }
708
+ catch (err) {
709
+ return {
710
+ ok: false,
711
+ error: `Arguments must be valid JSON: ${err instanceof Error ? err.message : String(err)}`,
712
+ contextArguments: '{}',
713
+ };
714
+ }
715
+ if (!isToolArgumentsObject(parsed)) {
716
+ return {
717
+ ok: false,
718
+ error: 'Arguments must be an object',
719
+ contextArguments: '{}',
720
+ };
721
+ }
722
+ return {
723
+ ok: true,
724
+ raw: parsed,
725
+ contextArguments: argumentsStr,
726
+ };
727
+ }
689
728
  async function executeFunctionCalls(args) {
690
729
  const functionPromises = args.funcCalls.map(async (func) => {
691
730
  throwIfAborted(args.abortSignal, args.dlg);
692
731
  const callGenseq = func.genseq;
693
732
  const argsStr = typeof func.arguments === 'string' ? func.arguments : JSON.stringify(func.arguments ?? {});
733
+ const preparedArgs = prepareFuncCallArguments(argsStr);
694
734
  const tool = args.agentTools.find((t) => t.type === 'func' && t.name === func.name);
695
735
  if (!tool) {
696
736
  const errorResult = {
@@ -704,25 +744,38 @@ async function executeFunctionCalls(args) {
704
744
  await args.dlg.receiveFuncResult(errorResult);
705
745
  return errorResult;
706
746
  }
707
- let rawArgs = {};
708
- if (typeof func.arguments === 'string' && func.arguments.trim()) {
709
- try {
710
- rawArgs = JSON.parse(func.arguments);
711
- }
712
- catch (parseErr) {
713
- rawArgs = null;
714
- log_1.log.warn('kernel-driver failed to parse function arguments as JSON', undefined, {
715
- funcName: func.name,
716
- arguments: func.arguments,
717
- error: parseErr,
718
- });
719
- }
720
- }
721
747
  let result;
722
- const argsValidation = (0, runtime_1.validateFuncToolArguments)(tool, rawArgs);
723
- if (argsValidation.ok) {
748
+ if (!preparedArgs.ok) {
749
+ log_1.log.warn('kernel-driver rejected function call arguments before execution', undefined, {
750
+ funcName: func.name,
751
+ arguments: argsStr,
752
+ error: preparedArgs.error,
753
+ });
754
+ result = {
755
+ type: 'func_result_msg',
756
+ id: func.id,
757
+ name: func.name,
758
+ content: `Invalid arguments: ${preparedArgs.error}`,
759
+ role: 'tool',
760
+ genseq: callGenseq,
761
+ };
762
+ }
763
+ else {
764
+ const argsValidation = (0, runtime_1.validateFuncToolArguments)(tool, preparedArgs.raw);
765
+ if (!argsValidation.ok) {
766
+ result = {
767
+ type: 'func_result_msg',
768
+ id: func.id,
769
+ name: func.name,
770
+ content: `Invalid arguments: ${argsValidation.error}`,
771
+ role: 'tool',
772
+ genseq: callGenseq,
773
+ };
774
+ await args.dlg.receiveFuncResult(result);
775
+ return result;
776
+ }
724
777
  const argsObj = argsValidation.args;
725
- await args.dlg.funcCallRequested(func.id, func.name, argsStr);
778
+ await args.dlg.funcCallRequested(func.id, func.name, preparedArgs.contextArguments);
726
779
  await args.dlg.persistFunctionCall(func.id, func.name, argsObj, callGenseq);
727
780
  try {
728
781
  throwIfAborted(args.abortSignal, args.dlg);
@@ -759,16 +812,6 @@ async function executeFunctionCalls(args) {
759
812
  }
760
813
  }
761
814
  }
762
- else {
763
- result = {
764
- type: 'func_result_msg',
765
- id: func.id,
766
- name: func.name,
767
- content: `Invalid arguments: ${argsValidation.error}`,
768
- role: 'tool',
769
- genseq: callGenseq,
770
- };
771
- }
772
815
  await args.dlg.receiveFuncResult(result);
773
816
  return result;
774
817
  });
@@ -899,14 +942,15 @@ async function executeFunctionRound(args) {
899
942
  }
900
943
  const pairedMessages = [];
901
944
  for (const call of args.funcCalls) {
902
- const argsStr = typeof call.arguments === 'string' ? call.arguments : JSON.stringify(call.arguments ?? {});
945
+ const originalArgsStr = typeof call.arguments === 'string' ? call.arguments : JSON.stringify(call.arguments ?? {});
946
+ const preparedArgs = prepareFuncCallArguments(originalArgsStr);
903
947
  pairedMessages.push({
904
948
  type: 'func_call_msg',
905
949
  role: 'assistant',
906
950
  genseq: call.genseq,
907
951
  id: call.id,
908
952
  name: call.name,
909
- arguments: argsStr,
953
+ arguments: preparedArgs.contextArguments,
910
954
  });
911
955
  const result = resultByCallId.get(call.id);
912
956
  if (result) {
@@ -6,32 +6,35 @@ const inter_dialog_format_1 = require("../runtime/inter-dialog-format");
6
6
  function formatTeamIntro(team, selfAgentId, language) {
7
7
  const callSignLabel = language === 'zh' ? '呼号' : 'Call Sign';
8
8
  const selfSuffix = language === 'zh' ? '(本人)' : ' (self)';
9
- const focusLabel = language === 'zh' ? '关注' : 'Focus';
9
+ const goforLabel = language === 'zh' ? '对于以下事项应该找祂' : 'Go to them for';
10
+ const nogoLabel = language === 'zh' ? '对于以下事项不要找祂' : 'Do not go to them for';
10
11
  const visibleMembers = Object.values(team.members).filter((m) => m.hidden !== true);
11
12
  if (visibleMembers.length === 0) {
12
13
  return language === 'zh' ? '-(无可见队友)' : '- (no visible teammates)';
13
14
  }
15
+ const formatRoutingCard = (label, card) => {
16
+ if (card === undefined)
17
+ return '';
18
+ if (typeof card === 'string')
19
+ return `\n - ${label}:\n - ${card}`;
20
+ if (Array.isArray(card)) {
21
+ if (card.length === 0)
22
+ return '';
23
+ const list = card.map((t) => ` - ${t}`).join('\n');
24
+ return `\n - ${label}:\n${list}`;
25
+ }
26
+ const entries = Object.entries(card);
27
+ if (entries.length === 0)
28
+ return '';
29
+ const list = entries.map(([k, v]) => ` - ${k}: ${v}`).join('\n');
30
+ return `\n - ${label}:\n${list}`;
31
+ };
14
32
  return visibleMembers
15
33
  .map((m) => {
16
34
  const isSelf = m.id === selfAgentId ? selfSuffix : '';
17
- const gofor = (() => {
18
- if (m.gofor === undefined)
19
- return '';
20
- if (typeof m.gofor === 'string')
21
- return `\n - ${focusLabel}:\n - ${m.gofor}`;
22
- if (Array.isArray(m.gofor)) {
23
- if (m.gofor.length === 0)
24
- return '';
25
- const list = m.gofor.map((t) => ` - ${t}`).join('\n');
26
- return `\n - ${focusLabel}:\n${list}`;
27
- }
28
- const entries = Object.entries(m.gofor);
29
- if (entries.length === 0)
30
- return '';
31
- const list = entries.map(([k, v]) => ` - ${k}: ${v}`).join('\n');
32
- return `\n - ${focusLabel}:\n${list}`;
33
- })();
34
- return `- ${callSignLabel}: @${m.id}${isSelf} - ${m.name}${gofor}`;
35
+ const gofor = formatRoutingCard(goforLabel, m.gofor);
36
+ const nogo = formatRoutingCard(nogoLabel, m.nogo);
37
+ return `- ${callSignLabel}: @${m.id}${isSelf} - ${m.name}${gofor}${nogo}`;
35
38
  })
36
39
  .join('\n');
37
40
  }
@@ -94,7 +97,9 @@ function buildTeammateTellaskPhaseContract(language) {
94
97
  '- 队友诉请必须遵循“发起 → 等待 → 判定 → 续推”四段协议:若目标未达成,立即发出下一轮诉请推进。',
95
98
  '- 对队友诉请而言,收到回贴即表示该轮调用已结束;不存在“回贴已送达后,对方仍在后台继续执行同一诉请”的默认语义。要继续必须显式再发一轮诉请函数(通常 `tellask` 复用同一 `sessionSlug`)。',
96
99
  '- 若被诉请者在回贴送达前因 `clear_mind` 开启新一程,同一进行中诉请默认继续有效;新一程会自然承接,直到产生回贴或明确失败。不要仅因对方换程就把该轮诉请当作失效重发。',
97
- '- 只有在存在明确进行中诉请时,才可声明“等待回贴/等待结果”(通常应可在“⏳ 进行中诉请(共 N 路,自动添加,手动删除)”这类提醒项中观测到);若该提醒项不存在,或提醒项已明确“当前没有执行中的诉请”,则“等待”是错误动作,必须执行下一动作(直接诉请或本地执行)。',
100
+ '- 只有在存在明确进行中诉请时,才可声明“等待回贴/等待结果”(通常应可在“⏳ 进行中诉请(共 N 路,自动维护;仅 0 路时可手动删除)”这类提醒项中观测到);若该提醒项不存在,或提醒项已明确“当前没有执行中的诉请”,则“等待”是错误动作,必须执行下一动作(直接诉请或本地执行)。',
101
+ '- “⏳ 进行中诉请”提醒项只是系统状态窗,不是控制面:内容不可手改;当存在非 0 路进行中诉请时,不可删除,误删会被拒绝并返回引导文案。若某一路诉请需要改要求、提前收口或纠偏,只能更新那一路诉请的“任务安排”(对长线诉请通常复用同一 `sessionSlug` 再发 `tellask`),让对应主理人按最新安排自行最终回复并自然结束。',
102
+ '- 只有长线诉请(`tellask` + `sessionSlug`)才有“更新任务安排”的通道;一次性诉请(`tellaskSessionless`)没有这个通道。再次发起 `tellaskSessionless` 只会创建新的瞬态支线,不会更新、更不会要求旧支线主理人停止;若你后来发现可能需要改要求/提前收口,一开始就不该选择 `tellaskSessionless`。',
98
103
  '- 能由队友诉请完成的执行性工作,禁止转交 `askHuman` 做“转发员”;当你写“让 @X 执行 Y”时,必须在同一回复内直接发出 `tellask` 或 `tellaskSessionless`。',
99
104
  `- 当你在诉请正文里定义“回贴格式/交付格式”时,必须明确写入:\`Dominds 会自动注入回贴标记,禁止手写标记\`;不得要求被诉请者手写 \`${runtimeMarkers.finalCompleted}\` / \`${runtimeMarkers.tellaskBack}\` / FBR 标记(\`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`)。`,
100
105
  '- 当你处于队友诉请触发的支线且需要澄清时,必须使用 `tellaskBack` 回问上游诉请者;`tellaskBack` 不携带 `sessionSlug`。',
@@ -104,7 +109,9 @@ function buildTeammateTellaskPhaseContract(language) {
104
109
  '- Teammate Tellasks MUST follow four phases: “initiate -> wait -> judge -> continue”. If the objective is not met, immediately send the next Tellask round.',
105
110
  '- For teammate Tellasks, a delivered response closes that call round; there is no default “still running in background after the reply is already delivered” state for the same Tellask. To continue, emit a new Tellask function call explicitly (usually `tellask` with the same `sessionSlug`).',
106
111
  '- If the callee starts a new course via `clear_mind` before delivering the reply, the same in-flight Tellask stays live by default; the new course naturally continues it until a reply is delivered or an explicit failure is returned. Do not re-tellask solely because the callee changed course.',
107
- '- You may claim “waiting for reply/result” only when a concrete pending Tellask exists (normally observable in a “⏳ In-flight Tellasks (N total, auto-added, manually deleted)” reminder). If that reminder is absent, or it explicitly states there are no in-flight Tellasks, waiting is a wrong action; execute the next action now (direct Tellask or local action).',
112
+ '- You may claim “waiting for reply/result” only when a concrete pending Tellask exists (normally observable in a “⏳ In-flight Tellasks (N total, auto-maintained; manually deletable only at zero in-flight)” reminder). If that reminder is absent, or it explicitly states there are no in-flight Tellasks, waiting is a wrong action; execute the next action now (direct Tellask or local action).',
113
+ '- The “⏳ In-flight Tellasks” reminder is only a system status window, not a control surface: its content is not hand-editable; while any Tellask is still active, it is not deletable, and mistaken deletion will be rejected with guidance. If one Tellask needs a changed scope, earlier closure, or correction, update that Tellask’s assignment instead (for a sessioned Tellask, usually send another `tellask` with the same `sessionSlug`) so the responder can deliver a final reply naturally under the latest assignment.',
114
+ '- Only a sessioned Tellask (`tellask` + `sessionSlug`) has an assignment-update channel. A one-shot Tellask (`tellaskSessionless`) has no such channel: another `tellaskSessionless` creates a new transient sideline and does not update, stop, or instruct the earlier one to stop. If you may need later correction or earlier wrap-up, do not choose `tellaskSessionless` in the first place.',
108
115
  '- Do not use `askHuman` as a relay for executable teammate work. If you write “ask @X to do Y”, emit `tellask` or `tellaskSessionless` in the same response.',
109
116
  `- When you define a “reply/delivery format” inside tellask body, you must explicitly include: \`Dominds auto-injects reply markers; do not hand-write markers\`; do not require the responder to hand-write \`${runtimeMarkers.finalCompleted}\` / \`${runtimeMarkers.tellaskBack}\` / FBR markers (\`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`).`,
110
117
  '- When you are in a teammate-triggered sideline and need clarification, you MUST issue `tellaskBack` to ask back upstream; `tellaskBack` must not carry `sessionSlug`.',
@@ -187,12 +194,12 @@ function buildTellaskCollaborationProtocol(language, dialogScope) {
187
194
  ...pickLocalized(language, {
188
195
  zh: [
189
196
  '- Tellask 统一走函数工具通道:`tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman` / `freshBootsReasoning`。',
190
- '- 对队友诉请默认使用 `tellask` 并复用 `sessionSlug`;仅在确认一次性诉请足够时才使用 `tellaskSessionless`,且需说明理由。',
197
+ '- 对队友诉请默认使用 `tellask` 并复用 `sessionSlug`;仅在确认一次性诉请足够、且后续不需要更新任务安排/提前收口时才使用 `tellaskSessionless`,并需说明理由。',
191
198
  '- 例外优先级(强制):`tellaskBack` 仅用于回问上游诉请者,不适用队友长线默认规则,也不携带 `sessionSlug`。',
192
199
  ],
193
200
  en: [
194
201
  '- Tellask must use the function-tool channel: `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman` / `freshBootsReasoning`.',
195
- '- For teammate tellasks, default to `tellask` and continue with the same `sessionSlug`; use `tellaskSessionless` only for justified one-shot calls.',
202
+ '- For teammate tellasks, default to `tellask` and continue with the same `sessionSlug`; use `tellaskSessionless` only when a one-shot is truly sufficient and later assignment updates / early wrap-up are not needed.',
196
203
  '- Mandatory exception precedence: `tellaskBack` is ask-back-only and outside the teammate-session default; it does not carry `sessionSlug`.',
197
204
  ],
198
205
  }),
@@ -257,14 +264,14 @@ function buildTellaskInteractionRules(language) {
257
264
  zh: [
258
265
  '- `tellaskBack`:仅用于支线回问上游诉请者。',
259
266
  '- `tellask`:用于可恢复的长线诉请(必须提供 `targetAgentId` / `sessionSlug` / `tellaskContent`)。',
260
- '- `tellaskSessionless`:用于一次性诉请(必须提供 `targetAgentId` / `tellaskContent`)。',
267
+ '- `tellaskSessionless`:用于一次性诉请(必须提供 `targetAgentId` / `tellaskContent`);它不会建立可更新的任务安排通道,后续再次调用只会新开支线,不会影响旧支线继续执行。',
261
268
  '- `askHuman`:用于 Q4H(向人类请求必要澄清/决策/授权/缺失输入)。',
262
269
  '- `freshBootsReasoning`:用于发起扪心自问(FBR)支线(`tellaskContent` 必填,`effort` 可选)。',
263
270
  ],
264
271
  en: [
265
272
  '- `tellaskBack`: ask back upstream from a sideline dialog only.',
266
273
  '- `tellask`: resumable tellask (requires `targetAgentId` / `sessionSlug` / `tellaskContent`).',
267
- '- `tellaskSessionless`: one-shot tellask (requires `targetAgentId` / `tellaskContent`).',
274
+ '- `tellaskSessionless`: one-shot tellask (requires `targetAgentId` / `tellaskContent`); it does not create an assignment-update channel, and later calls create new sidelines instead of affecting the earlier one.',
268
275
  '- `askHuman`: Q4H for necessary clarification/decision/authorization/missing input.',
269
276
  '- `freshBootsReasoning`: starts an FBR sideline dialog (requires `tellaskContent`, optional `effort`).',
270
277
  ],
package/dist/problems.js CHANGED
@@ -138,6 +138,8 @@ function problemPayloadEqual(a, b) {
138
138
  a.severity === b.severity &&
139
139
  a.source === b.source &&
140
140
  a.message === b.message &&
141
+ JSON.stringify(a.messageI18n) === JSON.stringify(b.messageI18n) &&
142
+ JSON.stringify(a.detailTextI18n) === JSON.stringify(b.detailTextI18n) &&
141
143
  JSON.stringify(a.detail) === JSON.stringify(b.detail));
142
144
  }
143
145
  function problemRecordsEqual(a, b) {
@@ -157,6 +157,10 @@ function formatReminderItemGuide(language, index, content, options) {
157
157
  // to keep reminder ownership/management loosely coupled and extensible.
158
158
  const metaValue = options && 'meta' in options ? options.meta : undefined;
159
159
  const isContinuationPackageReminder = isRecord(metaValue) && metaValue['kind'] === 'continuation_package';
160
+ const isPendingTellaskReminder = isRecord(metaValue) && metaValue['kind'] === 'pending_tellask';
161
+ const pendingTellaskCount = isPendingTellaskReminder && typeof metaValue['pendingCount'] === 'number'
162
+ ? metaValue['pendingCount']
163
+ : undefined;
160
164
  const managerValue = isRecord(metaValue) ? metaValue['manager'] : undefined;
161
165
  const managementTool = isRecord(managerValue) && typeof managerValue['tool'] === 'string'
162
166
  ? managerValue['tool'].trim()
@@ -177,10 +181,14 @@ function formatReminderItemGuide(language, index, content, options) {
177
181
  const deleteInstruction = language === 'zh'
178
182
  ? deleteAltInstruction
179
183
  ? `如果我要删除这条提醒项,不能用 delete_reminder;请执行:${deleteAltInstruction}`
180
- : `如果我要删除这条提醒项,可执行:delete_reminder({ "reminder_no": ${index} })`
184
+ : isPendingTellaskReminder && pendingTellaskCount === 0
185
+ ? `如果我已确认这里只是清理噪音、并非要推进动作,可执行:delete_reminder({ "reminder_no": ${index} })`
186
+ : `如果我要删除这条提醒项,可执行:delete_reminder({ "reminder_no": ${index} })`
181
187
  : deleteAltInstruction
182
188
  ? `If I need to delete this reminder, I must not use delete_reminder; run: ${deleteAltInstruction}`
183
- : `If I need to delete this reminder, run: delete_reminder({ "reminder_no": ${index} })`;
189
+ : isPendingTellaskReminder && pendingTellaskCount === 0
190
+ ? `If I have confirmed this is only noise cleanup and not an action step, I may run: delete_reminder({ "reminder_no": ${index} })`
191
+ : `If I need to delete this reminder, run: delete_reminder({ "reminder_no": ${index} })`;
184
192
  if (language === 'zh') {
185
193
  if (managementTool) {
186
194
  const updateInstructionSafe = updateInstruction ?? `${managementTool}({ ... })`;
@@ -125,6 +125,10 @@ function parseDialogStatusKind(raw) {
125
125
  }
126
126
  return null;
127
127
  }
128
+ async function detectWaitingForFreshBootsReasoning(dialogId, status) {
129
+ const pending = await persistence_1.DialogPersistence.loadPendingSubdialogs(dialogId, status);
130
+ return pending.some((entry) => entry.callName === 'freshBootsReasoning');
131
+ }
128
132
  function buildPrimingWarningSummary(warnings) {
129
133
  if (warnings.length === 0)
130
134
  return undefined;
@@ -1958,6 +1962,7 @@ async function handleGetTeamConfig(res) {
1958
1962
  provider: m.provider,
1959
1963
  model: m.model,
1960
1964
  gofor: m.gofor,
1965
+ nogo: m.nogo,
1961
1966
  toolsets: m.toolsets,
1962
1967
  tools: m.tools,
1963
1968
  icon: m.icon,
@@ -1998,6 +2003,7 @@ async function handleGetDialogs(res, status) {
1998
2003
  continue;
1999
2004
  // Load latest.yaml for currentCourse and lastModified timestamp
2000
2005
  const latest = await persistence_1.DialogPersistence.loadDialogLatest(new dialog_1.DialogID(id), status);
2006
+ const waitingForFreshBootsReasoning = await detectWaitingForFreshBootsReasoning(new dialog_1.DialogID(id), status);
2001
2007
  // Count subdialogs for this root dialog
2002
2008
  const rootPath = persistence_1.DialogPersistence.getRootDialogPath(new dialog_1.DialogID(id), status);
2003
2009
  const subPath = path.join(rootPath, 'subdialogs');
@@ -2011,6 +2017,7 @@ async function handleGetDialogs(res, status) {
2011
2017
  createdAt: meta.createdAt,
2012
2018
  lastModified: latest?.lastModified || meta.createdAt,
2013
2019
  displayState: latest?.displayState,
2020
+ waitingForFreshBootsReasoning,
2014
2021
  subdialogCount,
2015
2022
  });
2016
2023
  }
@@ -2099,6 +2106,7 @@ async function handleGetDialogHierarchy(res, rootId, status) {
2099
2106
  createdAt: rootMeta.createdAt,
2100
2107
  lastModified: rootLatest?.lastModified || rootMeta.createdAt,
2101
2108
  displayState: rootLatest?.displayState,
2109
+ waitingForFreshBootsReasoning: await detectWaitingForFreshBootsReasoning(new dialog_1.DialogID(rootId), status),
2102
2110
  };
2103
2111
  let subdialogs = [];
2104
2112
  const dialogIds = await persistence_1.DialogPersistence.listAllDialogIds(status);
@@ -2111,6 +2119,7 @@ async function handleGetDialogHierarchy(res, rootId, status) {
2111
2119
  continue;
2112
2120
  }
2113
2121
  const subLatest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, status);
2122
+ const waitingForFreshBootsReasoning = await detectWaitingForFreshBootsReasoning(dialogId, status);
2114
2123
  const derivedSupdialogId = meta.assignmentFromSup?.callerDialogId &&
2115
2124
  meta.assignmentFromSup.callerDialogId.trim() !== ''
2116
2125
  ? meta.assignmentFromSup.callerDialogId
@@ -2130,6 +2139,7 @@ async function handleGetDialogHierarchy(res, rootId, status) {
2130
2139
  displayState: subLatest?.displayState,
2131
2140
  sessionSlug: meta.sessionSlug,
2132
2141
  assignmentFromSup: meta.assignmentFromSup,
2142
+ waitingForFreshBootsReasoning,
2133
2143
  });
2134
2144
  }
2135
2145
  respondJson(res, 200, {
package/dist/team.d.ts CHANGED
@@ -60,7 +60,8 @@ export declare namespace Team {
60
60
  name: string;
61
61
  provider?: string;
62
62
  model?: string;
63
- gofor?: string[] | Record<string, string>;
63
+ gofor?: string | string[] | Record<string, string>;
64
+ nogo?: string | string[] | Record<string, string>;
64
65
  toolsets?: string[];
65
66
  tools?: string[];
66
67
  model_params?: ModelParams;
@@ -84,7 +85,8 @@ export declare namespace Team {
84
85
  name: string;
85
86
  provider?: string;
86
87
  model?: string;
87
- gofor?: string[] | Record<string, string>;
88
+ gofor?: string | string[] | Record<string, string>;
89
+ nogo?: string | string[] | Record<string, string>;
88
90
  toolsets?: string[];
89
91
  tools?: string[];
90
92
  model_params?: ModelParams;
@@ -107,7 +109,8 @@ export declare namespace Team {
107
109
  setName(name: string): void;
108
110
  setProvider(provider: string | undefined): void;
109
111
  setModel(model: string | undefined): void;
110
- setGofor(gofor: string[] | Record<string, string> | undefined): void;
112
+ setGofor(gofor: string | string[] | Record<string, string> | undefined): void;
113
+ setNogo(nogo: string | string[] | Record<string, string> | undefined): void;
111
114
  setToolsets(toolsets: string[] | undefined): void;
112
115
  setTools(tools: string[] | undefined): void;
113
116
  setModelParams(modelParams: ModelParams | undefined): void;
@@ -147,7 +150,7 @@ export declare namespace Team {
147
150
  }): Promise<readonly string[]>;
148
151
  export function load(): Promise<Team>;
149
152
  export const TEAM_YAML_ROOT_KEYS: readonly ["member_defaults", "default_responder", "shell_specialists", "members"];
150
- export const TEAM_YAML_MEMBER_KEYS: readonly ["name", "from", "use", "import", "provider", "model", "gofor", "toolsets", "tools", "model_params", "fbr-effort", "fbr_effort", "fbr_model_params", "diligence-push-max", "diligence_push_max", "read_dirs", "write_dirs", "no_read_dirs", "no_write_dirs", "read_file_ext_names", "write_file_ext_names", "no_read_file_ext_names", "no_write_file_ext_names", "icon", "streaming", "hidden"];
153
+ export const TEAM_YAML_MEMBER_KEYS: readonly ["name", "from", "use", "import", "provider", "model", "gofor", "nogo", "toolsets", "tools", "model_params", "fbr-effort", "fbr_effort", "fbr_model_params", "diligence-push-max", "diligence_push_max", "read_dirs", "write_dirs", "no_read_dirs", "no_write_dirs", "read_file_ext_names", "write_file_ext_names", "no_read_file_ext_names", "no_write_file_ext_names", "icon", "streaming", "hidden"];
151
154
  export const TEAM_YAML_MODEL_PARAMS_ROOT_KEYS: readonly ["max_tokens", "json_response", "general", "codex", "openai", "anthropic"];
152
155
  export const TEAM_YAML_MODEL_PARAMS_GENERAL_KEYS: readonly ["max_tokens"];
153
156
  export const TEAM_YAML_MODEL_PARAMS_OPENAI_KEYS: readonly ["temperature", "max_tokens", "service_tier", "top_p", "frequency_penalty", "presence_penalty", "seed", "logprobs", "top_logprobs", "stop", "logit_bias", "user", "reasoning_effort", "reasoning_summary", "verbosity", "parallel_tool_calls", "web_search", "json_response"];