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.
- package/dist/docs/dialog-system.md +3 -0
- package/dist/docs/dialog-system.zh.md +3 -0
- package/dist/docs/dominds-terminology.md +3 -0
- package/dist/docs/tellask-collab.md +6 -0
- package/dist/docs/tellask-collab.zh.md +6 -0
- package/dist/docs/txt-editing-tools.md +2 -1
- package/dist/docs/txt-editing-tools.zh.md +2 -1
- package/dist/llm/kernel-driver/drive.js +74 -30
- package/dist/minds/system-prompt.js +32 -25
- package/dist/problems.js +2 -0
- package/dist/runtime/driver-messages.js +10 -2
- package/dist/server/api-routes.js +10 -0
- package/dist/team.d.ts +7 -4
- package/dist/team.js +236 -9
- package/dist/tools/pending-tellask-reminder.js +26 -8
- package/dist/tools/prompts/ws_mod/en/principles.md +1 -1
- package/dist/tools/prompts/ws_mod/en/tools.md +1 -0
- package/dist/tools/prompts/ws_mod/zh/principles.md +1 -1
- package/dist/tools/prompts/ws_mod/zh/tools.md +1 -0
- package/dist/tools/prompts/ws_mod.en.md +1 -1
- package/dist/tools/prompts/ws_mod.zh.md +1 -1
- package/dist/tools/team_mgmt.js +22 -10
- package/dist/tools/txt.js +4 -15
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-BTmAP1yh.js → _basePickBy-D4e8HPXg.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-BTmAP1yh.js.map → _basePickBy-D4e8HPXg.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-BkA36GAM.js → _baseUniq-D3NO53o9.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-BkA36GAM.js.map → _baseUniq-D3NO53o9.js.map} +1 -1
- package/webapp/dist/assets/{arc-BBz5hYKW.js → arc-DJXAFkV5.js} +2 -2
- package/webapp/dist/assets/{arc-BBz5hYKW.js.map → arc-DJXAFkV5.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CmJwv_ml.js → architectureDiagram-2XIMDMQ5-BUV1jSp7.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CmJwv_ml.js.map → architectureDiagram-2XIMDMQ5-BUV1jSp7.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Ts7Hwgip.js → blockDiagram-WCTKOSBZ-YsCUyoV2.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Ts7Hwgip.js.map → blockDiagram-WCTKOSBZ-YsCUyoV2.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-BqLDJw6g.js → c4Diagram-IC4MRINW-ef4SiFoU.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-BqLDJw6g.js.map → c4Diagram-IC4MRINW-ef4SiFoU.js.map} +1 -1
- package/webapp/dist/assets/{channel-Dw01CGfa.js → channel-F-a_58aT.js} +2 -2
- package/webapp/dist/assets/{channel-Dw01CGfa.js.map → channel-F-a_58aT.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-vYSDvcqd.js → chunk-4BX2VUAB-B2nr4ki0.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-vYSDvcqd.js.map → chunk-4BX2VUAB-B2nr4ki0.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-DtJVXukR.js → chunk-55IACEB6-C58gNCa3.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-DtJVXukR.js.map → chunk-55IACEB6-C58gNCa3.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-CQ54RPGO.js → chunk-FMBD7UC4-DKkNEljt.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-CQ54RPGO.js.map → chunk-FMBD7UC4-DKkNEljt.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-BdacBw09.js → chunk-JSJVCQXG-CGudn0go.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-BdacBw09.js.map → chunk-JSJVCQXG-CGudn0go.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-DYdGOMBz.js → chunk-KX2RTZJC-CKyXsodD.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-DYdGOMBz.js.map → chunk-KX2RTZJC-CKyXsodD.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-CAkAZBmM.js → chunk-NQ4KR5QH-BfmmdiGT.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-CAkAZBmM.js.map → chunk-NQ4KR5QH-BfmmdiGT.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-OzVsAi4S.js → chunk-QZHKN3VN-DNM5LBtS.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-OzVsAi4S.js.map → chunk-QZHKN3VN-DNM5LBtS.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-fguokweJ.js → chunk-WL4C6EOR-D8SI8pt9.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-fguokweJ.js.map → chunk-WL4C6EOR-D8SI8pt9.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-QGMFe0Es.js → classDiagram-VBA2DB6C-D3FqB_Pt.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-QGMFe0Es.js.map → classDiagram-VBA2DB6C-D3FqB_Pt.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-QGMFe0Es.js → classDiagram-v2-RAHNMMFH-D3FqB_Pt.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-QGMFe0Es.js.map → classDiagram-v2-RAHNMMFH-D3FqB_Pt.js.map} +1 -1
- package/webapp/dist/assets/{clone-r2fKknvV.js → clone-BUUHbHWP.js} +2 -2
- package/webapp/dist/assets/{clone-r2fKknvV.js.map → clone-BUUHbHWP.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Cag1LFBF.js → cose-bilkent-S5V4N54A-DaeIKBou.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Cag1LFBF.js.map → cose-bilkent-S5V4N54A-DaeIKBou.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-BoRbJZ_3.js → dagre-KLK3FWXG-D8Q4W86V.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-BoRbJZ_3.js.map → dagre-KLK3FWXG-D8Q4W86V.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-C4LMoK7F.js → diagram-E7M64L7V-r0zYbLYT.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-C4LMoK7F.js.map → diagram-E7M64L7V-r0zYbLYT.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-Coi8p0U_.js → diagram-IFDJBPK2-szokDrE6.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-Coi8p0U_.js.map → diagram-IFDJBPK2-szokDrE6.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-rYtOHq-X.js → diagram-P4PSJMXO-CLPxxRPD.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-rYtOHq-X.js.map → diagram-P4PSJMXO-CLPxxRPD.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-DdjP8gqj.js → erDiagram-INFDFZHY-B9UtzgLz.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-DdjP8gqj.js.map → erDiagram-INFDFZHY-B9UtzgLz.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgFoNe1-.js → flowDiagram-PKNHOUZH-DKh6YNZ2.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgFoNe1-.js.map → flowDiagram-PKNHOUZH-DKh6YNZ2.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CMEzfhH3.js → ganttDiagram-A5KZAMGK-LeXR30gk.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CMEzfhH3.js.map → ganttDiagram-A5KZAMGK-LeXR30gk.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-viKRvjr0.js → gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-viKRvjr0.js.map → gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js.map} +1 -1
- package/webapp/dist/assets/{graph-gVpOg_lE.js → graph-Dp4sOMhl.js} +3 -3
- package/webapp/dist/assets/{graph-gVpOg_lE.js.map → graph-Dp4sOMhl.js.map} +1 -1
- package/webapp/dist/assets/{index-tcVhUj6_.js → index-DQHhQbf3.js} +322 -61
- package/webapp/dist/assets/index-DQHhQbf3.js.map +1 -0
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-P0b1XoV1.js → infoDiagram-LFFYTUFH-I-SK7jTK.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-P0b1XoV1.js.map → infoDiagram-LFFYTUFH-I-SK7jTK.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-D40APktA.js → ishikawaDiagram-PHBUUO56-Dq6VgWn-.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-D40APktA.js.map → ishikawaDiagram-PHBUUO56-Dq6VgWn-.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-D6aNNJVd.js → journeyDiagram-4ABVD52K-DRx1eYmm.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-D6aNNJVd.js.map → journeyDiagram-4ABVD52K-DRx1eYmm.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DQKvYmMb.js → kanban-definition-K7BYSVSG-uuizP_jn.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DQKvYmMb.js.map → kanban-definition-K7BYSVSG-uuizP_jn.js.map} +1 -1
- package/webapp/dist/assets/{layout-FpBDmPYH.js → layout-BPS5Z_Mh.js} +5 -5
- package/webapp/dist/assets/{layout-FpBDmPYH.js.map → layout-BPS5Z_Mh.js.map} +1 -1
- package/webapp/dist/assets/{linear-peqpVuLQ.js → linear-C2pv6VZd.js} +2 -2
- package/webapp/dist/assets/{linear-peqpVuLQ.js.map → linear-C2pv6VZd.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-CwvIH34J.js → mindmap-definition-YRQLILUH-DmztmMq2.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-CwvIH34J.js.map → mindmap-definition-YRQLILUH-DmztmMq2.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-lM7j5Uhe.js → pieDiagram-SKSYHLDU-B9-E1cph.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-lM7j5Uhe.js.map → pieDiagram-SKSYHLDU-B9-E1cph.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D7UU9Dp-.js → quadrantDiagram-337W2JSQ-y8snLk0o.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D7UU9Dp-.js.map → quadrantDiagram-337W2JSQ-y8snLk0o.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CsJFJ-cl.js → requirementDiagram-Z7DCOOCP-DpqFFg69.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CsJFJ-cl.js.map → requirementDiagram-Z7DCOOCP-DpqFFg69.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Dl4-eWCT.js → sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Dl4-eWCT.js.map → sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Bu3kNgJ9.js → sequenceDiagram-2WXFIKYE-D-qxDD9y.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Bu3kNgJ9.js.map → sequenceDiagram-2WXFIKYE-D-qxDD9y.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-CadfG4Au.js → stateDiagram-RAJIS63D-DuuYaUrj.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-CadfG4Au.js.map → stateDiagram-RAJIS63D-DuuYaUrj.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-CabV9tQH.js → stateDiagram-v2-FVOUBMTO-Du-pyDZk.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-CabV9tQH.js.map → stateDiagram-v2-FVOUBMTO-Du-pyDZk.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-XqBsdE-B.js → timeline-definition-YZTLITO2-egNUbGCq.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-XqBsdE-B.js.map → timeline-definition-YZTLITO2-egNUbGCq.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-Cc-MHIad.js → treemap-KZPCXAKY-B5iVcLdl.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-Cc-MHIad.js.map → treemap-KZPCXAKY-B5iVcLdl.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DPu_jSWi.js → vennDiagram-LZ73GAT5-Krw2StjR.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DPu_jSWi.js.map → vennDiagram-LZ73GAT5-Krw2StjR.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-8Dh_0DI4.js → xychartDiagram-JWTSCODW-C-gGxToR.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-8Dh_0DI4.js.map → xychartDiagram-JWTSCODW-C-gGxToR.js.map} +1 -1
- package/webapp/dist/index.html +1 -1
- 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
|
-
|
|
723
|
-
|
|
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,
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
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-
|
|
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
|
|
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
|
|
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
|
-
:
|
|
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
|
-
:
|
|
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"];
|