dominds 0.7.0 → 0.7.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/dist/agent-priming.js +162 -24
- package/dist/docs/dialog-system.md +18 -16
- package/dist/docs/dialog-system.zh.md +20 -19
- package/dist/llm/driver-v2/core.js +101 -1
- package/dist/llm/driver-v2/orchestrator.js +7 -0
- package/dist/llm/driver-v2/round.js +114 -4
- package/dist/llm/driver-v2/tellask-bridge.js +29 -2
- package/dist/llm/driver.js +54 -2
- package/dist/persistence.js +20 -0
- package/dist/server/websocket-handler.js +99 -7
- package/dist/shared/diligence.js +8 -2
- package/dist/static/assets/{_baseUniq-BxKNVs_E.js → _baseUniq-C04fddeD.js} +2 -2
- package/dist/static/assets/{_baseUniq-BxKNVs_E.js.map → _baseUniq-C04fddeD.js.map} +1 -1
- package/dist/static/assets/{arc-SobL0GO-.js → arc-qmZerooe.js} +2 -2
- package/dist/static/assets/{arc-SobL0GO-.js.map → arc-qmZerooe.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js → architectureDiagram-VXUJARFQ-DPAwJ19g.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js.map → architectureDiagram-VXUJARFQ-DPAwJ19g.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js → blockDiagram-VD42YOAC-M0jbEJ-1.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js.map → blockDiagram-VD42YOAC-M0jbEJ-1.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js → c4Diagram-YG6GDRKO-DlF8gwFw.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js.map → c4Diagram-YG6GDRKO-DlF8gwFw.js.map} +1 -1
- package/dist/static/assets/{channel-CNJ5IKbI.js → channel-B2Ph7be3.js} +2 -2
- package/dist/static/assets/{channel-CNJ5IKbI.js.map → channel-B2Ph7be3.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js → chunk-4BX2VUAB-BZ2L6PK1.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js.map → chunk-4BX2VUAB-BZ2L6PK1.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js → chunk-55IACEB6-COXFmnJW.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js.map → chunk-55IACEB6-COXFmnJW.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js → chunk-B4BG7PRW-B1HiWlBq.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js.map → chunk-B4BG7PRW-B1HiWlBq.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js → chunk-DI55MBZ5-BO3wQRnL.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js.map → chunk-DI55MBZ5-BO3wQRnL.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js → chunk-FMBD7UC4-BdavRHSy.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js.map → chunk-FMBD7UC4-BdavRHSy.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js → chunk-QN33PNHL-DchoUNF7.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js.map → chunk-QN33PNHL-DchoUNF7.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js → chunk-QZHKN3VN-Dr3uVTtK.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js.map → chunk-QZHKN3VN-Dr3uVTtK.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js → chunk-TZMSLE5B-BhOcHZNs.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js.map → chunk-TZMSLE5B-BhOcHZNs.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js → classDiagram-2ON5EDUG-Dep-MR6W.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js.map → classDiagram-2ON5EDUG-Dep-MR6W.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js → classDiagram-v2-WZHVMYZB-Dep-MR6W.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js.map → classDiagram-v2-WZHVMYZB-Dep-MR6W.js.map} +1 -1
- package/dist/static/assets/{clone-CfBpi3MU.js → clone-DzoL-dSX.js} +2 -2
- package/dist/static/assets/{clone-CfBpi3MU.js.map → clone-DzoL-dSX.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js → cose-bilkent-S5V4N54A-Bqu_DqDB.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js.map → cose-bilkent-S5V4N54A-Bqu_DqDB.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js → dagre-6UL2VRFP-49InNTzs.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js.map → dagre-6UL2VRFP-49InNTzs.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js → diagram-PSM6KHXK-C1IsQq8m.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js.map → diagram-PSM6KHXK-C1IsQq8m.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js → diagram-QEK2KX5R-DyJeSg_Y.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js.map → diagram-QEK2KX5R-DyJeSg_Y.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js → diagram-S2PKOQOG-aeLjjldp.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js.map → diagram-S2PKOQOG-aeLjjldp.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js → erDiagram-Q2GNP2WA-BUcv4AUq.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js.map → erDiagram-Q2GNP2WA-BUcv4AUq.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js → flowDiagram-NV44I4VS-DfmTKlf_.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js.map → flowDiagram-NV44I4VS-DfmTKlf_.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js → ganttDiagram-JELNMOA3-BpJE8Lhp.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js.map → ganttDiagram-JELNMOA3-BpJE8Lhp.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js → gitGraphDiagram-NY62KEGX-DmznjSYb.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js.map → gitGraphDiagram-NY62KEGX-DmznjSYb.js.map} +1 -1
- package/dist/static/assets/{graph-K6mmQESm.js → graph-CcKyIZaL.js} +3 -3
- package/dist/static/assets/{graph-K6mmQESm.js.map → graph-CcKyIZaL.js.map} +1 -1
- package/dist/static/assets/{index-RV1MEt3b.js → index-CQr8MdPI.js} +77 -44
- package/dist/static/assets/index-CQr8MdPI.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js → infoDiagram-WHAUD3N6-DwRPjndM.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js.map → infoDiagram-WHAUD3N6-DwRPjndM.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js → journeyDiagram-XKPGCS4Q-BRAFSgVa.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js.map → journeyDiagram-XKPGCS4Q-BRAFSgVa.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js → kanban-definition-3W4ZIXB7-DlJ7-fgN.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js.map → kanban-definition-3W4ZIXB7-DlJ7-fgN.js.map} +1 -1
- package/dist/static/assets/{layout-BcrPlYah.js → layout-CcW5-Iee.js} +5 -5
- package/dist/static/assets/{layout-BcrPlYah.js.map → layout-CcW5-Iee.js.map} +1 -1
- package/dist/static/assets/{linear-DYXbzldi.js → linear-sKdPIuOH.js} +2 -2
- package/dist/static/assets/{linear-DYXbzldi.js.map → linear-sKdPIuOH.js.map} +1 -1
- package/dist/static/assets/{min-CAfJrdkg.js → min-CQ0AYqmk.js} +3 -3
- package/dist/static/assets/{min-CAfJrdkg.js.map → min-CQ0AYqmk.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js → mindmap-definition-VGOIOE7T-CTRwSlu8.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js.map → mindmap-definition-VGOIOE7T-CTRwSlu8.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js → pieDiagram-ADFJNKIX-DmD5KRKE.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js.map → pieDiagram-ADFJNKIX-DmD5KRKE.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js → quadrantDiagram-AYHSOK5B-C5sqZOBF.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js.map → quadrantDiagram-AYHSOK5B-C5sqZOBF.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js → requirementDiagram-UZGBJVZJ-DBAUwM-7.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js.map → requirementDiagram-UZGBJVZJ-DBAUwM-7.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js → sankeyDiagram-TZEHDZUN-CkaxkOo7.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js.map → sankeyDiagram-TZEHDZUN-CkaxkOo7.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js → sequenceDiagram-WL72ISMW-CJ6wMDXh.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js.map → sequenceDiagram-WL72ISMW-CJ6wMDXh.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js → stateDiagram-FKZM4ZOC-C66ZP2NW.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js.map → stateDiagram-FKZM4ZOC-C66ZP2NW.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js → stateDiagram-v2-4FDKWEC3-DdoOy271.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js.map → stateDiagram-v2-4FDKWEC3-DdoOy271.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js → timeline-definition-IT6M3QCI-2A2Mqedz.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js.map → timeline-definition-IT6M3QCI-2A2Mqedz.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js → treemap-KMMF4GRG-CTbGSr5o.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js.map → treemap-KMMF4GRG-CTbGSr5o.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js → xychartDiagram-PRI3JC2R-C_S3XXZI.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js.map → xychartDiagram-PRI3JC2R-C_S3XXZI.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/package.json +1 -1
- package/dist/static/assets/index-RV1MEt3b.js.map +0 -1
package/dist/agent-priming.js
CHANGED
|
@@ -57,6 +57,26 @@ const BASELINE_ENV_SNAPSHOT_CMD = 'uname -a';
|
|
|
57
57
|
const PRIMING_VCS_SESSION_SLUG = 'rtws-vcs-inventory';
|
|
58
58
|
const cacheByAgentId = new Map();
|
|
59
59
|
const inflightByAgentId = new Map();
|
|
60
|
+
class AgentPrimingInterruptedError extends Error {
|
|
61
|
+
constructor(reason) {
|
|
62
|
+
super(`Agent Priming interrupted: ${reason}`);
|
|
63
|
+
this.name = 'AgentPrimingInterruptedError';
|
|
64
|
+
this.reason = reason;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function isAgentPrimingInterruptedError(error) {
|
|
68
|
+
return error instanceof AgentPrimingInterruptedError;
|
|
69
|
+
}
|
|
70
|
+
function throwIfAgentPrimingStopped(dlg, abortSignal) {
|
|
71
|
+
if (!abortSignal.aborted) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const reason = (0, dialog_run_state_1.getStopRequestedReason)(dlg.id);
|
|
75
|
+
if (reason === 'emergency_stop' || reason === 'user_stop') {
|
|
76
|
+
throw new AgentPrimingInterruptedError(reason);
|
|
77
|
+
}
|
|
78
|
+
throw new AgentPrimingInterruptedError('user_stop');
|
|
79
|
+
}
|
|
60
80
|
async function emitSayingEventsAndPersist(dlg, content) {
|
|
61
81
|
const calls = await (0, driver_entry_1.emitSayingEvents)(dlg, content);
|
|
62
82
|
const genseq = dlg.activeGenSeqOrUndefined;
|
|
@@ -156,8 +176,23 @@ function scheduleAgentPrimingForNewDialog(dlg, options) {
|
|
|
156
176
|
}
|
|
157
177
|
// mode === 'do': wait for in-flight then run again for this dialog.
|
|
158
178
|
if (options.mode === 'do') {
|
|
159
|
-
return runAgentPrimingLive(dlg)
|
|
179
|
+
return runAgentPrimingLive(dlg)
|
|
180
|
+
.then((next) => {
|
|
160
181
|
cacheByAgentId.set(agentId, next);
|
|
182
|
+
})
|
|
183
|
+
.catch((err) => {
|
|
184
|
+
if (isAgentPrimingInterruptedError(err)) {
|
|
185
|
+
log_1.log.info('Agent Priming interrupted; will retry on next dialog', undefined, {
|
|
186
|
+
agentId,
|
|
187
|
+
reason: err.reason,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
log_1.log.warn('Agent Priming live run failed; will retry on next dialog', err, {
|
|
192
|
+
agentId,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return undefined;
|
|
161
196
|
});
|
|
162
197
|
}
|
|
163
198
|
return Promise.resolve();
|
|
@@ -170,7 +205,15 @@ function scheduleAgentPrimingForNewDialog(dlg, options) {
|
|
|
170
205
|
})
|
|
171
206
|
.catch((err) => {
|
|
172
207
|
// Best-effort: avoid unhandled rejections; the dialog itself is already marked interrupted.
|
|
173
|
-
|
|
208
|
+
if (isAgentPrimingInterruptedError(err)) {
|
|
209
|
+
log_1.log.info('Agent Priming interrupted; will retry on next dialog', undefined, {
|
|
210
|
+
agentId,
|
|
211
|
+
reason: err.reason,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
log_1.log.warn('Agent Priming live run failed; will retry on next dialog', err, { agentId });
|
|
216
|
+
}
|
|
174
217
|
return null;
|
|
175
218
|
})
|
|
176
219
|
.finally(() => {
|
|
@@ -834,7 +877,7 @@ function formatFbrTellaskBody(language, snapshotText, options) {
|
|
|
834
877
|
].join('\n');
|
|
835
878
|
}
|
|
836
879
|
async function generatePrimingNoteViaMainlineAgent(options) {
|
|
837
|
-
const { dlg, shellSnapshotText, shellResponseText, vcsRound1Text, vcsRound2Text, fbrResponses, fbrTellaskHead, fbrCallId, } = options;
|
|
880
|
+
const { dlg, shellSnapshotText, shellResponseText, vcsRound1Text, vcsRound2Text, fbrResponses, fbrTellaskHead, fbrCallId, assertNotStopped, } = options;
|
|
838
881
|
// Trigger a normal drive and rely on driver.ts context assembly.
|
|
839
882
|
// Agent Priming must not trigger Diligence Push (“鞭策”); it should be best-effort
|
|
840
883
|
// one-shot distillation with no keep-going injection.
|
|
@@ -949,6 +992,7 @@ async function generatePrimingNoteViaMainlineAgent(options) {
|
|
|
949
992
|
].join('\n');
|
|
950
993
|
// IMPORTANT: this is an internal (non-persisted) prompt. driver.ts will inject it into
|
|
951
994
|
// the LLM context for this drive only, without polluting dialog history.
|
|
995
|
+
assertNotStopped?.();
|
|
952
996
|
await (0, driver_entry_1.driveDialogStream)(dlg, {
|
|
953
997
|
content: internalPrompt,
|
|
954
998
|
msgId: (0, id_1.generateShortId)(),
|
|
@@ -956,6 +1000,7 @@ async function generatePrimingNoteViaMainlineAgent(options) {
|
|
|
956
1000
|
persistMode: 'internal',
|
|
957
1001
|
skipTaskdoc: true,
|
|
958
1002
|
}, true);
|
|
1003
|
+
assertNotStopped?.();
|
|
959
1004
|
const afterMsgs = dlg.msgs.length;
|
|
960
1005
|
if (afterMsgs <= beforeMsgs) {
|
|
961
1006
|
throw new Error('Agent Priming distillation produced no new messages.');
|
|
@@ -1077,15 +1122,24 @@ function buildCoursePrefixMsgs(entry) {
|
|
|
1077
1122
|
return out;
|
|
1078
1123
|
}
|
|
1079
1124
|
async function replayAgentPriming(dlg, entry) {
|
|
1125
|
+
const hadActiveRunBefore = (0, dialog_run_state_1.hasActiveRun)(dlg.id);
|
|
1126
|
+
const primingAbortSignal = (0, dialog_run_state_1.createActiveRun)(dlg.id);
|
|
1127
|
+
const ownsActiveRun = !hadActiveRunBefore;
|
|
1128
|
+
const assertNotStopped = () => {
|
|
1129
|
+
throwIfAgentPrimingStopped(dlg, primingAbortSignal);
|
|
1130
|
+
};
|
|
1080
1131
|
const release = await dlg.acquire();
|
|
1132
|
+
let interruptedRunState = null;
|
|
1081
1133
|
try {
|
|
1082
1134
|
const language = (0, runtime_language_1.getWorkLanguage)();
|
|
1083
1135
|
dlg.setCoursePrefixMsgs(buildCoursePrefixMsgs(entry));
|
|
1084
1136
|
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
|
|
1137
|
+
assertNotStopped();
|
|
1085
1138
|
// Phase 1: shell ask (and optional prelude intro)
|
|
1086
1139
|
let shellCallId = null;
|
|
1087
1140
|
let shellTellaskHead = null;
|
|
1088
1141
|
try {
|
|
1142
|
+
assertNotStopped();
|
|
1089
1143
|
await dlg.notifyGeneratingStart();
|
|
1090
1144
|
await emitUiOnlyMarkdownEventsAndPersist(dlg, formatPreludeIntro(language, true, entry.shellPolicy, entry.shell.kind === 'specialist_tellask' ? entry.shell.specialistId : null));
|
|
1091
1145
|
if (entry.shell.kind === 'specialist_tellask') {
|
|
@@ -1115,6 +1169,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1115
1169
|
}
|
|
1116
1170
|
// Phase 2: shell response (separate bubble)
|
|
1117
1171
|
if (entry.shell.kind === 'specialist_tellask' && shellCallId && shellTellaskHead) {
|
|
1172
|
+
assertNotStopped();
|
|
1118
1173
|
await dlg.receiveTeammateResponse(entry.shell.specialistId, shellTellaskHead, 'completed', dlg.id, {
|
|
1119
1174
|
response: entry.shell.responseText,
|
|
1120
1175
|
agentId: entry.shell.specialistId,
|
|
@@ -1129,6 +1184,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1129
1184
|
let round2CallId = null;
|
|
1130
1185
|
let round2TellaskHead = null;
|
|
1131
1186
|
try {
|
|
1187
|
+
assertNotStopped();
|
|
1132
1188
|
await dlg.notifyGeneratingStart();
|
|
1133
1189
|
const round1Content = [
|
|
1134
1190
|
`!?@${entry.vcs.specialistId} !tellaskSession ${entry.vcs.sessionSlug}`,
|
|
@@ -1151,6 +1207,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1151
1207
|
}
|
|
1152
1208
|
}
|
|
1153
1209
|
if (round1CallId && round1TellaskHead) {
|
|
1210
|
+
assertNotStopped();
|
|
1154
1211
|
await dlg.receiveTeammateResponse(entry.vcs.specialistId, round1TellaskHead, 'completed', dlg.id, {
|
|
1155
1212
|
response: entry.vcs.round1.responseText,
|
|
1156
1213
|
agentId: entry.vcs.specialistId,
|
|
@@ -1159,6 +1216,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1159
1216
|
});
|
|
1160
1217
|
}
|
|
1161
1218
|
try {
|
|
1219
|
+
assertNotStopped();
|
|
1162
1220
|
await dlg.notifyGeneratingStart();
|
|
1163
1221
|
const round2Content = [
|
|
1164
1222
|
`!?@${entry.vcs.specialistId} !tellaskSession ${entry.vcs.sessionSlug}`,
|
|
@@ -1181,6 +1239,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1181
1239
|
}
|
|
1182
1240
|
}
|
|
1183
1241
|
if (round2CallId && round2TellaskHead) {
|
|
1242
|
+
assertNotStopped();
|
|
1184
1243
|
await dlg.receiveTeammateResponse(entry.vcs.specialistId, round2TellaskHead, 'completed', dlg.id, {
|
|
1185
1244
|
response: entry.vcs.round2.responseText,
|
|
1186
1245
|
agentId: entry.vcs.specialistId,
|
|
@@ -1191,6 +1250,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1191
1250
|
}
|
|
1192
1251
|
else {
|
|
1193
1252
|
try {
|
|
1253
|
+
assertNotStopped();
|
|
1194
1254
|
await dlg.notifyGeneratingStart();
|
|
1195
1255
|
await emitSayingEventsAndPersist(dlg, entry.vcs.round1NoteMarkdown);
|
|
1196
1256
|
}
|
|
@@ -1203,6 +1263,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1203
1263
|
}
|
|
1204
1264
|
}
|
|
1205
1265
|
try {
|
|
1266
|
+
assertNotStopped();
|
|
1206
1267
|
await dlg.notifyGeneratingStart();
|
|
1207
1268
|
await emitSayingEventsAndPersist(dlg, entry.vcs.round2NoteMarkdown);
|
|
1208
1269
|
}
|
|
@@ -1221,6 +1282,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1221
1282
|
const effort = Math.max(0, Math.floor(entry.fbr.effort));
|
|
1222
1283
|
if (effort >= 1 && entry.fbr.responses.length > 0) {
|
|
1223
1284
|
try {
|
|
1285
|
+
assertNotStopped();
|
|
1224
1286
|
await dlg.notifyGeneratingStart();
|
|
1225
1287
|
const fbrCallBody = [entry.fbr.selfTeaser, '', entry.fbr.tellaskBody].join('\n');
|
|
1226
1288
|
const fbrCallContent = [
|
|
@@ -1248,6 +1310,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1248
1310
|
const normalized = Math.max(1, effort);
|
|
1249
1311
|
const responses = entry.fbr.responses.slice(0, normalized);
|
|
1250
1312
|
for (let i = 0; i < responses.length; i++) {
|
|
1313
|
+
assertNotStopped();
|
|
1251
1314
|
const raw = responses[i] ?? '';
|
|
1252
1315
|
await dlg.receiveTeammateResponse(entry.fbr.responderAgentId, fbrTellaskHead, 'completed', dlg.id, {
|
|
1253
1316
|
response: raw,
|
|
@@ -1260,6 +1323,7 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1260
1323
|
}
|
|
1261
1324
|
// Phase 5: summary bubble
|
|
1262
1325
|
try {
|
|
1326
|
+
assertNotStopped();
|
|
1263
1327
|
await dlg.notifyGeneratingStart();
|
|
1264
1328
|
await emitSayingEventsAndPersist(dlg, entry.primingNote);
|
|
1265
1329
|
}
|
|
@@ -1273,25 +1337,55 @@ async function replayAgentPriming(dlg, entry) {
|
|
|
1273
1337
|
}
|
|
1274
1338
|
}
|
|
1275
1339
|
catch (err) {
|
|
1276
|
-
|
|
1340
|
+
if (isAgentPrimingInterruptedError(err)) {
|
|
1341
|
+
interruptedRunState = {
|
|
1342
|
+
kind: 'interrupted',
|
|
1343
|
+
reason: { kind: err.reason },
|
|
1344
|
+
};
|
|
1345
|
+
log_1.log.info('Agent Priming replay interrupted by stop request', undefined, {
|
|
1346
|
+
dialogId: dlg.id.valueOf(),
|
|
1347
|
+
reason: err.reason,
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1350
|
+
else {
|
|
1351
|
+
log_1.log.warn('Agent Priming replay failed (best-effort)', err, { dialogId: dlg.id.valueOf() });
|
|
1352
|
+
}
|
|
1277
1353
|
}
|
|
1278
1354
|
finally {
|
|
1279
|
-
let nextIdle = { kind: 'idle_waiting_user' };
|
|
1280
1355
|
try {
|
|
1281
|
-
|
|
1356
|
+
if (interruptedRunState) {
|
|
1357
|
+
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, interruptedRunState);
|
|
1358
|
+
}
|
|
1359
|
+
else {
|
|
1360
|
+
let nextIdle = { kind: 'idle_waiting_user' };
|
|
1361
|
+
try {
|
|
1362
|
+
nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
|
|
1363
|
+
}
|
|
1364
|
+
catch (err) {
|
|
1365
|
+
log_1.log.warn('Failed to compute idle runState after Agent Priming replay; falling back', err, {
|
|
1366
|
+
dialogId: dlg.id.valueOf(),
|
|
1367
|
+
});
|
|
1368
|
+
}
|
|
1369
|
+
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
|
|
1370
|
+
}
|
|
1282
1371
|
}
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
}
|
|
1372
|
+
finally {
|
|
1373
|
+
if (ownsActiveRun) {
|
|
1374
|
+
(0, dialog_run_state_1.clearActiveRun)(dlg.id);
|
|
1375
|
+
}
|
|
1376
|
+
release();
|
|
1287
1377
|
}
|
|
1288
|
-
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
|
|
1289
|
-
release();
|
|
1290
1378
|
}
|
|
1291
1379
|
}
|
|
1292
1380
|
async function runAgentPrimingLive(dlg) {
|
|
1293
1381
|
const createdAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
1294
1382
|
const language = (0, runtime_language_1.getWorkLanguage)();
|
|
1383
|
+
const hadActiveRunBefore = (0, dialog_run_state_1.hasActiveRun)(dlg.id);
|
|
1384
|
+
const primingAbortSignal = (0, dialog_run_state_1.createActiveRun)(dlg.id);
|
|
1385
|
+
const ownsActiveRun = !hadActiveRunBefore;
|
|
1386
|
+
const assertNotStopped = () => {
|
|
1387
|
+
throwIfAgentPrimingStopped(dlg, primingAbortSignal);
|
|
1388
|
+
};
|
|
1295
1389
|
const prevDisableDiligencePush = dlg.disableDiligencePush;
|
|
1296
1390
|
// Agent Priming is a bounded bootstrap routine; no keep-going injection should appear
|
|
1297
1391
|
// during the priming lifecycle (including any auto-revive drives triggered by subdialog replies).
|
|
@@ -1319,7 +1413,9 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1319
1413
|
const fbrResponsesForInjection = [];
|
|
1320
1414
|
try {
|
|
1321
1415
|
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
|
|
1416
|
+
assertNotStopped();
|
|
1322
1417
|
const team = await team_1.Team.load();
|
|
1418
|
+
assertNotStopped();
|
|
1323
1419
|
const member = team.getMember(dlg.agentId);
|
|
1324
1420
|
const specialists = team.shellSpecialists
|
|
1325
1421
|
.filter((s) => typeof s === 'string')
|
|
@@ -1339,6 +1435,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1339
1435
|
// Phase 1: shell ask (and optional prelude intro)
|
|
1340
1436
|
if (shellPolicy === 'specialist_only' && specialistId !== null) {
|
|
1341
1437
|
shellTellaskBody = formatShellTellaskBody(language, specialistId);
|
|
1438
|
+
assertNotStopped();
|
|
1342
1439
|
await dlg.withLock(async () => {
|
|
1343
1440
|
try {
|
|
1344
1441
|
await dlg.notifyGeneratingStart();
|
|
@@ -1372,6 +1469,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1372
1469
|
// In both cases we skip the shell Tellask step and let the runtime capture a baseline snapshot.
|
|
1373
1470
|
// Keep it safe and deterministic: no network, no writes.
|
|
1374
1471
|
const unameOutput = await runUnameA();
|
|
1472
|
+
assertNotStopped();
|
|
1375
1473
|
shellResponseText = unameOutput;
|
|
1376
1474
|
snapshotText = unameOutput;
|
|
1377
1475
|
const directNote = (() => {
|
|
@@ -1401,6 +1499,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1401
1499
|
].join('\n');
|
|
1402
1500
|
})();
|
|
1403
1501
|
directNoteMarkdown = directNote;
|
|
1502
|
+
assertNotStopped();
|
|
1404
1503
|
await dlg.withLock(async () => {
|
|
1405
1504
|
try {
|
|
1406
1505
|
await dlg.notifyGeneratingStart();
|
|
@@ -1435,6 +1534,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1435
1534
|
throw new Error('Missing shell tellaskHead');
|
|
1436
1535
|
}
|
|
1437
1536
|
const tellaskBody = shellTellaskBodyForSubdialog ?? shellTellaskBody;
|
|
1537
|
+
assertNotStopped();
|
|
1438
1538
|
const sub = await dlg.withLock(async () => {
|
|
1439
1539
|
return await dlg.createSubDialog(ensuredSpecialistId, ensuredShellTellaskHead, tellaskBody, {
|
|
1440
1540
|
originMemberId: dlg.agentId,
|
|
@@ -1452,6 +1552,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1452
1552
|
collectiveTargets: [ensuredSpecialistId],
|
|
1453
1553
|
});
|
|
1454
1554
|
await (0, driver_entry_1.driveDialogStream)(sub, { content: initPrompt, msgId: (0, id_1.generateShortId)(), grammar: 'markdown', skipTaskdoc: true }, true);
|
|
1555
|
+
assertNotStopped();
|
|
1455
1556
|
shellResponseText = extractLastAssistantSaying(sub.msgs);
|
|
1456
1557
|
const toolResult = extractLastShellCmdResultText(sub.msgs);
|
|
1457
1558
|
snapshotText = toolResult ? toolResult : shellResponseText;
|
|
@@ -1459,7 +1560,9 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1459
1560
|
// Specialist produced no usable output (misconfigured tools, provider issues, etc.).
|
|
1460
1561
|
// Fall back to a runtime-executed `uname -a` so we can still proceed to FBR.
|
|
1461
1562
|
snapshotText = await runUnameA();
|
|
1563
|
+
assertNotStopped();
|
|
1462
1564
|
}
|
|
1565
|
+
assertNotStopped();
|
|
1463
1566
|
await dlg.withLock(async () => {
|
|
1464
1567
|
await dlg.receiveTeammateResponse(ensuredSpecialistId, ensuredShellTellaskHead, 'completed', sub.id, {
|
|
1465
1568
|
response: shellResponseText,
|
|
@@ -1503,6 +1606,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1503
1606
|
}
|
|
1504
1607
|
}
|
|
1505
1608
|
});
|
|
1609
|
+
assertNotStopped();
|
|
1506
1610
|
const round1Sub = await dlg.withLock(async () => {
|
|
1507
1611
|
return await dlg.createSubDialog(ensuredSpecialistId, round1TellaskHead, round1TellaskBodyForSubdialog || vcsRound1Body, {
|
|
1508
1612
|
originMemberId: dlg.agentId,
|
|
@@ -1514,6 +1618,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1514
1618
|
});
|
|
1515
1619
|
const rootDialog = dlg instanceof dialog_1.RootDialog ? dlg : dlg instanceof dialog_1.SubDialog ? dlg.rootDialog : undefined;
|
|
1516
1620
|
if (rootDialog) {
|
|
1621
|
+
assertNotStopped();
|
|
1517
1622
|
rootDialog.registerSubdialog(round1Sub);
|
|
1518
1623
|
await rootDialog.saveSubdialogRegistry();
|
|
1519
1624
|
}
|
|
@@ -1531,10 +1636,12 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1531
1636
|
grammar: 'markdown',
|
|
1532
1637
|
skipTaskdoc: true,
|
|
1533
1638
|
}, true);
|
|
1639
|
+
assertNotStopped();
|
|
1534
1640
|
vcsRound1ResponseText = extractLastAssistantSaying(round1Sub.msgs).trim();
|
|
1535
1641
|
if (!vcsRound1ResponseText) {
|
|
1536
1642
|
throw new Error('Specialist VCS session round-1 returned empty output');
|
|
1537
1643
|
}
|
|
1644
|
+
assertNotStopped();
|
|
1538
1645
|
await dlg.withLock(async () => {
|
|
1539
1646
|
await dlg.receiveTeammateResponse(ensuredSpecialistId, round1TellaskHead, 'completed', round1Sub.id, {
|
|
1540
1647
|
response: vcsRound1ResponseText,
|
|
@@ -1587,10 +1694,12 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1587
1694
|
grammar: 'markdown',
|
|
1588
1695
|
skipTaskdoc: true,
|
|
1589
1696
|
}, true);
|
|
1697
|
+
assertNotStopped();
|
|
1590
1698
|
vcsRound2ResponseText = extractLastAssistantSaying(round1Sub.msgs).trim();
|
|
1591
1699
|
if (!vcsRound2ResponseText) {
|
|
1592
1700
|
throw new Error('Specialist VCS session round-2 returned empty output');
|
|
1593
1701
|
}
|
|
1702
|
+
assertNotStopped();
|
|
1594
1703
|
await dlg.withLock(async () => {
|
|
1595
1704
|
await dlg.receiveTeammateResponse(ensuredSpecialistId, round2TellaskHead, 'completed', round1Sub.id, {
|
|
1596
1705
|
response: vcsRound2ResponseText,
|
|
@@ -1609,6 +1718,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1609
1718
|
}
|
|
1610
1719
|
}
|
|
1611
1720
|
const runtimeInventory = await collectRtwsGitInventory();
|
|
1721
|
+
assertNotStopped();
|
|
1612
1722
|
const runtimeRound1Text = formatRtwsGitInventoryRound1(language, runtimeInventory);
|
|
1613
1723
|
const runtimeRound2Text = formatRtwsGitInventoryRound2(language, runtimeInventory);
|
|
1614
1724
|
const runtimeInventoryText = [runtimeRound1Text, '', runtimeRound2Text].join('\n');
|
|
@@ -1630,6 +1740,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1630
1740
|
vcsRound1NoteMarkdown = formatRuntimeVcsRoundNote(language, 1, vcsRound1ResponseText);
|
|
1631
1741
|
vcsRound2NoteMarkdown = formatRuntimeVcsRoundNote(language, 2, vcsRound2ResponseText);
|
|
1632
1742
|
vcsInventoryText = runtimeInventoryText;
|
|
1743
|
+
assertNotStopped();
|
|
1633
1744
|
await dlg.withLock(async () => {
|
|
1634
1745
|
try {
|
|
1635
1746
|
await dlg.notifyGeneratingStart();
|
|
@@ -1644,6 +1755,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1644
1755
|
}
|
|
1645
1756
|
}
|
|
1646
1757
|
});
|
|
1758
|
+
assertNotStopped();
|
|
1647
1759
|
await dlg.withLock(async () => {
|
|
1648
1760
|
try {
|
|
1649
1761
|
await dlg.notifyGeneratingStart();
|
|
@@ -1683,6 +1795,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1683
1795
|
let fbrTellaskHead = null;
|
|
1684
1796
|
// Phase 3: FBR ask (call bubble)
|
|
1685
1797
|
if (fbrEffort >= 1) {
|
|
1798
|
+
assertNotStopped();
|
|
1686
1799
|
await dlg.withLock(async () => {
|
|
1687
1800
|
try {
|
|
1688
1801
|
await dlg.notifyGeneratingStart();
|
|
@@ -1718,6 +1831,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1718
1831
|
const ensuredFbrTellaskHead = fbrTellaskHead;
|
|
1719
1832
|
const perInstance = Array.from({ length: fbrEffort }, (_, idx) => idx + 1);
|
|
1720
1833
|
const created = await Promise.all(perInstance.map(async (i) => {
|
|
1834
|
+
assertNotStopped();
|
|
1721
1835
|
const instanceBody = fbrEffort > 1
|
|
1722
1836
|
? [
|
|
1723
1837
|
fbrCallBody,
|
|
@@ -1727,6 +1841,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1727
1841
|
: 'Hint: try to provide a distinct angle vs other FBR drafts (e.g. security/constraints/verifiability/risk).',
|
|
1728
1842
|
].join('\n')
|
|
1729
1843
|
: fbrCallBody;
|
|
1844
|
+
assertNotStopped();
|
|
1730
1845
|
const sub = await dlg.withLock(async () => {
|
|
1731
1846
|
return await dlg.createSubDialog(dlg.agentId, ensuredFbrTellaskHead, instanceBody, {
|
|
1732
1847
|
originMemberId: dlg.agentId,
|
|
@@ -1749,10 +1864,13 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1749
1864
|
grammar: 'markdown',
|
|
1750
1865
|
skipTaskdoc: true,
|
|
1751
1866
|
}, true);
|
|
1867
|
+
assertNotStopped();
|
|
1752
1868
|
const responseText = extractLastAssistantSaying(sub.msgs);
|
|
1753
1869
|
return { sub, responseText };
|
|
1754
1870
|
}));
|
|
1871
|
+
assertNotStopped();
|
|
1755
1872
|
for (const r of created) {
|
|
1873
|
+
assertNotStopped();
|
|
1756
1874
|
const responseText = r.responseText;
|
|
1757
1875
|
fbrResponsesForCache.push(responseText);
|
|
1758
1876
|
fbrResponsesForInjection.push({ subdialogId: r.sub.id.selfId, response: responseText });
|
|
@@ -1783,7 +1901,9 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1783
1901
|
fbrResponses: fbrResponsesForInjection,
|
|
1784
1902
|
fbrTellaskHead: fbrTellaskHead,
|
|
1785
1903
|
fbrCallId: fbrCallId,
|
|
1904
|
+
assertNotStopped,
|
|
1786
1905
|
});
|
|
1906
|
+
assertNotStopped();
|
|
1787
1907
|
const entry = {
|
|
1788
1908
|
createdAt,
|
|
1789
1909
|
workLanguage: language,
|
|
@@ -1844,6 +1964,17 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1844
1964
|
return entry;
|
|
1845
1965
|
}
|
|
1846
1966
|
catch (err) {
|
|
1967
|
+
if (isAgentPrimingInterruptedError(err)) {
|
|
1968
|
+
fatalRunState = {
|
|
1969
|
+
kind: 'interrupted',
|
|
1970
|
+
reason: { kind: err.reason },
|
|
1971
|
+
};
|
|
1972
|
+
log_1.log.info('Agent Priming live run interrupted by stop request', undefined, {
|
|
1973
|
+
dialogId: dlg.id.valueOf(),
|
|
1974
|
+
reason: err.reason,
|
|
1975
|
+
});
|
|
1976
|
+
throw err;
|
|
1977
|
+
}
|
|
1847
1978
|
const errText = err instanceof Error ? (err.stack ?? err.message) : String(err);
|
|
1848
1979
|
const errTextTrimmed = errText.trim().slice(0, 4000);
|
|
1849
1980
|
fatalRunState = {
|
|
@@ -1882,20 +2013,27 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1882
2013
|
}
|
|
1883
2014
|
finally {
|
|
1884
2015
|
dlg.disableDiligencePush = prevDisableDiligencePush;
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
else {
|
|
1889
|
-
let nextIdle = { kind: 'idle_waiting_user' };
|
|
1890
|
-
try {
|
|
1891
|
-
nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
|
|
2016
|
+
try {
|
|
2017
|
+
if (fatalRunState) {
|
|
2018
|
+
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, fatalRunState);
|
|
1892
2019
|
}
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
2020
|
+
else {
|
|
2021
|
+
let nextIdle = { kind: 'idle_waiting_user' };
|
|
2022
|
+
try {
|
|
2023
|
+
nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
|
|
2024
|
+
}
|
|
2025
|
+
catch (err) {
|
|
2026
|
+
log_1.log.warn('Failed to compute idle runState after Agent Priming live run; falling back', err, {
|
|
2027
|
+
dialogId: dlg.id.valueOf(),
|
|
2028
|
+
});
|
|
2029
|
+
}
|
|
2030
|
+
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
|
|
2031
|
+
}
|
|
2032
|
+
}
|
|
2033
|
+
finally {
|
|
2034
|
+
if (ownsActiveRun) {
|
|
2035
|
+
(0, dialog_run_state_1.clearActiveRun)(dlg.id);
|
|
1897
2036
|
}
|
|
1898
|
-
await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
|
|
1899
2037
|
}
|
|
1900
2038
|
}
|
|
1901
2039
|
}
|
|
@@ -60,7 +60,8 @@ A **subdlg.yaml** file indexes pending subdialogs that a supdialog is waiting fo
|
|
|
60
60
|
|
|
61
61
|
### Subdialog Registry
|
|
62
62
|
|
|
63
|
-
The **subdialog registry** is a root dialog-scoped Map that maintains persistent references to registered subdialogs. The registry uses `agentId!tellaskSession` as its key format
|
|
63
|
+
The **subdialog registry** is a root dialog-scoped Map that maintains persistent references to registered subdialogs. The registry uses `agentId!tellaskSession` as its key format. It moves with the root to `done/` when the root completes, and is rebuilt on root load by scanning done/ subdialog YAMLs.
|
|
64
|
+
If a sideline dialog is declared dead, its Type B registry entry is removed so the same `agentId!tellaskSession` can start a brand-new sideline dialog on the next Tellask.
|
|
64
65
|
|
|
65
66
|
### Teammate Tellask
|
|
66
67
|
|
|
@@ -367,6 +368,7 @@ flowchart TD
|
|
|
367
368
|
7. **State Preservation Contract**:
|
|
368
369
|
- `clear_mind`: Clears messages, clears Q4H index, preserves reminders, preserves registry
|
|
369
370
|
- Subdialog completion: Writes response to supdialog, removes from pending list (registry unchanged)
|
|
371
|
+
- Subdialog declared dead: marks runState dead and removes its Type B registry entry; same slug can be reused as a fresh sideline dialog
|
|
370
372
|
- Q4H answer: Clears the answered question from index, continues the dialog
|
|
371
373
|
|
|
372
374
|
---
|
|
@@ -770,14 +772,14 @@ The **subdialog registry** is a root-dialog-scoped data structure that maintains
|
|
|
770
772
|
|
|
771
773
|
### Key Characteristics
|
|
772
774
|
|
|
773
|
-
| Aspect | Description
|
|
774
|
-
| --------------- |
|
|
775
|
-
| **Scope** | Root dialog only (not accessible to subdialogs)
|
|
776
|
-
| **Key Format** | `agentId!tellaskSession` (single-level Map)
|
|
777
|
-
| **Storage** | `registry.yaml` in root dialog directory
|
|
778
|
-
| **Lifecycle** |
|
|
779
|
-
| **Persistence** | Moves with root to `done/` when root completes
|
|
780
|
-
| **Restoration** | Rebuilt on root load by scanning done/ subdialog YAMLs
|
|
775
|
+
| Aspect | Description |
|
|
776
|
+
| --------------- | --------------------------------------------------------------- |
|
|
777
|
+
| **Scope** | Root dialog only (not accessible to subdialogs) |
|
|
778
|
+
| **Key Format** | `agentId!tellaskSession` (single-level Map) |
|
|
779
|
+
| **Storage** | `registry.yaml` in root dialog directory |
|
|
780
|
+
| **Lifecycle** | Retained during normal runs; dead subdialog entries are removed |
|
|
781
|
+
| **Persistence** | Moves with root to `done/` when root completes |
|
|
782
|
+
| **Restoration** | Rebuilt on root load by scanning done/ subdialog YAMLs |
|
|
781
783
|
|
|
782
784
|
### Registry Operations
|
|
783
785
|
|
|
@@ -1310,13 +1312,13 @@ The Dominds dialog system provides a robust framework for hierarchical, human-in
|
|
|
1310
1312
|
|
|
1311
1313
|
### Four Core Mechanisms
|
|
1312
1314
|
|
|
1313
|
-
| Mechanism | Purpose | Survives Clarity | Cleared By
|
|
1314
|
-
| ---------------------- | ----------------------------- | ---------------- |
|
|
1315
|
-
| **Dialog Hierarchy** | Parent-child task delegation | N/A | N/A
|
|
1316
|
-
| **Q4H** | Human input requests | No | clear_mind
|
|
1317
|
-
| **Mental Clarity** | Context reset tools | N/A | N/A
|
|
1318
|
-
| **Reminders** | Persistent working memory | Yes | N/A
|
|
1319
|
-
| **Subdialog Registry** | Registered subdialog tracking | Yes |
|
|
1315
|
+
| Mechanism | Purpose | Survives Clarity | Cleared By |
|
|
1316
|
+
| ---------------------- | ----------------------------- | ---------------- | -------------------------------------------- |
|
|
1317
|
+
| **Dialog Hierarchy** | Parent-child task delegation | N/A | N/A |
|
|
1318
|
+
| **Q4H** | Human input requests | No | clear_mind |
|
|
1319
|
+
| **Mental Clarity** | Context reset tools | N/A | N/A |
|
|
1320
|
+
| **Reminders** | Persistent working memory | Yes | N/A |
|
|
1321
|
+
| **Subdialog Registry** | Registered subdialog tracking | Yes | dead-entry prune on `declare_subdialog_dead` |
|
|
1320
1322
|
|
|
1321
1323
|
### Three Types of Teammate Tellasks
|
|
1322
1324
|
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
### 子对话注册表
|
|
62
62
|
|
|
63
|
-
**子对话注册表** 是根对话作用域的 Map,维护对已注册子对话的持久引用。注册表使用 `agentId!tellaskSession`
|
|
63
|
+
**子对话注册表** 是根对话作用域的 Map,维护对已注册子对话的持久引用。注册表使用 `agentId!tellaskSession` 作为其键格式。当根完成时,它随根移动到 `done/`,并在根加载时通过扫描 done/ 子对话 YAML 重建。若某个支线对话被宣布卡死,其对应的 TYPE B 注册表条目会被移除,以便后续可用同一 `agentId!tellaskSession` 创建全新的支线对话。
|
|
64
64
|
|
|
65
65
|
### 队友 Tellask
|
|
66
66
|
|
|
@@ -225,7 +225,7 @@ LLM 发出:!?@orchestrator 我应该如何处理数据库迁移?
|
|
|
225
225
|
|
|
226
226
|
- 每次 Tellask 都会执行注册表查找
|
|
227
227
|
- 支持**恢复**先前的子对话
|
|
228
|
-
-
|
|
228
|
+
- 已注册的子对话在正常流程中会保留;若支线被宣布卡死,其条目会从注册表移除
|
|
229
229
|
- 注册表是根对话作用域的(子对话无法访问)
|
|
230
230
|
|
|
231
231
|
**示例**:
|
|
@@ -358,6 +358,7 @@ flowchart TD
|
|
|
358
358
|
7. **状态保留契约**:
|
|
359
359
|
- `clear_mind`:清除消息,清除 Q4H 索引,保留提醒,保留注册表
|
|
360
360
|
- 子对话完成:向父对话写入响应,从待处理列表中删除(注册表不变)
|
|
361
|
+
- 子对话宣布卡死:将 runState 标记为 dead,并移除对应 TYPE B 注册表条目;同一 slug 可作为全新支线重新发起
|
|
361
362
|
- Q4H 回答:从索引中清除已回答的问题,继续对话
|
|
362
363
|
|
|
363
364
|
---
|
|
@@ -755,14 +756,14 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
|
|
|
755
756
|
|
|
756
757
|
### 关键特征
|
|
757
758
|
|
|
758
|
-
| 方面 | 描述
|
|
759
|
-
| ------------ |
|
|
760
|
-
| **作用域** | 仅限根对话(子对话无法访问)
|
|
761
|
-
| **键格式** | `agentId!tellaskSession`(单级 Map)
|
|
762
|
-
| **存储** | 根对话目录中的 `registry.yaml`
|
|
763
|
-
| **生命周期** |
|
|
764
|
-
| **持久化** | 根完成时随根移动到 `done/`
|
|
765
|
-
| **恢复** | 在根加载时通过扫描 done/ 子对话 YAML 重建
|
|
759
|
+
| 方面 | 描述 |
|
|
760
|
+
| ------------ | ------------------------------------------ |
|
|
761
|
+
| **作用域** | 仅限根对话(子对话无法访问) |
|
|
762
|
+
| **键格式** | `agentId!tellaskSession`(单级 Map) |
|
|
763
|
+
| **存储** | 根对话目录中的 `registry.yaml` |
|
|
764
|
+
| **生命周期** | 正常流程保留;被宣布卡死的子对话条目会移除 |
|
|
765
|
+
| **持久化** | 根完成时随根移动到 `done/` |
|
|
766
|
+
| **恢复** | 在根加载时通过扫描 done/ 子对话 YAML 重建 |
|
|
766
767
|
|
|
767
768
|
### 注册表操作
|
|
768
769
|
|
|
@@ -917,7 +918,7 @@ interface RegistryMethods {
|
|
|
917
918
|
|
|
918
919
|
**导航**:每个子对话都保持对其父级的引用,向上遍历到主对话。
|
|
919
920
|
|
|
920
|
-
**注册表**:已注册的子对话(TYPE B Tellask
|
|
921
|
+
**注册表**:已注册的子对话(TYPE B Tellask)在根对话的注册表中跟踪,并在重启后持久化;若子对话被宣布卡死,其条目会被裁剪,不再参与后续同 slug 复用。
|
|
921
922
|
|
|
922
923
|
### 生命周期管理
|
|
923
924
|
|
|
@@ -1309,13 +1310,13 @@ Dominds 对话系统为层次化、人在回路的 AI 协作提供了一个强
|
|
|
1309
1310
|
|
|
1310
1311
|
### 四个核心机制
|
|
1311
1312
|
|
|
1312
|
-
| 机制 | 目的 | 存活于清晰度 | 清除方式
|
|
1313
|
-
| ---------------- | ---------------- | ------------ |
|
|
1314
|
-
| **对话层次结构** | 父子任务委托 | N/A | N/A
|
|
1315
|
-
| **Q4H** | 人机交互请求 | 否 | clear_mind
|
|
1316
|
-
| **心智清晰度** | 上下文重置工具 | N/A | N/A
|
|
1317
|
-
| **提醒项** | 持久化工作内存 | 是 | N/A
|
|
1318
|
-
| **子对话注册表** | 已注册子对话跟踪 | 是 |
|
|
1313
|
+
| 机制 | 目的 | 存活于清晰度 | 清除方式 |
|
|
1314
|
+
| ---------------- | ---------------- | ------------ | ----------------------------------------- |
|
|
1315
|
+
| **对话层次结构** | 父子任务委托 | N/A | N/A |
|
|
1316
|
+
| **Q4H** | 人机交互请求 | 否 | clear_mind |
|
|
1317
|
+
| **心智清晰度** | 上下文重置工具 | N/A | N/A |
|
|
1318
|
+
| **提醒项** | 持久化工作内存 | 是 | N/A |
|
|
1319
|
+
| **子对话注册表** | 已注册子对话跟踪 | 是 | `declare_subdialog_dead` 时裁剪 dead 条目 |
|
|
1319
1320
|
|
|
1320
1321
|
### 三种队友 Tellask 类型
|
|
1321
1322
|
|
|
@@ -1334,5 +1335,5 @@ Dominds 对话系统为层次化、人在回路的 AI 协作提供了一个强
|
|
|
1334
1335
|
|
|
1335
1336
|
- **Q4H**:持久化,由清晰度操作清除
|
|
1336
1337
|
- **提醒项**:持久化,在清晰度操作中存活
|
|
1337
|
-
- **注册表**:持久化,在清晰度操作中存活,完成时移至 done
|
|
1338
|
+
- **注册表**:持久化,在清晰度操作中存活,完成时移至 done/;dead 条目会在宣布卡死时被裁剪
|
|
1338
1339
|
- **子对话**:已注册的子对话在注册表中持久化;临时子对话不会被注册
|