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
@@ -1,9 +1,10 @@
1
1
  import type { ChatMessage, FuncCallMsg } from '../client';
2
+ type ToolCallMsg = FuncCallMsg;
2
3
  export declare function normalizeToolCallPairs(context: readonly ChatMessage[]): ChatMessage[];
3
4
  export declare function hasAdjacentMatchingToolResult(context: readonly ChatMessage[], index: number): boolean;
4
5
  export declare function hasAdjacentMatchingToolCall(context: readonly ChatMessage[], index: number): boolean;
5
- export declare function formatUnresolvedToolCallText(call: FuncCallMsg): string;
6
- type ToolCallAdjacencyViolation = Readonly<{
6
+ export declare function formatUnresolvedToolCallText(call: ToolCallMsg): string;
7
+ export type ToolCallAdjacencyViolation = Readonly<{
7
8
  kind: 'unresolved_call';
8
9
  index: number;
9
10
  callId: string;
@@ -15,5 +16,9 @@ type ToolCallAdjacencyViolation = Readonly<{
15
16
  toolName: string;
16
17
  }>;
17
18
  export declare function findFirstToolCallAdjacencyViolation(context: readonly ChatMessage[]): ToolCallAdjacencyViolation | null;
19
+ export declare function sanitizeToolContextForProvider(context: readonly ChatMessage[]): Readonly<{
20
+ messages: ChatMessage[];
21
+ droppedViolations: ToolCallAdjacencyViolation[];
22
+ }>;
18
23
  export declare function formatToolCallAdjacencyViolation(violation: ToolCallAdjacencyViolation, location: string): string;
19
24
  export {};
@@ -5,7 +5,14 @@ exports.hasAdjacentMatchingToolResult = hasAdjacentMatchingToolResult;
5
5
  exports.hasAdjacentMatchingToolCall = hasAdjacentMatchingToolCall;
6
6
  exports.formatUnresolvedToolCallText = formatUnresolvedToolCallText;
7
7
  exports.findFirstToolCallAdjacencyViolation = findFirstToolCallAdjacencyViolation;
8
+ exports.sanitizeToolContextForProvider = sanitizeToolContextForProvider;
8
9
  exports.formatToolCallAdjacencyViolation = formatToolCallAdjacencyViolation;
10
+ function isToolCallMsg(msg) {
11
+ return msg?.type === 'func_call_msg';
12
+ }
13
+ function isToolResultMsg(msg) {
14
+ return msg?.type === 'func_result_msg';
15
+ }
9
16
  function normalizeToolCallPairs(context) {
10
17
  // Providers differ in how strictly they validate tool call/result ordering. Dominds can
11
18
  // temporarily produce a block of calls followed by a block of results when tools run in
@@ -14,18 +21,18 @@ function normalizeToolCallPairs(context) {
14
21
  let i = 0;
15
22
  while (i < context.length) {
16
23
  const msg = context[i];
17
- if (msg.type !== 'func_call_msg') {
24
+ if (!isToolCallMsg(msg)) {
18
25
  out.push(msg);
19
26
  i += 1;
20
27
  continue;
21
28
  }
22
29
  const calls = [];
23
- while (i < context.length && context[i].type === 'func_call_msg') {
30
+ while (i < context.length && isToolCallMsg(context[i])) {
24
31
  calls.push(context[i]);
25
32
  i += 1;
26
33
  }
27
34
  const results = [];
28
- while (i < context.length && context[i].type === 'func_result_msg') {
35
+ while (i < context.length && isToolResultMsg(context[i])) {
29
36
  results.push(context[i]);
30
37
  i += 1;
31
38
  }
@@ -66,14 +73,12 @@ function normalizeToolCallPairs(context) {
66
73
  function hasAdjacentMatchingToolResult(context, index) {
67
74
  const current = context[index];
68
75
  const next = context[index + 1];
69
- return (current?.type === 'func_call_msg' && next?.type === 'func_result_msg' && current.id === next.id);
76
+ return isToolCallMsg(current) && isToolResultMsg(next) && current.id === next.id;
70
77
  }
71
78
  function hasAdjacentMatchingToolCall(context, index) {
72
79
  const previous = context[index - 1];
73
80
  const current = context[index];
74
- return (previous?.type === 'func_call_msg' &&
75
- current?.type === 'func_result_msg' &&
76
- previous.id === current.id);
81
+ return isToolCallMsg(previous) && isToolResultMsg(current) && previous.id === current.id;
77
82
  }
78
83
  function formatUnresolvedToolCallText(call) {
79
84
  const argumentsText = call.arguments.trim();
@@ -85,7 +90,7 @@ function formatUnresolvedToolCallText(call) {
85
90
  function findFirstToolCallAdjacencyViolation(context) {
86
91
  for (let index = 0; index < context.length; index += 1) {
87
92
  const msg = context[index];
88
- if (msg.type === 'func_call_msg' && !hasAdjacentMatchingToolResult(context, index)) {
93
+ if (isToolCallMsg(msg) && !hasAdjacentMatchingToolResult(context, index)) {
89
94
  return {
90
95
  kind: 'unresolved_call',
91
96
  index,
@@ -93,7 +98,7 @@ function findFirstToolCallAdjacencyViolation(context) {
93
98
  toolName: msg.name,
94
99
  };
95
100
  }
96
- if (msg.type === 'func_result_msg' && !hasAdjacentMatchingToolCall(context, index)) {
101
+ if (isToolResultMsg(msg) && !hasAdjacentMatchingToolCall(context, index)) {
97
102
  return {
98
103
  kind: 'orphaned_result',
99
104
  index,
@@ -104,15 +109,52 @@ function findFirstToolCallAdjacencyViolation(context) {
104
109
  }
105
110
  return null;
106
111
  }
112
+ function sanitizeToolContextForProvider(context) {
113
+ const normalized = normalizeToolCallPairs(context);
114
+ const sanitized = [];
115
+ const droppedViolations = [];
116
+ for (let index = 0; index < normalized.length; index += 1) {
117
+ const msg = normalized[index];
118
+ if (isToolCallMsg(msg)) {
119
+ const next = normalized[index + 1];
120
+ if (isToolResultMsg(next) && next.id === msg.id) {
121
+ sanitized.push(msg, next);
122
+ index += 1;
123
+ continue;
124
+ }
125
+ droppedViolations.push({
126
+ kind: 'unresolved_call',
127
+ index,
128
+ callId: msg.id,
129
+ toolName: msg.name,
130
+ });
131
+ continue;
132
+ }
133
+ if (isToolResultMsg(msg)) {
134
+ droppedViolations.push({
135
+ kind: 'orphaned_result',
136
+ index,
137
+ callId: msg.id,
138
+ toolName: msg.name,
139
+ });
140
+ continue;
141
+ }
142
+ sanitized.push(msg);
143
+ }
144
+ return {
145
+ messages: sanitized,
146
+ droppedViolations,
147
+ };
148
+ }
107
149
  function formatToolCallAdjacencyViolation(violation, location) {
108
150
  switch (violation.kind) {
109
151
  case 'unresolved_call':
110
- return (`${location}: unresolved persisted func_call_msg detected ` +
152
+ return (`${location}: unresolved persisted tool call message detected ` +
111
153
  `(callId=${violation.callId}, tool=${violation.toolName}, index=${violation.index}). ` +
112
- 'This means a tool call was persisted without a matching func_result_msg.');
154
+ 'This means a tool call was persisted without a matching tool result message.');
113
155
  case 'orphaned_result':
114
- return (`${location}: orphaned persisted func_result_msg detected ` +
156
+ return (`${location}: orphaned persisted tool result message detected ` +
115
157
  `(callId=${violation.callId}, tool=${violation.toolName}, index=${violation.index}). ` +
116
- 'This means a tool result was restored without the immediately preceding func_call_msg.');
158
+ 'This means a tool result was restored without the immediately preceding tool call message.');
117
159
  }
118
160
  }
package/dist/llm/gen.d.ts CHANGED
@@ -7,8 +7,19 @@ export interface LlmStreamResult {
7
7
  usage: LlmUsageStats;
8
8
  llmGenModel?: string;
9
9
  }
10
+ export type LlmBatchOutput = {
11
+ kind: 'message';
12
+ message: ChatMessage;
13
+ } | {
14
+ kind: 'web_search_call';
15
+ call: LlmWebSearchCall;
16
+ } | {
17
+ kind: 'native_tool_call';
18
+ call: OpenAiResponsesNativeToolCall;
19
+ };
10
20
  export interface LlmBatchResult {
11
21
  messages: ChatMessage[];
22
+ outputs?: LlmBatchOutput[];
12
23
  usage: LlmUsageStats;
13
24
  llmGenModel?: string;
14
25
  }
@@ -26,9 +37,21 @@ export interface LlmRequestContext {
26
37
  dialogRootId: string;
27
38
  promptCacheKey?: string;
28
39
  }
29
- export type LlmWebSearchAction = {
40
+ export type CodexLlmWebSearchAction = {
41
+ type: 'search';
42
+ query?: string;
43
+ } | {
44
+ type: 'open_page';
45
+ url?: string;
46
+ } | {
47
+ type: 'find_in_page';
48
+ url?: string;
49
+ pattern?: string;
50
+ };
51
+ export type OpenAiResponsesLlmWebSearchAction = {
30
52
  type: 'search';
31
53
  query?: string;
54
+ queries?: string[];
32
55
  } | {
33
56
  type: 'open_page';
34
57
  url?: string;
@@ -37,12 +60,45 @@ export type LlmWebSearchAction = {
37
60
  url?: string;
38
61
  pattern?: string;
39
62
  };
40
- export type LlmWebSearchCall = {
63
+ export type CodexLlmWebSearchCall = {
64
+ source: 'codex';
65
+ phase: 'added' | 'done';
66
+ itemId: string;
67
+ status?: string;
68
+ action?: CodexLlmWebSearchAction;
69
+ };
70
+ export type OpenAiResponsesLlmWebSearchCall = {
71
+ source: 'openai_responses';
72
+ phase: 'added' | 'done';
73
+ itemId: string;
74
+ status?: string;
75
+ action?: OpenAiResponsesLlmWebSearchAction;
76
+ };
77
+ export type LlmWebSearchCall = CodexLlmWebSearchCall | OpenAiResponsesLlmWebSearchCall;
78
+ export type OpenAiResponsesNativeToolItemType = 'file_search_call' | 'code_interpreter_call' | 'image_generation_call' | 'mcp_call' | 'mcp_list_tools' | 'mcp_approval_request' | 'custom_tool_call';
79
+ export type OpenAiResponsesNonCustomNativeToolItemType = Exclude<OpenAiResponsesNativeToolItemType, 'custom_tool_call'>;
80
+ export type OpenAiResponsesNonCustomNativeToolCall = {
81
+ source: 'openai_responses';
82
+ itemType: OpenAiResponsesNonCustomNativeToolItemType;
41
83
  phase: 'added' | 'done';
42
84
  itemId: string;
43
85
  status?: string;
44
- action?: LlmWebSearchAction;
86
+ title?: string;
87
+ summary?: string;
88
+ detail?: string;
89
+ };
90
+ export type OpenAiResponsesCustomToolCall = {
91
+ source: 'openai_responses';
92
+ itemType: 'custom_tool_call';
93
+ phase: 'added' | 'done';
94
+ callId: string;
95
+ itemId?: string;
96
+ status?: string;
97
+ title?: string;
98
+ summary?: string;
99
+ detail?: string;
45
100
  };
101
+ export type OpenAiResponsesNativeToolCall = OpenAiResponsesNonCustomNativeToolCall | OpenAiResponsesCustomToolCall;
46
102
  export interface LlmStreamReceiver {
47
103
  thinkingStart: () => Promise<void>;
48
104
  thinkingChunk: (chunk: string) => Promise<void>;
@@ -52,6 +108,7 @@ export interface LlmStreamReceiver {
52
108
  sayingFinish: () => Promise<void>;
53
109
  funcCall: (callId: string, name: string, args: string) => Promise<void>;
54
110
  webSearchCall?: (call: LlmWebSearchCall) => Promise<void>;
111
+ nativeToolCall?: (call: OpenAiResponsesNativeToolCall) => Promise<void>;
55
112
  streamError?: (detail: string) => Promise<void>;
56
113
  }
57
114
  export interface LlmGenerator {
@@ -30,7 +30,7 @@ function hasUserPromptLikeAnchor(source) {
30
30
  continue;
31
31
  if ((msg.type === 'prompting_msg' ||
32
32
  msg.type === 'environment_msg' ||
33
- msg.type === 'tellask_carryover_result_msg') &&
33
+ msg.type === 'tellask_carryover_msg') &&
34
34
  msg.role === 'user') {
35
35
  return true;
36
36
  }