dominds 1.16.2 → 1.16.4

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 (170) hide show
  1. package/dist/dialog-display-state.d.ts +3 -1
  2. package/dist/dialog-display-state.js +8 -1
  3. package/dist/dialog-fork.js +9 -0
  4. package/dist/dialog-global-registry.d.ts +5 -1
  5. package/dist/dialog-global-registry.js +45 -1
  6. package/dist/dialog.d.ts +3 -0
  7. package/dist/dialog.js +4 -0
  8. package/dist/llm/gen/anthropic.d.ts +3 -3
  9. package/dist/llm/gen/anthropic.js +115 -21
  10. package/dist/llm/gen/codex.js +78 -13
  11. package/dist/llm/gen/failure-classifier.js +10 -0
  12. package/dist/llm/gen/openai-compatible.d.ts +6 -3
  13. package/dist/llm/gen/openai-compatible.js +132 -16
  14. package/dist/llm/gen/openai.d.ts +2 -2
  15. package/dist/llm/gen/openai.js +95 -15
  16. package/dist/llm/gen/tool-result-image-ingest.d.ts +39 -0
  17. package/dist/llm/gen/tool-result-image-ingest.js +158 -0
  18. package/dist/llm/gen.d.ts +17 -1
  19. package/dist/llm/kernel-driver/drive.js +15 -0
  20. package/dist/llm/kernel-driver/flow.js +230 -177
  21. package/dist/llm/kernel-driver/loop.js +5 -0
  22. package/dist/persistence.d.ts +2 -0
  23. package/dist/persistence.js +107 -0
  24. package/dist/priming.js +76 -0
  25. package/package.json +3 -3
  26. package/webapp/dist/assets/{_basePickBy-BJWCmtUm.js → _basePickBy-BKLfvXfr.js} +3 -3
  27. package/webapp/dist/assets/_basePickBy-BKLfvXfr.js.map +1 -0
  28. package/webapp/dist/assets/{_baseUniq-D6k_lGfs.js → _baseUniq-DeO2MBcA.js} +2 -2
  29. package/webapp/dist/assets/_baseUniq-DeO2MBcA.js.map +1 -0
  30. package/webapp/dist/assets/{arc-DYDaESgj.js → arc-Bez5-ouI.js} +2 -2
  31. package/webapp/dist/assets/arc-Bez5-ouI.js.map +1 -0
  32. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-DZMT7dqc.js → architectureDiagram-2XIMDMQ5-BiDh8CGJ.js} +26 -8
  33. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-BiDh8CGJ.js.map +1 -0
  34. package/webapp/dist/assets/{blockDiagram-VD42YOAC-CABpgVAa.js → blockDiagram-WCTKOSBZ-fSZbZ3PY.js} +187 -170
  35. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-fSZbZ3PY.js.map +1 -0
  36. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-COLZS8Ul.js → c4Diagram-IC4MRINW-C-WxkPD_.js} +4 -4
  37. package/webapp/dist/assets/c4Diagram-IC4MRINW-C-WxkPD_.js.map +1 -0
  38. package/webapp/dist/assets/{channel-CYFm9Cri.js → channel-CbXK2-c_.js} +2 -2
  39. package/webapp/dist/assets/channel-CbXK2-c_.js.map +1 -0
  40. package/webapp/dist/assets/{chunk-4BX2VUAB-CX_-XbaN.js → chunk-4BX2VUAB-D6CgMaUm.js} +2 -2
  41. package/webapp/dist/assets/chunk-4BX2VUAB-D6CgMaUm.js.map +1 -0
  42. package/webapp/dist/assets/{chunk-55IACEB6-ByD-NdBC.js → chunk-55IACEB6-CafQjmEn.js} +2 -2
  43. package/webapp/dist/assets/chunk-55IACEB6-CafQjmEn.js.map +1 -0
  44. package/webapp/dist/assets/{chunk-FMBD7UC4-DYGviJnf.js → chunk-FMBD7UC4-CZRe1oW9.js} +2 -2
  45. package/webapp/dist/assets/chunk-FMBD7UC4-CZRe1oW9.js.map +1 -0
  46. package/webapp/dist/assets/{chunk-TZMSLE5B-_HISzxl3.js → chunk-JSJVCQXG-C3KJDde2.js} +14 -6
  47. package/webapp/dist/assets/chunk-JSJVCQXG-C3KJDde2.js.map +1 -0
  48. package/webapp/dist/assets/{chunk-QN33PNHL-B8DWRL9f.js → chunk-KX2RTZJC-1gHfMJyM.js} +2 -2
  49. package/webapp/dist/assets/chunk-KX2RTZJC-1gHfMJyM.js.map +1 -0
  50. package/webapp/dist/assets/{chunk-DI55MBZ5-DV7sdJmQ.js → chunk-NQ4KR5QH-CEZ0VIio.js} +9 -7
  51. package/webapp/dist/assets/chunk-NQ4KR5QH-CEZ0VIio.js.map +1 -0
  52. package/webapp/dist/assets/{chunk-QZHKN3VN-B1aYIzMR.js → chunk-QZHKN3VN-BE5nbumW.js} +2 -2
  53. package/webapp/dist/assets/chunk-QZHKN3VN-BE5nbumW.js.map +1 -0
  54. package/webapp/dist/assets/{chunk-B4BG7PRW-BANemsDD.js → chunk-WL4C6EOR-CY1FogYe.js} +171 -121
  55. package/webapp/dist/assets/chunk-WL4C6EOR-CY1FogYe.js.map +1 -0
  56. package/webapp/dist/assets/{classDiagram-2ON5EDUG-CpyYj1Rc.js → classDiagram-VBA2DB6C-DIAo1m4U.js} +7 -6
  57. package/webapp/dist/assets/classDiagram-VBA2DB6C-DIAo1m4U.js.map +1 -0
  58. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-CpyYj1Rc.js → classDiagram-v2-RAHNMMFH-DIAo1m4U.js} +7 -6
  59. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-DIAo1m4U.js.map +1 -0
  60. package/webapp/dist/assets/{clone-B_9AxWIU.js → clone-BzZfwhKW.js} +2 -2
  61. package/webapp/dist/assets/clone-BzZfwhKW.js.map +1 -0
  62. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-17ECLfPR.js → cose-bilkent-S5V4N54A-DIRdD9UY.js} +2 -2
  63. package/webapp/dist/assets/cose-bilkent-S5V4N54A-DIRdD9UY.js.map +1 -0
  64. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  65. package/webapp/dist/assets/{dagre-6UL2VRFP-DhRqcF1o.js → dagre-KLK3FWXG-BCEgv7zL.js} +7 -7
  66. package/webapp/dist/assets/dagre-KLK3FWXG-BCEgv7zL.js.map +1 -0
  67. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  68. package/webapp/dist/assets/{diagram-PSM6KHXK-lpDT6Wwb.js → diagram-E7M64L7V-CwNdHUlg.js} +10 -10
  69. package/webapp/dist/assets/diagram-E7M64L7V-CwNdHUlg.js.map +1 -0
  70. package/webapp/dist/assets/{diagram-QEK2KX5R-ohxbPpDH.js → diagram-IFDJBPK2-DBtRFFBv.js} +9 -8
  71. package/webapp/dist/assets/diagram-IFDJBPK2-DBtRFFBv.js.map +1 -0
  72. package/webapp/dist/assets/{diagram-S2PKOQOG-DAFFGfch.js → diagram-P4PSJMXO-BJRf8VnU.js} +8 -8
  73. package/webapp/dist/assets/diagram-P4PSJMXO-BJRf8VnU.js.map +1 -0
  74. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-BH-7rI43.js → erDiagram-INFDFZHY-BoZdWdP2.js} +96 -75
  75. package/webapp/dist/assets/erDiagram-INFDFZHY-BoZdWdP2.js.map +1 -0
  76. package/webapp/dist/assets/{flowDiagram-NV44I4VS-CdEjFbz4.js → flowDiagram-PKNHOUZH-Dptcw76l.js} +98 -81
  77. package/webapp/dist/assets/flowDiagram-PKNHOUZH-Dptcw76l.js.map +1 -0
  78. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Cju2t-lK.js → ganttDiagram-A5KZAMGK-qM3zsgxI.js} +28 -3
  79. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-qM3zsgxI.js.map +1 -0
  80. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-CUJ5oxCg.js → gitGraphDiagram-K3NZZRJ6-125S1YW0.js} +38 -46
  81. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-125S1YW0.js.map +1 -0
  82. package/webapp/dist/assets/graph-PACfG8qk.js +782 -0
  83. package/webapp/dist/assets/graph-PACfG8qk.js.map +1 -0
  84. package/webapp/dist/assets/{index-BLnM-uON.js → index-D8Klc1n-.js} +1114 -1048
  85. package/webapp/dist/assets/{index-BLnM-uON.js.map → index-D8Klc1n-.js.map} +1 -1
  86. package/webapp/dist/assets/{index-xvYYeHuy.css → index-YaxF76or.css} +1 -1
  87. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-Df8p0okQ.js → infoDiagram-LFFYTUFH-B9vrFy_9.js} +7 -7
  88. package/webapp/dist/assets/infoDiagram-LFFYTUFH-B9vrFy_9.js.map +1 -0
  89. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  90. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-CzcXR0Tc.js +966 -0
  91. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-CzcXR0Tc.js.map +1 -0
  92. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-BXMl8H-d.js → journeyDiagram-4ABVD52K-BzoWs6ft.js} +5 -5
  93. package/webapp/dist/assets/journeyDiagram-4ABVD52K-BzoWs6ft.js.map +1 -0
  94. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-Cc5RwCEh.js → kanban-definition-K7BYSVSG-TJm1UiSH.js} +5 -3
  95. package/webapp/dist/assets/kanban-definition-K7BYSVSG-TJm1UiSH.js.map +1 -0
  96. package/webapp/dist/assets/{layout-BB2SvQcE.js → layout-D-kg27bk.js} +5 -5
  97. package/webapp/dist/assets/layout-D-kg27bk.js.map +1 -0
  98. package/webapp/dist/assets/{linear-Cj50lA0a.js → linear-l0qAHpRW.js} +2 -2
  99. package/webapp/dist/assets/linear-l0qAHpRW.js.map +1 -0
  100. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BLBklJVX.js → mindmap-definition-YRQLILUH-D4282T7u.js} +7 -5
  101. package/webapp/dist/assets/mindmap-definition-YRQLILUH-D4282T7u.js.map +1 -0
  102. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  103. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BQrOgSc-.js → pieDiagram-SKSYHLDU-BKJYIUkU.js} +8 -8
  104. package/webapp/dist/assets/pieDiagram-SKSYHLDU-BKJYIUkU.js.map +1 -0
  105. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-C62TxtsO.js → quadrantDiagram-337W2JSQ-yjekONzR.js} +3 -3
  106. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-yjekONzR.js.map +1 -0
  107. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-Is6Q3osM.js → requirementDiagram-Z7DCOOCP-DMH1wutn.js} +16 -6
  108. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DMH1wutn.js.map +1 -0
  109. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-CCAW8Dr2.js → sankeyDiagram-WA2Y5GQK-Cs4ACtdq.js} +2 -2
  110. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-Cs4ACtdq.js.map +1 -0
  111. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DpODpbl6.js → sequenceDiagram-2WXFIKYE-4sriOpV9.js} +601 -201
  112. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-4sriOpV9.js.map +1 -0
  113. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-B8LHaf5T.js → stateDiagram-RAJIS63D-BUMObt6W.js} +9 -9
  114. package/webapp/dist/assets/stateDiagram-RAJIS63D-BUMObt6W.js.map +1 -0
  115. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-4FzTkpgz.js → stateDiagram-v2-FVOUBMTO-DazzpfnH.js} +5 -5
  116. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DazzpfnH.js.map +1 -0
  117. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-Ckxc4qZe.js → timeline-definition-YZTLITO2-CdChFPnp.js} +3 -3
  118. package/webapp/dist/assets/timeline-definition-YZTLITO2-CdChFPnp.js.map +1 -0
  119. package/webapp/dist/assets/{treemap-GDKQZRPO-QQa4vKMv.js → treemap-KZPCXAKY-DW9mBchB.js} +37 -24
  120. package/webapp/dist/assets/treemap-KZPCXAKY-DW9mBchB.js.map +1 -0
  121. package/webapp/dist/assets/vennDiagram-LZ73GAT5-Bu9N_8Cu.js +2487 -0
  122. package/webapp/dist/assets/vennDiagram-LZ73GAT5-Bu9N_8Cu.js.map +1 -0
  123. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-Ba2uJcs6.js → xychartDiagram-JWTSCODW-BI_N4JiZ.js} +4 -4
  124. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BI_N4JiZ.js.map +1 -0
  125. package/webapp/dist/index.html +2 -2
  126. package/webapp/dist/assets/_basePickBy-BJWCmtUm.js.map +0 -1
  127. package/webapp/dist/assets/_baseUniq-D6k_lGfs.js.map +0 -1
  128. package/webapp/dist/assets/arc-DYDaESgj.js.map +0 -1
  129. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DZMT7dqc.js.map +0 -1
  130. package/webapp/dist/assets/blockDiagram-VD42YOAC-CABpgVAa.js.map +0 -1
  131. package/webapp/dist/assets/c4Diagram-YG6GDRKO-COLZS8Ul.js.map +0 -1
  132. package/webapp/dist/assets/channel-CYFm9Cri.js.map +0 -1
  133. package/webapp/dist/assets/chunk-4BX2VUAB-CX_-XbaN.js.map +0 -1
  134. package/webapp/dist/assets/chunk-55IACEB6-ByD-NdBC.js.map +0 -1
  135. package/webapp/dist/assets/chunk-B4BG7PRW-BANemsDD.js.map +0 -1
  136. package/webapp/dist/assets/chunk-DI55MBZ5-DV7sdJmQ.js.map +0 -1
  137. package/webapp/dist/assets/chunk-FMBD7UC4-DYGviJnf.js.map +0 -1
  138. package/webapp/dist/assets/chunk-QN33PNHL-B8DWRL9f.js.map +0 -1
  139. package/webapp/dist/assets/chunk-QZHKN3VN-B1aYIzMR.js.map +0 -1
  140. package/webapp/dist/assets/chunk-TZMSLE5B-_HISzxl3.js.map +0 -1
  141. package/webapp/dist/assets/classDiagram-2ON5EDUG-CpyYj1Rc.js.map +0 -1
  142. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-CpyYj1Rc.js.map +0 -1
  143. package/webapp/dist/assets/clone-B_9AxWIU.js.map +0 -1
  144. package/webapp/dist/assets/cose-bilkent-S5V4N54A-17ECLfPR.js.map +0 -1
  145. package/webapp/dist/assets/dagre-6UL2VRFP-DhRqcF1o.js.map +0 -1
  146. package/webapp/dist/assets/diagram-PSM6KHXK-lpDT6Wwb.js.map +0 -1
  147. package/webapp/dist/assets/diagram-QEK2KX5R-ohxbPpDH.js.map +0 -1
  148. package/webapp/dist/assets/diagram-S2PKOQOG-DAFFGfch.js.map +0 -1
  149. package/webapp/dist/assets/erDiagram-Q2GNP2WA-BH-7rI43.js.map +0 -1
  150. package/webapp/dist/assets/flowDiagram-NV44I4VS-CdEjFbz4.js.map +0 -1
  151. package/webapp/dist/assets/ganttDiagram-JELNMOA3-Cju2t-lK.js.map +0 -1
  152. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-CUJ5oxCg.js.map +0 -1
  153. package/webapp/dist/assets/graph-mhcc7ldf.js +0 -425
  154. package/webapp/dist/assets/graph-mhcc7ldf.js.map +0 -1
  155. package/webapp/dist/assets/infoDiagram-HS3SLOUP-Df8p0okQ.js.map +0 -1
  156. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-BXMl8H-d.js.map +0 -1
  157. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-Cc5RwCEh.js.map +0 -1
  158. package/webapp/dist/assets/layout-BB2SvQcE.js.map +0 -1
  159. package/webapp/dist/assets/linear-Cj50lA0a.js.map +0 -1
  160. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BLBklJVX.js.map +0 -1
  161. package/webapp/dist/assets/pieDiagram-ADFJNKIX-BQrOgSc-.js.map +0 -1
  162. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-C62TxtsO.js.map +0 -1
  163. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-Is6Q3osM.js.map +0 -1
  164. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-CCAW8Dr2.js.map +0 -1
  165. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-DpODpbl6.js.map +0 -1
  166. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-B8LHaf5T.js.map +0 -1
  167. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-4FzTkpgz.js.map +0 -1
  168. package/webapp/dist/assets/timeline-definition-IT6M3QCI-Ckxc4qZe.js.map +0 -1
  169. package/webapp/dist/assets/treemap-GDKQZRPO-QQa4vKMv.js.map +0 -1
  170. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-Ba2uJcs6.js.map +0 -1
