aria-code 4.1.3__py3-none-any.whl
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.
- agents/__init__.py +32 -0
- agents/base.py +190 -0
- agents/deep/__init__.py +37 -0
- agents/deep/calibration_loop.py +144 -0
- agents/deep/critic.py +125 -0
- agents/deep/deepen.py +193 -0
- agents/deep/models.py +149 -0
- agents/deep/pipeline.py +164 -0
- agents/deep/quant_fusion.py +192 -0
- agents/deep/themes.py +95 -0
- agents/deep/tiers.py +106 -0
- agents/financial/__init__.py +10 -0
- agents/financial/catalyst.py +279 -0
- agents/financial/debate.py +145 -0
- agents/financial/earnings.py +303 -0
- agents/financial/fundamental.py +159 -0
- agents/financial/macro.py +99 -0
- agents/financial/news.py +207 -0
- agents/financial/risk.py +132 -0
- agents/financial/sector.py +279 -0
- agents/financial/synthesis.py +274 -0
- agents/financial/technical.py +258 -0
- agents/portfolio_agent.py +333 -0
- agents/realty/__init__.py +62 -0
- agents/realty/asset_diagnosis.py +150 -0
- agents/realty/business_match.py +165 -0
- agents/realty/cashflow_verify.py +208 -0
- agents/realty/contract_rules.py +209 -0
- agents/realty/energy_anomaly.py +188 -0
- agents/realty/exit_settlement.py +207 -0
- agents/realty/fulfillment_risk.py +205 -0
- agents/realty/ops_optimize.py +159 -0
- agents/realty/revenue_share.py +214 -0
- agents/registry.py +144 -0
- agents/sports/__init__.py +0 -0
- agents/sports/football_agent.py +169 -0
- agents/team.py +289 -0
- aliyun_data_client.py +660 -0
- apps/README.md +12 -0
- apps/__init__.py +2 -0
- apps/channels/README.md +15 -0
- apps/cli/README.md +13 -0
- apps/cli/__init__.py +2 -0
- apps/cli/bootstrap.py +99 -0
- apps/cli/codegen_paths.py +29 -0
- apps/cli/commands/__init__.py +16 -0
- apps/cli/commands/analysis_cmds.py +288 -0
- apps/cli/commands/backtest_cmds.py +1887 -0
- apps/cli/commands/broker_cmds.py +1154 -0
- apps/cli/commands/business_workflow_cmds.py +289 -0
- apps/cli/commands/catalog.py +84 -0
- apps/cli/commands/data_cmds.py +405 -0
- apps/cli/commands/diagnostic_cmds.py +179 -0
- apps/cli/commands/diagnostic_ops_cmds.py +696 -0
- apps/cli/commands/finance_render.py +12 -0
- apps/cli/commands/market.py +399 -0
- apps/cli/commands/market_cmds.py +1276 -0
- apps/cli/commands/market_context.py +425 -0
- apps/cli/commands/market_render.py +7 -0
- apps/cli/commands/model_cmds.py +1579 -0
- apps/cli/commands/ops_cmds.py +668 -0
- apps/cli/commands/portfolio_cmds.py +962 -0
- apps/cli/commands/report.py +377 -0
- apps/cli/commands/scaffold_templates.py +617 -0
- apps/cli/commands/session_cmds.py +179 -0
- apps/cli/commands/session_ux_cmds.py +280 -0
- apps/cli/commands/team.py +588 -0
- apps/cli/commands/team_render.py +8 -0
- apps/cli/commands/ui_cmds.py +358 -0
- apps/cli/commands/workflow_cmds.py +279 -0
- apps/cli/commands/workspace_cmds.py +1414 -0
- apps/cli/config_paths.py +70 -0
- apps/cli/config_store.py +61 -0
- apps/cli/deterministic.py +122 -0
- apps/cli/direct.py +48 -0
- apps/cli/github_app_auth.py +135 -0
- apps/cli/handlers/__init__.py +11 -0
- apps/cli/handlers/broker_handlers.py +122 -0
- apps/cli/handlers/chart_handlers.py +1309 -0
- apps/cli/handlers/market_handlers.py +2509 -0
- apps/cli/handlers/realty_handlers.py +114 -0
- apps/cli/handlers/strategy_advice.py +82 -0
- apps/cli/hooks.py +180 -0
- apps/cli/i18n.py +284 -0
- apps/cli/intent.py +136 -0
- apps/cli/intent_router.py +217 -0
- apps/cli/lifecycle_hooks.py +48 -0
- apps/cli/main.py +29 -0
- apps/cli/market_metadata.py +135 -0
- apps/cli/market_universe.py +265 -0
- apps/cli/message_processing.py +257 -0
- apps/cli/plan_mode.py +139 -0
- apps/cli/plotly_html.py +15 -0
- apps/cli/prediction_feedback.py +202 -0
- apps/cli/preflight.py +497 -0
- apps/cli/project_aria.py +60 -0
- apps/cli/prompts/__init__.py +0 -0
- apps/cli/prompts/coding.py +658 -0
- apps/cli/prompts/system_prompts.py +531 -0
- apps/cli/prompts/ui.py +434 -0
- apps/cli/providers/__init__.py +1 -0
- apps/cli/providers/base.py +271 -0
- apps/cli/providers/chat_routing.py +80 -0
- apps/cli/providers/llm/__init__.py +1 -0
- apps/cli/providers/llm/ollama_stream.py +1170 -0
- apps/cli/providers/llm/sse_stream.py +216 -0
- apps/cli/providers/runtime_bridge.py +185 -0
- apps/cli/runtime_consumer.py +489 -0
- apps/cli/session_export.py +87 -0
- apps/cli/session_jsonl.py +207 -0
- apps/cli/session_store.py +112 -0
- apps/cli/todo_tracker.py +190 -0
- apps/cli/tools/__init__.py +40 -0
- apps/cli/tools/context.py +46 -0
- apps/cli/tools/file_tools.py +112 -0
- apps/cli/tools/market_tools.py +549 -0
- apps/cli/tools/notebook_tools.py +111 -0
- apps/cli/tools/system_tools.py +669 -0
- apps/cli/tools/write_tools.py +715 -0
- apps/cli/tradingview_bridge.py +434 -0
- apps/cli/update_check.py +152 -0
- apps/cli/utils/__init__.py +0 -0
- apps/cli/utils/market_detect.py +1578 -0
- apps/daemon/README.md +14 -0
- apps/vscode/README.md +115 -0
- apps/vscode/package.json +70 -0
- aria_cli.py +11636 -0
- aria_code-4.1.3.dist-info/METADATA +952 -0
- aria_code-4.1.3.dist-info/RECORD +284 -0
- aria_code-4.1.3.dist-info/WHEEL +5 -0
- aria_code-4.1.3.dist-info/entry_points.txt +2 -0
- aria_code-4.1.3.dist-info/licenses/LICENSE +121 -0
- aria_code-4.1.3.dist-info/top_level.txt +50 -0
- aria_daemon.py +1295 -0
- aria_feishu_bot.py +1359 -0
- aria_relay_client.py +182 -0
- aria_relay_server.py +405 -0
- aria_telegram_bot.py +202 -0
- ariarc.py +328 -0
- artifacts.py +491 -0
- backtest_report.py +472 -0
- brokers/__init__.py +72 -0
- brokers/base.py +207 -0
- brokers/capabilities.py +264 -0
- brokers/cn/__init__.py +10 -0
- brokers/cn/easytrader_broker.py +193 -0
- brokers/cn/futu_broker.py +194 -0
- brokers/cn/longbridge_broker.py +190 -0
- brokers/cn/tiger_broker.py +196 -0
- brokers/cn/xtquant_broker.py +175 -0
- brokers/config.py +364 -0
- brokers/intl/__init__.py +5 -0
- brokers/intl/alpaca_broker.py +183 -0
- brokers/intl/ibkr_broker.py +215 -0
- brokers/intl/webull_broker.py +156 -0
- brokers/paper_broker.py +259 -0
- brokers/planning.py +296 -0
- brokers/registry.py +181 -0
- brokers/trading.py +237 -0
- change_store.py +127 -0
- command_safety.py +19 -0
- computer_use_tools.py +504 -0
- dashboard_generator.py +578 -0
- data_analysis_tools.py +808 -0
- data_cleaner.py +483 -0
- data_service.py +481 -0
- datasources/__init__.py +23 -0
- datasources/base.py +166 -0
- datasources/router.py +221 -0
- datasources/sources/__init__.py +15 -0
- datasources/sources/akshare_source.py +269 -0
- datasources/sources/alpha_vantage_source.py +202 -0
- datasources/sources/edgar_source.py +218 -0
- datasources/sources/finnhub_source.py +197 -0
- datasources/sources/fred_source.py +219 -0
- datasources/sources/tushare_source.py +141 -0
- datasources/sources/web_scraper_source.py +278 -0
- datasources/sources/world_bank_source.py +205 -0
- datasources/sources/yfinance_source.py +152 -0
- demo_player.py +204 -0
- doctor.py +508 -0
- file_analysis_tools.py +734 -0
- finance_formulas.py +389 -0
- football_data_client.py +1670 -0
- intent_classifier.py +358 -0
- local_finance_tools.py +3221 -0
- local_llm_provider.py +552 -0
- macro_tools.py +368 -0
- market_data_client.py +1899 -0
- mcp_client.py +506 -0
- memory_manager.py +245 -0
- model_capability.py +416 -0
- notification_tools.py +248 -0
- packages/__init__.py +23 -0
- packages/aria_agents/__init__.py +5 -0
- packages/aria_agents/manifest.py +69 -0
- packages/aria_core/__init__.py +34 -0
- packages/aria_core/architecture.py +192 -0
- packages/aria_core/export.py +124 -0
- packages/aria_core/manifest.py +65 -0
- packages/aria_infra/__init__.py +15 -0
- packages/aria_infra/arthera.py +52 -0
- packages/aria_infra/doctor.py +246 -0
- packages/aria_infra/product.py +37 -0
- packages/aria_mcp/__init__.py +25 -0
- packages/aria_mcp/bridge.py +38 -0
- packages/aria_mcp/config.py +97 -0
- packages/aria_mcp/tools.py +61 -0
- packages/aria_sdk/__init__.py +19 -0
- packages/aria_sdk/client.py +396 -0
- packages/aria_sdk/providers.py +70 -0
- packages/aria_sdk/streaming.py +73 -0
- packages/aria_sdk/types.py +86 -0
- packages/aria_services/__init__.py +55 -0
- packages/aria_services/context.py +258 -0
- packages/aria_services/data.py +11 -0
- packages/aria_services/provider_health.py +189 -0
- packages/aria_services/registry.py +213 -0
- packages/aria_services/usage.py +138 -0
- packages/aria_skills/__init__.py +5 -0
- packages/aria_skills/registry.py +59 -0
- packages/aria_tools/__init__.py +5 -0
- packages/aria_tools/registry.py +128 -0
- packages/quant_engine/__init__.py +6 -0
- packages/quant_engine/sports/__init__.py +72 -0
- packages/quant_engine/sports/calibrator.py +353 -0
- packages/quant_engine/sports/dixon_coles.py +234 -0
- packages/quant_engine/sports/elo.py +299 -0
- packages/quant_engine/sports/form.py +188 -0
- packages/quant_engine/sports/h2h.py +195 -0
- packages/quant_engine/sports/ml_model.py +354 -0
- packages/quant_engine/sports/predictor.py +311 -0
- packages/quant_engine/sports/tracker.py +664 -0
- packages/quant_engine/stochastic/__init__.py +27 -0
- packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- packages/quant_engine/stochastic/ito_calculus.py +477 -0
- packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- packages/quant_engine/stochastic/options_pricing.py +573 -0
- packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- plan_utils.py +194 -0
- plugin_loader.py +328 -0
- portfolio_ledger.py +262 -0
- privacy/__init__.py +5 -0
- privacy/feedback.py +123 -0
- project_tools.py +525 -0
- providers/__init__.py +30 -0
- providers/llm/__init__.py +19 -0
- providers/llm/anthropic.py +184 -0
- providers/llm/base.py +139 -0
- providers/llm/ollama.py +128 -0
- providers/llm/openai_compat.py +282 -0
- providers/llm/registry.py +358 -0
- realty_data_tools.py +659 -0
- report_generator.py +1314 -0
- runtime/__init__.py +103 -0
- runtime/agent_loop.py +1183 -0
- runtime/approval.py +51 -0
- runtime/events.py +102 -0
- runtime/gateway.py +128 -0
- runtime/lsp.py +346 -0
- runtime/subagent.py +258 -0
- runtime/tool_executor.py +104 -0
- runtime/tool_policy.py +106 -0
- safety/__init__.py +21 -0
- safety/permissions.py +275 -0
- setup_wizard.py +653 -0
- strategy_vault.py +420 -0
- ui/__init__.py +100 -0
- ui/banner.py +310 -0
- ui/completer.py +391 -0
- ui/console.py +271 -0
- ui/image_render.py +243 -0
- ui/input_box.py +376 -0
- ui/picker.py +195 -0
- ui/render/__init__.py +11 -0
- ui/render/finance.py +1480 -0
- ui/render/market.py +225 -0
- ui/render/output.py +681 -0
- ui/render/team.py +346 -0
- ui/robot.py +235 -0
- workspace/__init__.py +6 -0
- workspace/files.py +170 -0
- workspace/verify.py +113 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"""Product-level service contracts for Aria Code.
|
|
2
|
+
|
|
3
|
+
These manifests describe stable service boundaries. They intentionally wrap the
|
|
4
|
+
current modules instead of moving code all at once, so the CLI can migrate away
|
|
5
|
+
from the large legacy entrypoint incrementally.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from typing import Dict, List
|
|
12
|
+
|
|
13
|
+
from packages.aria_core import CapabilityManifest, PackageLink, PermissionLevel, ServiceKind
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class ServiceSpec:
|
|
18
|
+
name: str
|
|
19
|
+
description: str
|
|
20
|
+
owner_package: str
|
|
21
|
+
module: str
|
|
22
|
+
capabilities: List[str] = field(default_factory=list)
|
|
23
|
+
permissions: List[PermissionLevel] = field(default_factory=list)
|
|
24
|
+
required: bool = True
|
|
25
|
+
migration_target: str = ""
|
|
26
|
+
|
|
27
|
+
def manifest(self) -> CapabilityManifest:
|
|
28
|
+
tags = ["service"]
|
|
29
|
+
if self.required:
|
|
30
|
+
tags.append("required")
|
|
31
|
+
return CapabilityManifest(
|
|
32
|
+
name=self.name,
|
|
33
|
+
kind=ServiceKind.DATA if self.name == "data" else ServiceKind.SERVICE,
|
|
34
|
+
description=self.description,
|
|
35
|
+
capabilities=self.capabilities,
|
|
36
|
+
permissions=self.permissions,
|
|
37
|
+
package_link=PackageLink(
|
|
38
|
+
package=self.owner_package,
|
|
39
|
+
module=self.module,
|
|
40
|
+
object_name=self.migration_target,
|
|
41
|
+
notes="Facade over existing modules; migrate implementation behind this boundary.",
|
|
42
|
+
),
|
|
43
|
+
tags=tags,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def list_service_specs() -> List[ServiceSpec]:
|
|
48
|
+
"""Return stable service boundaries for the Aria Code product."""
|
|
49
|
+
|
|
50
|
+
return [
|
|
51
|
+
ServiceSpec(
|
|
52
|
+
name="gateway",
|
|
53
|
+
description="Local-first control plane for CLI, daemon, MCP, and channel entrypoints.",
|
|
54
|
+
owner_package="packages.aria_services",
|
|
55
|
+
module="apps.gateway",
|
|
56
|
+
capabilities=["session.routing", "task.queue", "mcp.routing", "channel.routing"],
|
|
57
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.WORKSPACE_WRITE],
|
|
58
|
+
migration_target="GatewayService",
|
|
59
|
+
),
|
|
60
|
+
ServiceSpec(
|
|
61
|
+
name="runtime",
|
|
62
|
+
description="Agent turn loop, tool execution, approvals, traces, and parallel tool orchestration.",
|
|
63
|
+
owner_package="runtime",
|
|
64
|
+
module="runtime",
|
|
65
|
+
capabilities=["agent.loop", "tool.execution", "approval.policy", "trace"],
|
|
66
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.WORKSPACE_WRITE],
|
|
67
|
+
migration_target="AgentRuntime",
|
|
68
|
+
),
|
|
69
|
+
ServiceSpec(
|
|
70
|
+
name="settings",
|
|
71
|
+
description="Configuration, secrets, model profiles, runtime flags, and permission policy resolution.",
|
|
72
|
+
owner_package="packages.aria_services",
|
|
73
|
+
module="packages.aria_services.settings",
|
|
74
|
+
capabilities=[
|
|
75
|
+
"settings.config",
|
|
76
|
+
"settings.secrets",
|
|
77
|
+
"settings.model_profiles",
|
|
78
|
+
"settings.permission_policy",
|
|
79
|
+
],
|
|
80
|
+
permissions=[PermissionLevel.READ_ONLY],
|
|
81
|
+
migration_target="SettingsService",
|
|
82
|
+
),
|
|
83
|
+
ServiceSpec(
|
|
84
|
+
name="context",
|
|
85
|
+
description="Conversation memory, context pressure checks, compaction, and resumable summary envelopes.",
|
|
86
|
+
owner_package="packages.aria_services",
|
|
87
|
+
module="packages.aria_services.context",
|
|
88
|
+
capabilities=[
|
|
89
|
+
"context.memory",
|
|
90
|
+
"context.compaction",
|
|
91
|
+
"context.resume",
|
|
92
|
+
"context.checkpoint",
|
|
93
|
+
],
|
|
94
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.WORKSPACE_WRITE],
|
|
95
|
+
migration_target="ContextService",
|
|
96
|
+
),
|
|
97
|
+
ServiceSpec(
|
|
98
|
+
name="tools",
|
|
99
|
+
description="Typed tool manifests, schemas, permissions, local tool adapters, and MCP tool conversion.",
|
|
100
|
+
owner_package="packages.aria_tools",
|
|
101
|
+
module="packages.aria_tools",
|
|
102
|
+
capabilities=[
|
|
103
|
+
"tool.registry",
|
|
104
|
+
"tool.schema",
|
|
105
|
+
"tool.permissions",
|
|
106
|
+
"tool.local_adapter",
|
|
107
|
+
"tool.mcp_adapter",
|
|
108
|
+
],
|
|
109
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.WORKSPACE_WRITE, PermissionLevel.NETWORK],
|
|
110
|
+
migration_target="ToolRegistry",
|
|
111
|
+
),
|
|
112
|
+
ServiceSpec(
|
|
113
|
+
name="data",
|
|
114
|
+
description="Multi-source market data with timestamps, provider attribution, and stale-data flags.",
|
|
115
|
+
owner_package="packages.aria_services",
|
|
116
|
+
module="data_service",
|
|
117
|
+
capabilities=["market.quote", "market.history", "technical.indicators", "data.quality"],
|
|
118
|
+
permissions=[PermissionLevel.NETWORK],
|
|
119
|
+
migration_target="MarketDataService",
|
|
120
|
+
),
|
|
121
|
+
ServiceSpec(
|
|
122
|
+
name="reports",
|
|
123
|
+
description="Report, chart, and artifact generation with local workspace storage policies.",
|
|
124
|
+
owner_package="packages.aria_services",
|
|
125
|
+
module="report_generator",
|
|
126
|
+
capabilities=["report.markdown", "report.html", "chart.render", "artifact.storage"],
|
|
127
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.WORKSPACE_WRITE],
|
|
128
|
+
migration_target="ReportService",
|
|
129
|
+
),
|
|
130
|
+
ServiceSpec(
|
|
131
|
+
name="brokers",
|
|
132
|
+
description="Broker account reads, paper trading, order previews, guarded execution, and audit trails.",
|
|
133
|
+
owner_package="brokers",
|
|
134
|
+
module="brokers",
|
|
135
|
+
capabilities=[
|
|
136
|
+
"broker.account",
|
|
137
|
+
"broker.positions",
|
|
138
|
+
"broker.orders",
|
|
139
|
+
"broker.paper",
|
|
140
|
+
"broker.trade_preview",
|
|
141
|
+
"broker.confirmed_execution",
|
|
142
|
+
"broker.audit",
|
|
143
|
+
],
|
|
144
|
+
permissions=[PermissionLevel.BROKER_READ, PermissionLevel.BROKER_TRADE],
|
|
145
|
+
migration_target="BrokerService",
|
|
146
|
+
),
|
|
147
|
+
ServiceSpec(
|
|
148
|
+
name="skills",
|
|
149
|
+
description="Workflow recipes that bind tools, agents, data, reports, and brokers.",
|
|
150
|
+
owner_package="packages.aria_skills",
|
|
151
|
+
module="packages.aria_skills",
|
|
152
|
+
capabilities=["skill.registry", "workflow.binding"],
|
|
153
|
+
permissions=[PermissionLevel.READ_ONLY],
|
|
154
|
+
migration_target="SkillRegistry",
|
|
155
|
+
),
|
|
156
|
+
ServiceSpec(
|
|
157
|
+
name="mcp",
|
|
158
|
+
description="MCP server discovery, health, tool provenance, reconnect policy, and manifest conversion.",
|
|
159
|
+
owner_package="packages.aria_mcp",
|
|
160
|
+
module="packages.aria_mcp",
|
|
161
|
+
capabilities=[
|
|
162
|
+
"mcp.discovery",
|
|
163
|
+
"mcp.health",
|
|
164
|
+
"mcp.tool_manifests",
|
|
165
|
+
"mcp.reconnect",
|
|
166
|
+
"mcp.provenance",
|
|
167
|
+
],
|
|
168
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.NETWORK],
|
|
169
|
+
migration_target="MCPService",
|
|
170
|
+
),
|
|
171
|
+
ServiceSpec(
|
|
172
|
+
name="channels",
|
|
173
|
+
description="Optional external entrypoints such as daemon, relay, Feishu, Telegram, and webhooks.",
|
|
174
|
+
owner_package="apps.channels",
|
|
175
|
+
module="apps.channels",
|
|
176
|
+
capabilities=["channel.daemon", "channel.relay", "channel.feishu", "channel.telegram"],
|
|
177
|
+
permissions=[PermissionLevel.NETWORK],
|
|
178
|
+
required=False,
|
|
179
|
+
migration_target="ChannelRegistry",
|
|
180
|
+
),
|
|
181
|
+
ServiceSpec(
|
|
182
|
+
name="safety",
|
|
183
|
+
description="Sandbox, workspace permissions, command policy, privacy controls, and audit hooks.",
|
|
184
|
+
owner_package="safety",
|
|
185
|
+
module="safety",
|
|
186
|
+
capabilities=["sandbox", "command.policy", "privacy", "audit"],
|
|
187
|
+
permissions=[PermissionLevel.READ_ONLY],
|
|
188
|
+
migration_target="SafetyService",
|
|
189
|
+
),
|
|
190
|
+
ServiceSpec(
|
|
191
|
+
name="observability",
|
|
192
|
+
description="Doctor checks, runtime traces, provider health, architecture coverage, and support bundles.",
|
|
193
|
+
owner_package="packages.aria_infra",
|
|
194
|
+
module="packages.aria_infra.doctor",
|
|
195
|
+
capabilities=[
|
|
196
|
+
"doctor.checks",
|
|
197
|
+
"trace.export",
|
|
198
|
+
"provider.health",
|
|
199
|
+
"architecture.coverage",
|
|
200
|
+
"support.bundle",
|
|
201
|
+
],
|
|
202
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.WORKSPACE_WRITE],
|
|
203
|
+
migration_target="ObservabilityService",
|
|
204
|
+
),
|
|
205
|
+
]
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def service_map() -> Dict[str, ServiceSpec]:
|
|
209
|
+
return {service.name: service for service in list_service_specs()}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def required_service_names() -> List[str]:
|
|
213
|
+
return [service.name for service in list_service_specs() if service.required]
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""User-facing service usage catalog for Aria Code."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class ServiceUsageSpec:
|
|
10
|
+
name: str
|
|
11
|
+
purpose: str
|
|
12
|
+
cli_entrypoints: tuple[str, ...]
|
|
13
|
+
package_sources: tuple[str, ...]
|
|
14
|
+
mcp_tools: tuple[str, ...]
|
|
15
|
+
next_step: str
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def list_service_usage_specs() -> tuple[ServiceUsageSpec, ...]:
|
|
19
|
+
"""Return how each project service is meant to be used from Aria."""
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
ServiceUsageSpec(
|
|
23
|
+
name="agent_runtime",
|
|
24
|
+
purpose="模型回合、工具调用、并行/串行执行、审批、取消、LoopGuard 和 trace",
|
|
25
|
+
cli_entrypoints=("/chat", "-p", "aria"),
|
|
26
|
+
package_sources=("runtime", "packages/aria_sdk", "apps/cli/providers/runtime_bridge.py"),
|
|
27
|
+
mcp_tools=("aria.agent.run", "aria.tools.execute"),
|
|
28
|
+
next_step="/architecture --gaps 查看 runtime cutover 状态",
|
|
29
|
+
),
|
|
30
|
+
ServiceUsageSpec(
|
|
31
|
+
name="settings_config",
|
|
32
|
+
purpose="模型配置、provider key、权限模式、网络开关、语言和 UI 偏好",
|
|
33
|
+
cli_entrypoints=("/config", "/model", "/apikey", "/setup"),
|
|
34
|
+
package_sources=("apps/cli/config_store.py", "apps/cli/config_paths.py", "config"),
|
|
35
|
+
mcp_tools=(),
|
|
36
|
+
next_step="/config list 或 /setup",
|
|
37
|
+
),
|
|
38
|
+
ServiceUsageSpec(
|
|
39
|
+
name="context_memory",
|
|
40
|
+
purpose="上下文压力检测、自动压缩、会话恢复和用户偏好记忆",
|
|
41
|
+
cli_entrypoints=("/compact", "/memory", "/session"),
|
|
42
|
+
package_sources=("packages/aria_services/context.py", "apps/cli/message_processing.py"),
|
|
43
|
+
mcp_tools=("aria.context.compact",),
|
|
44
|
+
next_step="/status 查看 auto compact 状态",
|
|
45
|
+
),
|
|
46
|
+
ServiceUsageSpec(
|
|
47
|
+
name="tool_registry",
|
|
48
|
+
purpose="本地工具、MCP 工具、schema、权限和 deterministic 输出封装",
|
|
49
|
+
cli_entrypoints=("/tools", "/mcp", "!shell"),
|
|
50
|
+
package_sources=("packages/aria_tools", "packages/aria_mcp", "runtime/tool_executor.py"),
|
|
51
|
+
mcp_tools=("read_file", "run_command", "broker_order"),
|
|
52
|
+
next_step="/tools 或 /packages tools arthera",
|
|
53
|
+
),
|
|
54
|
+
ServiceUsageSpec(
|
|
55
|
+
name="market_data",
|
|
56
|
+
purpose="行情、历史K线、技术指标、数据质量标记",
|
|
57
|
+
cli_entrypoints=("/quote", "/market", "/ta", "/chart"),
|
|
58
|
+
package_sources=("packages/data", "packages/quant_engine"),
|
|
59
|
+
mcp_tools=("calculate_factors", "northbound_flow"),
|
|
60
|
+
next_step="/quote AAPL 或 /chart MC.PA 1y",
|
|
61
|
+
),
|
|
62
|
+
ServiceUsageSpec(
|
|
63
|
+
name="signals_prediction",
|
|
64
|
+
purpose="量化信号、预测收益、市场状态和仓位建议",
|
|
65
|
+
cli_entrypoints=("/signal", "/predict", "/team"),
|
|
66
|
+
package_sources=("packages/quant_engine", "packages/ml"),
|
|
67
|
+
mcp_tools=("generate_signal", "get_ai_signal", "get_predictions", "kelly_position"),
|
|
68
|
+
next_step="/signal NVDA 或 /packages tools arthera",
|
|
69
|
+
),
|
|
70
|
+
ServiceUsageSpec(
|
|
71
|
+
name="backtest",
|
|
72
|
+
purpose="策略回测、交易成本、胜率、夏普和最大回撤",
|
|
73
|
+
cli_entrypoints=("/backtest", "/strategy"),
|
|
74
|
+
package_sources=("packages/quant_engine/backtest",),
|
|
75
|
+
mcp_tools=("run_backtest",),
|
|
76
|
+
next_step="/backtest momentum NVDA --period 1y",
|
|
77
|
+
),
|
|
78
|
+
ServiceUsageSpec(
|
|
79
|
+
name="risk_portfolio",
|
|
80
|
+
purpose="持仓风险、组合风险、压力测试和资金管理",
|
|
81
|
+
cli_entrypoints=("/risk", "/positions", "/account"),
|
|
82
|
+
package_sources=("brokers", "packages/quant_engine/risk", "packages/contracts"),
|
|
83
|
+
mcp_tools=("detect_regime", "kelly_position"),
|
|
84
|
+
next_step="/broker guide 然后 /positions",
|
|
85
|
+
),
|
|
86
|
+
ServiceUsageSpec(
|
|
87
|
+
name="reports_artifacts",
|
|
88
|
+
purpose="研报、图表、看板、Pine 文件和本地 artifact 管理",
|
|
89
|
+
cli_entrypoints=("/report", "/dashboard", "/chart", "/tv", "/artifacts"),
|
|
90
|
+
package_sources=("packages/reporting", "artifacts"),
|
|
91
|
+
mcp_tools=("aria.report.generate", "aria.artifacts.list"),
|
|
92
|
+
next_step="/report MSFT --format html",
|
|
93
|
+
),
|
|
94
|
+
ServiceUsageSpec(
|
|
95
|
+
name="broker_execution",
|
|
96
|
+
purpose="券商连接、账户只读查询、仿盘账户、订单预览、确认后执行和审计",
|
|
97
|
+
cli_entrypoints=("/broker", "/paper", "/trade", "/account", "/positions", "/orders"),
|
|
98
|
+
package_sources=("brokers", "brokers/trading.py", "brokers/paper_broker.py"),
|
|
99
|
+
mcp_tools=("broker_query", "broker_order"),
|
|
100
|
+
next_step="/paper start 100000 USD 或 /broker doctor",
|
|
101
|
+
),
|
|
102
|
+
ServiceUsageSpec(
|
|
103
|
+
name="tradingview_webhook",
|
|
104
|
+
purpose="TradingView 图表打开、Pine 策略导出、Alert Webhook 接入",
|
|
105
|
+
cli_entrypoints=("/tv", "aria_daemon.py"),
|
|
106
|
+
package_sources=("apps/cli/tradingview_bridge.py", "aria_daemon.py"),
|
|
107
|
+
mcp_tools=(),
|
|
108
|
+
next_step="/tv NVDA --pine --txt",
|
|
109
|
+
),
|
|
110
|
+
ServiceUsageSpec(
|
|
111
|
+
name="mcp_bridge",
|
|
112
|
+
purpose="把 Arthera QuantEngine 作为 MCP 工具暴露给 Aria/Claude/Cursor",
|
|
113
|
+
cli_entrypoints=("/packages connect arthera", "/mcp reload", "/packages tools arthera"),
|
|
114
|
+
package_sources=("packages/quant_engine/mcp_server.py",),
|
|
115
|
+
mcp_tools=("calculate_factors", "run_backtest", "price_option", "execution_schedule"),
|
|
116
|
+
next_step="/packages connect arthera --reload",
|
|
117
|
+
),
|
|
118
|
+
ServiceUsageSpec(
|
|
119
|
+
name="safety_policy",
|
|
120
|
+
purpose="文件、shell、网络、券商交易和隐私反馈的统一权限/审计边界",
|
|
121
|
+
cli_entrypoints=("/permissions", "/trade preview", "/feedback"),
|
|
122
|
+
package_sources=("safety", "runtime/approval.py", "command_safety.py", "privacy"),
|
|
123
|
+
mcp_tools=("run_command", "broker_order"),
|
|
124
|
+
next_step="/permissions 或 /trade mode",
|
|
125
|
+
),
|
|
126
|
+
ServiceUsageSpec(
|
|
127
|
+
name="observability",
|
|
128
|
+
purpose="doctor、架构覆盖、数据源健康、trace、manifest 和支持包",
|
|
129
|
+
cli_entrypoints=("/doctor", "/architecture", "/packages doctor"),
|
|
130
|
+
package_sources=("packages/aria_infra", "packages/aria_services/provider_health.py"),
|
|
131
|
+
mcp_tools=("aria.health", "aria.manifest.export"),
|
|
132
|
+
next_step="/doctor 或 /architecture --gaps",
|
|
133
|
+
),
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def service_usage_map() -> dict[str, ServiceUsageSpec]:
|
|
138
|
+
return {spec.name: spec for spec in list_service_usage_specs()}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Skill manifests for model-facing workflows."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import List
|
|
7
|
+
|
|
8
|
+
from packages.aria_core import CapabilityManifest, PermissionLevel, ServiceKind
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass(frozen=True)
|
|
12
|
+
class SkillSpec:
|
|
13
|
+
name: str
|
|
14
|
+
description: str
|
|
15
|
+
tools: List[str] = field(default_factory=list)
|
|
16
|
+
agents: List[str] = field(default_factory=list)
|
|
17
|
+
permissions: List[PermissionLevel] = field(default_factory=list)
|
|
18
|
+
|
|
19
|
+
def manifest(self) -> CapabilityManifest:
|
|
20
|
+
return CapabilityManifest(
|
|
21
|
+
name=self.name,
|
|
22
|
+
kind=ServiceKind.SKILL,
|
|
23
|
+
description=self.description,
|
|
24
|
+
capabilities=[f"tool:{name}" for name in self.tools] + [f"agent:{name}" for name in self.agents],
|
|
25
|
+
permissions=self.permissions,
|
|
26
|
+
required_services=self.tools + self.agents,
|
|
27
|
+
tags=["skill"],
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def builtin_skill_specs() -> List[SkillSpec]:
|
|
32
|
+
return [
|
|
33
|
+
SkillSpec(
|
|
34
|
+
name="financial-research",
|
|
35
|
+
description="Multi-source quote, fundamentals, technical analysis, and narrative report generation.",
|
|
36
|
+
tools=["get_market_data"],
|
|
37
|
+
agents=["technical", "fundamental", "macro", "risk", "synthesis"],
|
|
38
|
+
permissions=[PermissionLevel.NETWORK],
|
|
39
|
+
),
|
|
40
|
+
SkillSpec(
|
|
41
|
+
name="strategy-backtest",
|
|
42
|
+
description="Generate and validate trading strategies with historical simulation and artifacts.",
|
|
43
|
+
tools=["get_market_data"],
|
|
44
|
+
agents=["technical", "risk"],
|
|
45
|
+
permissions=[PermissionLevel.NETWORK, PermissionLevel.WORKSPACE_WRITE],
|
|
46
|
+
),
|
|
47
|
+
SkillSpec(
|
|
48
|
+
name="workspace-coding",
|
|
49
|
+
description="Read, edit, and verify local project files with explicit workspace permissions.",
|
|
50
|
+
tools=["read_file", "list_files", "search_code", "edit_file", "write_file", "run_command"],
|
|
51
|
+
permissions=[PermissionLevel.READ_ONLY, PermissionLevel.WORKSPACE_WRITE],
|
|
52
|
+
),
|
|
53
|
+
SkillSpec(
|
|
54
|
+
name="broker-portfolio",
|
|
55
|
+
description="Read broker account state and propose guarded orders with user approval.",
|
|
56
|
+
tools=["broker_query", "broker_order"],
|
|
57
|
+
permissions=[PermissionLevel.BROKER_READ, PermissionLevel.BROKER_TRADE],
|
|
58
|
+
),
|
|
59
|
+
]
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""Tool registry facade over Aria Code's legacy LOCAL_TOOLS shape."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import Any, Callable, Dict, Iterable, List, Mapping, Optional
|
|
7
|
+
|
|
8
|
+
from packages.aria_core import CapabilityManifest, PermissionLevel, ServiceKind
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Handler = Callable[[dict], dict]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
_PERMISSION_BY_TOOL = {
|
|
15
|
+
"read_file": [PermissionLevel.READ_ONLY],
|
|
16
|
+
"list_files": [PermissionLevel.READ_ONLY],
|
|
17
|
+
"search_code": [PermissionLevel.READ_ONLY],
|
|
18
|
+
"glob": [PermissionLevel.READ_ONLY],
|
|
19
|
+
"write_file": [PermissionLevel.WORKSPACE_WRITE],
|
|
20
|
+
"edit_file": [PermissionLevel.WORKSPACE_WRITE],
|
|
21
|
+
"notebook_edit": [PermissionLevel.WORKSPACE_WRITE],
|
|
22
|
+
"run_command": [PermissionLevel.WORKSPACE_WRITE],
|
|
23
|
+
"web_fetch": [PermissionLevel.NETWORK],
|
|
24
|
+
"github": [PermissionLevel.NETWORK],
|
|
25
|
+
"get_market_data": [PermissionLevel.NETWORK],
|
|
26
|
+
"broker_query": [PermissionLevel.BROKER_READ],
|
|
27
|
+
"broker_order": [PermissionLevel.BROKER_TRADE],
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class ToolSpec:
|
|
33
|
+
name: str
|
|
34
|
+
handler: Optional[Handler]
|
|
35
|
+
description: str
|
|
36
|
+
schema: Dict[str, Any] = field(default_factory=dict)
|
|
37
|
+
permissions: List[PermissionLevel] = field(default_factory=list)
|
|
38
|
+
capabilities: List[str] = field(default_factory=list)
|
|
39
|
+
|
|
40
|
+
def manifest(self) -> CapabilityManifest:
|
|
41
|
+
return CapabilityManifest(
|
|
42
|
+
name=self.name,
|
|
43
|
+
kind=ServiceKind.TOOL,
|
|
44
|
+
description=self.description,
|
|
45
|
+
capabilities=self.capabilities,
|
|
46
|
+
permissions=self.permissions,
|
|
47
|
+
input_schema=self.schema,
|
|
48
|
+
tags=["tool"],
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ToolRegistry:
|
|
53
|
+
"""Small typed registry that can wrap existing dict-based tools."""
|
|
54
|
+
|
|
55
|
+
def __init__(self) -> None:
|
|
56
|
+
self._tools: Dict[str, ToolSpec] = {}
|
|
57
|
+
|
|
58
|
+
def register(self, spec: ToolSpec, *, overwrite: bool = False) -> None:
|
|
59
|
+
if spec.name in self._tools and not overwrite:
|
|
60
|
+
raise ValueError(f"tool already registered: {spec.name}")
|
|
61
|
+
self._tools[spec.name] = spec
|
|
62
|
+
|
|
63
|
+
def get(self, name: str) -> Optional[ToolSpec]:
|
|
64
|
+
return self._tools.get(name)
|
|
65
|
+
|
|
66
|
+
def list(self) -> List[ToolSpec]:
|
|
67
|
+
return [self._tools[name] for name in sorted(self._tools)]
|
|
68
|
+
|
|
69
|
+
def manifests(self) -> List[CapabilityManifest]:
|
|
70
|
+
return [tool.manifest() for tool in self.list()]
|
|
71
|
+
|
|
72
|
+
def legacy_tools(self) -> Dict[str, tuple]:
|
|
73
|
+
return {
|
|
74
|
+
name: (spec.handler, spec.description)
|
|
75
|
+
for name, spec in self._tools.items()
|
|
76
|
+
if spec.handler is not None
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _schema_by_name(schemas: Iterable[dict]) -> Dict[str, dict]:
|
|
81
|
+
out: Dict[str, dict] = {}
|
|
82
|
+
for schema in schemas or []:
|
|
83
|
+
fn = schema.get("function") or {}
|
|
84
|
+
name = fn.get("name")
|
|
85
|
+
if name:
|
|
86
|
+
out[name] = fn.get("parameters") or {}
|
|
87
|
+
return out
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _capabilities_for_tool(name: str) -> List[str]:
|
|
91
|
+
if name.startswith("broker_"):
|
|
92
|
+
return ["broker"]
|
|
93
|
+
if name in ("get_market_data",) or "market" in name or "quote" in name:
|
|
94
|
+
return ["market.data"]
|
|
95
|
+
if name in ("read_file", "list_files", "search_code", "glob"):
|
|
96
|
+
return ["workspace.read"]
|
|
97
|
+
if name in ("write_file", "edit_file", "notebook_edit"):
|
|
98
|
+
return ["workspace.write"]
|
|
99
|
+
if name == "run_command":
|
|
100
|
+
return ["shell"]
|
|
101
|
+
if name in ("web_fetch", "github"):
|
|
102
|
+
return ["network"]
|
|
103
|
+
return ["tool"]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def build_registry_from_legacy(
|
|
107
|
+
tools: Mapping[str, tuple],
|
|
108
|
+
schemas: Iterable[dict] = (),
|
|
109
|
+
) -> ToolRegistry:
|
|
110
|
+
"""Create a typed registry from ``LOCAL_TOOLS`` and tool schemas."""
|
|
111
|
+
|
|
112
|
+
registry = ToolRegistry()
|
|
113
|
+
schema_map = _schema_by_name(schemas)
|
|
114
|
+
for name, value in tools.items():
|
|
115
|
+
handler = value[0] if value else None
|
|
116
|
+
description = value[1] if len(value) > 1 else ""
|
|
117
|
+
registry.register(
|
|
118
|
+
ToolSpec(
|
|
119
|
+
name=name,
|
|
120
|
+
handler=handler,
|
|
121
|
+
description=description,
|
|
122
|
+
schema=schema_map.get(name, {}),
|
|
123
|
+
permissions=_PERMISSION_BY_TOOL.get(name, [PermissionLevel.READ_ONLY]),
|
|
124
|
+
capabilities=_capabilities_for_tool(name),
|
|
125
|
+
),
|
|
126
|
+
overwrite=True,
|
|
127
|
+
)
|
|
128
|
+
return registry
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""
|
|
2
|
+
packages/quant_engine/sports — 足球量化分析模块
|
|
3
|
+
================================================
|
|
4
|
+
v2.0.0 — 2026-06
|
|
5
|
+
|
|
6
|
+
模块组成:
|
|
7
|
+
elo — World Football Elo 动态评分系统(二次曲线攻防,GD K 因子)
|
|
8
|
+
dixon_coles — Dixon-Coles 比分预测(NB 分布,大比分悬殊自动启用)
|
|
9
|
+
form — 近期状态分析(指数衰减权重)
|
|
10
|
+
h2h — 历史交锋分析与调整
|
|
11
|
+
predictor — 统一预测引擎 v2(动态权重、赛事情境、ρ 校准)
|
|
12
|
+
tracker — 预测追踪、Brier Score、自动 Elo 同步、动态场均进球
|
|
13
|
+
|
|
14
|
+
快速使用:
|
|
15
|
+
from packages.quant_engine.sports import quick_predict, get_elo
|
|
16
|
+
|
|
17
|
+
# 预测(含 NB 分布 + 动态权重)
|
|
18
|
+
result = quick_predict("germany", "curacao", league="wc")
|
|
19
|
+
print(f"德国赢率: {result['home_win']*100:.1f}%") # ~85%
|
|
20
|
+
|
|
21
|
+
# Elo 评分
|
|
22
|
+
elo = get_elo()
|
|
23
|
+
print(elo.get_rating("germany")) # ~1912(赛后更新)
|
|
24
|
+
|
|
25
|
+
# 自动同步已结束 WC 比赛 Elo
|
|
26
|
+
from packages.quant_engine.sports import sync_elo_from_wc
|
|
27
|
+
sync_elo_from_wc(api_get_fn)
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from .elo import EloRatingSystem, get_elo, ranking_to_elo
|
|
31
|
+
from .dixon_coles import (
|
|
32
|
+
compute_match_probabilities,
|
|
33
|
+
predict_scoreline_matrix,
|
|
34
|
+
tau_correction,
|
|
35
|
+
estimate_rho_from_results,
|
|
36
|
+
format_dc_result,
|
|
37
|
+
)
|
|
38
|
+
from .form import analyze_form, parse_api_results, form_bar, momentum_label
|
|
39
|
+
from .h2h import analyze_h2h
|
|
40
|
+
from .predictor import FootballPredictor, get_predictor, quick_predict
|
|
41
|
+
from .tracker import (
|
|
42
|
+
record_prediction,
|
|
43
|
+
record_result,
|
|
44
|
+
get_accuracy_stats,
|
|
45
|
+
sync_elo_from_wc,
|
|
46
|
+
fetch_wc_league_avg,
|
|
47
|
+
fetch_wc_rho,
|
|
48
|
+
auto_calibrate,
|
|
49
|
+
backfill_score_metrics,
|
|
50
|
+
)
|
|
51
|
+
from .calibrator import (
|
|
52
|
+
get_calibrated_params,
|
|
53
|
+
get_team_goal_bias,
|
|
54
|
+
get_all_team_biases,
|
|
55
|
+
calibration_summary,
|
|
56
|
+
save_calibration,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
__all__ = [
|
|
60
|
+
"EloRatingSystem", "get_elo", "ranking_to_elo",
|
|
61
|
+
"compute_match_probabilities", "predict_scoreline_matrix",
|
|
62
|
+
"tau_correction", "estimate_rho_from_results", "format_dc_result",
|
|
63
|
+
"analyze_form", "parse_api_results", "form_bar", "momentum_label",
|
|
64
|
+
"analyze_h2h",
|
|
65
|
+
"FootballPredictor", "get_predictor", "quick_predict",
|
|
66
|
+
"record_prediction", "record_result", "get_accuracy_stats",
|
|
67
|
+
"sync_elo_from_wc", "fetch_wc_league_avg", "fetch_wc_rho", "auto_calibrate",
|
|
68
|
+
"get_calibrated_params", "get_team_goal_bias", "get_all_team_biases",
|
|
69
|
+
"calibration_summary", "save_calibration",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
__version__ = "2.0.0"
|