fastworkflow 3.2.0__tar.gz → 3.2.1__tar.gz

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 (236) hide show
  1. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/PKG-INFO +1 -1
  2. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/model_pipeline_training.py +63 -22
  3. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/training_report.py +35 -21
  4. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/pyproject.toml +1 -1
  5. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/LICENSE +0 -0
  6. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/README.md +0 -0
  7. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/.DS_Store +0 -0
  8. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/__init__.py +0 -0
  9. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_commands/.gitkeep +0 -0
  10. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/__init__.py +0 -0
  11. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/__init__.py +0 -0
  12. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/abort.py +0 -0
  13. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/you_misunderstood.py +0 -0
  14. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/go_up.py +0 -0
  15. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/reset_context.py +0 -0
  16. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_can_i_do.py +0 -0
  17. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_is_current_context.py +0 -0
  18. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/__init__.py +0 -0
  19. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py +0 -0
  20. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/command_context_model.json +0 -0
  21. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/intent_detection.py +0 -0
  22. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/_workflows/command_metadata_extraction/parameter_extraction.py +0 -0
  23. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/active_workflow.py +0 -0
  24. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/__main__.py +0 -0
  25. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/ast_class_extractor.py +0 -0
  26. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/class_analysis_structures.py +0 -0
  27. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/cli_specification.md +0 -0
  28. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/command_dependency_resolver.py +0 -0
  29. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/command_file_generator.py +0 -0
  30. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/command_file_template.py +0 -0
  31. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/command_import_utils.py +0 -0
  32. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/command_stub_generator.py +0 -0
  33. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/context_folder_generator.py +0 -0
  34. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/context_model_generator.py +0 -0
  35. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/dependency_manager.py +0 -0
  36. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/dir_scanner.py +0 -0
  37. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/documentation_generator.py +0 -0
  38. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/genai_postprocessor.py +0 -0
  39. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/inheritance_block_regenerator.py +0 -0
  40. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/libcst_transformers.py +0 -0
  41. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/navigator_stub_generator.py +0 -0
  42. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/pydantic_model_generator.py +0 -0
  43. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/build/utterance_generator.py +0 -0
  44. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/cache_matching.py +0 -0
  45. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/chat_session.py +0 -0
  46. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/checkpoint_store.py +0 -0
  47. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/cli.py +0 -0
  48. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/command_context_model.py +0 -0
  49. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/command_directory.py +0 -0
  50. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/command_executor.py +0 -0
  51. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/command_interfaces.py +0 -0
  52. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/command_metadata_api.py +0 -0
  53. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/command_routing.py +0 -0
  54. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/conversation_history_io.py +0 -0
  55. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/conversation_labeling.py +0 -0
  56. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/distillation.py +0 -0
  57. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/extended_workflow_example/README.md +0 -0
  58. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/extended_workflow_example/_commands/WorkItem/get_status.py +0 -0
  59. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/extended_workflow_example/_commands/generate_report.py +0 -0
  60. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/extended_workflow_example/_commands/startup.py +0 -0
  61. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/extended_workflow_example/simple_workflow_template.json +0 -0
  62. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/extended_workflow_example/workflow_inheritance_model.json +0 -0
  63. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/fastworkflow.env +0 -0
  64. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/fastworkflow.passwords.env +0 -0
  65. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/hello_world/_commands/README.md +0 -0
  66. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/hello_world/_commands/add_two_numbers.py +0 -0
  67. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/hello_world/_commands/context_inheritance_model.json +0 -0
  68. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/hello_world/application/add_two_numbers.py +0 -0
  69. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_1/_commands/context_inheritance_model.json +0 -0
  70. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_1/_commands/send_message.py +0 -0
  71. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_1/application/send_message.py +0 -0
  72. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_2/_commands/User/_User.py +0 -0
  73. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_2/_commands/User/send_message.py +0 -0
  74. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_2/_commands/context_inheritance_model.json +0 -0
  75. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_2/_commands/startup.py +0 -0
  76. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_2/application/user.py +0 -0
  77. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_3/_commands/PremiumUser/_PremiumUser.py +0 -0
  78. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_3/_commands/PremiumUser/send_priority_message.py +0 -0
  79. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_3/_commands/User/_User.py +0 -0
  80. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_3/_commands/User/send_message.py +0 -0
  81. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_3/_commands/context_inheritance_model.json +0 -0
  82. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_3/_commands/initialize_user.py +0 -0
  83. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_3/application/user.py +0 -0
  84. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/_ChatRoom.py +0 -0
  85. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/add_user.py +0 -0
  86. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/broadcast_message.py +0 -0
  87. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/get_current_user.py +0 -0
  88. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/list_users.py +0 -0
  89. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/set_current_user.py +0 -0
  90. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/_PremiumUser.py +0 -0
  91. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/send_priority_message.py +0 -0
  92. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/User/_User.py +0 -0
  93. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/User/send_message.py +0 -0
  94. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/context_inheritance_model.json +0 -0
  95. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/_commands/set_root_context.py +0 -0
  96. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/application/chatroom.py +0 -0
  97. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/application/user.py +0 -0
  98. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/context_hierarchy_model.json +0 -0
  99. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/messaging_app_4/startup_action.json +0 -0
  100. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/calculate.py +0 -0
  101. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/cancel_pending_order.py +0 -0
  102. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/exchange_delivered_order_items.py +0 -0
  103. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_email.py +0 -0
  104. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_name_zip.py +0 -0
  105. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/get_order_details.py +0 -0
  106. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/get_product_details.py +0 -0
  107. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/get_user_details.py +0 -0
  108. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/list_all_product_types.py +0 -0
  109. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_address.py +0 -0
  110. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_items.py +0 -0
  111. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_payment.py +0 -0
  112. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/modify_user_address.py +0 -0
  113. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/return_delivered_order_items.py +0 -0
  114. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/_commands/transfer_to_human_agents.py +0 -0
  115. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/context_inheritance_model.json +0 -0
  116. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/retail_data/__init__.py +0 -0
  117. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/retail_data/orders.json +0 -0
  118. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/retail_data/products.json +0 -0
  119. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/retail_data/users.json +0 -0
  120. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/calculate.py +0 -0
  121. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/cancel_pending_order.py +0 -0
  122. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/exchange_delivered_order_items.py +0 -0
  123. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_email.py +0 -0
  124. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_name_zip.py +0 -0
  125. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/get_order_details.py +0 -0
  126. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/get_product_details.py +0 -0
  127. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/get_user_details.py +0 -0
  128. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/list_all_product_types.py +0 -0
  129. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_address.py +0 -0
  130. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_items.py +0 -0
  131. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_payment.py +0 -0
  132. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/modify_user_address.py +0 -0
  133. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/return_delivered_order_items.py +0 -0
  134. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/think.py +0 -0
  135. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/tool.py +0 -0
  136. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/tools/transfer_to_human_agents.py +0 -0
  137. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/retail_workflow/workflow_description.txt +0 -0
  138. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/__init__.py +0 -0
  139. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/_WorkItem.py +0 -0
  140. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/add_child_workitem.py +0 -0
  141. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/get_status.py +0 -0
  142. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/go_to_workitem.py +0 -0
  143. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/mark_as_complete.py +0 -0
  144. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_first_child_workitem.py +0 -0
  145. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_last_child_workitem.py +0 -0
  146. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_next_workitem.py +0 -0
  147. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_previous_workitem.py +0 -0
  148. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_all_child_workitems.py +0 -0
  149. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_child_workitem.py +0 -0
  150. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/show_schema.py +0 -0
  151. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/_commands/startup.py +0 -0
  152. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/application/__init__.py +0 -0
  153. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/application/workitem.py +0 -0
  154. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/simple_workflow_template.json +0 -0
  155. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/examples/simple_workflow_template/startup_action.json +0 -0
  156. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/intent_clarification_agent.py +0 -0
  157. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/kvstore.py +0 -0
  158. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/mcp_server.py +0 -0
  159. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/metrics.py +0 -0
  160. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/nlu_labels.py +0 -0
  161. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/observability_store.py +0 -0
  162. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/refine/__main__.py +0 -0
  163. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run/__init__.py +0 -0
  164. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run/__main__.py +0 -0
  165. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_chatbot/__init__.py +0 -0
  166. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_chatbot/launcher.py +0 -0
  167. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_chatbot/server.py +0 -0
  168. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_chatbot/static/index.html +0 -0
  169. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/README.md +0 -0
  170. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/__init__.py +0 -0
  171. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/__main__.py +0 -0
  172. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/checkpoint.py +0 -0
  173. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/jwt_manager.py +0 -0
  174. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/mcp_specific.py +0 -0
  175. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/redoc_2_standalone_html.py +0 -0
  176. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/server_memory.py +0 -0
  177. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/turns.py +0 -0
  178. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/run_fastapi_mcp/utils.py +0 -0
  179. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/serialization_hooks.py +0 -0
  180. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/session_state_store.py +0 -0
  181. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/build-task-benchmarks/SKILL.md +0 -0
  182. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/build-task-benchmarks/reference.md +0 -0
  183. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/debug-workflow-conversations/SKILL.md +0 -0
  184. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/debug-workflow-conversations/reference.md +0 -0
  185. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/declare-parameter-producers/SKILL.md +0 -0
  186. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/design-context-models/SKILL.md +0 -0
  187. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/design-context-models/reference.md +0 -0
  188. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/detect-duplicate-capabilities/SKILL.md +0 -0
  189. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/evaluate-intent-routing/SKILL.md +0 -0
  190. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/integrate-chat-agent/SKILL.md +0 -0
  191. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/integrate-chat-agent/reference.md +0 -0
  192. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/resolve-parameter-values/SKILL.md +0 -0
  193. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/supply-training-personas/SKILL.md +0 -0
  194. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/train-and-publish-models/SKILL.md +0 -0
  195. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/train-and-publish-models/reference.md +0 -0
  196. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/skills_for_coding_fastworkflows/validate-command-parameters/SKILL.md +0 -0
  197. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/state_paths.py +0 -0
  198. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/state_serialization.py +0 -0
  199. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/storage_keys.py +0 -0
  200. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/tracing.py +0 -0
  201. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/__init__.py +0 -0
  202. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/__main__.py +0 -0
  203. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/artifact_versioning.py +0 -0
  204. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/class_balance.py +0 -0
  205. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/determinism.py +0 -0
  206. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/duplicate_detection.py +0 -0
  207. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/generate_synthetic.py +0 -0
  208. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/heldout_evaluation.py +0 -0
  209. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/metrics_persistence.py +0 -0
  210. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/param_example_cache.py +0 -0
  211. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/personas.py +0 -0
  212. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/selective_training.py +0 -0
  213. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/train/utterance_cache.py +0 -0
  214. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/turn.py +0 -0
  215. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/user_message_queues.py +0 -0
  216. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/__init__.py +0 -0
  217. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/chat_adapter.py +0 -0
  218. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/context_utils.py +0 -0
  219. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/dspy_cache_utils.py +0 -0
  220. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/dspy_logger.py +0 -0
  221. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/dspy_utils.py +0 -0
  222. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/env.py +0 -0
  223. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/fuzzy_match.py +0 -0
  224. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/generate_param_examples.py +0 -0
  225. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/insights_loader.py +0 -0
  226. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/logging.py +0 -0
  227. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/parameterize_func_decorator.py +0 -0
  228. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/pydantic_model_2_dspy_signature_class.py +0 -0
  229. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/python_utils.py +0 -0
  230. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/react.py +0 -0
  231. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/signatures.py +0 -0
  232. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/utils/startup_progress.py +0 -0
  233. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/workflow.py +0 -0
  234. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/workflow_agent.py +0 -0
  235. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/workflow_execution_context.py +0 -0
  236. {fastworkflow-3.2.0 → fastworkflow-3.2.1}/fastworkflow/workflow_inheritance_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastworkflow
