dominds 1.17.7 → 1.18.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 (140) hide show
  1. package/dist/dialog-fork.js +11 -5
  2. package/dist/dialog-instance-registry.js +1 -18
  3. package/dist/dialog.d.ts +21 -31
  4. package/dist/dialog.js +207 -56
  5. package/dist/docs/dialog-system.md +3 -2
  6. package/dist/docs/dialog-system.zh.md +3 -2
  7. package/dist/docs/tellask-collab.md +2 -1
  8. package/dist/docs/tellask-collab.zh.md +2 -1
  9. package/dist/llm/defaults.yaml +43 -0
  10. package/dist/llm/gen/anthropic.js +153 -12
  11. package/dist/llm/gen/codex.js +160 -10
  12. package/dist/llm/gen/openai-compatible.js +141 -81
  13. package/dist/llm/gen/openai.js +178 -12
  14. package/dist/llm/gen/tool-result-image-ingest.d.ts +17 -8
  15. package/dist/llm/gen/tool-result-image-ingest.js +127 -27
  16. package/dist/llm/gen.d.ts +13 -0
  17. package/dist/llm/kernel-driver/drive.js +79 -15
  18. package/dist/llm/kernel-driver/flow.js +158 -41
  19. package/dist/llm/kernel-driver/reply-guidance.d.ts +6 -6
  20. package/dist/llm/kernel-driver/reply-guidance.js +169 -2
  21. package/dist/llm/kernel-driver/runtime.d.ts +2 -2
  22. package/dist/llm/kernel-driver/subdialog.js +4 -0
  23. package/dist/llm/kernel-driver/tellask-special.d.ts +2 -0
  24. package/dist/llm/kernel-driver/tellask-special.js +11 -6
  25. package/dist/llm/kernel-driver/types.d.ts +14 -24
  26. package/dist/minds/system-prompt.js +8 -8
  27. package/dist/persistence.d.ts +6 -5
  28. package/dist/persistence.js +198 -39
  29. package/dist/priming.js +98 -3
  30. package/dist/runtime/driver-messages.d.ts +1 -0
  31. package/dist/runtime/driver-messages.js +32 -10
  32. package/dist/runtime/reply-prompt-copy.js +4 -4
  33. package/dist/server/api-routes.js +11 -43
  34. package/dist/server/websocket-handler.js +155 -10
  35. package/dist/tools/builtins.js +10 -4
  36. package/dist/tools/cmd-runner.js +110 -49
  37. package/dist/tools/picture.d.ts +3 -0
  38. package/dist/tools/picture.js +344 -0
  39. package/dist/tools/prompts/control/en/principles.md +4 -2
  40. package/dist/tools/prompts/control/en/scenarios.md +2 -1
  41. package/dist/tools/prompts/control/en/tools.md +6 -6
  42. package/dist/tools/prompts/control/zh/principles.md +4 -2
  43. package/dist/tools/prompts/control/zh/scenarios.md +2 -1
  44. package/dist/tools/prompts/control/zh/tools.md +1 -1
  45. package/dist/tools/prompts/ws_mod.en.md +1 -0
  46. package/dist/tools/prompts/ws_mod.zh.md +1 -0
  47. package/dist/tools/prompts/ws_read/en/tools.md +25 -5
  48. package/dist/tools/prompts/ws_read/zh/tools.md +25 -5
  49. package/package.json +4 -4
  50. package/webapp/dist/assets/{_basePickBy-u7tNFRWr.js → _basePickBy-BPJaiZdW.js} +3 -3
  51. package/webapp/dist/assets/{_basePickBy-u7tNFRWr.js.map → _basePickBy-BPJaiZdW.js.map} +1 -1
  52. package/webapp/dist/assets/{_baseUniq-CH9LRkiH.js → _baseUniq-BEetT15i.js} +2 -2
  53. package/webapp/dist/assets/{_baseUniq-CH9LRkiH.js.map → _baseUniq-BEetT15i.js.map} +1 -1
  54. package/webapp/dist/assets/{arc-Bo0Lw3ZP.js → arc-Dm7Zf36f.js} +2 -2
  55. package/webapp/dist/assets/{arc-Bo0Lw3ZP.js.map → arc-Dm7Zf36f.js.map} +1 -1
  56. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Ckyr89Iw.js → architectureDiagram-VXUJARFQ-BpTPtkuo.js} +7 -7
  57. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Ckyr89Iw.js.map → architectureDiagram-VXUJARFQ-BpTPtkuo.js.map} +1 -1
  58. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BSXoLLq_.js → blockDiagram-VD42YOAC-C8fLN0iu.js} +7 -7
  59. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BSXoLLq_.js.map → blockDiagram-VD42YOAC-C8fLN0iu.js.map} +1 -1
  60. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CgCG1cP0.js → c4Diagram-YG6GDRKO-BpPr62CH.js} +3 -3
  61. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CgCG1cP0.js.map → c4Diagram-YG6GDRKO-BpPr62CH.js.map} +1 -1
  62. package/webapp/dist/assets/{channel-Crbz0zgt.js → channel-EMYoPjW3.js} +2 -2
  63. package/webapp/dist/assets/{channel-Crbz0zgt.js.map → channel-EMYoPjW3.js.map} +1 -1
  64. package/webapp/dist/assets/{chunk-4BX2VUAB-BIIEb_5S.js → chunk-4BX2VUAB-CefNtjWG.js} +2 -2
  65. package/webapp/dist/assets/{chunk-4BX2VUAB-BIIEb_5S.js.map → chunk-4BX2VUAB-CefNtjWG.js.map} +1 -1
  66. package/webapp/dist/assets/{chunk-55IACEB6-CaJzGgc9.js → chunk-55IACEB6-C_X7T43V.js} +2 -2
  67. package/webapp/dist/assets/{chunk-55IACEB6-CaJzGgc9.js.map → chunk-55IACEB6-C_X7T43V.js.map} +1 -1
  68. package/webapp/dist/assets/{chunk-B4BG7PRW-DHQwhO9F.js → chunk-B4BG7PRW-BRe3_2oA.js} +5 -5
  69. package/webapp/dist/assets/{chunk-B4BG7PRW-DHQwhO9F.js.map → chunk-B4BG7PRW-BRe3_2oA.js.map} +1 -1
  70. package/webapp/dist/assets/{chunk-DI55MBZ5-CG1lO0R8.js → chunk-DI55MBZ5-CbvrsI_w.js} +4 -4
  71. package/webapp/dist/assets/{chunk-DI55MBZ5-CG1lO0R8.js.map → chunk-DI55MBZ5-CbvrsI_w.js.map} +1 -1
  72. package/webapp/dist/assets/{chunk-FMBD7UC4-DAUsTLPS.js → chunk-FMBD7UC4-ORmtkrtS.js} +2 -2
  73. package/webapp/dist/assets/{chunk-FMBD7UC4-DAUsTLPS.js.map → chunk-FMBD7UC4-ORmtkrtS.js.map} +1 -1
  74. package/webapp/dist/assets/{chunk-QN33PNHL-BfQs-QHE.js → chunk-QN33PNHL-LTAOVhWu.js} +2 -2
  75. package/webapp/dist/assets/{chunk-QN33PNHL-BfQs-QHE.js.map → chunk-QN33PNHL-LTAOVhWu.js.map} +1 -1
  76. package/webapp/dist/assets/{chunk-QZHKN3VN-C5iKQ6mQ.js → chunk-QZHKN3VN-ZoUM_4u5.js} +2 -2
  77. package/webapp/dist/assets/{chunk-QZHKN3VN-C5iKQ6mQ.js.map → chunk-QZHKN3VN-ZoUM_4u5.js.map} +1 -1
  78. package/webapp/dist/assets/{chunk-TZMSLE5B-CBShDwy2.js → chunk-TZMSLE5B-Gao4qrq7.js} +2 -2
  79. package/webapp/dist/assets/{chunk-TZMSLE5B-CBShDwy2.js.map → chunk-TZMSLE5B-Gao4qrq7.js.map} +1 -1
  80. package/webapp/dist/assets/{classDiagram-2ON5EDUG-DrfJDzYO.js → classDiagram-2ON5EDUG-uha1vIGN.js} +6 -6
  81. package/webapp/dist/assets/{classDiagram-2ON5EDUG-DrfJDzYO.js.map → classDiagram-2ON5EDUG-uha1vIGN.js.map} +1 -1
  82. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-DrfJDzYO.js → classDiagram-v2-WZHVMYZB-uha1vIGN.js} +6 -6
  83. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-DrfJDzYO.js.map → classDiagram-v2-WZHVMYZB-uha1vIGN.js.map} +1 -1
  84. package/webapp/dist/assets/{clone-Cd-48URG.js → clone-_9Ayb1Gp.js} +2 -2
  85. package/webapp/dist/assets/{clone-Cd-48URG.js.map → clone-_9Ayb1Gp.js.map} +1 -1
  86. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CCji0YN3.js → cose-bilkent-S5V4N54A-C8wDw3NY.js} +2 -2
  87. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CCji0YN3.js.map → cose-bilkent-S5V4N54A-C8wDw3NY.js.map} +1 -1
  88. package/webapp/dist/assets/{dagre-6UL2VRFP-B94p-Dpl.js → dagre-6UL2VRFP-BUSeNot0.js} +7 -7
  89. package/webapp/dist/assets/{dagre-6UL2VRFP-B94p-Dpl.js.map → dagre-6UL2VRFP-BUSeNot0.js.map} +1 -1
  90. package/webapp/dist/assets/{diagram-PSM6KHXK-DP-zGmAS.js → diagram-PSM6KHXK-CMZAksVC.js} +8 -8
  91. package/webapp/dist/assets/{diagram-PSM6KHXK-DP-zGmAS.js.map → diagram-PSM6KHXK-CMZAksVC.js.map} +1 -1
  92. package/webapp/dist/assets/{diagram-QEK2KX5R-DquJirs4.js → diagram-QEK2KX5R-BQKoRtwy.js} +7 -7
  93. package/webapp/dist/assets/{diagram-QEK2KX5R-DquJirs4.js.map → diagram-QEK2KX5R-BQKoRtwy.js.map} +1 -1
  94. package/webapp/dist/assets/{diagram-S2PKOQOG-Dt5W2t6V.js → diagram-S2PKOQOG-DjMG97kd.js} +7 -7
  95. package/webapp/dist/assets/{diagram-S2PKOQOG-Dt5W2t6V.js.map → diagram-S2PKOQOG-DjMG97kd.js.map} +1 -1
  96. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-Bs0-2Rfj.js → erDiagram-Q2GNP2WA-BujwA137.js} +5 -5
  97. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-Bs0-2Rfj.js.map → erDiagram-Q2GNP2WA-BujwA137.js.map} +1 -1
  98. package/webapp/dist/assets/{flowDiagram-NV44I4VS-cJjXWAlK.js → flowDiagram-NV44I4VS-DgwPjg4y.js} +6 -6
  99. package/webapp/dist/assets/{flowDiagram-NV44I4VS-cJjXWAlK.js.map → flowDiagram-NV44I4VS-DgwPjg4y.js.map} +1 -1
  100. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Du1AUaKm.js → ganttDiagram-JELNMOA3-Db2ykf3E.js} +3 -3
  101. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Du1AUaKm.js.map → ganttDiagram-JELNMOA3-Db2ykf3E.js.map} +1 -1
  102. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_jVOYOK.js → gitGraphDiagram-V2S2FVAM-D_gSifkv.js} +8 -8
  103. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_jVOYOK.js.map → gitGraphDiagram-V2S2FVAM-D_gSifkv.js.map} +1 -1
  104. package/webapp/dist/assets/{graph-CuF_sq4r.js → graph-BHjCU5xP.js} +3 -3
  105. package/webapp/dist/assets/{graph-CuF_sq4r.js.map → graph-BHjCU5xP.js.map} +1 -1
  106. package/webapp/dist/assets/{index-DAShQcjb.js → index-DLajsIDJ.js} +1363 -248
  107. package/webapp/dist/assets/{index-DAShQcjb.js.map → index-DLajsIDJ.js.map} +1 -1
  108. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-CEFlo_Hl.js → infoDiagram-HS3SLOUP-BDba5pKs.js} +6 -6
  109. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-CEFlo_Hl.js.map → infoDiagram-HS3SLOUP-BDba5pKs.js.map} +1 -1
  110. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-zc2Q4Se9.js → journeyDiagram-XKPGCS4Q-CmJAbmlm.js} +5 -5
  111. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-zc2Q4Se9.js.map → journeyDiagram-XKPGCS4Q-CmJAbmlm.js.map} +1 -1
  112. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-oT42RM2a.js → kanban-definition-3W4ZIXB7-DxQeBTDk.js} +3 -3
  113. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-oT42RM2a.js.map → kanban-definition-3W4ZIXB7-DxQeBTDk.js.map} +1 -1
  114. package/webapp/dist/assets/{layout-BvaOu3k2.js → layout-DteV_yE8.js} +5 -5
  115. package/webapp/dist/assets/{layout-BvaOu3k2.js.map → layout-DteV_yE8.js.map} +1 -1
  116. package/webapp/dist/assets/{linear-Cg-CjocS.js → linear-zItbPrND.js} +2 -2
  117. package/webapp/dist/assets/{linear-Cg-CjocS.js.map → linear-zItbPrND.js.map} +1 -1
  118. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-CVFVrU22.js → mindmap-definition-VGOIOE7T-BJXI7UqO.js} +4 -4
  119. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-CVFVrU22.js.map → mindmap-definition-VGOIOE7T-BJXI7UqO.js.map} +1 -1
  120. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Bai5CMos.js → pieDiagram-ADFJNKIX-BpM-aH2p.js} +8 -8
  121. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Bai5CMos.js.map → pieDiagram-ADFJNKIX-BpM-aH2p.js.map} +1 -1
  122. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-BPXDO_2E.js → quadrantDiagram-AYHSOK5B-NXdIpA15.js} +3 -3
  123. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-BPXDO_2E.js.map → quadrantDiagram-AYHSOK5B-NXdIpA15.js.map} +1 -1
  124. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-Dgj9X9cE.js → requirementDiagram-UZGBJVZJ-D1AICAA0.js} +4 -4
  125. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-Dgj9X9cE.js.map → requirementDiagram-UZGBJVZJ-D1AICAA0.js.map} +1 -1
  126. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-Dc0mO4OD.js → sankeyDiagram-TZEHDZUN-WiReDPfo.js} +2 -2
  127. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-Dc0mO4OD.js.map → sankeyDiagram-TZEHDZUN-WiReDPfo.js.map} +1 -1
  128. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DZJTga0d.js → sequenceDiagram-WL72ISMW-Cw76oP8t.js} +4 -4
  129. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DZJTga0d.js.map → sequenceDiagram-WL72ISMW-Cw76oP8t.js.map} +1 -1
  130. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-RNxYatKM.js → stateDiagram-FKZM4ZOC-QjCeRczs.js} +9 -9
  131. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-RNxYatKM.js.map → stateDiagram-FKZM4ZOC-QjCeRczs.js.map} +1 -1
  132. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-ADxYqWzo.js → stateDiagram-v2-4FDKWEC3-IClqxQ4s.js} +5 -5
  133. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-ADxYqWzo.js.map → stateDiagram-v2-4FDKWEC3-IClqxQ4s.js.map} +1 -1
  134. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-Qx_h1e-i.js → timeline-definition-IT6M3QCI-BfyfTY7m.js} +3 -3
  135. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-Qx_h1e-i.js.map → timeline-definition-IT6M3QCI-BfyfTY7m.js.map} +1 -1
  136. package/webapp/dist/assets/{treemap-GDKQZRPO-BHzYvXGn.js → treemap-GDKQZRPO-C5MiL6--.js} +5 -5
  137. package/webapp/dist/assets/{treemap-GDKQZRPO-BHzYvXGn.js.map → treemap-GDKQZRPO-C5MiL6--.js.map} +1 -1
  138. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-DGdjkYQQ.js → xychartDiagram-PRI3JC2R-ybaJrSry.js} +3 -3
  139. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-DGdjkYQQ.js.map → xychartDiagram-PRI3JC2R-ybaJrSry.js.map} +1 -1
  140. package/webapp/dist/index.html +1 -1
