dominds 1.20.4 → 1.20.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/dialog-factory.d.ts +3 -0
  2. package/dist/dialog-factory.js +2 -6
  3. package/dist/dialog-fork.js +4 -2
  4. package/dist/dialog.d.ts +11 -0
  5. package/dist/dialog.js +6 -0
  6. package/dist/docs/dialog-system.md +15 -0
  7. package/dist/docs/dialog-system.zh.md +11 -0
  8. package/dist/docs/q4h.md +14 -10
  9. package/dist/docs/q4h.zh.md +13 -11
  10. package/dist/docs/tellask-revive-context-refactor.zh.md +1 -0
  11. package/dist/llm/kernel-driver/drive.js +32 -1
  12. package/dist/llm/kernel-driver/flow.js +2 -2
  13. package/dist/llm/kernel-driver/sideDialog.d.ts +9 -0
  14. package/dist/llm/kernel-driver/sideDialog.js +14 -12
  15. package/dist/llm/kernel-driver/tellask-special.js +163 -16
  16. package/dist/llm/kernel-driver/types.d.ts +3 -0
  17. package/dist/persistence.d.ts +3 -1
  18. package/dist/persistence.js +47 -34
  19. package/dist/priming.js +68 -9
  20. package/package.json +3 -3
  21. package/webapp/dist/assets/{_basePickBy-BrC49DPW.js → _basePickBy-DFzVggWM.js} +3 -3
  22. package/webapp/dist/assets/{_basePickBy-BrC49DPW.js.map → _basePickBy-DFzVggWM.js.map} +1 -1
  23. package/webapp/dist/assets/{_baseUniq-C_Wcx-_S.js → _baseUniq-CXD_3O9i.js} +2 -2
  24. package/webapp/dist/assets/{_baseUniq-C_Wcx-_S.js.map → _baseUniq-CXD_3O9i.js.map} +1 -1
  25. package/webapp/dist/assets/{arc-X5iIdpx0.js → arc--yzhIodb.js} +2 -2
  26. package/webapp/dist/assets/{arc-X5iIdpx0.js.map → arc--yzhIodb.js.map} +1 -1
  27. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-DFfhMGkT.js → architectureDiagram-2XIMDMQ5-B2jDlUga.js} +7 -7
  28. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-DFfhMGkT.js.map → architectureDiagram-2XIMDMQ5-B2jDlUga.js.map} +1 -1
  29. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BAt4BaxZ.js → blockDiagram-WCTKOSBZ-BUPbccZo.js} +7 -7
  30. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BAt4BaxZ.js.map → blockDiagram-WCTKOSBZ-BUPbccZo.js.map} +1 -1
  31. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BYxKH5AA.js → c4Diagram-IC4MRINW-DwTime9I.js} +3 -3
  32. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BYxKH5AA.js.map → c4Diagram-IC4MRINW-DwTime9I.js.map} +1 -1
  33. package/webapp/dist/assets/{channel-CuYhL59H.js → channel-C44ixz_J.js} +2 -2
  34. package/webapp/dist/assets/{channel-CuYhL59H.js.map → channel-C44ixz_J.js.map} +1 -1
  35. package/webapp/dist/assets/{chunk-4BX2VUAB-Ch1PfLiD.js → chunk-4BX2VUAB-D8GtQm2f.js} +2 -2
  36. package/webapp/dist/assets/{chunk-4BX2VUAB-Ch1PfLiD.js.map → chunk-4BX2VUAB-D8GtQm2f.js.map} +1 -1
  37. package/webapp/dist/assets/{chunk-55IACEB6-B3rzakPd.js → chunk-55IACEB6-D581Sluc.js} +2 -2
  38. package/webapp/dist/assets/{chunk-55IACEB6-B3rzakPd.js.map → chunk-55IACEB6-D581Sluc.js.map} +1 -1
  39. package/webapp/dist/assets/{chunk-FMBD7UC4-CCZWJRJ5.js → chunk-FMBD7UC4-DflSPxF8.js} +2 -2
  40. package/webapp/dist/assets/{chunk-FMBD7UC4-CCZWJRJ5.js.map → chunk-FMBD7UC4-DflSPxF8.js.map} +1 -1
  41. package/webapp/dist/assets/{chunk-JSJVCQXG-Dqd_MOPD.js → chunk-JSJVCQXG-CcUETDd7.js} +2 -2
  42. package/webapp/dist/assets/{chunk-JSJVCQXG-Dqd_MOPD.js.map → chunk-JSJVCQXG-CcUETDd7.js.map} +1 -1
  43. package/webapp/dist/assets/{chunk-KX2RTZJC-DOpPZD_q.js → chunk-KX2RTZJC-DfcLbXaY.js} +2 -2
  44. package/webapp/dist/assets/{chunk-KX2RTZJC-DOpPZD_q.js.map → chunk-KX2RTZJC-DfcLbXaY.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-NQ4KR5QH-CUj2LNV0.js → chunk-NQ4KR5QH-B0hUHzGe.js} +4 -4
  46. package/webapp/dist/assets/{chunk-NQ4KR5QH-CUj2LNV0.js.map → chunk-NQ4KR5QH-B0hUHzGe.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-QZHKN3VN-DXeWDyzh.js → chunk-QZHKN3VN-V0IQhkyq.js} +2 -2
  48. package/webapp/dist/assets/{chunk-QZHKN3VN-DXeWDyzh.js.map → chunk-QZHKN3VN-V0IQhkyq.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-WL4C6EOR-CqTowzs6.js → chunk-WL4C6EOR-Dlq3MRVu.js} +6 -6
  50. package/webapp/dist/assets/{chunk-WL4C6EOR-CqTowzs6.js.map → chunk-WL4C6EOR-Dlq3MRVu.js.map} +1 -1
  51. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CvsxEN3D.js → classDiagram-VBA2DB6C-23iqCPis.js} +7 -7
  52. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CvsxEN3D.js.map → classDiagram-VBA2DB6C-23iqCPis.js.map} +1 -1
  53. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CvsxEN3D.js → classDiagram-v2-RAHNMMFH-23iqCPis.js} +7 -7
  54. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CvsxEN3D.js.map → classDiagram-v2-RAHNMMFH-23iqCPis.js.map} +1 -1
  55. package/webapp/dist/assets/{clone-PGWIYNYc.js → clone-DOk1nA0K.js} +2 -2
  56. package/webapp/dist/assets/{clone-PGWIYNYc.js.map → clone-DOk1nA0K.js.map} +1 -1
  57. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Cf8RR_8j.js → cose-bilkent-S5V4N54A-BRI_M3Z1.js} +2 -2
  58. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Cf8RR_8j.js.map → cose-bilkent-S5V4N54A-BRI_M3Z1.js.map} +1 -1
  59. package/webapp/dist/assets/{dagre-KLK3FWXG-C1yQDg-6.js → dagre-KLK3FWXG-PjbaHNi2.js} +7 -7
  60. package/webapp/dist/assets/{dagre-KLK3FWXG-C1yQDg-6.js.map → dagre-KLK3FWXG-PjbaHNi2.js.map} +1 -1
  61. package/webapp/dist/assets/{diagram-E7M64L7V-CrT4qBJh.js → diagram-E7M64L7V-C9jrc2Yj.js} +8 -8
  62. package/webapp/dist/assets/{diagram-E7M64L7V-CrT4qBJh.js.map → diagram-E7M64L7V-C9jrc2Yj.js.map} +1 -1
  63. package/webapp/dist/assets/{diagram-IFDJBPK2-B8WaCOcr.js → diagram-IFDJBPK2-D_B_8ZEE.js} +7 -7
  64. package/webapp/dist/assets/{diagram-IFDJBPK2-B8WaCOcr.js.map → diagram-IFDJBPK2-D_B_8ZEE.js.map} +1 -1
  65. package/webapp/dist/assets/{diagram-P4PSJMXO-BCZeNfu_.js → diagram-P4PSJMXO-BAGUvld_.js} +7 -7
  66. package/webapp/dist/assets/{diagram-P4PSJMXO-BCZeNfu_.js.map → diagram-P4PSJMXO-BAGUvld_.js.map} +1 -1
  67. package/webapp/dist/assets/{erDiagram-INFDFZHY-BrYt0-mW.js → erDiagram-INFDFZHY-5ufs8FDF.js} +5 -5
  68. package/webapp/dist/assets/{erDiagram-INFDFZHY-BrYt0-mW.js.map → erDiagram-INFDFZHY-5ufs8FDF.js.map} +1 -1
  69. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-8lZ5d5y-.js → flowDiagram-PKNHOUZH-Bax4wCyq.js} +7 -7
  70. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-8lZ5d5y-.js.map → flowDiagram-PKNHOUZH-Bax4wCyq.js.map} +1 -1
  71. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CQ8pOLf-.js → ganttDiagram-A5KZAMGK-9ZX_VymK.js} +3 -3
  72. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CQ8pOLf-.js.map → ganttDiagram-A5KZAMGK-9ZX_VymK.js.map} +1 -1
  73. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-aOTOe0HP.js → gitGraphDiagram-K3NZZRJ6-YbGo4EFg.js} +8 -8
  74. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-aOTOe0HP.js.map → gitGraphDiagram-K3NZZRJ6-YbGo4EFg.js.map} +1 -1
  75. package/webapp/dist/assets/{graph-CyMR1egR.js → graph-B4UFhGtz.js} +3 -3
  76. package/webapp/dist/assets/{graph-CyMR1egR.js.map → graph-B4UFhGtz.js.map} +1 -1
  77. package/webapp/dist/assets/{index-B9TTmMv-.js → index-D7y9EEAl.js} +544 -671
  78. package/webapp/dist/assets/{index-B9TTmMv-.js.map → index-D7y9EEAl.js.map} +1 -1
  79. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CXR9XjRe.js → infoDiagram-LFFYTUFH-K9JKlk7P.js} +6 -6
  80. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CXR9XjRe.js.map → infoDiagram-LFFYTUFH-K9JKlk7P.js.map} +1 -1
  81. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-zwe-cqRW.js → ishikawaDiagram-PHBUUO56-D7h7bNU_.js} +2 -2
  82. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-zwe-cqRW.js.map → ishikawaDiagram-PHBUUO56-D7h7bNU_.js.map} +1 -1
  83. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BV-8X5hz.js → journeyDiagram-4ABVD52K-BHhkjUnE.js} +5 -5
  84. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BV-8X5hz.js.map → journeyDiagram-4ABVD52K-BHhkjUnE.js.map} +1 -1
  85. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-E3W-szUv.js → kanban-definition-K7BYSVSG-BsdCCeJO.js} +3 -3
  86. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-E3W-szUv.js.map → kanban-definition-K7BYSVSG-BsdCCeJO.js.map} +1 -1
  87. package/webapp/dist/assets/{layout-DvIjuV8I.js → layout-CTqY3yh8.js} +5 -5
  88. package/webapp/dist/assets/{layout-DvIjuV8I.js.map → layout-CTqY3yh8.js.map} +1 -1
  89. package/webapp/dist/assets/{linear-C-SIS0ki.js → linear-D3vXpsJz.js} +2 -2
  90. package/webapp/dist/assets/{linear-C-SIS0ki.js.map → linear-D3vXpsJz.js.map} +1 -1
  91. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-wigkPJ2B.js → mindmap-definition-YRQLILUH-Df26nneZ.js} +4 -4
  92. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-wigkPJ2B.js.map → mindmap-definition-YRQLILUH-Df26nneZ.js.map} +1 -1
  93. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-BKrYJ0LE.js → pieDiagram-SKSYHLDU-CORXrWQD.js} +8 -8
  94. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-BKrYJ0LE.js.map → pieDiagram-SKSYHLDU-CORXrWQD.js.map} +1 -1
  95. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-fjwd0gVY.js → quadrantDiagram-337W2JSQ-D1iEgnz7.js} +3 -3
  96. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-fjwd0gVY.js.map → quadrantDiagram-337W2JSQ-D1iEgnz7.js.map} +1 -1
  97. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-vgTMObSA.js → requirementDiagram-Z7DCOOCP-BTi9foPw.js} +4 -4
  98. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-vgTMObSA.js.map → requirementDiagram-Z7DCOOCP-BTi9foPw.js.map} +1 -1
  99. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-B-ZV3LF7.js → sankeyDiagram-WA2Y5GQK-DlXqXBte.js} +2 -2
  100. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-B-ZV3LF7.js.map → sankeyDiagram-WA2Y5GQK-DlXqXBte.js.map} +1 -1
  101. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DPhZYHhW.js → sequenceDiagram-2WXFIKYE-DtV5AvqW.js} +4 -4
  102. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DPhZYHhW.js.map → sequenceDiagram-2WXFIKYE-DtV5AvqW.js.map} +1 -1
  103. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DLsw3SC8.js → stateDiagram-RAJIS63D-BD05KYfc.js} +9 -9
  104. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DLsw3SC8.js.map → stateDiagram-RAJIS63D-BD05KYfc.js.map} +1 -1
  105. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DqXB3dNs.js → stateDiagram-v2-FVOUBMTO-ZWU-eA69.js} +5 -5
  106. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DqXB3dNs.js.map → stateDiagram-v2-FVOUBMTO-ZWU-eA69.js.map} +1 -1
  107. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BFSqlDfo.js → timeline-definition-YZTLITO2-Bz0iSxAq.js} +3 -3
  108. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BFSqlDfo.js.map → timeline-definition-YZTLITO2-Bz0iSxAq.js.map} +1 -1
  109. package/webapp/dist/assets/{treemap-KZPCXAKY-sdfq6mHG.js → treemap-KZPCXAKY-VCn63bTk.js} +5 -5
  110. package/webapp/dist/assets/{treemap-KZPCXAKY-sdfq6mHG.js.map → treemap-KZPCXAKY-VCn63bTk.js.map} +1 -1
  111. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-D7Cioksz.js → vennDiagram-LZ73GAT5-DMD4pzqJ.js} +2 -2
  112. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-D7Cioksz.js.map → vennDiagram-LZ73GAT5-DMD4pzqJ.js.map} +1 -1
  113. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-No65aXqH.js → xychartDiagram-JWTSCODW-B5BYuiJN.js} +3 -3
  114. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-No65aXqH.js.map → xychartDiagram-JWTSCODW-B5BYuiJN.js.map} +1 -1
  115. package/webapp/dist/index.html +1 -1