3
- Version: 3.2.0
3
+ Version: 3.2.1
4
4
  Summary: A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX
5
5
  License: Apache-2.0
6
6
  Keywords: fastworkflow,ai,workflow,llm,openai
@@ -1,5 +1,5 @@
1
1
  import os
2
- from typing import Callable, ClassVar, Optional
2
+ from typing import Callable, ClassVar, Iterable, Optional
3
3
  from transformers import AutoTokenizer, AutoModel, AutoModelForSequenceClassification
4
4
  from torch.optim import AdamW
5
5
  from sklearn.decomposition import PCA
@@ -55,50 +55,91 @@ class TrainingDataError(ValueError):
55
55
  """Raised before model fitting when a label cannot be trained and evaluated."""
56
56
 
57
57
 
58
+ def _name_labels(
59
+ labels: Iterable[int],
60
+ decode_label: Optional[Callable[[int], str]] = None,
61
+ ) -> str:
62
+ """Render labels as a plain comma-separated list, sorted for a stable message.
63
+
64
+ Deliberately not a list repr. `decode_label` returns a numpy string, so a repr
65
+ renders as `[np.str_('cmd')]`, and the report prints through a rich console that
66
+ reads a bracketed run with no spaces as console markup and deletes it - which
67
+ silently dropped the one detail these messages exist to carry.
68
+ """
69
+ names = sorted(
70
+ str(decode_label(label)) if decode_label else str(label) for label in labels
71
+ )
72
+ return ", ".join(names)
73
+
74
+
58
75
  def split_training_data(
59
76
  dataset: list[tuple[str, int]],
60
77
  decode_label: Optional[Callable[[int], str]] = None,
61
78
  ) -> tuple[list[tuple[str, int]], list[tuple[str, int]]]:
