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.
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/PKG-INFO +1 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/pyproject.toml +1 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/kernel_contract.py +2 -1
- flare_kernel-0.2.4/src/flare_kernel/router/analysis_canvas_payload.py +74 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_payload.py +38 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/completion_response_builder.py +93 -2
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/guided_completion.py +38 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority_hydration.py +7 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel.py +24 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/endpoint.py +1 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers.py +2 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_sourcing.py +7 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_turn_context.py +18 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_turn_context_wrapper.py +5 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow.py +15 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_action.py +15 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/mode_resolution.py +2 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/payload_enrichment.py +4 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/prompting.py +82 -2
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_projection.py +3 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_finalize.py +47 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_post_completion.py +1 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/turn_context_builder.py +18 -1
- flare_kernel-0.2.4/src/flare_kernel/router/turn_context_sourcing_preview.py +77 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/infrastructure.py +40 -38
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/analysis_router_runtime.py +1 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration.py +90 -20
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan.py +128 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/sourcing_search_runtime.py +28 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_kernel_runtime.py +41 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/PKG-INFO +1 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/SOURCES.txt +6 -0
- flare_kernel-0.2.4/tests/test_analysis_canvas_payload.py +54 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_analysis_route_projection.py +4 -4
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_basics.py +1 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_payload.py +60 -3
- flare_kernel-0.2.4/tests/test_command_resolution_analysis_mode.py +28 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_completion_response_builder.py +74 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_guided_completion.py +40 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority_hydration.py +24 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_resolution.py +25 -0
- flare_kernel-0.2.4/tests/test_kernel_endpoint_handlers_sourcing.py +53 -0
- flare_kernel-0.2.4/tests/test_kernel_facade_turn_context.py +113 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_mode_resolution.py +3 -3
- flare_kernel-0.2.4/tests/test_prompting_analysis_instruction.py +50 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_finalize.py +7 -1
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_turn_context_builder.py +54 -0
- flare_kernel-0.2.3/tests/test_kernel_facade_turn_context.py +0 -60
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/README.md +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/setup.cfg +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/app.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/mode.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/project_contract.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/contracts/session_contract.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/main.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/project_store.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/action_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/api_errors.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_analysis.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_builder.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_checkpoint.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context_analysis.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context_inputs.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_context_session.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/canonical/canonical_state_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/completion_selection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/endpoint_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_amount_quantity.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_answer.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority_checkpoint.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_authority_session.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_canonicalization.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_clarification.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_decision_rules.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_deployment_delivery.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_entry_policy.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_extraction.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_extraction_extractors.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_extraction_merge.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection_entity.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_projection_source.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_field_scope.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_confirmed_updates.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_flags.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_followup.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_followup_work_item.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_open_fields.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_status.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_guided_summary.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_inputs.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_node_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_numeric.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_payload_updates.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_readiness.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_state_persistence.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_chooser_stage.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_guided_session.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_status_schema.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intake/intake_workflow_checkpoint.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/compat_aliases.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_classifier_utils.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_escalation_override.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_escalation_pipeline.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_escalation_signal.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_retrieval.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/intent_routing.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/session_intent.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/session_intent_fields.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/intent/session_intent_small_talk.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/constants.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/domain.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/facade.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/router_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_compat_exports_parts/runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants_intake.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants_intent.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_constants_patch.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_health.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_knowledge.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers_turn.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_canonical_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_canonical_wrapper.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_dependency_resolution.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_helpers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_orchestration.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_orchestration_wrappers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_payload_enrichment.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_payload_wrapper.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_utils.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_intent_query_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_mode_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intake.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intent.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intent_query.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_intent_signal.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_action.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_execution.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_run.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_route_stream.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_session_intent_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/mode_switch.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/next_actions_guard.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_checkpoint_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_followup_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_builder.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_context_helpers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_decision.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_result.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_runtime_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_decision.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_entry.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_followup.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_intent.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_node.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_status_state_unpack.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_trace.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_trace_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/orchestration/orchestration_trace_steps.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/patch_contract.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/project_api.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/request_identity.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/request_intent_resolution.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_aliases.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_field_queries.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_query_builder.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/retrieval/retrieval_search.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/session_api.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/source_library.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_completion.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_phase.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_phase_timing.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_draft_prologue.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_event_emitter.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_intake_phase.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_mode_event_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_mode_events.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_bootstrap.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_builder.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_builder_transport.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_phases.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_phases_mode_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_phases_post_intake.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_response_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_retrieval_phase.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/streaming/streaming_runtime_steps.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/text_safety.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/domain/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/domain/domain_pack_loader.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/domain/profile_resolution.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/execution/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/execution/agent_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/execution/skill_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/logging.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/source_library_persistence.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/source_text_extractor.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/sourcing_persistence.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/sourcing_provider.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/infrastructure/trace.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/decision.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/lexicon.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/preprocessing.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation/signals.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/intent/intent_and_escalation_classifier.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/llm/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/llm/llm_provider.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/llm/model_router.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/canonical_mode_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/canvas_sourcing_contract.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/decision_engine.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/decision_engine_mode_flags.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_stage.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_helpers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_payloads.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_sourcing.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_orchestration_sourcing_stage.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/mode_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/source_ingestion_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/source_ingestion_runtime_artifacts.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/sourcing_event_payloads.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/orchestration/ssot_mode_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_branching.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_branching_policy.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_hypothesis.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_planning.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_priority.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_question_extraction.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_readiness.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/reasoning/intake_reasoning_shared.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/__init__.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/checkpoint_manager.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/checkpoint_store_sql.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/intake_session_store.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/intake_session_store_query.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/session/models.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_checkpoint_manager.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_intake_reasoning.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_intake_reasoning_split.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_intake_session_store.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/runtime/tests/test_mode_runtime_fallback.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/session_store.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/dependency_links.txt +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/requires.txt +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel.egg-info/top_level.txt +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_action_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_builder_split_modules.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_business_hardcode_guard.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_context_analysis.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_context_inputs.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_context_session.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canonical_state_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_canvas_sourcing_contract_meta.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_compat_aliases.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_completion_selection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_decision_engine.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_domain_pack_loader.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_endpoint_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_flare_v1_patch_contract.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_infrastructure_helpers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_infrastructure_knowledge.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_amount_quantity.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_answer.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority_checkpoint.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_authority_session.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_canonicalization.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_clarification.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_decision_rules.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_deployment_delivery.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_entry_policy.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_extraction.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_extraction_extractors.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_extraction_merge.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection_entity.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_projection_source.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_field_scope.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_confirmed_updates.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_flags.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_followup.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_followup_work_item.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_open_fields.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_status.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_guided_summary.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_inputs.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_node_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_numeric.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_payload_updates.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_readiness.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_reasoning_priority.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_state_persistence.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_guided_session.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_schema.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_status_stage.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intake_workflow_checkpoint.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_classifier_utils.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_classifier.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_override.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_pipeline.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_escalation_signal.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_retrieval.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_routing.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_intent_type_compat_aliases.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_alias_delegation.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_endpoint_handlers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_facade_helpers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_intent_query_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_mode_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_route_execution_wrappers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_kernel_session_intent_flow.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_llm_provider.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_mode_orchestration_state_bridge.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_mode_switch.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_model_router.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_new_flow_guard.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_checkpoint_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_followup_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_context_helpers.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_decision.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_result.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_runtime_state.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_context.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_decision.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_entry.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_followup.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_intent.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_node.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_status_state_unpack.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_trace.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_trace_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_orchestration_trace_steps.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_patch_contract.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_payload_enrichment.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_project_api.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_request_identity.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_request_intent_resolution.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_aliases.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_field_queries.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_projection.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_query_builder.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_retrieval_search.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_api.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_intent.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_intent_fields.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_session_intent_small_talk.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_ingestion_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_ingestion_ssot_acceptance.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_library.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_library_persistence_scope.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_source_text_extractor.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_sourcing_provider.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_sourcing_search_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_ssot_mode_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_completion.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_phase.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_post_completion.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_draft_prologue.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_event_emitter.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_intake_phase.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_mode_event_payload.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_mode_events.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_response_bootstrap.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_response_phases.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_response_runtime.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_retrieval_phase.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_streaming_runtime_steps.py +0 -0
- {flare_kernel-0.2.3 → flare_kernel-0.2.4}/tests/test_text_safety.py +0 -0
|
@@ -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 = "
|
|
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":
|
|
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)
|
{flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/completion_response_builder.py
RENAMED
|
@@ -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":
|
|
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":
|
|
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()
|
|
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
|
|
{flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_endpoint_handlers.py
RENAMED
|
@@ -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
|
)
|
{flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_facade_turn_context.py
RENAMED
|
@@ -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": "
|
|
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:
|
{flare_kernel-0.2.3 → flare_kernel-0.2.4}/src/flare_kernel/router/kernel_request_flow_action.py
RENAMED
|
@@ -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": "
|
|
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
|