dominds 0.7.1 → 0.7.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/dialog-global-registry.js +58 -3
- package/dist/dialog.js +17 -0
- package/dist/docs/dialog-system.md +18 -16
- package/dist/docs/dialog-system.zh.md +20 -19
- package/dist/evt-registry.js +16 -7
- package/dist/llm/driver-v2/context.js +2 -1
- package/dist/llm/driver-v2/core.js +102 -119
- package/dist/llm/driver-v2/orchestrator.js +65 -38
- package/dist/llm/driver-v2/round.js +213 -35
- package/dist/llm/driver-v2/runtime-utils.js +1 -0
- package/dist/llm/driver-v2/supdialog-response.js +5 -18
- package/dist/llm/driver-v2/tellask-bridge.js +95 -6
- package/dist/llm/driver.js +29 -2
- package/dist/minds/builtin/cmdr/persona.md +3 -0
- package/dist/minds/builtin/dijiang/knowledge.md +287 -0
- package/dist/minds/builtin/dijiang/persona.md +7 -0
- package/dist/persistence.js +28 -0
- package/dist/server/websocket-handler.js +134 -25
- package/dist/shared/diligence.js +8 -2
- package/dist/showing-by-doing.js +31 -34
- package/dist/static/assets/{_baseUniq-BxKNVs_E.js → _baseUniq-zV3pyJ-s.js} +2 -2
- package/dist/static/assets/{_baseUniq-BxKNVs_E.js.map → _baseUniq-zV3pyJ-s.js.map} +1 -1
- package/dist/static/assets/{arc-SobL0GO-.js → arc-Ctgmrh71.js} +2 -2
- package/dist/static/assets/{arc-SobL0GO-.js.map → arc-Ctgmrh71.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js → architectureDiagram-VXUJARFQ-CAH1Zinn.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js.map → architectureDiagram-VXUJARFQ-CAH1Zinn.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js → blockDiagram-VD42YOAC-Djz6JdD2.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js.map → blockDiagram-VD42YOAC-Djz6JdD2.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js → c4Diagram-YG6GDRKO-CSuskOyq.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js.map → c4Diagram-YG6GDRKO-CSuskOyq.js.map} +1 -1
- package/dist/static/assets/{channel-CNJ5IKbI.js → channel-Ym6U59Kh.js} +2 -2
- package/dist/static/assets/{channel-CNJ5IKbI.js.map → channel-Ym6U59Kh.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js → chunk-4BX2VUAB-CqbVylSz.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js.map → chunk-4BX2VUAB-CqbVylSz.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js → chunk-55IACEB6-CeWj8Jm_.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js.map → chunk-55IACEB6-CeWj8Jm_.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js → chunk-B4BG7PRW-BjxJkuhq.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js.map → chunk-B4BG7PRW-BjxJkuhq.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js → chunk-DI55MBZ5-9kxfXB4B.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js.map → chunk-DI55MBZ5-9kxfXB4B.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js → chunk-FMBD7UC4-DyM3IVWB.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js.map → chunk-FMBD7UC4-DyM3IVWB.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js → chunk-QN33PNHL-DGU21aEB.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js.map → chunk-QN33PNHL-DGU21aEB.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js → chunk-QZHKN3VN-Cw9Hpt-y.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js.map → chunk-QZHKN3VN-Cw9Hpt-y.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js → chunk-TZMSLE5B-J-eTCnFj.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js.map → chunk-TZMSLE5B-J-eTCnFj.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js → classDiagram-2ON5EDUG-BvoDAd8E.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js.map → classDiagram-2ON5EDUG-BvoDAd8E.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js → classDiagram-v2-WZHVMYZB-BvoDAd8E.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js.map → classDiagram-v2-WZHVMYZB-BvoDAd8E.js.map} +1 -1
- package/dist/static/assets/{clone-CfBpi3MU.js → clone-CojsCkky.js} +2 -2
- package/dist/static/assets/{clone-CfBpi3MU.js.map → clone-CojsCkky.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js → cose-bilkent-S5V4N54A-BEtK3OcG.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js.map → cose-bilkent-S5V4N54A-BEtK3OcG.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js → dagre-6UL2VRFP-C5DMaVj0.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js.map → dagre-6UL2VRFP-C5DMaVj0.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js → diagram-PSM6KHXK-kVP0dZ6K.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js.map → diagram-PSM6KHXK-kVP0dZ6K.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js → diagram-QEK2KX5R-C4p2yibe.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js.map → diagram-QEK2KX5R-C4p2yibe.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js → diagram-S2PKOQOG-B3vObsYY.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js.map → diagram-S2PKOQOG-B3vObsYY.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js → erDiagram-Q2GNP2WA-AKQItpVu.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js.map → erDiagram-Q2GNP2WA-AKQItpVu.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js → flowDiagram-NV44I4VS-2dalJoL3.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js.map → flowDiagram-NV44I4VS-2dalJoL3.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js → ganttDiagram-JELNMOA3-DUw98Lbz.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js.map → ganttDiagram-JELNMOA3-DUw98Lbz.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js → gitGraphDiagram-NY62KEGX-DdwIFk8M.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js.map → gitGraphDiagram-NY62KEGX-DdwIFk8M.js.map} +1 -1
- package/dist/static/assets/{graph-K6mmQESm.js → graph-BBEAP9Z9.js} +3 -3
- package/dist/static/assets/{graph-K6mmQESm.js.map → graph-BBEAP9Z9.js.map} +1 -1
- package/dist/static/assets/{index-RV1MEt3b.js → index-CqMOe9zt.js} +195 -114
- package/dist/static/assets/index-CqMOe9zt.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js → infoDiagram-WHAUD3N6-Cep11ST9.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js.map → infoDiagram-WHAUD3N6-Cep11ST9.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js.map → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js → kanban-definition-3W4ZIXB7-DhxNBORX.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js.map → kanban-definition-3W4ZIXB7-DhxNBORX.js.map} +1 -1
- package/dist/static/assets/{layout-BcrPlYah.js → layout-Ckbr6Zyz.js} +5 -5
- package/dist/static/assets/{layout-BcrPlYah.js.map → layout-Ckbr6Zyz.js.map} +1 -1
- package/dist/static/assets/{linear-DYXbzldi.js → linear-BrSsI51I.js} +2 -2
- package/dist/static/assets/{linear-DYXbzldi.js.map → linear-BrSsI51I.js.map} +1 -1
- package/dist/static/assets/{min-CAfJrdkg.js → min-CeEvLc8D.js} +3 -3
- package/dist/static/assets/{min-CAfJrdkg.js.map → min-CeEvLc8D.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js → mindmap-definition-VGOIOE7T-7ctLd3o3.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js.map → mindmap-definition-VGOIOE7T-7ctLd3o3.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js → pieDiagram-ADFJNKIX-CqyILziW.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js.map → pieDiagram-ADFJNKIX-CqyILziW.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js → quadrantDiagram-AYHSOK5B-Byi_xYum.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js.map → quadrantDiagram-AYHSOK5B-Byi_xYum.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js.map → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js → sankeyDiagram-TZEHDZUN-DzoUAdfa.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js.map → sankeyDiagram-TZEHDZUN-DzoUAdfa.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js → sequenceDiagram-WL72ISMW-BKKxpG1m.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js.map → sequenceDiagram-WL72ISMW-BKKxpG1m.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js → stateDiagram-FKZM4ZOC-B-J7uRZT.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js.map → stateDiagram-FKZM4ZOC-B-J7uRZT.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js → stateDiagram-v2-4FDKWEC3-BOzmoUba.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js.map → stateDiagram-v2-4FDKWEC3-BOzmoUba.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js → timeline-definition-IT6M3QCI-zu1Rojx9.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js.map → timeline-definition-IT6M3QCI-zu1Rojx9.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js → treemap-KMMF4GRG-C4D91awC.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js.map → treemap-KMMF4GRG-C4D91awC.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js → xychartDiagram-PRI3JC2R-YvLKaPZ-.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js.map → xychartDiagram-PRI3JC2R-YvLKaPZ-.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/tools/context-health.js +7 -7
- package/dist/utils/task-doc.js +16 -16
- package/package.json +1 -1
- package/dist/docs/keep-going.zh.md +0 -162
- package/dist/docs/showing-by-doing.md +0 -208
- package/dist/docs/showing-by-doing.zh.md +0 -177
- package/dist/minds/promptdocs.js +0 -263
- package/dist/snippets/README.en.md +0 -3
- package/dist/static/assets/index-RV1MEt3b.js.map +0 -1
package/dist/llm/driver.js
CHANGED
|
@@ -2782,6 +2782,33 @@ async function updateSubdialogAssignment(subdialog, assignment) {
|
|
|
2782
2782
|
subdialog.assignmentFromSup = assignment;
|
|
2783
2783
|
await persistence_1.DialogPersistence.updateSubdialogAssignment(subdialog.id, assignment);
|
|
2784
2784
|
}
|
|
2785
|
+
async function lookupLiveRegisteredSubdialog(rootDialog, agentId, tellaskSession) {
|
|
2786
|
+
const existing = rootDialog.lookupSubdialog(agentId, tellaskSession);
|
|
2787
|
+
if (!existing) {
|
|
2788
|
+
return undefined;
|
|
2789
|
+
}
|
|
2790
|
+
const existingSession = existing.tellaskSession;
|
|
2791
|
+
if (!existingSession) {
|
|
2792
|
+
throw new Error(`Type B registry invariant violation: lookupSubdialog returned entry without tellaskSession (root=${rootDialog.id.valueOf()} sub=${existing.id.valueOf()})`);
|
|
2793
|
+
}
|
|
2794
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(existing.id, rootDialog.status);
|
|
2795
|
+
const runState = latest?.runState;
|
|
2796
|
+
if (!runState || runState.kind !== 'dead') {
|
|
2797
|
+
return existing;
|
|
2798
|
+
}
|
|
2799
|
+
const removed = rootDialog.unregisterSubdialog(existing.agentId, existingSession);
|
|
2800
|
+
if (!removed) {
|
|
2801
|
+
throw new Error(`Failed to unregister dead registered subdialog: root=${rootDialog.id.valueOf()} sub=${existing.id.valueOf()} session=${existingSession}`);
|
|
2802
|
+
}
|
|
2803
|
+
await rootDialog.saveSubdialogRegistry();
|
|
2804
|
+
log_1.log.info('Pruned dead registered subdialog from Type B registry', undefined, {
|
|
2805
|
+
rootId: rootDialog.id.rootId,
|
|
2806
|
+
subdialogId: existing.id.selfId,
|
|
2807
|
+
agentId: existing.agentId,
|
|
2808
|
+
tellaskSession: existingSession,
|
|
2809
|
+
});
|
|
2810
|
+
return undefined;
|
|
2811
|
+
}
|
|
2785
2812
|
let agentPrimingModulePromise = null;
|
|
2786
2813
|
async function scheduleInheritedAgentPrimingForSubdialog(callerDialog, subdialog) {
|
|
2787
2814
|
const rootDialog = callerDialog instanceof dialog_1.RootDialog
|
|
@@ -3575,7 +3602,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
|
|
|
3575
3602
|
callId,
|
|
3576
3603
|
collectiveTargets: options?.collectiveTargets ?? [parseResult.agentId],
|
|
3577
3604
|
};
|
|
3578
|
-
const existing = rootDialog
|
|
3605
|
+
const existing = await lookupLiveRegisteredSubdialog(rootDialog, parseResult.agentId, derivedSession);
|
|
3579
3606
|
if (existing) {
|
|
3580
3607
|
try {
|
|
3581
3608
|
await updateSubdialogAssignment(existing, assignment);
|
|
@@ -3847,7 +3874,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
|
|
|
3847
3874
|
};
|
|
3848
3875
|
const pendingOwner = callerDialog;
|
|
3849
3876
|
const result = await withSuspensionStateLock(rootDialog.id, async () => {
|
|
3850
|
-
const existing = rootDialog
|
|
3877
|
+
const existing = await lookupLiveRegisteredSubdialog(rootDialog, parseResult.agentId, parseResult.tellaskSession);
|
|
3851
3878
|
if (existing) {
|
|
3852
3879
|
try {
|
|
3853
3880
|
await updateSubdialogAssignment(existing, assignment);
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
## Team Definition
|
|
2
|
+
|
|
3
|
+
The team definition lives in `.minds/team.yaml`. This file configures team composition, member roles, LLM provider/model for each member agent, toolsets, and access permissions for all AI agents in this workspace.
|
|
4
|
+
|
|
5
|
+
### Structure Overview
|
|
6
|
+
|
|
7
|
+
The `team.yaml` file has three main sections:
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
member_defaults: { ... } # Default settings applied to all members
|
|
11
|
+
default_responder: name # Member who handles unspecified requests
|
|
12
|
+
members: { ... } # Individual member configurations
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Member Configuration Properties
|
|
16
|
+
|
|
17
|
+
Each member supports these properties:
|
|
18
|
+
|
|
19
|
+
| Property | Type | Description |
|
|
20
|
+
| --------------- | ------- | --------------------------------------------------------------------------- |
|
|
21
|
+
| `name` | string | Display name for the member |
|
|
22
|
+
| `icon` | string | Emoji identifier for UI display |
|
|
23
|
+
| `gofor` | list | Responsibilities and primary duties |
|
|
24
|
+
| `provider` | string | LLM provider key from `llm.yaml` |
|
|
25
|
+
| `model` | string | Model name within the provider |
|
|
26
|
+
| `toolsets` | list | Capability groups: `memory`, `ws_read`, `ws_mod`, `team_memory` |
|
|
27
|
+
| `tools` | list | Specific tool names: `shell_cmd`, `git`, `stop_daemon`, `get_daemon_output` |
|
|
28
|
+
| `streaming` | boolean | Enable/disable streaming mode (required for shell tools) |
|
|
29
|
+
| `read_dirs` | list | Allowed read directories (glob patterns) |
|
|
30
|
+
| `no_read_dirs` | list | Explicitly denied read directories |
|
|
31
|
+
| `write_dirs` | list | Allowed write directories (glob patterns) |
|
|
32
|
+
| `no_write_dirs` | list | Explicitly denied write directories |
|
|
33
|
+
|
|
34
|
+
## LLM Configuration
|
|
35
|
+
|
|
36
|
+
### Builtin Defaults
|
|
37
|
+
|
|
38
|
+
Common defaults are already supplied:
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
providers:
|
|
42
|
+
codex:
|
|
43
|
+
name: Codex (ChatGPT)
|
|
44
|
+
apiType: codex
|
|
45
|
+
baseUrl: https://chatgpt.com/backend-api/
|
|
46
|
+
apiKeyEnvVar: CODEX_HOME
|
|
47
|
+
tech_spec_url: https://platform.openai.com/docs/api-reference/responses
|
|
48
|
+
api_mgmt_url: https://chatgpt.com/
|
|
49
|
+
models:
|
|
50
|
+
gpt-5.2-codex:
|
|
51
|
+
name: GPT-5.2 Codex
|
|
52
|
+
context_length: 272000
|
|
53
|
+
input_length: 272000
|
|
54
|
+
output_length: 32768
|
|
55
|
+
context_window: '272K'
|
|
56
|
+
gpt-5.2:
|
|
57
|
+
name: GPT-5.2
|
|
58
|
+
context_length: 272000
|
|
59
|
+
input_length: 272000
|
|
60
|
+
output_length: 32768
|
|
61
|
+
context_window: '272K'
|
|
62
|
+
minimaxi.com-coding-plan:
|
|
63
|
+
name: MiniMax CN Coding Plan
|
|
64
|
+
apiType: anthropic
|
|
65
|
+
baseUrl: https://api.minimaxi.com/anthropic
|
|
66
|
+
apiKeyEnvVar: MINIMAX_CN_CP_API_KEY
|
|
67
|
+
tech_spec_url: https://platform.minimaxi.com/document/guides
|
|
68
|
+
api_mgmt_url: https://platform.minimaxi.com/
|
|
69
|
+
models:
|
|
70
|
+
MiniMax-M2.1:
|
|
71
|
+
name: MiniMax M2.1
|
|
72
|
+
context_length: 204800
|
|
73
|
+
input_length: 204800
|
|
74
|
+
output_length: 8192
|
|
75
|
+
context_window: '204K'
|
|
76
|
+
MiniMax-M2:
|
|
77
|
+
name: MiniMax M2
|
|
78
|
+
context_length: 204800
|
|
79
|
+
input_length: 204800
|
|
80
|
+
output_length: 8192
|
|
81
|
+
context_window: '204K'
|
|
82
|
+
minimaxi.com:
|
|
83
|
+
name: MiniMax CN
|
|
84
|
+
apiType: anthropic
|
|
85
|
+
baseUrl: https://api.minimaxi.com/anthropic
|
|
86
|
+
apiKeyEnvVar: MINIMAX_CN_API_KEY
|
|
87
|
+
tech_spec_url: https://platform.minimaxi.com/document/guides
|
|
88
|
+
api_mgmt_url: https://platform.minimaxi.com/
|
|
89
|
+
models:
|
|
90
|
+
MiniMax-M2.1:
|
|
91
|
+
name: MiniMax M2.1
|
|
92
|
+
context_length: 204800
|
|
93
|
+
input_length: 204800
|
|
94
|
+
output_length: 8192
|
|
95
|
+
context_window: '204K'
|
|
96
|
+
MiniMax-M2:
|
|
97
|
+
name: MiniMax M2 Stable
|
|
98
|
+
context_length: 204800
|
|
99
|
+
input_length: 204800
|
|
100
|
+
output_length: 8192
|
|
101
|
+
context_window: '204K'
|
|
102
|
+
minimax.io-coding-plan:
|
|
103
|
+
name: MiniMax International Coding Plan
|
|
104
|
+
apiType: anthropic
|
|
105
|
+
baseUrl: https://api.minimax.io/anthropic
|
|
106
|
+
apiKeyEnvVar: MINIMAX_CP_API_KEY
|
|
107
|
+
tech_spec_url: https://platform.minimax.io/docs/api-reference
|
|
108
|
+
api_mgmt_url: https://platform.minimax.io/
|
|
109
|
+
models:
|
|
110
|
+
MiniMax-M2.1:
|
|
111
|
+
name: MiniMax M2.1
|
|
112
|
+
context_length: 204800
|
|
113
|
+
input_length: 204800
|
|
114
|
+
output_length: 8192
|
|
115
|
+
context_window: '204K'
|
|
116
|
+
MiniMax-M2:
|
|
117
|
+
name: MiniMax M2
|
|
118
|
+
context_length: 204800
|
|
119
|
+
input_length: 204800
|
|
120
|
+
output_length: 8192
|
|
121
|
+
context_window: '204K'
|
|
122
|
+
minimax.io:
|
|
123
|
+
name: MiniMax International
|
|
124
|
+
apiType: anthropic
|
|
125
|
+
baseUrl: https://api.minimax.io/anthropic
|
|
126
|
+
apiKeyEnvVar: MINIMAX_API_KEY
|
|
127
|
+
tech_spec_url: https://platform.minimax.io/docs/api-reference
|
|
128
|
+
api_mgmt_url: https://platform.minimax.io/
|
|
129
|
+
models:
|
|
130
|
+
MiniMax-M2.1:
|
|
131
|
+
name: MiniMax M2.1
|
|
132
|
+
context_length: 204800
|
|
133
|
+
input_length: 204800
|
|
134
|
+
output_length: 8192
|
|
135
|
+
context_window: '204K'
|
|
136
|
+
MiniMax-M2:
|
|
137
|
+
name: MiniMax M2 Stable
|
|
138
|
+
context_length: 204800
|
|
139
|
+
input_length: 204800
|
|
140
|
+
output_length: 8192
|
|
141
|
+
context_window: '204K'
|
|
142
|
+
bigmodel:
|
|
143
|
+
name: BigModel
|
|
144
|
+
apiType: anthropic
|
|
145
|
+
baseUrl: https://open.bigmodel.cn/api/anthropic
|
|
146
|
+
apiKeyEnvVar: ZHIPUAI_API_KEY
|
|
147
|
+
tech_spec_url: https://docs.bigmodel.cn/
|
|
148
|
+
api_mgmt_url: https://open.bigmodel.cn/usercenter/apikeys
|
|
149
|
+
models:
|
|
150
|
+
glm-4.7:
|
|
151
|
+
name: GLM-4.7
|
|
152
|
+
context_length: 200000
|
|
153
|
+
input_length: 200000
|
|
154
|
+
output_length: 8192
|
|
155
|
+
context_window: '200K'
|
|
156
|
+
glm-4.6:
|
|
157
|
+
name: GLM-4.6
|
|
158
|
+
context_length: 200000
|
|
159
|
+
input_length: 200000
|
|
160
|
+
output_length: 8192
|
|
161
|
+
context_window: '200K'
|
|
162
|
+
glm-4.5:
|
|
163
|
+
name: GLM-4.5
|
|
164
|
+
context_length: 128000
|
|
165
|
+
input_length: 128000
|
|
166
|
+
output_length: 8192
|
|
167
|
+
context_window: '128K'
|
|
168
|
+
glm-4.5-air:
|
|
169
|
+
name: GLM-4.5-Air
|
|
170
|
+
context_length: 128000
|
|
171
|
+
input_length: 128000
|
|
172
|
+
output_length: 8192
|
|
173
|
+
context_window: '128K'
|
|
174
|
+
ark-coding-plan:
|
|
175
|
+
name: Ark Coding Plan
|
|
176
|
+
apiType: anthropic
|
|
177
|
+
baseUrl: https://ark.cn-beijing.volces.com/api/coding
|
|
178
|
+
apiKeyEnvVar: ARK_API_KEY
|
|
179
|
+
tech_spec_url: https://api.volcengine.com/api-docs/view?serviceCode=ark&version=2024-01-01
|
|
180
|
+
api_mgmt_url: https://console.volcengine.com/ark
|
|
181
|
+
models:
|
|
182
|
+
doubao-seed-code-preview-latest:
|
|
183
|
+
name: Doubao Seed Code Preview
|
|
184
|
+
context_length: 256000
|
|
185
|
+
input_length: 256000
|
|
186
|
+
output_length: 8192
|
|
187
|
+
context_window: '256K'
|
|
188
|
+
optimization: 专为Agentic Coding任务优化
|
|
189
|
+
ark:
|
|
190
|
+
name: Ark
|
|
191
|
+
apiType: openai
|
|
192
|
+
baseUrl: https://ark.cn-beijing.volces.com/api/v3
|
|
193
|
+
apiKeyEnvVar: ARK_API_KEY
|
|
194
|
+
tech_spec_url: https://api.volcengine.com/api-docs/view?serviceCode=ark&version=2024-01-01
|
|
195
|
+
api_mgmt_url: https://console.volcengine.com/ark
|
|
196
|
+
models:
|
|
197
|
+
deepseek-v3-2-251201:
|
|
198
|
+
name: DeepSeek-V3.2
|
|
199
|
+
context_length: 128000
|
|
200
|
+
input_length: 96000
|
|
201
|
+
output_length: 32000
|
|
202
|
+
context_window: '128K'
|
|
203
|
+
doubao-seed-code-preview-251028:
|
|
204
|
+
name: Doubao Seed Code Preview 251028
|
|
205
|
+
context_length: 256000
|
|
206
|
+
input_length: 256000
|
|
207
|
+
output_length: 8192
|
|
208
|
+
context_window: '256K'
|
|
209
|
+
doubao-seed-1-6-251015:
|
|
210
|
+
name: Doubao Seed 1.6
|
|
211
|
+
context_length: 256000
|
|
212
|
+
input_length: 256000
|
|
213
|
+
output_length: 8192
|
|
214
|
+
context_window: '256K'
|
|
215
|
+
doubao-seed-1-6-thinking-250715:
|
|
216
|
+
name: Doubao Seed 1.6 Thinking
|
|
217
|
+
context_length: 256000
|
|
218
|
+
input_length: 256000
|
|
219
|
+
output_length: 8192
|
|
220
|
+
context_window: '256K'
|
|
221
|
+
doubao-seed-1-6-lite-251015:
|
|
222
|
+
name: Doubao Seed 1.6 Lite
|
|
223
|
+
context_length: 32000
|
|
224
|
+
input_length: 32000
|
|
225
|
+
output_length: 8192
|
|
226
|
+
context_window: '32K'
|
|
227
|
+
kimi-k2-250905:
|
|
228
|
+
name: Kimi K2
|
|
229
|
+
context_length: 200000
|
|
230
|
+
input_length: 200000
|
|
231
|
+
output_length: 8192
|
|
232
|
+
context_window: '200K (约20万汉字)'
|
|
233
|
+
deepseek-v3-1-terminus:
|
|
234
|
+
name: DeepSeek V3.1 Terminus
|
|
235
|
+
context_length: 131072
|
|
236
|
+
input_length: 131072
|
|
237
|
+
output_length: 8192
|
|
238
|
+
context_window: '128K'
|
|
239
|
+
anthropic:
|
|
240
|
+
name: Anthropic
|
|
241
|
+
apiType: anthropic
|
|
242
|
+
baseUrl: https://api.anthropic.com
|
|
243
|
+
apiKeyEnvVar: ANTHROPIC_API_KEY
|
|
244
|
+
tech_spec_url: https://docs.anthropic.com/en/docs
|
|
245
|
+
api_mgmt_url: https://console.anthropic.com/
|
|
246
|
+
models:
|
|
247
|
+
claude-opus-4.5:
|
|
248
|
+
name: Claude Opus 4.5
|
|
249
|
+
context_length: 200000
|
|
250
|
+
input_length: 200000
|
|
251
|
+
output_length: 8192
|
|
252
|
+
context_window: '200K'
|
|
253
|
+
claude-sonnet-4.5:
|
|
254
|
+
name: Claude Sonnet 4.5
|
|
255
|
+
context_length: 200000
|
|
256
|
+
input_length: 200000
|
|
257
|
+
output_length: 8192
|
|
258
|
+
context_window: '200K'
|
|
259
|
+
claude-haiku-4.5:
|
|
260
|
+
name: Claude Haiku 4.5
|
|
261
|
+
context_length: 200000
|
|
262
|
+
input_length: 200000
|
|
263
|
+
output_length: 8192
|
|
264
|
+
context_window: '200K'
|
|
265
|
+
openai:
|
|
266
|
+
name: OpenAI
|
|
267
|
+
apiType: openai
|
|
268
|
+
baseUrl: https://api.openai.com/v1
|
|
269
|
+
apiKeyEnvVar: OPENAI_API_KEY
|
|
270
|
+
tech_spec_url: https://platform.openai.com/docs
|
|
271
|
+
api_mgmt_url: https://platform.openai.com/api-keys
|
|
272
|
+
models:
|
|
273
|
+
gpt-5.2:
|
|
274
|
+
name: GPT-5.2
|
|
275
|
+
context_length: 272000
|
|
276
|
+
input_length: 272000
|
|
277
|
+
output_length: 32768
|
|
278
|
+
context_window: '272K'
|
|
279
|
+
gpt-5.2-codex:
|
|
280
|
+
name: GPT-5.2 Codex
|
|
281
|
+
context_length: 272000
|
|
282
|
+
input_length: 272000
|
|
283
|
+
output_length: 32768
|
|
284
|
+
context_window: '272K'
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
More custom LLM providers can be configured in `.minds/llm.yaml` with the same format as above.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
You are dijiang, the hundun (chaos) itself. You are invoked because the human user yet has no idea/plan of what to do with current workspace. Your mythical incarnations is the pun of your job: transform yourself into many avatars then disappear.
|
|
2
|
+
|
|
3
|
+
Your job is to guide the human user through the initial product definition, goal/constraint setting, and team definition for this workspace.
|
|
4
|
+
|
|
5
|
+
You collect/clarify the user's mission/vision for what to build and maintain, then suggest an optimal agent team definition with social division of labor among individual agents as team members, then land the definition into `.minds/team.yaml` and `.minds/team/*/*.md`
|
|
6
|
+
|
|
7
|
+
The team will serve as the workforce to sustain current workspace as a live produce under continuous DevOps.
|
package/dist/persistence.js
CHANGED
|
@@ -941,9 +941,26 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
|
|
|
941
941
|
}
|
|
942
942
|
async loadSubdialogRegistry(rootDialog, status) {
|
|
943
943
|
const entries = await DialogPersistence.loadSubdialogRegistry(rootDialog.id, status);
|
|
944
|
+
const shouldPruneDead = status === 'running';
|
|
945
|
+
let prunedDeadRegistryEntries = false;
|
|
944
946
|
for (const entry of entries) {
|
|
945
947
|
if (!entry.tellaskSession)
|
|
946
948
|
continue;
|
|
949
|
+
if (shouldPruneDead) {
|
|
950
|
+
const latest = await DialogPersistence.loadDialogLatest(entry.subdialogId, status);
|
|
951
|
+
const runState = latest?.runState;
|
|
952
|
+
if (runState && runState.kind === 'dead') {
|
|
953
|
+
prunedDeadRegistryEntries = true;
|
|
954
|
+
rootDialog.unregisterSubdialog(entry.agentId, entry.tellaskSession);
|
|
955
|
+
log_1.log.info('Skip dead subdialog while loading Type B registry', undefined, {
|
|
956
|
+
rootId: rootDialog.id.rootId,
|
|
957
|
+
subdialogId: entry.subdialogId.selfId,
|
|
958
|
+
agentId: entry.agentId,
|
|
959
|
+
tellaskSession: entry.tellaskSession,
|
|
960
|
+
});
|
|
961
|
+
continue;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
947
964
|
const existing = rootDialog.lookupDialog(entry.subdialogId.selfId);
|
|
948
965
|
if (existing) {
|
|
949
966
|
if (existing instanceof dialog_1.SubDialog && existing.tellaskSession) {
|
|
@@ -965,6 +982,9 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
|
|
|
965
982
|
});
|
|
966
983
|
rootDialog.registerSubdialog(subdialog);
|
|
967
984
|
}
|
|
985
|
+
if (prunedDeadRegistryEntries) {
|
|
986
|
+
await rootDialog.saveSubdialogRegistry();
|
|
987
|
+
}
|
|
968
988
|
}
|
|
969
989
|
/**
|
|
970
990
|
* Clear Questions for Human state in storage
|
|
@@ -2431,6 +2451,14 @@ class DialogPersistence {
|
|
|
2431
2451
|
throw new Error(`Q4H duplicate call id violation: dialog=${dialogId.valueOf()} status=${status} callId=${normalizedCallId} existingQuestionId=${byCallId.id} incomingQuestionId=${questionId} existingAskedAt=${byCallId.askedAt} incomingAskedAt=${question.askedAt}`);
|
|
2432
2452
|
}
|
|
2433
2453
|
}
|
|
2454
|
+
if (previousQuestions.length > 0) {
|
|
2455
|
+
const existingIds = previousQuestions.map((q) => q.id).join(',');
|
|
2456
|
+
const existingCallIds = previousQuestions
|
|
2457
|
+
.map((q) => (typeof q.callId === 'string' ? q.callId.trim() : ''))
|
|
2458
|
+
.filter((value) => value !== '')
|
|
2459
|
+
.join(',');
|
|
2460
|
+
throw new Error(`Q4H multi-pending violation: dialog=${dialogId.valueOf()} status=${status} existingCount=${previousQuestions.length} existingQuestionIds=${existingIds} existingCallIds=${existingCallIds} incomingQuestionId=${questionId} incomingCallId=${normalizedCallId ?? ''}`);
|
|
2461
|
+
}
|
|
2434
2462
|
return { kind: 'append', question };
|
|
2435
2463
|
}, status);
|
|
2436
2464
|
}
|
|
@@ -11,6 +11,7 @@ const dialog_instance_registry_1 = require("../dialog-instance-registry");
|
|
|
11
11
|
const dialog_run_state_1 = require("../dialog-run-state");
|
|
12
12
|
const evt_registry_1 = require("../evt-registry");
|
|
13
13
|
const driver_entry_1 = require("../llm/driver-entry");
|
|
14
|
+
const runtime_utils_1 = require("../llm/driver-v2/runtime-utils");
|
|
14
15
|
const log_1 = require("../log");
|
|
15
16
|
const persistence_1 = require("../persistence");
|
|
16
17
|
const problems_1 = require("../problems");
|
|
@@ -42,6 +43,14 @@ const wsLiveDlg = new WeakMap();
|
|
|
42
43
|
const wsSub = new WeakMap();
|
|
43
44
|
const wsUiLanguage = new WeakMap();
|
|
44
45
|
let broadcastDialogsIndexMessage = null;
|
|
46
|
+
let broadcastRunControlRefreshMessage = null;
|
|
47
|
+
function emitRunControlRefresh(reason) {
|
|
48
|
+
broadcastRunControlRefreshMessage?.({
|
|
49
|
+
type: 'run_control_refresh',
|
|
50
|
+
reason,
|
|
51
|
+
timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
45
54
|
async function syncPendingTellaskReminderBestEffort(dialog, where) {
|
|
46
55
|
try {
|
|
47
56
|
await (0, pending_tellask_reminder_1.syncPendingTellaskReminderState)(dialog);
|
|
@@ -249,6 +258,18 @@ async function handleDeclareSubdialogDead(ws, packet) {
|
|
|
249
258
|
}
|
|
250
259
|
if (!metadata)
|
|
251
260
|
return;
|
|
261
|
+
if ('tellaskSession' in metadata &&
|
|
262
|
+
typeof metadata.tellaskSession === 'string' &&
|
|
263
|
+
metadata.tellaskSession.trim() !== '') {
|
|
264
|
+
const rootRestored = await restoreDialogForDrive(new dialog_1.DialogID(dialogIdObj.rootId), 'running');
|
|
265
|
+
if (!(rootRestored instanceof dialog_1.RootDialog)) {
|
|
266
|
+
throw new Error(`Expected root dialog instance for ${dialogIdObj.rootId}`);
|
|
267
|
+
}
|
|
268
|
+
const removed = rootRestored.unregisterSubdialog(metadata.agentId, metadata.tellaskSession);
|
|
269
|
+
if (removed) {
|
|
270
|
+
await rootRestored.saveSubdialogRegistry();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
252
273
|
if (!('assignmentFromSup' in metadata))
|
|
253
274
|
return;
|
|
254
275
|
if (!metadata.assignmentFromSup)
|
|
@@ -265,8 +286,8 @@ async function handleDeclareSubdialogDead(ws, packet) {
|
|
|
265
286
|
}
|
|
266
287
|
const parentDialog = await restoreDialogForDrive(callerDialogIdObj, 'running');
|
|
267
288
|
const responseText = (0, runtime_language_1.getWorkLanguage)() === 'zh'
|
|
268
|
-
? `系统反馈:支线对话 ${dialogIdObj.valueOf()}
|
|
269
|
-
: `System notice: sideline dialog ${dialogIdObj.valueOf()} has been declared dead by the user (irreversible).
|
|
289
|
+
? `系统反馈:支线对话 ${dialogIdObj.valueOf()} 已被用户宣布卡死(不可逆)。后续可以重用相同的 slug 发起全新支线对话;只是之前的上下文已不再,诉请正文请提供最新的完整上下文信息。`
|
|
290
|
+
: `System notice: sideline dialog ${dialogIdObj.valueOf()} has been declared dead by the user (irreversible). You may reuse the same slug to start a brand-new sideline dialog, but previous context is no longer retained; include the latest complete context in the tellask body.`;
|
|
270
291
|
const responseTextWithNote = note === ''
|
|
271
292
|
? responseText
|
|
272
293
|
: (0, runtime_language_1.getWorkLanguage)() === 'zh'
|
|
@@ -314,6 +335,10 @@ async function handleSetDiligencePush(ws, packet) {
|
|
|
314
335
|
ws.send(JSON.stringify({ type: 'error', message: `Dialog ${dialogIdObj.valueOf()} not found` }));
|
|
315
336
|
return;
|
|
316
337
|
}
|
|
338
|
+
const latestBefore = await persistence_1.DialogPersistence.loadDialogLatest(dialogIdObj, foundStatus);
|
|
339
|
+
const prevDisableDiligencePush = latestBefore && typeof latestBefore.disableDiligencePush === 'boolean'
|
|
340
|
+
? latestBefore.disableDiligencePush
|
|
341
|
+
: false;
|
|
317
342
|
await persistence_1.DialogPersistence.mutateDialogLatest(dialogIdObj, (previous) => ({
|
|
318
343
|
kind: 'patch',
|
|
319
344
|
patch: { disableDiligencePush },
|
|
@@ -330,6 +355,13 @@ async function handleSetDiligencePush(ws, packet) {
|
|
|
330
355
|
timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
331
356
|
};
|
|
332
357
|
ws.send(JSON.stringify(msg));
|
|
358
|
+
const shouldTriggerImmediateDiligence = foundStatus === 'running' &&
|
|
359
|
+
prevDisableDiligencePush &&
|
|
360
|
+
!disableDiligencePush &&
|
|
361
|
+
rootDialog instanceof dialog_1.RootDialog;
|
|
362
|
+
if (shouldTriggerImmediateDiligence) {
|
|
363
|
+
void maybeTriggerImmediateDiligencePrompt(rootDialog);
|
|
364
|
+
}
|
|
333
365
|
}
|
|
334
366
|
catch (error) {
|
|
335
367
|
log.warn('Failed to handle set_diligence_push', error);
|
|
@@ -344,6 +376,57 @@ function clampNonNegativeFiniteInt(value, fallback) {
|
|
|
344
376
|
return fallback;
|
|
345
377
|
return Math.max(0, Math.floor(value));
|
|
346
378
|
}
|
|
379
|
+
async function maybeTriggerImmediateDiligencePrompt(rootDialog) {
|
|
380
|
+
try {
|
|
381
|
+
if (rootDialog.disableDiligencePush) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(rootDialog.id, 'running');
|
|
385
|
+
const runState = latest?.runState;
|
|
386
|
+
if (runState && runState.kind !== 'idle_waiting_user') {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const suspension = await rootDialog.getSuspensionStatus();
|
|
390
|
+
if (!suspension.canDrive) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
if ((0, driver_entry_1.getActiveDriverEngine)() === 'v1') {
|
|
394
|
+
const queuedResponses = await persistence_1.DialogPersistence.loadSubdialogResponsesQueue(rootDialog.id);
|
|
395
|
+
if (queuedResponses.length > 0) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
const team = await team_1.Team.load();
|
|
400
|
+
const prepared = await (0, runtime_utils_1.maybePrepareDiligenceAutoContinuePrompt)({
|
|
401
|
+
dlg: rootDialog,
|
|
402
|
+
isRootDialog: true,
|
|
403
|
+
remainingBudget: rootDialog.diligencePushRemainingBudget,
|
|
404
|
+
diligencePushMax: resolveMemberDiligencePushMax(team, rootDialog.agentId),
|
|
405
|
+
});
|
|
406
|
+
rootDialog.diligencePushRemainingBudget = prepared.nextRemainingBudget;
|
|
407
|
+
await persistence_1.DialogPersistence.mutateDialogLatest(rootDialog.id, () => ({
|
|
408
|
+
kind: 'patch',
|
|
409
|
+
patch: { diligencePushRemainingBudget: rootDialog.diligencePushRemainingBudget },
|
|
410
|
+
}));
|
|
411
|
+
if (prepared.kind !== 'disabled') {
|
|
412
|
+
(0, evt_registry_1.postDialogEvent)(rootDialog, {
|
|
413
|
+
type: 'diligence_budget_evt',
|
|
414
|
+
maxInjectCount: prepared.maxInjectCount,
|
|
415
|
+
injectedCount: Math.max(0, prepared.maxInjectCount - prepared.nextRemainingBudget),
|
|
416
|
+
remainingCount: Math.max(0, prepared.nextRemainingBudget),
|
|
417
|
+
disableDiligencePush: rootDialog.disableDiligencePush,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
if (prepared.kind === 'prompt') {
|
|
421
|
+
await (0, driver_entry_1.driveDialogStream)(rootDialog, prepared.prompt, true);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
log.warn('Failed to trigger immediate diligence prompt after enabling keep-going', error, {
|
|
426
|
+
dialogId: rootDialog.id.valueOf(),
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
}
|
|
347
430
|
async function handleRefillDiligencePushBudget(ws, packet) {
|
|
348
431
|
const { dialog } = packet;
|
|
349
432
|
if (!isRecord(dialog)) {
|
|
@@ -674,31 +757,29 @@ async function handleDisplayDialog(ws, packet) {
|
|
|
674
757
|
catch (err) {
|
|
675
758
|
log.warn(`Failed to send dlg_run_state_evt for ${dialogIdObj.valueOf()}:`, err);
|
|
676
759
|
}
|
|
677
|
-
// Emit Q4H
|
|
678
|
-
//
|
|
760
|
+
// Emit one Q4H snapshot to ensure frontend has current global questions state.
|
|
761
|
+
// Do NOT replay per-question `new_q4h_asked` events here: those are real-time
|
|
762
|
+
// incremental events and replaying them on display refresh can create duplicate
|
|
763
|
+
// delivery paths and blur event semantics.
|
|
679
764
|
try {
|
|
680
765
|
const allQuestions = await persistence_1.DialogPersistence.loadAllQ4HState();
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
},
|
|
699
|
-
};
|
|
700
|
-
ws.send(JSON.stringify(newQ4HEvent));
|
|
701
|
-
}
|
|
766
|
+
const response = {
|
|
767
|
+
type: 'q4h_state_response',
|
|
768
|
+
questions: allQuestions.map((q) => ({
|
|
769
|
+
id: q.id,
|
|
770
|
+
selfId: q.selfId,
|
|
771
|
+
rootId: q.rootId,
|
|
772
|
+
agentId: q.agentId,
|
|
773
|
+
taskDocPath: q.taskDocPath,
|
|
774
|
+
tellaskHead: q.tellaskHead,
|
|
775
|
+
bodyContent: q.bodyContent,
|
|
776
|
+
askedAt: q.askedAt,
|
|
777
|
+
callId: q.callId,
|
|
778
|
+
remainingCallIds: q.remainingCallIds,
|
|
779
|
+
callSiteRef: q.callSiteRef,
|
|
780
|
+
})),
|
|
781
|
+
};
|
|
782
|
+
ws.send(JSON.stringify(response));
|
|
702
783
|
}
|
|
703
784
|
catch (err) {
|
|
704
785
|
log.warn(`Failed to emit Q4H state for ${dialogIdObj}:`, err);
|
|
@@ -737,6 +818,7 @@ async function handleGetQ4HState(ws, _packet) {
|
|
|
737
818
|
bodyContent: q.bodyContent,
|
|
738
819
|
askedAt: q.askedAt,
|
|
739
820
|
callId: q.callId,
|
|
821
|
+
remainingCallIds: q.remainingCallIds,
|
|
740
822
|
callSiteRef: q.callSiteRef,
|
|
741
823
|
}));
|
|
742
824
|
// Send single response packet with all questions (not PubChan events)
|
|
@@ -966,6 +1048,7 @@ async function handleEmergencyStop(ws, packet) {
|
|
|
966
1048
|
throw new Error('Internal error: handleEmergencyStop called with non emergency_stop packet');
|
|
967
1049
|
}
|
|
968
1050
|
await (0, dialog_run_state_1.requestEmergencyStopAll)();
|
|
1051
|
+
emitRunControlRefresh('emergency_stop');
|
|
969
1052
|
}
|
|
970
1053
|
async function handleResumeDialog(ws, packet) {
|
|
971
1054
|
if (packet.type !== 'resume_dialog') {
|
|
@@ -1006,6 +1089,7 @@ async function handleResumeAll(ws, packet) {
|
|
|
1006
1089
|
}
|
|
1007
1090
|
})();
|
|
1008
1091
|
}
|
|
1092
|
+
emitRunControlRefresh('resume_all');
|
|
1009
1093
|
}
|
|
1010
1094
|
/**
|
|
1011
1095
|
* Handle user answer to a Q4H (Questions for Human) question
|
|
@@ -1074,6 +1158,22 @@ async function handleUserAnswer2Q4H(ws, packet) {
|
|
|
1074
1158
|
selfId: dialogId,
|
|
1075
1159
|
};
|
|
1076
1160
|
(0, evt_registry_1.postDialogEvent)(dialog, answeredEvent);
|
|
1161
|
+
const hasPendingSubdialogs = await dialog.hasPendingSubdialogs();
|
|
1162
|
+
if (hasPendingSubdialogs) {
|
|
1163
|
+
dialog.queueUpNextPrompt({
|
|
1164
|
+
prompt: content,
|
|
1165
|
+
msgId,
|
|
1166
|
+
grammar: 'tellask',
|
|
1167
|
+
userLanguageCode,
|
|
1168
|
+
});
|
|
1169
|
+
log.info('Deferred Q4H answer until pending subdialogs resolve', {
|
|
1170
|
+
rootId: dialog.id.rootId,
|
|
1171
|
+
selfId: dialog.id.selfId,
|
|
1172
|
+
questionId,
|
|
1173
|
+
msgId,
|
|
1174
|
+
});
|
|
1175
|
+
return;
|
|
1176
|
+
}
|
|
1077
1177
|
// Resume the dialog with the user's answer.
|
|
1078
1178
|
await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'tellask', userLanguageCode, origin: 'user' }, true);
|
|
1079
1179
|
}
|
|
@@ -1119,6 +1219,15 @@ function setupWebSocketServer(httpServer, clients, auth, serverWorkLanguage) {
|
|
|
1119
1219
|
}
|
|
1120
1220
|
}
|
|
1121
1221
|
};
|
|
1222
|
+
// Broadcast global run-control refresh hints so all clients converge from persisted dialog index.
|
|
1223
|
+
broadcastRunControlRefreshMessage = (msg) => {
|
|
1224
|
+
const data = JSON.stringify(msg);
|
|
1225
|
+
for (const ws of clients) {
|
|
1226
|
+
if (ws.readyState === 1) {
|
|
1227
|
+
ws.send(data);
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
};
|
|
1122
1231
|
// Broadcast rtws Problems snapshots to all connected clients.
|
|
1123
1232
|
(0, problems_1.setProblemsBroadcaster)((msg) => {
|
|
1124
1233
|
const data = JSON.stringify(msg);
|