flare-kernel 0.2.5__tar.gz → 0.2.7__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 (480) hide show
  1. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/PKG-INFO +1 -1
  2. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/pyproject.toml +1 -1
  3. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/contracts/__init__.py +8 -0
  4. flare_kernel-0.2.7/src/flare_kernel/contracts/project_memory_contract.py +85 -0
  5. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/dependency_resolution.py +3 -0
  6. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/flow.py +12 -0
  7. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/turn_context.py +5 -0
  8. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_route/run.py +9 -0
  9. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/prompting/context_blocks.py +45 -0
  10. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/prompting/core.py +2 -0
  11. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/draft/completion.py +9 -0
  12. flare_kernel-0.2.7/src/flare_kernel/runtime/infrastructure/project_memory_codec.py +231 -0
  13. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/project_memory_store.py +93 -117
  14. flare_kernel-0.2.7/src/flare_kernel/runtime/project_memory/__init__.py +16 -0
  15. flare_kernel-0.2.7/src/flare_kernel/runtime/project_memory/extraction.py +273 -0
  16. flare_kernel-0.2.7/src/flare_kernel/runtime/project_memory/recall.py +118 -0
  17. flare_kernel-0.2.7/src/flare_kernel/runtime/project_memory/runtime.py +144 -0
  18. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel.egg-info/PKG-INFO +1 -1
  19. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel.egg-info/SOURCES.txt +7 -0
  20. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_facade_turn_context.py +51 -0
  21. flare_kernel-0.2.7/tests/test_project_memory_runtime.py +149 -0
  22. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_prompting_analysis_instruction.py +21 -0
  23. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/README.md +0 -0
  24. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/setup.cfg +0 -0
  25. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/__init__.py +0 -0
  26. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/app.py +0 -0
  27. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/contracts/context.py +0 -0
  28. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/contracts/kernel_contract.py +0 -0
  29. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/contracts/mode.py +0 -0
  30. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/contracts/project_contract.py +0 -0
  31. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/contracts/session_contract.py +0 -0
  32. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/main.py +0 -0
  33. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/project_store.py +0 -0
  34. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/__init__.py +0 -0
  35. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/api/__init__.py +0 -0
  36. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/api/chat.py +0 -0
  37. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/api/errors.py +0 -0
  38. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/api/project.py +0 -0
  39. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/api/session.py +0 -0
  40. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/__init__.py +0 -0
  41. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/analysis.py +0 -0
  42. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/checkpoint.py +0 -0
  43. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/context/__init__.py +0 -0
  44. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/context/analysis.py +0 -0
  45. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/context/inputs.py +0 -0
  46. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/context/session.py +0 -0
  47. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/contract_support.py +0 -0
  48. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/flow.py +0 -0
  49. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/payload.py +0 -0
  50. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/canonical/projection.py +0 -0
  51. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/completion/__init__.py +0 -0
  52. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/completion/guided.py +0 -0
  53. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/completion/response_builder.py +0 -0
  54. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/completion/selection.py +0 -0
  55. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/context/__init__.py +0 -0
  56. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/context/endpoint.py +0 -0
  57. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/context/sourcing_preview.py +0 -0
  58. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/__init__.py +0 -0
  59. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/amount_quantity.py +0 -0
  60. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/answer.py +0 -0
  61. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/authority/__init__.py +0 -0
  62. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/authority/checkpoint.py +0 -0
  63. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/authority/core.py +0 -0
  64. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/authority/hydration.py +0 -0
  65. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/authority/session.py +0 -0
  66. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/canonicalization.py +0 -0
  67. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/clarification.py +0 -0
  68. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/decision_rules.py +0 -0
  69. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/deployment_delivery.py +0 -0
  70. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/entry_policy.py +0 -0
  71. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/extraction/__init__.py +0 -0
  72. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/extraction/core.py +0 -0
  73. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/extraction/extractors.py +0 -0
  74. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/extraction/merge.py +0 -0
  75. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/field_projection/__init__.py +0 -0
  76. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/field_projection/core.py +0 -0
  77. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/field_projection/entity.py +0 -0
  78. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/field_projection/payload.py +0 -0
  79. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/field_projection/source.py +0 -0
  80. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/field_scope.py +0 -0
  81. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/__init__.py +0 -0
  82. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/confirmed_updates.py +0 -0
  83. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/flags.py +0 -0
  84. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/followup.py +0 -0
  85. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/followup_work_item.py +0 -0
  86. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/open_fields.py +0 -0
  87. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/status.py +0 -0
  88. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/guided/summary.py +0 -0
  89. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/inputs.py +0 -0
  90. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/node_state.py +0 -0
  91. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/numeric.py +0 -0
  92. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/payload_updates.py +0 -0
  93. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/readiness.py +0 -0
  94. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/state_persistence.py +0 -0
  95. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/status/__init__.py +0 -0
  96. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/status/chooser_stage.py +0 -0
  97. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/status/core.py +0 -0
  98. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/status/guided_session.py +0 -0
  99. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/status/projection.py +0 -0
  100. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/status/schema.py +0 -0
  101. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intake/workflow_checkpoint.py +0 -0
  102. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/__init__.py +0 -0
  103. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/classifier_utils.py +0 -0
  104. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/compat_aliases.py +0 -0
  105. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/escalation/__init__.py +0 -0
  106. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/escalation/override.py +0 -0
  107. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/escalation/pipeline.py +0 -0
  108. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/escalation/signal.py +0 -0
  109. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/routing.py +0 -0
  110. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/session_intent/__init__.py +0 -0
  111. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/session_intent/core.py +0 -0
  112. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/session_intent/fields.py +0 -0
  113. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/intent/session_intent/small_talk.py +0 -0
  114. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel.py +0 -0
  115. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_constants/__init__.py +0 -0
  116. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_constants/intake.py +0 -0
  117. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_constants/intent.py +0 -0
  118. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_constants/patch.py +0 -0
  119. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_endpoint_handlers/__init__.py +0 -0
  120. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_endpoint_handlers/health.py +0 -0
  121. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_endpoint_handlers/knowledge.py +0 -0
  122. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_endpoint_handlers/sourcing.py +0 -0
  123. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_endpoint_handlers/turn.py +0 -0
  124. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/__init__.py +0 -0
  125. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/canonical_state.py +0 -0
  126. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/orchestration.py +0 -0
  127. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/payload_enrichment.py +0 -0
  128. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_facade/utils.py +0 -0
  129. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_flow_bindings/__init__.py +0 -0
  130. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_flow_bindings/intent_query.py +0 -0
  131. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_flow_bindings/mode.py +0 -0
  132. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_flow_bindings/session_intent.py +0 -0
  133. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_request_pipeline/__init__.py +0 -0
  134. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_request_pipeline/action.py +0 -0
  135. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_request_pipeline/intake.py +0 -0
  136. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_request_pipeline/intent_query.py +0 -0
  137. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_request_pipeline/intent_signal.py +0 -0
  138. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_route/__init__.py +0 -0
  139. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_route/action.py +0 -0
  140. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_route/execution.py +0 -0
  141. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/kernel_route/stream.py +0 -0
  142. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/mode/__init__.py +0 -0
  143. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/mode/resolution.py +0 -0
  144. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/mode/switch.py +0 -0
  145. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/next_actions_guard.py +0 -0
  146. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/__init__.py +0 -0
  147. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/__init__.py +0 -0
  148. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/actions.py +0 -0
  149. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/builder.py +0 -0
  150. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/checkpoint_state.py +0 -0
  151. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/context.py +0 -0
  152. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/context_helpers.py +0 -0
  153. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/core.py +0 -0
  154. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/decision.py +0 -0
  155. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/followup_state.py +0 -0
  156. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/projection.py +0 -0
  157. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/result.py +0 -0
  158. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/runtime_state.py +0 -0
  159. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/__init__.py +0 -0
  160. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/context.py +0 -0
  161. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/decision.py +0 -0
  162. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/entry.py +0 -0
  163. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/flow.py +0 -0
  164. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/followup.py +0 -0
  165. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/intent.py +0 -0
  166. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/node.py +0 -0
  167. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/payload.py +0 -0
  168. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/status/state/unpack.py +0 -0
  169. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/trace/__init__.py +0 -0
  170. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/trace/core.py +0 -0
  171. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/trace/projection.py +0 -0
  172. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/orchestration/trace/steps.py +0 -0
  173. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/patch_contract.py +0 -0
  174. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/payload/__init__.py +0 -0
  175. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/payload/action.py +0 -0
  176. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/payload/analysis_canvas.py +0 -0
  177. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/payload/enrichment.py +0 -0
  178. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/prompting/__init__.py +0 -0
  179. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/prompting/response_strategy.py +0 -0
  180. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/request/__init__.py +0 -0
  181. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/request/identity.py +0 -0
  182. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/request/intent_resolution.py +0 -0
  183. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/retrieval/__init__.py +0 -0
  184. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/retrieval/aliases.py +0 -0
  185. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/retrieval/field_queries.py +0 -0
  186. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/retrieval/projection.py +0 -0
  187. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/retrieval/query_builder.py +0 -0
  188. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/retrieval/search.py +0 -0
  189. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/source_library.py +0 -0
  190. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/__init__.py +0 -0
  191. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/draft/__init__.py +0 -0
  192. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/draft/finalize.py +0 -0
  193. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/draft/phase.py +0 -0
  194. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/draft/phase_timing.py +0 -0
  195. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/draft/post_completion.py +0 -0
  196. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/draft/prologue.py +0 -0
  197. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/event_emitter.py +0 -0
  198. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/intake/__init__.py +0 -0
  199. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/intake/phase.py +0 -0
  200. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/mode/__init__.py +0 -0
  201. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/mode/event_payload.py +0 -0
  202. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/mode/events.py +0 -0
  203. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/__init__.py +0 -0
  204. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/bootstrap.py +0 -0
  205. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/builder.py +0 -0
  206. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/builder_transport.py +0 -0
  207. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/draft_phase.py +0 -0
  208. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/phase_groups.py +0 -0
  209. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/phases.py +0 -0
  210. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/response/runtime.py +0 -0
  211. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/retrieval/__init__.py +0 -0
  212. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/retrieval/phase.py +0 -0
  213. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/runtime/__init__.py +0 -0
  214. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/streaming/runtime/steps.py +0 -0
  215. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/router/text_safety.py +0 -0
  216. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/__init__.py +0 -0
  217. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/context/__init__.py +0 -0
  218. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/context/document_application.py +0 -0
  219. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/context/reasoning_application.py +0 -0
  220. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/context/session_context.py +0 -0
  221. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/context/track_application.py +0 -0
  222. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/domain/__init__.py +0 -0
  223. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/domain/domain_pack_loader.py +0 -0
  224. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/domain/profile_resolution.py +0 -0
  225. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/execution/__init__.py +0 -0
  226. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/execution/agent_runtime.py +0 -0
  227. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/execution/skill_runtime.py +0 -0
  228. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/__init__.py +0 -0
  229. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/chat_memory.py +0 -0
  230. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/database.py +0 -0
  231. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/dependency_status.py +0 -0
  232. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/infrastructure.py +0 -0
  233. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/knowledge_ingest.py +0 -0
  234. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/knowledge_memory.py +0 -0
  235. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/knowledge_postgres_search.py +0 -0
  236. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/knowledge_qdrant_search.py +0 -0
  237. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/knowledge_search.py +0 -0
  238. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/knowledge_terms.py +0 -0
  239. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/logging.py +0 -0
  240. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/project_memory_sql.py +0 -0
  241. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/redis_client.py +0 -0
  242. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/session/__init__.py +0 -0
  243. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/session/repository.py +0 -0
  244. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/session/repository_memory.py +0 -0
  245. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/source/__init__.py +0 -0
  246. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/source/library_persistence.py +0 -0
  247. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/source/text_extractor.py +0 -0
  248. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/sourcing/__init__.py +0 -0
  249. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/sourcing/persistence.py +0 -0
  250. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/sourcing/provider.py +0 -0
  251. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/trace.py +0 -0
  252. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/infrastructure/vector_store.py +0 -0
  253. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/intent/__init__.py +0 -0
  254. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/intent/intent_and_escalation/__init__.py +0 -0
  255. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/intent/intent_and_escalation/decision.py +0 -0
  256. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/intent/intent_and_escalation/lexicon.py +0 -0
  257. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/intent/intent_and_escalation/preprocessing.py +0 -0
  258. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/intent/intent_and_escalation/signals.py +0 -0
  259. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/intent/intent_and_escalation_classifier.py +0 -0
  260. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/llm/__init__.py +0 -0
  261. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/llm/llm_provider.py +0 -0
  262. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/llm/model_router.py +0 -0
  263. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/__init__.py +0 -0
  264. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/analysis_router_runtime.py +0 -0
  265. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/canvas_sourcing_contract.py +0 -0
  266. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/decision_engine.py +0 -0
  267. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/__init__.py +0 -0
  268. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/orchestration.py +0 -0
  269. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/__init__.py +0 -0
  270. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/canvas.py +0 -0
  271. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/core.py +0 -0
  272. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/followup.py +0 -0
  273. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/payload.py +0 -0
  274. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/question.py +0 -0
  275. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/question_steps.py +0 -0
  276. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/session.py +0 -0
  277. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/stage.py +0 -0
  278. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/summary.py +0 -0
  279. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/plan/trace.py +0 -0
  280. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/reasoning.py +0 -0
  281. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode/runtime.py +0 -0
  282. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_question.py +0 -0
  283. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_question_steps.py +0 -0
  284. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/observation.py +0 -0
  285. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/response_strategy_runtime.py +0 -0
  286. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/session_context_runtime.py +0 -0
  287. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/sourcing/__init__.py +0 -0
  288. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/sourcing/event_payloads.py +0 -0
  289. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/sourcing/search_runtime.py +0 -0
  290. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/structured_reasoning.py +0 -0
  291. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/orchestration/track_runtime.py +0 -0
  292. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/__init__.py +0 -0
  293. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/__init__.py +0 -0
  294. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/api.py +0 -0
  295. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/branching/__init__.py +0 -0
  296. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/branching/core.py +0 -0
  297. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/branching/policy.py +0 -0
  298. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/context.py +0 -0
  299. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/field_selection.py +0 -0
  300. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/gap_detection.py +0 -0
  301. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/hypothesis.py +0 -0
  302. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/planning.py +0 -0
  303. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/priority.py +0 -0
  304. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/question/__init__.py +0 -0
  305. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/question/builder.py +0 -0
  306. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/question/extraction.py +0 -0
  307. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/question/planner.py +0 -0
  308. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/readiness/__init__.py +0 -0
  309. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/readiness/core.py +0 -0
  310. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/readiness/scoring.py +0 -0
  311. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/shared.py +0 -0
  312. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/understanding_state.py +0 -0
  313. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/reasoning/intake/visible_response.py +0 -0
  314. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/session/__init__.py +0 -0
  315. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/session/checkpoint_manager.py +0 -0
  316. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/session/intake_session_store.py +0 -0
  317. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/session/models.py +0 -0
  318. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/source_ingestion/__init__.py +0 -0
  319. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/source_ingestion/artifacts.py +0 -0
  320. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/source_ingestion/chunk_storage.py +0 -0
  321. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/source_ingestion/knowledge_storage.py +0 -0
  322. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/source_ingestion/runtime.py +0 -0
  323. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/runtime/source_ingestion/storage.py +0 -0
  324. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/session_record_policy.py +0 -0
  325. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/session_store.py +0 -0
  326. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel/user_store.py +0 -0
  327. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel.egg-info/dependency_links.txt +0 -0
  328. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel.egg-info/requires.txt +0 -0
  329. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/src/flare_kernel.egg-info/top_level.txt +0 -0
  330. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_action_payload.py +0 -0
  331. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_analysis_canvas_payload.py +0 -0
  332. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_analysis_route_projection.py +0 -0
  333. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_basics.py +0 -0
  334. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_builder_split_modules.py +0 -0
  335. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_business_hardcode_guard.py +0 -0
  336. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_canonical_state_context_analysis.py +0 -0
  337. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_canonical_state_context_inputs.py +0 -0
  338. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_canonical_state_context_session.py +0 -0
  339. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_canonical_state_flow.py +0 -0
  340. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_canonical_state_payload.py +0 -0
  341. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_canonical_state_projection.py +0 -0
  342. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_canvas_sourcing_contract_meta.py +0 -0
  343. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_chat_api_alias.py +0 -0
  344. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_command_resolution_analysis_mode.py +0 -0
  345. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_compat_aliases.py +0 -0
  346. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_completion_response_builder.py +0 -0
  347. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_completion_selection.py +0 -0
  348. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_decision_engine.py +0 -0
  349. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_domain_pack_loader.py +0 -0
  350. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_endpoint_context.py +0 -0
  351. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_flare_v1_patch_contract.py +0 -0
  352. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_guided_completion.py +0 -0
  353. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_infrastructure_helpers.py +0 -0
  354. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_infrastructure_knowledge.py +0 -0
  355. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_amount_quantity.py +0 -0
  356. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_answer.py +0 -0
  357. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_authority.py +0 -0
  358. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_authority_checkpoint.py +0 -0
  359. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_authority_hydration.py +0 -0
  360. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_authority_session.py +0 -0
  361. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_canonicalization.py +0 -0
  362. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_clarification.py +0 -0
  363. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_decision_rules.py +0 -0
  364. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_deployment_delivery.py +0 -0
  365. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_domain_context_options.py +0 -0
  366. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_entry_policy.py +0 -0
  367. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_extraction.py +0 -0
  368. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_extraction_extractors.py +0 -0
  369. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_extraction_merge.py +0 -0
  370. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_field_projection.py +0 -0
  371. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_field_projection_entity.py +0 -0
  372. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_field_projection_payload.py +0 -0
  373. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_field_projection_source.py +0 -0
  374. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_field_scope.py +0 -0
  375. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_guided_confirmed_updates.py +0 -0
  376. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_guided_flags.py +0 -0
  377. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_guided_followup.py +0 -0
  378. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_guided_followup_work_item.py +0 -0
  379. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_guided_open_fields.py +0 -0
  380. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_guided_status.py +0 -0
  381. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_guided_summary.py +0 -0
  382. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_inputs.py +0 -0
  383. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_node_state.py +0 -0
  384. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_numeric.py +0 -0
  385. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_payload_updates.py +0 -0
  386. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_readiness.py +0 -0
  387. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_reasoning_priority.py +0 -0
  388. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_state_persistence.py +0 -0
  389. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_status.py +0 -0
  390. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_status_guided_session.py +0 -0
  391. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_status_projection.py +0 -0
  392. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_status_schema.py +0 -0
  393. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_status_stage.py +0 -0
  394. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intake_workflow_checkpoint.py +0 -0
  395. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_classifier_utils.py +0 -0
  396. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_escalation_classifier.py +0 -0
  397. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_escalation_override.py +0 -0
  398. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_escalation_pipeline.py +0 -0
  399. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_escalation_signal.py +0 -0
  400. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_resolution.py +0 -0
  401. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_retrieval.py +0 -0
  402. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_routing.py +0 -0
  403. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_intent_type_compat_aliases.py +0 -0
  404. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_alias_delegation.py +0 -0
  405. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_endpoint_handlers.py +0 -0
  406. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_endpoint_handlers_sourcing.py +0 -0
  407. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_facade_helpers.py +0 -0
  408. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_intent_query_flow.py +0 -0
  409. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_mode_flow.py +0 -0
  410. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_route_execution_wrappers.py +0 -0
  411. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_kernel_session_intent_flow.py +0 -0
  412. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_llm_provider.py +0 -0
  413. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_mode_orchestration_plan_canvas_saved_content.py +0 -0
  414. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_mode_orchestration_plan_finalize.py +0 -0
  415. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_mode_orchestration_plan_runtime_payload.py +0 -0
  416. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_mode_orchestration_state_bridge.py +0 -0
  417. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_mode_reasoning.py +0 -0
  418. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_mode_resolution.py +0 -0
  419. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_mode_switch.py +0 -0
  420. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_model_router.py +0 -0
  421. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_new_flow_guard.py +0 -0
  422. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_checkpoint_state.py +0 -0
  423. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_followup_state.py +0 -0
  424. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_context.py +0 -0
  425. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_context_helpers.py +0 -0
  426. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_decision.py +0 -0
  427. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_projection.py +0 -0
  428. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_result.py +0 -0
  429. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_runtime_state.py +0 -0
  430. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_context.py +0 -0
  431. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_decision.py +0 -0
  432. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_entry.py +0 -0
  433. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_followup.py +0 -0
  434. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_intent.py +0 -0
  435. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_node.py +0 -0
  436. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_payload.py +0 -0
  437. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_status_state_unpack.py +0 -0
  438. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_trace.py +0 -0
  439. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_trace_projection.py +0 -0
  440. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_orchestration_trace_steps.py +0 -0
  441. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_patch_contract.py +0 -0
  442. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_payload_enrichment.py +0 -0
  443. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_project_api.py +0 -0
  444. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_project_memory_store.py +0 -0
  445. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_request_identity.py +0 -0
  446. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_request_intent_resolution.py +0 -0
  447. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_response_strategy_runtime.py +0 -0
  448. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_retrieval_aliases.py +0 -0
  449. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_retrieval_field_queries.py +0 -0
  450. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_retrieval_projection.py +0 -0
  451. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_retrieval_query_builder.py +0 -0
  452. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_retrieval_search.py +0 -0
  453. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_session_api.py +0 -0
  454. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_session_context_persistence.py +0 -0
  455. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_session_intent.py +0 -0
  456. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_session_intent_fields.py +0 -0
  457. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_session_intent_small_talk.py +0 -0
  458. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_source_ingestion_runtime.py +0 -0
  459. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_source_ingestion_ssot_acceptance.py +0 -0
  460. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_source_library.py +0 -0
  461. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_source_library_persistence_scope.py +0 -0
  462. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_source_text_extractor.py +0 -0
  463. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_sourcing_provider.py +0 -0
  464. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_sourcing_search_runtime.py +0 -0
  465. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_draft_completion.py +0 -0
  466. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_draft_finalize.py +0 -0
  467. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_draft_phase.py +0 -0
  468. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_draft_post_completion.py +0 -0
  469. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_draft_prologue.py +0 -0
  470. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_event_emitter.py +0 -0
  471. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_intake_phase.py +0 -0
  472. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_mode_event_payload.py +0 -0
  473. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_mode_events.py +0 -0
  474. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_response_bootstrap.py +0 -0
  475. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_response_phases.py +0 -0
  476. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_response_runtime.py +0 -0
  477. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_retrieval_phase.py +0 -0
  478. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_streaming_runtime_steps.py +0 -0
  479. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_text_safety.py +0 -0
  480. {flare_kernel-0.2.5 → flare_kernel-0.2.7}/tests/test_track_runtime.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flare-kernel
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Summary: FLARE kernel runtime package
5
5
  License: Proprietary