package/dist/llm/gen.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { LlmUsageStats } from '@longrun-ai/kernel/types/context-health';
2
2
  import type { DialogDisplayTextI18n } from '@longrun-ai/kernel/types/display-state';
3
- import type { ReasoningPayload } from '@longrun-ai/kernel/types/storage';
3
+ import type { ReasoningPayload, ToolResultImageArtifact, ToolResultImageDisposition } from '@longrun-ai/kernel/types/storage';
4
4
  import { Team } from '../team';
5
5
  import { FuncTool } from '../tool';
6
6
  import { ChatMessage, ProviderConfig } from './client';
@@ -26,6 +26,9 @@ export type LlmBatchOutput = {
26
26
  } | {
27
27
  kind: 'native_tool_call';
28
28
  call: OpenAiResponsesNativeToolCall;
29
+ } | {
30
+ kind: 'tool_result_image_ingest';
31
+ ingest: ToolResultImageIngest;
29
32
  };
30
33
  export interface LlmBatchResult {
31
34
  messages: ChatMessage[];
@@ -46,8 +49,20 @@ export type LlmFailureClassifier = (error: unknown) => LlmFailureDisposition | u
46
49
  export interface LlmRequestContext {
47
50
  dialogSelfId: string;
48
51
  dialogRootId: string;
52
+ providerKey?: string;
53
+ modelKey?: string;
49
54
  promptCacheKey?: string;
50
55
  }
56
+ export type ToolResultImageIngest = {
57
+ toolCallId: string;
58
+ toolName: string;
59
+ artifact: ToolResultImageArtifact;
60
+ provider: string;
61
+ model: string;
62
+ disposition: ToolResultImageDisposition;
63
+ message: string;
64
+ detail?: string;
65
+ };
51
66
  export type CodexLlmWebSearchAction = {
52
67
  type: 'search';
53
68
  query?: string;
@@ -120,6 +135,7 @@ export interface LlmStreamReceiver {
120
135
  funcCall: (callId: string, name: string, args: string) => Promise<void>;
121
136
  webSearchCall?: (call: LlmWebSearchCall) => Promise<void>;
122
137
  nativeToolCall?: (call: OpenAiResponsesNativeToolCall) => Promise<void>;
138
+ toolResultImageIngest?: (ingest: ToolResultImageIngest) => Promise<void>;
123
139
  streamError?: (detail: string) => Promise<void>;
124
140
  }
125
141
  export interface LlmGenerator {
@@ -235,6 +235,9 @@ function resolveKernelDriverRetryPolicy(providerCfg) {
235
235
  function hasMeaningfulBatchOutput(batch) {
236
236
  if (Array.isArray(batch.outputs) && batch.outputs.length > 0) {
237
237
  for (const output of batch.outputs) {
238
+ if (output.kind === 'tool_result_image_ingest') {
239
+ continue;
240
+ }
238
241
  if (output.kind !== 'message') {
239
242
  return true;
240
243
  }
@@ -1602,6 +1605,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1602
1605
  const batchResult = await llmGen.genMoreMessages(providerCfg, agent, systemPrompt, funcTools, {
1603
1606
  dialogSelfId: dlg.id.selfId,
1604
1607
  dialogRootId: dlg.id.rootId,
1608
+ providerKey: provider,
1609
+ modelKey: model,
1605
1610
  promptCacheKey: `${dlg.id.selfId}:c${String(dlg.currentCourse)}`,
1606
1611
  }, ctxMsgs, dlg.activeGenSeq, abortSignal);
1607
1612
  if (!hasMeaningfulBatchOutput(batchResult)) {
@@ -1776,6 +1781,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1776
1781
  sawNativeToolSideChannelOutput = true;
1777
1782
  await dlg.nativeToolCall(call);
1778
1783
  },
1784
+ toolResultImageIngest: async (ingest) => {
1785
+ throwIfAborted(abortSignal, dlg);
1786
+ await dlg.toolResultImageIngest(ingest);
1787
+ },
1779
1788
  };
1780
1789
  const res = await (0, runtime_1.runLlmRequestWithRetry)({
1781
1790
  dlg,
@@ -1810,6 +1819,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1810
1819
  const streamResult = await llmGen.genToReceiver(providerCfg, agent, systemPrompt, funcTools, {
1811
1820
  dialogSelfId: dlg.id.selfId,
1812
1821
  dialogRootId: dlg.id.rootId,
1822
+ providerKey: provider,
1823
+ modelKey: model,
1813
1824
  promptCacheKey: `${dlg.id.selfId}:c${String(dlg.currentCourse)}`,
1814
1825
  }, ctxMsgs, receiver, dlg.activeGenSeq, abortSignal);
1815
1826
  const hasThinkingContent = currentThinkingContent.trim() !== '';
@@ -1884,6 +1895,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1884
1895
  await dlg.nativeToolCall(output.call);
1885
1896
  break;
1886
1897
  }
1898
+ case 'tool_result_image_ingest': {
1899
+ await dlg.toolResultImageIngest(output.ingest);
1900
+ break;
1901
+ }
1887
1902
  default: {
1888
1903
  const _exhaustive = output;
1889
1904
  throw new Error(`Unhandled batch output kind: ${String(_exhaustive)}`);
@@ -74,6 +74,38 @@ async function loadPendingDiagnosticsSnapshot(args) {
74
74
  };
75
75
  }
76
76
  }
77
+ async function clearConsumedDeferredRootQueueIfIdle(dialog) {
78
+ if (dialog.id.selfId !== dialog.id.rootId) {
79
+ return;
80
+ }
81
+ if (!dialog_global_registry_1.globalDialogRegistry.get(dialog.id.rootId)) {
82
+ return;
83
+ }
84
+ const suspension = await dialog.getSuspensionStatus();
85
+ if (dialog.hasUpNext() || !suspension.canDrive) {
86
+ return;
87
+ }
88
+ const persistedNeedsDrive = await persistence_1.DialogPersistence.getNeedsDrive(dialog.id);
89
+ const registryNeedsDrive = dialog_global_registry_1.globalDialogRegistry.isMarkedNeedingDrive(dialog.id.rootId);
90
+ if (!registryNeedsDrive && !persistedNeedsDrive) {
91
+ return;
92
+ }
93
+ try {
94
+ await persistence_1.DialogPersistence.setNeedsDrive(dialog.id, false, dialog.status);
95
+ }
96
+ catch (error) {
97
+ log_1.log.error('kernel-driver failed to persist consumed deferred root queue cleanup', error, {
98
+ dialogId: dialog.id.valueOf(),
99
+ rootId: dialog.id.rootId,
100
+ selfId: dialog.id.selfId,
101
+ });
102
+ return;
103
+ }
104
+ dialog_global_registry_1.globalDialogRegistry.markNotNeedingDrive(dialog.id.rootId, {
105
+ source: 'kernel_driver_flow_tail',
106
+ reason: 'root_idle_after_consuming_deferred_queue',
107
+ });
108
+ }
77
109
  function hasNoPromptSubdialogResumeEntitlement(dialog, driveOptions) {
78
110
  const entitlement = driveOptions?.noPromptSubdialogResumeEntitlement;
79
111
  if (!entitlement) {
@@ -490,203 +522,224 @@ async function executeDriveRound(args) {
490
522
  if (!interruptedBySignal) {
491
523
  followUp = dialog.takeUpNext();
492
524
  }
493
- }
494
- finally {
495
- if (activeRunPrimed && ownsActiveRun) {
496
- (0, dialog_display_state_1.clearActiveRun)(dialog.id);
497
- }
498
- release();
499
- }
500
- if (dialog instanceof dialog_1.SubDialog &&
501
- driveResult &&
502
- !interruptedBySignal &&
503
- (driveResult.fbrConclusion !== undefined || driveResult.lastAssistantSayingContent !== null)) {
504
- if (driveResult.fbrConclusion) {
505
- await (0, subdialog_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
506
- subdialog: dialog,
507
- responseText: driveResult.fbrConclusion.responseText,
508
- responseGenseq: driveResult.fbrConclusion.responseGenseq,
509
- scheduleDrive: args.scheduleDrive,
510
- });
511
- }
512
- else if (driveResult.lastAssistantSayingContent !== null) {
513
- const hasInProgressFunctionCall = typeof driveResult.lastFunctionCallGenseq === 'number' &&
514
- Number.isFinite(driveResult.lastFunctionCallGenseq) &&
515
- driveResult.lastFunctionCallGenseq > 0 &&
516
- (typeof driveResult.lastAssistantSayingGenseq !== 'number' ||
517
- !Number.isFinite(driveResult.lastAssistantSayingGenseq) ||
518
- driveResult.lastAssistantSayingGenseq <= driveResult.lastFunctionCallGenseq);
519
- if (hasInProgressFunctionCall) {
520
- // Any function call means execution is still in-progress. Only supply when the callee
521
- // has produced a newer assistant saying after the latest function call.
522
- log_1.log.debug('kernel-driver skip subdialog response supply because latest saying is not after function calls', undefined, {
523
- rootId: dialog.id.rootId,
524
- selfId: dialog.id.selfId,
525
- lastAssistantSayingGenseq: driveResult.lastAssistantSayingGenseq,
526
- lastFunctionCallGenseq: driveResult.lastFunctionCallGenseq,
527
- });
528
- }
529
- else {
530
- const hasFollowUp = followUp !== undefined;
531
- const suspension = await dialog.getSuspensionStatus();
532
- if (!suspension.canDrive || hasFollowUp) {
533
- log_1.log.debug('kernel-driver skip subdialog response supply while callee is not finalized', undefined, {
534
- rootId: dialog.id.rootId,
535
- selfId: dialog.id.selfId,
536
- waitingQ4H: suspension.q4h,
537
- waitingSubdialogs: suspension.subdialogs,
538
- hasFollowUp,
525
+ let tailError;
526
+ try {
527
+ if (dialog instanceof dialog_1.SubDialog &&
528
+ driveResult &&
529
+ !interruptedBySignal &&
530
+ (driveResult.fbrConclusion !== undefined || driveResult.lastAssistantSayingContent !== null)) {
531
+ if (driveResult.fbrConclusion) {
532
+ await (0, subdialog_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
533
+ subdialog: dialog,
534
+ responseText: driveResult.fbrConclusion.responseText,
535
+ responseGenseq: driveResult.fbrConclusion.responseGenseq,
536
+ scheduleDrive: args.scheduleDrive,
539
537
  });
540
538
  }
541
- if (suspension.canDrive && !hasFollowUp) {
542
- if (!activeTellaskReplyDirective) {
543
- log_1.log.debug('kernel-driver skip implicit subdialog reply because no active tellask reply directive is bound to this drive', undefined, {
539
+ else if (driveResult.lastAssistantSayingContent !== null) {
540
+ const hasInProgressFunctionCall = typeof driveResult.lastFunctionCallGenseq === 'number' &&
541
+ Number.isFinite(driveResult.lastFunctionCallGenseq) &&
542
+ driveResult.lastFunctionCallGenseq > 0 &&
543
+ (typeof driveResult.lastAssistantSayingGenseq !== 'number' ||
544
+ !Number.isFinite(driveResult.lastAssistantSayingGenseq) ||
545
+ driveResult.lastAssistantSayingGenseq <= driveResult.lastFunctionCallGenseq);
546
+ if (hasInProgressFunctionCall) {
547
+ // Any function call means execution is still in-progress. Only supply when the callee
548
+ // has produced a newer assistant saying after the latest function call.
549
+ log_1.log.debug('kernel-driver skip subdialog response supply because latest saying is not after function calls', undefined, {
544
550
  rootId: dialog.id.rootId,
545
551
  selfId: dialog.id.selfId,
552
+ lastAssistantSayingGenseq: driveResult.lastAssistantSayingGenseq,
553
+ lastFunctionCallGenseq: driveResult.lastFunctionCallGenseq,
546
554
  });
547
555
  }
548
556
  else {
549
- if (typeof driveResult.lastAssistantSayingGenseq !== 'number' ||
550
- !Number.isFinite(driveResult.lastAssistantSayingGenseq) ||
551
- driveResult.lastAssistantSayingGenseq <= 0) {
552
- throw new Error(`Subdialog response supply invariant violation: missing lastAssistantSayingGenseq for dialog=${dialog.id.valueOf()}`);
553
- }
554
- const responseGenseq = Math.floor(driveResult.lastAssistantSayingGenseq);
555
- const directFallbackCallId = `direct-fallback-${(0, id_1.generateShortId)()}`;
556
- let supplied = false;
557
- if (subdialogReplyTarget) {
558
- supplied = await (0, subdialog_1.supplySubdialogResponseToSpecificCallerIfPendingV2)({
559
- subdialog: dialog,
560
- responseText: driveResult.lastAssistantSayingContent,
561
- responseGenseq,
562
- target: subdialogReplyTarget,
563
- deliveryMode: 'direct_fallback',
564
- replyResolution: {
565
- callId: directFallbackCallId,
566
- replyCallName: activeTellaskReplyDirective.expectedReplyCallName,
567
- },
568
- scheduleDrive: args.scheduleDrive,
557
+ const hasFollowUp = followUp !== undefined;
558
+ const suspension = await dialog.getSuspensionStatus();
559
+ if (!suspension.canDrive || hasFollowUp) {
560
+ log_1.log.debug('kernel-driver skip subdialog response supply while callee is not finalized', undefined, {
561
+ rootId: dialog.id.rootId,
562
+ selfId: dialog.id.selfId,
563
+ waitingQ4H: suspension.q4h,
564
+ waitingSubdialogs: suspension.subdialogs,
565
+ hasFollowUp,
569
566
  });
570
- if (!supplied) {
571
- supplied = await (0, subdialog_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
572
- subdialog: dialog,
573
- responseText: driveResult.lastAssistantSayingContent,
574
- responseGenseq,
575
- deliveryMode: 'direct_fallback',
576
- replyResolution: {
577
- callId: directFallbackCallId,
578
- replyCallName: activeTellaskReplyDirective.expectedReplyCallName,
579
- },
580
- scheduleDrive: args.scheduleDrive,
567
+ }
568
+ if (suspension.canDrive && !hasFollowUp) {
569
+ if (!activeTellaskReplyDirective) {
570
+ log_1.log.debug('kernel-driver skip implicit subdialog reply because no active tellask reply directive is bound to this drive', undefined, {
571
+ rootId: dialog.id.rootId,
572
+ selfId: dialog.id.selfId,
581
573
  });
582
574
  }
583
- }
584
- else {
585
- supplied = await (0, subdialog_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
586
- subdialog: dialog,
587
- responseText: driveResult.lastAssistantSayingContent,
588
- responseGenseq,
589
- deliveryMode: 'direct_fallback',
590
- replyResolution: {
591
- callId: directFallbackCallId,
592
- replyCallName: activeTellaskReplyDirective.expectedReplyCallName,
593
- },
594
- scheduleDrive: args.scheduleDrive,
595
- });
596
- }
597
- if (!supplied && subdialogReplyTarget) {
598
- const diagnostics = await loadPendingDiagnosticsSnapshot({
599
- rootId: dialog.id.rootId,
600
- ownerDialogId: subdialogReplyTarget.ownerDialogId,
601
- expectedSubdialogId: dialog.id.selfId,
602
- status: dialog.status,
603
- });
604
- log_1.log.debug('kernel-driver failed to supply subdialog response to specific caller', undefined, {
605
- calleeId: dialog.id.valueOf(),
606
- targetOwner: subdialogReplyTarget.ownerDialogId,
607
- targetOwnerDialogId: subdialogReplyTarget.ownerDialogId,
608
- targetCallType: subdialogReplyTarget.callType,
609
- targetCallId: subdialogReplyTarget.callId,
610
- diagnostics,
611
- });
575
+ else {
576
+ if (typeof driveResult.lastAssistantSayingGenseq !== 'number' ||
577
+ !Number.isFinite(driveResult.lastAssistantSayingGenseq) ||
578
+ driveResult.lastAssistantSayingGenseq <= 0) {
579
+ throw new Error(`Subdialog response supply invariant violation: missing lastAssistantSayingGenseq for dialog=${dialog.id.valueOf()}`);
580
+ }
581
+ const responseGenseq = Math.floor(driveResult.lastAssistantSayingGenseq);
582
+ const directFallbackCallId = `direct-fallback-${(0, id_1.generateShortId)()}`;
583
+ let supplied = false;
584
+ if (subdialogReplyTarget) {
585
+ supplied = await (0, subdialog_1.supplySubdialogResponseToSpecificCallerIfPendingV2)({
586
+ subdialog: dialog,
587
+ responseText: driveResult.lastAssistantSayingContent,
588
+ responseGenseq,
589
+ target: subdialogReplyTarget,
590
+ deliveryMode: 'direct_fallback',
591
+ replyResolution: {
592
+ callId: directFallbackCallId,
593
+ replyCallName: activeTellaskReplyDirective.expectedReplyCallName,
594
+ },
595
+ scheduleDrive: args.scheduleDrive,
596
+ });
597
+ if (!supplied) {
598
+ supplied = await (0, subdialog_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
599
+ subdialog: dialog,
600
+ responseText: driveResult.lastAssistantSayingContent,
601
+ responseGenseq,
602
+ deliveryMode: 'direct_fallback',
603
+ replyResolution: {
604
+ callId: directFallbackCallId,
605
+ replyCallName: activeTellaskReplyDirective.expectedReplyCallName,
606
+ },
607
+ scheduleDrive: args.scheduleDrive,
608
+ });
609
+ }
610
+ }
611
+ else {
612
+ supplied = await (0, subdialog_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
613
+ subdialog: dialog,
614
+ responseText: driveResult.lastAssistantSayingContent,
615
+ responseGenseq,
616
+ deliveryMode: 'direct_fallback',
617
+ replyResolution: {
618
+ callId: directFallbackCallId,
619
+ replyCallName: activeTellaskReplyDirective.expectedReplyCallName,
620
+ },
621
+ scheduleDrive: args.scheduleDrive,
622
+ });
623
+ }
624
+ if (!supplied && subdialogReplyTarget) {
625
+ const diagnostics = await loadPendingDiagnosticsSnapshot({
626
+ rootId: dialog.id.rootId,
627
+ ownerDialogId: subdialogReplyTarget.ownerDialogId,
628
+ expectedSubdialogId: dialog.id.selfId,
629
+ status: dialog.status,
630
+ });
631
+ log_1.log.debug('kernel-driver failed to supply subdialog response to specific caller', undefined, {
632
+ calleeId: dialog.id.valueOf(),
633
+ targetOwner: subdialogReplyTarget.ownerDialogId,
634
+ targetOwnerDialogId: subdialogReplyTarget.ownerDialogId,
635
+ targetCallType: subdialogReplyTarget.callType,
636
+ targetCallId: subdialogReplyTarget.callId,
637
+ diagnostics,
638
+ });
639
+ }
640
+ }
612
641
  }
613
642
  }
614
643
  }
615
644
  }
616
- }
617
- }
618
- if (!(dialog instanceof dialog_1.SubDialog) &&
619
- driveResult &&
620
- !interruptedBySignal &&
621
- driveResult.lastAssistantSayingContent !== null &&
622
- activeTellaskReplyDirective?.expectedReplyCallName === 'replyTellaskBack' &&
623
- followUp === undefined) {
624
- const hasInProgressFunctionCall = typeof driveResult.lastFunctionCallGenseq === 'number' &&
625
- Number.isFinite(driveResult.lastFunctionCallGenseq) &&
626
- driveResult.lastFunctionCallGenseq > 0 &&
627
- (typeof driveResult.lastAssistantSayingGenseq !== 'number' ||
628
- !Number.isFinite(driveResult.lastAssistantSayingGenseq) ||
629
- driveResult.lastAssistantSayingGenseq <= driveResult.lastFunctionCallGenseq);
630
- if (!hasInProgressFunctionCall) {
631
- if (!activePromptWasReplyToolReminder) {
632
- const language = (0, work_language_1.getWorkLanguage)();
633
- followUp = {
634
- prompt: await buildReplyToolReminderPrompt({
635
- dlg: dialog,
636
- directive: activeTellaskReplyDirective,
637
- language,
638
- }),
639
- msgId: (0, id_1.generateShortId)(),
640
- grammar: 'markdown',
641
- origin: 'runtime',
642
- userLanguageCode: language,
643
- tellaskReplyDirective: activeTellaskReplyDirective,
644
- };
645
- log_1.log.debug('kernel-driver queued replyTellaskBack reminder prompt after plain reply', undefined, {
646
- dialogId: dialog.id.valueOf(),
647
- targetCallId: activeTellaskReplyDirective.targetCallId,
648
- });
645
+ if (!(dialog instanceof dialog_1.SubDialog) &&
646
+ driveResult &&
647
+ !interruptedBySignal &&
648
+ driveResult.lastAssistantSayingContent !== null &&
649
+ activeTellaskReplyDirective?.expectedReplyCallName === 'replyTellaskBack' &&
650
+ followUp === undefined) {
651
+ const hasInProgressFunctionCall = typeof driveResult.lastFunctionCallGenseq === 'number' &&
652
+ Number.isFinite(driveResult.lastFunctionCallGenseq) &&
653
+ driveResult.lastFunctionCallGenseq > 0 &&
654
+ (typeof driveResult.lastAssistantSayingGenseq !== 'number' ||
655
+ !Number.isFinite(driveResult.lastAssistantSayingGenseq) ||
656
+ driveResult.lastAssistantSayingGenseq <= driveResult.lastFunctionCallGenseq);
657
+ if (!hasInProgressFunctionCall) {
658
+ if (!activePromptWasReplyToolReminder) {
659
+ const language = (0, work_language_1.getWorkLanguage)();
660
+ followUp = {
661
+ prompt: await buildReplyToolReminderPrompt({
662
+ dlg: dialog,
663
+ directive: activeTellaskReplyDirective,
664
+ language,
665
+ }),
666
+ msgId: (0, id_1.generateShortId)(),
667
+ grammar: 'markdown',
668
+ origin: 'runtime',
669
+ userLanguageCode: language,
670
+ tellaskReplyDirective: activeTellaskReplyDirective,
671
+ };
672
+ log_1.log.debug('kernel-driver queued replyTellaskBack reminder prompt after plain reply', undefined, {
673
+ dialogId: dialog.id.valueOf(),
674
+ targetCallId: activeTellaskReplyDirective.targetCallId,
675
+ });
676
+ }
677
+ else {
678
+ await (0, tellask_special_1.deliverTellaskBackReplyFromDirective)({
679
+ dlg: dialog,
680
+ directive: activeTellaskReplyDirective,
681
+ replyContent: driveResult.lastAssistantSayingContent,
682
+ callbacks: {
683
+ scheduleDrive: args.scheduleDrive,
684
+ driveDialog: args.driveDialog,
685
+ },
686
+ deliveryMode: 'direct_fallback',
687
+ });
688
+ await dialog.appendTellaskReplyResolution({
689
+ callId: `direct-fallback-${(0, id_1.generateShortId)()}`,
690
+ replyCallName: 'replyTellaskBack',
691
+ targetCallId: activeTellaskReplyDirective.targetCallId,
692
+ });
693
+ }
694
+ }
649
695
  }
650
- else {
651
- await (0, tellask_special_1.deliverTellaskBackReplyFromDirective)({
652
- dlg: dialog,
653
- directive: activeTellaskReplyDirective,
654
- replyContent: driveResult.lastAssistantSayingContent,
655
- callbacks: {
656
- scheduleDrive: args.scheduleDrive,
657
- driveDialog: args.driveDialog,
696
+ if (followUp) {
697
+ args.scheduleDrive(dialog, {
698
+ waitInQue: true,
699
+ driveOptions: {
700
+ source: 'kernel_driver_follow_up',
701
+ reason: 'follow_up_prompt',
702
+ },
703
+ humanPrompt: {
704
+ content: followUp.prompt,
705
+ msgId: followUp.msgId,
706
+ grammar: followUp.grammar ?? 'markdown',
707
+ origin: followUp.origin,
708
+ userLanguageCode: followUp.userLanguageCode === 'zh' || followUp.userLanguageCode === 'en'
709
+ ? followUp.userLanguageCode
710
+ : undefined,
711
+ q4hAnswerCallId: followUp.q4hAnswerCallId,
712
+ tellaskReplyDirective: followUp.tellaskReplyDirective,
713
+ skipTaskdoc: followUp.skipTaskdoc,
714
+ subdialogReplyTarget: followUp.subdialogReplyTarget,
715
+ runControl: followUp.runControl,
658
716
  },
659
- deliveryMode: 'direct_fallback',
660
717
  });
661
- await dialog.appendTellaskReplyResolution({
662
- callId: `direct-fallback-${(0, id_1.generateShortId)()}`,
663
- replyCallName: 'replyTellaskBack',
664
- targetCallId: activeTellaskReplyDirective.targetCallId,
718
+ }
719
+ }
720
+ catch (error) {
721
+ tailError = error;
722
+ }
723
+ if (tailError === undefined) {
724
+ try {
725
+ await clearConsumedDeferredRootQueueIfIdle(dialog);
726
+ }
727
+ catch (error) {
728
+ log_1.log.error('kernel-driver failed to reconcile consumed deferred root queue after tail', error, {
729
+ dialogId: dialog.id.valueOf(),
730
+ rootId: dialog.id.rootId,
731
+ selfId: dialog.id.selfId,
665
732
  });
666
733
  }
667
734
  }
735
+ if (tailError !== undefined) {
736
+ throw tailError;
737
+ }
668
738
  }
669
- if (followUp) {
670
- args.scheduleDrive(dialog, {
671
- waitInQue: true,
672
- driveOptions: {
673
- source: 'kernel_driver_follow_up',
674
- reason: 'follow_up_prompt',
675
- },
676
- humanPrompt: {
677
- content: followUp.prompt,
678
- msgId: followUp.msgId,
679
- grammar: followUp.grammar ?? 'markdown',
680
- origin: followUp.origin,
681
- userLanguageCode: followUp.userLanguageCode === 'zh' || followUp.userLanguageCode === 'en'
682
- ? followUp.userLanguageCode
683
- : undefined,
684
- q4hAnswerCallId: followUp.q4hAnswerCallId,
685
- tellaskReplyDirective: followUp.tellaskReplyDirective,
686
- skipTaskdoc: followUp.skipTaskdoc,
687
- subdialogReplyTarget: followUp.subdialogReplyTarget,
688
- runControl: followUp.runControl,
689
- },
690
- });
739
+ finally {
740
+ if (activeRunPrimed && ownsActiveRun) {
741
+ (0, dialog_display_state_1.clearActiveRun)(dialog.id);
742
+ }
743
+ release();
691
744
  }
692
745
  }
@@ -36,6 +36,11 @@ async function driveQueuedDialogsOnce() {
36
36
  continue;
37
37
  }
38
38
  if ((0, dialog_display_state_1.hasActiveRun)(rootDialog.id)) {
39
+ log_1.log.debug('Backend driver deferred queued root drive because dialog already has an active run', undefined, {
40
+ dialogId: rootDialog.id.valueOf(),
41
+ rootId: rootDialog.id.rootId,
42
+ });
43
+ dialog_global_registry_1.globalDialogRegistry.noteActiveRunBlockedQueuedDrive(rootDialog.id.rootId);
39
44
  continue;
40
45
  }
41
46
  if (!(await rootDialog.canDrive())) {
@@ -13,6 +13,7 @@ import { WebSocket } from 'ws';
13
13
  import type { PendingSubdialog } from './dialog';
14
14
  import { Dialog, DialogID, DialogStore, RootDialog, SubDialog } from './dialog';
15
15
  import { ChatMessage, FuncResultMsg, TellaskCarryoverMsg, TellaskResultMsg } from './llm/client';
16
+ import type { ToolResultImageIngest } from './llm/gen';
16
17
  import { Reminder } from './tool';
17
18
  export declare function setDialogsQuarantinedBroadcaster(fn: ((msg: DialogsQuarantinedMessage) => void) | null): void;
18
19
  export declare function setPrepareDialogQuarantineHook(fn: ((args: {
@@ -114,6 +115,7 @@ export declare class DiskFileDialogStore extends DialogStore {
114
115
  action?: WebSearchCallAction;
115
116
  }): Promise<void>;
116
117
  nativeToolCall(dialog: Dialog, payload: NativeToolCallPayload): Promise<void>;
118
+ toolResultImageIngest(dialog: Dialog, payload: ToolResultImageIngest): Promise<void>;
117
119
  /**
118
120
  * Emit stream error for current generation lifecycle (uses active genseq when present)
119
121
  */