flare-kernel 0.2.3__tar.gz → 0.2.4__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 (409) hide show
  1. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/PKG-INFO +1 -1
  2. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/pyproject.toml +1 -1
  3. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/kernel_contract.py +2 -1
  4. flare_kernel-0.2.4/src/flare_kernel/router/analysis_canvas_payload.py +74 -0
  5. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_payload.py +38 -1
  6. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/completion_response_builder.py +93 -2
  7. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/guided_completion.py +38 -1
  8. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority_hydration.py +7 -0
  9. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel.py +24 -0
  10. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/endpoint.py +1 -0
  11. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers.py +2 -0
  12. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_sourcing.py +7 -0
  13. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_turn_context.py +18 -1
  14. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_turn_context_wrapper.py +5 -0
  15. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow.py +15 -0
  16. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_action.py +15 -0
  17. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/mode_resolution.py +2 -1
  18. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/payload_enrichment.py +4 -0
  19. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/prompting.py +82 -2
  20. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_projection.py +3 -0
  21. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_finalize.py +47 -0
  22. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_post_completion.py +1 -0
  23. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/turn_context_builder.py +18 -1
  24. flare_kernel-0.2.4/src/flare_kernel/router/turn_context_sourcing_preview.py +77 -0
  25. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/infrastructure.py +40 -38
  26. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/analysis_router_runtime.py +1 -1
  27. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration.py +90 -20
  28. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan.py +128 -0
  29. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/sourcing_search_runtime.py +28 -0
  30. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_kernel_runtime.py +41 -0
  31. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/PKG-INFO +1 -1
  32. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/SOURCES.txt +6 -0
  33. flare_kernel-0.2.4/tests/test_analysis_canvas_payload.py +54 -0
  34. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_analysis_route_projection.py +4 -4
  35. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_basics.py +1 -0
  36. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_payload.py +60 -3
  37. flare_kernel-0.2.4/tests/test_command_resolution_analysis_mode.py +28 -0
  38. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_completion_response_builder.py +74 -0
  39. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_guided_completion.py +40 -0
  40. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority_hydration.py +24 -0
  41. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_resolution.py +25 -0
  42. flare_kernel-0.2.4/tests/test_kernel_endpoint_handlers_sourcing.py +53 -0
  43. flare_kernel-0.2.4/tests/test_kernel_facade_turn_context.py +113 -0
  44. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_mode_resolution.py +3 -3
  45. flare_kernel-0.2.4/tests/test_prompting_analysis_instruction.py +50 -0
  46. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_finalize.py +7 -1
  47. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_turn_context_builder.py +54 -0
  48. flare_kernel-0.2.3/tests/test_kernel_facade_turn_context.py +0 -60
  49. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/README.md +0 -0
  50. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/setup.cfg +0 -0
  51. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/__init__.py +0 -0
  52. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/app.py +0 -0
  53. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/__init__.py +0 -0
  54. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/context.py +0 -0
  55. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/mode.py +0 -0
  56. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/project_contract.py +0 -0
  57. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/session_contract.py +0 -0
  58. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/main.py +0 -0
  59. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/project_store.py +0 -0
  60. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/__init__.py +0 -0
  61. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/action_payload.py +0 -0
  62. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/api_errors.py +0 -0
  63. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/__init__.py +0 -0
  64. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_analysis.py +0 -0
  65. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_builder.py +0 -0
  66. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_checkpoint.py +0 -0
  67. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context.py +0 -0
  68. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context_analysis.py +0 -0
  69. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context_inputs.py +0 -0
  70. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context_session.py +0 -0
  71. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_flow.py +0 -0
  72. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_projection.py +0 -0
  73. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/completion_selection.py +0 -0
  74. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/endpoint_context.py +0 -0
  75. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/__init__.py +0 -0
  76. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_amount_quantity.py +0 -0
  77. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_answer.py +0 -0
  78. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority.py +0 -0
  79. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority_checkpoint.py +0 -0
  80. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority_session.py +0 -0
  81. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_canonicalization.py +0 -0
  82. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_clarification.py +0 -0
  83. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_decision_rules.py +0 -0
  84. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_deployment_delivery.py +0 -0
  85. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_entry_policy.py +0 -0
  86. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_extraction.py +0 -0
  87. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_extraction_extractors.py +0 -0
  88. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_extraction_merge.py +0 -0
  89. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection.py +0 -0
  90. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection_entity.py +0 -0
  91. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection_payload.py +0 -0
  92. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection_source.py +0 -0
  93. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_scope.py +0 -0
  94. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_confirmed_updates.py +0 -0
  95. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_flags.py +0 -0
  96. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_followup.py +0 -0
  97. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_followup_work_item.py +0 -0
  98. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_open_fields.py +0 -0
  99. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_status.py +0 -0
  100. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_summary.py +0 -0
  101. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_inputs.py +0 -0
  102. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_node_state.py +0 -0
  103. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_numeric.py +0 -0
  104. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_payload_updates.py +0 -0
  105. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_readiness.py +0 -0
  106. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_state_persistence.py +0 -0
  107. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status.py +0 -0
  108. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_chooser_stage.py +0 -0
  109. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_guided_session.py +0 -0
  110. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_projection.py +0 -0
  111. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_schema.py +0 -0
  112. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_workflow_checkpoint.py +0 -0
  113. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/__init__.py +0 -0
  114. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/compat_aliases.py +0 -0
  115. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_classifier_utils.py +0 -0
  116. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_escalation_override.py +0 -0
  117. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_escalation_pipeline.py +0 -0
  118. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_escalation_signal.py +0 -0
  119. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_retrieval.py +0 -0
  120. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_routing.py +0 -0
  121. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/session_intent.py +0 -0
  122. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/session_intent_fields.py +0 -0
  123. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/session_intent_small_talk.py +0 -0
  124. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports.py +0 -0
  125. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/__init__.py +0 -0
  126. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/constants.py +0 -0
  127. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/domain.py +0 -0
  128. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/facade.py +0 -0
  129. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/router_flow.py +0 -0
  130. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/runtime.py +0 -0
  131. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants.py +0 -0
  132. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants_intake.py +0 -0
  133. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants_intent.py +0 -0
  134. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants_patch.py +0 -0
  135. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_health.py +0 -0
  136. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_knowledge.py +0 -0
  137. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_turn.py +0 -0
  138. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_canonical_state.py +0 -0
  139. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_canonical_wrapper.py +0 -0
  140. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_dependency_resolution.py +0 -0
  141. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_helpers.py +0 -0
  142. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_orchestration.py +0 -0
  143. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_orchestration_wrappers.py +0 -0
  144. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_payload_enrichment.py +0 -0
  145. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_payload_wrapper.py +0 -0
  146. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_utils.py +0 -0
  147. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_intent_query_flow.py +0 -0
  148. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_mode_flow.py +0 -0
  149. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intake.py +0 -0
  150. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intent.py +0 -0
  151. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intent_query.py +0 -0
  152. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intent_signal.py +0 -0
  153. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_action.py +0 -0
  154. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_execution.py +0 -0
  155. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_run.py +0 -0
  156. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_stream.py +0 -0
  157. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_session_intent_flow.py +0 -0
  158. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/mode_switch.py +0 -0
  159. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/next_actions_guard.py +0 -0
  160. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/__init__.py +0 -0
  161. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_checkpoint_state.py +0 -0
  162. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_followup_state.py +0 -0
  163. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_builder.py +0 -0
  164. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_context.py +0 -0
  165. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_context_helpers.py +0 -0
  166. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_decision.py +0 -0
  167. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_projection.py +0 -0
  168. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_result.py +0 -0
  169. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_runtime_state.py +0 -0
  170. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state.py +0 -0
  171. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_context.py +0 -0
  172. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_decision.py +0 -0
  173. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_entry.py +0 -0
  174. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_flow.py +0 -0
  175. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_followup.py +0 -0
  176. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_intent.py +0 -0
  177. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_node.py +0 -0
  178. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_payload.py +0 -0
  179. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_unpack.py +0 -0
  180. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_trace.py +0 -0
  181. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_trace_projection.py +0 -0
  182. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_trace_steps.py +0 -0
  183. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/patch_contract.py +0 -0
  184. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/project_api.py +0 -0
  185. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/request_identity.py +0 -0
  186. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/request_intent_resolution.py +0 -0
  187. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/__init__.py +0 -0
  188. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_aliases.py +0 -0
  189. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_field_queries.py +0 -0
  190. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_query_builder.py +0 -0
  191. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_search.py +0 -0
  192. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/session_api.py +0 -0
  193. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/source_library.py +0 -0
  194. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/__init__.py +0 -0
  195. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_completion.py +0 -0
  196. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_phase.py +0 -0
  197. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_phase_timing.py +0 -0
  198. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_prologue.py +0 -0
  199. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_event_emitter.py +0 -0
  200. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_intake_phase.py +0 -0
  201. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_mode_event_payload.py +0 -0
  202. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_mode_events.py +0 -0
  203. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_bootstrap.py +0 -0
  204. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_builder.py +0 -0
  205. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_builder_transport.py +0 -0
  206. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_phases.py +0 -0
  207. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_phases_mode_runtime.py +0 -0
  208. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_phases_post_intake.py +0 -0
  209. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_runtime.py +0 -0
  210. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_retrieval_phase.py +0 -0
  211. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_runtime_steps.py +0 -0
  212. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/text_safety.py +0 -0
  213. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/__init__.py +0 -0
  214. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/domain/__init__.py +0 -0
  215. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/domain/domain_pack_loader.py +0 -0
  216. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/domain/profile_resolution.py +0 -0
  217. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/execution/__init__.py +0 -0
  218. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/execution/agent_runtime.py +0 -0
  219. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/execution/skill_runtime.py +0 -0
  220. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/__init__.py +0 -0
  221. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/logging.py +0 -0
  222. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/source_library_persistence.py +0 -0
  223. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/source_text_extractor.py +0 -0
  224. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/sourcing_persistence.py +0 -0
  225. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/sourcing_provider.py +0 -0
  226. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/trace.py +0 -0
  227. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/__init__.py +0 -0
  228. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/__init__.py +0 -0
  229. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/decision.py +0 -0
  230. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/lexicon.py +0 -0
  231. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/preprocessing.py +0 -0
  232. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/signals.py +0 -0
  233. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation_classifier.py +0 -0
  234. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/llm/__init__.py +0 -0
  235. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/llm/llm_provider.py +0 -0
  236. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/llm/model_router.py +0 -0
  237. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/__init__.py +0 -0
  238. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/canonical_mode_runtime.py +0 -0
  239. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/canvas_sourcing_contract.py +0 -0
  240. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/decision_engine.py +0 -0
  241. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/decision_engine_mode_flags.py +0 -0
  242. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_stage.py +0 -0
  243. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement.py +0 -0
  244. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_context.py +0 -0
  245. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_helpers.py +0 -0
  246. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_payloads.py +0 -0
  247. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_sourcing.py +0 -0
  248. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_sourcing_stage.py +0 -0
  249. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_runtime.py +0 -0
  250. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/source_ingestion_runtime.py +0 -0
  251. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/source_ingestion_runtime_artifacts.py +0 -0
  252. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/sourcing_event_payloads.py +0 -0
  253. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/ssot_mode_runtime.py +0 -0
  254. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/__init__.py +0 -0
  255. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning.py +0 -0
  256. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_branching.py +0 -0
  257. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_branching_policy.py +0 -0
  258. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_context.py +0 -0
  259. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_hypothesis.py +0 -0
  260. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_planning.py +0 -0
  261. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_priority.py +0 -0
  262. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_question_extraction.py +0 -0
  263. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_readiness.py +0 -0
  264. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_shared.py +0 -0
  265. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/__init__.py +0 -0
  266. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/checkpoint_manager.py +0 -0
  267. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/checkpoint_store_sql.py +0 -0
  268. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/intake_session_store.py +0 -0
  269. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/intake_session_store_query.py +0 -0
  270. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/models.py +0 -0
  271. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_checkpoint_manager.py +0 -0
  272. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_intake_reasoning.py +0 -0
  273. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_intake_reasoning_split.py +0 -0
  274. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_intake_session_store.py +0 -0
  275. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_mode_runtime_fallback.py +0 -0
  276. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/session_store.py +0 -0
  277. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/dependency_links.txt +0 -0
  278. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/requires.txt +0 -0
  279. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/top_level.txt +0 -0
  280. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_action_payload.py +0 -0
  281. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_builder_split_modules.py +0 -0
  282. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_business_hardcode_guard.py +0 -0
  283. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_context_analysis.py +0 -0
  284. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_context_inputs.py +0 -0
  285. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_context_session.py +0 -0
  286. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_flow.py +0 -0
  287. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_projection.py +0 -0
  288. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canvas_sourcing_contract_meta.py +0 -0
  289. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_compat_aliases.py +0 -0
  290. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_completion_selection.py +0 -0
  291. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_decision_engine.py +0 -0
  292. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_domain_pack_loader.py +0 -0
  293. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_endpoint_context.py +0 -0
  294. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_flare_v1_patch_contract.py +0 -0
  295. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_infrastructure_helpers.py +0 -0
  296. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_infrastructure_knowledge.py +0 -0
  297. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_amount_quantity.py +0 -0
  298. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_answer.py +0 -0
  299. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority.py +0 -0
  300. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority_checkpoint.py +0 -0
  301. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority_session.py +0 -0
  302. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_canonicalization.py +0 -0
  303. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_clarification.py +0 -0
  304. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_decision_rules.py +0 -0
  305. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_deployment_delivery.py +0 -0
  306. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_entry_policy.py +0 -0
  307. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_extraction.py +0 -0
  308. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_extraction_extractors.py +0 -0
  309. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_extraction_merge.py +0 -0
  310. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection.py +0 -0
  311. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection_entity.py +0 -0
  312. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection_payload.py +0 -0
  313. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection_source.py +0 -0
  314. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_scope.py +0 -0
  315. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_confirmed_updates.py +0 -0
  316. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_flags.py +0 -0
  317. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_followup.py +0 -0
  318. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_followup_work_item.py +0 -0
  319. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_open_fields.py +0 -0
  320. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_status.py +0 -0
  321. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_summary.py +0 -0
  322. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_inputs.py +0 -0
  323. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_node_state.py +0 -0
  324. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_numeric.py +0 -0
  325. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_payload_updates.py +0 -0
  326. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_readiness.py +0 -0
  327. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_reasoning_priority.py +0 -0
  328. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_state_persistence.py +0 -0
  329. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status.py +0 -0
  330. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_guided_session.py +0 -0
  331. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_projection.py +0 -0
  332. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_schema.py +0 -0
  333. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_stage.py +0 -0
  334. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_workflow_checkpoint.py +0 -0
  335. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_classifier_utils.py +0 -0
  336. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_classifier.py +0 -0
  337. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_override.py +0 -0
  338. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_pipeline.py +0 -0
  339. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_signal.py +0 -0
  340. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_retrieval.py +0 -0
  341. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_routing.py +0 -0
  342. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_type_compat_aliases.py +0 -0
  343. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_alias_delegation.py +0 -0
  344. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_endpoint_handlers.py +0 -0
  345. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_facade_helpers.py +0 -0
  346. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_intent_query_flow.py +0 -0
  347. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_mode_flow.py +0 -0
  348. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_route_execution_wrappers.py +0 -0
  349. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_session_intent_flow.py +0 -0
  350. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_llm_provider.py +0 -0
  351. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_mode_orchestration_state_bridge.py +0 -0
  352. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_mode_switch.py +0 -0
  353. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_model_router.py +0 -0
  354. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_new_flow_guard.py +0 -0
  355. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_checkpoint_state.py +0 -0
  356. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_followup_state.py +0 -0
  357. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_context.py +0 -0
  358. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_context_helpers.py +0 -0
  359. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_decision.py +0 -0
  360. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_projection.py +0 -0
  361. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_result.py +0 -0
  362. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_runtime_state.py +0 -0
  363. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_context.py +0 -0
  364. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_decision.py +0 -0
  365. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_entry.py +0 -0
  366. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_followup.py +0 -0
  367. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_intent.py +0 -0
  368. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_node.py +0 -0
  369. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_payload.py +0 -0
  370. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_unpack.py +0 -0
  371. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_trace.py +0 -0
  372. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_trace_projection.py +0 -0
  373. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_trace_steps.py +0 -0
  374. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_patch_contract.py +0 -0
  375. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_payload_enrichment.py +0 -0
  376. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_project_api.py +0 -0
  377. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_request_identity.py +0 -0
  378. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_request_intent_resolution.py +0 -0
  379. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_aliases.py +0 -0
  380. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_field_queries.py +0 -0
  381. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_projection.py +0 -0
  382. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_query_builder.py +0 -0
  383. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_search.py +0 -0
  384. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_api.py +0 -0
  385. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_intent.py +0 -0
  386. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_intent_fields.py +0 -0
  387. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_intent_small_talk.py +0 -0
  388. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_ingestion_runtime.py +0 -0
  389. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_ingestion_ssot_acceptance.py +0 -0
  390. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_library.py +0 -0
  391. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_library_persistence_scope.py +0 -0
  392. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_text_extractor.py +0 -0
  393. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_sourcing_provider.py +0 -0
  394. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_sourcing_search_runtime.py +0 -0
  395. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_ssot_mode_runtime.py +0 -0
  396. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_completion.py +0 -0
  397. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_phase.py +0 -0
  398. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_post_completion.py +0 -0
  399. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_prologue.py +0 -0
  400. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_event_emitter.py +0 -0
  401. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_intake_phase.py +0 -0
  402. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_mode_event_payload.py +0 -0
  403. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_mode_events.py +0 -0
  404. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_response_bootstrap.py +0 -0
  405. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_response_phases.py +0 -0
  406. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_response_runtime.py +0 -0
  407. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_retrieval_phase.py +0 -0
  408. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_runtime_steps.py +0 -0
  409. {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_text_safety.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flare-kernel
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: FLARE kernel runtime package
5
5
  License: Proprietary
6
6
  Classifier: Development Status :: 3 - Alpha
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flare-kernel"
7
- version = "0.2.3"
7
+ version = "0.2.4"
8
8
  description = "FLARE kernel runtime package"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -73,7 +73,7 @@ class KernelRequest(BaseModel):
73
73
 
74
74
  class AnalysisRouteDecision(BaseModel):
75
75
  analysis_type: Literal["requirement", "sourcing"] = "requirement"
76
- template_id: str = "analysis_requirement_default"
76
+ template_id: str = "flare.requirement.rfx.v1"
77
77
  reason_codes: list[str] = Field(default_factory=list)
78
78
  confidence: float = 0.0
79
79
 
@@ -176,6 +176,7 @@ class SourcingSearchResponse(BaseModel):
176
176
  all_results: list[dict[str, Any]] = Field(default_factory=list)
177
177
  results: list[dict[str, Any]] = Field(default_factory=list)
178
178
  shortlist: list[dict[str, Any]] = Field(default_factory=list)
179
+ canvas_state: dict[str, Any] = Field(default_factory=dict)
179
180
  blocked: bool = False
180
181
  reason: str = ""
181
182
 
@@ -0,0 +1,74 @@
1
+ """Analysis canvas payload orchestration bridge."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from flare_engines import build_analysis_canvas_payload
8
+
9
+
10
+ def _coerce_context_dict(value: Any) -> dict[str, Any]:
11
+ if isinstance(value, dict):
12
+ return value
13
+ return {}
14
+
15
+
16
+ def _resolve_analysis_context(
17
+ *,
18
+ analysis_route: dict[str, Any] | None,
19
+ orchestration_status: dict[str, Any] | None,
20
+ runtime_snapshot: dict[str, Any] | None,
21
+ ) -> dict[str, Any]:
22
+ status = _coerce_context_dict(orchestration_status)
23
+ snapshot = _coerce_context_dict(runtime_snapshot)
24
+ payload = _coerce_context_dict(snapshot.get("payload"))
25
+ route = _coerce_context_dict(analysis_route)
26
+ return {
27
+ "analysis_type": str(route.get("analysis_type") or "requirement").strip().lower(),
28
+ "template_id": str(route.get("template_id") or "").strip(),
29
+ "mode": str(status.get("detected_intent", {}).get("mode") or payload.get("mode") or "").strip(),
30
+ "intent": str(status.get("detected_intent", {}).get("intent") or "").strip(),
31
+ "fields": _coerce_context_dict(payload.get("fields")),
32
+ "field_entities": _coerce_context_dict(status.get("field_entities")),
33
+ "required_missing": (
34
+ status.get("required_missing")
35
+ if isinstance(status.get("required_missing"), list)
36
+ else (payload.get("required_missing") if isinstance(payload.get("required_missing"), list) else [])
37
+ ),
38
+ "retrieved_knowledge": (
39
+ payload.get("retrieved_knowledge")
40
+ if isinstance(payload.get("retrieved_knowledge"), list)
41
+ else []
42
+ ),
43
+ "structured_retrieved_knowledge": (
44
+ status.get("structured_retrieved_knowledge")
45
+ if isinstance(status.get("structured_retrieved_knowledge"), list)
46
+ else []
47
+ ),
48
+ }
49
+
50
+
51
+ def build_canvas_analysis_payload(
52
+ *,
53
+ analysis_route: dict[str, Any] | None,
54
+ content_text: str,
55
+ previous_payload: dict[str, Any] | None = None,
56
+ orchestration_status: dict[str, Any] | None = None,
57
+ runtime_snapshot: dict[str, Any] | None = None,
58
+ ) -> tuple[dict[str, Any] | None, list[dict[str, Any]]]:
59
+ _ = content_text
60
+ context = _resolve_analysis_context(
61
+ analysis_route=analysis_route,
62
+ orchestration_status=orchestration_status,
63
+ runtime_snapshot=runtime_snapshot,
64
+ )
65
+ return build_analysis_canvas_payload(
66
+ analysis_type=str(context.get("analysis_type") or "requirement"),
67
+ template_id=str(context.get("template_id") or ""),
68
+ context=context,
69
+ previous_payload=previous_payload,
70
+ placeholder="—",
71
+ )
72
+
73
+
74
+ __all__ = ["build_canvas_analysis_payload"]
@@ -16,6 +16,16 @@ from flare_kernel.router.intent.compat_aliases import (
16
16
  )
17
17
 
18
18
 
19
+ def _resolve_analysis_title(*, command: str, can_generate: bool, orchestration_status: dict[str, Any]) -> str:
20
+ if command != "generate_analysis" or not can_generate:
21
+ return ""
22
+ analysis_route = orchestration_status.get("analysis_route")
23
+ if isinstance(analysis_route, dict):
24
+ if str(analysis_route.get("analysis_type") or "").strip().lower() == "sourcing":
25
+ return "寻源分析"
26
+ return "需求分析"
27
+
28
+
19
29
  def build_canonical_payload(
20
30
  *,
21
31
  req: KernelRequest,
@@ -44,6 +54,7 @@ def build_canonical_payload(
44
54
  current_question = canonical_context.get("current_question") if isinstance(canonical_context.get("current_question"), dict) else None
45
55
  next_actions = canonical_context.get("next_actions") if isinstance(canonical_context.get("next_actions"), list) else []
46
56
  question_field_key = str((current_question or {}).get("field_key") or "").strip()
57
+ question_kind = str((current_question or {}).get("question_kind") or "").strip().lower()
47
58
  primary_missing_field = str((required_missing[0] if required_missing else "") or "").strip()
48
59
  chooser_kind = "none"
49
60
  chooser_visible = False
@@ -54,6 +65,18 @@ def build_canonical_payload(
54
65
  ):
55
66
  chooser_kind = "question"
56
67
  chooser_visible = True
68
+ elif (
69
+ activated_mode == "plan_mode"
70
+ and isinstance(current_question, dict)
71
+ ):
72
+ chooser_kind = "question"
73
+ chooser_visible = True
74
+ elif (
75
+ isinstance(current_question, dict)
76
+ and question_kind == "plan_followup"
77
+ ):
78
+ chooser_kind = "question"
79
+ chooser_visible = True
57
80
  elif stage_key == "requirement_intake" and status_key == "ready_for_submit":
58
81
  chooser_kind = "decision_point"
59
82
  chooser_visible = True
@@ -155,12 +178,26 @@ def build_canonical_payload(
155
178
  "analysis_entry_eligible": bool(canonical_context.get("analysis_entry_eligible")),
156
179
  "analyzability_score": float(canonical_context.get("analyzability_score") or 0.0),
157
180
  },
158
- "title": "需求分析" if command == "generate_analysis" and can_generate else "",
181
+ "title": _resolve_analysis_title(
182
+ command=command,
183
+ can_generate=can_generate,
184
+ orchestration_status=orchestration_status,
185
+ ),
159
186
  "sections": [],
160
187
  "assumptions": canonical_context.get("analysis_assumptions")
161
188
  if isinstance(canonical_context.get("analysis_assumptions"), list)
162
189
  else [],
163
190
  },
191
+ "canvas_analysis_payload": (
192
+ orchestration_status.get("canvas_analysis_payload")
193
+ if isinstance(orchestration_status.get("canvas_analysis_payload"), dict)
194
+ else None
195
+ ),
196
+ "analysis_slot_patches": (
197
+ orchestration_status.get("analysis_slot_patches")
198
+ if isinstance(orchestration_status.get("analysis_slot_patches"), list)
199
+ else []
200
+ ),
164
201
  "observation": {
165
202
  "active_fields": canonical_context.get("active_fields")
166
203
  if isinstance(canonical_context.get("active_fields"), list)
@@ -8,6 +8,86 @@ from flare_kernel.contracts import KernelResponse
8
8
  from flare_kernel.router.next_actions_guard import dedupe_next_actions_by_action_key
9
9
 
10
10
 
11
+ def _append_sourcing_preview_lines(
12
+ *,
13
+ content_text: str,
14
+ mode_key: str,
15
+ mode_state: str,
16
+ structured_retrieved_knowledge: list[dict[str, Any]],
17
+ ) -> str:
18
+ if mode_key != "intelligent_sourcing" or mode_state != "collecting":
19
+ return content_text
20
+ if not isinstance(structured_retrieved_knowledge, list) or not structured_retrieved_knowledge:
21
+ return content_text
22
+
23
+ lines: list[str] = []
24
+ for item in structured_retrieved_knowledge[:2]:
25
+ if not isinstance(item, dict):
26
+ continue
27
+ title = str(item.get("title") or "").strip()
28
+ if not title:
29
+ continue
30
+ try:
31
+ confidence = max(0.0, min(1.0, float(item.get("confidence") or item.get("score") or 0.0)))
32
+ except (TypeError, ValueError):
33
+ confidence = 0.0
34
+ url = str(item.get("url") or "").strip()
35
+ line = f"- {title}(置信度 {confidence:.2f})"
36
+ if url:
37
+ line += f"\n 来源:{url}"
38
+ lines.append(line)
39
+ if not lines:
40
+ return content_text
41
+
42
+ extra = "先给您两条预检索参考(补充字段后我会重排):\n" + "\n".join(lines)
43
+ base = str(content_text or "").rstrip()
44
+ return f"{base}\n\n{extra}".strip()
45
+
46
+
47
+ def _format_citation_line(citation: dict[str, Any], index: int) -> str:
48
+ citation_id = str(citation.get("citation_id") or f"cite_{index + 1}").strip()
49
+ title = str(citation.get("title") or citation.get("source_id") or "引用条目").strip()
50
+ snippet = str(
51
+ citation.get("snippet")
52
+ or citation.get("matched_text")
53
+ or citation.get("hit_reason")
54
+ or ""
55
+ ).strip()
56
+ url = str(citation.get("url") or citation.get("source_url") or "").strip()
57
+ try:
58
+ score_value = float(citation.get("score")) if citation.get("score") is not None else None
59
+ except (TypeError, ValueError):
60
+ score_value = None
61
+ score_suffix = f"(相关度 {score_value:.2f})" if score_value is not None else ""
62
+ detail_text = f":{snippet}" if snippet else ""
63
+ link_text = f"\n链接:{url}" if url else ""
64
+ return f"[{citation_id}] {title}{score_suffix}{detail_text}{link_text}".strip()
65
+
66
+
67
+ def _build_citation_appendix(citations: list[dict[str, Any]]) -> str:
68
+ lines = [
69
+ _format_citation_line(citation, index)
70
+ for index, citation in enumerate(citations[:3])
71
+ if isinstance(citation, dict)
72
+ ]
73
+ lines = [line for line in lines if line]
74
+ if not lines:
75
+ return ""
76
+ return "引用来源:\n" + "\n\n".join(lines)
77
+
78
+
79
+ def _append_citation_lines(*, content_text: str, citations: list[dict[str, Any]]) -> str:
80
+ appendix = _build_citation_appendix(citations)
81
+ if not appendix:
82
+ return str(content_text or "").strip()
83
+ base = str(content_text or "").strip()
84
+ if not base:
85
+ return appendix
86
+ if appendix in base:
87
+ return base
88
+ return f"{base}\n\n{appendix}".strip()
89
+
90
+
11
91
  def apply_completion_content_policy(
12
92
  *,
13
93
  orchestration_status: dict[str, Any],
@@ -37,11 +117,22 @@ def build_run_result_payload(
37
117
  mode_switch_reason: dict[str, Any],
38
118
  build_knowledge_citations_fn: Callable[[list[dict[str, Any]]], list[dict[str, Any]]],
39
119
  ) -> dict[str, Any]:
120
+ knowledge_citation = build_knowledge_citations_fn(structured_retrieved_knowledge)
121
+ final_message = _append_sourcing_preview_lines(
122
+ content_text=content_text,
123
+ mode_key=str(runtime_snapshot["mode_key"]),
124
+ mode_state=str(runtime_snapshot["mode_state"]),
125
+ structured_retrieved_knowledge=structured_retrieved_knowledge,
126
+ )
127
+ final_message = _append_citation_lines(
128
+ content_text=final_message,
129
+ citations=knowledge_citation,
130
+ )
40
131
  next_actions = dedupe_next_actions_by_action_key(
41
132
  orchestration_status.get("next_actions", runtime_snapshot["next_actions"])
42
133
  )
43
134
  return {
44
- "message": content_text,
135
+ "message": final_message,
45
136
  "provider": completion_provider,
46
137
  "model": completion_model,
47
138
  "provider_status": completion_status,
@@ -65,7 +156,7 @@ def build_run_result_payload(
65
156
  "mode_events": runtime_snapshot["mode_events"],
66
157
  "next_actions": next_actions,
67
158
  "retrieved_knowledge": structured_retrieved_knowledge,
68
- "knowledge_citation": build_knowledge_citations_fn(structured_retrieved_knowledge),
159
+ "knowledge_citation": knowledge_citation,
69
160
  "orchestration_status": orchestration_status,
70
161
  }
71
162
 
@@ -7,6 +7,8 @@ from typing import Any
7
7
  from flare_kernel.contracts import KernelRequest
8
8
  from flare_kernel.runtime.llm.llm_provider import LLMCompletion
9
9
 
10
+ _PLAN_MODE_FINALIZE_COMMANDS = {"implement", "apply"}
11
+
10
12
 
11
13
  def _is_collecting_question_phase(orchestration_status: dict[str, Any]) -> bool:
12
14
  status = orchestration_status if isinstance(orchestration_status, dict) else {}
@@ -28,6 +30,23 @@ def _is_collecting_question_phase(orchestration_status: dict[str, Any]) -> bool:
28
30
  return False
29
31
 
30
32
 
33
+ def _is_plan_mode_patch_only_phase(*, command: str, orchestration_status: dict[str, Any]) -> bool:
34
+ if str(command or "").strip() in _PLAN_MODE_FINALIZE_COMMANDS:
35
+ return False
36
+ status = orchestration_status if isinstance(orchestration_status, dict) else {}
37
+ chooser_state = status.get("chooser_state") if isinstance(status.get("chooser_state"), dict) else {}
38
+ chooser_kind = str(chooser_state.get("kind") or "").strip().lower()
39
+ if chooser_kind == "question" and chooser_state.get("visible") is True:
40
+ return True
41
+ current_question = status.get("current_question")
42
+ if isinstance(current_question, dict):
43
+ return True
44
+ followup_question = status.get("followup_question")
45
+ if isinstance(followup_question, dict) and str(followup_question.get("question_text") or "").strip():
46
+ return True
47
+ return True
48
+
49
+
31
50
  def resolve_guided_orchestrated_completion(
32
51
  *,
33
52
  req: KernelRequest,
@@ -40,6 +59,24 @@ def resolve_guided_orchestrated_completion(
40
59
  _ = (req, mode_source, runtime_snapshot)
41
60
  normalized_mode = str(resolved_mode or "").strip()
42
61
  normalized_command = str(command or "").strip()
62
+ if normalized_mode == "plan_mode":
63
+ if _is_plan_mode_patch_only_phase(
64
+ command=normalized_command,
65
+ orchestration_status=orchestration_status,
66
+ ):
67
+ return LLMCompletion(
68
+ provider="kernel_guardrail",
69
+ model="guided_session",
70
+ content="",
71
+ status="orchestrated",
72
+ details={
73
+ "reason": "plan_mode_patch_only",
74
+ "phase": "plan_refinement",
75
+ "mode": normalized_mode,
76
+ "command": normalized_command,
77
+ },
78
+ )
79
+ return None
43
80
  if normalized_mode != "requirement_canvas":
44
81
  return None
45
82
  if normalized_command not in {"send_message", "submit_intake_answer", "activate_requirement_intake"}:
@@ -63,6 +100,6 @@ def resolve_guided_orchestrated_completion(
63
100
 
64
101
  def should_persist_memory_record(*, completion: LLMCompletion) -> bool:
65
102
  details = completion.details if isinstance(completion.details, dict) else {}
66
- if str(details.get("reason") or "").strip() == "guided_session_patch_only":
103
+ if str(details.get("reason") or "").strip() in {"guided_session_patch_only", "plan_mode_patch_only"}:
67
104
  return False
68
105
  return True
@@ -41,9 +41,16 @@ def hydrate_payload_from_authoritative_intake_session(
41
41
  "optional_fields",
42
42
  "optional_missing",
43
43
  "question_progress",
44
+ "plan_context_state",
45
+ "followup_question",
46
+ "plan_summary_handoff",
47
+ "plan_summary_contract",
48
+ "canvas_analysis_payload",
44
49
  ):
45
50
  if (key not in merged or merged.get(key) in (None, "", [], {})) and key in persisted:
46
51
  merged[key] = persisted.get(key)
52
+ if (not isinstance(merged.get("canvas_analysis_payload"), dict)) and isinstance(status.get("canvas_analysis_payload"), dict):
53
+ merged["canvas_analysis_payload"] = status.get("canvas_analysis_payload")
47
54
 
48
55
  if not str(merged.get("intake_session_id") or "").strip():
49
56
  session_id = str(status.get("intake_session_id") or persisted.get("intake_session_id") or "").strip()
@@ -14,8 +14,17 @@ from flare_kernel.contracts import (
14
14
  KnowledgeIngestResponse,
15
15
  KnowledgeSearchRequest,
16
16
  KnowledgeSearchResponse,
17
+ SourcingSearchRequest,
18
+ SourcingSearchResponse,
17
19
  )
18
20
  from flare_kernel.router.kernel_compat_exports import * # noqa: F401,F403
21
+ from flare_kernel.router.kernel_endpoint_handlers_sourcing import (
22
+ handle_sourcing_search as handle_sourcing_search_from_router,
23
+ )
24
+ from flare_kernel.runtime.infrastructure.sourcing_persistence import persist_sourcing_run_bundle
25
+ from flare_kernel.runtime.infrastructure.sourcing_provider import search_web_sources
26
+ from flare_kernel.runtime.infrastructure.infrastructure import build_sqlalchemy_engine
27
+ from flare_kernel.runtime.orchestration.sourcing_search_runtime import run_sourcing_search
19
28
 
20
29
  router = APIRouter(prefix="/kernel", tags=["kernel"])
21
30
  logger = get_logger("flare_kernel.router.kernel")
@@ -120,3 +129,18 @@ async def kernel_knowledge_search(req: KnowledgeSearchRequest) -> KnowledgeSearc
120
129
  resolve_trace_id_fn=resolve_trace_id,
121
130
  search_knowledge_records_fn=search_knowledge_records,
122
131
  )
132
+
133
+
134
+ @router.post("/sourcing/search", response_model=SourcingSearchResponse)
135
+ async def kernel_sourcing_search(req: SourcingSearchRequest) -> SourcingSearchResponse:
136
+ return handle_sourcing_search_from_router(
137
+ req,
138
+ resolve_trace_id_fn=resolve_trace_id,
139
+ run_sourcing_search_fn=run_sourcing_search,
140
+ search_knowledge_records_fn=search_knowledge_records,
141
+ search_web_sources_fn=search_web_sources,
142
+ persist_sourcing_run_bundle_fn=lambda **kwargs: persist_sourcing_run_bundle(
143
+ **kwargs,
144
+ build_sqlalchemy_engine_fn=build_sqlalchemy_engine,
145
+ ),
146
+ )
@@ -44,6 +44,7 @@ from flare_kernel.router.kernel_endpoint_handlers import (
44
44
  handle_kernel_stream as handle_kernel_stream_from_router,
45
45
  handle_knowledge_ingest as handle_knowledge_ingest_from_router,
46
46
  handle_knowledge_search as handle_knowledge_search_from_router,
47
+ handle_sourcing_search as handle_sourcing_search_from_router,
47
48
  )
48
49
 
49
50
 
@@ -11,6 +11,7 @@ from flare_kernel.router.kernel_endpoint_handlers_knowledge import (
11
11
  handle_knowledge_ingest,
12
12
  handle_knowledge_search,
13
13
  )
14
+ from flare_kernel.router.kernel_endpoint_handlers_sourcing import handle_sourcing_search
14
15
  from flare_kernel.router.kernel_endpoint_handlers_turn import (
15
16
  handle_intent_suggest,
16
17
  handle_kernel_action,
@@ -26,4 +27,5 @@ __all__ = [
26
27
  "handle_kernel_stream",
27
28
  "handle_knowledge_ingest",
28
29
  "handle_knowledge_search",
30
+ "handle_sourcing_search",
29
31
  ]
@@ -12,6 +12,9 @@ def handle_sourcing_search(
12
12
  *,
13
13
  resolve_trace_id_fn: Callable[[str | None], str],
14
14
  run_sourcing_search_fn,
15
+ search_knowledge_records_fn,
16
+ search_web_sources_fn,
17
+ persist_sourcing_run_bundle_fn=None,
15
18
  ) -> SourcingSearchResponse:
16
19
  trace_id = resolve_trace_id_fn(None)
17
20
  source_ids = [str(item).strip() for item in (req.source_ids or []) if str(item).strip()]
@@ -29,6 +32,9 @@ def handle_sourcing_search(
29
32
  base_result_ids=req.base_result_ids,
30
33
  source_scope=req.source_scope,
31
34
  sourcing_enabled=req.sourcing_enabled,
35
+ search_knowledge_records_fn=search_knowledge_records_fn,
36
+ search_web_sources_fn=search_web_sources_fn,
37
+ persist_sourcing_run_bundle_fn=persist_sourcing_run_bundle_fn,
32
38
  source_ids=source_ids,
33
39
  entities=req.entities,
34
40
  )
@@ -52,6 +58,7 @@ def handle_sourcing_search(
52
58
  all_results=result.get("all_results") if isinstance(result.get("all_results"), list) else [],
53
59
  results=result.get("results") if isinstance(result.get("results"), list) else [],
54
60
  shortlist=result.get("shortlist") if isinstance(result.get("shortlist"), list) else [],
61
+ canvas_state=result.get("canvas_state") if isinstance(result.get("canvas_state"), dict) else {},
55
62
  blocked=bool(result.get("blocked")),
56
63
  reason=str(result.get("reason") or ""),
57
64
  )
@@ -10,6 +10,9 @@ from typing import Any, Callable
10
10
 
11
11
  from flare_kernel.contracts import KernelRequest
12
12
  from flare_kernel.router.payload_enrichment import extract_source_ids_from_payload
13
+ from flare_kernel.router.turn_context_sourcing_preview import (
14
+ maybe_append_sourcing_preview_rows,
15
+ )
13
16
 
14
17
 
15
18
  async def prepare_kernel_turn_context_flow(
@@ -36,6 +39,7 @@ async def prepare_kernel_turn_context_flow(
36
39
  merge_intent_and_escalation_signal_fn: Callable[..., dict[str, Any]],
37
40
  resolve_effective_command_fn: Callable[..., str],
38
41
  build_structured_search_results_fn: Callable[..., list[dict[str, Any]]],
42
+ search_web_sources_fn: Callable[..., list[dict[str, Any]]] | None = None,
39
43
  resolve_analysis_route_fn: Callable[..., dict[str, Any]] | None = None,
40
44
  ) -> dict[str, Any]:
41
45
  """Assemble the turn context consumed by kernel run/action/stream handlers."""
@@ -100,6 +104,17 @@ async def prepare_kernel_turn_context_flow(
100
104
  min_score=retrieval_config["min_score"],
101
105
  source_ids=source_ids or None,
102
106
  )
107
+ retrieved_knowledge = maybe_append_sourcing_preview_rows(
108
+ retrieved_knowledge=retrieved_knowledge,
109
+ resolved_mode=resolved_mode,
110
+ raw_message=raw_message,
111
+ retrieval_top_k=int(retrieval_config.get("top_k") or 0),
112
+ trace_id=trace_id,
113
+ session_id=session_id,
114
+ project_id=str(project_id or ""),
115
+ user_id=str(user_id or ""),
116
+ search_web_sources_fn=search_web_sources_fn,
117
+ )
103
118
 
104
119
  if callable(resolve_analysis_route_fn):
105
120
  analysis_route = resolve_analysis_route_fn(
@@ -113,12 +128,14 @@ async def prepare_kernel_turn_context_flow(
113
128
  else:
114
129
  analysis_route = {
115
130
  "analysis_type": "requirement",
116
- "template_id": "analysis_requirement_default",
131
+ "template_id": "flare.requirement.rfx.v1",
117
132
  "reason_codes": ["ROUTE_SIGNAL_DEFAULT"],
118
133
  "confidence": 0.0,
119
134
  }
120
135
 
121
136
  enriched_payload = enrich_payload_fn(req, resolved_mode=resolved_mode, retrieved_knowledge=retrieved_knowledge)
137
+ if isinstance(enriched_payload, dict):
138
+ enriched_payload["analysis_route"] = analysis_route
122
139
  runtime_snapshot = build_kernel_runtime_fn(
123
140
  trace_id=trace_id,
124
141
  tenant_id=req.tenant_id,
@@ -23,6 +23,9 @@ from flare_kernel.router.intent.intent_retrieval import (
23
23
  build_retrieval_queries as _build_retrieval_queries_from_router,
24
24
  search_knowledge_by_queries as _search_knowledge_by_queries,
25
25
  )
26
+ from flare_kernel.runtime.infrastructure.sourcing_provider import (
27
+ search_web_sources as _search_web_sources,
28
+ )
26
29
  from flare_kernel.router.intent.intent_routing import (
27
30
  resolve_request_intent_with_ai as _resolve_request_intent_with_ai_from_router,
28
31
  )
@@ -86,6 +89,7 @@ async def _prepare_kernel_turn_context(
86
89
  merge_intent_and_escalation_signal_fn=None,
87
90
  resolve_effective_command_fn=None,
88
91
  build_structured_search_results_fn=None,
92
+ search_web_sources_fn=None,
89
93
  resolve_analysis_route_fn=None,
90
94
  ) -> dict[str, object]:
91
95
  """Assemble the kernel turn context for route execution."""
@@ -161,6 +165,7 @@ async def _prepare_kernel_turn_context(
161
165
  merge_intent_and_escalation_signal_fn=turn_context_deps["merge_intent_and_escalation_signal_fn"],
162
166
  resolve_effective_command_fn=turn_context_deps["resolve_effective_command_fn"],
163
167
  build_structured_search_results_fn=turn_context_deps["build_structured_search_results_fn"],
168
+ search_web_sources_fn=search_web_sources_fn or _search_web_sources,
164
169
  resolve_analysis_route_fn=turn_context_deps["resolve_analysis_route_fn"],
165
170
  )
166
171
 
@@ -169,6 +169,21 @@ def _resolve_generate_llm_completion_fn():
169
169
  def _resolve_command(req: KernelRequest) -> str:
170
170
  """Resolve the request command, falling back to the default flow command."""
171
171
  command = str(req.command or "").strip()
172
+ payload = req.payload if isinstance(req.payload, dict) else {}
173
+ mode_candidates = (
174
+ req.mode,
175
+ req.manual_mode,
176
+ req.current_mode,
177
+ payload.get("mode"),
178
+ payload.get("manual_mode"),
179
+ payload.get("current_mode"),
180
+ payload.get("function_type"),
181
+ )
182
+ is_analysis_mode = any(str(candidate or "").strip() == "analysis_mode" for candidate in mode_candidates)
183
+ if command and command != "send_message":
184
+ return command
185
+ if is_analysis_mode:
186
+ return "generate_analysis"
172
187
  if command:
173
188
  return command
174
189
  if req.action_key:
@@ -34,6 +34,21 @@ from flare_kernel.router.mode_switch import (
34
34
 
35
35
  def _resolve_command(req: KernelRequest) -> str:
36
36
  command = str(req.command or "").strip()
37
+ payload = req.payload if isinstance(req.payload, dict) else {}
38
+ mode_candidates = (
39
+ req.mode,
40
+ req.manual_mode,
41
+ req.current_mode,
42
+ payload.get("mode"),
43
+ payload.get("manual_mode"),
44
+ payload.get("current_mode"),
45
+ payload.get("function_type"),
46
+ )
47
+ is_analysis_mode = any(str(candidate or "").strip() == "analysis_mode" for candidate in mode_candidates)
48
+ if command and command != "send_message":
49
+ return command
50
+ if is_analysis_mode:
51
+ return "generate_analysis"
37
52
  if command:
38
53
  return command
39
54
  if req.action_key:
@@ -28,9 +28,10 @@ _MODE_ALIASES: dict[str, str] = {
28
28
  "domain_workflow": "intelligent_sourcing",
29
29
  "domain_exploration": "intelligent_sourcing",
30
30
  "domain_analysis": "requirement_canvas",
31
+ "analysis_mode": "requirement_canvas",
31
32
  "domain_plan": "plan_mode",
32
33
  "sourcing": "intelligent_sourcing",
33
- "plan": "requirement_canvas",
34
+ "plan": "plan_mode",
34
35
  }
35
36
 
36
37
 
@@ -229,6 +229,10 @@ def enrich_payload(
229
229
  payload["current_mode"] = current_mode
230
230
  if retrieved_knowledge:
231
231
  payload["retrieved_knowledge"] = retrieved_knowledge
232
+ if resolved_mode == "intelligent_sourcing":
233
+ existing_candidates = payload.get("sourcing_candidates")
234
+ if not isinstance(existing_candidates, list) or not existing_candidates:
235
+ payload["sourcing_candidates"] = list(retrieved_knowledge)
232
236
  source_ids = extract_source_ids_from_payload(payload)
233
237
  if source_ids:
234
238
  payload["source_ids"] = source_ids