Commit 08a3417
feat: Add complete CI/CD infrastructure and enhancements (#1)
* v0.1.0a2
* 0.1.0a3
* fix: rm type hint
* 0.10.0a14
* 0.1.0a16. 'injected_kwargs' to 'vars'
* 0.1.0a18
* 0.1.0a18
* fix docs
* fix strict
* fix uv cache
* fix
* add: image details and file and video support in signature
* 0.1.0a19
* add: cache response, mcp
* 0.1.0a19
* 0.1.0a20
* refactor: create MCPTool class and enable parallel execution for MCP tools
Major improvements to tool architecture:
1. Created MCPTool class that wraps MCP tools as Tool objects
- Enables polymorphism: Local and MCP tools treated uniformly
- Automatic telemetry with MCP-specific attributes
- Consistent error handling
2. Refactored ToolLibrary.forward() and aforward()
- Reduced from ~200 lines to ~90 lines (55% reduction)
- Removed ~110 lines of duplicated MCP inline code
- Unified logic for Local and MCP tools
3. MAJOR: Added parallelism for MCP tools
- Before: MCP tools executed serially (one at a time)
- After: MCP tools execute in parallel via scatter_gather
- Performance gain: up to 3x speedup for multiple MCP tool calls
4. Enhanced Tool base class
- Added tool-specific telemetry in _call() method
- Both Local and MCP tools now properly traced
- Automatic mcp.tool.type attribute ("local" vs "remote")
Benefits:
- Cleaner, more maintainable code
- Better performance for MCP tools
- Unified telemetry approach
- Backward compatible
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* add: batch support jinaai
* refactor: telemetry
* fix: handle MCP connection failures gracefully
Fixes two critical bugs when MCP server connection fails:
1. filter_tools() crash on None
- Added None/empty check before iterating tools
- Returns empty list instead of crashing
2. ToolLibrary stops initialization on MCP failure
- Wrapped MCP connection in try/except
- Logs error and continues instead of failing
- Local tools remain functional even if MCP fails
3. Missing tool_config attribute
- Added getattr() with default {} in add() method
- Handles tools without tool_config attribute
Result: Agent creation succeeds even when MCP servers are unavailable,
allowing local tools to work normally. MCP failures are logged but
don't break the entire agent.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: remove duplicated _call_impl and _acall_impl from Tool
Tool class was unnecessarily overriding _call_impl and _acall_impl with
identical implementations to Module. These methods only handle forward
hooks, which don't need customization for tools.
Changes:
- Removed _call_impl override (25 lines)
- Removed _acall_impl override (25 lines)
- Tool now inherits these from Module
- Kept _call and _acall overrides (have tool-specific telemetry)
Result: -50 lines of duplicated code, cleaner inheritance hierarchy.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: introduce LM (Language Model) wrapper module
Adds LM module as a Module wrapper around language models, enabling:
- Forward hooks for intercepting/modifying LM calls
- Composition patterns (fallback, retry, caching)
- Symmetry with other Agent components like ToolLibrary
Architecture:
- Agent now uses self.lm internally (wraps model automatically)
- Agent accepts both Model and LM as 'model' parameter
- Auto-detection: if model is LM, uses directly; otherwise wraps it
- Backward compatible: agent.model property still works
Benefits:
- Enables powerful hooks on LM calls (pre/post-processing)
- Facilitates composition (FallbackLM, CachedLM, RetryLM)
- Consistent architecture (agent.lm + agent.tools)
- 100% backward compatible
Usage:
# Standard usage (auto-wraps)
agent = nn.Agent(model=mf.Model.chat_completion("openai/gpt-4o"))
# Advanced usage with hooks
lm = nn.LM(model=model)
lm.register_forward_pre_hook(adjust_temperature)
agent = nn.Agent(model=lm)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: cleanup LM and move _set_config to Agent
LM improvements:
- Added model_type validation in LM.__init__ (moved from Agent)
- Removed auto name-setting (was problematic with model_name)
- Removed __repr__ override (use Module's default)
- Removed model_name and model_type properties (unnecessary)
- Removed _set_model method (simplified)
- Cleaner, minimal LM implementation
Module/Agent separation:
- Moved _set_config from Module to Agent where it belongs
- _set_config has Agent-specific keys (verbose, tool_choice, etc.)
- Other modules (Embedder, Retriever, etc.) define their own _set_config
- Cleaner separation of concerns
Result: -88 lines total, better architecture
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* clean lm
* add: image e video kwargs
* refactor: apply auto-wrapping pattern to Retriever/Embedder
Applied the same pattern used for Agent/LM to Retriever/Embedder:
- Changed `embedder` parameter to `model` with auto-wrapping
- Auto-wraps EmbedderModel in Embedder if not already an Embedder
- Added model property for convenient access to underlying model
- Changed `response_template` parameter to `templates` dict
- Uses Module's _set_templates for template handling
This enables users to:
1. Pass Embedder directly for advanced usage with hooks
2. Pass EmbedderModel which gets auto-wrapped in Embedder
3. Use standardized templates API consistent with Agent
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: remove backward compatibility comments
Removed backward compatibility comments from codebase as we are in alpha phase without released users. Kept the actual compatibility code in place, only removed explanatory comments.
Changes:
- Removed comments from __init__.py (ToolBase alias)
- Removed comments from module.py (call_super_init, aforward fallback)
- Removed comments from tool.py (mcp_clients storage)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* lint
* telemetry
* refactor tool
* fix: tool md
* chore: improve .gitignore organization and coverage
- Organize into clear sections with comments
- Add coverage for test artifacts (.coverage, htmlcov/)
- Add more cache types (.mypy_cache, .pytype, etc)
- Add IDE support (.idea/, swap files)
- Keep uv.lock for reproducibility (removed *.lock wildcard)
- Keep .python-version for project consistency
- Add .claude/ for Claude Code local config
- Temporarily ignore:
- /docs/, /examples/, /next_version/
- CI/CD workflows (only gh-pages needed for now)
- /tests/ (work in progress)
- MCP docs (to be moved to /docs later)
- New providers (anthropic, google, mistral - dedicated branches)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: add project configuration files
- Add .python-version (3.12) for consistent Python version
- Add .pre-commit-config.yaml with gitleaks, uv-lock, and ruff hooks
- Add uv.lock for dependency reproducibility
These files ensure consistent development environment across all
contributors and CI/CD pipelines.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: add project context documentation (CLAUDE.md)
Add comprehensive context documentation for AI assistants and
developers working on the project. This document includes:
- Project overview and current status
- Architecture evolution and separated components
- Dependency information and integration notes
- Development workflow and tooling
- Migration roadmap and key decisions
- Notes for AI assistants about the codebase
This helps maintain context across development sessions and
provides clear guidance on project structure and future plans.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: add msgtrace dependency group
Add msgtrace development dependency group with:
- FastAPI and uvicorn for backend server
- Pydantic for data validation
- WebSockets for real-time communication
- aiohttp and httpx for async HTTP clients
- python-multipart for form data handling
This group supports local development and testing of the
msgtrace observability service integration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: remove unused import in telemetry
Remove unused NoOpTracerProvider import from tracer.py.
This import was not being used in the module.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: improve mkdocs configuration
Enhance MkDocs setup with:
- Better theme configuration (logo, favicon, colors)
- More navigation features (tabs, instant loading, tracking)
- Enhanced search capabilities
- Better code highlighting and annotations
- Improved content features (tabs, tooltips)
- Repository links and metadata
- Extended markdown extensions support
Documentation structure and content remain work in progress.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: migrate to msgtrace-sdk for telemetry
Migrate from built-in OpenTelemetry implementation to msgtrace-sdk,
creating a cleaner separation of concerns and leveraging a dedicated
AI tracing SDK.
## Changes
### Dependencies
- Add msgtrace-sdk>=1.0.0 as core dependency
- Remove direct OpenTelemetry dependencies (now via msgtrace-sdk)
- Keep OpenTelemetry instrumenters for providers (openai, google)
### Environment Configuration (envs.py)
- Add telemetry_enabled (maps to MSGTRACE_TELEMETRY_ENABLED)
- Add telemetry_exporter (otlp/console, maps to MSGTRACE_EXPORTER)
- Add telemetry_service_name (maps to MSGTRACE_SERVICE_NAME)
- Add configure_msgtrace_env() to sync MSGFLUX_* → MSGTRACE_* vars
- Keep telemetry_requires_trace as property for backward compat
### Telemetry Module
- **tracer.py**: Re-export msgtrace-sdk tracer
- **attributes.py**: Re-export MsgTraceAttributes from msgtrace-sdk
- **span.py**:
- Inherit Spans from msgtrace-sdk (gets all context managers & decorators)
- Keep msgflux-specific tool decorators (set_tool_attributes, aset_tool_attributes)
- Keep msgflux-specific agent decorators (set_agent_attributes, aset_agent_attributes)
- Detailed capture: tool_call_id, execution_type, protocol, arguments, responses
### Features Preserved
- ✅ Tool execution tracking (local/remote, MCP/A2A protocols)
- ✅ Agent telemetry (name, ID hash, responses)
- ✅ Detailed argument/response capture with msgspec encoding
- ✅ Conditional capture based on envs (telemetry_capture_tool_call_responses)
- ✅ Stream response detection (avoid capturing ModelStreamResponse)
### Features from msgtrace-sdk
- ✅ Spans API (span_context, init_flow, init_module)
- ✅ Async support (aspan_context, ainit_flow, ainit_module)
- ✅ Decorators (instrument, ainstrument)
- ✅ 60+ GenAI attributes following OpenTelemetry spec
- ✅ Zero-overhead when disabled
- ✅ Thread-safe singleton pattern
### Documentation
- Update CLAUDE.md with msgtrace-sdk integration status
- Add test_msgtrace_migration.py for validating integration
## Dependencies
This migration requires msgtrace-sdk PR#13 to be merged and released:
- Module attributes (set_module_name, set_module_type)
- Extended tool attributes (set_tool_execution_type, set_tool_protocol)
- Extended agent attributes (set_agent_response)
## Testing
Testing awaits msgtrace-sdk v1.0.1 release with new attributes.
Use test_msgtrace_migration.py to validate after release.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: update all imports to use Spans.instrument from msgtrace-sdk
Replace deprecated 'instrument' function imports with Spans class:
- Updated src/msgflux/__init__.py to export Spans instead of instrument
- Updated src/msgflux/nn/functional.py to use @Spans.instrument decorator
- Updated src/msgflux/protocols/mcp/client.py to use @Spans.instrument decorator
- Updated pyproject.toml to require msgtrace-sdk>=1.1.0 and Python>=3.10
All migration tests passing successfully.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: use Spans class methods and MsgTraceAttributes in Module
Replace instance-based telemetry with static class methods:
- Use Spans.init_module/ainit_module instead of self._spans.init_module
- Use Spans.init_flow/ainit_flow instead of self._spans.init_flow
- Add MsgTraceAttributes.set_module_name and set_module_type calls
- Remove _spans instance variable from Module.__init__
Benefits:
- Cleaner API with direct class method calls
- Explicit attribute setting with MsgTraceAttributes
- Consistent with msgtrace-sdk patterns
- Reduces instance state overhead
All tests passing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: clean up telemetry integration with msgtrace-sdk
Major simplifications and improvements:
1. Remove unnecessary files:
- Delete tracer.py (use msgtrace.sdk.tracer directly)
- Delete attributes.py (use msgtrace.sdk.MsgTraceAttributes directly)
- Remove spans singleton instance (use Spans class methods)
2. Simplify envs.py:
- Remove msgtrace-specific envs (telemetry_enabled, otlp_endpoint, etc)
- Keep only msgflux-specific settings (capture_tool_call_responses, etc)
- Make configure_msgtrace_env() user-callable with parameters
- Don't call configure automatically on import
3. Fix decorator usage:
- Use @Spans.ainstrument() for async functions
- Use @Spans.instrument() for sync functions
- Remove redundant function names from decorators
- Applied in: functional.py (13 functions), mcp/client.py (5 methods)
4. Import directly from msgtrace-sdk:
- Import Spans and MsgTraceAttributes from msgtrace.sdk
- Export only msgflux-specific decorators in telemetry module
Benefits:
- Cleaner, more maintainable code
- Less abstraction overhead
- User controls msgtrace configuration
- Proper async instrumentation
- DRY principle (no redundant names)
All tests passing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: bump msgspec-ext to >=0.5.0
Update msgspec-ext dependency to use the latest version (>=0.5.0).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: add Optional types to configure_msgtrace_env parameters
Mark all parameters in configure_msgtrace_env as Optional since they
all have default values.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: add model profiles system with models.dev integration
Implements comprehensive model profile system that provides metadata,
capabilities, pricing, and limits for models from models.dev API.
Features:
- Lazy loading with background fetch from models.dev
- HuggingFace-style disk cache (~/.cache/msgflux/)
- 24h TTL with automatic background refresh
- vLLM/Ollama fallback to OpenRouter data (open-source models)
- Cost calculation per token and per 1M tokens
- Thread-safe singleton registry
Components:
- profiles/base.py: Dataclasses (ModelProfile, ProviderProfile, etc)
- profiles/loader.py: Fetch & cache with timestamp validation
- profiles/registry.py: Singleton registry with lazy loading
- profiles/__init__.py: Public API
Integration:
- HTTPXModelClient._initialize(): Triggers profile loading
- .profile property on OpenAI, vLLM, Ollama providers
- Uses self.provider and self.model_id for lookups
Example usage:
model = OpenAIChatCompletion("gpt-4o")
profile = model.profile
# Check capabilities
if profile.capabilities.tool_call:
print("Supports tool calling")
# Calculate cost
cost = profile.cost.calculate(
input_tokens=1000,
output_tokens=500
)
Environment variables:
- MSGFLUX_CACHE_HOME: Override cache location
- MSGFLUX_PROFILE_CACHE_TTL: Cache TTL in seconds (default: 86400)
All tests passing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: move imports to top and use envs for cache TTL
- Move ensure_profiles_loaded import to top of httpx.py
- Add profile_cache_ttl to envs.py with type validation
- Use envs.profile_cache_ttl instead of os.environ.get()
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: remove test_msgtrace_migration.py and move test_profiles.py to tests/
* refactor: simplify test_profiles.py and move to tests/models/
* feat: add complete CI/CD infrastructure
- Add GitHub Actions workflows for CI, publishing, and automation
- Add pre-commit hooks for code quality (gitleaks, ruff, uv-lock)
- Add automated release script with security validation
- Add branch protection and label management scripts
- Add CONTRIBUTING.md with detailed development workflows
- Add CHANGELOG.md for tracking changes
- Add pull request and issue templates
- Add automated merge bot and release drafter
- Add security scanning with CodeQL
- Add twine and packaging to dev dependencies for release validation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: add CI and publish workflows
- Add GitHub Actions CI workflow for lint, test, and build
- Add publish workflow for automated PyPI releases
- Force add workflows despite gitignore
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* style: format code with ruff
- Auto-format 79 files with ruff format
- Auto-fix 67 lint errors with ruff check --fix
- Improve code consistency and readability
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: prepare repo for upstream merge
- Update .github/labeler.yml to use msgflux structure instead of msgtrace
- Remove init branch from docs.yml workflow (merging to main)
- Update CONTRIBUTING.md examples to use msgflux classes
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 4cceeca commit 08a3417
File tree
217 files changed
+33449
-0
lines changed- .github
- workflows
- docs
- _includes
- api-reference
- databases
- types
- models
- types
- nn
- modules
- blog
- posts
- 23-02
- 25-01
- generation
- getting-started
- guides
- stylesheets
- scripts
- src/msgflux
- _private
- data
- dbs
- providers
- parsers
- providers
- retrievers
- providers
- dsl
- typed_parsers
- providers
- generation
- reasoning
- models
- profiles
- providers
- nn
- modules
- protocols
- mcp
- auth
- telemetry
- tools
- utils
- tests/models
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
217 files changed
+33449
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
0 commit comments