docagent-cli 0.0.35__py3-none-any.whl

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 (300) hide show
  1. docagent_cli/__init__.py +36 -0
  2. docagent_cli/__main__.py +6 -0
  3. docagent_cli/_ask_user_types.py +90 -0
  4. docagent_cli/_cli_context.py +27 -0
  5. docagent_cli/_debug.py +52 -0
  6. docagent_cli/_env_vars.py +56 -0
  7. docagent_cli/_server_config.py +352 -0
  8. docagent_cli/_session_stats.py +114 -0
  9. docagent_cli/_testing_models.py +144 -0
  10. docagent_cli/_version.py +17 -0
  11. docagent_cli/agent.py +1193 -0
  12. docagent_cli/app.py +4979 -0
  13. docagent_cli/app.tcss +283 -0
  14. docagent_cli/ask_user.py +301 -0
  15. docagent_cli/built_in_skills/__init__.py +5 -0
  16. docagent_cli/built_in_skills/doc-coauthoring/SKILL.md +375 -0
  17. docagent_cli/built_in_skills/docx/LICENSE.txt +30 -0
  18. docagent_cli/built_in_skills/docx/SKILL.md +590 -0
  19. docagent_cli/built_in_skills/docx/scripts/__init__.py +1 -0
  20. docagent_cli/built_in_skills/docx/scripts/accept_changes.py +135 -0
  21. docagent_cli/built_in_skills/docx/scripts/comment.py +318 -0
  22. docagent_cli/built_in_skills/docx/scripts/office/helpers/__init__.py +0 -0
  23. docagent_cli/built_in_skills/docx/scripts/office/helpers/merge_runs.py +199 -0
  24. docagent_cli/built_in_skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  25. docagent_cli/built_in_skills/docx/scripts/office/pack.py +159 -0
  26. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  27. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  28. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  29. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  30. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  31. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  32. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  33. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  34. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  35. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  36. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  37. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  38. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  39. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  40. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  41. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  42. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  43. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  44. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  45. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  46. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  47. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  48. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  49. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  50. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  51. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  52. docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  53. docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  54. docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  55. docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  56. docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  57. docagent_cli/built_in_skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  58. docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  59. docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  60. docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  61. docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  62. docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  63. docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  64. docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  65. docagent_cli/built_in_skills/docx/scripts/office/soffice.py +183 -0
  66. docagent_cli/built_in_skills/docx/scripts/office/unpack.py +132 -0
  67. docagent_cli/built_in_skills/docx/scripts/office/validate.py +111 -0
  68. docagent_cli/built_in_skills/docx/scripts/office/validators/__init__.py +15 -0
  69. docagent_cli/built_in_skills/docx/scripts/office/validators/base.py +847 -0
  70. docagent_cli/built_in_skills/docx/scripts/office/validators/docx.py +446 -0
  71. docagent_cli/built_in_skills/docx/scripts/office/validators/pptx.py +275 -0
  72. docagent_cli/built_in_skills/docx/scripts/office/validators/redlining.py +247 -0
  73. docagent_cli/built_in_skills/docx/scripts/templates/comments.xml +3 -0
  74. docagent_cli/built_in_skills/docx/scripts/templates/commentsExtended.xml +3 -0
  75. docagent_cli/built_in_skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  76. docagent_cli/built_in_skills/docx/scripts/templates/commentsIds.xml +3 -0
  77. docagent_cli/built_in_skills/docx/scripts/templates/people.xml +3 -0
  78. docagent_cli/built_in_skills/pdf/LICENSE.txt +30 -0
  79. docagent_cli/built_in_skills/pdf/SKILL.md +314 -0
  80. docagent_cli/built_in_skills/pdf/forms.md +294 -0
  81. docagent_cli/built_in_skills/pdf/reference.md +612 -0
  82. docagent_cli/built_in_skills/pdf/scripts/check_bounding_boxes.py +65 -0
  83. docagent_cli/built_in_skills/pdf/scripts/check_fillable_fields.py +11 -0
  84. docagent_cli/built_in_skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  85. docagent_cli/built_in_skills/pdf/scripts/create_validation_image.py +37 -0
  86. docagent_cli/built_in_skills/pdf/scripts/extract_form_field_info.py +122 -0
  87. docagent_cli/built_in_skills/pdf/scripts/extract_form_structure.py +115 -0
  88. docagent_cli/built_in_skills/pdf/scripts/fill_fillable_fields.py +98 -0
  89. docagent_cli/built_in_skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  90. docagent_cli/built_in_skills/pptx/LICENSE.txt +30 -0
  91. docagent_cli/built_in_skills/pptx/SKILL.md +232 -0
  92. docagent_cli/built_in_skills/pptx/editing.md +205 -0
  93. docagent_cli/built_in_skills/pptx/pptxgenjs.md +420 -0
  94. docagent_cli/built_in_skills/pptx/scripts/__init__.py +0 -0
  95. docagent_cli/built_in_skills/pptx/scripts/add_slide.py +195 -0
  96. docagent_cli/built_in_skills/pptx/scripts/clean.py +286 -0
  97. docagent_cli/built_in_skills/pptx/scripts/office/helpers/__init__.py +0 -0
  98. docagent_cli/built_in_skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
  99. docagent_cli/built_in_skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  100. docagent_cli/built_in_skills/pptx/scripts/office/pack.py +159 -0
  101. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  102. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  103. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  104. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  105. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  106. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  107. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  108. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  109. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  110. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  111. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  112. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  113. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  114. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  115. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  116. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  117. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  118. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  119. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  120. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  121. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  122. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  123. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  124. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  125. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  126. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  127. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  128. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  129. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  130. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  131. docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  132. docagent_cli/built_in_skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  133. docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  134. docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  135. docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  136. docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  137. docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  138. docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  139. docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  140. docagent_cli/built_in_skills/pptx/scripts/office/soffice.py +183 -0
  141. docagent_cli/built_in_skills/pptx/scripts/office/unpack.py +132 -0
  142. docagent_cli/built_in_skills/pptx/scripts/office/validate.py +111 -0
  143. docagent_cli/built_in_skills/pptx/scripts/office/validators/__init__.py +15 -0
  144. docagent_cli/built_in_skills/pptx/scripts/office/validators/base.py +847 -0
  145. docagent_cli/built_in_skills/pptx/scripts/office/validators/docx.py +446 -0
  146. docagent_cli/built_in_skills/pptx/scripts/office/validators/pptx.py +275 -0
  147. docagent_cli/built_in_skills/pptx/scripts/office/validators/redlining.py +247 -0
  148. docagent_cli/built_in_skills/pptx/scripts/thumbnail.py +289 -0
  149. docagent_cli/built_in_skills/remember/SKILL.md +118 -0
  150. docagent_cli/built_in_skills/skill-creator/LICENSE.txt +202 -0
  151. docagent_cli/built_in_skills/skill-creator/SKILL.md +485 -0
  152. docagent_cli/built_in_skills/skill-creator/agents/analyzer.md +274 -0
  153. docagent_cli/built_in_skills/skill-creator/agents/comparator.md +202 -0
  154. docagent_cli/built_in_skills/skill-creator/agents/grader.md +223 -0
  155. docagent_cli/built_in_skills/skill-creator/assets/eval_review.html +146 -0
  156. docagent_cli/built_in_skills/skill-creator/eval-viewer/generate_review.py +471 -0
  157. docagent_cli/built_in_skills/skill-creator/eval-viewer/viewer.html +1325 -0
  158. docagent_cli/built_in_skills/skill-creator/references/schemas.md +430 -0
  159. docagent_cli/built_in_skills/skill-creator/scripts/__init__.py +0 -0
  160. docagent_cli/built_in_skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  161. docagent_cli/built_in_skills/skill-creator/scripts/generate_report.py +326 -0
  162. docagent_cli/built_in_skills/skill-creator/scripts/improve_description.py +247 -0
  163. docagent_cli/built_in_skills/skill-creator/scripts/package_skill.py +136 -0
  164. docagent_cli/built_in_skills/skill-creator/scripts/quick_validate.py +103 -0
  165. docagent_cli/built_in_skills/skill-creator/scripts/run_eval.py +310 -0
  166. docagent_cli/built_in_skills/skill-creator/scripts/run_loop.py +328 -0
  167. docagent_cli/built_in_skills/skill-creator/scripts/utils.py +47 -0
  168. docagent_cli/built_in_skills/theme-factory/LICENSE.txt +202 -0
  169. docagent_cli/built_in_skills/theme-factory/SKILL.md +59 -0
  170. docagent_cli/built_in_skills/theme-factory/theme-showcase.pdf +0 -0
  171. docagent_cli/built_in_skills/theme-factory/themes/arctic-frost.md +19 -0
  172. docagent_cli/built_in_skills/theme-factory/themes/botanical-garden.md +19 -0
  173. docagent_cli/built_in_skills/theme-factory/themes/desert-rose.md +19 -0
  174. docagent_cli/built_in_skills/theme-factory/themes/forest-canopy.md +19 -0
  175. docagent_cli/built_in_skills/theme-factory/themes/golden-hour.md +19 -0
  176. docagent_cli/built_in_skills/theme-factory/themes/midnight-galaxy.md +19 -0
  177. docagent_cli/built_in_skills/theme-factory/themes/modern-minimalist.md +19 -0
  178. docagent_cli/built_in_skills/theme-factory/themes/ocean-depths.md +19 -0
  179. docagent_cli/built_in_skills/theme-factory/themes/sunset-boulevard.md +19 -0
  180. docagent_cli/built_in_skills/theme-factory/themes/tech-innovation.md +19 -0
  181. docagent_cli/built_in_skills/xlsx/LICENSE.txt +30 -0
  182. docagent_cli/built_in_skills/xlsx/SKILL.md +292 -0
  183. docagent_cli/built_in_skills/xlsx/scripts/office/helpers/__init__.py +0 -0
  184. docagent_cli/built_in_skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  185. docagent_cli/built_in_skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  186. docagent_cli/built_in_skills/xlsx/scripts/office/pack.py +159 -0
  187. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  188. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  189. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  190. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  191. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  192. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  193. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  194. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  195. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  196. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  197. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  198. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  199. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  200. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  201. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  202. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  203. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  204. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  205. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  206. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  207. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  208. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  209. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  210. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  211. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  212. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  213. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  214. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  215. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  216. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  217. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  218. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  219. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  220. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  221. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  222. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  223. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  224. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  225. docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  226. docagent_cli/built_in_skills/xlsx/scripts/office/soffice.py +183 -0
  227. docagent_cli/built_in_skills/xlsx/scripts/office/unpack.py +132 -0
  228. docagent_cli/built_in_skills/xlsx/scripts/office/validate.py +111 -0
  229. docagent_cli/built_in_skills/xlsx/scripts/office/validators/__init__.py +15 -0
  230. docagent_cli/built_in_skills/xlsx/scripts/office/validators/base.py +847 -0
  231. docagent_cli/built_in_skills/xlsx/scripts/office/validators/docx.py +446 -0
  232. docagent_cli/built_in_skills/xlsx/scripts/office/validators/pptx.py +275 -0
  233. docagent_cli/built_in_skills/xlsx/scripts/office/validators/redlining.py +247 -0
  234. docagent_cli/built_in_skills/xlsx/scripts/recalc.py +184 -0
  235. docagent_cli/clipboard.py +128 -0
  236. docagent_cli/command_registry.py +284 -0
  237. docagent_cli/config.py +2418 -0
  238. docagent_cli/configurable_model.py +162 -0
  239. docagent_cli/default_agent_prompt.md +12 -0
  240. docagent_cli/editor.py +142 -0
  241. docagent_cli/file_ops.py +473 -0
  242. docagent_cli/formatting.py +28 -0
  243. docagent_cli/hooks.py +206 -0
  244. docagent_cli/input.py +787 -0
  245. docagent_cli/integrations/__init__.py +1 -0
  246. docagent_cli/integrations/sandbox_factory.py +873 -0
  247. docagent_cli/integrations/sandbox_provider.py +71 -0
  248. docagent_cli/local_context.py +718 -0
  249. docagent_cli/main.py +1641 -0
  250. docagent_cli/mcp_tools.py +707 -0
  251. docagent_cli/mcp_trust.py +168 -0
  252. docagent_cli/media_utils.py +478 -0
  253. docagent_cli/model_config.py +1620 -0
  254. docagent_cli/non_interactive.py +948 -0
  255. docagent_cli/offload.py +371 -0
  256. docagent_cli/output.py +69 -0
  257. docagent_cli/project_utils.py +188 -0
  258. docagent_cli/py.typed +0 -0
  259. docagent_cli/remote_client.py +515 -0
  260. docagent_cli/server.py +520 -0
  261. docagent_cli/server_graph.py +196 -0
  262. docagent_cli/server_manager.py +365 -0
  263. docagent_cli/sessions.py +1262 -0
  264. docagent_cli/skills/__init__.py +18 -0
  265. docagent_cli/skills/commands.py +1090 -0
  266. docagent_cli/skills/load.py +192 -0
  267. docagent_cli/subagents.py +173 -0
  268. docagent_cli/system_prompt.md +247 -0
  269. docagent_cli/textual_adapter.py +1352 -0
  270. docagent_cli/theme.py +842 -0
  271. docagent_cli/token_state.py +31 -0
  272. docagent_cli/tool_display.py +298 -0
  273. docagent_cli/tools.py +236 -0
  274. docagent_cli/ui.py +420 -0
  275. docagent_cli/unicode_security.py +516 -0
  276. docagent_cli/update_check.py +454 -0
  277. docagent_cli/widgets/__init__.py +9 -0
  278. docagent_cli/widgets/_links.py +63 -0
  279. docagent_cli/widgets/approval.py +442 -0
  280. docagent_cli/widgets/ask_user.py +398 -0
  281. docagent_cli/widgets/autocomplete.py +691 -0
  282. docagent_cli/widgets/chat_input.py +1827 -0
  283. docagent_cli/widgets/diff.py +248 -0
  284. docagent_cli/widgets/history.py +188 -0
  285. docagent_cli/widgets/loading.py +177 -0
  286. docagent_cli/widgets/mcp_viewer.py +362 -0
  287. docagent_cli/widgets/message_store.py +675 -0
  288. docagent_cli/widgets/messages.py +1751 -0
  289. docagent_cli/widgets/model_selector.py +964 -0
  290. docagent_cli/widgets/status.py +372 -0
  291. docagent_cli/widgets/theme_selector.py +164 -0
  292. docagent_cli/widgets/thread_selector.py +1905 -0
  293. docagent_cli/widgets/tool_renderers.py +148 -0
  294. docagent_cli/widgets/tool_widgets.py +274 -0
  295. docagent_cli/widgets/welcome.py +339 -0
  296. docagent_cli-0.0.35.data/data/docagent_cli/default_agent_prompt.md +12 -0
  297. docagent_cli-0.0.35.dist-info/METADATA +200 -0
  298. docagent_cli-0.0.35.dist-info/RECORD +300 -0
  299. docagent_cli-0.0.35.dist-info/WHEEL +4 -0
  300. docagent_cli-0.0.35.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,515 @@