@@ -576,6 +576,20 @@ function buildToolResultImageIngestRecord(ingest, genseq) {
576
576
  detail: ingest.detail,
577
577
  };
578
578
  }
579
+ function buildUserImageIngestRecord(ingest, genseq) {
580
+ return {
581
+ ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
582
+ type: 'user_image_ingest_record',
583
+ genseq,
584
+ ...(ingest.msgId !== undefined ? { msgId: ingest.msgId } : {}),
585
+ artifact: ingest.artifact,
586
+ provider: ingest.provider,
587
+ model: ingest.model,
588
+ disposition: ingest.disposition,
589
+ message: ingest.message,
590
+ detail: ingest.detail,
591
+ };
592
+ }
579
593
  function buildTellaskCallRecord(args) {
580
594
  return {
581
595
  ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
@@ -604,6 +618,7 @@ function buildTellaskResultRecord(result) {
604
618
  callId: result.callId,
605
619
  status: result.status,
606
620
  content: result.content,
621
+ contentItems: result.contentItems,
607
622
  ...(typeof result.originCourse === 'number'
608
623
  ? { originCourse: (0, storage_1.toCallingCourseNumber)(result.originCourse) }
609
624
  : {}),
@@ -666,6 +681,7 @@ function buildTellaskCarryoverRecord(result, genseq) {
666
681
  status: result.status,
667
682
  response: result.response,
668
683
  content: result.content,
684
+ contentItems: result.contentItems,
669
685
  agentId: result.agentId,
670
686
  callId: result.callId,
671
687
  originMemberId: result.originMemberId,
@@ -1090,19 +1106,41 @@ function parseDialogPendingCourseStartPrompt(value) {
1090
1106
  const skipTaskdoc = skipTaskdocRaw;
1091
1107
  const normalizedTellaskReplyDirective = tellaskReplyDirective === null ? undefined : tellaskReplyDirective;
1092
1108
  const normalizedSubdialogReplyTarget = subdialogReplyTarget === null ? undefined : subdialogReplyTarget;
1109
+ if (normalizedSubdialogReplyTarget !== undefined &&
1110
+ normalizedTellaskReplyDirective === undefined) {
1111
+ return null;
1112
+ }
1113
+ if (normalizedTellaskReplyDirective !== undefined &&
1114
+ normalizedSubdialogReplyTarget !== undefined) {
1115
+ return {
1116
+ content: value.content,
1117
+ msgId: value.msgId,
1118
+ grammar: 'markdown',
1119
+ origin: 'runtime',
1120
+ ...(userLanguageCode === undefined ? {} : { userLanguageCode }),
1121
+ ...(skipTaskdoc === undefined ? {} : { skipTaskdoc }),
1122
+ tellaskReplyDirective: normalizedTellaskReplyDirective,
1123
+ subdialogReplyTarget: normalizedSubdialogReplyTarget,
1124
+ };
1125
+ }
1126
+ if (normalizedTellaskReplyDirective !== undefined) {
1127
+ return {
1128
+ content: value.content,
1129
+ msgId: value.msgId,
1130
+ grammar: 'markdown',
1131
+ origin: 'runtime',
1132
+ ...(userLanguageCode === undefined ? {} : { userLanguageCode }),
1133
+ ...(skipTaskdoc === undefined ? {} : { skipTaskdoc }),
1134
+ tellaskReplyDirective: normalizedTellaskReplyDirective,
1135
+ };
1136
+ }
1093
1137
  return {
1094
1138
  content: value.content,
1095
1139
  msgId: value.msgId,
1096
1140
  grammar: 'markdown',
1097
1141
  origin: 'runtime',
1098
1142
  ...(userLanguageCode === undefined ? {} : { userLanguageCode }),
1099
- ...(normalizedTellaskReplyDirective === undefined
1100
- ? {}
1101
- : { tellaskReplyDirective: normalizedTellaskReplyDirective }),
1102
1143
  ...(skipTaskdoc === undefined ? {} : { skipTaskdoc }),
1103
- ...(normalizedSubdialogReplyTarget === undefined
1104
- ? {}
1105
- : { subdialogReplyTarget: normalizedSubdialogReplyTarget }),
1106
1144
  };
1107
1145
  }
1108
1146
  function parseDialogLatestFile(value) {
@@ -1573,6 +1611,10 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
1573
1611
  : (() => {
1574
1612
  throw new Error(`createSubDialog invariant violation: unsupported caller dialog type (${callerDialog.constructor.name})`);
1575
1613
  })();
1614
+ const rootStatus = rootDialog.status;
1615
+ if (rootStatus !== 'running') {
1616
+ throw new Error(`createSubDialog invariant violation: root dialog must be running (rootId=${rootDialog.id.rootId}, status=${rootStatus})`);
1617
+ }
1576
1618
  const subdialogId = new dialog_1.DialogID(generatedId, rootDialog.id.rootId);
1577
1619
  // Prepare subdialog store
1578
1620
  const subdialogStore = new DiskFileDialogStore(subdialogId);
@@ -1647,6 +1689,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
1647
1689
  },
1648
1690
  }));
1649
1691
  // Supdialog clarification context is persisted in subdialog metadata (supdialogCall)
1692
+ const rootSubdialogCount = await DialogPersistence.countAllSubdialogsUnderRoot(rootDialog.id, rootStatus);
1650
1693
  const subdialogCreatedEvt = {
1651
1694
  type: 'subdialog_created_evt',
1652
1695
  dialog: {
@@ -1667,13 +1710,14 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
1667
1710
  callName: options.callName,
1668
1711
  mentionList,
1669
1712
  tellaskContent,
1713
+ rootSubdialogCount,
1670
1714
  subDialogNode: {
1671
1715
  selfId: subdialogId.selfId,
1672
1716
  rootId: subdialogId.rootId,
1673
1717
  supdialogId: callerDialog.id.selfId,
1674
1718
  agentId: targetAgentId,
1675
1719
  taskDocPath: callerDialog.taskDocPath,
1676
- status: 'running',
1720
+ status: rootStatus,
1677
1721
  currentCourse: 1,
1678
1722
  createdAt: nowTs,
1679
1723
  lastModified: nowTs,
@@ -2255,21 +2299,43 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2255
2299
  const model = payload.model.trim();
2256
2300
  const provider = payload.provider.trim();
2257
2301
  const relPath = payload.artifact.relPath.trim();
2302
+ const message = payload.message.trim();
2258
2303
  if (toolCallId === '') {
2259
- log_1.log.error('Protocol violation: toolResultImageIngest called with empty toolCallId; dropping event', new Error('tool_result_image_ingest_empty_tool_call_id'), { dialog, payload });
2260
- return;
2304
+ const error = new Error('tool_result_image_ingest_empty_tool_call_id');
2305
+ log_1.log.error('Protocol violation: toolResultImageIngest called with empty toolCallId', error, {
2306
+ dialog,
2307
+ payload,
2308
+ });
2309
+ throw error;
2261
2310
  }
2262
2311
  if (toolName === '') {
2263
- log_1.log.error('Protocol violation: toolResultImageIngest called with empty toolName; dropping event', new Error('tool_result_image_ingest_empty_tool_name'), { dialog, payload });
2264
- return;
2312
+ const error = new Error('tool_result_image_ingest_empty_tool_name');
2313
+ log_1.log.error('Protocol violation: toolResultImageIngest called with empty toolName', error, {
2314
+ dialog,
2315
+ payload,
2316
+ });
2317
+ throw error;
2265
2318
  }
2266
2319
  if (provider === '' || model === '') {
2267
- log_1.log.error('Protocol violation: toolResultImageIngest missing provider/model; dropping event', new Error('tool_result_image_ingest_missing_provider_or_model'), { dialog, payload });
2268
- return;
2320
+ const error = new Error('tool_result_image_ingest_missing_provider_or_model');
2321
+ log_1.log.error('Protocol violation: toolResultImageIngest missing provider/model', error, {
2322
+ dialog,
2323
+ payload,
2324
+ });
2325
+ throw error;
2269
2326
  }
2270
2327
  if (relPath === '') {
2271
- log_1.log.error('Protocol violation: toolResultImageIngest called with empty artifact relPath; dropping event', new Error('tool_result_image_ingest_empty_rel_path'), { dialog, payload });
2272
- return;
2328
+ const error = new Error('tool_result_image_ingest_empty_rel_path');
2329
+ log_1.log.error('Protocol violation: toolResultImageIngest called with empty artifact relPath', error, { dialog, payload });
2330
+ throw error;
2331
+ }
2332
+ if (message === '') {
2333
+ const error = new Error('tool_result_image_ingest_empty_message');
2334
+ log_1.log.error('Protocol violation: toolResultImageIngest called with empty message', error, {
2335
+ dialog,
2336
+ payload,
2337
+ });
2338
+ throw error;
2273
2339
  }
2274
2340
  const normalizedPayload = {
2275
2341
  toolCallId,
@@ -2283,7 +2349,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2283
2349
  provider,
2284
2350
  model,
2285
2351
  disposition: payload.disposition,
2286
- message: payload.message,
2352
+ message,
2287
2353
  ...(payload.detail !== undefined ? { detail: payload.detail } : {}),
2288
2354
  };
2289
2355
  const record = buildToolResultImageIngestRecord(normalizedPayload, dialog.activeGenSeq);
@@ -2303,6 +2369,69 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2303
2369
  };
2304
2370
  (0, evt_registry_1.postDialogEvent)(dialog, evt);
2305
2371
  }
2372
+ async userImageIngest(dialog, payload) {
2373
+ const course = dialog.activeGenCourseOrUndefined ?? dialog.currentCourse;
2374
+ const msgId = typeof payload.msgId === 'string' && payload.msgId.trim() !== ''
2375
+ ? payload.msgId.trim()
2376
+ : undefined;
2377
+ const model = payload.model.trim();
2378
+ const provider = payload.provider.trim();
2379
+ const relPath = payload.artifact.relPath.trim();
2380
+ const message = payload.message.trim();
2381
+ if (provider === '' || model === '') {
2382
+ const error = new Error('user_image_ingest_missing_provider_or_model');
2383
+ log_1.log.error('Protocol violation: userImageIngest missing provider/model', error, {
2384
+ dialog,
2385
+ payload,
2386
+ });
2387
+ throw error;
2388
+ }
2389
+ if (relPath === '') {
2390
+ const error = new Error('user_image_ingest_empty_rel_path');
2391
+ log_1.log.error('Protocol violation: userImageIngest called with empty artifact relPath', error, {
2392
+ dialog,
2393
+ payload,
2394
+ });
2395
+ throw error;
2396
+ }
2397
+ if (message === '') {
2398
+ const error = new Error('user_image_ingest_empty_message');
2399
+ log_1.log.error('Protocol violation: userImageIngest called with empty message', error, {
2400
+ dialog,
2401
+ payload,
2402
+ });
2403
+ throw error;
2404
+ }
2405
+ const normalizedPayload = {
2406
+ ...(msgId !== undefined ? { msgId } : {}),
2407
+ artifact: {
2408
+ rootId: payload.artifact.rootId,
2409
+ selfId: payload.artifact.selfId,
2410
+ status: payload.artifact.status,
2411
+ relPath,
2412
+ },
2413
+ provider,
2414
+ model,
2415
+ disposition: payload.disposition,
2416
+ message,
2417
+ ...(payload.detail !== undefined ? { detail: payload.detail } : {}),
2418
+ };
2419
+ const record = buildUserImageIngestRecord(normalizedPayload, dialog.activeGenSeq);
2420
+ await this.appendEvent(dialog, course, record);
2421
+ const evt = {
2422
+ type: 'user_image_ingest_evt',
2423
+ course,
2424
+ genseq: dialog.activeGenSeq,
2425
+ ...(msgId !== undefined ? { msgId } : {}),
2426
+ artifact: normalizedPayload.artifact,
2427
+ provider,
2428
+ model,
2429
+ disposition: normalizedPayload.disposition,
2430
+ message: normalizedPayload.message,
2431
+ ...(normalizedPayload.detail !== undefined ? { detail: normalizedPayload.detail } : {}),
2432
+ };
2433
+ (0, evt_registry_1.postDialogEvent)(dialog, evt);
2434
+ }
2306
2435
  /**
2307
2436
  * Emit stream error for current generation lifecycle (uses active genseq when present)
2308
2437
  */
@@ -2351,24 +2480,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2351
2480
  reason: { kind: 'pending_course_start' },
2352
2481
  },
2353
2482
  }),
