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.
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/PKG-INFO +1 -1
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/pyproject.toml +1 -1
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/__init__.py +8 -0
- flare_kernel-0.2.6/src/flare_kernel/contracts/project_memory_contract.py +85 -0
- flare_kernel-0.2.6/src/flare_kernel/runtime/infrastructure/project_memory_codec.py +231 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/project_memory_store.py +93 -117
- flare_kernel-0.2.6/src/flare_kernel/runtime/project_memory/__init__.py +10 -0
- flare_kernel-0.2.6/src/flare_kernel/runtime/project_memory/extraction.py +273 -0
- flare_kernel-0.2.6/src/flare_kernel/runtime/project_memory/recall.py +118 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/PKG-INFO +1 -1
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/SOURCES.txt +6 -0
- flare_kernel-0.2.6/tests/test_project_memory_runtime.py +102 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/README.md +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/setup.cfg +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/app.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/kernel_contract.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/mode.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/project_contract.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/contracts/session_contract.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/main.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/project_store.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/chat.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/errors.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/project.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/api/session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/analysis.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/checkpoint.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/analysis.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/inputs.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/context/session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/contract_support.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/flow.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/canonical/projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/guided.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/response_builder.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/completion/selection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/context/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/context/endpoint.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/context/sourcing_preview.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/amount_quantity.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/answer.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/checkpoint.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/hydration.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/authority/session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/canonicalization.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/clarification.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/decision_rules.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/deployment_delivery.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/entry_policy.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/extractors.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/extraction/merge.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/entity.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_projection/source.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/field_scope.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/confirmed_updates.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/flags.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/followup.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/followup_work_item.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/open_fields.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/status.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/guided/summary.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/inputs.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/node_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/numeric.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/payload_updates.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/readiness.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/state_persistence.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/chooser_stage.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/guided_session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/status/schema.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intake/workflow_checkpoint.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/classifier_utils.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/compat_aliases.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/override.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/pipeline.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/escalation/signal.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/routing.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/fields.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/intent/session_intent/small_talk.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/intake.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/intent.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_constants/patch.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/health.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/knowledge.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/sourcing.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_endpoint_handlers/turn.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/canonical_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/dependency_resolution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/flow.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/orchestration.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/payload_enrichment.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/turn_context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_facade/utils.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/intent_query.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/mode.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_flow_bindings/session_intent.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/action.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/intake.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/intent_query.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_request_pipeline/intent_signal.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/action.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/execution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/run.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/kernel_route/stream.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/mode/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/mode/resolution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/mode/switch.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/next_actions_guard.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/actions.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/builder.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/checkpoint_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/context_helpers.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/decision.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/followup_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/result.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/runtime_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/decision.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/entry.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/flow.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/followup.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/intent.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/node.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/status/state/unpack.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/orchestration/trace/steps.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/patch_contract.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/action.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/analysis_canvas.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/payload/enrichment.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/context_blocks.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/prompting/response_strategy.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/request/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/request/identity.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/request/intent_resolution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/aliases.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/field_queries.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/query_builder.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/retrieval/search.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/source_library.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/completion.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/finalize.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/phase.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/phase_timing.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/post_completion.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/draft/prologue.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/event_emitter.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/intake/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/intake/phase.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/mode/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/mode/event_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/mode/events.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/bootstrap.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/builder.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/builder_transport.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/draft_phase.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/phase_groups.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/phases.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/response/runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/retrieval/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/retrieval/phase.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/runtime/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/streaming/runtime/steps.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/router/text_safety.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/document_application.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/reasoning_application.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/session_context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/context/track_application.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/domain/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/domain/domain_pack_loader.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/domain/profile_resolution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/execution/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/execution/agent_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/execution/skill_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/chat_memory.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/database.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/dependency_status.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/infrastructure.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_ingest.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_memory.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_postgres_search.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_qdrant_search.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_search.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/knowledge_terms.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/logging.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/project_memory_sql.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/redis_client.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/session/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/session/repository.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/session/repository_memory.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/source/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/source/library_persistence.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/source/text_extractor.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/sourcing/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/sourcing/persistence.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/sourcing/provider.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/trace.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/infrastructure/vector_store.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/decision.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/lexicon.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/preprocessing.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation/signals.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/intent/intent_and_escalation_classifier.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/llm/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/llm/llm_provider.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/llm/model_router.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/analysis_router_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/canvas_sourcing_contract.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/decision_engine.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/orchestration.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/canvas.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/followup.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/question.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/question_steps.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/stage.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/summary.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/plan/trace.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/reasoning.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode/runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_question.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/mode_orchestration_plan_question_steps.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/observation.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/response_strategy_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/session_context_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/sourcing/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/sourcing/event_payloads.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/sourcing/search_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/structured_reasoning.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/orchestration/track_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/api.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/branching/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/branching/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/branching/policy.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/field_selection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/gap_detection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/hypothesis.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/planning.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/priority.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/builder.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/extraction.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/question/planner.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/readiness/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/readiness/core.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/readiness/scoring.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/shared.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/understanding_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/reasoning/intake/visible_response.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/checkpoint_manager.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/intake_session_store.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/session/models.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/__init__.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/artifacts.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/chunk_storage.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/knowledge_storage.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/runtime/source_ingestion/storage.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/session_record_policy.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/session_store.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel/user_store.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/dependency_links.txt +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/requires.txt +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/src/flare_kernel.egg-info/top_level.txt +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_action_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_analysis_canvas_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_analysis_route_projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_basics.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_builder_split_modules.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_business_hardcode_guard.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_context_analysis.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_context_inputs.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_context_session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_flow.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canonical_state_projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_canvas_sourcing_contract_meta.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_chat_api_alias.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_command_resolution_analysis_mode.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_compat_aliases.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_completion_response_builder.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_completion_selection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_decision_engine.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_domain_pack_loader.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_endpoint_context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_flare_v1_patch_contract.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_guided_completion.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_infrastructure_helpers.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_infrastructure_knowledge.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_amount_quantity.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_answer.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority_checkpoint.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority_hydration.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_authority_session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_canonicalization.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_clarification.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_decision_rules.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_deployment_delivery.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_domain_context_options.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_entry_policy.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_extraction.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_extraction_extractors.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_extraction_merge.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection_entity.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_projection_source.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_field_scope.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_confirmed_updates.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_flags.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_followup.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_followup_work_item.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_open_fields.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_status.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_guided_summary.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_inputs.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_node_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_numeric.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_payload_updates.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_readiness.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_reasoning_priority.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_state_persistence.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_guided_session.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_schema.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_status_stage.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intake_workflow_checkpoint.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_classifier_utils.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_classifier.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_override.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_pipeline.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_escalation_signal.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_resolution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_retrieval.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_routing.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_intent_type_compat_aliases.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_alias_delegation.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_endpoint_handlers.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_endpoint_handlers_sourcing.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_facade_helpers.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_facade_turn_context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_intent_query_flow.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_mode_flow.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_route_execution_wrappers.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_kernel_session_intent_flow.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_llm_provider.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_plan_canvas_saved_content.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_plan_finalize.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_plan_runtime_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_orchestration_state_bridge.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_reasoning.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_resolution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_mode_switch.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_model_router.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_new_flow_guard.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_checkpoint_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_followup_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_context_helpers.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_decision.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_result.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_runtime_state.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_context.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_decision.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_entry.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_followup.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_intent.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_node.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_status_state_unpack.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_trace.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_trace_projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_orchestration_trace_steps.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_patch_contract.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_payload_enrichment.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_project_api.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_project_memory_store.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_prompting_analysis_instruction.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_request_identity.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_request_intent_resolution.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_response_strategy_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_aliases.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_field_queries.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_projection.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_query_builder.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_retrieval_search.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_api.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_context_persistence.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_intent.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_intent_fields.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_session_intent_small_talk.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_ingestion_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_ingestion_ssot_acceptance.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_library.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_library_persistence_scope.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_source_text_extractor.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_sourcing_provider.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_sourcing_search_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_completion.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_finalize.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_phase.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_post_completion.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_draft_prologue.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_event_emitter.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_intake_phase.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_mode_event_payload.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_mode_events.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_response_bootstrap.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_response_phases.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_response_runtime.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_retrieval_phase.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_streaming_runtime_steps.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_text_safety.py +0 -0
- {flare_kernel-0.2.5 → flare_kernel-0.2.6}/tests/test_track_runtime.py +0 -0
|
@@ -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
|
|
23
|
-
|
|
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
|
-
|
|
57
|
-
|
|
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
|
|
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
|
-
|
|
147
|
-
|
|
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=
|
|
108
|
+
content=require_project_memory_content(content),
|
|
156
109
|
evidence=evidence,
|
|
157
|
-
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 =
|
|
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
|
|
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 =
|
|
213
|
-
resolved_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 [
|
|
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
|
-
|
|
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 = [
|
|
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
|
+
]
|