1
+ """Remote agent client — thin wrapper around LangGraph's `RemoteGraph`.
2
+
3
+ Delegates streaming, state management, and SSE handling to
4
+ `langgraph.pregel.remote.RemoteGraph`. The only added logic is converting raw
5
+ message dicts from the server into LangChain message objects that the CLI's
6
+ Textual adapter expects.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import logging
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ if TYPE_CHECKING:
15
+ from collections.abc import AsyncIterator, Callable
16
+
17
+ from docagent_cli._debug import configure_debug_logging
18
+
19
+ logger = logging.getLogger(__name__)
20
+ configure_debug_logging(logger)
21
+
22
+
23
+ def _require_thread_id(config: dict[str, Any] | None) -> str:
24
+ """Extract and validate that `thread_id` is present in config.
25
+
26
+ Args:
27
+ config: Config dict with `configurable.thread_id`.
28
+
29
+ Returns:
30
+ The thread ID string.
31
+
32
+ Raises:
33
+ ValueError: If `thread_id` is missing.
34
+ """
35
+ thread_id = (config or {}).get("configurable", {}).get("thread_id")
36
+ if not thread_id:
37
+ msg = "thread_id is required in config.configurable"
38
+ raise ValueError(msg)
39
+ return thread_id
40
+
41
+
42
+ class RemoteAgent:
43
+ """Client that talks to a LangGraph server over HTTP+SSE.
44
+
45
+ Wraps `langgraph.pregel.remote.RemoteGraph` which handles SSE parsing,
46
+ stream-mode negotiation (`messages-tuple`), namespace extraction, and
47
+ interrupt detection. This class adds only message-object conversion for the
48
+ Textual adapter and thread-ID normalization.
49
+ """
50
+
51
+ def __init__(
52
+ self,
53
+ url: str,
54
+ *,
55
+ graph_name: str = "agent",
56
+ api_key: str | None = None,
57
+ headers: dict[str, str] | None = None,
58
+ ) -> None:
59
+ """Initialize the remote agent client.
60
+
61
+ Args:
62
+ url: Base URL of the LangGraph server.
63
+ graph_name: Name of the graph on the server.
64
+ api_key: API key for authenticated deployments.
65
+
66
+ When `None`, `RemoteGraph` auto-reads `LANGGRAPH_API_KEY`,
67
+ `LANGSMITH_API_KEY`, or `LANGCHAIN_API_KEY` from
68
+ the environment.
69
+ headers: Extra HTTP headers to include in every request
70
+ (e.g. bearer tokens, proxy headers).
71
+ """
72
+ self._url = url
73
+ self._graph_name = graph_name
74
+ self._api_key = api_key
75
+ self._headers = headers
76
+ self._graph: Any = None
77
+
78
+ def _get_graph(self) -> Any: # noqa: ANN401
79
+ """Lazily create the `RemoteGraph` instance.
80
+
81
+ Returns:
82
+ A `RemoteGraph` connected to the server.
83
+ """
84
+ if self._graph is None:
85
+ from langgraph.pregel.remote import RemoteGraph
86
+
87
+ self._graph = RemoteGraph(
88
+ self._graph_name,
89
+ url=self._url,
90
+ api_key=self._api_key,
91
+ headers=self._headers,
92
+ )
93
+ return self._graph
94
+
95
+ async def astream(
96
+ self,
97
+ input: dict | Any, # noqa: A002, ANN401
98
+ *,
99
+ stream_mode: list[str] | None = None,
100
+ subgraphs: bool = False,
101
+ config: dict[str, Any] | None = None,
102
+ context: Any | None = None, # noqa: ANN401
103
+ durability: str | None = None, # noqa: ARG002
104
+ ) -> AsyncIterator[tuple[tuple[str, ...], str, Any]]:
105
+ """Stream agent execution, yielding tuples matching Pregel's format.
106
+
107
+ Delegates to `RemoteGraph.astream` (which handles `messages-tuple`
108
+ negotiation, SSE routing, and namespace parsing) and converts the raw
109
+ message dicts into LangChain message objects for the adapter.
110
+
111
+ Args:
112
+ input: The input to send (messages dict or Command).
113
+ stream_mode: Stream modes to request.
114
+ subgraphs: Whether to stream subgraph events.
115
+ config: LangGraph config with `configurable.thread_id`, etc.
116
+ context: Runtime context (e.g. `CLIContext`) forwarded to the
117
+ server via the SDK's `context=` parameter.
118
+ durability: Ignored (server manages durability).
119
+
120
+ Yields:
121
+ 3-tuples of `(namespace, stream_mode, data)`.
122
+
123
+ Raises:
124
+ ValueError: If `thread_id` is not present in `config`.
125
+ """ # noqa: DOC502 — raised by _require_thread_id
126
+ from langchain_core.messages import BaseMessage
127
+
128
+ _require_thread_id(config)
129
+
130
+ graph = self._get_graph()
131
+ config = _prepare_config(config)
132
+ dropped_count = 0
133
+
134
+ async for ns, mode, data in graph.astream(
135
+ input,
136
+ stream_mode=stream_mode or ["messages", "updates"],
137
+ subgraphs=subgraphs,
138
+ config=config,
139
+ context=context,
140
+ ):
141
+ logger.debug("RemoteGraph event mode=%s ns=%s", mode, ns)
142
+
143
+ if mode == "messages":
144
+ msg_dict, meta = data
145
+ if isinstance(msg_dict, dict):
146
+ msg_obj = _convert_message_data(msg_dict)
147
+ if msg_obj is not None:
148
+ yield (ns, "messages", (msg_obj, meta or {}))
149
+ else:
150
+ dropped_count += 1
151
+ elif isinstance(msg_dict, BaseMessage):
152
+ # Already a LangChain message object (pre-deserialized)
153
+ yield (ns, "messages", (msg_dict, meta or {}))
154
+ else:
155
+ logger.warning(
156
+ "Unexpected message data type in stream: %s",
157
+ type(msg_dict).__name__,
158
+ )
159
+ continue
160
+
161
+ if mode == "updates" and isinstance(data, dict):
162
+ update_data = data
163
+ if "__interrupt__" in data:
164
+ update_data = {
165
+ **data,
166
+ "__interrupt__": _convert_interrupts(data["__interrupt__"]),
167
+ }
168
+ yield (ns, "updates", update_data)
169
+ continue
170
+
171
+ yield (ns, mode, data)
172
+
173
+ if dropped_count:
174
+ logger.warning(
175
+ "Dropped %d message(s) during stream due to conversion failures",
176
+ dropped_count,
177
+ )
178
+
179
+ async def aget_state(
180
+ self,
181
+ config: dict[str, Any],
182
+ ) -> Any: # noqa: ANN401
183
+ """Get the current state of a thread.
184
+
185
+ Returns `None` when the thread does not exist on the server (404).
186
+ All other errors (network, auth, 500) are logged at WARNING and
187
+ re-raised so callers can handle them.
188
+
189
+ Args:
190
+ config: Config with `configurable.thread_id`.
191
+
192
+ Returns:
193
+ Thread state object with `values` and `next` attributes, or `None`
194
+ if the thread is not found.
195
+
196
+ Raises:
197
+ ValueError: If `thread_id` is not present in `config`.
198
+ """ # noqa: DOC502 — raised by _require_thread_id
199
+ from langgraph_sdk.errors import NotFoundError
200
+
201
+ thread_id = _require_thread_id(config)
202
+
203
+ graph = self._get_graph()
204
+ try:
205
+ return await graph.aget_state(_prepare_config(config))
206
+ except NotFoundError:
207
+ logger.debug("Thread %s not found on server", thread_id)
208
+ return None
209
+ except Exception:
210
+ logger.warning(
211
+ "Failed to get state for thread %s", thread_id, exc_info=True
212
+ )
213
+ raise
214
+
215
+ async def aupdate_state(
216
+ self,
217
+ config: dict[str, Any],
218
+ values: dict[str, Any],
219
+ ) -> None:
220
+ """Update the state of a thread.
221
+
222
+ Exceptions from the underlying graph (server/network errors) are logged
223
+ at WARNING level and then re-raised so callers can handle them.
224
+
225
+ Args:
226
+ config: Config with `configurable.thread_id`.
227
+ values: State values to update.
228
+
229
+ Raises:
230
+ ValueError: If `thread_id` is not present in `config`.
231
+ """ # noqa: DOC502 — raised by _require_thread_id
232
+ thread_id = _require_thread_id(config)
233
+
234
+ graph = self._get_graph()
235
+ try:
236
+ await graph.aupdate_state(_prepare_config(config), values)
237
+ except Exception:
238
+ logger.warning(
239
+ "Failed to update state for thread %s", thread_id, exc_info=True
240
+ )
241
+ raise
242
+
243
+ async def aensure_thread(self, config: dict[str, Any]) -> None:
244
+ """Ensure the remote thread record exists before mutating state.
245
+
246
+ In the LangGraph dev server, checkpoint persistence and HTTP thread
247
+ registration are separate. After a server restart, a thread may still
248
+ have checkpointed state on disk while `POST /threads/{id}/state`
249
+ returns 404 because the server has not yet materialized that thread in
250
+ its live store.
251
+
252
+ This method performs the idempotent HTTP-side registration with
253
+ `if_exists='do_nothing'` so callers that recovered state from
254
+ persistence can safely follow up with `aupdate_state`.
255
+
256
+ Args:
257
+ config: Config with `configurable.thread_id` and optional metadata.
258
+
259
+ Raises:
260
+ ValueError: If `thread_id` is not present in `config`.
261
+ """ # noqa: DOC502 — raised by _require_thread_id
262
+ _require_thread_id(config)
263
+
264
+ graph = self._get_graph()
265
+ prepared = _prepare_config(config)
266
+ thread_id = prepared["configurable"]["thread_id"]
267
+ metadata = prepared.get("metadata")
268
+ thread_metadata = metadata if isinstance(metadata, dict) else None
269
+
270
+ try:
271
+ client = graph._validate_client()
272
+ await client.threads.create(
273
+ thread_id=thread_id,
274
+ if_exists="do_nothing",
275
+ metadata=thread_metadata,
276
+ graph_id=self._graph_name,
277
+ )
278
+ except Exception:
279
+ logger.warning(
280
+ "Failed to ensure thread %s exists on remote server",
281
+ thread_id,
282
+ exc_info=True,
283
+ )
284
+ raise
285
+
286
+ def with_config(self, config: dict[str, Any]) -> RemoteAgent: # noqa: ARG002
287
+ """Return self (config is passed per-call, not stored).
288
+
289
+ Args:
290
+ config: Ignored.
291
+
292
+ Returns:
293
+ Self.
294
+ """
295
+ return self
296
+
297
+
298
+ # ---------------------------------------------------------------------------
299
+ # Config helpers
300
+ # ---------------------------------------------------------------------------
301
+
302
+
303
+ def _prepare_config(config: dict[str, Any] | None) -> dict[str, Any]:
304
+ """Shallow-copy config so callers' dicts are not mutated.
305
+
306
+ Args:
307
+ config: Raw config dict.
308
+
309
+ Returns:
310
+ A shallow copy of the config.
311
+ """
312
+ config = dict(config or {})
313
+ configurable = dict(config.get("configurable", {}))
314
+ config["configurable"] = configurable
315
+ return config
316
+
317
+
318
+ def _convert_interrupts(raw: Any) -> list[Any]: # noqa: ANN401
319
+ """Convert interrupt dicts from the server into Interrupt objects.
320
+
321
+ Args:
322
+ raw: List of interrupt dicts or Interrupt objects from the server.
323
+
324
+ Returns:
325
+ List of Interrupt objects.
326
+ """
327
+ from langgraph.types import Interrupt
328
+
329
+ if not isinstance(raw, list):
330
+ logger.warning(
331
+ "Expected list for __interrupt__ data, got %s",
332
+ type(raw).__name__,
333
+ )
334
+ return [raw] if raw is not None else []
335
+ results = []
336
+ for item in raw:
337
+ if isinstance(item, Interrupt):
338
+ results.append(item)
339
+ elif isinstance(item, dict) and "value" in item:
340
+ results.append(Interrupt(value=item["value"], id=item.get("id", "")))
341
+ else:
342
+ results.append(item)
343
+ return results
344
+
345
+
346
+ # ---------------------------------------------------------------------------
347
+ # Message conversion — per-type converters with a dispatch table
348
+ # ---------------------------------------------------------------------------
349
+ #
350
+ # Each converter handles one LangChain message type. The dispatch table
351
+ # maps type strings (both short and class-name forms) to the appropriate
352
+ # converter. This keeps each converter focused and makes adding new
353
+ # message types a one-line addition to the table.
354
+ # ---------------------------------------------------------------------------
355
+
356
+
357
+ def _convert_ai_message(data: dict[str, Any]) -> Any: # noqa: ANN401
358
+ """Convert a server AI message dict to an `AIMessageChunk`.
359
+
360
+ Handles the three tool-call representations the server may emit:
361
+
362
+ - `tool_call_chunks`: streaming partial args (string `args`).
363
+ - `tool_calls` with string `args`: legacy streaming format,
364
+ normalized to `tool_call_chunks`.
365
+ - `tool_calls` with dict `args`: fully parsed calls.
366
+
367
+ Args:
368
+ data: Raw message dict from the server.
369
+
370
+ Returns:
371
+ An `AIMessageChunk`, or `None` on construction failure.
372
+ """
373
+ from langchain_core.messages import AIMessageChunk
374
+
375
+ content = data.get("content", "")
376
+ tool_call_chunks = data.get("tool_call_chunks", [])
377
+ tool_calls = data.get("tool_calls", [])
378
+ usage_metadata = data.get("usage_metadata")
379
+ response_metadata = data.get("response_metadata", {})
380
+
381
+ kwargs: dict[str, Any] = {
382
+ "content": content,
383
+ "id": data.get("id"),
384
+ "response_metadata": response_metadata,
385
+ }
386
+
387
+ if tool_call_chunks:
388
+ kwargs["tool_call_chunks"] = [
389
+ {
390
+ "name": tc.get("name"),
391
+ "args": tc.get("args", ""),
392
+ "id": tc.get("id"),
393
+ "index": tc.get("index", i),
394
+ }
395
+ for i, tc in enumerate(tool_call_chunks)
396
+ ]
397
+ elif tool_calls:
398
+ has_str_args = any(isinstance(tc.get("args"), str) for tc in tool_calls)
399
+ if has_str_args:
400
+ kwargs["tool_call_chunks"] = [
401
+ {
402
+ "name": tc.get("name"),
403
+ "args": tc.get("args", ""),
404
+ "id": tc.get("id"),
405
+ "index": i,
406
+ }
407
+ for i, tc in enumerate(tool_calls)
408
+ ]
409
+ else:
410
+ kwargs["tool_calls"] = tool_calls
411
+
412
+ try:
413
+ chunk = AIMessageChunk(**kwargs)
414
+ except (TypeError, ValueError, KeyError):
415
+ logger.warning(
416
+ "Failed to construct AIMessageChunk from server data (id=%s)",
417
+ data.get("id"),
418
+ exc_info=True,
419
+ )
420
+ return None
421
+
422
+ if usage_metadata:
423
+ chunk.usage_metadata = usage_metadata
424
+ return chunk
425
+
426
+
427
+ def _convert_human_message(data: dict[str, Any]) -> Any: # noqa: ANN401
428
+ """Convert a server human message dict to a `HumanMessage`.
429
+
430
+ Args:
431
+ data: Raw message dict from the server.
432
+
433
+ Returns:
434
+ A `HumanMessage`, or `None` on construction failure.
435
+ """
436
+ from langchain_core.messages import HumanMessage
437
+
438
+ try:
439
+ return HumanMessage(
440
+ content=data.get("content", ""),
441
+ id=data.get("id"),
442
+ )
443
+ except (TypeError, ValueError, KeyError):
444
+ logger.warning(
445
+ "Failed to construct HumanMessage from server data (id=%s)",
446
+ data.get("id"),
447
+ exc_info=True,
448
+ )
449
+ return None
450
+
451
+
452
+ def _convert_tool_message(data: dict[str, Any]) -> Any: # noqa: ANN401
453
+ """Convert a server tool message dict to a `ToolMessage`.
454
+
455
+ Args:
456
+ data: Raw message dict from the server.
457
+
458
+ Returns:
459
+ A `ToolMessage`, or `None` on construction failure.
460
+ """
461
+ from langchain_core.messages import ToolMessage
462
+
463
+ try:
464
+ return ToolMessage(
465
+ content=data.get("content", ""),
466
+ tool_call_id=data.get("tool_call_id", ""),
467
+ name=data.get("name", ""),
468
+ id=data.get("id"),
469
+ status=data.get("status", "success"),
470
+ )
471
+ except (TypeError, ValueError, KeyError):
472
+ logger.warning(
473
+ "Failed to construct ToolMessage from server data (id=%s)",
474
+ data.get("id"),
475
+ exc_info=True,
476
+ )
477
+ return None
478
+
479
+
480
+ _MESSAGE_CONVERTERS: dict[str, Callable[[dict[str, Any]], Any]] = {
481
+ "ai": _convert_ai_message,
482
+ "AIMessage": _convert_ai_message,
483
+ "AIMessageChunk": _convert_ai_message,
484
+ "human": _convert_human_message,
485
+ "HumanMessage": _convert_human_message,
486
+ "tool": _convert_tool_message,
487
+ "ToolMessage": _convert_tool_message,
488
+ }
489
+ """Maps server message `type` strings to their converter functions.
490
+
491
+ Both short forms (`'ai'`, `'human'`, `'tool'`) and class-name forms
492
+ (`'AIMessage'`, `'HumanMessage'`, `'ToolMessage'`) are supported so
493
+ the converter works regardless of how the server serializes the type field.
494
+ """
495
+
496
+
497
+ def _convert_message_data(data: dict[str, Any]) -> Any: # noqa: ANN401
498
+ """Convert a server message dict into a LangChain message object.
499
+
500
+ Dispatches to a per-type converter via `_MESSAGE_CONVERTERS`. New message
501
+ types can be supported by adding a converter function and a table entry —
502
+ no changes to this dispatcher are needed.
503
+
504
+ Args:
505
+ data: Message dict from the server.
506
+
507
+ Returns:
508
+ A LangChain message object, or `None` if conversion fails.
509
+ """
510
+ msg_type = data.get("type", "")
511
+ converter = _MESSAGE_CONVERTERS.get(msg_type)
512
+ if converter is not None:
513
+ return converter(data)
514
+ logger.warning("Unknown message type in stream: %s", msg_type)
515
+ return None