flare-kernel 0.2.2__tar.gz → 0.2.3__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 (406) hide show
  1. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/PKG-INFO +3 -1
  2. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/pyproject.toml +3 -1
  3. flare_kernel-0.2.3/src/flare_kernel/app.py +39 -0
  4. flare_kernel-0.2.3/src/flare_kernel/contracts/__init__.py +78 -0
  5. flare_kernel-0.2.3/src/flare_kernel/contracts/context.py +42 -0
  6. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/contracts/kernel_contract.py +83 -0
  7. flare_kernel-0.2.3/src/flare_kernel/contracts/mode.py +32 -0
  8. flare_kernel-0.2.3/src/flare_kernel/contracts/project_contract.py +24 -0
  9. flare_kernel-0.2.3/src/flare_kernel/contracts/session_contract.py +76 -0
  10. flare_kernel-0.2.3/src/flare_kernel/project_store.py +84 -0
  11. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/__init__.py +4 -1
  12. flare_kernel-0.2.3/src/flare_kernel/router/api_errors.py +129 -0
  13. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/intent_retrieval.py +6 -0
  14. flare_kernel-0.2.3/src/flare_kernel/router/kernel_endpoint_handlers_sourcing.py +57 -0
  15. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_dependency_resolution.py +3 -0
  16. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_orchestration.py +2 -0
  17. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_orchestration_wrappers.py +2 -0
  18. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_turn_context.py +30 -0
  19. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_turn_context_wrapper.py +7 -0
  20. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_mode_flow.py +2 -0
  21. flare_kernel-0.2.3/src/flare_kernel/router/kernel_request_flow_action.py +128 -0
  22. flare_kernel-0.2.3/src/flare_kernel/router/kernel_request_flow_intake.py +320 -0
  23. flare_kernel-0.2.3/src/flare_kernel/router/kernel_request_flow_intent.py +45 -0
  24. flare_kernel-0.2.3/src/flare_kernel/router/kernel_request_flow_intent_query.py +240 -0
  25. flare_kernel-0.2.3/src/flare_kernel/router/kernel_request_flow_intent_signal.py +82 -0
  26. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/mode_resolution.py +17 -4
  27. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_builder.py +2 -0
  28. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_projection.py +2 -0
  29. flare_kernel-0.2.3/src/flare_kernel/router/project_api.py +26 -0
  30. flare_kernel-0.2.3/src/flare_kernel/router/retrieval/retrieval_projection.py +124 -0
  31. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/retrieval/retrieval_query_builder.py +80 -0
  32. flare_kernel-0.2.3/src/flare_kernel/router/retrieval/retrieval_search.py +126 -0
  33. flare_kernel-0.2.3/src/flare_kernel/router/session_api.py +133 -0
  34. flare_kernel-0.2.3/src/flare_kernel/router/source_library.py +181 -0
  35. flare_kernel-0.2.3/src/flare_kernel/router/streaming/streaming_response_phases_mode_runtime.py +187 -0
  36. flare_kernel-0.2.3/src/flare_kernel/router/streaming/streaming_response_phases_post_intake.py +204 -0
  37. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/turn_context_builder.py +67 -9
  38. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/__init__.py +12 -0
  39. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/infrastructure/infrastructure.py +218 -12
  40. flare_kernel-0.2.3/src/flare_kernel/runtime/infrastructure/source_library_persistence.py +289 -0
  41. flare_kernel-0.2.3/src/flare_kernel/runtime/infrastructure/source_text_extractor.py +163 -0
  42. flare_kernel-0.2.3/src/flare_kernel/runtime/infrastructure/sourcing_persistence.py +286 -0
  43. flare_kernel-0.2.3/src/flare_kernel/runtime/infrastructure/sourcing_provider.py +468 -0
  44. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/analysis_router_runtime.py +48 -0
  45. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/canonical_mode_runtime.py +344 -0
  46. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/decision_engine_mode_flags.py +200 -0
  47. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_plan.py +292 -0
  48. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_stage.py +136 -0
  49. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement.py +331 -0
  50. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_context.py +114 -0
  51. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_helpers.py +271 -0
  52. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_requirement_payloads.py +259 -0
  53. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_sourcing.py +265 -0
  54. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/mode_orchestration_sourcing_stage.py +104 -0
  55. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/orchestration/mode_runtime.py +52 -5
  56. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/source_ingestion_runtime.py +340 -0
  57. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/source_ingestion_runtime_artifacts.py +392 -0
  58. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/sourcing_search_runtime.py +257 -0
  59. flare_kernel-0.2.3/src/flare_kernel/runtime/orchestration/ssot_mode_runtime.py +31 -0
  60. flare_kernel-0.2.3/src/flare_kernel/runtime/session/checkpoint_store_sql.py +98 -0
  61. flare_kernel-0.2.3/src/flare_kernel/runtime/session/intake_session_store_query.py +40 -0
  62. flare_kernel-0.2.3/src/flare_kernel/runtime/tests/test_mode_runtime_fallback.py +63 -0
  63. flare_kernel-0.2.3/src/flare_kernel/session_store.py +312 -0
  64. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel.egg-info/PKG-INFO +3 -1
  65. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel.egg-info/SOURCES.txt +51 -0
  66. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel.egg-info/requires.txt +2 -0
  67. flare_kernel-0.2.3/tests/test_analysis_route_projection.py +123 -0
  68. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_infrastructure_knowledge.py +91 -0
  69. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_mode_resolution.py +51 -0
  70. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_payload_enrichment.py +87 -1
  71. flare_kernel-0.2.3/tests/test_project_api.py +23 -0
  72. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_retrieval_projection.py +39 -0
  73. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_retrieval_query_builder.py +42 -0
  74. flare_kernel-0.2.3/tests/test_session_api.py +73 -0
  75. flare_kernel-0.2.3/tests/test_source_ingestion_runtime.py +66 -0
  76. flare_kernel-0.2.3/tests/test_source_ingestion_ssot_acceptance.py +79 -0
  77. flare_kernel-0.2.3/tests/test_source_library.py +178 -0
  78. flare_kernel-0.2.3/tests/test_source_library_persistence_scope.py +41 -0
  79. flare_kernel-0.2.3/tests/test_source_text_extractor.py +108 -0
  80. flare_kernel-0.2.3/tests/test_sourcing_provider.py +175 -0
  81. flare_kernel-0.2.3/tests/test_sourcing_search_runtime.py +185 -0
  82. flare_kernel-0.2.3/tests/test_ssot_mode_runtime.py +102 -0
  83. flare_kernel-0.2.2/src/flare_kernel/app.py +0 -27
  84. flare_kernel-0.2.2/src/flare_kernel/contracts/__init__.py +0 -23
  85. flare_kernel-0.2.2/src/flare_kernel/router/retrieval/retrieval_projection.py +0 -69
  86. flare_kernel-0.2.2/src/flare_kernel/router/retrieval/retrieval_search.py +0 -47
  87. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/README.md +0 -0
  88. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/setup.cfg +0 -0
  89. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/__init__.py +0 -0
  90. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/main.py +0 -0
  91. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/action_payload.py +0 -0
  92. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/__init__.py +0 -0
  93. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_analysis.py +0 -0
  94. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_builder.py +0 -0
  95. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_checkpoint.py +0 -0
  96. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_context.py +0 -0
  97. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_context_analysis.py +0 -0
  98. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_context_inputs.py +0 -0
  99. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_context_session.py +0 -0
  100. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_flow.py +0 -0
  101. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_payload.py +0 -0
  102. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/canonical/canonical_state_projection.py +0 -0
  103. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/completion_response_builder.py +0 -0
  104. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/completion_selection.py +0 -0
  105. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/endpoint_context.py +0 -0
  106. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/guided_completion.py +0 -0
  107. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/__init__.py +0 -0
  108. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_amount_quantity.py +0 -0
  109. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_answer.py +0 -0
  110. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_authority.py +0 -0
  111. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_authority_checkpoint.py +0 -0
  112. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_authority_hydration.py +0 -0
  113. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_authority_session.py +0 -0
  114. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_canonicalization.py +0 -0
  115. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_clarification.py +0 -0
  116. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_decision_rules.py +0 -0
  117. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_deployment_delivery.py +0 -0
  118. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_entry_policy.py +0 -0
  119. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_extraction.py +0 -0
  120. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_extraction_extractors.py +0 -0
  121. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_extraction_merge.py +0 -0
  122. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_field_projection.py +0 -0
  123. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_field_projection_entity.py +0 -0
  124. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_field_projection_payload.py +0 -0
  125. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_field_projection_source.py +0 -0
  126. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_field_scope.py +0 -0
  127. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_guided_confirmed_updates.py +0 -0
  128. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_guided_flags.py +0 -0
  129. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_guided_followup.py +0 -0
  130. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_guided_followup_work_item.py +0 -0
  131. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_guided_open_fields.py +0 -0
  132. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_guided_status.py +0 -0
  133. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_guided_summary.py +0 -0
  134. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_inputs.py +0 -0
  135. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_node_state.py +0 -0
  136. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_numeric.py +0 -0
  137. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_payload_updates.py +0 -0
  138. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_readiness.py +0 -0
  139. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_state_persistence.py +0 -0
  140. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_status.py +0 -0
  141. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_status_chooser_stage.py +0 -0
  142. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_status_guided_session.py +0 -0
  143. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_status_projection.py +0 -0
  144. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_status_schema.py +0 -0
  145. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intake/intake_workflow_checkpoint.py +0 -0
  146. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/__init__.py +0 -0
  147. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/compat_aliases.py +0 -0
  148. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/intent_classifier_utils.py +0 -0
  149. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/intent_escalation_override.py +0 -0
  150. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/intent_escalation_pipeline.py +0 -0
  151. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/intent_escalation_signal.py +0 -0
  152. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/intent_routing.py +0 -0
  153. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/session_intent.py +0 -0
  154. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/session_intent_fields.py +0 -0
  155. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/intent/session_intent_small_talk.py +0 -0
  156. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel.py +0 -0
  157. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports.py +0 -0
  158. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports_parts/__init__.py +0 -0
  159. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports_parts/constants.py +0 -0
  160. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports_parts/domain.py +0 -0
  161. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports_parts/endpoint.py +0 -0
  162. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports_parts/facade.py +0 -0
  163. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports_parts/router_flow.py +0 -0
  164. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_compat_exports_parts/runtime.py +0 -0
  165. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_constants.py +0 -0
  166. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_constants_intake.py +0 -0
  167. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_constants_intent.py +0 -0
  168. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_constants_patch.py +0 -0
  169. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_endpoint_handlers.py +0 -0
  170. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_endpoint_handlers_health.py +0 -0
  171. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_endpoint_handlers_knowledge.py +0 -0
  172. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_endpoint_handlers_turn.py +0 -0
  173. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_canonical_state.py +0 -0
  174. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_canonical_wrapper.py +0 -0
  175. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_helpers.py +0 -0
  176. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_payload_enrichment.py +0 -0
  177. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_payload_wrapper.py +0 -0
  178. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_facade_utils.py +0 -0
  179. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_intent_query_flow.py +0 -0
  180. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_request_flow.py +0 -0
  181. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_route_action.py +0 -0
  182. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_route_execution.py +0 -0
  183. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_route_run.py +0 -0
  184. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_route_stream.py +0 -0
  185. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/kernel_session_intent_flow.py +0 -0
  186. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/mode_switch.py +0 -0
  187. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/next_actions_guard.py +0 -0
  188. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/__init__.py +0 -0
  189. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_checkpoint_state.py +0 -0
  190. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_followup_state.py +0 -0
  191. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_context.py +0 -0
  192. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_context_helpers.py +0 -0
  193. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_decision.py +0 -0
  194. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_result.py +0 -0
  195. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_runtime_state.py +0 -0
  196. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state.py +0 -0
  197. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_context.py +0 -0
  198. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_decision.py +0 -0
  199. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_entry.py +0 -0
  200. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_flow.py +0 -0
  201. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_followup.py +0 -0
  202. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_intent.py +0 -0
  203. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_node.py +0 -0
  204. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_payload.py +0 -0
  205. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_status_state_unpack.py +0 -0
  206. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_trace.py +0 -0
  207. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_trace_projection.py +0 -0
  208. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/orchestration/orchestration_trace_steps.py +0 -0
  209. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/patch_contract.py +0 -0
  210. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/payload_enrichment.py +0 -0
  211. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/prompting.py +0 -0
  212. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/request_identity.py +0 -0
  213. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/request_intent_resolution.py +0 -0
  214. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/retrieval/__init__.py +0 -0
  215. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/retrieval/retrieval_aliases.py +0 -0
  216. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/retrieval/retrieval_field_queries.py +0 -0
  217. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/__init__.py +0 -0
  218. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_draft_completion.py +0 -0
  219. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_draft_finalize.py +0 -0
  220. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_draft_phase.py +0 -0
  221. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_draft_phase_timing.py +0 -0
  222. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_draft_post_completion.py +0 -0
  223. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_draft_prologue.py +0 -0
  224. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_event_emitter.py +0 -0
  225. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_intake_phase.py +0 -0
  226. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_mode_event_payload.py +0 -0
  227. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_mode_events.py +0 -0
  228. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_response_bootstrap.py +0 -0
  229. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_response_builder.py +0 -0
  230. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_response_builder_transport.py +0 -0
  231. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_response_phases.py +0 -0
  232. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_response_runtime.py +0 -0
  233. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_retrieval_phase.py +0 -0
  234. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/streaming/streaming_runtime_steps.py +0 -0
  235. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/router/text_safety.py +0 -0
  236. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/domain/__init__.py +0 -0
  237. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/domain/domain_pack_loader.py +0 -0
  238. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/domain/profile_resolution.py +0 -0
  239. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/execution/__init__.py +0 -0
  240. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/execution/agent_runtime.py +0 -0
  241. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/execution/skill_runtime.py +0 -0
  242. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/infrastructure/__init__.py +0 -0
  243. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/infrastructure/logging.py +0 -0
  244. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/infrastructure/trace.py +0 -0
  245. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/intent/__init__.py +0 -0
  246. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/intent/intent_and_escalation/__init__.py +0 -0
  247. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/intent/intent_and_escalation/decision.py +0 -0
  248. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/intent/intent_and_escalation/lexicon.py +0 -0
  249. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/intent/intent_and_escalation/preprocessing.py +0 -0
  250. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/intent/intent_and_escalation/signals.py +0 -0
  251. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/intent/intent_and_escalation_classifier.py +0 -0
  252. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/llm/__init__.py +0 -0
  253. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/llm/llm_provider.py +0 -0
  254. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/llm/model_router.py +0 -0
  255. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/orchestration/__init__.py +0 -0
  256. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/orchestration/canvas_sourcing_contract.py +0 -0
  257. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/orchestration/decision_engine.py +0 -0
  258. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/orchestration/mode_orchestration.py +0 -0
  259. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/orchestration/sourcing_event_payloads.py +0 -0
  260. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/__init__.py +0 -0
  261. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning.py +0 -0
  262. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_branching.py +0 -0
  263. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_branching_policy.py +0 -0
  264. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_context.py +0 -0
  265. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_hypothesis.py +0 -0
  266. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_planning.py +0 -0
  267. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_priority.py +0 -0
  268. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_question_extraction.py +0 -0
  269. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_readiness.py +0 -0
  270. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/reasoning/intake_reasoning_shared.py +0 -0
  271. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/session/__init__.py +0 -0
  272. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/session/checkpoint_manager.py +0 -0
  273. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/session/intake_session_store.py +0 -0
  274. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/session/models.py +0 -0
  275. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/tests/test_checkpoint_manager.py +0 -0
  276. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/tests/test_intake_reasoning.py +0 -0
  277. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/tests/test_intake_reasoning_split.py +0 -0
  278. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/tests/test_intake_session_store.py +0 -0
  279. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel/runtime/tests/test_kernel_runtime.py +0 -0
  280. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel.egg-info/dependency_links.txt +0 -0
  281. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/src/flare_kernel.egg-info/top_level.txt +0 -0
  282. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_action_payload.py +0 -0
  283. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_basics.py +0 -0
  284. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_builder_split_modules.py +0 -0
  285. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_business_hardcode_guard.py +0 -0
  286. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_canonical_state_context_analysis.py +0 -0
  287. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_canonical_state_context_inputs.py +0 -0
  288. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_canonical_state_context_session.py +0 -0
  289. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_canonical_state_flow.py +0 -0
  290. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_canonical_state_payload.py +0 -0
  291. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_canonical_state_projection.py +0 -0
  292. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_canvas_sourcing_contract_meta.py +0 -0
  293. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_compat_aliases.py +0 -0
  294. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_completion_response_builder.py +0 -0
  295. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_completion_selection.py +0 -0
  296. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_decision_engine.py +0 -0
  297. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_domain_pack_loader.py +0 -0
  298. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_endpoint_context.py +0 -0
  299. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_flare_v1_patch_contract.py +0 -0
  300. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_guided_completion.py +0 -0
  301. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_infrastructure_helpers.py +0 -0
  302. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_amount_quantity.py +0 -0
  303. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_answer.py +0 -0
  304. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_authority.py +0 -0
  305. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_authority_checkpoint.py +0 -0
  306. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_authority_hydration.py +0 -0
  307. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_authority_session.py +0 -0
  308. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_canonicalization.py +0 -0
  309. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_clarification.py +0 -0
  310. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_decision_rules.py +0 -0
  311. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_deployment_delivery.py +0 -0
  312. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_entry_policy.py +0 -0
  313. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_extraction.py +0 -0
  314. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_extraction_extractors.py +0 -0
  315. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_extraction_merge.py +0 -0
  316. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_field_projection.py +0 -0
  317. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_field_projection_entity.py +0 -0
  318. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_field_projection_payload.py +0 -0
  319. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_field_projection_source.py +0 -0
  320. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_field_scope.py +0 -0
  321. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_guided_confirmed_updates.py +0 -0
  322. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_guided_flags.py +0 -0
  323. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_guided_followup.py +0 -0
  324. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_guided_followup_work_item.py +0 -0
  325. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_guided_open_fields.py +0 -0
  326. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_guided_status.py +0 -0
  327. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_guided_summary.py +0 -0
  328. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_inputs.py +0 -0
  329. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_node_state.py +0 -0
  330. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_numeric.py +0 -0
  331. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_payload_updates.py +0 -0
  332. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_readiness.py +0 -0
  333. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_reasoning_priority.py +0 -0
  334. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_state_persistence.py +0 -0
  335. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_status.py +0 -0
  336. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_status_guided_session.py +0 -0
  337. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_status_projection.py +0 -0
  338. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_status_schema.py +0 -0
  339. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_status_stage.py +0 -0
  340. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intake_workflow_checkpoint.py +0 -0
  341. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_classifier_utils.py +0 -0
  342. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_escalation_classifier.py +0 -0
  343. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_escalation_override.py +0 -0
  344. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_escalation_pipeline.py +0 -0
  345. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_escalation_signal.py +0 -0
  346. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_resolution.py +0 -0
  347. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_retrieval.py +0 -0
  348. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_routing.py +0 -0
  349. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_intent_type_compat_aliases.py +0 -0
  350. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_alias_delegation.py +0 -0
  351. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_endpoint_handlers.py +0 -0
  352. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_facade_helpers.py +0 -0
  353. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_facade_turn_context.py +0 -0
  354. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_intent_query_flow.py +0 -0
  355. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_mode_flow.py +0 -0
  356. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_route_execution_wrappers.py +0 -0
  357. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_kernel_session_intent_flow.py +0 -0
  358. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_llm_provider.py +0 -0
  359. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_mode_orchestration_state_bridge.py +0 -0
  360. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_mode_switch.py +0 -0
  361. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_model_router.py +0 -0
  362. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_new_flow_guard.py +0 -0
  363. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_checkpoint_state.py +0 -0
  364. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_followup_state.py +0 -0
  365. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_context.py +0 -0
  366. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_context_helpers.py +0 -0
  367. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_decision.py +0 -0
  368. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_projection.py +0 -0
  369. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_result.py +0 -0
  370. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_runtime_state.py +0 -0
  371. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_context.py +0 -0
  372. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_decision.py +0 -0
  373. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_entry.py +0 -0
  374. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_followup.py +0 -0
  375. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_intent.py +0 -0
  376. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_node.py +0 -0
  377. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_payload.py +0 -0
  378. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_status_state_unpack.py +0 -0
  379. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_trace.py +0 -0
  380. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_trace_projection.py +0 -0
  381. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_orchestration_trace_steps.py +0 -0
  382. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_patch_contract.py +0 -0
  383. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_request_identity.py +0 -0
  384. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_request_intent_resolution.py +0 -0
  385. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_retrieval_aliases.py +0 -0
  386. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_retrieval_field_queries.py +0 -0
  387. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_retrieval_search.py +0 -0
  388. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_session_intent.py +0 -0
  389. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_session_intent_fields.py +0 -0
  390. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_session_intent_small_talk.py +0 -0
  391. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_draft_completion.py +0 -0
  392. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_draft_finalize.py +0 -0
  393. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_draft_phase.py +0 -0
  394. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_draft_post_completion.py +0 -0
  395. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_draft_prologue.py +0 -0
  396. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_event_emitter.py +0 -0
  397. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_intake_phase.py +0 -0
  398. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_mode_event_payload.py +0 -0
  399. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_mode_events.py +0 -0
  400. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_response_bootstrap.py +0 -0
  401. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_response_phases.py +0 -0
  402. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_response_runtime.py +0 -0
  403. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_retrieval_phase.py +0 -0
  404. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_streaming_runtime_steps.py +0 -0
  405. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_text_safety.py +0 -0
  406. {flare_kernel-0.2.2 → flare_kernel-0.2.3}/tests/test_turn_context_builder.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flare-kernel
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: FLARE kernel runtime package
5
5
  License: Proprietary