62
79
  """Create a deterministic, class-aware train/evaluation split.
63
80
 
64
- Every label must contribute at least one row to both sets. This replaces the
65
- unstratified 25% split that could randomly put every row for a small class in the
66
- evaluation set, leaving the classifier unable to learn that command.
81
+ Every label that *can* appear on both sides does. A label with fewer rows than
82
+ `heldout_evaluation.MIN_TRAINING_ROWS_PER_LABEL` cannot be stratified, so it trains
83
+ and goes unmeasured rather than failing the run: that is already what the persona
84
+ holdout does when its own split would starve a label, and aborting here instead
85
+ spends the entire LLM and GPU budget only to publish nothing - over a label whose
86
+ evaluation coverage the developer may never have wanted. Being unmeasured is
87
+ reported, not fatal.
88
+
89
+ Splitting still replaces the unstratified 25% split that could randomly put every
90
+ row for a small class in the evaluation set, leaving the classifier unable to learn
91
+ that command.
67
92
 
68
93
  ``decode_label`` turns the encoded label back into its command name for the
69
- error message. Without it the abort names labels the developer cannot map to
70
- commands without reverse-engineering the LabelEncoder, which is the state
71
- this argument exists to prevent.
94
+ warning and error messages. Without it those messages name labels the developer
95
+ cannot map to commands without reverse-engineering the LabelEncoder, which is the
96
+ state this argument exists to prevent.
72
97
  """