@@ -4,6 +4,7 @@
4
4
  * Factory for creating Dialog instances with proper type hierarchy.
5
5
  * Provides a single point of dialog creation to ensure consistent initialization.
6
6
  */
7
+ import type { CallSiteCourseNo, CallSiteGenseqNo } from '@longrun-ai/kernel/types/storage';
7
8
  import { Dialog, DialogID, DialogInitParams, DialogStore, MainDialog, SideDialog } from './dialog';
8
9
  /**
9
10
  * Factory for creating Dialog instances.
@@ -22,6 +23,8 @@ export declare class DialogFactory {
22
23
  originMemberId: string;
23
24
  askerDialogId: string;
24
25
  callId: string;
26
+ callSiteCourse: CallSiteCourseNo;
27
+ callSiteGenseq: CallSiteGenseqNo;
25
28
  sessionSlug?: string;
26
29
  collectiveTargets?: string[];
27
30
  effectiveFbrEffort?: number;
@@ -1,12 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DialogFactory = void 0;
4
- /**
5
- * Module: dialog-factory
6
- *
7
- * Factory for creating Dialog instances with proper type hierarchy.
8
- * Provides a single point of dialog creation to ensure consistent initialization.
9
- */
10
4
  const dialog_1 = require("./dialog");
11
5
  const dialog_global_registry_1 = require("./dialog-global-registry");