6
6
  Classifier: Development Status :: 3 - Alpha
@@ -10,7 +10,9 @@ Requires-Python: >=3.11
10
10
  Description-Content-Type: text/markdown
11
11
  Requires-Dist: flare-engines<0.3.0,>=0.2.0
12
12
  Requires-Dist: fastapi<1.0,>=0.115
13
+ Requires-Dist: python-multipart<1.0,>=0.0.9
13
14
  Requires-Dist: pydantic<3,>=2
15
+ Requires-Dist: pypdf<6,>=4
14
16
  Requires-Dist: uvicorn<1.0,>=0.30
15
17
  Requires-Dist: httpx<1.0,>=0.27
16
18
  Requires-Dist: sqlalchemy<3,>=2
@@ -4,14 +4,16 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flare-kernel"
7
- version = "0.2.2"
7
+ version = "0.2.3"
8
8
  description = "FLARE kernel runtime package"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  dependencies = [
12
12
  "flare-engines>=0.2.0,<0.3.0",
13
13
  "fastapi>=0.115,<1.0",
14
+ "python-multipart>=0.0.9,<1.0",
14
15
  "pydantic>=2,<3",
16
+ "pypdf>=4,<6",
15
17
  "uvicorn>=0.30,<1.0",
16
18
  "httpx>=0.27,<1.0",
17
19
  "sqlalchemy>=2,<3",
@@ -0,0 +1,39 @@
1
+ """FastAPI app factory for flare-kernel."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from fastapi import FastAPI, HTTPException
6
+ from fastapi.middleware.cors import CORSMiddleware
7
+
8
+ from flare_kernel.router.api_errors import (
9
+ ApiError,
10
+ api_error_exception_handler,
11
+ http_exception_handler,
12
+ unhandled_exception_handler,
13
+ )
14
+ from flare_kernel.router import kernel_router, project_api_router, session_api_router, source_library_router
15
+
16
+
17
+ def create_app() -> FastAPI:
18
+ app = FastAPI(
19
+ title="FLARE Kernel",
20
+ version="0.1.0",
21
+ description="FLARE kernel minimal runtime",
22
+ )
23
+
24
+ app.add_middleware(
25
+ CORSMiddleware,
26
+ allow_origins=["*"],
27
+ allow_credentials=True,
28
+ allow_methods=["*"],
29
+ allow_headers=["*"],
30
+ )
31
+
32
+ app.include_router(kernel_router)
33
+ app.include_router(project_api_router)
34
+ app.include_router(session_api_router)
35
+ app.include_router(source_library_router)
36
+ app.add_exception_handler(ApiError, api_error_exception_handler)
37
+ app.add_exception_handler(HTTPException, http_exception_handler)
38
+ app.add_exception_handler(Exception, unhandled_exception_handler)
39
+ return app
@@ -0,0 +1,78 @@
1
+ """Kernel contracts."""
2
+
3
+ from flare_kernel.contracts.context import (
4
+ ContextAnalysisResult,
5
+ ContextContract,
6
+ ContextEvidenceItem,
7
+ ContextSourcingResult,
8
+ create_empty_context,
9
+ )
10
+ from flare_kernel.contracts.kernel_contract import (
11
+ AnalysisRouteDecision,
12
+ DeleteProjectSourceResponse,
13
+ HealthResponse,
14
+ IntentSuggestResponse,
15
+ KernelRequest,
16
+ KernelResponse,
17
+ KnowledgeIngestRequest,
18
+ KnowledgeIngestResponse,
19
+ KnowledgeSearchRequest,
20
+ KnowledgeSearchResponse,
21
+ ProjectSourceRecord,
22
+ ProjectSourcesResponse,
23
+ ProjectSourceUploadResponse,
24
+ SourcingSearchRequest,
25
+ SourcingSearchResponse,
26
+ )
27
+ from flare_kernel.contracts.mode import Mode, ModeHandler, mode_handlers, run_mode
28
+ from flare_kernel.contracts.project_contract import (
29
+ ProjectRecord,
30
+ ProjectsResponse,
31
+ ProjectUpsertRequest,
32
+ )
33
+ from flare_kernel.contracts.session_contract import (
34
+ SessionAppendExchangeRequest,
35
+ SessionCreateRequest,
36
+ SessionListResponse,
37
+ SessionMessageListResponse,
38
+ SessionMessageRecord,
39
+ SessionRecord,
40
+ SessionUpdateRequest,
41
+ )
42
+
43
+ __all__ = [
44
+ "KernelRequest",
45
+ "KernelResponse",
46
+ "AnalysisRouteDecision",
47
+ "HealthResponse",
48
+ "IntentSuggestResponse",
49
+ "ProjectSourceRecord",
50
+ "ProjectSourceUploadResponse",
51
+ "ProjectSourcesResponse",
52
+ "DeleteProjectSourceResponse",
53
+ "KnowledgeIngestRequest",
54
+ "KnowledgeIngestResponse",
55
+ "KnowledgeSearchRequest",
56
+ "KnowledgeSearchResponse",
57
+ "SourcingSearchRequest",
58
+ "SourcingSearchResponse",
59
+ "ContextContract",
60
+ "ContextAnalysisResult",
61
+ "ContextEvidenceItem",
62
+ "ContextSourcingResult",
63
+ "create_empty_context",
64
+ "Mode",
65
+ "ModeHandler",
66
+ "mode_handlers",
67
+ "run_mode",
68
+ "ProjectRecord",
69
+ "ProjectUpsertRequest",
70
+ "ProjectsResponse",
71
+ "SessionRecord",
72
+ "SessionCreateRequest",
73
+ "SessionUpdateRequest",
74
+ "SessionListResponse",
75
+ "SessionMessageRecord",
76
+ "SessionMessageListResponse",
77
+ "SessionAppendExchangeRequest",
78
+ ]
@@ -0,0 +1,42 @@
1
+ """Canonical context contract for kernel orchestration."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+
10
+ class ContextEvidenceItem(BaseModel):
11
+ id: str
12
+ source: str
13
+ snippet: str = ""
14
+ meta: dict[str, Any] = Field(default_factory=dict)
15
+
16
+
17
+ class ContextSourcingResult(BaseModel):
18
+ round: int
19
+ items: list[dict[str, Any]] = Field(default_factory=list)
20
+ timestamp: str
21
+
22
+
23
+ class ContextAnalysisResult(BaseModel):
24
+ version: int
25
+ payload: dict[str, Any] = Field(default_factory=dict)
26
+ timestamp: str
27
+
28
+
29
+ class ContextContract(BaseModel):
30
+ context_revision_id: str = ""
31
+ confirmed_fields: dict[str, Any] = Field(default_factory=dict)
32
+ missing_fields: list[str] = Field(default_factory=list)
33
+ notes: list[str] = Field(default_factory=list)
34
+ evidence: list[ContextEvidenceItem] = Field(default_factory=list)
35
+ sourcing_results: list[ContextSourcingResult] = Field(default_factory=list)
36
+ analysis_results: list[ContextAnalysisResult] = Field(default_factory=list)
37
+ rank_profile: dict[str, Any] = Field(default_factory=dict)
38
+ rank_feedback_log: list[dict[str, Any]] = Field(default_factory=list)
39
+
40
+
41
+ def create_empty_context() -> ContextContract:
42
+ return ContextContract()
@@ -57,6 +57,8 @@ class KernelRequest(BaseModel):
57
57
  canvas_config: dict[str, Any] = Field(default_factory=dict)
58
58
  plan_config: dict[str, Any] = Field(default_factory=dict)
59
59
  payload: dict[str, Any] = Field(default_factory=dict)
60
+ entities: list[dict[str, Any] | str] = Field(default_factory=list)
61
+ entity_query_mode: Literal["off", "prefer", "only"] = "prefer"
60
62
  context_refs: list[Any] = Field(default_factory=list)
61
63
  knowledge_refs: list[str] = Field(default_factory=list)
62
64
  action_key: str | None = None
@@ -69,11 +71,19 @@ class KernelRequest(BaseModel):
69
71
  field_value: IntakeFieldValue | None = None
70
72
 
71
73
 
74
+ class AnalysisRouteDecision(BaseModel):
75
+ analysis_type: Literal["requirement", "sourcing"] = "requirement"
76
+ template_id: str = "analysis_requirement_default"
77
+ reason_codes: list[str] = Field(default_factory=list)
78
+ confidence: float = 0.0
79
+
80
+
72
81
  class KernelResponse(BaseModel):
73
82
  trace_id: str
74
83
  state: Literal["RUNNING", "SUCCEEDED", "FAILED"]
75
84
  events: list[dict[str, Any]] = Field(default_factory=list)
76
85
  result: dict[str, Any] = Field(default_factory=dict)
86
+ analysis_route: AnalysisRouteDecision | None = None
77
87
  next_actions: list[dict[str, Any]] = Field(default_factory=list)
78
88
 
79
89
 
@@ -128,9 +138,82 @@ class KnowledgeSearchResponse(BaseModel):
128
138
  results: list[dict[str, Any]] = Field(default_factory=list)
129
139
 
130
140
 
141
+ class SourcingSearchRequest(BaseModel):
142
+ project_id: str = "default"
143
+ user_id: str = "default"
144
+ session_id: str = "default"
145
+ query: str
146
+ top_k: int = 8
147
+ append_mode: bool = False
148
+ lock_existing_order: bool = True
149
+ base_result_ids: list[str] = Field(default_factory=list)
150
+ source_scope: Literal["local", "web", "hybrid"] = "hybrid"
151
+ sourcing_enabled: bool = False
152
+ context_refs: list[Any] = Field(default_factory=list)
153
+ knowledge_refs: list[str] = Field(default_factory=list)
154
+ source_ids: list[str] = Field(default_factory=list)
155
+ entities: list[dict[str, Any] | str] = Field(default_factory=list)
156
+ entity_query_mode: Literal["off", "prefer", "only"] = "prefer"
157
+
158
+
159
+ class SourcingSearchResponse(BaseModel):
160
+ trace_id: str
161
+ retrieval_run_id: str
162
+ project_id: str
163
+ user_id: str
164
+ session_id: str
165
+ query: str
166
+ effective_query: str = ""
167
+ intent: str = ""
168
+ source_scope: Literal["local", "web", "hybrid"]
169
+ sourcing_enabled: bool
170
+ requested_top_k: int = 8
171
+ returned_count: int = 0
172
+ has_more: bool = False
173
+ next_top_k: int = 8
174
+ source_breakdown: dict[str, int] = Field(default_factory=dict)
175
+ new_results: list[dict[str, Any]] = Field(default_factory=list)
176
+ all_results: list[dict[str, Any]] = Field(default_factory=list)
177
+ results: list[dict[str, Any]] = Field(default_factory=list)
178
+ shortlist: list[dict[str, Any]] = Field(default_factory=list)
179
+ blocked: bool = False
180
+ reason: str = ""
181
+
182
+
131
183
  class IntentSuggestResponse(BaseModel):
132
184
  trace_id: str
133
185
  suggested_mode: str
134
186
  confidence: float = 0.0
135
187
  reason: str = ""
136
188
  source: Literal["intent_override", "manual", "current", "llm", "keywords", "fallback"] = "fallback"
189
+
190
+
191
+ class ProjectSourceRecord(BaseModel):
192
+ id: str
193
+ source_id: str
194
+ project_id: str
195
+ user_id: str
196
+ session_id: str | None = None
197
+ scope: str = "project"
198
+ source: str = "local_upload"
199
+ filename: str
200
+ mime_type: str = ""
201
+ size: int | None = None
202
+ status: Literal["uploaded", "parsing", "chunked", "embedded", "indexed", "ready", "failed"] = "uploaded"
203
+ error_code: str | None = None
204
+ error_message: str = ""
205
+ created_at: str
206
+ updated_at: str
207
+ persisted_to_project: bool = True
208
+
209
+
210
+ class ProjectSourceUploadResponse(BaseModel):
211
+ data: ProjectSourceRecord
212
+
213
+
214
+ class ProjectSourcesResponse(BaseModel):
215
+ sources: list[ProjectSourceRecord] = Field(default_factory=list)
216
+
217
+
218
+ class DeleteProjectSourceResponse(BaseModel):
219
+ ok: bool = True
@@ -0,0 +1,32 @@
1
+ """Canonical mode contract and dispatch for kernel orchestration."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Callable, Literal
6
+
7
+ from flare_kernel.contracts.context import ContextContract
8
+
9
+ Mode = Literal["plan", "sourcing", "analysis"]
10
+ ModeHandler = Callable[[ContextContract, dict[str, Any]], ContextContract]
11
+
12
+
13
+ def _missing_handler(_context: ContextContract, _payload: dict[str, Any]) -> ContextContract:
14
+ raise ValueError("mode handler not implemented")
15
+
16
+
17
+ mode_handlers: dict[Mode, ModeHandler] = {
18
+ "plan": _missing_handler,
19
+ "sourcing": _missing_handler,
20
+ "analysis": _missing_handler,
21
+ }
22
+
23
+
24
+ def run_mode(
25
+ mode: Mode,
26
+ handlers: dict[Mode, ModeHandler],
27
+ context: ContextContract,
28
+ payload: dict[str, Any] | None = None,
29
+ ) -> ContextContract:
30
+ if mode not in handlers:
31
+ raise ValueError(f"unsupported mode: {mode}")
32
+ return handlers[mode](context, payload or {})
@@ -0,0 +1,24 @@
1
+ """Project API contracts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+
8
+ class ProjectRecord(BaseModel):
9
+ project_id: str
10
+ project_name: str
11
+ status: str = "active"
12
+ session_count: int = 0
13
+ created_at: str | None = None
14
+ updated_at: str | None = None
15
+ latest_updated_at: str | None = None
16
+
17
+
18
+ class ProjectUpsertRequest(BaseModel):
19
+ project_name: str | None = None
20
+ status: str = "active"
21
+
22
+
23
+ class ProjectsResponse(BaseModel):
24
+ projects: list[ProjectRecord] = Field(default_factory=list)
@@ -0,0 +1,76 @@
1
+ """Session API contracts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Literal
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+
10
+ class SessionRecord(BaseModel):
11
+ session_id: str
12
+ project_id: str | None = None
13
+ title: str
14
+ preview: str = ""
15
+ title_source: Literal["default", "auto", "manual"] = "default"
16
+ status: str = "active"
17
+ user_id: str | None = None
18
+ function_type: str | None = None
19
+ created_at: str
20
+ updated_at: str
21
+
22
+
23
+ class SessionCreateRequest(BaseModel):
24
+ function_type: str | None = None
25
+ project_id: str | None = None
26
+ title: str | None = None
27
+ user_id: str | None = None
28
+
29
+
30
+ class SessionUpdateRequest(BaseModel):
31
+ function_type: str | None = None
32
+ status: str | None = None
33
+ title: str | None = None
34
+ preview: str | None = None
35
+ title_source: Literal["default", "auto", "manual"] | None = None
36
+
37
+
38
+ class SessionListResponse(BaseModel):
39
+ sessions: list[SessionRecord] = Field(default_factory=list)
40
+
41
+
42
+ class SessionMessageRecord(BaseModel):
43
+ message_id: str
44
+ session_id: str
45
+ role: str
46
+ content: str
47
+ attachments: list[dict[str, Any]] = Field(default_factory=list)
48
+ context_refs: list[dict[str, Any]] = Field(default_factory=list)
49
+ knowledge_refs: list[dict[str, Any]] = Field(default_factory=list)
50
+ agent_status: dict[str, Any] | None = None
51
+ thinking_trace: str = ""
52
+ execution_trace: dict[str, Any] | None = None
53
+ knowledge_search: dict[str, Any] | None = None
54
+ sourcing_candidates: dict[str, Any] | None = None
55
+ knowledge_citation: dict[str, Any] | None = None
56
+ context_usage: dict[str, Any] | None = None
57
+ created_at: str
58
+
59
+
60
+ class SessionMessageListResponse(BaseModel):
61
+ messages: list[SessionMessageRecord] = Field(default_factory=list)
62
+
63
+
64
+ class SessionAppendExchangeRequest(BaseModel):
65
+ user_message: str = ""
66
+ assistant_message: str = ""
67
+ attachments: list[dict[str, Any]] = Field(default_factory=list)
68
+ context_refs: list[dict[str, Any]] = Field(default_factory=list)
69
+ knowledge_refs: list[dict[str, Any]] = Field(default_factory=list)
70
+ agent_status: dict[str, Any] | None = None
71
+ thinking_trace: str = ""
72
+ execution_trace: dict[str, Any] | None = None
73
+ knowledge_search: dict[str, Any] | None = None
74
+ sourcing_candidates: dict[str, Any] | None = None
75
+ knowledge_citation: dict[str, Any] | None = None
76
+ context_usage: dict[str, Any] | None = None
@@ -0,0 +1,84 @@
1
+ """In-process project store for project APIs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import threading
6
+ from datetime import UTC, datetime
7
+ from typing import Any
8
+
9
+ from flare_kernel.session_store import list_sessions
10
+
11
+ _projects: dict[str, dict[str, Any]] = {}
12
+ _lock = threading.Lock()
13
+
14
+
15
+ def _now_iso() -> str:
16
+ return datetime.now(UTC).isoformat()
17
+
18
+
19
+ def _normalize_text(value: Any) -> str:
20
+ return " ".join(str(value or "").split()).strip()
21
+
22
+
23
+ def _build_project_view(record: dict[str, Any]) -> dict[str, Any]:
24
+ project_id = _normalize_text(record.get("project_id"))
25
+ session_rows = list_sessions(project_id=project_id)
26
+ latest_updated_at = ""
27
+ if session_rows:
28
+ latest_updated_at = str(session_rows[0].get("updated_at") or "").strip()
29
+ updated_at = _normalize_text(record.get("updated_at")) or latest_updated_at or _normalize_text(record.get("created_at"))
30
+ return {
31
+ "project_id": project_id,
32
+ "project_name": _normalize_text(record.get("project_name")) or project_id,
33
+ "status": _normalize_text(record.get("status")) or "active",
34
+ "session_count": len(session_rows),
35
+ "created_at": _normalize_text(record.get("created_at")) or None,
36
+ "updated_at": updated_at or None,
37
+ "latest_updated_at": latest_updated_at or updated_at or None,
38
+ }
39
+
40
+
41
+ def list_projects() -> list[dict[str, Any]]:
42
+ with _lock:
43
+ rows = [_build_project_view(item) for item in _projects.values()]
44
+ return sorted(rows, key=lambda item: str(item.get("latest_updated_at") or item.get("updated_at") or ""), reverse=True)
45
+
46
+
47
+ def get_project(*, project_id: str) -> dict[str, Any] | None:
48
+ resolved_project_id = _normalize_text(project_id)
49
+ if not resolved_project_id:
50
+ return None
51
+ with _lock:
52
+ record = _projects.get(resolved_project_id)
53
+ if record is None:
54
+ return None
55
+ return _build_project_view(record)
56
+
57
+
58
+ def upsert_project(*, project_id: str, project_name: str | None, status: str | None = None) -> dict[str, Any]:
59
+ resolved_project_id = _normalize_text(project_id)
60
+ if not resolved_project_id:
61
+ raise ValueError("project_id is required")
62
+
63
+ now = _now_iso()
64
+ with _lock:
65
+ existing = _projects.get(resolved_project_id)
66
+ if existing is None:
67
+ record = {
68
+ "project_id": resolved_project_id,
69
+ "project_name": _normalize_text(project_name) or resolved_project_id,
70
+ "status": _normalize_text(status) or "active",
71
+ "created_at": now,
72
+ "updated_at": now,
73
+ }
74
+ else:
75
+ record = dict(existing)
76
+ next_project_name = _normalize_text(project_name)
77
+ if next_project_name:
78
+ record["project_name"] = next_project_name
79
+ next_status = _normalize_text(status)
80
+ if next_status:
81
+ record["status"] = next_status
82
+ record["updated_at"] = now
83
+ _projects[resolved_project_id] = record
84
+ return _build_project_view(record)
@@ -10,8 +10,11 @@ import importlib
10
10
  import sys
11
11
 
12
12
  from flare_kernel.router.kernel import router as kernel_router
13
+ from flare_kernel.router.project_api import router as project_api_router
14
+ from flare_kernel.router.session_api import router as session_api_router
15
+ from flare_kernel.router.source_library import router as source_library_router
13
16
 
14
- __all__ = ["kernel_router"]
17
+ __all__ = ["kernel_router", "project_api_router", "source_library_router", "session_api_router"]
15
18
 
16
19
 
17
20
  def _resolve_legacy_group(module_name: str) -> str | None:
@@ -0,0 +1,129 @@
1
+ """API error contract helpers for transport-layer responses."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ from typing import Any
7
+
8
+ from fastapi import HTTPException, Request
9
+ from fastapi.responses import JSONResponse
10
+
11
+
12
+ @dataclass(slots=True)
13
+ class ApiError(Exception):
14
+ """Structured API error for transport-layer mapping."""
15
+
16
+ code: str
17
+ http_status: int
18
+ message: str
19
+ description: str = ""
20
+ context_fields: list[str] = field(default_factory=list)
21
+ retryable: bool = False
22
+ details: dict[str, Any] = field(default_factory=dict)
23
+
24
+
25
+ def build_error_response_payload(
26
+ *,
27
+ code: str,
28
+ http_status: int,
29
+ message: str,
30
+ description: str = "",
31
+ context_fields: list[str] | None = None,
32
+ retryable: bool = False,
33
+ details: dict[str, Any] | None = None,
34
+ ) -> dict[str, Any]:
35
+ context_field_list = list(context_fields or [])
36
+ return {
37
+ "error": {
38
+ "code": code,
39
+ "message": message,
40
+ "details": {
41
+ **(details or {}),
42
+ "http_status": http_status,
43
+ "description": description,
44
+ "context_fields": context_field_list,
45
+ "retryable": retryable,
46
+ },
47
+ }
48
+ }
49
+
50
+
51
+ def _default_code_by_status(status_code: int) -> str:
52
+ if status_code == 403:
53
+ return "FORBIDDEN_SCOPE"
54
+ if status_code == 404:
55
+ return "RESOURCE_NOT_FOUND"
56
+ if status_code == 409:
57
+ return "INVALID_STATE_TRANSITION"
58
+ if status_code == 422:
59
+ return "INVALID_REQUEST"
60
+ if status_code == 401:
61
+ return "UNAUTHORIZED"
62
+ return "HTTP_EXCEPTION"
63
+
64
+
65
+ def _default_message_by_status(status_code: int) -> str:
66
+ if status_code == 403:
67
+ return "forbidden scope"
68
+ if status_code == 404:
69
+ return "resource not found"
70
+ if status_code == 409:
71
+ return "invalid state transition"
72
+ if status_code == 422:
73
+ return "invalid request"
74
+ if status_code == 401:
75
+ return "unauthorized"
76
+ return "request failed"
77
+
78
+
79
+ async def api_error_exception_handler(_: Request, exc: ApiError) -> JSONResponse:
80
+ payload = build_error_response_payload(
81
+ code=exc.code,
82
+ http_status=exc.http_status,
83
+ message=exc.message,
84
+ description=exc.description,
85
+ context_fields=exc.context_fields,
86
+ retryable=exc.retryable,
87
+ details=exc.details,
88
+ )
89
+ return JSONResponse(status_code=exc.http_status, content=payload)
90
+
91
+
92
+ async def http_exception_handler(_: Request, exc: HTTPException) -> JSONResponse:
93
+ status_code = int(exc.status_code)
94
+ code = _default_code_by_status(status_code)
95
+ message = _default_message_by_status(status_code)
96
+ details: dict[str, Any] = {}
97
+
98
+ if isinstance(exc.detail, dict):
99
+ maybe_error = exc.detail.get("error")
100
+ if isinstance(maybe_error, dict):
101
+ code = str(maybe_error.get("code") or code)
102
+ message = str(maybe_error.get("message") or message)
103
+ details = maybe_error.get("details") if isinstance(maybe_error.get("details"), dict) else {}
104
+ else:
105
+ code = str(exc.detail.get("code") or code)
106
+ message = str(exc.detail.get("message") or message)
107
+ details = exc.detail.get("details") if isinstance(exc.detail.get("details"), dict) else {}
108
+ elif isinstance(exc.detail, str) and exc.detail.strip():
109
+ message = exc.detail.strip()
110
+
111
+ payload = build_error_response_payload(
112
+ code=code,
113
+ http_status=status_code,
114
+ message=message,
115
+ details=details,
116
+ )
117
+ return JSONResponse(status_code=status_code, content=payload)
118
+
119
+
120
+ async def unhandled_exception_handler(_: Request, __: Exception) -> JSONResponse:
121
+ payload = build_error_response_payload(
122
+ code="INTERNAL_ERROR",
123
+ http_status=500,
124
+ message="internal server error",
125
+ description="unexpected server exception",
126
+ retryable=False,
127
+ )
128
+ return JSONResponse(status_code=500, content=payload)
129
+
@@ -89,6 +89,9 @@ def search_knowledge_by_queries(
89
89
  queries: list[str],
90
90
  top_k: int,
91
91
  min_score: float,
92
+ source_ids: list[str] | None = None,
93
+ entities: list[dict[str, Any] | str] | None = None,
94
+ entity_query_mode: str = "prefer",
92
95
  ) -> list[dict[str, Any]]:
93
96
  return search_knowledge_by_queries_from_router(
94
97
  trace_id=trace_id,
@@ -97,5 +100,8 @@ def search_knowledge_by_queries(
97
100
  queries=queries,
98
101
  top_k=top_k,
99
102
  min_score=min_score,
103
+ source_ids=source_ids,
104
+ entities=entities,
105
+ entity_query_mode=entity_query_mode,
100
106
  search_knowledge_records_fn=search_knowledge_records,
101
107
  )