flare-kernel 0.2.5__tar.gz → 0.2.6__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 (479) hide show
  1. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/PKG-INFO +1 -1
  2. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/pyproject.toml +1 -1
  3. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/__init__.py +8 -0
  4. flare_kernel-0.2.6/src/flare_kernel/contracts/project_memory_contract.py +85 -0
  5. flare_kernel-0.2.6/src/flare_kernel/runtime/infrastructure/project_memory_codec.py +231 -0
  6. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/project_memory_store.py +93 -117
  7. flare_kernel-0.2.6/src/flare_kernel/runtime/project_memory/__init__.py +10 -0
  8. flare_kernel-0.2.6/src/flare_kernel/runtime/project_memory/extraction.py +273 -0
  9. flare_kernel-0.2.6/src/flare_kernel/runtime/project_memory/recall.py +118 -0
  10. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/PKG-INFO +1 -1
  11. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/SOURCES.txt +6 -0
  12. flare_kernel-0.2.6/tests/test_project_memory_runtime.py +102 -0
  13. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/README.md +0 -0
  14. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/setup.cfg +0 -0
  15. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/__init__.py +0 -0
  16. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/app.py +0 -0
  17. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/context.py +0 -0
  18. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/kernel_contract.py +0 -0
  19. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/mode.py +0 -0
  20. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/project_contract.py +0 -0
  21. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/session_contract.py +0 -0
  22. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/main.py +0 -0
  23. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/project_store.py +0 -0
  24. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/__init__.py +0 -0
  25. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/__init__.py +0 -0
  26. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/chat.py +0 -0
  27. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/errors.py +0 -0
  28. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/project.py +0 -0
  29. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/session.py +0 -0
  30. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/__init__.py +0 -0
  31. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/analysis.py +0 -0
  32. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/checkpoint.py +0 -0
  33. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/__init__.py +0 -0
  34. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/analysis.py +0 -0
  35. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/inputs.py +0 -0
  36. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/session.py +0 -0
  37. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/contract_support.py +0 -0
  38. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/flow.py +0 -0
  39. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/payload.py +0 -0
  40. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/projection.py +0 -0
  41. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/__init__.py +0 -0
  42. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/guided.py +0 -0
  43. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/response_builder.py +0 -0
  44. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/selection.py +0 -0
  45. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/context/__init__.py +0 -0
  46. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/context/endpoint.py +0 -0
  47. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/context/sourcing_preview.py +0 -0
  48. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/__init__.py +0 -0
  49. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/amount_quantity.py +0 -0
  50. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/answer.py +0 -0
  51. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/__init__.py +0 -0
  52. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/checkpoint.py +0 -0
  53. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/core.py +0 -0
  54. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/hydration.py +0 -0
  55. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/session.py +0 -0
  56. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/canonicalization.py +0 -0
  57. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/clarification.py +0 -0
  58. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/decision_rules.py +0 -0
  59. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/deployment_delivery.py +0 -0
  60. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/entry_policy.py +0 -0
  61. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/__init__.py +0 -0
  62. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/core.py +0 -0
  63. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/extractors.py +0 -0
  64. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/merge.py +0 -0
  65. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/__init__.py +0 -0
  66. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/core.py +0 -0
  67. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/entity.py +0 -0
  68. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/payload.py +0 -0
  69. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/source.py +0 -0
  70. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_scope.py +0 -0
  71. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/__init__.py +0 -0
  72. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/confirmed_updates.py +0 -0
  73. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/flags.py +0 -0
  74. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/followup.py +0 -0
  75. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/followup_work_item.py +0 -0
  76. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/open_fields.py +0 -0
  77. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/status.py +0 -0
  78. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/summary.py +0 -0
  79. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/inputs.py +0 -0
  80. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/node_state.py +0 -0
  81. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/numeric.py +0 -0
  82. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/payload_updates.py +0 -0
  83. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/readiness.py +0 -0
  84. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/state_persistence.py +0 -0
  85. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/__init__.py +0 -0
  86. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/chooser_stage.py +0 -0
  87. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/core.py +0 -0
  88. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/guided_session.py +0 -0
  89. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/projection.py +0 -0
  90. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/schema.py +0 -0
  91. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/workflow_checkpoint.py +0 -0
  92. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/__init__.py +0 -0
  93. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/classifier_utils.py +0 -0
  94. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/compat_aliases.py +0 -0
  95. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/__init__.py +0 -0
  96. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/override.py +0 -0
  97. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/pipeline.py +0 -0
  98. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/signal.py +0 -0
  99. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/routing.py +0 -0
  100. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/__init__.py +0 -0
  101. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/core.py +0 -0
  102. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/fields.py +0 -0
  103. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/small_talk.py +0 -0
  104. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel.py +0 -0
  105. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/__init__.py +0 -0
  106. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/intake.py +0 -0
  107. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/intent.py +0 -0
  108. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/patch.py +0 -0
  109. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/__init__.py +0 -0
  110. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/health.py +0 -0
  111. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/knowledge.py +0 -0
  112. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/sourcing.py +0 -0
  113. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/turn.py +0 -0
  114. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/__init__.py +0 -0
  115. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/canonical_state.py +0 -0
  116. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/dependency_resolution.py +0 -0
  117. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/flow.py +0 -0
  118. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/orchestration.py +0 -0
  119. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/payload_enrichment.py +0 -0
  120. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/turn_context.py +0 -0
  121. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/utils.py +0 -0
  122. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/__init__.py +0 -0
  123. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/intent_query.py +0 -0
  124. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/mode.py +0 -0
  125. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/session_intent.py +0 -0
  126. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/__init__.py +0 -0
  127. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/action.py +0 -0
  128. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/intake.py +0 -0
  129. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/intent_query.py +0 -0
  130. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/intent_signal.py +0 -0
  131. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/__init__.py +0 -0
  132. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/action.py +0 -0
  133. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/execution.py +0 -0
  134. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/run.py +0 -0
  135. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/stream.py +0 -0
  136. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/mode/__init__.py +0 -0
  137. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/mode/resolution.py +0 -0
  138. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/mode/switch.py +0 -0
  139. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/next_actions_guard.py +0 -0
  140. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/__init__.py +0 -0
  141. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/__init__.py +0 -0
  142. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/actions.py +0 -0
  143. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/builder.py +0 -0
  144. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/checkpoint_state.py +0 -0
  145. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/context.py +0 -0
  146. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/context_helpers.py +0 -0
  147. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/core.py +0 -0
  148. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/decision.py +0 -0
  149. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/followup_state.py +0 -0
  150. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/projection.py +0 -0
  151. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/result.py +0 -0
  152. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/runtime_state.py +0 -0
  153. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/__init__.py +0 -0
  154. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/context.py +0 -0
  155. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/decision.py +0 -0
  156. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/entry.py +0 -0
  157. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/flow.py +0 -0
  158. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/followup.py +0 -0
  159. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/intent.py +0 -0
  160. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/node.py +0 -0
  161. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/payload.py +0 -0
  162. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/unpack.py +0 -0
  163. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/__init__.py +0 -0
  164. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/core.py +0 -0
  165. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/projection.py +0 -0
  166. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/steps.py +0 -0
  167. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/patch_contract.py +0 -0
  168. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/__init__.py +0 -0
  169. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/action.py +0 -0
  170. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/analysis_canvas.py +0 -0
  171. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/enrichment.py +0 -0
  172. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/__init__.py +0 -0
  173. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/context_blocks.py +0 -0
  174. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/core.py +0 -0
  175. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/response_strategy.py +0 -0
  176. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/request/__init__.py +0 -0
  177. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/request/identity.py +0 -0
  178. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/request/intent_resolution.py +0 -0
  179. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/__init__.py +0 -0
  180. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/aliases.py +0 -0
  181. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/field_queries.py +0 -0
  182. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/projection.py +0 -0
  183. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/query_builder.py +0 -0
  184. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/search.py +0 -0
  185. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/source_library.py +0 -0
  186. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/__init__.py +0 -0
  187. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/__init__.py +0 -0
  188. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/completion.py +0 -0
  189. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/finalize.py +0 -0
  190. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/phase.py +0 -0
  191. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/phase_timing.py +0 -0
  192. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/post_completion.py +0 -0
  193. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/prologue.py +0 -0
  194. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/event_emitter.py +0 -0
  195. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/intake/__init__.py +0 -0
  196. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/intake/phase.py +0 -0
  197. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/mode/__init__.py +0 -0
  198. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/mode/event_payload.py +0 -0
  199. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/mode/events.py +0 -0
  200. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/__init__.py +0 -0
  201. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/bootstrap.py +0 -0
  202. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/builder.py +0 -0
  203. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/builder_transport.py +0 -0
  204. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/draft_phase.py +0 -0
  205. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/phase_groups.py +0 -0
  206. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/phases.py +0 -0
  207. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/runtime.py +0 -0
  208. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/retrieval/__init__.py +0 -0
  209. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/retrieval/phase.py +0 -0
  210. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/runtime/__init__.py +0 -0
  211. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/runtime/steps.py +0 -0
  212. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/text_safety.py +0 -0
  213. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/__init__.py +0 -0
  214. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/__init__.py +0 -0
  215. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/document_application.py +0 -0
  216. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/reasoning_application.py +0 -0
  217. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/session_context.py +0 -0
  218. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/track_application.py +0 -0
  219. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/domain/__init__.py +0 -0
  220. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/domain/domain_pack_loader.py +0 -0
  221. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/domain/profile_resolution.py +0 -0
  222. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/execution/__init__.py +0 -0
  223. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/execution/agent_runtime.py +0 -0
  224. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/execution/skill_runtime.py +0 -0
  225. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/__init__.py +0 -0
  226. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/chat_memory.py +0 -0
  227. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/database.py +0 -0
  228. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/dependency_status.py +0 -0
  229. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/infrastructure.py +0 -0
  230. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_ingest.py +0 -0
  231. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_memory.py +0 -0
  232. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_postgres_search.py +0 -0
  233. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_qdrant_search.py +0 -0
  234. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_search.py +0 -0
  235. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_terms.py +0 -0
  236. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/logging.py +0 -0
  237. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/project_memory_sql.py +0 -0
  238. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/redis_client.py +0 -0
  239. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/session/__init__.py +0 -0
  240. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/session/repository.py +0 -0
  241. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/session/repository_memory.py +0 -0
  242. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/source/__init__.py +0 -0
  243. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/source/library_persistence.py +0 -0
  244. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/source/text_extractor.py +0 -0
  245. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/sourcing/__init__.py +0 -0
  246. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/sourcing/persistence.py +0 -0
  247. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/sourcing/provider.py +0 -0
  248. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/trace.py +0 -0
  249. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/vector_store.py +0 -0
  250. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/__init__.py +0 -0
  251. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/__init__.py +0 -0
  252. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/decision.py +0 -0
  253. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/lexicon.py +0 -0
  254. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/preprocessing.py +0 -0
  255. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/signals.py +0 -0
  256. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation_classifier.py +0 -0
  257. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/llm/__init__.py +0 -0
  258. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/llm/llm_provider.py +0 -0
  259. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/llm/model_router.py +0 -0
  260. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/__init__.py +0 -0
  261. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/analysis_router_runtime.py +0 -0
  262. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/canvas_sourcing_contract.py +0 -0
  263. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/decision_engine.py +0 -0
  264. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/__init__.py +0 -0
  265. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/orchestration.py +0 -0
  266. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/__init__.py +0 -0
  267. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/canvas.py +0 -0
  268. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/core.py +0 -0
  269. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/followup.py +0 -0
  270. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/payload.py +0 -0
  271. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/question.py +0 -0
  272. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/question_steps.py +0 -0
  273. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/session.py +0 -0
  274. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/stage.py +0 -0
  275. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/summary.py +0 -0
  276. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/trace.py +0 -0
  277. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/reasoning.py +0 -0
  278. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/runtime.py +0 -0
  279. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_question.py +0 -0
  280. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_question_steps.py +0 -0
  281. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/observation.py +0 -0
  282. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/response_strategy_runtime.py +0 -0
  283. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/session_context_runtime.py +0 -0
  284. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/sourcing/__init__.py +0 -0
  285. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/sourcing/event_payloads.py +0 -0
  286. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/sourcing/search_runtime.py +0 -0
  287. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/structured_reasoning.py +0 -0
  288. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/track_runtime.py +0 -0
  289. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/__init__.py +0 -0
  290. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/__init__.py +0 -0
  291. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/api.py +0 -0
  292. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/branching/__init__.py +0 -0
  293. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/branching/core.py +0 -0
  294. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/branching/policy.py +0 -0
  295. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/context.py +0 -0
  296. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/field_selection.py +0 -0
  297. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/gap_detection.py +0 -0
  298. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/hypothesis.py +0 -0
  299. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/planning.py +0 -0
  300. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/priority.py +0 -0
  301. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/__init__.py +0 -0
  302. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/builder.py +0 -0
  303. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/extraction.py +0 -0
  304. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/planner.py +0 -0
  305. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/readiness/__init__.py +0 -0
  306. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/readiness/core.py +0 -0
  307. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/readiness/scoring.py +0 -0
  308. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/shared.py +0 -0
  309. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/understanding_state.py +0 -0
  310. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/visible_response.py +0 -0
  311. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/__init__.py +0 -0
  312. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/checkpoint_manager.py +0 -0
  313. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/intake_session_store.py +0 -0
  314. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/models.py +0 -0
  315. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/__init__.py +0 -0
  316. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/artifacts.py +0 -0
  317. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/chunk_storage.py +0 -0
  318. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/knowledge_storage.py +0 -0
  319. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/runtime.py +0 -0
  320. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/storage.py +0 -0
  321. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/session_record_policy.py +0 -0
  322. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/session_store.py +0 -0
  323. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/user_store.py +0 -0
  324. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/dependency_links.txt +0 -0
  325. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/requires.txt +0 -0
  326. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/top_level.txt +0 -0
  327. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_action_payload.py +0 -0
  328. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_analysis_canvas_payload.py +0 -0
  329. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_analysis_route_projection.py +0 -0
  330. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_basics.py +0 -0
  331. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_builder_split_modules.py +0 -0
  332. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_business_hardcode_guard.py +0 -0
  333. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_context_analysis.py +0 -0
  334. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_context_inputs.py +0 -0
  335. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_context_session.py +0 -0
  336. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_flow.py +0 -0
  337. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_payload.py +0 -0
  338. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_projection.py +0 -0
  339. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canvas_sourcing_contract_meta.py +0 -0
  340. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_chat_api_alias.py +0 -0
  341. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_command_resolution_analysis_mode.py +0 -0
  342. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_compat_aliases.py +0 -0
  343. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_completion_response_builder.py +0 -0
  344. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_completion_selection.py +0 -0
  345. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_decision_engine.py +0 -0
  346. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_domain_pack_loader.py +0 -0
  347. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_endpoint_context.py +0 -0
  348. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_flare_v1_patch_contract.py +0 -0
  349. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_guided_completion.py +0 -0
  350. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_infrastructure_helpers.py +0 -0
  351. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_infrastructure_knowledge.py +0 -0
  352. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_amount_quantity.py +0 -0
  353. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_answer.py +0 -0
  354. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority.py +0 -0
  355. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority_checkpoint.py +0 -0
  356. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority_hydration.py +0 -0
  357. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority_session.py +0 -0
  358. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_canonicalization.py +0 -0
  359. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_clarification.py +0 -0
  360. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_decision_rules.py +0 -0
  361. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_deployment_delivery.py +0 -0
  362. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_domain_context_options.py +0 -0
  363. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_entry_policy.py +0 -0
  364. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_extraction.py +0 -0
  365. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_extraction_extractors.py +0 -0
  366. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_extraction_merge.py +0 -0
  367. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection.py +0 -0
  368. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection_entity.py +0 -0
  369. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection_payload.py +0 -0
  370. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection_source.py +0 -0
  371. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_scope.py +0 -0
  372. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_confirmed_updates.py +0 -0
  373. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_flags.py +0 -0
  374. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_followup.py +0 -0
  375. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_followup_work_item.py +0 -0
  376. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_open_fields.py +0 -0
  377. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_status.py +0 -0
  378. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_summary.py +0 -0
  379. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_inputs.py +0 -0
  380. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_node_state.py +0 -0
  381. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_numeric.py +0 -0
  382. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_payload_updates.py +0 -0
  383. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_readiness.py +0 -0
  384. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_reasoning_priority.py +0 -0
  385. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_state_persistence.py +0 -0
  386. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status.py +0 -0
  387. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_guided_session.py +0 -0
  388. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_projection.py +0 -0
  389. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_schema.py +0 -0
  390. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_stage.py +0 -0
  391. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_workflow_checkpoint.py +0 -0
  392. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_classifier_utils.py +0 -0
  393. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_classifier.py +0 -0
  394. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_override.py +0 -0
  395. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_pipeline.py +0 -0
  396. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_signal.py +0 -0
  397. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_resolution.py +0 -0
  398. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_retrieval.py +0 -0
  399. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_routing.py +0 -0
  400. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_type_compat_aliases.py +0 -0
  401. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_alias_delegation.py +0 -0
  402. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_endpoint_handlers.py +0 -0
  403. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_endpoint_handlers_sourcing.py +0 -0
  404. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_facade_helpers.py +0 -0
  405. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_facade_turn_context.py +0 -0
  406. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_intent_query_flow.py +0 -0
  407. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_mode_flow.py +0 -0
  408. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_route_execution_wrappers.py +0 -0
  409. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_session_intent_flow.py +0 -0
  410. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_llm_provider.py +0 -0
  411. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_plan_canvas_saved_content.py +0 -0
  412. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_plan_finalize.py +0 -0
  413. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_plan_runtime_payload.py +0 -0
  414. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_state_bridge.py +0 -0
  415. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_reasoning.py +0 -0
  416. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_resolution.py +0 -0
  417. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_switch.py +0 -0
  418. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_model_router.py +0 -0
  419. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_new_flow_guard.py +0 -0
  420. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_checkpoint_state.py +0 -0
  421. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_followup_state.py +0 -0
  422. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_context.py +0 -0
  423. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_context_helpers.py +0 -0
  424. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_decision.py +0 -0
  425. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_projection.py +0 -0
  426. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_result.py +0 -0
  427. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_runtime_state.py +0 -0
  428. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_context.py +0 -0
  429. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_decision.py +0 -0
  430. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_entry.py +0 -0
  431. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_followup.py +0 -0
  432. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_intent.py +0 -0
  433. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_node.py +0 -0
  434. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_payload.py +0 -0
  435. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_unpack.py +0 -0
  436. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_trace.py +0 -0
  437. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_trace_projection.py +0 -0
  438. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_trace_steps.py +0 -0
  439. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_patch_contract.py +0 -0
  440. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_payload_enrichment.py +0 -0
  441. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_project_api.py +0 -0
  442. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_project_memory_store.py +0 -0
  443. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_prompting_analysis_instruction.py +0 -0
  444. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_request_identity.py +0 -0
  445. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_request_intent_resolution.py +0 -0
  446. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_response_strategy_runtime.py +0 -0
  447. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_aliases.py +0 -0
  448. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_field_queries.py +0 -0
  449. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_projection.py +0 -0
  450. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_query_builder.py +0 -0
  451. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_search.py +0 -0
  452. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_api.py +0 -0
  453. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_context_persistence.py +0 -0
  454. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_intent.py +0 -0
  455. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_intent_fields.py +0 -0
  456. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_intent_small_talk.py +0 -0
  457. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_ingestion_runtime.py +0 -0
  458. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_ingestion_ssot_acceptance.py +0 -0
  459. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_library.py +0 -0
  460. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_library_persistence_scope.py +0 -0
  461. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_text_extractor.py +0 -0
  462. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_sourcing_provider.py +0 -0
  463. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_sourcing_search_runtime.py +0 -0
  464. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_completion.py +0 -0
  465. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_finalize.py +0 -0
  466. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_phase.py +0 -0
  467. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_post_completion.py +0 -0
  468. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_prologue.py +0 -0
  469. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_event_emitter.py +0 -0
  470. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_intake_phase.py +0 -0
  471. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_mode_event_payload.py +0 -0
  472. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_mode_events.py +0 -0
  473. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_response_bootstrap.py +0 -0
  474. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_response_phases.py +0 -0
  475. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_response_runtime.py +0 -0
  476. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_retrieval_phase.py +0 -0
  477. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_runtime_steps.py +0 -0
  478. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_text_safety.py +0 -0
  479. {flare_kernel-0.2.5 → flare_kernel-0.2.6}/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.6
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.6"
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
@@ -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
@@ -2,12 +2,19 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import json
6
- import uuid
7
- from datetime import UTC, datetime
8
5
  from typing import Any, Callable