2354
- pendingCourseStartPrompt: {
2355
- content: newCoursePrompt.content,
2356
- msgId: newCoursePrompt.msgId,
2357
- grammar: 'markdown',
2358
- origin: 'runtime',
2359
- ...(newCoursePrompt.userLanguageCode === undefined
2360
- ? {}
2361
- : { userLanguageCode: newCoursePrompt.userLanguageCode }),
2362
- ...(newCoursePrompt.tellaskReplyDirective === undefined
2363
- ? {}
2364
- : { tellaskReplyDirective: newCoursePrompt.tellaskReplyDirective }),
2365
- ...(newCoursePrompt.skipTaskdoc === undefined
2366
- ? {}
2367
- : { skipTaskdoc: newCoursePrompt.skipTaskdoc }),
2368
- ...(newCoursePrompt.subdialogReplyTarget === undefined
2369
- ? {}
2370
- : { subdialogReplyTarget: newCoursePrompt.subdialogReplyTarget }),
2371
- },
2483
+ pendingCourseStartPrompt: newCoursePrompt,
2372
2484
  },
2373
2485
  }));
2374
2486
  // Post course update event
@@ -2392,7 +2504,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2392
2504
  * Note: The end_of_user_saying_evt is emitted by the driver after user content
2393
2505
  * is rendered and any tellask calls are parsed/executed.
