reactifact 0.14.2__tar.gz → 0.15.0__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.
- {reactifact-0.14.2/reactifact.egg-info → reactifact-0.15.0}/PKG-INFO +2 -2
- {reactifact-0.14.2 → reactifact-0.15.0}/README.md +1 -1
- {reactifact-0.14.2 → reactifact-0.15.0}/pyproject.toml +1 -1
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/__init__.py +1 -1
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/web.py +19 -4
- {reactifact-0.14.2 → reactifact-0.15.0/reactifact.egg-info}/PKG-INFO +2 -2
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_chat_web.py +72 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/LICENSE +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/__main__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/_extras.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/_httpx.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/a2a/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/a2a/client.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/a2a/models.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/a2a/remote.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/a2a/server.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/agent_tool.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/agents.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/artifacts.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/audit.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/authz.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/branching.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/budget.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cache.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/chat.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/checkpoints.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/branch.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/common.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/context.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/eval.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/graph.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/replay.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/scenario.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/skills.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/cli/trace.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/commit.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/commit_log.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/consume.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/context.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/context_builder.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/effects.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/eval/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/eval/dataset.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/eval/evaluators.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/eval/judge.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/eval/online.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/eval/runner.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/eval/scoring.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/events.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/guardrails.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/interrupt.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/llm_agent.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/logging.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/mcp/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/mcp/client.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/mcp/oauth.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/mcp/server.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/metrics.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/native_tool_use.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/operations.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/patches.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/pricing.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/produce.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/prompts.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/_retry.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/anthropic.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/azure.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/cerebras.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/chat.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/contracts.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/deepseek.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/fake.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/fireworks.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/gemini.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/github_models.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/groq.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/image.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/mistral.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/nvidia.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/ollama.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/openai.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/openrouter.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/perplexity.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/qwen.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/speech.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/together.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/video.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/xai.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/providers/zai.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/py.typed +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quick/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quick/_shared.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quick/agent.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quick/chat.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quick/models.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quick/rag.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quick/tools_agent.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/quota.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/cleanup.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/conversation.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/identity.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/inputs.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/memory.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/plan_execute.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/reflection.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/resolve.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/rollback.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/search.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/skills.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/status.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/supervisor.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/text.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/recipes/tool_loop.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/redaction.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/relations.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/replay.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/request.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/resources.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/routing.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/runtime.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/scheduler.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/session.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact/references/effects-and-state.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact/references/trust-and-safety.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-agents/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-agents/references/consume.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-agents/references/effects.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-eval/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-eval/references/online.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-from-langchain/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-llm/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-llm/references/providers.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-llm/references/tools.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-observability/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-rag/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-rag/references/sources.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-testing/SKILL.md +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/sources.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/streaming.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/structured.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/assertions.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/exceptions.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/fault.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/golden.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/lab.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/mock.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/pytest_plugin.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/record.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/testing/registry.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tool_use.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tools.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/__init__.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/_otlp.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/columns.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/langfuse.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/models.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/otlp.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/postgres.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/store.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/templates/app.css +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/templates/sessions.html +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/templates/ui.html +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/templates/ui_run.html +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/tracer.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/tracing/web.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/triggers.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/types.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/verify.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact/viz.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact.egg-info/SOURCES.txt +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact.egg-info/dependency_links.txt +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact.egg-info/entry_points.txt +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact.egg-info/requires.txt +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/reactifact.egg-info/top_level.txt +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/setup.cfg +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_a2a.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_a2a_example.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_a2a_interop.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_absent_consume.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_adaptive.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_agent_tool.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_anthropic_provider.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_artifacts.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_audit.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_authz.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_backbone.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_branching.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_budget.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_cache.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_canonical_ports.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_chat_example.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_chat_memory.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_chat_outbox.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_checkpoint.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_checkpoints_concurrency.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_cli.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_cli_scenario.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_commit_log.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_compaction.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_concurrency.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_consumes_produces.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_context_builder.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_correlated_consume.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_debounce.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_determinism.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_devops.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_devops_online.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_devops_web.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_effects.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_eval.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_eval_dataset.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_eval_judge.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_eval_online.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_eval_trajectory.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_fintech_audit.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_forklab.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_forklab_web.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_friendly_api.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_gemini_provider.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_golden.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_guardrails.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_hitl.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_image_provider.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_incident_commander.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_invalidation.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_join_consume.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_knowledge.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_knowledge_web.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_llm_ladder.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_logging.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_loop_bound_client.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_mcp.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_medic_lab.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_medic_lab_web.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_metrics.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_multisource.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_native_tool_use.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_openai_provider.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_outbox.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_patches.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_pending_actions.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_ports.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_produce_styles.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_produce_trigger.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_prompts.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_provider_auth.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_provider_retry.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_providers_integration.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_public_api.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_quick.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_quota.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_reacts_to.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipe_conversation.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipe_plan_execute.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipe_reflection.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipe_supervisor.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipe_tool_loop.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipes.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipes_inputs.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipes_memory.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_recipes_skills.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_redaction.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_relation_graph.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_relations.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_repair.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_repair_web.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_replay.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_repo_agent.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_request.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_research.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_resources.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_retry.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_routing.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_runtime.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_runtime_errors.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_scheduler_semantics.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_sessions.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_shutdown.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_skills.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_sources.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_sources_search.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_sources_vector.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_speech_provider.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_starter_app.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_streaming.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_structured.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_support_copilot.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_testing_assertions.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_testing_golden.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_testing_lab.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_testing_mock.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_testing_provenance.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_testing_pytest_plugin.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_testing_registry.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_token_budget.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_tools.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_trace_columns.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_trace_tags.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_tracing.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_type_registry.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_vendor_factories.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_vendor_multimodal_factories.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_verify.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_video_provider.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_view.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_viz.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_web_source.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_workspace.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/test_workspace_with_sources.py +0 -0
- {reactifact-0.14.2 → reactifact-0.15.0}/tests/tests_checkpoints_sqlite.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: reactifact
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.0
|
|
4
4
|
Summary: Reactive, artifact-driven agent runtime: agents transform versioned, typed, provenance-aware artifacts inside an evolving context
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/bzdvdn/reactifact
|
|
@@ -55,7 +55,7 @@ Dynamic: license-file
|
|
|
55
55
|
[](https://github.com/bzdvdn/reactifact)
|
|
56
56
|
[](https://pypi.org/project/reactifact/)
|
|
57
57
|
[](LICENSE)
|
|
58
|
-
[](https://deepwiki.com/bzdvdn/reactifact)
|
|
59
59
|
[](https://bzdvdn.github.io/reactifact/)
|
|
60
60
|
|
|
61
61
|
> **Is:** a Python library (3 core deps) · single-process · typed, versioned artifacts with provenance · deterministic replay · runs offline, no API key
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
[](https://github.com/bzdvdn/reactifact)
|
|
10
10
|
[](https://pypi.org/project/reactifact/)
|
|
11
11
|
[](LICENSE)
|
|
12
|
-
[](https://deepwiki.com/bzdvdn/reactifact)
|
|
13
13
|
[](https://bzdvdn.github.io/reactifact/)
|
|
14
14
|
|
|
15
15
|
> **Is:** a Python library (3 core deps) · single-process · typed, versioned artifacts with provenance · deterministic replay · runs offline, no API key
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "reactifact"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.15.0"
|
|
8
8
|
description = "Reactive, artifact-driven agent runtime: agents transform versioned, typed, provenance-aware artifacts inside an evolving context"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -41,7 +41,7 @@ from ._extras import require_extra
|
|
|
41
41
|
from .chat import ChatAssistant, ChatEvent, ChatEventKind
|
|
42
42
|
|
|
43
43
|
if TYPE_CHECKING:
|
|
44
|
-
from fastapi import APIRouter
|
|
44
|
+
from fastapi import APIRouter, Request
|
|
45
45
|
from fastapi.responses import JSONResponse, StreamingResponse
|
|
46
46
|
|
|
47
47
|
|
|
@@ -83,6 +83,7 @@ def create_chat_router(
|
|
|
83
83
|
forward_kinds: Sequence[str] | None = None,
|
|
84
84
|
payload_shaper: Callable[[ChatEvent], Mapping[str, Any]] | None = None,
|
|
85
85
|
done_event: str | None = None,
|
|
86
|
+
request_factory: Callable[[Request], Mapping[str, Any]] | None = None,
|
|
86
87
|
) -> APIRouter:
|
|
87
88
|
"""Builds the chat router on top of a `ChatAssistant`.
|
|
88
89
|
|
|
@@ -100,6 +101,10 @@ def create_chat_router(
|
|
|
100
101
|
- `payload_shaper(event) -> mapping` — reshape a frame's payload.
|
|
101
102
|
- `done_event` — emit one extra terminal frame (e.g. `"done"`) when the
|
|
102
103
|
stream ends.
|
|
104
|
+
- `request_factory(request) -> mapping` — build the per-turn `request=`
|
|
105
|
+
mapping (the same one `ChatAssistant.stream` takes) from the incoming
|
|
106
|
+
FastAPI `Request`, e.g. the authenticated user for ACL/identity-aware
|
|
107
|
+
runs. Without it the turn runs with `request=None`.
|
|
103
108
|
|
|
104
109
|
Defaults reproduce the canonical contract exactly, so existing clients are
|
|
105
110
|
unaffected. The event schema (`ChatEvent`) and the effective names are
|
|
@@ -108,9 +113,15 @@ def create_chat_router(
|
|
|
108
113
|
# Readable error when the `web` extra is missing — then a regular
|
|
109
114
|
# (mypy-visible) import for the real types.
|
|
110
115
|
require_extra("web.create_chat_router", "fastapi", "web")
|
|
111
|
-
from fastapi import APIRouter
|
|
116
|
+
from fastapi import APIRouter, Request
|
|
112
117
|
from fastapi.responses import JSONResponse, StreamingResponse
|
|
113
118
|
|
|
119
|
+
# `Request` is only referenced from the endpoint's *string* annotation
|
|
120
|
+
# (`from __future__ import annotations`); FastAPI resolves those against
|
|
121
|
+
# the module globals, and fastapi may be absent at import time — so publish
|
|
122
|
+
# it lazily here, right before the endpoint that uses it is defined.
|
|
123
|
+
globals().setdefault("Request", Request)
|
|
124
|
+
|
|
114
125
|
names: dict[str, str] = {k: v for k, v in DEFAULT_EVENT_NAMES.items()}
|
|
115
126
|
names.update(event_names or {})
|
|
116
127
|
forward = set(forward_kinds) if forward_kinds is not None else None
|
|
@@ -140,9 +151,13 @@ def create_chat_router(
|
|
|
140
151
|
}
|
|
141
152
|
},
|
|
142
153
|
)
|
|
143
|
-
async def chat_stream(req: ChatMessage) -> StreamingResponse:
|
|
154
|
+
async def chat_stream(req: ChatMessage, request: Request) -> StreamingResponse:
|
|
155
|
+
turn_request = request_factory(request) if request_factory else None
|
|
156
|
+
|
|
144
157
|
async def stream() -> AsyncIterator[str]:
|
|
145
|
-
async for event in assistant.stream(
|
|
158
|
+
async for event in assistant.stream(
|
|
159
|
+
req.message, req.session_id, request=turn_request
|
|
160
|
+
):
|
|
146
161
|
if forward is not None and event.kind not in forward:
|
|
147
162
|
continue
|
|
148
163
|
yield sse(names.get(event.kind, event.kind), dict(shaper(event)))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: reactifact
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.0
|
|
4
4
|
Summary: Reactive, artifact-driven agent runtime: agents transform versioned, typed, provenance-aware artifacts inside an evolving context
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/bzdvdn/reactifact
|
|
@@ -55,7 +55,7 @@ Dynamic: license-file
|
|
|
55
55
|
[](https://github.com/bzdvdn/reactifact)
|
|
56
56
|
[](https://pypi.org/project/reactifact/)
|
|
57
57
|
[](LICENSE)
|
|
58
|
-
[](https://deepwiki.com/bzdvdn/reactifact)
|
|
59
59
|
[](https://bzdvdn.github.io/reactifact/)
|
|
60
60
|
|
|
61
61
|
> **Is:** a Python library (3 core deps) · single-process · typed, versioned artifacts with provenance · deterministic replay · runs offline, no API key
|
|
@@ -157,6 +157,78 @@ def test_web_router_openapi_publishes_event_schema(tmp_path):
|
|
|
157
157
|
assert "content" in responses["200"]["description"]
|
|
158
158
|
|
|
159
159
|
|
|
160
|
+
def test_web_router_request_factory_forwards_per_turn_context(tmp_path):
|
|
161
|
+
"""`request_factory` maps the FastAPI `Request` into the turn's `request=`."""
|
|
162
|
+
seen: dict[str, object] = {}
|
|
163
|
+
|
|
164
|
+
async def capture(call):
|
|
165
|
+
seen["user"] = call.request.get("user")
|
|
166
|
+
call.effects.create(A(text="answer"))
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
prod = produce(A)(capture)
|
|
170
|
+
agent = create_agent("cap", consumes=[Consume(Q)], produces=[prod])
|
|
171
|
+
store = SessionStore(FileKVBackend(os.path.join(tmp_path, "sess")))
|
|
172
|
+
assistant = ChatAssistant(
|
|
173
|
+
store=store,
|
|
174
|
+
agents=[agent],
|
|
175
|
+
user_message=Q,
|
|
176
|
+
reply=lambda ctx, msg_id: {"reply": "ok", "waiting": False},
|
|
177
|
+
max_concurrency=1,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
app = FastAPI()
|
|
181
|
+
app.include_router(
|
|
182
|
+
create_chat_router(
|
|
183
|
+
assistant,
|
|
184
|
+
request_factory=lambda request: {"user": request.headers.get("x-user", "")},
|
|
185
|
+
)
|
|
186
|
+
)
|
|
187
|
+
client = TestClient(app)
|
|
188
|
+
|
|
189
|
+
with client.stream(
|
|
190
|
+
"POST",
|
|
191
|
+
"/api/chat/stream",
|
|
192
|
+
json={"message": "hi", "session_id": "s1"},
|
|
193
|
+
headers={"X-User": "alice"},
|
|
194
|
+
) as response:
|
|
195
|
+
"".join(response.iter_text())
|
|
196
|
+
|
|
197
|
+
assert seen["user"] == "alice"
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def test_web_router_without_request_factory_has_no_request(tmp_path):
|
|
201
|
+
"""Default stays `request=None`: no behavior change for existing callers."""
|
|
202
|
+
seen: dict[str, object] = {}
|
|
203
|
+
|
|
204
|
+
async def capture(call):
|
|
205
|
+
seen["request"] = dict(call.request)
|
|
206
|
+
call.effects.create(A(text="answer"))
|
|
207
|
+
return None
|
|
208
|
+
|
|
209
|
+
prod = produce(A)(capture)
|
|
210
|
+
agent = create_agent("cap", consumes=[Consume(Q)], produces=[prod])
|
|
211
|
+
store = SessionStore(FileKVBackend(os.path.join(tmp_path, "sess")))
|
|
212
|
+
assistant = ChatAssistant(
|
|
213
|
+
store=store,
|
|
214
|
+
agents=[agent],
|
|
215
|
+
user_message=Q,
|
|
216
|
+
reply=lambda ctx, msg_id: {"reply": "ok", "waiting": False},
|
|
217
|
+
max_concurrency=1,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
app = FastAPI()
|
|
221
|
+
app.include_router(create_chat_router(assistant))
|
|
222
|
+
client = TestClient(app)
|
|
223
|
+
|
|
224
|
+
with client.stream(
|
|
225
|
+
"POST", "/api/chat/stream", json={"message": "hi", "session_id": "s1"}
|
|
226
|
+
) as response:
|
|
227
|
+
"".join(response.iter_text())
|
|
228
|
+
|
|
229
|
+
assert seen["request"] == {}
|
|
230
|
+
|
|
231
|
+
|
|
160
232
|
def test_disconnect_cancels_the_running_turn(tmp_path):
|
|
161
233
|
"""A dropped SSE client must cancel in-flight work, not leave it burning.
|
|
162
234
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact/references/effects-and-state.md
RENAMED
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact/references/trust-and-safety.md
RENAMED
|
File without changes
|
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-agents/references/consume.md
RENAMED
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-agents/references/effects.md
RENAMED
|
File without changes
|
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-eval/references/online.md
RENAMED
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-from-langchain/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-llm/references/providers.md
RENAMED
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-llm/references/tools.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{reactifact-0.14.2 → reactifact-0.15.0}/reactifact/skills/reactifact-rag/references/sources.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|