9
6
 
10
7
  from flare_kernel.runtime.infrastructure.database import build_sqlalchemy_engine
8
+ from flare_kernel.runtime.infrastructure.project_memory_codec import (
9
+ build_project_memory_params,
10
+ normalize_project_memory_confidence,
11
+ normalize_project_memory_status,
12
+ normalize_project_memory_text,
13
+ require_project_memory_content,
14
+ require_project_memory_scope,
15
+ row_to_project_memory_record,
16
+ score_project_memory_record,
17
+ )
11
18
  from flare_kernel.runtime.infrastructure.project_memory_sql import (
12
19
  PROJECT_MEMORY_INSERT_SQL,
13
20
  PROJECT_MEMORY_LIST_WHERE_SQL,
@@ -19,107 +26,35 @@ from flare_kernel.runtime.infrastructure.project_memory_sql import (
19
26
  )
20
27
 
21
28
 
22
- def _utcnow_iso() -> str:
23
- return datetime.now(UTC).isoformat()
24
-
25
-
26
- def _normalize_text(value: Any) -> str:
27
- return " ".join(str(value or "").split()).strip()
28
-
29
-
30
- def _normalize_status(value: Any) -> str:
31
- return _normalize_text(value) or "active"
32
-
33
-
34
- def _normalize_confidence(value: Any) -> float | None:
35
- if value is None:
36
- return None
37
- try:
38
- return float(value)
39
- except (TypeError, ValueError):
40
- return None
41
-
42
-
43
- def _json_dumps(value: Any) -> str:
44
- return json.dumps(value if value is not None else [], ensure_ascii=False, sort_keys=True)
45
-
46
-
47
- def _json_loads(value: Any) -> Any:
48
- if not value:
49
- return []
50
- try:
51
- return json.loads(str(value))
52
- except json.JSONDecodeError:
53
- return []
54
-
29
+ def _ensure_project_memory_table(conn: Any, text_fn: Any) -> None:
30
+ """Ensure Project Memory SQL table and indexes exist.
55
31
 
56
- def _build_memory_id() -> str:
57
- return f"pmem_{uuid.uuid4().hex[:16]}"
32
+ Args:
33
+ conn: SQLAlchemy connection.
34
+ text_fn: SQLAlchemy text constructor.
58
35
 
36
+ Returns:
37
+ None.
38
+ """
59
39
 
60
- def _ensure_project_memory_table(conn: Any, text_fn: Any) -> None:
61
40
  conn.execute(text_fn(PROJECT_MEMORY_TABLE_SQL))
62
41
  conn.execute(text_fn(PROJECT_MEMORY_SCOPE_INDEX_SQL))
63
42
  conn.execute(text_fn(PROJECT_MEMORY_TYPE_INDEX_SQL))
64
43
 
65
44
 
66
- def _build_record_params(
67
- *,
68
- memory_id: str | None,
69
- project_id: str,
70
- user_id: str,
71
- source_session_id: str | None,
72
- source_message_id: str | None,
73
- source_id: str | None,
74
- memory_type: str,
75
- content: str,
76
- evidence: list[dict[str, Any]] | None,
77
- confidence: float | None,
78
- status: str,
79
- ) -> dict[str, Any]:
80
- now = _utcnow_iso()
81
- return {
82
- "memory_id": _normalize_text(memory_id) or _build_memory_id(),
83
- "project_id": _normalize_text(project_id),
84
- "user_id": _normalize_text(user_id),
85
- "source_session_id": _normalize_text(source_session_id),
86
- "source_message_id": _normalize_text(source_message_id),
87
- "source_id": _normalize_text(source_id),
88
- "memory_type": _normalize_text(memory_type) or "fact",
89
- "content": str(content or "").strip(),
90
- "evidence_json": _json_dumps(evidence),
91
- "confidence": confidence,
92
- "status": _normalize_status(status),
93
- "created_at": now,
94
- "updated_at": now,
95
- }
96
-
97
-
98
- def _row_to_record(row: Any) -> dict[str, Any]:
99
- record = dict(row)
100
- record["evidence"] = _json_loads(record.pop("evidence_json", ""))
101
- record["confidence"] = _normalize_confidence(record.get("confidence"))
102
- return record
103
-
104
-
105
- def _require_scope(project_id: str, user_id: str) -> tuple[str, str]:
106
- resolved_project_id = _normalize_text(project_id)
107
- resolved_user_id = _normalize_text(user_id)
108
- if not resolved_project_id:
109
- raise ValueError("project_id is required")
110
- if not resolved_user_id:
111
- raise ValueError("user_id is required")
112
- return resolved_project_id, resolved_user_id
113
-
114
-
115
- def _require_content(content: str) -> str:
116
- resolved = str(content or "").strip()
117
- if not resolved:
118
- raise ValueError("content is required")
119
- return resolved
45
+ def _project_memory_engine(build_sqlalchemy_engine_fn: Callable[[], Any]) -> Any:
46
+ """Resolve the SQLAlchemy engine used by Project Memory storage.
120
47
 
48
+ Args:
49
+ build_sqlalchemy_engine_fn: Engine factory injected for tests/runtime.
50
+
51
+ Returns:
52
+ SQLAlchemy engine.
53
+
54
+ Raises:
55
+ RuntimeError: If no SQLAlchemy engine is available.
56
+ """
121
57
 
122
- def _project_memory_engine(build_sqlalchemy_engine_fn: Callable[[], Any]) -> Any:
123
58
  engine = build_sqlalchemy_engine_fn()
124
59
  if engine is None:
125
60
  raise RuntimeError("SQLAlchemy engine is unavailable for project memory storage")
@@ -141,10 +76,28 @@ def upsert_project_memory_record(
141
76
  status: str = "active",
142
77
  build_sqlalchemy_engine_fn: Callable[[], Any] = build_sqlalchemy_engine,
143
78
  ) -> dict[str, Any]:
144
- """Create or update a Project Memory record in SQL storage."""
145
-
146
- resolved_project_id, resolved_user_id = _require_scope(project_id, user_id)
147
- params = _build_record_params(
79
+ """Create or update a Project Memory record in SQL storage.
80
+
81
+ Args:
82
+ project_id: Owning project id.
83
+ user_id: Owning user id.
84
+ content: Durable memory text.
85
+ memory_id: Optional existing memory id for update.
86
+ memory_type: Memory category.
87
+ source_session_id: Producing session id, when available.
88
+ source_message_id: Producing message id, when available.
89
+ source_id: Producing source id, when available.
90
+ evidence: Optional supporting snippets.
91
+ confidence: Optional confidence score.
92
+ status: Lifecycle status.
93
+ build_sqlalchemy_engine_fn: Engine factory injected for tests/runtime.
94
+
95
+ Returns:
96
+ Persisted ProjectMemoryRecord as a dict.
97
+ """
98
+
99
+ resolved_project_id, resolved_user_id = require_project_memory_scope(project_id, user_id)
100
+ params = build_project_memory_params(
148
101
  memory_id=memory_id,
149
102
  project_id=resolved_project_id,
150
103
  user_id=resolved_user_id,
@@ -152,9 +105,9 @@ def upsert_project_memory_record(
152
105
  source_message_id=source_message_id,
153
106
  source_id=source_id,
154
107
  memory_type=memory_type,
155
- content=_require_content(content),
108
+ content=require_project_memory_content(content),
156
109
  evidence=evidence,
157
- confidence=_normalize_confidence(confidence),
110
+ confidence=normalize_project_memory_confidence(confidence),
158
111
  status=status,
159
112
  )
160
113
  from sqlalchemy import text
@@ -184,9 +137,17 @@ def get_project_memory_record(
184
137
  memory_id: str,
185
138
  build_sqlalchemy_engine_fn: Callable[[], Any] = build_sqlalchemy_engine,
186
139
  ) -> dict[str, Any] | None:
187
- """Fetch one Project Memory record by id."""
140
+ """Fetch one Project Memory record by id.
141
+
142
+ Args:
143
+ memory_id: Stable Project Memory identifier.
144
+ build_sqlalchemy_engine_fn: Engine factory injected for tests/runtime.
145
+
146
+ Returns:
147
+ ProjectMemoryRecord as a dict, or None when not found.
148
+ """
188
149
 
189
- resolved_memory_id = _normalize_text(memory_id)
150
+ resolved_memory_id = normalize_project_memory_text(memory_id)
190
151
  if not resolved_memory_id:
191
152
  return None
192
153
  from sqlalchemy import text
@@ -197,7 +158,7 @@ def get_project_memory_record(
197
158
  text(PROJECT_MEMORY_SELECT_BASE_SQL + " WHERE memory_id = :memory_id LIMIT 1"),
198
159
  {"memory_id": resolved_memory_id},
199
160
  ).mappings().first()
200
- return _row_to_record(row) if row else None
161
+ return row_to_project_memory_record(row) if row else None
201
162
 
202
163
 
203
164
  def list_project_memory_records(
@@ -207,10 +168,20 @@ def list_project_memory_records(
207
168
  status: str = "active",
208
169
  build_sqlalchemy_engine_fn: Callable[[], Any] = build_sqlalchemy_engine,
209
170
  ) -> list[dict[str, Any]]:
210
- """List Project Memory records by project/user scope and status."""
171
+ """List Project Memory records by project/user scope and status.
172
+
173
+ Args:
174
+ project_id: Owning project id.
175
+ user_id: Owning user id.
176
+ status: Lifecycle status filter.
177
+ build_sqlalchemy_engine_fn: Engine factory injected for tests/runtime.
178
+
179
+ Returns:
180
+ ProjectMemoryRecord dicts ordered by updated_at descending.
181
+ """
211
182
 
212
- resolved_project_id, resolved_user_id = _require_scope(project_id, user_id)
213
- resolved_status = _normalize_status(status)
183
+ resolved_project_id, resolved_user_id = require_project_memory_scope(project_id, user_id)
184
+ resolved_status = normalize_project_memory_status(status)
214
185
  from sqlalchemy import text
215
186
 
216
187
  with _project_memory_engine(build_sqlalchemy_engine_fn).begin() as conn:
@@ -219,7 +190,7 @@ def list_project_memory_records(
219
190
  text(PROJECT_MEMORY_SELECT_BASE_SQL + PROJECT_MEMORY_LIST_WHERE_SQL),
220
191
  {"project_id": resolved_project_id, "user_id": resolved_user_id, "status": resolved_status},
221
192
  ).mappings().all()
222
- return [_row_to_record(row) for row in rows]
193
+ return [row_to_project_memory_record(row) for row in rows]
223
194
 
224
195
 
225
196
  def search_project_memory_records(
@@ -231,9 +202,21 @@ def search_project_memory_records(
231
202
  status: str = "active",
232
203
  build_sqlalchemy_engine_fn: Callable[[], Any] = build_sqlalchemy_engine,
233
204
  ) -> list[dict[str, Any]]:
234
- """Lexically recall Project Memory records within one project/user scope."""
205
+ """Lexically recall Project Memory records within one project/user scope.
235
206
 
236
- clean_query = _normalize_text(query)
207
+ Args:
208
+ project_id: Owning project id.
209
+ user_id: Owning user id.
210
+ query: Recall query text.
211
+ top_k: Maximum number of records to return.
212
+ status: Lifecycle status filter.
213
+ build_sqlalchemy_engine_fn: Engine factory injected for tests/runtime.
214
+
215
+ Returns:
216
+ Matching ProjectMemoryRecord dicts ordered by score and recency.
217
+ """
218
+
219
+ clean_query = normalize_project_memory_text(query)
237
220
  if not clean_query:
238
221
  return []
239
222
  scoped_rows = list_project_memory_records(
@@ -243,14 +226,7 @@ def search_project_memory_records(
243
226
  build_sqlalchemy_engine_fn=build_sqlalchemy_engine_fn,
244
227
  )
245
228
  query_terms = [term.lower() for term in clean_query.split() if term.strip()]
246
- scored_rows = [_score_record(row, query_terms) for row in scoped_rows]
229
+ scored_rows = [score_project_memory_record(row, query_terms) for row in scoped_rows]
247
230
  matches = [item for item in scored_rows if item[0] > 0]
248
231
  matches.sort(key=lambda item: (item[0], str(item[1].get("updated_at") or "")), reverse=True)
249
232
  return [row for _, row in matches[: max(1, min(int(top_k or 5), 20))]]
250
-
251
-
252
- def _score_record(record: dict[str, Any], query_terms: list[str]) -> tuple[int, dict[str, Any]]:
253
- content = str(record.get("content") or "").lower()
254
- memory_type = str(record.get("memory_type") or "").lower()
255
- haystack = f"{memory_type} {content}"
256
- return sum(1 for term in query_terms if term in haystack), record
@@ -0,0 +1,10 @@
1
+ """Project Memory runtime policy helpers."""
2
+
3
+ from flare_kernel.runtime.project_memory.extraction import extract_project_memory_candidates
4
+ from flare_kernel.runtime.project_memory.recall import build_project_memory_recall, recall_project_memory
5
+
6
+ __all__ = [
7
+ "build_project_memory_recall",
8
+ "extract_project_memory_candidates",
9
+ "recall_project_memory",
10
+ ]