alloc-context 0.2.2__tar.gz → 0.2.3__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.
- {alloc_context-0.2.2 → alloc_context-0.2.3}/PKG-INFO +17 -16
- {alloc_context-0.2.2 → alloc_context-0.2.3}/README.md +10 -9
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/PKG-INFO +17 -16
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/SOURCES.txt +1 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/__init__.py +1 -1
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/bazaar.py +10 -8
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/server.py +2 -1
- {alloc_context-0.2.2 → alloc_context-0.2.3}/pyproject.toml +11 -11
- alloc_context-0.2.3/tests/test_check_pypi_release_json.py +55 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_glama_well_known.py +1 -1
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_server_json.py +1 -1
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_workflows.py +16 -2
- {alloc_context-0.2.2 → alloc_context-0.2.3}/LICENSE +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/dependency_links.txt +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/entry_points.txt +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/requires.txt +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/top_level.txt +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/__main__.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/config.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/constants.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/horizon.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/__init__.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/alt_quote_registry.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/alt_quote_store.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/alt_quotes.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/asset_registry.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/cf_benchmarks.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/cf_history.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coinbase_client.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coinbase_portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coingecko.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coinmarketcap.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/env_keys.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/etf_flows.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/__init__.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/coinbase_adapter.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/kraken_adapter.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/live.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/registry.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/types.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange_http.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/fear_greed.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/fred.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/http_errors.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_api.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_client.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_files.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_state.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kraken_client.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kraken_portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/macro_calendar.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/macro_normalize.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/market_snapshots.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/outcome.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/parse_helpers.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/portfolio_holdings.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/quote_resolver.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/runner.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/__init__.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/assets.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/bridge.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/bridge_portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/contracts.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/glama.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/handlers.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/http.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/instructions.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/payer.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/payment_middleware.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/setup.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/staleness.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/tool_catalog.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/tool_fields.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/upstream.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/validation.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_bazaar_dynamic.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_config.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_pricing.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_stables.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/__init__.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/allocation_analysis.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/band.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/breadth.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/cf_math.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/cluster.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/cluster_config.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/comparison.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/context.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/delta.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/etf.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/fear_greed.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/macro.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/portfolio_payload.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/rebalance.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/regime.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/sentiment.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/snapshots.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/tape.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/status_report.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/__init__.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/db.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/jsonutil.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/meta.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/retention.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/status.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/timeutil.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/user_config.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/x402_production_check.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/x402_smoke_redact.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/setup.cfg +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_backup_sqlite.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_bridge.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_bridge_portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_bump_version.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_coinbase_portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_config_cli.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_context_bundle_schema.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_context_snapshots.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_db_schema.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_deploy.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_dev_stack.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_etf.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_exchanges_config.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_fear_greed.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_fred.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_holdings_scoped_delta_regime.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_holdings_scoped_market.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_horizon.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_ingest_outcome.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_ingest_runner.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_ingest_store_integration.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_kalshi_api.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_kraken_portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_live_ingest_handlers.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_macro.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_market_breadth.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_assets_regime.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_bazaar.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_contracts.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_data_staleness.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_handlers.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_health.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_http_lifecycle.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_live_portfolio.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_server.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_validation.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402_http.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402_pricing.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402_stables.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_payer.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_portfolio_holdings.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_quote_resolver.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_rebalance.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_rollup.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_script_runtime.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_security_hardening.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_setup.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_snapshots_and_delta.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_status_report.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_tool_catalog.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_user_config.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_x402_bazaar_dynamic.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_x402_production_check.py +0 -0
- {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_x402_smoke_redact.py +0 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alloc-context
|
|
3
|
-
Version: 0.2.
|
|
4
|
-
Summary: Portfolio-aware crypto context for agents — holdings
|
|
3
|
+
Version: 0.2.3
|
|
4
|
+
Summary: Portfolio-aware crypto context for agents — holdings-scoped market, sentiment, optional allocation analysis
|
|
5
5
|
License: Elastic-2.0
|
|
6
6
|
Project-URL: Homepage, https://mcp.alloc-context.com/llms.txt
|
|
7
|
-
Project-URL: Documentation, https://github.com/
|
|
8
|
-
Project-URL: Repository, https://github.com/
|
|
9
|
-
Project-URL: Issues, https://github.com/
|
|
10
|
-
Project-URL: Changelog, https://github.com/
|
|
7
|
+
Project-URL: Documentation, https://github.com/AllocContext/alloc-context/blob/main/docs/agent-integration.md
|
|
8
|
+
Project-URL: Repository, https://github.com/AllocContext/alloc-context
|
|
9
|
+
Project-URL: Issues, https://github.com/AllocContext/alloc-context/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/AllocContext/alloc-context/releases
|
|
11
11
|
Project-URL: MCP Server, https://mcp.alloc-context.com/mcp
|
|
12
|
-
Keywords: mcp,x402,
|
|
12
|
+
Keywords: mcp,x402,holdings,portfolio,crypto,cryptocurrency,bitcoin,ethereum,agents,allocation,rebalance,coinbase,kraken
|
|
13
13
|
Classifier: Development Status :: 4 - Beta
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -44,14 +44,15 @@ Dynamic: license-file
|
|
|
44
44
|
|
|
45
45
|
# AllocContext
|
|
46
46
|
|
|
47
|
-
[](https://smithery.ai/server/@AllocContext/alloc-context)
|
|
48
|
+
[](https://glama.ai/mcp/servers/AllocContext/alloc-context)
|
|
49
49
|
|
|
50
|
-
mcp-name: io.github.
|
|
50
|
+
mcp-name: io.github.AllocContext/alloc-context
|
|
51
51
|
|
|
52
|
-
**Portfolio-aware crypto context for
|
|
53
|
-
sentiment, macro, and regime; optional
|
|
54
|
-
JSON over MCP with
|
|
52
|
+
**Portfolio-aware crypto context for whatever you hold** — discover your
|
|
53
|
+
holdings, holdings-scoped market data, sentiment, macro, and regime; optional
|
|
54
|
+
allocation analysis when you supply targets. Deterministic JSON over MCP with
|
|
55
|
+
x402 pay-per-call on Base.
|
|
55
56
|
|
|
56
57
|
> **Privacy:** nothing stored · one-time read-only · pass-through only — your
|
|
57
58
|
> keys and portfolio never persist on our servers. See [USE.md](docs/USE.md).
|
|
@@ -113,7 +114,7 @@ Not financial advice.
|
|
|
113
114
|
| **Discovery** | [llms.txt](https://mcp.alloc-context.com/llms.txt), [x402 manifest](https://mcp.alloc-context.com/.well-known/x402.json) |
|
|
114
115
|
| **Pricing** | **$0.02** cached context/math · **$0.05** live ingest or portfolio |
|
|
115
116
|
| **Payment** | x402 on Base — USDC or EURC |
|
|
116
|
-
| **Market scope** |
|
|
117
|
+
| **Market scope** | Tailored to your holdings (band OHLC for BTC/ETH; alt quote snapshots); bridge auto-scopes from portfolio |
|
|
117
118
|
|
|
118
119
|
Agents and wallets connect directly to the hosted endpoint — see
|
|
119
120
|
[agent-integration.md](docs/agent-integration.md). The Cursor bridge above
|
|
@@ -130,7 +131,7 @@ combines local portfolio reads with this upstream for market context.
|
|
|
130
131
|
| `get_rebalance_plan` | USD rebalance moves from allocation, target, and NAV |
|
|
131
132
|
| `check_allocation_band` | Drift vs target and whether allocation is outside the band |
|
|
132
133
|
| `check_allocation_bands` | Batch band checks for multiple target scenarios |
|
|
133
|
-
| `get_portfolio_state` | Live NAV and holdings
|
|
134
|
+
| `get_portfolio_state` | Live NAV and holdings (e.g. Coinbase, Kraken read-only keys) |
|
|
134
135
|
|
|
135
136
|
Market context is **holdings-scoped**: band assets (BTC/ETH) use OHLC bars; alt
|
|
136
137
|
holdings (e.g. HYPE) use quote snapshots when cached. The bridge auto-scopes
|
|
@@ -146,7 +147,7 @@ See [self-hosting.md](docs/self-hosting.md) (`self_host: true` in user config)
|
|
|
146
147
|
or [local-dev.md](docs/local-dev.md) for the dev stack.
|
|
147
148
|
|
|
148
149
|
```bash
|
|
149
|
-
git clone git@github.com:
|
|
150
|
+
git clone git@github.com:AllocContext/alloc-context.git
|
|
150
151
|
cd alloc-context
|
|
151
152
|
python3.11 -m venv .venv && source .venv/bin/activate
|
|
152
153
|
pip install -e ".[dev]"
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# AllocContext
|
|
2
2
|
|
|
3
|
-
[](https://smithery.ai/server/@AllocContext/alloc-context)
|
|
4
|
+
[](https://glama.ai/mcp/servers/AllocContext/alloc-context)
|
|
5
5
|
|
|
6
|
-
mcp-name: io.github.
|
|
6
|
+
mcp-name: io.github.AllocContext/alloc-context
|
|
7
7
|
|
|
8
|
-
**Portfolio-aware crypto context for
|
|
9
|
-
sentiment, macro, and regime; optional
|
|
10
|
-
JSON over MCP with
|
|
8
|
+
**Portfolio-aware crypto context for whatever you hold** — discover your
|
|
9
|
+
holdings, holdings-scoped market data, sentiment, macro, and regime; optional
|
|
10
|
+
allocation analysis when you supply targets. Deterministic JSON over MCP with
|
|
11
|
+
x402 pay-per-call on Base.
|
|
11
12
|
|
|
12
13
|
> **Privacy:** nothing stored · one-time read-only · pass-through only — your
|
|
13
14
|
> keys and portfolio never persist on our servers. See [USE.md](docs/USE.md).
|
|
@@ -69,7 +70,7 @@ Not financial advice.
|
|
|
69
70
|
| **Discovery** | [llms.txt](https://mcp.alloc-context.com/llms.txt), [x402 manifest](https://mcp.alloc-context.com/.well-known/x402.json) |
|
|
70
71
|
| **Pricing** | **$0.02** cached context/math · **$0.05** live ingest or portfolio |
|
|
71
72
|
| **Payment** | x402 on Base — USDC or EURC |
|
|
72
|
-
| **Market scope** |
|
|
73
|
+
| **Market scope** | Tailored to your holdings (band OHLC for BTC/ETH; alt quote snapshots); bridge auto-scopes from portfolio |
|
|
73
74
|
|
|
74
75
|
Agents and wallets connect directly to the hosted endpoint — see
|
|
75
76
|
[agent-integration.md](docs/agent-integration.md). The Cursor bridge above
|
|
@@ -86,7 +87,7 @@ combines local portfolio reads with this upstream for market context.
|
|
|
86
87
|
| `get_rebalance_plan` | USD rebalance moves from allocation, target, and NAV |
|
|
87
88
|
| `check_allocation_band` | Drift vs target and whether allocation is outside the band |
|
|
88
89
|
| `check_allocation_bands` | Batch band checks for multiple target scenarios |
|
|
89
|
-
| `get_portfolio_state` | Live NAV and holdings
|
|
90
|
+
| `get_portfolio_state` | Live NAV and holdings (e.g. Coinbase, Kraken read-only keys) |
|
|
90
91
|
|
|
91
92
|
Market context is **holdings-scoped**: band assets (BTC/ETH) use OHLC bars; alt
|
|
92
93
|
holdings (e.g. HYPE) use quote snapshots when cached. The bridge auto-scopes
|
|
@@ -102,7 +103,7 @@ See [self-hosting.md](docs/self-hosting.md) (`self_host: true` in user config)
|
|
|
102
103
|
or [local-dev.md](docs/local-dev.md) for the dev stack.
|
|
103
104
|
|
|
104
105
|
```bash
|
|
105
|
-
git clone git@github.com:
|
|
106
|
+
git clone git@github.com:AllocContext/alloc-context.git
|
|
106
107
|
cd alloc-context
|
|
107
108
|
python3.11 -m venv .venv && source .venv/bin/activate
|
|
108
109
|
pip install -e ".[dev]"
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alloc-context
|
|
3
|
-
Version: 0.2.
|
|
4
|
-
Summary: Portfolio-aware crypto context for agents — holdings
|
|
3
|
+
Version: 0.2.3
|
|
4
|
+
Summary: Portfolio-aware crypto context for agents — holdings-scoped market, sentiment, optional allocation analysis
|
|
5
5
|
License: Elastic-2.0
|
|
6
6
|
Project-URL: Homepage, https://mcp.alloc-context.com/llms.txt
|
|
7
|
-
Project-URL: Documentation, https://github.com/
|
|
8
|
-
Project-URL: Repository, https://github.com/
|
|
9
|
-
Project-URL: Issues, https://github.com/
|
|
10
|
-
Project-URL: Changelog, https://github.com/
|
|
7
|
+
Project-URL: Documentation, https://github.com/AllocContext/alloc-context/blob/main/docs/agent-integration.md
|
|
8
|
+
Project-URL: Repository, https://github.com/AllocContext/alloc-context
|
|
9
|
+
Project-URL: Issues, https://github.com/AllocContext/alloc-context/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/AllocContext/alloc-context/releases
|
|
11
11
|
Project-URL: MCP Server, https://mcp.alloc-context.com/mcp
|
|
12
|
-
Keywords: mcp,x402,
|
|
12
|
+
Keywords: mcp,x402,holdings,portfolio,crypto,cryptocurrency,bitcoin,ethereum,agents,allocation,rebalance,coinbase,kraken
|
|
13
13
|
Classifier: Development Status :: 4 - Beta
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -44,14 +44,15 @@ Dynamic: license-file
|
|
|
44
44
|
|
|
45
45
|
# AllocContext
|
|
46
46
|
|
|
47
|
-
[](https://smithery.ai/server/@AllocContext/alloc-context)
|
|
48
|
+
[](https://glama.ai/mcp/servers/AllocContext/alloc-context)
|
|
49
49
|
|
|
50
|
-
mcp-name: io.github.
|
|
50
|
+
mcp-name: io.github.AllocContext/alloc-context
|
|
51
51
|
|
|
52
|
-
**Portfolio-aware crypto context for
|
|
53
|
-
sentiment, macro, and regime; optional
|
|
54
|
-
JSON over MCP with
|
|
52
|
+
**Portfolio-aware crypto context for whatever you hold** — discover your
|
|
53
|
+
holdings, holdings-scoped market data, sentiment, macro, and regime; optional
|
|
54
|
+
allocation analysis when you supply targets. Deterministic JSON over MCP with
|
|
55
|
+
x402 pay-per-call on Base.
|
|
55
56
|
|
|
56
57
|
> **Privacy:** nothing stored · one-time read-only · pass-through only — your
|
|
57
58
|
> keys and portfolio never persist on our servers. See [USE.md](docs/USE.md).
|
|
@@ -113,7 +114,7 @@ Not financial advice.
|
|
|
113
114
|
| **Discovery** | [llms.txt](https://mcp.alloc-context.com/llms.txt), [x402 manifest](https://mcp.alloc-context.com/.well-known/x402.json) |
|
|
114
115
|
| **Pricing** | **$0.02** cached context/math · **$0.05** live ingest or portfolio |
|
|
115
116
|
| **Payment** | x402 on Base — USDC or EURC |
|
|
116
|
-
| **Market scope** |
|
|
117
|
+
| **Market scope** | Tailored to your holdings (band OHLC for BTC/ETH; alt quote snapshots); bridge auto-scopes from portfolio |
|
|
117
118
|
|
|
118
119
|
Agents and wallets connect directly to the hosted endpoint — see
|
|
119
120
|
[agent-integration.md](docs/agent-integration.md). The Cursor bridge above
|
|
@@ -130,7 +131,7 @@ combines local portfolio reads with this upstream for market context.
|
|
|
130
131
|
| `get_rebalance_plan` | USD rebalance moves from allocation, target, and NAV |
|
|
131
132
|
| `check_allocation_band` | Drift vs target and whether allocation is outside the band |
|
|
132
133
|
| `check_allocation_bands` | Batch band checks for multiple target scenarios |
|
|
133
|
-
| `get_portfolio_state` | Live NAV and holdings
|
|
134
|
+
| `get_portfolio_state` | Live NAV and holdings (e.g. Coinbase, Kraken read-only keys) |
|
|
134
135
|
|
|
135
136
|
Market context is **holdings-scoped**: band assets (BTC/ETH) use OHLC bars; alt
|
|
136
137
|
holdings (e.g. HYPE) use quote snapshots when cached. The bridge auto-scopes
|
|
@@ -146,7 +147,7 @@ See [self-hosting.md](docs/self-hosting.md) (`self_host: true` in user config)
|
|
|
146
147
|
or [local-dev.md](docs/local-dev.md) for the dev stack.
|
|
147
148
|
|
|
148
149
|
```bash
|
|
149
|
-
git clone git@github.com:
|
|
150
|
+
git clone git@github.com:AllocContext/alloc-context.git
|
|
150
151
|
cd alloc-context
|
|
151
152
|
python3.11 -m venv .venv && source .venv/bin/activate
|
|
152
153
|
pip install -e ".[dev]"
|
|
@@ -109,6 +109,7 @@ tests/test_backup_sqlite.py
|
|
|
109
109
|
tests/test_bridge.py
|
|
110
110
|
tests/test_bridge_portfolio.py
|
|
111
111
|
tests/test_bump_version.py
|
|
112
|
+
tests/test_check_pypi_release_json.py
|
|
112
113
|
tests/test_coinbase_portfolio.py
|
|
113
114
|
tests/test_config_cli.py
|
|
114
115
|
tests/test_context_bundle_schema.py
|
|
@@ -107,10 +107,11 @@ DISCOVERY_KEYWORD_MARKERS = (
|
|
|
107
107
|
)
|
|
108
108
|
|
|
109
109
|
LISTING_DESCRIPTION = (
|
|
110
|
-
"Portfolio-aware crypto context for AI agents: discover holdings
|
|
111
|
-
"sentiment, macro, and regime; optional allocation
|
|
112
|
-
"math. Fused backdrop (Fear & Greed, Kalshi, ETF
|
|
113
|
-
"
|
|
110
|
+
"Portfolio-aware crypto context for AI agents: discover holdings and "
|
|
111
|
+
"holdings-scoped market, sentiment, macro, and regime; optional allocation "
|
|
112
|
+
"analysis and rebalance math. Fused backdrop (Fear & Greed, Kalshi, ETF "
|
|
113
|
+
"flows), optional live portfolio reads (e.g. Coinbase, Kraken). Structured "
|
|
114
|
+
"JSON only — no LLM. "
|
|
114
115
|
f"{PRIVACY_COMPACT_COPY} "
|
|
115
116
|
"Source-available (Elastic License 2.0); self-host friendly; official hosted "
|
|
116
117
|
f"MCP at {OFFICIAL_HOSTED_MCP_URL} — see {USE_DOCS_PATH}."
|
|
@@ -237,9 +238,10 @@ _MCP_TOOLS: tuple[dict[str, Any], ...] = (
|
|
|
237
238
|
"tool_name": "get_portfolio_state",
|
|
238
239
|
"description": (
|
|
239
240
|
"Fetch live read-only portfolio NAV, holdings[], and band weights from "
|
|
240
|
-
"
|
|
241
|
-
"Requires exchange, api_key, and
|
|
242
|
-
"with reason on invalid
|
|
241
|
+
"a supported spot exchange (e.g. Kraken, Coinbase) using credentials "
|
|
242
|
+
"passed in this call (never stored). Requires exchange, api_key, and "
|
|
243
|
+
"api_secret. Returns available=false with reason on invalid "
|
|
244
|
+
"credentials — no side effects."
|
|
243
245
|
),
|
|
244
246
|
"input_schema": {
|
|
245
247
|
"type": "object",
|
|
@@ -570,7 +572,7 @@ model context protocol, context bundle
|
|
|
570
572
|
## Examples
|
|
571
573
|
|
|
572
574
|
Redacted tool JSON samples (evaluate before paying):
|
|
573
|
-
https://github.com/
|
|
575
|
+
https://github.com/AllocContext/alloc-context/blob/main/docs/examples.md
|
|
574
576
|
"""
|
|
575
577
|
|
|
576
578
|
|
|
@@ -209,7 +209,8 @@ def create_server(
|
|
|
209
209
|
annotations=_tool_hints("get_portfolio_state"),
|
|
210
210
|
description=(
|
|
211
211
|
"Fetch live read-only portfolio NAV, holdings[], and band weights from "
|
|
212
|
-
"
|
|
212
|
+
"a supported spot exchange (e.g. Kraken, Coinbase) using credentials "
|
|
213
|
+
"passed in this call (never stored). "
|
|
213
214
|
"Requires exchange, api_key, and api_secret. Use get_context_bundle "
|
|
214
215
|
"for cached market and history without exchange keys. Optional "
|
|
215
216
|
"target_pct attaches allocation_analysis; optional band sets drift "
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "alloc-context"
|
|
3
|
-
version = "0.2.
|
|
4
|
-
description = "Portfolio-aware crypto context for agents — holdings
|
|
3
|
+
version = "0.2.3"
|
|
4
|
+
description = "Portfolio-aware crypto context for agents — holdings-scoped market, sentiment, optional allocation analysis"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "Elastic-2.0" }
|
|
7
7
|
requires-python = ">=3.11"
|
|
8
8
|
keywords = [
|
|
9
9
|
"mcp",
|
|
10
10
|
"x402",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"holdings",
|
|
12
|
+
"portfolio",
|
|
13
13
|
"crypto",
|
|
14
14
|
"cryptocurrency",
|
|
15
|
-
"
|
|
15
|
+
"bitcoin",
|
|
16
|
+
"ethereum",
|
|
17
|
+
"agents",
|
|
16
18
|
"allocation",
|
|
17
|
-
"holdings",
|
|
18
19
|
"rebalance",
|
|
19
20
|
"coinbase",
|
|
20
21
|
"kraken",
|
|
21
|
-
"agents",
|
|
22
22
|
]
|
|
23
23
|
classifiers = [
|
|
24
24
|
"Development Status :: 4 - Beta",
|
|
@@ -38,10 +38,10 @@ dependencies = [
|
|
|
38
38
|
|
|
39
39
|
[project.urls]
|
|
40
40
|
Homepage = "https://mcp.alloc-context.com/llms.txt"
|
|
41
|
-
Documentation = "https://github.com/
|
|
42
|
-
Repository = "https://github.com/
|
|
43
|
-
Issues = "https://github.com/
|
|
44
|
-
Changelog = "https://github.com/
|
|
41
|
+
Documentation = "https://github.com/AllocContext/alloc-context/blob/main/docs/agent-integration.md"
|
|
42
|
+
Repository = "https://github.com/AllocContext/alloc-context"
|
|
43
|
+
Issues = "https://github.com/AllocContext/alloc-context/issues"
|
|
44
|
+
Changelog = "https://github.com/AllocContext/alloc-context/releases"
|
|
45
45
|
"MCP Server" = "https://mcp.alloc-context.com/mcp"
|
|
46
46
|
|
|
47
47
|
[project.optional-dependencies]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from scripts.check_pypi_release_json import pypi_release_is_ready
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _payload(*, version: str = "0.2.2", urls: list[dict] | None = None) -> dict:
|
|
7
|
+
if urls is None:
|
|
8
|
+
urls = [
|
|
9
|
+
{"packagetype": "bdist_wheel", "filename": "alloc_context-0.2.2-py3-none-any.whl"},
|
|
10
|
+
{"packagetype": "sdist", "filename": "alloc_context-0.2.2.tar.gz"},
|
|
11
|
+
]
|
|
12
|
+
return {
|
|
13
|
+
"info": {"name": "alloc-context", "version": version},
|
|
14
|
+
"urls": urls,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_pypi_release_is_ready_accepts_wheel_and_sdist() -> None:
|
|
19
|
+
ready, reason = pypi_release_is_ready(
|
|
20
|
+
_payload(),
|
|
21
|
+
package="alloc-context",
|
|
22
|
+
version="0.2.2",
|
|
23
|
+
)
|
|
24
|
+
assert ready is True
|
|
25
|
+
assert reason == "ok"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_pypi_release_is_ready_rejects_version_mismatch() -> None:
|
|
29
|
+
ready, reason = pypi_release_is_ready(
|
|
30
|
+
_payload(version="0.2.1"),
|
|
31
|
+
package="alloc-context",
|
|
32
|
+
version="0.2.2",
|
|
33
|
+
)
|
|
34
|
+
assert ready is False
|
|
35
|
+
assert "expected '0.2.2'" in reason
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_pypi_release_is_ready_rejects_empty_urls() -> None:
|
|
39
|
+
ready, reason = pypi_release_is_ready(
|
|
40
|
+
_payload(urls=[]),
|
|
41
|
+
package="alloc-context",
|
|
42
|
+
version="0.2.2",
|
|
43
|
+
)
|
|
44
|
+
assert ready is False
|
|
45
|
+
assert "empty" in reason
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_pypi_release_is_ready_rejects_missing_wheel() -> None:
|
|
49
|
+
ready, reason = pypi_release_is_ready(
|
|
50
|
+
_payload(urls=[{"packagetype": "sdist"}]),
|
|
51
|
+
package="alloc-context",
|
|
52
|
+
version="0.2.2",
|
|
53
|
+
)
|
|
54
|
+
assert ready is False
|
|
55
|
+
assert "bdist_wheel" in reason
|
|
@@ -47,5 +47,5 @@ def test_glama_json_is_valid_server_schema() -> None:
|
|
|
47
47
|
path = Path(__file__).resolve().parents[1] / "glama.json"
|
|
48
48
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
49
49
|
assert data["$schema"] == "https://glama.ai/mcp/schemas/server.json"
|
|
50
|
-
assert data["maintainers"] == ["
|
|
50
|
+
assert data["maintainers"] == ["AllocContext"]
|
|
51
51
|
assert data["connector_emails"][0] == "nathangillett@icloud.com"
|
|
@@ -32,4 +32,4 @@ def test_server_json_version_matches_pyproject():
|
|
|
32
32
|
|
|
33
33
|
def test_readme_includes_mcp_registry_name_for_pypi():
|
|
34
34
|
readme = (REPO_ROOT / "README.md").read_text(encoding="utf-8")
|
|
35
|
-
assert "mcp-name: io.github.
|
|
35
|
+
assert "mcp-name: io.github.AllocContext/alloc-context" in readme
|
|
@@ -151,6 +151,20 @@ def test_publish_mcp_registry_workflow_dispatch():
|
|
|
151
151
|
|
|
152
152
|
|
|
153
153
|
def test_publish_mcp_registry_waits_for_pypi():
|
|
154
|
-
script = (REPO_ROOT / "scripts/publish-mcp-registry.sh").read_text()
|
|
155
|
-
assert "wait-for-pypi.sh" in script
|
|
156
154
|
assert (REPO_ROOT / "scripts/wait-for-pypi.sh").exists()
|
|
155
|
+
assert (REPO_ROOT / "scripts/check_pypi_release_json.py").exists()
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def test_publish_mcp_registry_workflow_waits_before_publish():
|
|
159
|
+
workflow = _load_workflow("publish-mcp-registry.yml")
|
|
160
|
+
runs = [step.get("run", "") for step in _job_steps(workflow, "publish")]
|
|
161
|
+
assert any("wait-for-pypi.sh" in run for run in runs)
|
|
162
|
+
assert any("publish-mcp-registry.sh" in run for run in runs)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def test_release_publish_mcp_registry_waits_with_version_env():
|
|
166
|
+
workflow = _load_workflow("release.yml")
|
|
167
|
+
job = workflow["jobs"]["publish-mcp-registry"]
|
|
168
|
+
assert job["env"]["PYPI_VERSION"] == "${{ needs.check.outputs.version }}"
|
|
169
|
+
runs = [step.get("run", "") for step in _job_steps(workflow, "publish-mcp-registry")]
|
|
170
|
+
assert any("wait-for-pypi.sh" in run for run in runs)
|
|
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
|
{alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/coinbase_adapter.py
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
|
|
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
|