forgexa-cli 1.66.0__tar.gz → 1.66.2__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.
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/PKG-INFO +1 -1
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/__init__.py +1 -1
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/aws_evidence.py +57 -10
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/daemon.py +1 -1
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli.egg-info/PKG-INFO +1 -1
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/pyproject.toml +1 -1
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/README.md +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/_build_config.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/_local_bind.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/agent_core.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/autoupgrade.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/main.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/py.typed +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/runtime_evidence.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli/zcode_protocol.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli.egg-info/SOURCES.txt +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli.egg-info/dependency_links.txt +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli.egg-info/entry_points.txt +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli.egg-info/requires.txt +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/forgexa_cli.egg-info/top_level.txt +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/setup.cfg +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_auth_and_runtime_commands.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_autoupgrade.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_check_command.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_expiry_warnings_and_revoke.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_local_bind_commands.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_runtime_credentials.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_session_credentials.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_silent_install.py +0 -0
- {forgexa_cli-1.66.0 → forgexa_cli-1.66.2}/tests/test_upgrade_observability.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""forgexa-cli — Forgexa command-line client."""
|
|
2
|
-
__version__ = "1.66.
|
|
2
|
+
__version__ = "1.66.2"
|
|
@@ -35,6 +35,58 @@ SECRET_FIELDS = frozenset(
|
|
|
35
35
|
}
|
|
36
36
|
)
|
|
37
37
|
|
|
38
|
+
MODEL_ENDPOINT_KEYS = {
|
|
39
|
+
"claude": ("ANTHROPIC_BASE_URL",),
|
|
40
|
+
"mimo": ("ANTHROPIC_BASE_URL",),
|
|
41
|
+
"deepseek": ("DEEPSEEK_BASE_URL", "ANTHROPIC_BASE_URL"),
|
|
42
|
+
"copilot": ("COPILOT_API_URL", "GITHUB_COPILOT_BASE_URL", "GH_HOST"),
|
|
43
|
+
"gemini": ("GOOGLE_GEMINI_BASE_URL", "GEMINI_API_BASE_URL"),
|
|
44
|
+
"kimi": ("KIMI_BASE_URL", "OPENAI_BASE_URL"),
|
|
45
|
+
}
|
|
46
|
+
MODEL_PROVIDER_LABELS = {
|
|
47
|
+
"anthropic": "Anthropic",
|
|
48
|
+
"openai": "OpenAI",
|
|
49
|
+
"google": "Google",
|
|
50
|
+
"github": "GitHub Copilot",
|
|
51
|
+
"moonshot": "Moonshot / Kimi",
|
|
52
|
+
"deepseek": "DeepSeek",
|
|
53
|
+
"xiaomi": "Xiaomi MiMo",
|
|
54
|
+
"alibaba": "Alibaba Cloud / Qwen",
|
|
55
|
+
"tencent": "Tencent / CodeBuddy",
|
|
56
|
+
"qoder": "Qoder",
|
|
57
|
+
"bytedance": "ByteDance / Trae",
|
|
58
|
+
"zhipu": "Zhipu / Z.ai",
|
|
59
|
+
}
|
|
60
|
+
AGENT_MODEL_PROVIDERS = {
|
|
61
|
+
"claude": ("Claude Code", "anthropic"),
|
|
62
|
+
"codex": ("Codex", "openai"),
|
|
63
|
+
"opencode": ("OpenCode", None),
|
|
64
|
+
"mimo": ("MiMo Code", "xiaomi"),
|
|
65
|
+
"kimi": ("Kimi Code", "moonshot"),
|
|
66
|
+
"qwen": ("Qwen Code", "alibaba"),
|
|
67
|
+
"codebuddy": ("CodeBuddy", "tencent"),
|
|
68
|
+
"qoder": ("Qoder CLI", "qoder"),
|
|
69
|
+
"trae": ("TraeCode CLI", "bytedance"),
|
|
70
|
+
"zcode": ("ZCode", "zhipu"),
|
|
71
|
+
"copilot": ("GitHub Copilot", "github"),
|
|
72
|
+
"gemini": ("Gemini CLI", "google"),
|
|
73
|
+
"deepseek": ("DeepSeek Harness", "deepseek"),
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def provider_catalog() -> dict:
|
|
78
|
+
agents = [{"agent_id": agent_id, "label": label, "provider": provider,
|
|
79
|
+
"evidence_supported": agent_id in MODEL_ENDPOINT_KEYS}
|
|
80
|
+
for agent_id, (label, provider) in AGENT_MODEL_PROVIDERS.items()]
|
|
81
|
+
providers = [{"value": provider, "label": label,
|
|
82
|
+
"agent_ids": [agent["agent_id"] for agent in agents if agent["provider"] == provider],
|
|
83
|
+
"evidence_supported": any(agent["provider"] == provider and agent["evidence_supported"] for agent in agents)}
|
|
84
|
+
for provider, label in MODEL_PROVIDER_LABELS.items()]
|
|
85
|
+
zhipu = next(provider for provider in providers if provider["value"] == "zhipu")
|
|
86
|
+
zhipu["agent_ids"].insert(0, "claude")
|
|
87
|
+
zhipu["evidence_supported"] = True
|
|
88
|
+
return {"agents": agents, "providers": providers}
|
|
89
|
+
|
|
38
90
|
|
|
39
91
|
class EvidenceError(ValueError):
|
|
40
92
|
pass
|
|
@@ -65,17 +117,9 @@ def model_destination(driver_id: str, environment: dict) -> dict:
|
|
|
65
117
|
"copilot": ("github", "https://api.githubcopilot.com"),
|
|
66
118
|
"gemini": ("google", "https://generativelanguage.googleapis.com"),
|
|
67
119
|
}
|
|
68
|
-
|
|
69
|
-
"claude": ("ANTHROPIC_BASE_URL",),
|
|
70
|
-
"mimo": ("ANTHROPIC_BASE_URL",),
|
|
71
|
-
"deepseek": ("DEEPSEEK_BASE_URL", "ANTHROPIC_BASE_URL"),
|
|
72
|
-
"copilot": ("COPILOT_API_URL", "GITHUB_COPILOT_BASE_URL", "GH_HOST"),
|
|
73
|
-
"gemini": ("GOOGLE_GEMINI_BASE_URL", "GEMINI_API_BASE_URL"),
|
|
74
|
-
"kimi": ("KIMI_BASE_URL", "OPENAI_BASE_URL"),
|
|
75
|
-
}
|
|
76
|
-
if driver_id not in explicit_keys:
|
|
120
|
+
if driver_id not in MODEL_ENDPOINT_KEYS:
|
|
77
121
|
raise EvidenceError("aws_evidence_unknown_provider")
|
|
78
|
-
endpoints = [environment[key] for key in
|
|
122
|
+
endpoints = [environment[key] for key in MODEL_ENDPOINT_KEYS[driver_id] if environment.get(key)]
|
|
79
123
|
if len(set(endpoints)) > 1 or (not endpoints and driver_id not in defaults):
|
|
80
124
|
raise EvidenceError("aws_evidence_unknown_provider")
|
|
81
125
|
endpoint = endpoints[0] if endpoints else defaults[driver_id][1]
|
|
@@ -92,6 +136,7 @@ def model_destination(driver_id: str, environment: dict) -> dict:
|
|
|
92
136
|
"api.moonshot.ai": "moonshot",
|
|
93
137
|
"api.xiaomimimo.com": "xiaomi",
|
|
94
138
|
"api.deepseek.com": "deepseek",
|
|
139
|
+
"open.bigmodel.cn": "zhipu",
|
|
95
140
|
}
|
|
96
141
|
provider = known_hosts.get(parsed.hostname or "")
|
|
97
142
|
if (
|
|
@@ -100,6 +145,8 @@ def model_destination(driver_id: str, environment: dict) -> dict:
|
|
|
100
145
|
or parsed.password
|
|
101
146
|
or not provider
|
|
102
147
|
or parsed.port not in (None, 443)
|
|
148
|
+
or (provider == "zhipu" and (driver_id != "claude"
|
|
149
|
+
or parsed.path.rstrip("/") != "/api/anthropic" or parsed.query or parsed.fragment))
|
|
103
150
|
):
|
|
104
151
|
raise EvidenceError("aws_evidence_unknown_provider")
|
|
105
152
|
return {"model_provider": provider, "endpoint": endpoint.rstrip("/")}
|
|
@@ -1234,7 +1234,7 @@ except (ImportError, ModuleNotFoundError):
|
|
|
1234
1234
|
# DAEMON_VERSION is the protocol/logic version of the daemon code.
|
|
1235
1235
|
# Kept in sync with pyproject.toml version via bump-version.sh.
|
|
1236
1236
|
# CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
|
|
1237
|
-
DAEMON_VERSION = "1.66.
|
|
1237
|
+
DAEMON_VERSION = "1.66.2"
|
|
1238
1238
|
|
|
1239
1239
|
|
|
1240
1240
|
def _detect_client_type() -> str:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|