dominds 1.13.2 → 1.15.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.
Files changed (200) hide show
  1. package/dist/bootstrap/global-dialog-event-broadcaster.d.ts +18 -0
  2. package/dist/bootstrap/global-dialog-event-broadcaster.js +81 -0
  3. package/dist/dialog-fork.js +13 -12
  4. package/dist/dialog.d.ts +61 -50
  5. package/dist/dialog.js +284 -78
  6. package/dist/docs/dialog-system.md +12 -0
  7. package/dist/docs/dialog-system.zh.md +12 -0
  8. package/dist/docs/dominds-terminology.md +17 -0
  9. package/dist/docs/issues/global-dialog-event-broadcaster-missing.md +128 -0
  10. package/dist/docs/llm-provider-isolation.md +35 -0
  11. package/dist/docs/llm-provider-isolation.zh.md +35 -0
  12. package/dist/llm/client.d.ts +2 -1
  13. package/dist/llm/defaults.yaml +118 -4
  14. package/dist/llm/gen/anthropic.js +2 -4
  15. package/dist/llm/gen/codex.d.ts +11 -0
  16. package/dist/llm/gen/codex.js +41 -31
  17. package/dist/llm/gen/failure-classifier.js +17 -0
  18. package/dist/llm/gen/mock.js +45 -21
  19. package/dist/llm/gen/openai-compatible.d.ts +2 -0
  20. package/dist/llm/gen/openai-compatible.js +43 -38
  21. package/dist/llm/gen/openai.d.ts +3 -1
  22. package/dist/llm/gen/openai.js +888 -71
  23. package/dist/llm/gen/tool-call-context.d.ts +7 -2
  24. package/dist/llm/gen/tool-call-context.js +55 -13
  25. package/dist/llm/gen.d.ts +60 -3
  26. package/dist/llm/kernel-driver/context.js +1 -1
  27. package/dist/llm/kernel-driver/drive.js +374 -348
  28. package/dist/llm/kernel-driver/flow.js +3 -3
  29. package/dist/llm/kernel-driver/guardrails.d.ts +1 -1
  30. package/dist/llm/kernel-driver/guardrails.js +4 -4
  31. package/dist/llm/kernel-driver/runtime.js +11 -29
  32. package/dist/llm/kernel-driver/subdialog.js +56 -5
  33. package/dist/llm/kernel-driver/tellask-special.d.ts +38 -12
  34. package/dist/llm/kernel-driver/tellask-special.js +489 -180
  35. package/dist/llm/kernel-driver/types.d.ts +1 -1
  36. package/dist/persistence.d.ts +30 -62
  37. package/dist/persistence.js +978 -986
  38. package/dist/priming.js +398 -365
  39. package/dist/recovery/reply-special.js +3 -3
  40. package/dist/runtime/inter-dialog-format.d.ts +1 -1
  41. package/dist/runtime/inter-dialog-format.js +1 -1
  42. package/dist/runtime/reply-prompt-copy.js +4 -4
  43. package/dist/server/setup-routes.js +26 -5
  44. package/dist/server/snippets-routes.d.ts +1 -0
  45. package/dist/server/snippets-routes.js +20 -9
  46. package/dist/server/websocket-handler.js +58 -25
  47. package/dist/shared/utils/fbr.js +12 -8
  48. package/dist/shared/utils/inter-dialog-format.js +6 -4
  49. package/dist/team.d.ts +24 -13
  50. package/dist/team.js +123 -32
  51. package/dist/tool.d.ts +26 -0
  52. package/dist/tool.js +97 -0
  53. package/dist/tools/team_mgmt.js +18 -0
  54. package/package.json +2 -2
  55. package/webapp/dist/assets/{_basePickBy-CBOtd63g.js → _basePickBy-DsirmCgI.js} +3 -3
  56. package/webapp/dist/assets/_basePickBy-DsirmCgI.js.map +1 -0
  57. package/webapp/dist/assets/{_baseUniq-mfoKz4Wm.js → _baseUniq-tR6G8loB.js} +2 -2
  58. package/webapp/dist/assets/_baseUniq-tR6G8loB.js.map +1 -0
  59. package/webapp/dist/assets/{arc-Dq0WZLyu.js → arc-CzxpASkZ.js} +2 -2
  60. package/webapp/dist/assets/arc-CzxpASkZ.js.map +1 -0
  61. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-CNmygmp3.js → architectureDiagram-2XIMDMQ5-BSH7H5oI.js} +26 -8
  62. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-BSH7H5oI.js.map +1 -0
  63. package/webapp/dist/assets/{blockDiagram-VD42YOAC-DvE0lybt.js → blockDiagram-WCTKOSBZ-DpLIr7yO.js} +187 -170
  64. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-DpLIr7yO.js.map +1 -0
  65. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CR7zJ2_u.js → c4Diagram-IC4MRINW-WuYKgWfY.js} +4 -4
  66. package/webapp/dist/assets/c4Diagram-IC4MRINW-WuYKgWfY.js.map +1 -0
  67. package/webapp/dist/assets/{channel-DrTrnYx4.js → channel-B-v9dqLN.js} +2 -2
  68. package/webapp/dist/assets/channel-B-v9dqLN.js.map +1 -0
  69. package/webapp/dist/assets/{chunk-4BX2VUAB-CVuJEIeN.js → chunk-4BX2VUAB-MtFUfKZy.js} +2 -2
  70. package/webapp/dist/assets/chunk-4BX2VUAB-MtFUfKZy.js.map +1 -0
  71. package/webapp/dist/assets/{chunk-55IACEB6-BxUoXApB.js → chunk-55IACEB6-rY9AJdzj.js} +2 -2
  72. package/webapp/dist/assets/chunk-55IACEB6-rY9AJdzj.js.map +1 -0
  73. package/webapp/dist/assets/{chunk-FMBD7UC4-TX-LVAaV.js → chunk-FMBD7UC4-B-RtOs7e.js} +2 -2
  74. package/webapp/dist/assets/chunk-FMBD7UC4-B-RtOs7e.js.map +1 -0
  75. package/webapp/dist/assets/{chunk-TZMSLE5B-Cw689yRl.js → chunk-JSJVCQXG-Da1d3uS4.js} +14 -6
  76. package/webapp/dist/assets/chunk-JSJVCQXG-Da1d3uS4.js.map +1 -0
  77. package/webapp/dist/assets/{chunk-QN33PNHL-D1uiKlOO.js → chunk-KX2RTZJC-DH9UrpuG.js} +2 -2
  78. package/webapp/dist/assets/chunk-KX2RTZJC-DH9UrpuG.js.map +1 -0
  79. package/webapp/dist/assets/{chunk-DI55MBZ5-SAhxUTqQ.js → chunk-NQ4KR5QH-CK365lrr.js} +9 -7
  80. package/webapp/dist/assets/chunk-NQ4KR5QH-CK365lrr.js.map +1 -0
  81. package/webapp/dist/assets/{chunk-QZHKN3VN-BxuV0Oba.js → chunk-QZHKN3VN-BCaWPGDm.js} +2 -2
  82. package/webapp/dist/assets/chunk-QZHKN3VN-BCaWPGDm.js.map +1 -0
  83. package/webapp/dist/assets/{chunk-B4BG7PRW-DpMa3-9L.js → chunk-WL4C6EOR-DDCnEwft.js} +171 -121
  84. package/webapp/dist/assets/chunk-WL4C6EOR-DDCnEwft.js.map +1 -0
  85. package/webapp/dist/assets/{classDiagram-2ON5EDUG-BTTGianr.js → classDiagram-VBA2DB6C-CvMBU4WA.js} +7 -6
  86. package/webapp/dist/assets/classDiagram-VBA2DB6C-CvMBU4WA.js.map +1 -0
  87. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-BTTGianr.js → classDiagram-v2-RAHNMMFH-CvMBU4WA.js} +7 -6
  88. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-CvMBU4WA.js.map +1 -0
  89. package/webapp/dist/assets/{clone-Dk8cAI3I.js → clone-r98jR0MC.js} +2 -2
  90. package/webapp/dist/assets/clone-r98jR0MC.js.map +1 -0
  91. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BjJnzB2N.js → cose-bilkent-S5V4N54A-t6J60Ogk.js} +2 -2
  92. package/webapp/dist/assets/cose-bilkent-S5V4N54A-t6J60Ogk.js.map +1 -0
  93. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  94. package/webapp/dist/assets/{dagre-6UL2VRFP-VF-xGhAf.js → dagre-KLK3FWXG-BlqmY2DV.js} +7 -7
  95. package/webapp/dist/assets/dagre-KLK3FWXG-BlqmY2DV.js.map +1 -0
  96. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  97. package/webapp/dist/assets/{diagram-PSM6KHXK-Ba5U0oRY.js → diagram-E7M64L7V-FwCHeIUD.js} +10 -10
  98. package/webapp/dist/assets/diagram-E7M64L7V-FwCHeIUD.js.map +1 -0
  99. package/webapp/dist/assets/{diagram-QEK2KX5R-DoYCnEw_.js → diagram-IFDJBPK2-NhtmkuZG.js} +9 -8
  100. package/webapp/dist/assets/diagram-IFDJBPK2-NhtmkuZG.js.map +1 -0
  101. package/webapp/dist/assets/{diagram-S2PKOQOG-CkK4SRyE.js → diagram-P4PSJMXO-B9FcmokX.js} +8 -8
  102. package/webapp/dist/assets/diagram-P4PSJMXO-B9FcmokX.js.map +1 -0
  103. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-DkI5eYww.js → erDiagram-INFDFZHY-DHKmWvtB.js} +96 -75
  104. package/webapp/dist/assets/erDiagram-INFDFZHY-DHKmWvtB.js.map +1 -0
  105. package/webapp/dist/assets/{flowDiagram-NV44I4VS-wOdPUQ7Y.js → flowDiagram-PKNHOUZH-C7Zi8I7T.js} +98 -81
  106. package/webapp/dist/assets/flowDiagram-PKNHOUZH-C7Zi8I7T.js.map +1 -0
  107. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-BtRWgkUH.js → ganttDiagram-A5KZAMGK-Cv2T8tz_.js} +28 -3
  108. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-Cv2T8tz_.js.map +1 -0
  109. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-Bsz7u1vi.js → gitGraphDiagram-K3NZZRJ6-DztaipJU.js} +38 -46
  110. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-DztaipJU.js.map +1 -0
  111. package/webapp/dist/assets/graph-C5yf62Vs.js +782 -0
  112. package/webapp/dist/assets/graph-C5yf62Vs.js.map +1 -0
  113. package/webapp/dist/assets/{index-xvYYeHuy.css → index-YaxF76or.css} +1 -1
  114. package/webapp/dist/assets/{index-rYmIohM_.js → index-hve5MWPs.js} +1603 -1415
  115. package/webapp/dist/assets/index-hve5MWPs.js.map +1 -0
  116. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BMaxCvH5.js → infoDiagram-LFFYTUFH-VgsbBPZP.js} +7 -7
  117. package/webapp/dist/assets/infoDiagram-LFFYTUFH-VgsbBPZP.js.map +1 -0
  118. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  119. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-C7j3YWdw.js +966 -0
  120. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-C7j3YWdw.js.map +1 -0
  121. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-ejyerzmG.js → journeyDiagram-4ABVD52K-OO8sev-Y.js} +5 -5
  122. package/webapp/dist/assets/journeyDiagram-4ABVD52K-OO8sev-Y.js.map +1 -0
  123. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-CYj35TEs.js → kanban-definition-K7BYSVSG-DiYCC1Ig.js} +5 -3
  124. package/webapp/dist/assets/kanban-definition-K7BYSVSG-DiYCC1Ig.js.map +1 -0
  125. package/webapp/dist/assets/{layout-7Ql4zmuL.js → layout-DdZSgGdu.js} +5 -5
  126. package/webapp/dist/assets/layout-DdZSgGdu.js.map +1 -0
  127. package/webapp/dist/assets/{linear-CVmgVPuZ.js → linear-7-aHtaFi.js} +2 -2
  128. package/webapp/dist/assets/linear-7-aHtaFi.js.map +1 -0
  129. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-DOpxjGVo.js → mindmap-definition-YRQLILUH-IG3I-RdD.js} +7 -5
  130. package/webapp/dist/assets/mindmap-definition-YRQLILUH-IG3I-RdD.js.map +1 -0
  131. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  132. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-CLQjpmAG.js → pieDiagram-SKSYHLDU-z68KJT5r.js} +8 -8
  133. package/webapp/dist/assets/pieDiagram-SKSYHLDU-z68KJT5r.js.map +1 -0
  134. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-ClD_bz7z.js → quadrantDiagram-337W2JSQ-DaENWdO6.js} +3 -3
  135. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DaENWdO6.js.map +1 -0
  136. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-DOpb-TWH.js → requirementDiagram-Z7DCOOCP-ROTFv4sa.js} +16 -6
  137. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-ROTFv4sa.js.map +1 -0
  138. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-D8Hsj3yx.js → sankeyDiagram-WA2Y5GQK-CK7qtpzw.js} +2 -2
  139. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CK7qtpzw.js.map +1 -0
  140. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-CFMNjBER.js → sequenceDiagram-2WXFIKYE-R5lDySeI.js} +601 -201
  141. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-R5lDySeI.js.map +1 -0
  142. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-BQeDlw0P.js → stateDiagram-RAJIS63D-sr7msF5U.js} +9 -9
  143. package/webapp/dist/assets/stateDiagram-RAJIS63D-sr7msF5U.js.map +1 -0
  144. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-DscX61Rs.js → stateDiagram-v2-FVOUBMTO-X663liwS.js} +5 -5
  145. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-X663liwS.js.map +1 -0
  146. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BcXPSTiw.js → timeline-definition-YZTLITO2-Bw0TdG26.js} +3 -3
  147. package/webapp/dist/assets/timeline-definition-YZTLITO2-Bw0TdG26.js.map +1 -0
  148. package/webapp/dist/assets/{treemap-GDKQZRPO-BBr4UV0Z.js → treemap-KZPCXAKY-D_sjKwI7.js} +37 -24
  149. package/webapp/dist/assets/treemap-KZPCXAKY-D_sjKwI7.js.map +1 -0
  150. package/webapp/dist/assets/vennDiagram-LZ73GAT5-DhlHIHid.js +2487 -0
  151. package/webapp/dist/assets/vennDiagram-LZ73GAT5-DhlHIHid.js.map +1 -0
  152. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-CS5RAtQE.js → xychartDiagram-JWTSCODW-C65ESjTc.js} +4 -4
  153. package/webapp/dist/assets/xychartDiagram-JWTSCODW-C65ESjTc.js.map +1 -0
  154. package/webapp/dist/index.html +2 -2
  155. package/webapp/dist/assets/_basePickBy-CBOtd63g.js.map +0 -1
  156. package/webapp/dist/assets/_baseUniq-mfoKz4Wm.js.map +0 -1
  157. package/webapp/dist/assets/arc-Dq0WZLyu.js.map +0 -1
  158. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-CNmygmp3.js.map +0 -1
  159. package/webapp/dist/assets/blockDiagram-VD42YOAC-DvE0lybt.js.map +0 -1
  160. package/webapp/dist/assets/c4Diagram-YG6GDRKO-CR7zJ2_u.js.map +0 -1
  161. package/webapp/dist/assets/channel-DrTrnYx4.js.map +0 -1
  162. package/webapp/dist/assets/chunk-4BX2VUAB-CVuJEIeN.js.map +0 -1
  163. package/webapp/dist/assets/chunk-55IACEB6-BxUoXApB.js.map +0 -1
  164. package/webapp/dist/assets/chunk-B4BG7PRW-DpMa3-9L.js.map +0 -1
  165. package/webapp/dist/assets/chunk-DI55MBZ5-SAhxUTqQ.js.map +0 -1
  166. package/webapp/dist/assets/chunk-FMBD7UC4-TX-LVAaV.js.map +0 -1
  167. package/webapp/dist/assets/chunk-QN33PNHL-D1uiKlOO.js.map +0 -1
  168. package/webapp/dist/assets/chunk-QZHKN3VN-BxuV0Oba.js.map +0 -1
  169. package/webapp/dist/assets/chunk-TZMSLE5B-Cw689yRl.js.map +0 -1
  170. package/webapp/dist/assets/classDiagram-2ON5EDUG-BTTGianr.js.map +0 -1
  171. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-BTTGianr.js.map +0 -1
  172. package/webapp/dist/assets/clone-Dk8cAI3I.js.map +0 -1
  173. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BjJnzB2N.js.map +0 -1
  174. package/webapp/dist/assets/dagre-6UL2VRFP-VF-xGhAf.js.map +0 -1
  175. package/webapp/dist/assets/diagram-PSM6KHXK-Ba5U0oRY.js.map +0 -1
  176. package/webapp/dist/assets/diagram-QEK2KX5R-DoYCnEw_.js.map +0 -1
  177. package/webapp/dist/assets/diagram-S2PKOQOG-CkK4SRyE.js.map +0 -1
  178. package/webapp/dist/assets/erDiagram-Q2GNP2WA-DkI5eYww.js.map +0 -1
  179. package/webapp/dist/assets/flowDiagram-NV44I4VS-wOdPUQ7Y.js.map +0 -1
  180. package/webapp/dist/assets/ganttDiagram-JELNMOA3-BtRWgkUH.js.map +0 -1
  181. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-Bsz7u1vi.js.map +0 -1
  182. package/webapp/dist/assets/graph-DAMkuTbn.js +0 -425
  183. package/webapp/dist/assets/graph-DAMkuTbn.js.map +0 -1
  184. package/webapp/dist/assets/index-rYmIohM_.js.map +0 -1
  185. package/webapp/dist/assets/infoDiagram-HS3SLOUP-BMaxCvH5.js.map +0 -1
  186. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-ejyerzmG.js.map +0 -1
  187. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CYj35TEs.js.map +0 -1
  188. package/webapp/dist/assets/layout-7Ql4zmuL.js.map +0 -1
  189. package/webapp/dist/assets/linear-CVmgVPuZ.js.map +0 -1
  190. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-DOpxjGVo.js.map +0 -1
  191. package/webapp/dist/assets/pieDiagram-ADFJNKIX-CLQjpmAG.js.map +0 -1
  192. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-ClD_bz7z.js.map +0 -1
  193. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DOpb-TWH.js.map +0 -1
  194. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-D8Hsj3yx.js.map +0 -1
  195. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-CFMNjBER.js.map +0 -1
  196. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-BQeDlw0P.js.map +0 -1
  197. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-DscX61Rs.js.map +0 -1
  198. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BcXPSTiw.js.map +0 -1
  199. package/webapp/dist/assets/treemap-GDKQZRPO-BBr4UV0Z.js.map +0 -1
  200. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CS5RAtQE.js.map +0 -1