73
98
  label_counts = Counter(label for _, label in dataset)
74
- starved = sorted(
99
+ unmeasurable = {
75
100
  label
76
101
  for label, count in label_counts.items()
77
102
  if count < heldout_evaluation.MIN_TRAINING_ROWS_PER_LABEL
78
- )
79
- if starved:
80
- named = [decode_label(label) for label in starved] if decode_label else starved
81
- raise TrainingDataError(
82
- f"Each intent label needs at least "
83
- f"{heldout_evaluation.MIN_TRAINING_ROWS_PER_LABEL} rows (one for training "
84
- f"and one for evaluation); labels with fewer rows: {named}"
103
+ }
104
+ # Partition rather than filter, so the unmeasurable rows still reach the model. They
105
+ # are appended in dataset order to keep the split reproducible.
106
+ splittable = [row for row in dataset if row[1] not in unmeasurable]
107
+ unmeasured_rows = [row for row in dataset if row[1] in unmeasurable]
108
+ if unmeasurable:
109
+ logger.warning(
110
+ f"{len(unmeasurable)} intent label(s) have fewer than "
111
+ f"{heldout_evaluation.MIN_TRAINING_ROWS_PER_LABEL} rows, so they train "
112
+ f"without an evaluation row and are unmeasured on the routing axis: "
113
+ f"{_name_labels(unmeasurable, decode_label)}"
85
114
  )
86
115
 
116
+ label_counts = Counter(label for _, label in splittable)
87
117
  label_count = len(label_counts)
88
- test_size = max((len(dataset) + 3) // 4, label_count)
89
- if len(dataset) - test_size < label_count:
118
+ if not label_count:
119
+ # Nothing can be measured, so there is no evaluation set to tune a threshold
120
+ # against and no score to publish. That is a different failure from one thin
121
+ # label and stays fatal.
122
+ raise TrainingDataError(
123
+ f"No intent label has the "
124
+ f"{heldout_evaluation.MIN_TRAINING_ROWS_PER_LABEL} rows needed to form an "
125
+ f"evaluation set; every label is below the floor: "
126
+ f"{_name_labels(unmeasurable, decode_label)}"
127
+ )
128
+
129
+ test_size = max((len(splittable) + 3) // 4, label_count)
130
+ if len(splittable) - test_size < label_count:
90
131
  raise TrainingDataError(
91
- f"Cannot split {len(dataset)} rows across {label_count} labels while keeping "
92
- "at least one row per label in both training and evaluation sets."
132
+ f"Cannot split {len(splittable)} rows across {label_count} labels while "
133
+ "keeping at least one row per label in both training and evaluation sets."
93
134
  )
94
135
 
95
136
  train_data, test_data = train_test_split(
96
- dataset,
137
+ splittable,
97
138
  test_size=test_size,
98
139
  random_state=42,
99
- stratify=[label for _, label in dataset],
140
+ stratify=[label for _, label in splittable],
100
141
  )
101
- return list(train_data), list(test_data)
142
+ return list(train_data) + unmeasured_rows, list(test_data)
102
143
 
103
144
 
104
145
  def save_label_encoder(filepath):
@@ -39,10 +39,11 @@ available at the end of a training run and can be retained with its artifacts.
39
39
 
40
40
  The two floors, and how much to trust them
41
41
  ------------------------------------------
42
- See `DEFAULT_MIN_TRAINING_ROWS` and `DEFAULT_MIN_SEED_UTTERANCES`. One is derived
43
- from a structural property of the training code; the other is an observation from
44
- a single workflow. They are labelled differently in the output on purpose, and
45
- only the structural floor can prevent publication.
42
+ See `DEFAULT_MIN_TRAINING_ROWS` and `DEFAULT_MIN_SEED_UTTERANCES`. The row floor is
43
+ derived from the minimum needed to both train and evaluate a label; falling below it
44
+ means that label trains without evaluation coverage. The seed floor is an observation
45
+ from a single workflow. Both are advisory because neither makes the trained label
46
+ unusable.
46
47
 
47
48
  `TrainingReport.has_blocking_problems` rejects structurally unusable data before
48
49
  publication; fallback and seed-count findings remain advisory.
@@ -148,14 +149,17 @@ class RowStatus(str, Enum):
148
149
  #: Generation degraded (R3a fallback). The command trained on its command name
149
150
  #: plus hand-written seeds plus whatever arrived before the failure.
150
151
  FELL_BACK = "fell_back"
151
- #: Fewer rows than the floor. May or may not have fallen back.
152
+ #: Fewer rows than the train-and-evaluate floor. The rows still train, but the
153
+ #: label has no evaluation coverage and is therefore reported as unmeasured.
152
154
  BELOW_FLOOR = "below_floor"
153
155
  #: The command has `Signature.Input`, but its generator returned no rows in at
154
156
  #: least one context. This is an explicit trainer skip, not missing provenance.
155
157
  NO_UTTERANCES = "no_utterances"
156
- #: The command should have generated utterances but has no provenance record.
157
- #: Either it was never reached (a training run that died part-way) or provenance
158
- #: was lost. Distinct from EXCLUDED, which is by design.
158
+ #: The command has no provenance record AND no context provenance showing it was
159
+ #: trained: either it was never reached (a training run that died part-way) or
160
+ #: provenance was lost. Distinct from EXCLUDED, which is by design, and from a
161
+ #: command that supplies hand-written utterances without calling the generator -
162
+ #: that one has nothing to record and is judged on its row count.
159
163
  MISSING = "missing"
160
164
  #: No `Signature.Input`, so `model_pipeline_training._requires_utterances` returns
161
165
  #: False and the command is deliberately not an intent-detection label at all. It
@@ -183,13 +187,12 @@ _STATUS_SEVERITY: dict[RowStatus, int] = {
183
187
  RowStatus.OK: 7,
184
188
  }
185
189
 
186
- #: Statuses that make a training dataset structurally unusable. EXCLUDED and
187
- #: THIN_SEEDS are deliberately absent: the first is a design choice, the second rests
188
- #: on one workflow's curve and is too weak a basis for rejecting a run. FELL_BACK is
189
- #: reported loudly but does not fail when enough rows remain.
190
+ #: Statuses that make a training dataset structurally unusable. EXCLUDED is a design
191
+ #: choice. THIN_SEEDS and BELOW_FLOOR are advisory: the former rests on one workflow's
192
+ #: curve, while the latter means the label trained but could not also contribute an
193
+ #: evaluation row. FELL_BACK is reported loudly but does not fail when rows remain.
190
194
  BLOCKING_STATUSES: frozenset[RowStatus] = frozenset(
191
195
  {
192
- RowStatus.BELOW_FLOOR,
193
196
  RowStatus.NO_UTTERANCES,
194
197
  RowStatus.MISSING,
195
198
  }
@@ -671,6 +674,9 @@ def _classify_status(
671
674
  put a non-command at the top of a list of broken commands. A reserved label that
672
675
  genuinely fell back is still surfaced, because a degraded escalation class
673
676
  degrades the workflow like anything else.
677
+
678
+ Absent generation provenance is only a defect when nothing else shows the command
679
+ trained; see the comment on the `has_provenance` branch below.
674
680
  """
675
681
  if kind is CommandKind.RESERVED and not fell_back:
676
682
  return RowStatus.NOT_APPLICABLE
@@ -690,7 +696,17 @@ def _classify_status(
690
696
  if not has_provenance:
691
697
  if trains_as_label is False:
692
698
  return RowStatus.EXCLUDED
693
- return RowStatus.MISSING
699
+ if not has_included_context:
700
+ # No generation record AND no sign the trainer ever reached this command:
701
+ # the run died part-way or provenance was lost. That is what MISSING means.
702
+ return RowStatus.MISSING
703
+ # An `UtteranceProvenance` record describes *generation*, and only
704
+ # `generate_diverse_utterances` writes one. A command whose `generate_utterances`
705
+ # returns hand-written rows directly never calls the generator, so it has nothing
706
+ # to record - exactly the reasoning `NOT_APPLICABLE` already applies to reserved
707
+ # labels. The trainer's own context provenance proves this command trained, and
708
+ # carries the row counts, so judge it on the floor like anything else instead of
709
+ # blocking publication over a record that was never owed.
694
710
  if rows_by_context and any(
695
711
  context_rows < min_rows for context_rows in rows_by_context.values()
696
712
  ):
@@ -1063,11 +1079,11 @@ def format_report(report: TrainingReport) -> str:
1063
1079
  f" BELOW ROW FLOOR ({len(below_floor)}) — fewer than {report.min_rows} rows."
1064
1080
  )
1065
1081
  lines.append(
1066
- " The class-aware split needs at least one row for training and one for "
1067
- "evaluation."
1082
+ " These labels trained, but the class-aware split could not also reserve "
1083
+ "an evaluation row."
1068
1084
  )
1069
1085
  lines.append(
1070
- " A label below that floor cannot be learned and evaluated in the same run."
1086
+ " They are unmeasured on the routing axis; this does not block publication."
1071
1087
  )
1072
1088
  lines.extend(_detail_lines(below_floor, width))
1073
1089
 
@@ -1212,7 +1228,7 @@ def format_report(report: TrainingReport) -> str:
1212
1228
 
1213
1229
  lines.append("")
1214
1230
  lines.append(
1215
- f" Floors: rows >= {report.min_rows} (structural — one train and one "
1231
+ f" Floors: rows >= {report.min_rows} (evaluation coverage — one train and one "
1216
1232
  f"evaluation row per label),"
1217
1233
  )
1218
1234
  lines.append(
@@ -1220,9 +1236,7 @@ def format_report(report: TrainingReport) -> str:
1220
1236
  f"one workflow's"
1221
1237
  )
1222
1238
  lines.append(" observation). These are trainer policy, not workflow configuration.")
1223
- lines.append(
1224
- " Structural failures stop publication; advisory findings do not."
1225
- )
1239
+ lines.append(" Missing or empty training data stops publication; advisory findings do not.")
1226
1240
  lines.append(rule)
1227
1241
  return "\n".join(lines)
1228
1242
 
@@ -9,7 +9,7 @@ repository = "https://github.com/radiantlogicinc/fastworkflow"
9
9
 
10
10
  [tool.poetry]
11
11
  name = "fastworkflow"
12
- version = "3.2.0"
12
+ version = "3.2.1"
13
13
  description = "A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX"
14
14
  authors = ["Dhar Rawal <drawal@radiantlogic.com>"]
15
15
  license = "Apache-2.0"
File without changes
File without changes