12
6
  const id_1 = require("./utils/id");
@@ -45,6 +39,8 @@ class DialogFactory {
45
39
  originMemberId: options.originMemberId,
46
40
  askerDialogId: options.askerDialogId,
47
41
  callId: options.callId,
42
+ callSiteCourse: options.callSiteCourse,
43
+ callSiteGenseq: options.callSiteGenseq,
48
44
  collectiveTargets: options.collectiveTargets,
49
45
  effectiveFbrEffort: options.effectiveFbrEffort,
50
46
  },
@@ -140,7 +140,8 @@ function isPersistedMessageRecord(record) {
140
140
  case 'user_image_ingest_record':
141
141
  case 'sideDialog_request_record':
142
142
  case 'tellask_reply_resolution_record':
143
- case 'tellask_call_anchor_record':
143
+ case 'tellask_anchor_record':
144
+ case 'tellask_callee_record':
144
145
  case 'gen_start_record':
145
146
  case 'gen_finish_record':
146
147
  case 'sideDialog_created_record':
@@ -212,7 +213,8 @@ function rewriteRecordForFork(record, newRootId) {
212
213
  case 'native_tool_call_record':
213
214
  case 'sideDialog_request_record':
214
215
  case 'tellask_reply_resolution_record':
215
- case 'tellask_call_anchor_record':
216
+ case 'tellask_anchor_record':
217
+ case 'tellask_callee_record':
216
218
  case 'gen_start_record':
217
219
  case 'gen_finish_record':
218
220
  return record;
package/dist/dialog.d.ts CHANGED
@@ -122,6 +122,8 @@ export interface AssignmentFromAsker {
122
122
  originMemberId: string;
123
123
  askerDialogId: string;
124
124
  callId: string;
125
+ callSiteCourse: CallSiteCourseNo;
126
+ callSiteGenseq: CallSiteGenseqNo;
125
127
  collectiveTargets?: string[];
126
128
  effectiveFbrEffort?: number;
127
129
  }
@@ -253,8 +255,11 @@ export declare abstract class Dialog {
253
255
  originMemberId: string;
254
256
  askerDialogId: string;
255
257
  callId: string;
258
+ callSiteCourse: CallSiteCourseNo;
259
+ callSiteGenseq: CallSiteGenseqNo;
256
260
  sessionSlug?: string;
257
261
  collectiveTargets?: string[];
262
+ effectiveFbrEffort?: number;
258
263
  }): Promise<SideDialog>;
259
264
  /**
260
265
  * Post a dialog event using the standard event registry.
@@ -468,6 +473,8 @@ export declare class SideDialog extends Dialog {
468
473
  originMemberId: string;
469
474
  askerDialogId: string;
470
475
  callId: string;
476
+ callSiteCourse: CallSiteCourseNo;
477
+ callSiteGenseq: CallSiteGenseqNo;
471
478
  sessionSlug?: string;
472
479
  collectiveTargets?: string[];
473
480
  effectiveFbrEffort?: number;
@@ -528,6 +535,8 @@ export declare class MainDialog extends Dialog {
528
535
  originMemberId: string;
529
536
  askerDialogId: string;
530
537
  callId: string;
538
+ callSiteCourse: CallSiteCourseNo;
539
+ callSiteGenseq: CallSiteGenseqNo;
531
540
  sessionSlug?: string;
532
541
  collectiveTargets?: string[];
533
542
  effectiveFbrEffort?: number;
@@ -561,6 +570,8 @@ export declare abstract class DialogStore {
561
570
  originMemberId: string;
562
571
  askerDialogId: string;
563
572
  callId: string;
573
+ callSiteCourse: CallSiteCourseNo;
574
+ callSiteGenseq: CallSiteGenseqNo;
564
575
  sessionSlug?: string;
565
576
  collectiveTargets?: string[];
566
577
  effectiveFbrEffort?: number;
package/dist/dialog.js CHANGED
@@ -126,6 +126,8 @@ function buildSideDialogAssignmentPromptMeta(sideDialog) {
126
126
  ownerDialogId: assignment.askerDialogId,
127
127
  callType: 'B',
128
128
  callId: assignment.callId,
129
+ callSiteCourse: assignment.callSiteCourse,
130
+ callSiteGenseq: assignment.callSiteGenseq,
129
131
  },
130
132
  };
131
133
  case 'tellaskSessionless':
@@ -141,6 +143,8 @@ function buildSideDialogAssignmentPromptMeta(sideDialog) {
141
143
  ownerDialogId: assignment.askerDialogId,
142
144
  callType: 'C',
143
145
  callId: assignment.callId,
146
+ callSiteCourse: assignment.callSiteCourse,
147
+ callSiteGenseq: assignment.callSiteGenseq,
144
148
  },
145
149
  };
146
150
  }
@@ -1791,6 +1795,8 @@ class DialogStore {
1791
1795
  originMemberId: options.originMemberId,
1792
1796
  askerDialogId: options.askerDialogId,
1793
1797
  callId: options.callId,
1798
+ callSiteCourse: options.callSiteCourse,
1799
+ callSiteGenseq: options.callSiteGenseq,
1794
1800
  collectiveTargets: options.collectiveTargets,
1795
1801
  effectiveFbrEffort: options.effectiveFbrEffort,
1796
1802
  };
@@ -1305,6 +1305,21 @@ sequenceDiagram
1305
1305
  end
1306
1306
  ```
1307
1307
 
1308
+ Call-site correspondence invariant: every `tellask` call-site `callId` must later have a
1309
+ same-`callId` historical correspondence point in the tellasker's dialog. A normal sideDialog reply,
1310
+ cross-course carryover, or registered-session replacement notice can close the call; silently removing
1311
+ or overwriting a pending round cannot.
1312
+
1313
+ WebUI external-link invariant: every `/dl/*` URL must be generated at the business call site with the
1314
+ target semantics written out there; avoid generic deep-link helpers. `/dl/callsite` only means the
1315
+ originating bubble in the tellasker's dialog: `selfId/course` are tellasker-dialog coordinates, and
1316
+ `callId` is that dialog's function-call id. SideDialog assignment/update targets are not call sites;
1317
+ they use `/dl/dialog` for the sideDialog, or `/dl/genseq` once the delivered assignment `genseq` is
1318
+ known.
1319
+ When an existing registered sideDialog is reused, the WebUI first links the new call-site bubble to
1320
+ the sideDialog via `tellask_call_callee_evt`; the later `tellask_call_anchor_evt` upgrades that target
1321
+ to the delivered sideDialog `genseq`.
1322
+
1308
1323
  #### TYPE C: Transient SideDialog Tellask (`Fresh Tellask`) (`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`; `freshBootsReasoning({ tellaskContent: "..." })` is FBR tool-less)
1309
1324
 
1310
1325
  ```mermaid
@@ -1287,6 +1287,17 @@ sequenceDiagram
1287
1287
  end
1288
1288
  ```
1289
1289
 
1290
+ call-site 呼应不变量:每个 `tellask` 发起点的 `callId`,后续都必须在诉请者对话历史里留下同
1291
+ `callId` 的呼应点。正常支线回复、跨程 carryover、已注册会话被更新后的替代通知都可以结束这次
1292
+ call;不能静默删除或覆盖 pending 轮次。
1293
+
1294
+ WebUI 外链不变量:生成 `/dl/*` URL 时必须在业务现场显式写出目标语义,避免复用泛化 deep-link
1295
+ helper。`/dl/callsite` 只表示诉请者对话里的发起气泡:`selfId/course` 是诉请者对话坐标,`callId`
1296
+ 是该对话内的 function-call id。支线投递/更新目标不是 call-site,应使用 `/dl/dialog` 指向支线对话,
1297
+ 或在投递 `genseq` 已知后使用 `/dl/genseq` 指向支线对话内的投递生成。
1298
+ 复用已有注册支线时,WebUI 先用 `tellask_call_callee_evt` 把新发起气泡连到支线对话;后续
1299
+ `tellask_call_anchor_evt` 到达后再升级为支线投递 `genseq`。
1300
+
1290
1301
  #### TYPE C:瞬态支线对话诉请(一次性诉请)(`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`,或 `freshBootsReasoning({ tellaskContent: "..." })`)
1291
1302
 
1292
1303
  ```mermaid
package/dist/docs/q4h.md CHANGED
@@ -68,13 +68,15 @@ When a message bubble has a meaningful call site reference (e.g. “response ↔
68
68
 
69
69
  ### Query parameter schema
70
70
 
71
- The WebUI recognizes `window.location.search` deep link parameters.
71
+ The WebUI recognizes deep links by `/dl/<kind>` paths plus `window.location.search` parameters.
72
72
 
73
- Common parameters:
73
+ Implementation rule: external-link generation must write the `/dl/*` URL and every field's business
74
+ meaning directly at the generating call site; avoid generic deep-link helpers. For `/dl/callsite`,
75
+ `selfId/course/callId` only identify the originating bubble in the tellasker's dialog. SideDialog
76
+ assignment/update targets must use `/dl/dialog`, or `/dl/genseq` once the delivered assignment
77
+ `genseq` is known.
74
78
 
75
- - `dl`: deep link kind (`q4h` | `callsite`)
76
-
77
- #### `dl=q4h` (Q4H question deep link)
79
+ #### `/dl/q4h` (Q4H question deep link)
78
80
 
79
81
  Required:
80
82
 
@@ -95,7 +97,7 @@ Behavior:
95
97
  - If the Q4H is not pending (already answered/cleared), the WebUI still scrolls to the call site but does **not**
96
98
  enter answer mode (no selection); it may show a toast indicating the question is no longer pending.
97
99
 
98
- #### `dl=callsite` (generic tellask call site deep link)
100
+ #### `/dl/callsite` (generic tellask call site deep link)
99
101
 
100
102
  Required:
101
103
 
@@ -109,7 +111,7 @@ Behavior:
109
111
  - The WebUI navigates to the dialog + course and scrolls to the calling section with `data-call-id=callId`.
110
112
  - The input is focused (normal message mode).
111
113
 
112
- #### `dl=genseq` (generation bubble deep link)
114
+ #### `/dl/genseq` (generation bubble deep link)
113
115
 
114
116
  Required:
115
117
 
@@ -126,9 +128,11 @@ Behavior:
126
128
  ### URL examples
127
129
 
128
130
  ```text
129
- /?dl=q4h&qid=q4h-abc123&rootId=R1&selfId=S2&course=3&callId=call-xyz&msg=12
131
+ /dl/q4h?qid=q4h-abc123&rootId=R1&selfId=S2&course=3&callId=call-xyz&msg=12
132
+
133
+ /dl/callsite?rootId=R1&selfId=R1&course=1&callId=call-xyz
130
134
 
131
- /?dl=callsite&rootId=R1&selfId=R1&course=1&callId=call-xyz
135
+ /dl/genseq?rootId=R1&selfId=S2&course=3&genseq=42
132
136
  ```
133
137
 
134
138
  Notes:
@@ -159,7 +163,7 @@ Back-compat:
159
163
 
160
164
  - `dominds-q4h-panel`:
161
165
  - Keeps internal navigation (same tab).
162
- - Adds an external icon action that opens a deep link (`dl=q4h`) in a new tab/window.
166
+ - Adds an external icon action that opens a deep link (`/dl/q4h`) in a new tab/window.
163
167
  - `dominds-app`:
164
168
  - Parses deep link parameters once at startup and stores a pending deep link intent.
165
169
  - Applies the intent after dialogs and (when needed) Q4H state are available.
@@ -69,15 +69,15 @@ Q4H 是 Dominds 的运行时机制:在任何对话中通过向 `askHuman({ tel
69
69
 
70
70
  ## Deep Link 契约(WebUI)
71
71
 
72
- ### Query 参数约定
72
+ ### URL 约定
73
73
 
74
- WebUI 通过 `window.location.search` 识别 deep link 参数。
74
+ WebUI 通过 `/dl/<kind>` 路径和 `window.location.search` 参数识别 deep link
75
75
 
76
- 通用参数:
76
+ 实现规则:生成外链的代码必须在生成现场直接写出 `/dl/*` URL 和每个字段的业务含义,避免泛化
77
+ deep-link helper。`/dl/callsite` 的 `selfId/course/callId` 只表示诉请者对话里的发起气泡;支线投递
78
+ 或更新目标应使用 `/dl/dialog` 或已知投递 `genseq` 后的 `/dl/genseq`。
77
79
 
78
- - `dl`:deep link 类型(`q4h` | `callsite`)
79
-
80
- #### `dl=q4h`(Q4H 提问点 deep link)
80
+ #### `/dl/q4h`(Q4H 提问点 deep link
81
81
 
82
82
  必需:
83
83
 
@@ -97,7 +97,7 @@ WebUI 通过 `window.location.search` 识别 deep link 参数。
97
97
  - 若该 Q4H 仍待处理:输入框选中 `qid`(回答模式)并聚焦。
98
98
  - 若该 Q4H 已不再待处理(已回答/已清理):仍定位/高亮提问点,但**不进入回答模式**(不选中问题);可提示“已不再待处理”。
99
99
 
100
- #### `dl=callsite`(通用 tellask call site deep link)
100
+ #### `/dl/callsite`(通用 tellask call site deep link)
101
101
 
102
102
  必需:
103
103
 
@@ -111,7 +111,7 @@ WebUI 通过 `window.location.search` 识别 deep link 参数。
111
111
  - WebUI 切换到目标对话 + course,并滚动到 `data-call-id=callId` 对应的 calling section。
112
112
  - 输入框聚焦(普通消息模式)。
113
113
 
114
- #### `dl=genseq`(生成气泡 deep link)
114
+ #### `/dl/genseq`(生成气泡 deep link)
115
115
 
116
116
  必需:
117
117
 
@@ -128,9 +128,11 @@ WebUI 通过 `window.location.search` 识别 deep link 参数。
128
128
  ### URL 示例
129
129
 
130
130
  ```text
131
- /?dl=q4h&qid=q4h-abc123&rootId=R1&selfId=S2&course=3&callId=call-xyz&msg=12
131
+ /dl/q4h?qid=q4h-abc123&rootId=R1&selfId=S2&course=3&callId=call-xyz&msg=12
132
+
133
+ /dl/callsite?rootId=R1&selfId=R1&course=1&callId=call-xyz
132
134
 
133
- /?dl=callsite&rootId=R1&selfId=R1&course=1&callId=call-xyz
135
+ /dl/genseq?rootId=R1&selfId=S2&course=3&genseq=42
134
136
  ```
135
137
 
136
138
  说明:
@@ -161,7 +163,7 @@ WebUI 通过 `window.location.search` 识别 deep link 参数。
161
163
 
162
164
  - `dominds-q4h-panel`:
163
165
  - 保留内链“去提问点”。
164
- - 增加外链图标按钮:打开 `dl=q4h` deep link(新 tab/窗口)。
166
+ - 增加外链图标按钮:打开 `/dl/q4h` deep link(新 tab/窗口)。
165
167
  - `dominds-app`:
166
168
  - 启动时解析 deep link,并保存“待执行导航意图”。
167
169
  - 在 dialogs / Q4H state 到齐后尝试执行意图。
@@ -406,6 +406,7 @@ auto-revive 能因为某个 wait-group 齐活而继续 drive,并不等于 owne
406
406
  replace pending 不是 silent overwrite,也不是 failed-result fallback。它是显式栈操作:
407
407
 
408
408
  - 定位旧 frame 的匹配键必须稳定,倾向使用 `askerDialogId + targetCallId` / `ownerDialogId + callId`,具体以 pending record 与 reply directive 对齐后的字段为准;
409
+ - 每个 `tellask` call-site 的 `callId` 最终都必须在诉请者对话历史里有同 `callId` 的呼应点;被替换时,这个呼应点就是替代通知 / carryover result,而不是等支线对话后续回复时才补;
409
410
  - 如果 replace 找不到旧 frame,必须 loud fail,不允许降级成普通 push;
410
411
  - 因为持久文件采用 append/truncate-only JSONL,replace 的落盘算法是:
411
412
  1. 读取 stack frames 与每行 byte offset;
@@ -1579,7 +1579,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1579
1579
  }
1580
1580
  const record = {
1581
1581
  ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
1582
- type: 'tellask_call_anchor_record',
1582
+ type: 'tellask_anchor_record',
1583
1583
  anchorRole: 'assignment',
1584
1584
  callId: normalizedCallId,
1585
1585
  genseq: dlg.activeGenSeq,
@@ -1590,6 +1590,37 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1590
1590
  };
1591
1591
  const course = dlg.activeGenCourseOrUndefined ?? dlg.currentCourse;
1592
1592
  await persistence_1.DialogPersistence.appendEvent(dlg.id, course, record, dlg.status);
1593
+ if (dlg instanceof dialog_1.SideDialog) {
1594
+ const ownerDialogId = new dialog_1.DialogID(replyTarget.ownerDialogId, dlg.id.rootId);
1595
+ const ownerDialogStatus = ownerDialogId.selfId === dlg.mainDialog.id.selfId
1596
+ ? dlg.mainDialog.status
1597
+ : dlg.status;
1598
+ const calleeCourse = (0, storage_1.toCalleeCourseNumber)(course);
1599
+ const calleeGenseq = (0, storage_1.toCalleeGenerationSeqNumber)(dlg.activeGenSeq);
1600
+ const calleeRecord = {
1601
+ ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
1602
+ type: 'tellask_callee_record',
1603
+ ...(0, storage_1.toRootGenerationAnchor)({
1604
+ rootCourse: dlg.mainDialog.currentCourse,
1605
+ rootGenseq: dlg.mainDialog.activeGenSeqOrUndefined ?? 0,
1606
+ }),
1607
+ genseq: replyTarget.callSiteGenseq,
1608
+ callId: normalizedCallId,
1609
+ calleeDialogId: dlg.id.selfId,
1610
+ calleeCourse,
1611
+ calleeGenseq,
1612
+ };
1613
+ await persistence_1.DialogPersistence.appendEvent(ownerDialogId, replyTarget.callSiteCourse, calleeRecord, ownerDialogStatus);
1614
+ (0, evt_registry_1.postDialogEventById)(ownerDialogId, {
1615
+ type: 'tellask_callee_evt',
1616
+ course: replyTarget.callSiteCourse,
1617
+ genseq: replyTarget.callSiteGenseq,
1618
+ callId: normalizedCallId,
1619
+ calleeDialogId: dlg.id.selfId,
1620
+ calleeCourse,
1621
+ calleeGenseq,
1622
+ });
1623
+ }
1593
1624
  }
1594
1625
  }
1595
1626
  await dlg.processReminderUpdates();
@@ -273,7 +273,7 @@ async function inspectNoPromptSideDialogDrive(args) {
273
273
  }
274
274
  return courseEvents[courseEvents.length - 1];
275
275
  })();
276
- const lastEvent = rawLastEvent?.type === 'tellask_call_anchor_record'
276
+ const lastEvent = rawLastEvent?.type === 'tellask_anchor_record'
277
277
  ? { type: rawLastEvent.type, anchorRole: rawLastEvent.anchorRole }
278
278
  : rawLastEvent
279
279
  ? { type: rawLastEvent.type }
@@ -282,7 +282,7 @@ async function inspectNoPromptSideDialogDrive(args) {
282
282
  latest?.executionMarker?.kind === 'interrupted';
283
283
  const supplyResponseParentReviveAllowed = source === 'kernel_driver_supply_response_parent_revive' &&
284
284
  hasNoPromptSideDialogResumeEntitlement(args.dialog, args.driveOptions);
285
- if (lastEvent?.type === 'tellask_call_anchor_record' && lastEvent.anchorRole === 'response') {
285
+ if (lastEvent?.type === 'tellask_anchor_record' && lastEvent.anchorRole === 'response') {
286
286
  return {
287
287
  shouldReject: true,
288
288
  source,
@@ -1,8 +1,17 @@
1
1
  import { type AskerCourseNumber } from '@longrun-ai/kernel/types/storage';
2
2
  import { Dialog, DialogID, SideDialog } from '../../dialog';
3
+ import { type DialogPersistenceStatus } from '../../dialog-instance-registry';
3
4
  import type { KernelDriverDriveCallOptions, KernelDriverSideDialogReplyTarget } from './types';
4
5
  export type SideDialogReplyTarget = KernelDriverSideDialogReplyTarget;
5
6
  export type ScheduleDriveFn = (dialog: Dialog, options: KernelDriverDriveCallOptions) => void;
7
+ export declare function resolveLatestAssignmentAnchorRef(args: {
8
+ calleeDialogId: DialogID;
9
+ callId: string;
10
+ status: DialogPersistenceStatus;
11
+ }): Promise<{
12
+ course: number;
13
+ genseq: number;
14
+ } | undefined>;
6
15
  export declare function supplyResponseToAskerDialog(args: {
7
16
  parentDialog: Dialog;
8
17
  sideDialogId: DialogID;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveLatestAssignmentAnchorRef = resolveLatestAssignmentAnchorRef;
3
4
  exports.supplyResponseToAskerDialog = supplyResponseToAskerDialog;
4
5
  exports.supplySideDialogResponseToSpecificAskerIfPendingV2 = supplySideDialogResponseToSpecificAskerIfPendingV2;
5
6
  exports.supplySideDialogResponseToAssignedAskerIfPendingV2 = supplySideDialogResponseToAssignedAskerIfPendingV2;
@@ -130,7 +131,7 @@ async function resolveLatestAssignmentAnchorRef(args) {
130
131
  const courseEvents = await persistence_1.DialogPersistence.loadCourseEvents(args.calleeDialogId, course, args.status);
131
132
  for (let i = courseEvents.length - 1; i >= 0; i -= 1) {
132
133
  const event = courseEvents[i];
133
- if (event.type !== 'tellask_call_anchor_record') {
134
+ if (event.type !== 'tellask_anchor_record') {
134
135
  continue;
135
136
  }
136
137
  if (event.anchorRole !== 'assignment') {
@@ -347,7 +348,7 @@ async function supplyResponseToAskerDialog(args) {
347
348
  }
348
349
  const anchorRecord = {
349
350
  ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
350
- type: 'tellask_call_anchor_record',
351
+ type: 'tellask_anchor_record',
351
352
  anchorRole: 'response',
352
353
  callId: resolvedCallId,
353
354
  genseq: calleeResponseRef.genseq,
@@ -369,6 +370,7 @@ async function supplyResponseToAskerDialog(args) {
369
370
  await persistence_1.DialogPersistence.appendEvent(sideDialogId, calleeResponseRef.course, anchorRecord, parentDialog.status);
370
371
  }
371
372
  await syncPendingTellaskReminderBestEffort(parentDialog, 'kernel-driver:supplyResponseToAskerDialog');
373
+ const responseRouteRef = calleeResponseRef;
372
374
  await parentDialog.receiveTellaskResponse(result.responderId, result.callName, result.mentionList, result.tellaskContent, status, sideDialogId, {
373
375
  response: tellaskerResponseText,
374
376
  agentId: result.responderAgentId ?? result.responderId,
@@ -382,11 +384,11 @@ async function supplyResponseToAskerDialog(args) {
382
384
  : undefined,
383
385
  carryoverContent,
384
386
  sessionSlug: result.sessionSlug,
385
- calleeCourse: calleeResponseRef !== undefined
386
- ? (0, storage_1.toCalleeCourseNumber)(calleeResponseRef.course)
387
+ calleeCourse: responseRouteRef !== undefined
388
+ ? (0, storage_1.toCalleeCourseNumber)(responseRouteRef.course)
387
389
  : undefined,
388
- calleeGenseq: calleeResponseRef !== undefined
389
- ? (0, storage_1.toCalleeGenerationSeqNumber)(calleeResponseRef.genseq)
390
+ calleeGenseq: responseRouteRef !== undefined
391
+ ? (0, storage_1.toCalleeGenerationSeqNumber)(responseRouteRef.genseq)
390
392
  : undefined,
391
393
  });
392
394
  const immediateMirror = carryoverContent !== undefined
@@ -415,11 +417,11 @@ async function supplyResponseToAskerDialog(args) {
415
417
  mentionList: result.mentionList ?? [],
416
418
  }
417
419
  : {}),
418
- ...(calleeResponseRef !== undefined
420
+ ...(responseRouteRef !== undefined
419
421
  ? {
420
422
  calleeDialogId: sideDialogId.selfId,
421
- calleeCourse: calleeResponseRef.course,
422
- calleeGenseq: calleeResponseRef.genseq,
423
+ calleeCourse: responseRouteRef.course,
424
+ calleeGenseq: responseRouteRef.genseq,
423
425
  }
424
426
  : {
425
427
  calleeDialogId: sideDialogId.selfId,
@@ -461,10 +463,10 @@ async function supplyResponseToAskerDialog(args) {
461
463
  },
462
464
  route: {
463
465
  calleeDialogId: sideDialogId.selfId,
464
- ...(calleeResponseRef !== undefined
466
+ ...(responseRouteRef !== undefined
465
467
  ? {
466
- calleeCourse: calleeResponseRef.course,
467
- calleeGenseq: calleeResponseRef.genseq,
468
+ calleeCourse: responseRouteRef.course,
469
+ calleeGenseq: responseRouteRef.genseq,
468
470
  }
469
471
  : {}),
470
472
  },