dominds 0.7.6 → 0.8.2
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/README.md +2 -2
- package/README.zh.md +2 -2
- package/dist/agent-priming.js +169 -200
- package/dist/cli/read.js +2 -7
- package/dist/dialog-factory.js +6 -4
- package/dist/dialog-instance-registry.js +2 -2
- package/dist/dialog.js +99 -91
- package/dist/docs/dialog-persistence.md +2 -2
- package/dist/docs/dialog-persistence.zh.md +2 -2
- package/dist/docs/dialog-system.md +86 -90
- package/dist/docs/dialog-system.zh.md +82 -83
- package/dist/docs/diligence-push.md +2 -2
- package/dist/docs/diligence-push.zh.md +2 -2
- package/dist/docs/dominds-agent-priming.md +11 -11
- package/dist/docs/dominds-agent-priming.zh.md +9 -9
- package/dist/docs/dominds-terminology.md +34 -34
- package/dist/docs/fbr-implementation.md +4 -4
- package/dist/docs/fbr-implementation.zh.md +4 -4
- package/dist/docs/fbr.md +31 -53
- package/dist/docs/fbr.zh.md +30 -48
- package/dist/docs/mottos.md +2 -3
- package/dist/docs/mottos.zh.md +2 -2
- package/dist/docs/q4h.md +6 -6
- package/dist/docs/q4h.zh.md +6 -6
- package/dist/docs/tellask-collab.md +13 -13
- package/dist/docs/tellask-collab.zh.md +18 -18
- package/dist/llm/driver-entry.js +9 -33
- package/dist/llm/driver-v2/core.js +413 -111
- package/dist/llm/driver-v2/index.js +5 -0
- package/dist/llm/driver-v2/orchestrator.js +4 -3
- package/dist/llm/driver-v2/policy.js +17 -23
- package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
- package/dist/llm/driver-v2/round.js +18 -7
- package/dist/llm/driver-v2/runtime-utils.js +3 -5
- package/dist/llm/driver-v2/saying-events.js +4 -42
- package/dist/llm/driver-v2/supdialog-response.js +110 -23
- package/dist/llm/driver-v2/tellask-bridge.js +560 -458
- package/dist/mcp/sdk-client.js +1 -1
- package/dist/mcp/server-runtime.js +1 -1
- package/dist/mcp/stdio-client.js +6 -6
- package/dist/mcp/tool-names.js +1 -1
- package/dist/minds/builtin/fuxi/persona.en.md +10 -10
- package/dist/minds/builtin/fuxi/persona.zh.md +12 -12
- package/dist/minds/builtin/pangu/persona.en.md +7 -7
- package/dist/minds/builtin/pangu/persona.zh.md +6 -6
- package/dist/minds/minds-i18n.js +2 -2
- package/dist/minds/system-prompt-parts.js +15 -12
- package/dist/minds/system-prompt.js +58 -56
- package/dist/persistence.js +675 -527
- package/dist/server/api-routes.js +1 -1
- package/dist/server/websocket-handler.js +10 -20
- package/dist/server.js +3 -3
- package/dist/shared/diligence.js +12 -12
- package/dist/shared/i18n/driver-messages.js +28 -118
- package/dist/shared/utils/inter-dialog-format.js +53 -53
- package/dist/snippets/starting.en.md +1 -1
- package/dist/snippets/starting.zh.md +1 -2
- package/dist/static/assets/{_baseUniq-2IQvcpiv.js → _baseUniq-D4N_zVXV.js} +2 -2
- package/dist/static/assets/{_baseUniq-2IQvcpiv.js.map → _baseUniq-D4N_zVXV.js.map} +1 -1
- package/dist/static/assets/{arc-Boi4s2EY.js → arc-7bP9qomB.js} +2 -2
- package/dist/static/assets/{arc-Boi4s2EY.js.map → arc-7bP9qomB.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js → architectureDiagram-VXUJARFQ-DToIiZuZ.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js.map → architectureDiagram-VXUJARFQ-DToIiZuZ.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js → blockDiagram-VD42YOAC-C-pRNHpf.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js.map → blockDiagram-VD42YOAC-C-pRNHpf.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js → c4Diagram-YG6GDRKO-Bnp-nWKO.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js.map → c4Diagram-YG6GDRKO-Bnp-nWKO.js.map} +1 -1
- package/dist/static/assets/{channel-DBG_xYT_.js → channel-CTv1SsAF.js} +2 -2
- package/dist/static/assets/{channel-DBG_xYT_.js.map → channel-CTv1SsAF.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js → chunk-4BX2VUAB-D_OGa3ss.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js.map → chunk-4BX2VUAB-D_OGa3ss.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js → chunk-55IACEB6-I4o4MCuM.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js.map → chunk-55IACEB6-I4o4MCuM.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js → chunk-B4BG7PRW-Bp-TIXg6.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js.map → chunk-B4BG7PRW-Bp-TIXg6.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js → chunk-DI55MBZ5-Bnph5Hmd.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js.map → chunk-DI55MBZ5-Bnph5Hmd.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js → chunk-FMBD7UC4-q3UyRsNI.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js.map → chunk-FMBD7UC4-q3UyRsNI.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js → chunk-QN33PNHL-BxUlvLXP.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js.map → chunk-QN33PNHL-BxUlvLXP.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js → chunk-QZHKN3VN-DpQR9BVw.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js.map → chunk-QZHKN3VN-DpQR9BVw.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js → chunk-TZMSLE5B-BX8vrVo0.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js.map → chunk-TZMSLE5B-BX8vrVo0.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js → classDiagram-2ON5EDUG-Ccx5_2Xq.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js.map → classDiagram-2ON5EDUG-Ccx5_2Xq.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js.map → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js.map} +1 -1
- package/dist/static/assets/{clone-rjxmrDHc.js → clone-Cl5zSMrO.js} +2 -2
- package/dist/static/assets/{clone-rjxmrDHc.js.map → clone-Cl5zSMrO.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js → cose-bilkent-S5V4N54A-B-FUX86B.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js.map → cose-bilkent-S5V4N54A-B-FUX86B.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js → dagre-6UL2VRFP-Bj8vSSpT.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js.map → dagre-6UL2VRFP-Bj8vSSpT.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js → diagram-PSM6KHXK-BPcgy7jf.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js.map → diagram-PSM6KHXK-BPcgy7jf.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js → diagram-QEK2KX5R-DHxd6LWi.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js.map → diagram-QEK2KX5R-DHxd6LWi.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js → diagram-S2PKOQOG-C4ynhhLr.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js.map → diagram-S2PKOQOG-C4ynhhLr.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js → erDiagram-Q2GNP2WA-CQ25uxxf.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js.map → erDiagram-Q2GNP2WA-CQ25uxxf.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js → flowDiagram-NV44I4VS-ChkkAldk.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js.map → flowDiagram-NV44I4VS-ChkkAldk.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js → ganttDiagram-JELNMOA3-CBt_Zorl.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js.map → ganttDiagram-JELNMOA3-CBt_Zorl.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js → gitGraphDiagram-NY62KEGX-CtBc2dOO.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js.map → gitGraphDiagram-NY62KEGX-CtBc2dOO.js.map} +1 -1
- package/dist/static/assets/{graph-DDHIhCSW.js → graph-BGzNnzuI.js} +3 -3
- package/dist/static/assets/{graph-DDHIhCSW.js.map → graph-BGzNnzuI.js.map} +1 -1
- package/dist/static/assets/{index-CUZD-Ua6.js → index-Vrp1PT3b.js} +654 -355
- package/dist/static/assets/index-Vrp1PT3b.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js → infoDiagram-WHAUD3N6-BYJF-Ol5.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js.map → infoDiagram-WHAUD3N6-BYJF-Ol5.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js.map → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js → kanban-definition-3W4ZIXB7-DBH-HEwY.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js.map → kanban-definition-3W4ZIXB7-DBH-HEwY.js.map} +1 -1
- package/dist/static/assets/{layout-C7mFT1m6.js → layout-DdWO-uEo.js} +5 -5
- package/dist/static/assets/{layout-C7mFT1m6.js.map → layout-DdWO-uEo.js.map} +1 -1
- package/dist/static/assets/{linear-WSX0brRY.js → linear-BY3MovaF.js} +2 -2
- package/dist/static/assets/{linear-WSX0brRY.js.map → linear-BY3MovaF.js.map} +1 -1
- package/dist/static/assets/{min-DOTQTP4p.js → min-aHCJK1uN.js} +3 -3
- package/dist/static/assets/{min-DOTQTP4p.js.map → min-aHCJK1uN.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js → mindmap-definition-VGOIOE7T-BjJnBRtB.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js.map → mindmap-definition-VGOIOE7T-BjJnBRtB.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js → pieDiagram-ADFJNKIX-xAcmdymv.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js.map → pieDiagram-ADFJNKIX-xAcmdymv.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js → quadrantDiagram-AYHSOK5B-BPbEGCEj.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js.map → quadrantDiagram-AYHSOK5B-BPbEGCEj.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js → requirementDiagram-UZGBJVZJ--w6UfXy0.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js.map → requirementDiagram-UZGBJVZJ--w6UfXy0.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js → sankeyDiagram-TZEHDZUN-B_T6TQwh.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js.map → sankeyDiagram-TZEHDZUN-B_T6TQwh.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js → sequenceDiagram-WL72ISMW-DX_oVvqA.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js.map → sequenceDiagram-WL72ISMW-DX_oVvqA.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js → stateDiagram-FKZM4ZOC-BAybZU8l.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js.map → stateDiagram-FKZM4ZOC-BAybZU8l.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js.map → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js → timeline-definition-IT6M3QCI-DOYN-4XM.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js.map → timeline-definition-IT6M3QCI-DOYN-4XM.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js → treemap-KMMF4GRG-CQXygT0T.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js.map → treemap-KMMF4GRG-CQXygT0T.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js → xychartDiagram-PRI3JC2R-ByFAvTeN.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js.map → xychartDiagram-PRI3JC2R-ByFAvTeN.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/tools/builtins.js +0 -8
- package/dist/tools/env.js +1 -1
- package/dist/tools/mcp.js +31 -9
- package/dist/tools/pending-tellask-reminder.js +14 -17
- package/dist/tools/team-mgmt.js +1 -1
- package/package.json +1 -1
- package/dist/static/assets/index-CUZD-Ua6.js.map +0 -1
|
@@ -779,7 +779,7 @@ async function handleGetDialogHierarchy(res, rootId) {
|
|
|
779
779
|
createdAt: meta.createdAt,
|
|
780
780
|
lastModified: subLatest?.lastModified || meta.createdAt,
|
|
781
781
|
runState: subLatest?.runState,
|
|
782
|
-
|
|
782
|
+
sessionSlug: meta.sessionSlug,
|
|
783
783
|
assignmentFromSup: meta.assignmentFromSup,
|
|
784
784
|
});
|
|
785
785
|
}
|
|
@@ -258,14 +258,12 @@ async function handleDeclareSubdialogDead(ws, packet) {
|
|
|
258
258
|
}
|
|
259
259
|
if (!metadata)
|
|
260
260
|
return;
|
|
261
|
-
if ('
|
|
262
|
-
typeof metadata.tellaskSession === 'string' &&
|
|
263
|
-
metadata.tellaskSession.trim() !== '') {
|
|
261
|
+
if (typeof metadata.sessionSlug === 'string' && metadata.sessionSlug.trim() !== '') {
|
|
264
262
|
const rootRestored = await restoreDialogForDrive(new dialog_1.DialogID(dialogIdObj.rootId), 'running');
|
|
265
263
|
if (!(rootRestored instanceof dialog_1.RootDialog)) {
|
|
266
264
|
throw new Error(`Expected root dialog instance for ${dialogIdObj.rootId}`);
|
|
267
265
|
}
|
|
268
|
-
const removed = rootRestored.unregisterSubdialog(metadata.agentId, metadata.
|
|
266
|
+
const removed = rootRestored.unregisterSubdialog(metadata.agentId, metadata.sessionSlug);
|
|
269
267
|
if (removed) {
|
|
270
268
|
await rootRestored.saveSubdialogRegistry();
|
|
271
269
|
}
|
|
@@ -390,12 +388,6 @@ async function maybeTriggerImmediateDiligencePrompt(rootDialog) {
|
|
|
390
388
|
if (!suspension.canDrive) {
|
|
391
389
|
return;
|
|
392
390
|
}
|
|
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
391
|
const team = await team_1.Team.load();
|
|
400
392
|
const prepared = await (0, runtime_utils_1.maybePrepareDiligenceAutoContinuePrompt)({
|
|
401
393
|
dlg: rootDialog,
|
|
@@ -732,7 +724,7 @@ async function handleDisplayDialog(ws, packet) {
|
|
|
732
724
|
agentId: metadata.agentId,
|
|
733
725
|
taskDocPath: metadata.taskDocPath,
|
|
734
726
|
supdialogId: derivedSupdialogId,
|
|
735
|
-
|
|
727
|
+
sessionSlug: metadata.sessionSlug,
|
|
736
728
|
assignmentFromSup: metadata.assignmentFromSup,
|
|
737
729
|
disableDiligencePush: effectiveDisableDiligencePush,
|
|
738
730
|
diligencePushMax,
|
|
@@ -771,8 +763,7 @@ async function handleDisplayDialog(ws, packet) {
|
|
|
771
763
|
rootId: q.rootId,
|
|
772
764
|
agentId: q.agentId,
|
|
773
765
|
taskDocPath: q.taskDocPath,
|
|
774
|
-
|
|
775
|
-
bodyContent: q.bodyContent,
|
|
766
|
+
tellaskContent: q.tellaskContent,
|
|
776
767
|
askedAt: q.askedAt,
|
|
777
768
|
callId: q.callId,
|
|
778
769
|
remainingCallIds: q.remainingCallIds,
|
|
@@ -814,8 +805,7 @@ async function handleGetQ4HState(ws, _packet) {
|
|
|
814
805
|
rootId: q.rootId,
|
|
815
806
|
agentId: q.agentId,
|
|
816
807
|
taskDocPath: q.taskDocPath,
|
|
817
|
-
|
|
818
|
-
bodyContent: q.bodyContent,
|
|
808
|
+
tellaskContent: q.tellaskContent,
|
|
819
809
|
askedAt: q.askedAt,
|
|
820
810
|
callId: q.callId,
|
|
821
811
|
remainingCallIds: q.remainingCallIds,
|
|
@@ -969,7 +959,7 @@ async function handleUserMsg2Dlg(ws, packet) {
|
|
|
969
959
|
existingDialog.status === 'running' &&
|
|
970
960
|
existingSub &&
|
|
971
961
|
existingSub.dialogKey === existingDialog.id.valueOf()) {
|
|
972
|
-
await (0, driver_entry_1.driveDialogStream)(existingDialog, { content, msgId, grammar: '
|
|
962
|
+
await (0, driver_entry_1.driveDialogStream)(existingDialog, { content, msgId, grammar: 'markdown', userLanguageCode, origin: 'user' }, true);
|
|
973
963
|
return;
|
|
974
964
|
}
|
|
975
965
|
// Dialog not found in wsLiveDlg - drive using the canonical root/subdialog instances.
|
|
@@ -989,7 +979,7 @@ async function handleUserMsg2Dlg(ws, packet) {
|
|
|
989
979
|
return;
|
|
990
980
|
}
|
|
991
981
|
await setupWebSocketSubscription(ws, dialog);
|
|
992
|
-
await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: '
|
|
982
|
+
await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'markdown', userLanguageCode, origin: 'user' }, true);
|
|
993
983
|
return;
|
|
994
984
|
}
|
|
995
985
|
catch (restoreError) {
|
|
@@ -1163,10 +1153,10 @@ async function handleUserAnswer2Q4H(ws, packet) {
|
|
|
1163
1153
|
dialog.queueUpNextPrompt({
|
|
1164
1154
|
prompt: content,
|
|
1165
1155
|
msgId,
|
|
1166
|
-
grammar: '
|
|
1156
|
+
grammar: 'markdown',
|
|
1167
1157
|
userLanguageCode,
|
|
1168
1158
|
});
|
|
1169
|
-
log.
|
|
1159
|
+
log.debug('Deferred Q4H answer until pending subdialogs resolve', undefined, {
|
|
1170
1160
|
rootId: dialog.id.rootId,
|
|
1171
1161
|
selfId: dialog.id.selfId,
|
|
1172
1162
|
questionId,
|
|
@@ -1175,7 +1165,7 @@ async function handleUserAnswer2Q4H(ws, packet) {
|
|
|
1175
1165
|
return;
|
|
1176
1166
|
}
|
|
1177
1167
|
// Resume the dialog with the user's answer.
|
|
1178
|
-
await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: '
|
|
1168
|
+
await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'markdown', userLanguageCode, origin: 'user' }, true);
|
|
1179
1169
|
}
|
|
1180
1170
|
catch (error) {
|
|
1181
1171
|
log.error('Error processing Q4H user answer:', error);
|
package/dist/server.js
CHANGED
|
@@ -57,16 +57,16 @@ require("./tools/builtins");
|
|
|
57
57
|
const log = (0, log_1.createLogger)('server');
|
|
58
58
|
// Setup unhandled rejection handler to capture crashes
|
|
59
59
|
process.on('unhandledRejection', (reason, promise) => {
|
|
60
|
-
log.error('Unhandled Rejection at:', promise);
|
|
60
|
+
log.error('Unhandled Rejection at:', undefined, { promise });
|
|
61
61
|
log.error('Reason:', reason instanceof Error ? reason : new Error(String(reason)));
|
|
62
|
-
log.error('Stack trace:', (reason instanceof Error && reason.stack) || 'No stack trace available');
|
|
62
|
+
log.error('Stack trace:', undefined, (reason instanceof Error && reason.stack) || 'No stack trace available');
|
|
63
63
|
// Optionally, we could exit the process here with code 1
|
|
64
64
|
// But in development, we might want to keep running
|
|
65
65
|
});
|
|
66
66
|
// Setup uncaught exception handler
|
|
67
67
|
process.on('uncaughtException', (error) => {
|
|
68
68
|
log.error('Uncaught Exception:', error);
|
|
69
|
-
log.error('Stack trace:', error.stack);
|
|
69
|
+
log.error('Stack trace:', undefined, error.stack);
|
|
70
70
|
// Optionally, exit with code 1
|
|
71
71
|
// process.exit(1);
|
|
72
72
|
});
|
package/dist/shared/diligence.js
CHANGED
|
@@ -6,21 +6,21 @@ exports.DILIGENCE_FALLBACK_TEXT = {
|
|
|
6
6
|
zh: [
|
|
7
7
|
'你扪心自问(做一次 FBR),差遣牒已经包含足够明确的目标定义了吗?',
|
|
8
8
|
'',
|
|
9
|
-
'
|
|
9
|
+
'如果没有,使用 `askHuman` 请求人类给出足够清晰的目标。',
|
|
10
10
|
'',
|
|
11
11
|
'如果目标已经清晰定义,那么你已经完成了所有目标吗?',
|
|
12
12
|
'',
|
|
13
|
-
'
|
|
13
|
+
'如果已经完成,使用 `askHuman` 请求人类验收。',
|
|
14
14
|
'',
|
|
15
|
-
'如果尚未完成,优先直接确定并执行下一步最优行动项(调用工具或诉请队友)。仅当“下一步不清晰/难以决策”时,才发起一次
|
|
15
|
+
'如果尚未完成,优先直接确定并执行下一步最优行动项(调用工具或诉请队友)。仅当“下一步不清晰/难以决策”时,才发起一次 freshBootsReasoning 扪心自问(FBR);收齐该次回贴后,立即把结论落地为可执行动作并开始执行,不要只汇报决定。',
|
|
16
16
|
'',
|
|
17
|
-
'
|
|
17
|
+
'当你确信自己不该或者不能自主继续工作时,立即使用 `askHuman` 请求人类确认相关问题或者指出工作方向。',
|
|
18
18
|
'',
|
|
19
19
|
'---',
|
|
20
20
|
'',
|
|
21
21
|
'**注意**:',
|
|
22
22
|
'',
|
|
23
|
-
'
|
|
23
|
+
'扪心自问时,自诉请正文需要包含对当前状况的完整事实性总结(但不要包含差遣牒已有内容);发起 freshBootsReasoning 后不要立即下最终行动决策,先等回贴再综合。综合完成后必须立刻执行已确定行动(工具调用/诉请队友),避免停留在“仅汇报决定”的状态。',
|
|
24
24
|
'',
|
|
25
25
|
'队友如果回复 “将要/可以” 做 XXX 的,你要审视祂所说是否符合整体/分项任务目标,是否值得继续:',
|
|
26
26
|
'- 如果祂建议的事情可做可不做,那么就可以忽略,不以琐碎小事安排工作。',
|
|
@@ -28,26 +28,26 @@ exports.DILIGENCE_FALLBACK_TEXT = {
|
|
|
28
28
|
'',
|
|
29
29
|
'系统会把“尚未收到反馈、仍在执行中的诉请”自动展示为提醒项;请以提醒项作为是否仍在执行中的唯一判断依据。',
|
|
30
30
|
'',
|
|
31
|
-
'凡是不在提醒项里的历史诉请,都不要继续等待(通常代表已回贴或已结束当前轮次)。若该工作线仍需推进,必须立即使用同一个
|
|
31
|
+
'凡是不在提醒项里的历史诉请,都不要继续等待(通常代表已回贴或已结束当前轮次)。若该工作线仍需推进,必须立即使用同一个 `sessionSlug` 再次调用 `tellask` 诉请对应队友,明确要求继续执行下一步。',
|
|
32
32
|
].join('\n'),
|
|
33
33
|
en: [
|
|
34
34
|
'Do a self-check (run one FBR): does the Taskdoc already contain a sufficiently clear goal definition?',
|
|
35
35
|
'',
|
|
36
|
-
'If not, use
|
|
36
|
+
'If not, use `askHuman` to request a sufficiently clear goal.',
|
|
37
37
|
'',
|
|
38
38
|
'If the goal is already clearly defined, ask: have you completed all goals?',
|
|
39
39
|
'',
|
|
40
|
-
'If yes, use
|
|
40
|
+
'If yes, use `askHuman` to request acceptance.',
|
|
41
41
|
'',
|
|
42
|
-
'If not complete, first determine and execute the best next action (tool call or teammate tellask). Use
|
|
42
|
+
'If not complete, first determine and execute the best next action (tool call or teammate tellask). Use freshBootsReasoning for FBR only when the next move is unclear or hard to decide; after feedback from that FBR run is collected, immediately turn the conclusion into executable action and start execution. Do not stop at reporting a decision.',
|
|
43
43
|
'',
|
|
44
|
-
'When you are convinced you should not or cannot continue autonomously, immediately use
|
|
44
|
+
'When you are convinced you should not or cannot continue autonomously, immediately use `askHuman` to confirm the relevant issue or provide direction.',
|
|
45
45
|
'',
|
|
46
46
|
'---',
|
|
47
47
|
'',
|
|
48
48
|
'**Notes**:',
|
|
49
49
|
'',
|
|
50
|
-
'When running FBR, the
|
|
50
|
+
'When running FBR, the FBR body must include a complete factual summary of the current situation (but do not repeat information already present in the Taskdoc). After initiating a freshBootsReasoning, do not finalize the next action immediately; wait for feedback first, then synthesize. Once synthesized, immediately execute the chosen action (tool call / teammate tellask), and avoid staying in a “decision report only” state.',
|
|
51
51
|
'',
|
|
52
52
|
'If a teammate replies that they “will/can do X”, examine whether it aligns with the overall/sub-task goals and is worth continuing:',
|
|
53
53
|
'- If it is optional and low impact, ignore it instead of assigning trivial work.',
|
|
@@ -55,6 +55,6 @@ exports.DILIGENCE_FALLBACK_TEXT = {
|
|
|
55
55
|
'',
|
|
56
56
|
'The system automatically surfaces still-running tellasks (those without feedback yet) as reminder items; treat reminders as the single source of truth for whether a tellask is still in progress.',
|
|
57
57
|
'',
|
|
58
|
-
'For any historical tellask not listed in reminders, do not keep waiting (it usually means the previous round already replied or ended). If that workstream should continue, immediately
|
|
58
|
+
'For any historical tellask not listed in reminders, do not keep waiting (it usually means the previous round already replied or ended). If that workstream should continue, immediately call `tellask` for the same teammate with the same `sessionSlug` and explicitly ask for the next step.',
|
|
59
59
|
].join('\n'),
|
|
60
60
|
};
|
|
@@ -7,14 +7,9 @@ exports.formatDomindsNoteTellaskForTeammatesOnly = formatDomindsNoteTellaskForTe
|
|
|
7
7
|
exports.formatDomindsNoteQ4HRegisterFailed = formatDomindsNoteQ4HRegisterFailed;
|
|
8
8
|
exports.formatAgentFacingContextHealthV3RemediationGuide = formatAgentFacingContextHealthV3RemediationGuide;
|
|
9
9
|
exports.formatDomindsNoteTellaskerOnlyInSidelineDialog = formatDomindsNoteTellaskerOnlyInSidelineDialog;
|
|
10
|
-
exports.formatDomindsNoteTellaskerNoTellaskSession = formatDomindsNoteTellaskerNoTellaskSession;
|
|
11
10
|
exports.formatDomindsNoteDirectSelfCall = formatDomindsNoteDirectSelfCall;
|
|
12
11
|
exports.formatDomindsNoteFbrDisabled = formatDomindsNoteFbrDisabled;
|
|
13
12
|
exports.formatDomindsNoteFbrToollessViolation = formatDomindsNoteFbrToollessViolation;
|
|
14
|
-
exports.formatDomindsNoteMalformedTellaskCall = formatDomindsNoteMalformedTellaskCall;
|
|
15
|
-
exports.formatDomindsNoteInvalidMultiTeammateTargets = formatDomindsNoteInvalidMultiTeammateTargets;
|
|
16
|
-
exports.formatDomindsNoteInvalidTellaskSessionDirective = formatDomindsNoteInvalidTellaskSessionDirective;
|
|
17
|
-
exports.formatDomindsNoteMultipleTellaskSessionDirectives = formatDomindsNoteMultipleTellaskSessionDirectives;
|
|
18
13
|
const language_1 = require("../types/language");
|
|
19
14
|
function formatCurrentUserLanguagePreference(workingLanguage, uiLanguage) {
|
|
20
15
|
const uiName = (0, language_1.formatLanguageName)(uiLanguage, workingLanguage);
|
|
@@ -131,24 +126,24 @@ function formatQ4HDiligencePushBudgetExhausted(language, args) {
|
|
|
131
126
|
function formatDomindsNoteTellaskForTeammatesOnly(language, args) {
|
|
132
127
|
const firstMention = args.firstMention;
|
|
133
128
|
if (language === 'zh') {
|
|
134
|
-
return (`错误:诉请(tellask
|
|
129
|
+
return (`错误:诉请(tellask)仅用于队友诉请(tellask-special 函数)。\n` +
|
|
135
130
|
`- 当前目标:\`@${firstMention}\` 不是已知队友呼号。\n` +
|
|
136
|
-
`- 若你要调用工具:请使用原生 function-calling
|
|
137
|
-
`-
|
|
131
|
+
`- 若你要调用工具:请使用原生 function-calling(函数工具)。\n` +
|
|
132
|
+
`- 若你要找队友:请使用 tellask-special 函数并确认 targetAgentId(如 \`pangu\`),支线回问请用 \`tellaskBack\`。`);
|
|
138
133
|
}
|
|
139
|
-
return (`Error: tellask is reserved for teammate tellasks (
|
|
134
|
+
return (`Error: tellask is reserved for teammate tellasks (tellask-special functions).\n` +
|
|
140
135
|
`- Current target: \`@${firstMention}\` is not a known teammate call sign.\n` +
|
|
141
|
-
`- If you intended to call a tool: use native function-calling
|
|
142
|
-
`- If you intended to call a teammate:
|
|
136
|
+
`- If you intended to call a tool: use native function-calling.\n` +
|
|
137
|
+
`- If you intended to call a teammate: use tellask-special functions and verify targetAgentId (e.g. \`pangu\`); use \`tellaskBack\` for ask-back.`);
|
|
143
138
|
}
|
|
144
139
|
function formatDomindsNoteQ4HRegisterFailed(language, args) {
|
|
145
140
|
const error = args.error;
|
|
146
141
|
if (language === 'zh') {
|
|
147
|
-
return (`错误:Q4H
|
|
142
|
+
return (`错误:Q4H(\`askHuman\`)登记失败。\n` +
|
|
148
143
|
`- 原因:${error}\n` +
|
|
149
144
|
`- 建议:请重试;若持续失败,可删除该对话的 \`q4h.yaml\`(会丢失该对话的待答问题),或查看服务端日志。`);
|
|
150
145
|
}
|
|
151
|
-
return (`Error: failed to register Q4H (
|
|
146
|
+
return (`Error: failed to register Q4H (\`askHuman\`).\n` +
|
|
152
147
|
`- Reason: ${error}\n` +
|
|
153
148
|
`- Next: retry; if this keeps failing, delete the dialog's \`q4h.yaml\` (will drop pending questions) or check server logs.`);
|
|
154
149
|
}
|
|
@@ -216,150 +211,65 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
|
|
|
216
211
|
}
|
|
217
212
|
function formatDomindsNoteTellaskerOnlyInSidelineDialog(language) {
|
|
218
213
|
if (language === 'zh') {
|
|
219
|
-
return ('Dominds
|
|
214
|
+
return ('Dominds 提示:`tellaskBack` 只在支线对话中有效,用于向“诉请者”(发起本次诉请的对话)回问澄清。\n' +
|
|
220
215
|
'你当前不在支线对话中,因此没有“诉请者”可回问。\n' +
|
|
221
216
|
'(注:诉请者不一定是主线对话;差遣牒 `*.tsk/` 通常由主线对话维护人统一更新。)');
|
|
222
217
|
}
|
|
223
|
-
return ('Dominds note:
|
|
218
|
+
return ('Dominds note: `tellaskBack` is only valid inside a sideline dialog and asks back to the tellasker (the dialog that issued the current Tellask) for clarification. ' +
|
|
224
219
|
'You are currently not in a sideline dialog, so there is no tellasker to call.');
|
|
225
220
|
}
|
|
226
|
-
function formatDomindsNoteTellaskerNoTellaskSession(language) {
|
|
227
|
-
if (language === 'zh') {
|
|
228
|
-
return ('Dominds 提示:`!?@tellasker` 是回问诉请(TellaskBack),不接受 `!tellaskSession`。' +
|
|
229
|
-
'请使用不带 `!tellaskSession` 的 `!?@tellasker`;若你需要可恢复的多轮协作,请使用长线诉请:`!?@self !tellaskSession <tellaskSession>` / `!?@<agentId> !tellaskSession <tellaskSession>`。');
|
|
230
|
-
}
|
|
231
|
-
return ('Dominds note: `!?@tellasker` is a TellaskBack and does not accept `!tellaskSession`. ' +
|
|
232
|
-
'Use `!?@tellasker` with NO `!tellaskSession`, or use `!?@self !tellaskSession <tellaskSession>` / `!?@<agentId> !tellaskSession <tellaskSession>` for a resumable Tellask Session.');
|
|
233
|
-
}
|
|
234
221
|
function formatDomindsNoteDirectSelfCall(language) {
|
|
235
222
|
if (language === 'zh') {
|
|
236
|
-
return ('
|
|
237
|
-
'
|
|
238
|
-
'
|
|
223
|
+
return ('错误:不允许通过 `tellask` / `tellaskSessionless` 对当前 agent 发起自诉请。\n' +
|
|
224
|
+
'- 若你要发起扪心自问(FBR),请使用 `freshBootsReasoning({ tellaskContent })`。\n' +
|
|
225
|
+
'- `tellask` / `tellaskSessionless` 仅用于队友诉请(targetAgentId 必须是队友 id)。');
|
|
239
226
|
}
|
|
240
|
-
return ('
|
|
241
|
-
'
|
|
242
|
-
'
|
|
227
|
+
return ('Error: self-targeted calls via `tellask` / `tellaskSessionless` are not allowed.\n' +
|
|
228
|
+
'- For FBR, use `freshBootsReasoning({ tellaskContent })`.\n' +
|
|
229
|
+
'- `tellask` / `tellaskSessionless` are teammate-only (targetAgentId must be a teammate id).');
|
|
243
230
|
}
|
|
244
231
|
function formatDomindsNoteFbrDisabled(language) {
|
|
245
232
|
if (language === 'zh') {
|
|
246
|
-
return ('错误:当前团队配置不允许你使用
|
|
233
|
+
return ('错误:当前团队配置不允许你使用 `freshBootsReasoning` 发起扪心自问(FBR)。\n' +
|
|
247
234
|
'- 请联系团队管理者调整配置后再试。\n' +
|
|
248
|
-
'-
|
|
235
|
+
'- 你仍可使用其它队友诉请函数(tellask/tellaskSessionless)或在当前对话中直接分析并给出结论。');
|
|
249
236
|
}
|
|
250
|
-
return ('Error:
|
|
251
|
-
'- Ask your team manager to adjust the team config, then retry
|
|
252
|
-
'- You can still tellask other teammates (
|
|
237
|
+
return ('Error: `freshBootsReasoning` (FBR) is disabled by your team configuration.\n' +
|
|
238
|
+
'- Ask your team manager to adjust the team config, then retry `freshBootsReasoning`.\n' +
|
|
239
|
+
'- You can still tellask other teammates via tellask functions (`tellask` / `tellaskSessionless`) or provide analysis directly in the current dialog.');
|
|
253
240
|
}
|
|
254
241
|
function formatDomindsNoteFbrToollessViolation(language, args) {
|
|
255
242
|
const kind = args.kind;
|
|
256
243
|
if (language === 'zh') {
|
|
257
244
|
const detail = kind === 'tellask'
|
|
258
|
-
? '检测到你在 FBR
|
|
245
|
+
? '检测到你在 FBR 支线对话里尝试发起诉请(tellask 系列)。'
|
|
259
246
|
: kind === 'tool'
|
|
260
247
|
? '检测到你在 FBR 支线对话里尝试调用函数工具。'
|
|
261
248
|
: kind === 'tellask_and_tool'
|
|
262
|
-
? '检测到你在 FBR
|
|
249
|
+
? '检测到你在 FBR 支线对话里同时尝试发起诉请与函数工具调用。'
|
|
263
250
|
: '内部错误:无法安全驱动 FBR 支线对话。';
|
|
264
251
|
return [
|
|
265
252
|
'ERR_FBR_TOOLLESS_VIOLATION',
|
|
266
253
|
`Dominds 提示:当前是扪心自问(FBR)支线对话(无工具模式)。${detail}`,
|
|
267
254
|
'',
|
|
268
255
|
'- 本对话无任何工具:禁止函数工具调用。',
|
|
269
|
-
'-
|
|
256
|
+
'- 本对话禁止任何 tellask-special 函数(包括 `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`)。',
|
|
270
257
|
'- 请只基于诉请正文(以及本支线对话自身的会话历史,如有)进行推理与总结。',
|
|
271
258
|
].join('\n');
|
|
272
259
|
}
|
|
273
260
|
const detail = kind === 'tellask'
|
|
274
|
-
? 'Detected a
|
|
261
|
+
? 'Detected a tellask-special invocation attempt inside an FBR sideline dialog.'
|
|
275
262
|
: kind === 'tool'
|
|
276
263
|
? 'Detected a function tool call attempt inside an FBR sideline dialog.'
|
|
277
264
|
: kind === 'tellask_and_tool'
|
|
278
|
-
? 'Detected both tellask and tool-call attempts inside an FBR sideline dialog.'
|
|
265
|
+
? 'Detected both tellask-special and tool-call attempts inside an FBR sideline dialog.'
|
|
279
266
|
: 'Internal error: cannot safely drive the FBR sideline dialog.';
|
|
280
267
|
return [
|
|
281
268
|
'ERR_FBR_TOOLLESS_VIOLATION',
|
|
282
|
-
`Dominds note: this is a tool-less
|
|
269
|
+
`Dominds note: this is a tool-less FBR sideline dialog (triggered by \`freshBootsReasoning\`). ${detail}`,
|
|
283
270
|
'',
|
|
284
271
|
'- No tools are available: do not emit function tool calls.',
|
|
285
|
-
'- No
|
|
272
|
+
'- No tellask-special functions are allowed (`tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`).',
|
|
286
273
|
'- Provide pure reasoning and a summary grounded in the tellask body (and this sideline dialog’s own tellaskSession history, if any).',
|
|
287
274
|
].join('\n');
|
|
288
275
|
}
|
|
289
|
-
function formatDomindsNoteMalformedTellaskCall(language, reason, options) {
|
|
290
|
-
const firstLine = options?.firstLineAfterPrefix?.trim() ?? '';
|
|
291
|
-
const got = firstLine !== '' ? `\n\nGot: \`!?${firstLine}\`` : '';
|
|
292
|
-
if (language === 'zh') {
|
|
293
|
-
switch (reason) {
|
|
294
|
-
case 'missing_mention_prefix': {
|
|
295
|
-
return ('ERR_MALFORMED_TELLASK\n' +
|
|
296
|
-
'Dominds 提示:这段内容被解析为“诉请块”,但第一行不是有效的诉请头。\n\n' +
|
|
297
|
-
'规则:诉请块第一行必须以 `!?@<mention-id>` 开头,例如:`!?@pangu`。\n' +
|
|
298
|
-
'如果你只是想写普通 markdown,请不要在行首使用 `!?`。' +
|
|
299
|
-
got);
|
|
300
|
-
}
|
|
301
|
-
case 'invalid_mention_id': {
|
|
302
|
-
return ('ERR_MALFORMED_TELLASK\n' +
|
|
303
|
-
'Dominds 提示:这段内容被解析为“诉请块”,但 `!?@` 后的 mention-id 为空或无效。\n\n' +
|
|
304
|
-
'规则:第一行必须是 `!?@<mention-id>`(mention-id 不能为空),例如:`!?@pangu`。' +
|
|
305
|
-
got);
|
|
306
|
-
}
|
|
307
|
-
default: {
|
|
308
|
-
const _exhaustive = reason;
|
|
309
|
-
return _exhaustive;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
switch (reason) {
|
|
314
|
-
case 'missing_mention_prefix': {
|
|
315
|
-
return ('ERR_MALFORMED_TELLASK\n' +
|
|
316
|
-
'Dominds note: This content was parsed as a tellask block, but the first line is not a valid tellask headline.\n\n' +
|
|
317
|
-
'Rule: the first line must start with `!?@<mention-id>`, e.g. `!?@pangu`.\n' +
|
|
318
|
-
'If you want normal markdown, do not start the line with `!?`.' +
|
|
319
|
-
got);
|
|
320
|
-
}
|
|
321
|
-
case 'invalid_mention_id': {
|
|
322
|
-
return ('ERR_MALFORMED_TELLASK\n' +
|
|
323
|
-
'Dominds note: This content was parsed as a tellask block, but the mention-id after `!?@` is empty or invalid.\n\n' +
|
|
324
|
-
'Rule: the first line must be `!?@<mention-id>` (mention-id cannot be empty), e.g. `!?@pangu`.' +
|
|
325
|
-
got);
|
|
326
|
-
}
|
|
327
|
-
default: {
|
|
328
|
-
const _exhaustive = reason;
|
|
329
|
-
return _exhaustive;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
function formatDomindsNoteInvalidMultiTeammateTargets(language, options) {
|
|
334
|
-
const unknown = options.unknown.map((id) => `@${id}`).join(', ');
|
|
335
|
-
if (language === 'zh') {
|
|
336
|
-
return ('ERR_INVALID_MULTI_TEAMMATE_TARGETS\n' +
|
|
337
|
-
`Dominds 提示:这条队友诉请包含未知队友呼号:${unknown}\n\n` +
|
|
338
|
-
'在队友诉请中,headline 里出现的队友呼号会被视为 collective targets 并被分发(所有目标共享同一 tellaskHead+tellaskBody)。\n' +
|
|
339
|
-
'请确认这些呼号是否存在于团队目录中;若你只是想写字面上的 @something,请用反引号包裹(例如 `@something`)。');
|
|
340
|
-
}
|
|
341
|
-
return ('ERR_INVALID_MULTI_TEAMMATE_TARGETS\n' +
|
|
342
|
-
`Dominds note: This teammate tellask includes unknown teammate id(s): ${unknown}\n\n` +
|
|
343
|
-
'In teammate tellasks, teammate mentions inside the headline are treated as collective targets and fanned out (shared tellaskHead+tellaskBody).\n' +
|
|
344
|
-
'Confirm those ids exist in the team roster; if you meant a literal `@something`, wrap it in backticks (e.g., `@something`).');
|
|
345
|
-
}
|
|
346
|
-
function formatDomindsNoteInvalidTellaskSessionDirective(language) {
|
|
347
|
-
if (language === 'zh') {
|
|
348
|
-
return ('ERR_INVALID_TELLASK_SESSION_DIRECTIVE\n' +
|
|
349
|
-
'Dominds 提示:检测到 `!tellaskSession` 指令,但 tellaskSession 无效。\n\n' +
|
|
350
|
-
'规则:`!tellaskSession <tellaskSession>` 的 tellaskSession 必须满足 `^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z0-9_-]+)*$`。');
|
|
351
|
-
}
|
|
352
|
-
return ('ERR_INVALID_TELLASK_SESSION_DIRECTIVE\n' +
|
|
353
|
-
'Dominds note: Detected a `!tellaskSession` directive, but the tellaskSession is invalid.\n\n' +
|
|
354
|
-
'Rule: `!tellaskSession <tellaskSession>` must match `^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z0-9_-]+)*$`.');
|
|
355
|
-
}
|
|
356
|
-
function formatDomindsNoteMultipleTellaskSessionDirectives(language) {
|
|
357
|
-
if (language === 'zh') {
|
|
358
|
-
return ('ERR_MULTIPLE_TELLASK_SESSION_DIRECTIVES\n' +
|
|
359
|
-
'Dominds 提示:同一条诉请的 headline 中出现了多个 `!tellaskSession` 指令。\n\n' +
|
|
360
|
-
'规则:每条诉请最多只能包含一个 `!tellaskSession <tellaskSession>`(对 collective teammate tellask,该 tellaskSession 会对所有目标队友生效)。');
|
|
361
|
-
}
|
|
362
|
-
return ('ERR_MULTIPLE_TELLASK_SESSION_DIRECTIVES\n' +
|
|
363
|
-
'Dominds note: Multiple `!tellaskSession` directives were found in the headline.\n\n' +
|
|
364
|
-
'Rule: a tellask may include at most one `!tellaskSession <tellaskSession>` (for collective teammate tellasks, the same tellaskSession applies to all targets).');
|
|
365
|
-
}
|
|
@@ -8,17 +8,10 @@
|
|
|
8
8
|
* - Do not store formatted text inside persisted records; keep raw fields only.
|
|
9
9
|
*
|
|
10
10
|
* UI display contract:
|
|
11
|
-
* - Display the record data only (
|
|
12
|
-
* - Call display (request/assignment): render
|
|
13
|
-
* - Response display: render
|
|
14
|
-
* then a horizontal divider (`---`), then the response body.
|
|
11
|
+
* - Display the record data only (mention list + tellask content).
|
|
12
|
+
* - Call display (request/assignment): render mention list, then tellask content.
|
|
13
|
+
* - Response display: render response body first, then original call site summary.
|
|
15
14
|
* - Participant identity (from/to/responder) should live in bubble chrome, not inside content.
|
|
16
|
-
*
|
|
17
|
-
* LLM context contract:
|
|
18
|
-
* - Use the same markdown record layout as the UI for the record data.
|
|
19
|
-
* - Prepend a short natural-language narrative line that states:
|
|
20
|
-
* who is in what role (requester/responder/assignee) and what action occurred.
|
|
21
|
-
* - Include the original tellask headline in the narrative for clarity.
|
|
22
15
|
*/
|
|
23
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
17
|
exports.formatAssignmentFromSupdialog = formatAssignmentFromSupdialog;
|
|
@@ -31,37 +24,48 @@ function requireNonEmpty(value, fieldLabel) {
|
|
|
31
24
|
}
|
|
32
25
|
return value;
|
|
33
26
|
}
|
|
27
|
+
function trimTrailingDots(value) {
|
|
28
|
+
let out = value;
|
|
29
|
+
while (out.endsWith('.'))
|
|
30
|
+
out = out.slice(0, -1);
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
function requireMentionLine(mentionList) {
|
|
34
|
+
const mentionLine = mentionList.join(' ').trim();
|
|
35
|
+
return requireNonEmpty(mentionLine, 'mentionList');
|
|
36
|
+
}
|
|
34
37
|
function formatAssignmentFromSupdialog(input) {
|
|
35
38
|
const language = input.language ?? 'en';
|
|
36
39
|
const to = requireNonEmpty(input.toAgentId, 'toAgentId');
|
|
37
40
|
const from = requireNonEmpty(input.fromAgentId, 'fromAgentId');
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
+
const tellaskContent = requireNonEmpty(input.tellaskContent, 'tellaskContent');
|
|
42
|
+
const isFbr = input.callName === 'freshBootsReasoning';
|
|
43
|
+
if (isFbr) {
|
|
41
44
|
const intro = language === 'zh'
|
|
42
45
|
? [
|
|
43
46
|
'# 扪心自问(FBR)自诉请',
|
|
44
47
|
'',
|
|
45
|
-
`- 诉请:\`${tellaskHead}\``,
|
|
46
48
|
'- 约束:这是一个 FBR 支线对话;请以“初心视角”独立推理与总结。',
|
|
47
|
-
'-
|
|
49
|
+
'- 回问:若当前回合函数工具可用,且你需要澄清关键上下文,可使用 `tellaskBack` 回问上游;否则不要发起任何诉请。',
|
|
48
50
|
'- 重要:不要依赖诉请者对话历史;仅基于诉请正文(以及本支线对话自身的会话历史,如有)。',
|
|
49
51
|
'',
|
|
50
52
|
'---',
|
|
51
53
|
].join('\n')
|
|
52
54
|
: [
|
|
53
|
-
'#
|
|
55
|
+
'# Fresh Boots Reasoning (FBR) request',
|
|
54
56
|
'',
|
|
55
|
-
`- Tellask: \`${tellaskHead}\``,
|
|
56
57
|
'- Constraint: this is an FBR sideline dialog; reason independently from a “fresh boots” perspective.',
|
|
57
|
-
'- TellaskBack:
|
|
58
|
+
'- TellaskBack: if function tools are enabled for this turn and you must clarify critical missing context, use `tellaskBack`; otherwise do not emit tellasks.',
|
|
58
59
|
'- Important: do not rely on the tellasker dialog history; use only the tellask body (and this sideline dialog’s own history, if any).',
|
|
59
60
|
'',
|
|
60
61
|
'---',
|
|
61
62
|
].join('\n');
|
|
62
|
-
|
|
63
|
-
return `${intro}\n\n${body}\n`;
|
|
63
|
+
return `${intro}\n\n${tellaskContent}\n`;
|
|
64
64
|
}
|
|
65
|
+
if (input.callName !== 'tellask' && input.callName !== 'tellaskSessionless') {
|
|
66
|
+
throw new Error(`Unsupported callName for assignment formatting: ${input.callName}`);
|
|
67
|
+
}
|
|
68
|
+
const mentionLine = requireMentionLine(input.mentionList ?? []);
|
|
65
69
|
const rawTargets = input.collectiveTargets && input.collectiveTargets.length > 0 ? input.collectiveTargets : [to];
|
|
66
70
|
const cleanedTargets = rawTargets.map(trimTrailingDots).filter((t) => t.trim() !== '');
|
|
67
71
|
const uniqueTargets = Array.from(new Set(cleanedTargets));
|
|
@@ -80,17 +84,7 @@ function formatAssignmentFromSupdialog(input) {
|
|
|
80
84
|
? `你好 @${to},我是 @${from}。这是一项集体诉请(collective assignment),同时发给:${targetsText}。请作为其中一员并行推进,必要时与其他队友对齐:`
|
|
81
85
|
: `Hi @${to}, this is @${from}. This is a collective assignment sent to: ${targetsText}. Please proceed in parallel as one of the assignees and coordinate with other teammates when needed:`;
|
|
82
86
|
})();
|
|
83
|
-
return `${greeting}
|
|
84
|
-
|
|
85
|
-
${(0, fmt_1.markdownQuote)(tellaskHead)}
|
|
86
|
-
${(0, fmt_1.markdownQuote)(input.tellaskBody)}
|
|
87
|
-
`;
|
|
88
|
-
}
|
|
89
|
-
function trimTrailingDots(value) {
|
|
90
|
-
let out = value;
|
|
91
|
-
while (out.endsWith('.'))
|
|
92
|
-
out = out.slice(0, -1);
|
|
93
|
-
return out;
|
|
87
|
+
return `${greeting}\n\n${(0, fmt_1.markdownQuote)(mentionLine)}\n${(0, fmt_1.markdownQuote)(tellaskContent)}\n`;
|
|
94
88
|
}
|
|
95
89
|
function formatSupdialogCallPrompt(input) {
|
|
96
90
|
const language = input.language ?? 'en';
|
|
@@ -100,35 +94,41 @@ function formatSupdialogCallPrompt(input) {
|
|
|
100
94
|
const asking = language === 'zh'
|
|
101
95
|
? `\`@${requireNonEmpty(input.fromAgentId, 'fromAgentId')}\` 回问:`
|
|
102
96
|
: `\`@${requireNonEmpty(input.fromAgentId, 'fromAgentId')}\` TellaskBack:`;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
97
|
+
const supMention = (() => {
|
|
98
|
+
if (input.supdialogAssignment.callName === 'tellask' ||
|
|
99
|
+
input.supdialogAssignment.callName === 'tellaskSessionless') {
|
|
100
|
+
return (0, fmt_1.markdownQuote)(requireMentionLine(input.supdialogAssignment.mentionList ?? []));
|
|
101
|
+
}
|
|
102
|
+
return '';
|
|
103
|
+
})();
|
|
104
|
+
const subMention = (() => {
|
|
105
|
+
if (input.subdialogRequest.callName === 'tellask' ||
|
|
106
|
+
input.subdialogRequest.callName === 'tellaskSessionless') {
|
|
107
|
+
return (0, fmt_1.markdownQuote)(requireMentionLine(input.subdialogRequest.mentionList ?? []));
|
|
108
|
+
}
|
|
109
|
+
return '';
|
|
110
|
+
})();
|
|
111
|
+
return `${hello}\n\n${supMention ? `${supMention}\n` : ''}${(0, fmt_1.markdownQuote)(requireNonEmpty(input.supdialogAssignment.tellaskContent, 'assignmentTellaskContent'))}\n\n${asking}\n\n${subMention ? `${subMention}\n` : ''}${(0, fmt_1.markdownQuote)(requireNonEmpty(input.subdialogRequest.tellaskContent, 'requestTellaskContent'))}\n`;
|
|
112
112
|
}
|
|
113
113
|
function formatTeammateResponseContent(input) {
|
|
114
114
|
const language = input.language ?? 'en';
|
|
115
|
-
const
|
|
116
|
-
const
|
|
117
|
-
if (
|
|
118
|
-
const title = language === 'zh' ? '【扪心自问(FBR)支线对话回贴】' : '[FBR
|
|
119
|
-
// Keep response body as plain markdown (no quote) to make it easy to read and integrate.
|
|
115
|
+
const tellaskContent = requireNonEmpty(input.tellaskContent, 'tellaskContent');
|
|
116
|
+
const isFbr = input.callName === 'freshBootsReasoning';
|
|
117
|
+
if (isFbr) {
|
|
118
|
+
const title = language === 'zh' ? '【扪心自问(FBR)支线对话回贴】' : '[FBR sideline response]';
|
|
120
119
|
return `${title}\n\n${input.responseBody}\n`;
|
|
121
120
|
}
|
|
121
|
+
if (input.callName !== 'tellask' &&
|
|
122
|
+
input.callName !== 'tellaskSessionless' &&
|
|
123
|
+
input.callName !== 'tellaskBack') {
|
|
124
|
+
throw new Error(`Unsupported callName for teammate response formatting: ${input.callName}`);
|
|
125
|
+
}
|
|
126
|
+
const mentionLine = input.callName === 'tellask' || input.callName === 'tellaskSessionless'
|
|
127
|
+
? requireMentionLine(input.mentionList ?? [])
|
|
128
|
+
: '';
|
|
122
129
|
const hello = language === 'zh'
|
|
123
130
|
? `你好 @${requireNonEmpty(input.requesterId, 'toAgentId')},@${requireNonEmpty(input.responderId, 'fromAgentId')} 已回复:`
|
|
124
131
|
: `Hi @${requireNonEmpty(input.requesterId, 'toAgentId')}, @${requireNonEmpty(input.responderId, 'fromAgentId')} provided response:`;
|
|
125
132
|
const tail = language === 'zh' ? '针对原始诉请:' : 'regarding the original tellask:';
|
|
126
|
-
return `${hello}
|
|
127
|
-
|
|
128
|
-
${(0, fmt_1.markdownQuote)(input.responseBody)}
|
|
129
|
-
|
|
130
|
-
${tail}
|
|
131
|
-
|
|
132
|
-
${(0, fmt_1.markdownQuote)(originalCallHeadLine)}
|
|
133
|
-
`;
|
|
133
|
+
return `${hello}\n\n${(0, fmt_1.markdownQuote)(input.responseBody)}\n\n${tail}\n\n${mentionLine ? `${(0, fmt_1.markdownQuote)(mentionLine)}\n` : ''}${(0, fmt_1.markdownQuote)(tellaskContent)}\n`;
|
|
134
134
|
}
|
|
@@ -19,7 +19,7 @@ description: Start from a blank taskdoc, initialize and launch a new task
|
|
|
19
19
|
|
|
20
20
|
## Constraints:
|
|
21
21
|
|
|
22
|
-
- Except for taskdoc sections (`change_mind(selector, category)`), do not create new documents unless explicitly requested by the human user; if truly required for the task,
|
|
22
|
+
- Except for taskdoc sections (`change_mind(selector, category)`), do not create new documents unless explicitly requested by the human user; if truly required for the task, call `askHuman` for permission
|
|
23
23
|
|
|
24
24
|
## Grants:
|
|
25
25
|
|
|
@@ -19,7 +19,7 @@ description: 从空白差遣牒开始,初始化并启动新任务
|
|
|
19
19
|
|
|
20
20
|
## 约束:
|
|
21
21
|
|
|
22
|
-
- 差遣牒章节(change_mind(selector, category)
|
|
22
|
+
- 差遣牒章节(change_mind(selector, category))以外,不得创建新文档,除非人类用户明确要求;若确为任务所需,使用 `askHuman` 获取许可
|
|
23
23
|
|
|
24
24
|
## 授权:
|
|
25
25
|
|
|
@@ -28,4 +28,3 @@ description: 从空白差遣牒开始,初始化并启动新任务
|
|
|
28
28
|
## 下一步:
|
|
29
29
|
|
|
30
30
|
先更新差遣牒,然后开始行动!
|
|
31
|
-
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-
|
|
1
|
+
import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-Vrp1PT3b.js";
|
|
2
2
|
var symbolTag$1 = "[object Symbol]";
|
|
3
3
|
function isSymbol(value) {
|
|
4
4
|
return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$1;
|
|
@@ -658,4 +658,4 @@ export {
|
|
|
658
658
|
hasIn as x,
|
|
659
659
|
toString as y
|
|
660
660
|
};
|
|
661
|
-
//# sourceMappingURL=_baseUniq-
|
|
661
|
+
//# sourceMappingURL=_baseUniq-D4N_zVXV.js.map
|