2394
2506
  */
2395
- async persistUserMessage(dialog, content, msgId, grammar, origin, userLanguageCode, q4hAnswerCallId, tellaskReplyDirective) {
2507
+ async persistUserMessage(dialog, content, msgId, grammar, origin, userLanguageCode, q4hAnswerCallId, tellaskReplyDirective, contentItems) {
2396
2508
  const course = dialog.currentCourse;
2397
2509
  // Use activeGenSeqOrUndefined to handle case when genseq hasn't been initialized yet
2398
2510
  const genseq = dialog.activeGenSeqOrUndefined ?? 1;
@@ -2406,6 +2518,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2406
2518
  type: 'human_text_record',
2407
2519
  genseq: genseq,
2408
2520
  content: String(content || ''),
2521
+ contentItems,
2409
2522
  msgId: msgId,
2410
2523
  grammar,
2411
2524
  origin,
@@ -2907,6 +3020,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2907
3020
  genseq,
2908
3021
  msgId: event.msgId,
2909
3022
  content,
3023
+ contentItems: event.contentItems,
2910
3024
  grammar,
2911
3025
  origin,
2912
3026
  userLanguageCode,
@@ -3368,6 +3482,31 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
3368
3482
  }
3369
3483
  break;
3370
3484
  }
3485
+ case 'user_image_ingest_record': {
3486
+ const userImageIngestEvt = {
3487
+ type: 'user_image_ingest_evt',
3488
+ course,
3489
+ genseq: event.genseq,
3490
+ ...(event.msgId !== undefined ? { msgId: event.msgId } : {}),
3491
+ artifact: event.artifact,
3492
+ provider: event.provider,
3493
+ model: event.model,
3494
+ disposition: event.disposition,
3495
+ message: event.message,
3496
+ ...(event.detail !== undefined ? { detail: event.detail } : {}),
3497
+ };
3498
+ if (ws.readyState === 1) {
3499
+ ws.send(JSON.stringify({
3500
+ ...userImageIngestEvt,
3501
+ dialog: {
3502
+ selfId: dialog.id.selfId,
3503
+ rootId: dialog.id.rootId,
3504
+ },
3505
+ timestamp: event.ts,
3506
+ }));
3507
+ }
3508
+ break;
3509
+ }
3371
3510
  case 'tellask_result_record': {
3372
3511
  const base = {
3373
3512
  type: 'tellask_result_evt',
@@ -3409,6 +3548,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
3409
3548
  }
3410
3549
  case 'quest_for_sup_record': {
3411
3550
  // Handle subdialog creation requests
3551
+ const persistedStatus = assertPersistableDialogStatus(status, 'sendEventDirectlyToWebSocket:quest_for_sup_record');
3412
3552
  const subdialogId = new dialog_1.DialogID(event.subDialogId, dialog.id.rootId);
3413
3553
  const metadata = await DialogPersistence.loadDialogMetadata(subdialogId, status);
3414
3554
  if (!metadata || !isSubdialogMetadataFile(metadata)) {
@@ -3422,6 +3562,13 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
3422
3562
  : typeof subMeta.supdialogId === 'string' && subMeta.supdialogId.trim() !== ''
3423
3563
  ? subMeta.supdialogId
3424
3564
  : dialog.id.selfId;
3565
+ const callName = subMeta.assignmentFromSup?.callName;
3566
+ if (callName !== 'tellask' &&
3567
+ callName !== 'tellaskSessionless' &&
3568
+ callName !== 'freshBootsReasoning') {
3569
+ throw new Error(`subdialog_created_evt replay invariant violation: missing assignment callName for ${subdialogId.valueOf()} in ${status}`);
3570
+ }
3571
+ const rootSubdialogCount = await DialogPersistence.countAllSubdialogsUnderRoot(new dialog_1.DialogID(subdialogId.rootId), persistedStatus);
3425
3572
  const subdialogCreatedEvent = {
3426
3573
  type: 'subdialog_created_evt',
3427
3574
  course,
@@ -3439,15 +3586,17 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
3439
3586
  rootId: subdialogId.rootId,
3440
3587
  },
3441
3588
  targetAgentId: subMeta.agentId,
3589
+ callName,
3442
3590
  mentionList: event.mentionList,
3443
3591
  tellaskContent: event.tellaskContent,
3592
+ rootSubdialogCount,
3444
3593
  subDialogNode: {
3445
3594
  selfId: subMeta.id,
3446
3595
  rootId: subdialogId.rootId,
3447
3596
  supdialogId: derivedSupdialogId,
3448
3597
  agentId: subMeta.agentId,
3449
3598
  taskDocPath: subMeta.taskDocPath,
3450
- status,
3599
+ status: persistedStatus,
3451
3600
  currentCourse: subLatest?.currentCourse || 1,
3452
3601
  createdAt: subMeta.createdAt,
3453
3602
  lastModified: subLatest?.lastModified || subMeta.createdAt,
@@ -6194,13 +6343,16 @@ class DialogPersistence {
6194
6343
  * Count subdialogs under a root dialog (no single-layer listing exposed)
6195
6344
  */
6196
6345
  static async countAllSubdialogsUnderRoot(rootDialogId, status = 'running') {
6346
+ if (rootDialogId.rootId !== rootDialogId.selfId) {
6347
+ throw new Error(`countAllSubdialogsUnderRoot invariant violation: expected root dialog id, got ${rootDialogId.valueOf()}`);
6348
+ }
6197
6349
  try {
6198
- const subdialogIds = await this.listSubdialogIdsUnderRoot(rootDialogId, status);
6199
- return subdialogIds.length;
6350
+ const dialogIds = await this.listAllDialogIds(status);
6351
+ return dialogIds.filter((dialogId) => dialogId.rootId === rootDialogId.rootId && dialogId.selfId !== dialogId.rootId).length;
6200
6352
  }
6201
6353
  catch (error) {
6202
6354
  log_1.log.error(`Failed to count all subdialogs under root ${rootDialogId.selfId}:`, error);
6203
- return 0;
6355
+ throw error;
6204
6356
  }
6205
6357
  }
6206
6358
  // === HIERARCHICAL DIALOG RESTORATION ===
@@ -6312,6 +6464,7 @@ class DialogPersistence {
6312
6464
  genseq: event.genseq,
6313
6465
  msgId: event.msgId,
6314
6466
  content: event.content,
6467
+ contentItems: event.contentItems,
6315
6468
  grammar: event.grammar ?? 'markdown',
6316
6469
  });
6317
6470
  break;
@@ -6353,6 +6506,10 @@ class DialogPersistence {
6353
6506
  // UI-only per-generation image projection diagnostics for tool results.
6354
6507
  // Must not be injected into LLM context reconstruction.
6355
6508
  break;
6509
+ case 'user_image_ingest_record':
6510
+ // UI-only per-generation image projection diagnostics for user attachments.
6511
+ // Must not be injected into LLM context reconstruction.
6512
+ break;
6356
6513
  case 'func_result_record': {
6357
6514
  // Convert function result to ChatMessage
6358
6515
  messages.push({
@@ -6374,6 +6531,7 @@ class DialogPersistence {
6374
6531
  callName: event.callName,
6375
6532
  status: event.status,
6376
6533
  content: event.content,
6534
+ contentItems: event.contentItems,
6377
6535
  ...(event.originCourse !== undefined ? { originCourse: event.originCourse } : {}),
6378
6536
  ...(event.calling_genseq !== undefined ? { calling_genseq: event.calling_genseq } : {}),
6379
6537
  call: event.call,
@@ -6405,6 +6563,7 @@ class DialogPersistence {
6405
6563
  role: 'user',
6406
6564
  genseq: event.genseq,
6407
6565
  content: event.content,
6566
+ contentItems: event.contentItems,
6408
6567
  originCourse: event.originCourse,
6409
6568
  carryoverCourse: event.carryoverCourse,
6410
6569
  responderId: event.responderId,
package/dist/priming.js CHANGED
@@ -249,6 +249,7 @@ function isPrimingRecordType(raw) {
249
249
  raw === 'tellask_call_record' ||
250
250
  raw === 'web_search_call_record' ||
251
251
  raw === 'tool_result_image_ingest_record' ||
252
+ raw === 'user_image_ingest_record' ||
252
253
  raw === 'human_text_record' ||
253
254
  raw === 'func_result_record' ||
254
255
  raw === 'tellask_result_record' ||
@@ -279,6 +280,7 @@ function getRecordMarkdownTextField(type) {
279
280
  case 'func_call_record':
280
281
  case 'web_search_call_record':
281
282
  case 'tool_result_image_ingest_record':
283
+ case 'user_image_ingest_record':
282
284
  case 'native_tool_call_record':
283
285
  case 'tellask_call_anchor_record':
284
286
  case 'gen_start_record':
@@ -530,7 +532,7 @@ function normalizeWebSearchAction(value, context) {
530
532
  }
531
533
  throw new Error(`${context}.action.type must be search | open_page | find_in_page`);
532
534
  }
533
- function normalizeFuncResultContentItems(value, context) {
535
+ function normalizeContentItems(value, context) {
534
536
  if (value === undefined)
535
537
  return undefined;
536
538
  if (!Array.isArray(value)) {
@@ -903,6 +905,61 @@ function normalizePrimingRecordFromJson(raw) {
903
905
  const { ts: _unusedTs, ...withoutTs } = record;
904
906
  return withoutTs;
905
907
  }
908
+ case 'user_image_ingest_record': {
909
+ const disposition = raw['disposition'];
910
+ if (disposition !== 'fed_native' &&
911
+ disposition !== 'fed_provider_transformed' &&
912
+ disposition !== 'filtered_provider_unsupported' &&
913
+ disposition !== 'filtered_model_unsupported' &&
914
+ disposition !== 'filtered_mime_unsupported' &&
915
+ disposition !== 'filtered_size_limit' &&
916
+ disposition !== 'filtered_read_failed' &&
917
+ disposition !== 'filtered_missing') {
918
+ throw new Error(`${context}.disposition is invalid`);
919
+ }
920
+ const artifactRaw = raw['artifact'];
921
+ if (!isRecord(artifactRaw)) {
922
+ throw new Error(`${context}.artifact must be an object`);
923
+ }
924
+ const rootId = artifactRaw['rootId'];
925
+ const selfId = artifactRaw['selfId'];
926
+ const status = artifactRaw['status'];
927
+ const relPath = artifactRaw['relPath'];
928
+ if (typeof rootId !== 'string' ||
929
+ typeof selfId !== 'string' ||
930
+ typeof relPath !== 'string' ||
931
+ (status !== 'running' && status !== 'completed' && status !== 'archived')) {
932
+ throw new Error(`${context}.artifact has invalid fields`);
933
+ }
934
+ const detail = raw['detail'];
935
+ if (detail !== undefined && typeof detail !== 'string') {
936
+ throw new Error(`${context}.detail must be a string when provided`);
937
+ }
938
+ const record = {
939
+ ts: '',
940
+ type,
941
+ genseq: expectIntegerField(raw, 'genseq', context),
942
+ artifact: {
943
+ rootId,
944
+ selfId,
945
+ status,
946
+ relPath,
947
+ },
948
+ provider: expectStringField(raw, 'provider', context),
949
+ model: expectStringField(raw, 'model', context),
950
+ disposition,
951
+ message: expectStringField(raw, 'message', context, true),
952
+ };
953
+ const msgId = parseOptionalStringField(raw, 'msgId', context);
954
+ if (msgId !== undefined)
955
+ record.msgId = msgId;
956
+ if (detail !== undefined)
957
+ record.detail = detail;
958
+ if (sourceTag)
959
+ record.sourceTag = sourceTag;
960
+ const { ts: _unusedTs, ...withoutTs } = record;
961
+ return withoutTs;
962
+ }
906
963
  case 'human_text_record': {
907
964
  const grammar = raw['grammar'];
908
965
  if (grammar !== 'markdown') {
@@ -911,6 +968,7 @@ function normalizePrimingRecordFromJson(raw) {
911
968
  const userLanguageCode = parseOptionalLanguageCodeField(raw, 'userLanguageCode', context);
912
969
  const q4hAnswerCallId = parseOptionalStringField(raw, 'q4hAnswerCallId', context);
913
970
  const tellaskReplyDirective = parseTellaskReplyDirective(raw, context);
971
+ const contentItems = normalizeContentItems(raw['contentItems'], context);
914
972
  const record = {
915
973
  ts: '',
916
974
  type,
@@ -925,6 +983,8 @@ function normalizePrimingRecordFromJson(raw) {
925
983
  record.q4hAnswerCallId = q4hAnswerCallId;
926
984
  if (tellaskReplyDirective !== undefined)
927
985
  record.tellaskReplyDirective = tellaskReplyDirective;
986
+ if (contentItems !== undefined)
987
+ record.contentItems = contentItems;
928
988
  if (sourceTag)
929
989
  record.sourceTag = sourceTag;
930
990
  const { ts: _unusedTs, ...withoutTs } = record;
@@ -939,8 +999,8 @@ function normalizePrimingRecordFromJson(raw) {
939
999
  name: expectStringField(raw, 'name', context),
940
1000
  content: expectStringField(raw, 'content', context, true),
941
1001
  };
942
- const contentItems = normalizeFuncResultContentItems(raw['contentItems'], context);
943
- if (contentItems)
1002
+ const contentItems = normalizeContentItems(raw['contentItems'], context);
1003
+ if (contentItems !== undefined)
944
1004
  record.contentItems = contentItems;
945
1005
  if (sourceTag)
946
1006
  record.sourceTag = sourceTag;
@@ -1022,6 +1082,7 @@ function normalizePrimingRecordFromJson(raw) {
1022
1082
  content: expectStringField(raw, 'content', context, true),
1023
1083
  responder,
1024
1084
  };
1085
+ const contentItems = normalizeContentItems(raw['contentItems'], context);
1025
1086
  const record = (() => {
1026
1087
  switch (callName) {
1027
1088
  case 'tellask': {
@@ -1083,6 +1144,8 @@ function normalizePrimingRecordFromJson(raw) {
1083
1144
  if (route !== undefined) {
1084
1145
  record.route = route;
1085
1146
  }
1147
+ if (contentItems !== undefined)
1148
+ record.contentItems = contentItems;
1086
1149
  if (sourceTag)
1087
1150
  record.sourceTag = sourceTag;
1088
1151
  const { ts: _unusedTs, ...withoutTs } = record;
@@ -1220,6 +1283,7 @@ function normalizePrimingRecordFromJson(raw) {
1220
1283
  callId: expectStringField(raw, 'callId', context),
1221
1284
  originMemberId: expectStringField(raw, 'originMemberId', context),
1222
1285
  };
1286
+ const contentItems = normalizeContentItems(raw['contentItems'], context);
1223
1287
  const record = (() => {
1224
1288
  switch (callName) {
1225
1289
  case 'tellask': {
@@ -1281,6 +1345,8 @@ function normalizePrimingRecordFromJson(raw) {
1281
1345
  if (calleeGenseq !== undefined) {
1282
1346
  record.calleeGenseq = (0, storage_1.toCalleeGenerationSeqNumber)(calleeGenseq);
1283
1347
  }
1348
+ if (contentItems !== undefined)
1349
+ record.contentItems = contentItems;
1284
1350
  if (sourceTag)
1285
1351
  record.sourceTag = sourceTag;
1286
1352
  const { ts: _unusedTs, ...withoutTs } = record;
@@ -1756,6 +1822,7 @@ function remapRecordGenseq(record, mapGenseq) {
1756
1822
  case 'tellask_call_record':
1757
1823
  case 'web_search_call_record':
1758
1824
  case 'tool_result_image_ingest_record':
1825
+ case 'user_image_ingest_record':
1759
1826
  case 'native_tool_call_record':
1760
1827
  case 'human_text_record':
1761
1828
  case 'func_result_record':
@@ -1816,6 +1883,7 @@ function addPrimingSourceTag(record) {
1816
1883
  case 'tellask_call_record':
1817
1884
  case 'web_search_call_record':
1818
1885
  case 'tool_result_image_ingest_record':
1886
+ case 'user_image_ingest_record':
1819
1887
  case 'native_tool_call_record':
1820
1888
  case 'human_text_record':
1821
1889
  case 'func_result_record':
@@ -1843,6 +1911,7 @@ function withTimestamp(record, ts) {
1843
1911
  case 'tellask_call_record':
1844
1912
  case 'web_search_call_record':
1845
1913
  case 'tool_result_image_ingest_record':
1914
+ case 'user_image_ingest_record':
1846
1915
  case 'human_text_record':
1847
1916
  case 'func_result_record':
1848
1917
  case 'tellask_result_record':
@@ -1894,6 +1963,7 @@ function primingRecordToChatMessage(record) {
1894
1963
  msgId: record.msgId,
1895
1964
  content: record.content,
1896
1965
  grammar: 'markdown',
1966
+ contentItems: record.contentItems,
1897
1967
  };
1898
1968
  case 'func_call_record':
1899
1969
  return {
@@ -1931,6 +2001,7 @@ function primingRecordToChatMessage(record) {
1931
2001
  callName: record.callName,
1932
2002
  status: record.status,
1933
2003
  content: record.content,
2004
+ contentItems: record.contentItems,
1934
2005
  ...(record.originCourse !== undefined ? { originCourse: record.originCourse } : {}),
1935
2006
  ...(record.calling_genseq !== undefined ? { calling_genseq: record.calling_genseq } : {}),
1936
2007
  call: record.call,
@@ -1970,6 +2041,7 @@ function primingRecordToChatMessage(record) {
1970
2041
  agentId: record.agentId,
1971
2042
  callId: record.callId,
1972
2043
  originMemberId: record.originMemberId,
2044
+ contentItems: record.contentItems,
1973
2045
  ...(record.callName === 'tellask'
1974
2046
  ? {
1975
2047
  mentionList: record.mentionList,
@@ -1986,6 +2058,7 @@ function primingRecordToChatMessage(record) {
1986
2058
  };
1987
2059
  case 'web_search_call_record':
1988
2060
  case 'tool_result_image_ingest_record':
2061
+ case 'user_image_ingest_record':
1989
2062
  case 'native_tool_call_record':
1990
2063
  case 'quest_for_sup_record':
1991
2064
  case 'tellask_call_anchor_record':
@@ -2138,6 +2211,21 @@ function formatScriptMarkdown(args) {
2138
2211
  blockBody = record.message;
2139
2212
  break;
2140
2213
  }
2214
+ case 'user_image_ingest_record': {
2215
+ blockMeta['genseq'] = record.genseq;
2216
+ if (record.msgId !== undefined)
2217
+ blockMeta['msgId'] = record.msgId;
2218
+ blockMeta['artifact'] = record.artifact;
2219
+ blockMeta['provider'] = record.provider;
2220
+ blockMeta['model'] = record.model;
2221
+ blockMeta['disposition'] = record.disposition;
2222
+ if (record.detail !== undefined)
2223
+ blockMeta['detail'] = record.detail;
2224
+ if (record.sourceTag !== undefined)
2225
+ blockMeta['sourceTag'] = record.sourceTag;
2226
+ blockBody = record.message;
2227
+ break;
2228
+ }
2141
2229
  case 'human_text_record': {
2142
2230
  blockMeta['genseq'] = record.genseq;
2143
2231
  blockMeta['msgId'] = record.msgId;
@@ -2149,6 +2237,8 @@ function formatScriptMarkdown(args) {
2149
2237
  blockMeta['q4hAnswerCallId'] = record.q4hAnswerCallId;
2150
2238
  if (record.tellaskReplyDirective !== undefined)
2151
2239
  blockMeta['tellaskReplyDirective'] = record.tellaskReplyDirective;
2240
+ if (record.contentItems !== undefined)
2241
+ blockMeta['contentItems'] = record.contentItems;
2152
2242
  if (record.sourceTag !== undefined)
2153
2243
  blockMeta['sourceTag'] = record.sourceTag;
2154
2244
  blockBody = record.content;
@@ -2222,6 +2312,8 @@ function formatScriptMarkdown(args) {
2222
2312
  blockMeta['calling_genseq'] = record.calling_genseq;
2223
2313
  if (record.route !== undefined)
2224
2314
  blockMeta['route'] = record.route;
2315
+ if (record.contentItems !== undefined)
2316
+ blockMeta['contentItems'] = record.contentItems;
2225
2317
  if (record.sourceTag !== undefined)
2226
2318
  blockMeta['sourceTag'] = record.sourceTag;
2227
2319
  blockBody = record.content;
@@ -2257,6 +2349,8 @@ function formatScriptMarkdown(args) {
2257
2349
  blockMeta['calleeCourse'] = record.calleeCourse;
2258
2350
  if (record.calleeGenseq !== undefined)
2259
2351
  blockMeta['calleeGenseq'] = record.calleeGenseq;
2352
+ if (record.contentItems !== undefined)
2353
+ blockMeta['contentItems'] = record.contentItems;
2260
2354
  if (record.sourceTag !== undefined)
2261
2355
  blockMeta['sourceTag'] = record.sourceTag;
2262
2356
  blockBody = record.response;
@@ -2327,6 +2421,7 @@ function stripTimestampFromRecord(event) {
2327
2421
  case 'tellask_call_record':
2328
2422
  case 'web_search_call_record':
2329
2423
  case 'tool_result_image_ingest_record':
2424
+ case 'user_image_ingest_record':
2330
2425
  case 'native_tool_call_record':
2331
2426
  case 'human_text_record':
2332
2427
  case 'func_result_record':