6
6
  Classifier: Development Status :: 3 - Alpha
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flare-kernel"
7
- version = "0.2.5"
7
+ version = "0.2.7"
8
8
  description = "FLARE kernel runtime package"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -32,6 +32,11 @@ from flare_kernel.contracts.project_contract import (
32
32
  ProjectsResponse,
33
33
  ProjectUpsertRequest,
34
34
  )
35
+ from flare_kernel.contracts.project_memory_contract import (
36
+ ProjectMemoryCandidate,
37
+ ProjectMemoryRecall,
38
+ ProjectMemoryRecord,
39
+ )
35
40
  from flare_kernel.contracts.session_contract import (
36
41
  SessionAppendExchangeRequest,
37
42
  SessionCreateRequest,
@@ -72,6 +77,9 @@ __all__ = [
72
77
  "ProjectRecord",
73
78
  "ProjectUpsertRequest",
74
79
  "ProjectsResponse",
80
+ "ProjectMemoryCandidate",
81
+ "ProjectMemoryRecord",
82
+ "ProjectMemoryRecall",
75
83
  "SessionRecord",
76
84
  "SessionCreateRequest",
77
85
  "SessionUpdateRequest",
@@ -0,0 +1,85 @@
1
+ """Project Memory contracts for OBJ-03."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+
10
+ class ProjectMemoryCandidate(BaseModel):
11
+ """Runtime Project Memory candidate before durable scope is applied.
12
+
13
+ Attributes:
14
+ memory_type: Category used by recall and presentation.
15
+ content: Normalized memory text to be considered for persistence.
16
+ evidence: Optional source snippets that support the candidate.
17
+ confidence: Optional confidence score from the extraction path.
18
+ source_session_id: Session that produced the candidate, when available.
19
+ source_message_id: Message that produced the candidate, when available.
20
+ source_id: Source document or runtime artifact id, when available.
21
+ """
22
+
23
+ memory_type: str = "fact"
24
+ content: str
25
+ evidence: list[dict[str, Any]] = Field(default_factory=list)
26
+ confidence: float | None = None
27
+ source_session_id: str = ""
28
+ source_message_id: str = ""
29
+ source_id: str = ""
30
+
31
+
32
+ class ProjectMemoryRecord(BaseModel):
33
+ """Durable Project Memory record stored under project and user scope.
34
+
35
+ Attributes:
36
+ memory_id: Stable Project Memory identifier.
37
+ project_id: Project scope that owns the memory.
38
+ user_id: User scope that owns the memory.
39
+ source_session_id: Session that produced the memory, when available.
40
+ source_message_id: Message that produced the memory, when available.
41
+ source_id: Source document or runtime artifact id, when available.
42
+ memory_type: Category used by recall and presentation.
43
+ content: Durable memory text.
44
+ evidence: Optional source snippets that support the memory.
45
+ confidence: Optional confidence score.
46
+ status: Lifecycle status, such as active or archived.
47
+ created_at: Creation timestamp in ISO string format.
48
+ updated_at: Last update timestamp in ISO string format.
49
+ """
50
+
51
+ memory_id: str
52
+ project_id: str
53
+ user_id: str
54
+ source_session_id: str = ""
55
+ source_message_id: str = ""
56
+ source_id: str = ""
57
+ memory_type: str = "fact"
58
+ content: str
59
+ evidence: list[dict[str, Any]] = Field(default_factory=list)
60
+ confidence: float | None = None
61
+ status: str = "active"
62
+ created_at: str
63
+ updated_at: str
64
+
65
+
66
+ class ProjectMemoryRecall(BaseModel):
67
+ """Project Memory recall payload consumed by context assembly.
68
+
69
+ Attributes:
70
+ project_id: Project scope used for recall.
71
+ user_id: User scope used for recall.
72
+ query: Normalized recall query.
73
+ hit_count: Number of memory records included in the payload.
74
+ memory_ids: Ordered identifiers for the recalled memories.
75
+ memories: Presentation-safe memory snippets.
76
+ degraded: True when recall failed and returned an empty fallback.
77
+ """
78
+
79
+ project_id: str
80
+ user_id: str
81
+ query: str
82
+ hit_count: int = 0
83
+ memory_ids: list[str] = Field(default_factory=list)
84
+ memories: list[dict[str, Any]] = Field(default_factory=list)
85
+ degraded: bool = False
@@ -156,6 +156,7 @@ def resolve_turn_context_dependencies(
156
156
  build_structured_search_results_fn: Any,
157
157
  generate_llm_completion_fn: Any,
158
158
  resolve_analysis_route_fn: Any,
159
+ build_project_memory_context_layer_fn: Any,
159
160
  kernel_attr_fn: Callable[[str, Any], Any],
160
161
  defaults: dict[str, Any],
161
162
  ) -> dict[str, Any]:
@@ -202,6 +203,8 @@ def resolve_turn_context_dependencies(
202
203
  or kernel_attr_fn("generate_llm_completion", defaults["generate_llm_completion_fn"]),
203
204
  "resolve_analysis_route_fn": resolve_analysis_route_fn
204
205
  or kernel_attr_fn("resolve_analysis_route_from_runtime", defaults["resolve_analysis_route_fn"]),
206
+ "build_project_memory_context_layer_fn": build_project_memory_context_layer_fn
207
+ or kernel_attr_fn("build_project_memory_context_layer", defaults["build_project_memory_context_layer_fn"]),
205
208
  }
206
209
 
207
210
 
@@ -51,6 +51,7 @@ async def prepare_kernel_turn_context_flow(
51
51
  generate_llm_completion_fn: Callable[..., Any] | None = None,
52
52
  search_web_sources_fn: Callable[..., list[dict[str, Any]]] | None = None,
53
53
  resolve_analysis_route_fn: Callable[..., dict[str, Any]] | None = None,
54
+ build_project_memory_context_layer_fn: Callable[..., dict[str, Any]] | None = None,
54
55
  ) -> dict[str, Any]:
55
56
  """Assemble the turn context consumed by kernel run/action/stream handlers."""
56
57
  trace_id = resolve_trace_id_fn(req.trace_id)
@@ -143,8 +144,18 @@ async def prepare_kernel_turn_context_flow(
143
144
  "confidence": 0.0,
144
145
  }
145
146
 
147
+ project_memory_recall = {}
148
+ if callable(build_project_memory_context_layer_fn):
149
+ project_memory_recall = build_project_memory_context_layer_fn(
150
+ project_id=project_id,
151
+ user_id=user_id,
152
+ query=raw_message,
153
+ )
154
+
146
155
  enriched_payload = enrich_payload_fn(req, resolved_mode=resolved_mode, retrieved_knowledge=retrieved_knowledge)
147
156
  if isinstance(enriched_payload, dict):
157
+ if isinstance(project_memory_recall, dict) and project_memory_recall:
158
+ enriched_payload["project_memory_recall"] = project_memory_recall
148
159
  enriched_payload["analysis_route"] = analysis_route
149
160
  if not _has_question_answer(enriched_payload):
150
161
  structured_reasoning = await generate_structured_reasoning(
@@ -244,6 +255,7 @@ async def prepare_kernel_turn_context_flow(
244
255
  "effective_command": effective_command,
245
256
  "structured_retrieved_knowledge": structured_retrieved_knowledge,
246
257
  "analysis_route": analysis_route,
258
+ "project_memory_recall": project_memory_recall,
247
259
  }
248
260
 
249
261
 
@@ -57,6 +57,7 @@ from flare_kernel.router.text_safety import (
57
57
  from flare_kernel.runtime.orchestration.analysis_router_runtime import (
58
58
  resolve_analysis_route as resolve_analysis_route_from_runtime,
59
59
  )
60
+ from flare_kernel.runtime.project_memory import build_project_memory_context_layer
60
61
 
61
62
 
62
63
  async def _prepare_kernel_turn_context(
@@ -86,6 +87,7 @@ async def _prepare_kernel_turn_context(
86
87
  generate_llm_completion_fn=None,
87
88
  search_web_sources_fn=None,
88
89
  resolve_analysis_route_fn=None,
90
+ build_project_memory_context_layer_fn=None,
89
91
  ) -> dict[str, Any]:
90
92
  turn_context_deps = resolve_turn_context_dependencies(
91
93
  resolve_trace_id_fn=resolve_trace_id_fn,
@@ -111,6 +113,7 @@ async def _prepare_kernel_turn_context(
111
113
  build_structured_search_results_fn=build_structured_search_results_fn,
112
114
  generate_llm_completion_fn=generate_llm_completion_fn,
113
115
  resolve_analysis_route_fn=resolve_analysis_route_fn,
116
+ build_project_memory_context_layer_fn=build_project_memory_context_layer_fn,
114
117
  kernel_attr_fn=_kernel_attr,
115
118
  defaults={
116
119
  "resolve_trace_id_fn": resolve_trace_id,
@@ -136,6 +139,7 @@ async def _prepare_kernel_turn_context(
136
139
  "build_structured_search_results_fn": build_structured_search_results_from_intake_status,
137
140
  "generate_llm_completion_fn": generate_llm_completion,
138
141
  "resolve_analysis_route_fn": resolve_analysis_route_from_runtime,
142
+ "build_project_memory_context_layer_fn": build_project_memory_context_layer,
139
143
  },
140
144
  )
141
145
  return await prepare_kernel_turn_context_flow(
@@ -164,6 +168,7 @@ async def _prepare_kernel_turn_context(
164
168
  generate_llm_completion_fn=turn_context_deps["generate_llm_completion_fn"],
165
169
  search_web_sources_fn=search_web_sources_fn,
166
170
  resolve_analysis_route_fn=turn_context_deps["resolve_analysis_route_fn"],
171
+ build_project_memory_context_layer_fn=turn_context_deps["build_project_memory_context_layer_fn"],
167
172
  )
168
173
 
169
174
 
@@ -6,6 +6,7 @@ from typing import Any
6
6
 
7
7
  from flare_kernel.contracts import KernelRequest, KernelResponse
8
8
  from flare_kernel.runtime import generate_llm_completion, get_logger, persist_memory_record
9
+ from flare_kernel.runtime.project_memory import persist_project_memory_from_runtime
9
10
  from flare_kernel.router.completion.response_builder import (
10
11
  apply_completion_content_policy as apply_completion_content_policy_from_router,
11
12
  build_kernel_success_response as build_kernel_success_response_from_router,
@@ -117,6 +118,14 @@ async def build_kernel_run_response(
117
118
  model=completion.model,
118
119
  provider_status=completion.status,
119
120
  )
121
+ project_memory_record = persist_project_memory_from_runtime(
122
+ project_id=project_id,
123
+ user_id=user_id,
124
+ source_session_id=session_id,
125
+ runtime_snapshot=runtime_snapshot,
126
+ )
127
+ if project_memory_record:
128
+ memory_record.update(project_memory_record)
120
129
  has_llm_content = bool(str(content_text or "").strip())
121
130
  apply_completion_content_policy_from_router(
122
131
  orchestration_status=orchestration_status,
@@ -69,6 +69,31 @@ def _format_recent_turns(turns: Any, *, limit: int) -> str:
69
69
  return " || ".join(parts)
70
70
 
71
71
 
72
+ def _format_project_memories(memories: Any, *, limit: int) -> str:
73
+ """Format recalled Project Memory records for prompt context.
74
+
75
+ Args:
76
+ memories: Recalled memory records.
77
+ limit: Maximum number of memory records to include.
78
+
79
+ Returns:
80
+ Compact Project Memory text block.
81
+ """
82
+
83
+ if not isinstance(memories, list):
84
+ return ""
85
+ parts: list[str] = []
86
+ for item in memories[:limit]:
87
+ if not isinstance(item, dict):
88
+ continue
89
+ memory_type = _clean_context_text(item.get("memory_type"))
90
+ content = _clean_context_text(item.get("content"))
91
+ if not content:
92
+ continue
93
+ parts.append(f"{memory_type}: {content}" if memory_type else content)
94
+ return "; ".join(parts)
95
+
96
+
72
97
  def _append_session_context_prompt_parts(prompt_parts: list[str], payload: dict[str, Any]) -> None:
73
98
  session_context = payload.get("session_context")
74
99
  if not isinstance(session_context, dict) or not session_context:
@@ -93,6 +118,25 @@ def _append_session_context_prompt_parts(prompt_parts: list[str], payload: dict[
93
118
  prompt_parts.append(f"session_context_recent_turns: {recent_turns}")
94
119
 
95
120
 
121
+ def _append_project_memory_prompt_parts(prompt_parts: list[str], payload: dict[str, Any]) -> None:
122
+ """Append project-level recalled memory to prompt parts.
123
+
124
+ Args:
125
+ prompt_parts: Mutable prompt line list.
126
+ payload: Enriched kernel payload.
127
+
128
+ Returns:
129
+ None.
130
+ """
131
+
132
+ recall = payload.get("project_memory_recall")
133
+ if not isinstance(recall, dict) or not recall:
134
+ return
135
+ memories = _format_project_memories(recall.get("memories"), limit=5)
136
+ if memories:
137
+ prompt_parts.append(f"project_memory: {memories}")
138
+
139
+
96
140
  def _append_track_prompt_parts(prompt_parts: list[str], payload: dict[str, Any]) -> None:
97
141
  track = payload.get("track_result")
98
142
  if not isinstance(track, dict) or not track:
@@ -123,6 +167,7 @@ def _append_understanding_summary_prompt_part(prompt_parts: list[str], payload:
123
167
 
124
168
 
125
169
  __all__ = [
170
+ "_append_project_memory_prompt_parts",
126
171
  "_append_session_context_prompt_parts",
127
172
  "_append_track_prompt_parts",
128
173
  "_append_understanding_summary_prompt_part",
@@ -7,6 +7,7 @@ from typing import Any, Callable
7
7
 
8
8
  from flare_kernel.contracts import KernelRequest
9
9
  from flare_kernel.router.prompting.context_blocks import (
10
+ _append_project_memory_prompt_parts,
10
11
  _append_session_context_prompt_parts,
11
12
  _append_track_prompt_parts,
12
13
  _append_understanding_summary_prompt_part,
@@ -100,6 +101,7 @@ def build_prompt(
100
101
  if product_name:
101
102
  prompt_parts.append(f"product_name: {product_name}")
102
103
  _append_session_context_prompt_parts(prompt_parts, payload)
104
+ _append_project_memory_prompt_parts(prompt_parts, payload)
103
105
  _append_track_prompt_parts(prompt_parts, payload)
104
106
  append_response_strategy_prompt_parts(prompt_parts, payload)
105
107
  _append_understanding_summary_prompt_part(prompt_parts, payload)
@@ -7,6 +7,7 @@ from typing import Any, Callable
7
7
 
8
8
  from flare_kernel.contracts import KernelRequest
9
9
  from flare_kernel.runtime.llm.llm_provider import LLMCompletion
10
+ from flare_kernel.runtime.project_memory import persist_project_memory_from_runtime
10
11
 
11
12
 
12
13
  _PLAN_MODE_FINALIZE_COMMANDS = {"implement", "apply"}
@@ -100,6 +101,14 @@ async def resolve_draft_completion_artifacts(
100
101
  model=completion.model,
101
102
  provider_status=completion.status,
102
103
  )
104
+ project_memory_record = persist_project_memory_from_runtime(
105
+ project_id=project_id,
106
+ user_id=user_id,
107
+ source_session_id=session_id,
108
+ runtime_snapshot=runtime_snapshot,
109
+ )
110
+ if project_memory_record:
111
+ memory_record.update(project_memory_record)
103
112
 
104
113
  observation_runtime_event = {
105
114
  "trace_id": trace_id,
@@ -0,0 +1,231 @@
1
+ """Project Memory storage codecs and validation helpers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import uuid
7
+ from datetime import UTC, datetime
8
+ from typing import Any
9
+
10
+ from flare_kernel.contracts.project_memory_contract import ProjectMemoryRecord
11
+
12
+
13
+ def utcnow_iso() -> str:
14
+ """Return the current UTC timestamp for durable rows.
15
+
16
+ Returns:
17
+ ISO formatted UTC datetime string.
18
+ """
19
+
20
+ return datetime.now(UTC).isoformat()
21
+
22
+
23
+ def normalize_project_memory_text(value: Any) -> str:
24
+ """Normalize arbitrary input into compact text.
25
+
26
+ Args:
27
+ value: Raw value from caller or database row.
28
+
29
+ Returns:
30
+ Whitespace-normalized string.
31
+ """
32
+
33
+ return " ".join(str(value or "").split()).strip()
34
+
35
+
36
+ def normalize_project_memory_status(value: Any) -> str:
37
+ """Normalize memory lifecycle status.
38
+
39
+ Args:
40
+ value: Raw status value.
41
+
42
+ Returns:
43
+ Non-empty status string, defaulting to active.
44
+ """
45
+
46
+ return normalize_project_memory_text(value) or "active"
47
+
48
+
49
+ def normalize_project_memory_confidence(value: Any) -> float | None:
50
+ """Normalize confidence to a float when possible.
51
+
52
+ Args:
53
+ value: Raw confidence value.
54
+
55
+ Returns:
56
+ Float confidence, or None when unavailable/invalid.
57
+ """
58
+
59
+ if value is None:
60
+ return None
61
+ try:
62
+ return float(value)
63
+ except (TypeError, ValueError):
64
+ return None
65
+
66
+
67
+ def json_dumps_evidence(value: Any) -> str:
68
+ """Serialize evidence-like values for SQL storage.
69
+
70
+ Args:
71
+ value: Evidence value supplied by caller.
72
+
73
+ Returns:
74
+ JSON string persisted in evidence_json.
75
+ """
76
+
77
+ return json.dumps(value if value is not None else [], ensure_ascii=False, sort_keys=True)
78
+
79
+
80
+ def json_loads_evidence(value: Any) -> Any:
81
+ """Deserialize evidence_json from SQL storage.
82
+
83
+ Args:
84
+ value: Raw JSON string from database.
85
+
86
+ Returns:
87
+ Parsed JSON value, or an empty list on missing/invalid input.
88
+ """
89
+
90
+ if not value:
91
+ return []
92
+ try:
93
+ return json.loads(str(value))
94
+ except json.JSONDecodeError:
95
+ return []
96
+
97
+
98
+ def build_project_memory_id() -> str:
99
+ """Create a local Project Memory identifier.
100
+
101
+ Returns:
102
+ Stable id string with pmem_ prefix.
103
+ """
104
+
105
+ return f"pmem_{uuid.uuid4().hex[:16]}"
106
+
107
+
108
+ def build_project_memory_params(
109
+ *,
110
+ memory_id: str | None,
111
+ project_id: str,
112
+ user_id: str,
113
+ source_session_id: str | None,
114
+ source_message_id: str | None,
115
+ source_id: str | None,
116
+ memory_type: str,
117
+ content: str,
118
+ evidence: list[dict[str, Any]] | None,
119
+ confidence: float | None,
120
+ status: str,
121
+ ) -> dict[str, Any]:
122
+ """Build normalized SQL parameters for an upsert.
123
+
124
+ Args:
125
+ memory_id: Optional existing memory id.
126
+ project_id: Owning project id.
127
+ user_id: Owning user id.
128
+ source_session_id: Producing session id, when available.
129
+ source_message_id: Producing message id, when available.
130
+ source_id: Producing source id, when available.
131
+ memory_type: Memory category.
132
+ content: Durable memory text.
133
+ evidence: Optional supporting snippets.
134
+ confidence: Optional confidence score.
135
+ status: Lifecycle status.
136
+
137
+ Returns:
138
+ SQL parameter dict for insert/update statements.
139
+ """
140
+
141
+ now = utcnow_iso()
142
+ return {
143
+ "memory_id": normalize_project_memory_text(memory_id) or build_project_memory_id(),
144
+ "project_id": normalize_project_memory_text(project_id),
145
+ "user_id": normalize_project_memory_text(user_id),
146
+ "source_session_id": normalize_project_memory_text(source_session_id),
147
+ "source_message_id": normalize_project_memory_text(source_message_id),
148
+ "source_id": normalize_project_memory_text(source_id),
149
+ "memory_type": normalize_project_memory_text(memory_type) or "fact",
150
+ "content": str(content or "").strip(),
151
+ "evidence_json": json_dumps_evidence(evidence),
152
+ "confidence": confidence,
153
+ "status": normalize_project_memory_status(status),
154
+ "created_at": now,
155
+ "updated_at": now,
156
+ }
157
+
158
+
159
+ def row_to_project_memory_record(row: Any) -> dict[str, Any]:
160
+ """Convert a SQL row into the public Project Memory record contract.
161
+
162
+ Args:
163
+ row: SQLAlchemy row mapping containing evidence_json.
164
+
165
+ Returns:
166
+ ProjectMemoryRecord as a dict.
167
+ """
168
+
169
+ record = dict(row)
170
+ record["evidence"] = json_loads_evidence(record.pop("evidence_json", ""))
171
+ record["confidence"] = normalize_project_memory_confidence(record.get("confidence"))
172
+ return ProjectMemoryRecord.model_validate(record).model_dump()
173
+
174
+
175
+ def require_project_memory_scope(project_id: str, user_id: str) -> tuple[str, str]:
176
+ """Validate and normalize required project/user scope.
177
+
178
+ Args:
179
+ project_id: Project id supplied by caller.
180
+ user_id: User id supplied by caller.
181
+
182
+ Returns:
183
+ Tuple of normalized project_id and user_id.
184
+
185
+ Raises:
186
+ ValueError: If either scope value is empty.
187
+ """
188
+
189
+ resolved_project_id = normalize_project_memory_text(project_id)
190
+ resolved_user_id = normalize_project_memory_text(user_id)
191
+ if not resolved_project_id:
192
+ raise ValueError("project_id is required")
193
+ if not resolved_user_id:
194
+ raise ValueError("user_id is required")
195
+ return resolved_project_id, resolved_user_id
196
+
197
+
198
+ def require_project_memory_content(content: str) -> str:
199
+ """Validate and normalize required memory content.
200
+
201
+ Args:
202
+ content: Memory text supplied by caller.
203
+
204
+ Returns:
205
+ Non-empty memory content.
206
+
207
+ Raises:
208
+ ValueError: If content is empty.
209
+ """
210
+
211
+ resolved = str(content or "").strip()
212
+ if not resolved:
213
+ raise ValueError("content is required")
214
+ return resolved
215
+
216
+
217
+ def score_project_memory_record(record: dict[str, Any], query_terms: list[str]) -> tuple[int, dict[str, Any]]:
218
+ """Score one memory record using lexical query-term overlap.
219
+
220
+ Args:
221
+ record: ProjectMemoryRecord-compatible dict.
222
+ query_terms: Lowercase query tokens.
223
+
224
+ Returns:
225
+ Tuple of integer score and original record.
226
+ """
227
+
228
+ content = str(record.get("content") or "").lower()
229
+ memory_type = str(record.get("memory_type") or "").lower()
230
+ haystack = f"{memory_type} {content}"
231
+ return sum(1 for term in query_terms if term in haystack), record