@@ -0,0 +1,18 @@
1
+ import type { TypedDialogEvent } from '@longrun-ai/kernel/types/dialog';
2
+ export type GlobalDialogEventRecorder = Readonly<{
3
+ label: string;
4
+ snapshot: () => readonly TypedDialogEvent[];
5
+ clear: () => void;
6
+ }>;
7
+ export declare function installGlobalDialogEventBroadcaster(args: {
8
+ label: string;
9
+ publish: (evt: TypedDialogEvent) => void;
10
+ }): void;
11
+ export declare function installRecordingGlobalDialogEventBroadcaster(args?: {
12
+ label?: string;
13
+ publish?: (evt: TypedDialogEvent) => void;
14
+ }): GlobalDialogEventRecorder;
15
+ export declare function clearInstalledGlobalDialogEventBroadcaster(): void;
16
+ export declare function assertGlobalDialogEventBroadcasterInstalled(where: string): void;
17
+ export declare function getRecordingGlobalDialogEventRecorder(): GlobalDialogEventRecorder | null;
18
+ export declare function requireRecordingGlobalDialogEventRecorder(where: string): GlobalDialogEventRecorder;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installGlobalDialogEventBroadcaster = installGlobalDialogEventBroadcaster;
4
+ exports.installRecordingGlobalDialogEventBroadcaster = installRecordingGlobalDialogEventBroadcaster;
5
+ exports.clearInstalledGlobalDialogEventBroadcaster = clearInstalledGlobalDialogEventBroadcaster;
6
+ exports.assertGlobalDialogEventBroadcasterInstalled = assertGlobalDialogEventBroadcasterInstalled;
7
+ exports.getRecordingGlobalDialogEventRecorder = getRecordingGlobalDialogEventRecorder;
8
+ exports.requireRecordingGlobalDialogEventRecorder = requireRecordingGlobalDialogEventRecorder;
9
+ const evt_registry_1 = require("../evt-registry");
10
+ const log_1 = require("../log");
11
+ const log = (0, log_1.createLogger)('global-dialog-event-broadcaster');
12
+ let installedBroadcasterState = { kind: 'uninitialized' };
13
+ function buildRecorder(label, events) {
14
+ return {
15
+ label,
16
+ snapshot: () => [...events],
17
+ clear: () => {
18
+ events.length = 0;
19
+ },
20
+ };
21
+ }
22
+ function installGlobalDialogEventBroadcaster(args) {
23
+ installedBroadcasterState = {
24
+ kind: 'custom',
25
+ label: args.label,
26
+ publish: args.publish,
27
+ };
28
+ (0, evt_registry_1.setGlobalDialogEventBroadcaster)(args.publish);
29
+ log.debug('Installed global dialog event broadcaster', undefined, {
30
+ label: args.label,
31
+ kind: 'custom',
32
+ });
33
+ }
34
+ function installRecordingGlobalDialogEventBroadcaster(args) {
35
+ const label = args?.label?.trim() || 'recording-broadcaster';
36
+ const events = [];
37
+ const publish = (evt) => {
38
+ events.push(evt);
39
+ args?.publish?.(evt);
40
+ };
41
+ installedBroadcasterState = {
42
+ kind: 'recording',
43
+ label,
44
+ events,
45
+ publish: args?.publish,
46
+ };
47
+ (0, evt_registry_1.setGlobalDialogEventBroadcaster)(publish);
48
+ log.debug('Installed recording global dialog event broadcaster', undefined, {
49
+ label,
50
+ kind: 'recording',
51
+ });
52
+ return buildRecorder(label, events);
53
+ }
54
+ function clearInstalledGlobalDialogEventBroadcaster() {
55
+ const previousKind = installedBroadcasterState.kind;
56
+ installedBroadcasterState = { kind: 'uninitialized' };
57
+ (0, evt_registry_1.setGlobalDialogEventBroadcaster)(null);
58
+ log.debug('Cleared global dialog event broadcaster', undefined, {
59
+ previousKind,
60
+ });
61
+ }
62
+ function assertGlobalDialogEventBroadcasterInstalled(where) {
63
+ if (installedBroadcasterState.kind !== 'uninitialized') {
64
+ return;
65
+ }
66
+ throw new Error(`Global dialog event broadcaster runtime missing: ${where} must install the broadcaster during runtime bootstrap before dialog logic runs`);
67
+ }
68
+ function getRecordingGlobalDialogEventRecorder() {
69
+ if (installedBroadcasterState.kind !== 'recording') {
70
+ return null;
71
+ }
72
+ return buildRecorder(installedBroadcasterState.label, installedBroadcasterState.events);
73
+ }
74
+ function requireRecordingGlobalDialogEventRecorder(where) {
75
+ const recorder = getRecordingGlobalDialogEventRecorder();
76
+ if (recorder) {
77
+ return recorder;
78
+ }
79
+ const currentKind = installedBroadcasterState.kind;
80
+ throw new Error(`Global dialog event recorder missing: ${where} requires a recording broadcaster, but runtime installed '${currentKind}'`);
81
+ }
@@ -45,7 +45,6 @@ function cloneReminderSnapshot(snapshot) {
45
45
  function cloneQuestions(questions) {
46
46
  return questions.map((question) => ({
47
47
  ...question,
48
- remainingCallIds: question.remainingCallIds ? [...question.remainingCallIds] : undefined,
49
48
  callSiteRef: { ...question.callSiteRef },
50
49
  }));
51
50
  }
@@ -105,16 +104,17 @@ function isPersistedMessageRecord(record) {
105
104
  case 'runtime_guide_record':
106
105
  case 'human_text_record':
107
106
  case 'func_call_record':
108
- case 'tellask_special_call_record':
107
+ case 'tellask_call_record':
109
108
  case 'func_result_record':
110
- case 'tellask_call_result_record':
111
- case 'tellask_response_record':
112
- case 'tellask_carryover_result_record':
109
+ case 'tellask_result_record':
110
+ case 'tellask_carryover_record':
113
111
  return true;
112
+ // UI-only timeline records belong to the retained transcript for replay/forking, but they do
113
+ // not contribute to message-count / context reconstruction semantics.
114
114
  case 'web_search_call_record':
115
+ case 'native_tool_call_record':
115
116
  case 'quest_for_sup_record':
116
117
  case 'tellask_reply_resolution_record':
117
- case 'tellask_call_carryover_record':
118
118
  case 'tellask_call_anchor_record':
119
119
  case 'gen_start_record':
120
120
  case 'gen_finish_record':
@@ -180,16 +180,17 @@ function rewriteRecordForFork(record, newRootId) {
180
180
  case 'ui_only_markdown_record':
181
181
  case 'runtime_guide_record':
182
182
  case 'func_call_record':
183
- case 'tellask_special_call_record':
183
+ case 'tellask_call_record':
184
+ // UI-only transcript records are safe to copy verbatim into the forked transcript. They are
185
+ // not part of baseline state reconciliation and must not make forking fail.
184
186
  case 'web_search_call_record':
187
+ case 'native_tool_call_record':
185
188
  case 'human_text_record':
186
189
  case 'quest_for_sup_record':
187
- case 'tellask_call_result_record':
190
+ case 'tellask_result_record':
188
191
  case 'tellask_reply_resolution_record':
189
- case 'tellask_call_carryover_record':
190
192
  case 'tellask_call_anchor_record':
191
- case 'tellask_response_record':
192
- case 'tellask_carryover_result_record':
193
+ case 'tellask_carryover_record':
193
194
  case 'gen_start_record':
194
195
  case 'gen_finish_record':
195
196
  return record;
@@ -223,7 +224,7 @@ function countMessages(events) {
223
224
  function countFunctionCalls(events) {
224
225
  let count = 0;
225
226
  for (const event of events) {
226
- if (event.type === 'func_call_record' || event.type === 'tellask_special_call_record') {
227
+ if (event.type === 'func_call_record' || event.type === 'tellask_call_record') {
227
228
  count += 1;
228
229
  }
229
230
  }
package/dist/dialog.d.ts CHANGED
@@ -13,11 +13,11 @@
13
13
  * - `SubDialog` - Subdialog with root dialog reference and dynamic supdialog resolution
14
14
  */
15
15
  import type { ContextHealthSnapshot } from '@longrun-ai/kernel/types/context-health';
16
- import type { DialogEvent, ReminderContent, WebSearchCallAction } from '@longrun-ai/kernel/types/dialog';
16
+ import type { DialogEvent, NativeToolCallPayload, ReminderContent, WebSearchCallAction, WebSearchCallSource } from '@longrun-ai/kernel/types/dialog';
17
17
  import type { DialogPrompt, DialogRunControlSpec, DialogSubdialogReplyTarget, DriveIntent } from '@longrun-ai/kernel/types/drive-intent';
18
18
  import type { LanguageCode } from '@longrun-ai/kernel/types/language';
19
- import type { CalleeCourseNumber, CalleeGenerationSeqNumber, CallingCourseNumber, DialogMetadataFile, HumanQuestion, ProviderData, ReasoningPayload, ToolArguments as StoredToolArguments, TellaskReplyDirective } from '@longrun-ai/kernel/types/storage';
20
- import { ChatMessage, FuncResultMsg } from './llm/client';
19
+ import type { CalleeCourseNumber, CalleeGenerationSeqNumber, CallingCourseNumber, DialogMetadataFile, HumanQuestion, ProviderData, ReasoningPayload, TellaskCallRecordName, TellaskReplyDirective } from '@longrun-ai/kernel/types/storage';
20
+ import { ChatMessage, FuncResultMsg, TellaskCarryoverMsg, TellaskResultMsg } from './llm/client';
21
21
  import type { JsonValue } from './tool';
22
22
  import { Reminder, ReminderOptions, ReminderOwner } from './tool';
23
23
  type NewCourseHookResult = {
@@ -34,7 +34,7 @@ type UpNextPromptState = {
34
34
  grammar?: 'markdown';
35
35
  userLanguageCode?: LanguageCode;
36
36
  origin: 'user' | 'diligence_push' | 'runtime';
37
- q4hAnswerCallIds?: string[];
37
+ q4hAnswerCallId?: string;
38
38
  tellaskReplyDirective?: TellaskReplyDirective;
39
39
  skipTaskdoc?: boolean;
40
40
  subdialogReplyTarget?: DialogSubdialogReplyTarget;
@@ -322,7 +322,7 @@ export declare abstract class Dialog {
322
322
  private buildUpNextPromptState;
323
323
  private replaceQueuedPromptState;
324
324
  private setNewCourseStartPrompt;
325
- private mergePromptQ4HAnswerCallIds;
325
+ private mergePromptQ4HAnswerCallId;
326
326
  private enqueueQueuedPromptState;
327
327
  private peekLatestUpNext;
328
328
  queueUserPromptAtGenerationBoundary(options: {
@@ -330,21 +330,21 @@ export declare abstract class Dialog {
330
330
  msgId: string;
331
331
  grammar: 'markdown';
332
332
  userLanguageCode?: LanguageCode;
333
- q4hAnswerCallIds?: string[];
333
+ q4hAnswerCallId?: string;
334
334
  }): UpNextPromptState;
335
335
  queueDeferredQ4HAnswerPrompt(options: {
336
336
  prompt: string;
337
337
  msgId: string;
338
338
  grammar: 'markdown';
339
339
  userLanguageCode?: LanguageCode;
340
- q4hAnswerCallIds?: string[];
340
+ q4hAnswerCallId?: string;
341
341
  }): UpNextPromptState;
342
342
  queueRegisteredAssignmentUpdatePrompt(options: {
343
343
  prompt: string;
344
344
  msgId: string;
345
345
  grammar: 'markdown';
346
346
  userLanguageCode?: LanguageCode;
347
- q4hAnswerCallIds?: string[];
347
+ q4hAnswerCallId?: string;
348
348
  tellaskReplyDirective?: TellaskReplyDirective;
349
349
  skipTaskdoc?: boolean;
350
350
  subdialogReplyTarget?: DialogSubdialogReplyTarget;
@@ -371,6 +371,20 @@ export declare abstract class Dialog {
371
371
  skipEnqueueIntent?: boolean;
372
372
  }): Promise<void>;
373
373
  receiveFuncResult(result: FuncResultMsg): Promise<void>;
374
+ receiveTellaskResult(result: TellaskResultMsg): Promise<void>;
375
+ receiveTellaskCarryover(result: TellaskCarryoverMsg): Promise<void>;
376
+ receiveTellaskCallResult(responderId: string, callName: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'askHuman' | 'freshBootsReasoning', mentionList: string[] | undefined, tellaskContent: string, result: string, status: 'completed' | 'failed', callId: string): Promise<void>;
377
+ receiveTellaskResponse(responderId: string, callName: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'askHuman' | 'freshBootsReasoning', mentionList: string[] | undefined, tellaskContent: string, status: 'completed' | 'failed', subdialogId: DialogID | undefined, options: {
378
+ response: string;
379
+ agentId: string;
380
+ callId: string;
381
+ originMemberId: string;
382
+ originCourse?: CallingCourseNumber;
383
+ carryoverContent?: string;
384
+ sessionSlug?: string;
385
+ calleeCourse?: CalleeCourseNumber;
386
+ calleeGenseq?: CalleeGenerationSeqNumber;
387
+ }): Promise<TellaskResultMsg | TellaskCarryoverMsg>;
374
388
  notifyGeneratingStart(msgId?: string): Promise<void>;
375
389
  notifyGeneratingFinish(contextHealth?: ContextHealthSnapshot, llmGenModel?: string): Promise<void>;
376
390
  streamError(error: string): Promise<void>;
@@ -385,11 +399,13 @@ export declare abstract class Dialog {
385
399
  sayingFinish(): Promise<void>;
386
400
  funcCallRequested(funcId: string, funcName: string, argumentsStr: string): Promise<void>;
387
401
  webSearchCall(payload: {
402
+ source?: WebSearchCallSource;
388
403
  phase: 'added' | 'done';
389
404
  itemId: string;
390
405
  status?: string;
391
406
  action?: WebSearchCallAction;
392
407
  }): Promise<void>;
408
+ nativeToolCall(payload: NativeToolCallPayload): Promise<void>;
393
409
  callingStart(payload: {
394
410
  callName: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'askHuman' | 'freshBootsReasoning';
395
411
  callId: string;
@@ -397,26 +413,13 @@ export declare abstract class Dialog {
397
413
  sessionSlug?: string;
398
414
  tellaskContent: string;
399
415
  }): Promise<void>;
400
- /**
401
- * Receive call result with callId for inline correlation
402
- */
403
- receiveTellaskCallResult(responderId: string, callName: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'askHuman' | 'freshBootsReasoning', mentionList: string[] | undefined, tellaskContent: string, result: string, status: 'completed' | 'failed', callId: string): Promise<void>;
404
- /**
405
- * Receive tellask response (separate bubble for tellask sideline replies)
406
- */
407
- receiveTellaskResponse(responderId: string, callName: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'freshBootsReasoning', mentionList: string[] | undefined, tellaskContent: string, status: 'completed' | 'failed', subdialogId: DialogID | undefined, options: {
408
- response: string;
409
- agentId: string;
410
- callId: string;
411
- originMemberId: string;
412
- originCourse?: CallingCourseNumber;
413
- carryoverContent?: string;
414
- sessionSlug?: string;
415
- calleeCourse?: CalleeCourseNumber;
416
- calleeGenseq?: CalleeGenerationSeqNumber;
417
- }): Promise<void>;
418
416
  updateQuestions4Human(questions: HumanQuestion[]): Promise<void>;
419
- persistUserMessage(content: string, msgId: string, grammar: 'markdown', origin: 'user' | 'diligence_push' | 'runtime' | undefined, userLanguageCode?: LanguageCode, q4hAnswerCallIds?: string[], tellaskReplyDirective?: TellaskReplyDirective): Promise<void>;
417
+ persistUserMessage(content: string, msgId: string, grammar: 'markdown', origin: 'user' | 'diligence_push' | 'runtime' | undefined, userLanguageCode?: LanguageCode, q4hAnswerCallId?: string, tellaskReplyDirective?: TellaskReplyDirective): Promise<void>;
418
+ receiveHumanReply(args: {
419
+ content: string;
420
+ userLanguageCode?: LanguageCode;
421
+ q4hAnswerCallId: string;
422
+ }): Promise<void>;
420
423
  appendTellaskReplyResolution(payload: {
421
424
  callId: string;
422
425
  replyCallName: 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack';
@@ -424,8 +427,19 @@ export declare abstract class Dialog {
424
427
  }): Promise<void>;
425
428
  persistAgentMessage(content: string, genseq: number, type: 'thinking_msg' | 'saying_msg', provider_data?: ProviderData, reasoning?: ReasoningPayload): Promise<void>;
426
429
  persistUiOnlyMarkdown(content: string, genseq: number): Promise<void>;
427
- persistFunctionCall(id: string, name: string, arguments_: StoredToolArguments, genseq: number): Promise<void>;
428
- persistTellaskSpecialCall(id: string, name: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack' | 'askHuman' | 'freshBootsReasoning', arguments_: StoredToolArguments, genseq: number): Promise<void>;
430
+ persistFunctionCall(id: string, name: string, rawArgumentsText: string, genseq: number): Promise<void>;
431
+ persistTellaskCall(id: string, name: TellaskCallRecordName, rawArgumentsText: string, genseq: number, options?: {
432
+ deliveryMode?: 'tellask_call_start' | 'func_call_requested';
433
+ }): Promise<void>;
434
+ persistFunctionCallResultPair(id: string, name: string, rawArgumentsText: string, genseq: number, result: FuncResultMsg): Promise<void>;
435
+ persistTellaskCallResultPair(args: {
436
+ id: string;
437
+ name: TellaskCallRecordName;
438
+ rawArgumentsText: string;
439
+ genseq: number;
440
+ result: TellaskResultMsg | FuncResultMsg;
441
+ deliveryMode: 'tellask_call_start' | 'func_call_requested';
442
+ }): Promise<void>;
429
443
  /**
430
444
  * Post subdialog completion response to this dialog.
431
445
  * Phase 14: No wait - emit immediately with virtual gen markers for Type C subdialogs
@@ -574,24 +588,8 @@ export declare abstract class DialogStore {
574
588
  sayingChunk(_dialog: Dialog, _chunk: string): void;
575
589
  sayingFinish(_dialog: Dialog): void;
576
590
  receiveFuncResult(_dialog: Dialog, _funcResult: FuncResultMsg): Promise<void>;
577
- /**
578
- * Receive call result with callId for inline correlation
579
- */
580
- receiveTellaskCallResult(_dialog: Dialog, _responderId: string, _callName: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'askHuman' | 'freshBootsReasoning', _mentionList: string[] | undefined, _tellaskContent: string, _result: string, _status: 'completed' | 'failed', _callId: string): Promise<void>;
581
- /**
582
- * Receive tellask response (separate bubble for tellask sideline replies)
583
- */
584
- receiveTellaskResponse(_dialog: Dialog, _responderId: string, _callName: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'freshBootsReasoning', _mentionList: string[] | undefined, _tellaskContent: string, _status: 'completed' | 'failed', _subdialogId: DialogID | undefined, _options: {
585
- response: string;
586
- agentId: string;
587
- callId: string;
588
- originMemberId: string;
589
- originCourse?: CallingCourseNumber;
590
- carryoverContent?: string;
591
- sessionSlug?: string;
592
- calleeCourse?: CalleeCourseNumber;
593
- calleeGenseq?: CalleeGenerationSeqNumber;
594
- }): Promise<void>;
591
+ receiveTellaskResult(_dialog: Dialog, _funcResult: TellaskResultMsg): Promise<void>;
592
+ receiveTellaskCarryover(_dialog: Dialog, _result: TellaskCarryoverMsg): Promise<void>;
595
593
  updateQuestions4Human(_dialog: Dialog, _questions: HumanQuestion[]): Promise<void>;
596
594
  /**
597
595
  * Load Questions for Human state from storage
@@ -619,11 +617,13 @@ export declare abstract class DialogStore {
619
617
  }): Promise<void>;
620
618
  funcCallRequested(_dialog: Dialog, _funcId: string, _funcName: string, _argumentsStr: string): Promise<void>;
621
619
  webSearchCall(_dialog: Dialog, _payload: {
620
+ source?: WebSearchCallSource;
622
621
  phase: 'added' | 'done';
623
622
  itemId: string;
624
623
  status?: string;
625
624
  action?: WebSearchCallAction;
626
625
  }): Promise<void>;
626
+ nativeToolCall(_dialog: Dialog, _payload: NativeToolCallPayload): Promise<void>;
627
627
  /**
628
628
  * Load current course number from persisted metadata
629
629
  * This method should be implemented by subclasses to read from storage
@@ -641,7 +641,7 @@ export declare abstract class DialogStore {
641
641
  /**
642
642
  * Persist a user message to storage
643
643
  */
644
- persistUserMessage(_dialog: Dialog, _content: string, _msgId: string, _grammar: 'markdown', _origin: 'user' | 'diligence_push' | 'runtime' | undefined, _userLanguageCode?: LanguageCode, _q4hAnswerCallIds?: string[], _tellaskReplyDirective?: TellaskReplyDirective): Promise<void>;
644
+ persistUserMessage(_dialog: Dialog, _content: string, _msgId: string, _grammar: 'markdown', _origin: 'user' | 'diligence_push' | 'runtime' | undefined, _userLanguageCode?: LanguageCode, _q4hAnswerCallId?: string, _tellaskReplyDirective?: TellaskReplyDirective): Promise<void>;
645
645
  appendTellaskReplyResolution(_dialog: Dialog, _payload: {
646
646
  callId: string;
647
647
  replyCallName: 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack';
@@ -659,8 +659,19 @@ export declare abstract class DialogStore {
659
659
  /**
660
660
  * Persist a function call to storage
661
661
  */
662
- persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _arguments: StoredToolArguments, _genseq: number): Promise<void>;
663
- persistTellaskSpecialCall(_dialog: Dialog, _id: string, _name: 'tellaskBack' | 'tellask' | 'tellaskSessionless' | 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack' | 'askHuman' | 'freshBootsReasoning', _arguments: StoredToolArguments, _genseq: number): Promise<void>;
662
+ persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number): Promise<void>;
663
+ persistTellaskCall(_dialog: Dialog, _id: string, _name: TellaskCallRecordName, _rawArgumentsText: string, _genseq: number, _options?: {
664
+ deliveryMode?: 'tellask_call_start' | 'func_call_requested';
665
+ }): Promise<void>;
666
+ persistFunctionCallResultPair(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number, _result: FuncResultMsg): Promise<void>;
667
+ persistTellaskCallResultPair(_dialog: Dialog, _args: {
668
+ id: string;
669
+ name: TellaskCallRecordName;
670
+ rawArgumentsText: string;
671
+ genseq: number;
672
+ result: TellaskResultMsg | FuncResultMsg;
673
+ deliveryMode: 'tellask_call_start' | 'func_call_requested';
674
+ }): Promise<void>;
664
675
  /**
665
676
  * Start a new course in storage
666
677
  */