mtrx-cli 0.1.6 → 0.1.8
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.
- package/package.json +1 -1
- package/src/matrx/__init__.py +1 -1
- package/src/matrx/cli/launcher.py +9 -17
- package/src/matrx/cli/main.py +5 -6
package/package.json
CHANGED
package/src/matrx/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.1.
|
|
1
|
+
__version__ = "0.1.8"
|
|
@@ -170,13 +170,6 @@ def prepare_routed_setup(
|
|
|
170
170
|
changed = True
|
|
171
171
|
if route == "matrx" and _persist_workspace_binding_from_env(state, env):
|
|
172
172
|
changed = True
|
|
173
|
-
if route == "matrx" and tool == "claude":
|
|
174
|
-
mx_key, _ = _resolve_matrx_route_key(state, env)
|
|
175
|
-
if _approve_claude_custom_api_key(mx_key):
|
|
176
|
-
changed = True
|
|
177
|
-
if _sync_claude_subscription_to_matrx(state, env):
|
|
178
|
-
changed = True
|
|
179
|
-
|
|
180
173
|
if _sync_tool_route_config(state, tool=tool, route=route):
|
|
181
174
|
changed = True
|
|
182
175
|
|
|
@@ -500,8 +493,8 @@ def _build_claude_env(
|
|
|
500
493
|
env.pop("MATRX_CLAUDE_MODE", None)
|
|
501
494
|
env["MATRX_BASE_URL"] = proxy_root
|
|
502
495
|
env["MATRX_API_KEY"] = mx_key
|
|
503
|
-
env["ANTHROPIC_BASE_URL"] =
|
|
504
|
-
env
|
|
496
|
+
env["ANTHROPIC_BASE_URL"] = proxy_root
|
|
497
|
+
env.pop("ANTHROPIC_API_KEY", None)
|
|
505
498
|
group_id, project_id = _resolve_matrx_context_overrides(state, env)
|
|
506
499
|
session_id = str(uuid.uuid4())
|
|
507
500
|
# Evolutionary scaffolding: env snapshot for AI context injection
|
|
@@ -568,7 +561,7 @@ def _validate_claude_launch_plan(plan: LaunchPlan, state: dict) -> None:
|
|
|
568
561
|
return
|
|
569
562
|
|
|
570
563
|
base_url = (plan.env.get("ANTHROPIC_BASE_URL") or "").strip()
|
|
571
|
-
expected_base_url =
|
|
564
|
+
expected_base_url = ensure_root_url(state.get("auth", {}).get("matrx", {}).get("base_url"))
|
|
572
565
|
if not base_url:
|
|
573
566
|
raise ValueError("Claude Matrx route is missing ANTHROPIC_BASE_URL")
|
|
574
567
|
if base_url != expected_base_url:
|
|
@@ -581,14 +574,12 @@ def _validate_claude_launch_plan(plan: LaunchPlan, state: dict) -> None:
|
|
|
581
574
|
if not mx_key.startswith("mx_"):
|
|
582
575
|
raise ValueError("Claude Matrx route is missing a valid MATRX_API_KEY")
|
|
583
576
|
|
|
584
|
-
anthropic_key = (plan.env.get("ANTHROPIC_API_KEY") or "").strip()
|
|
585
|
-
if anthropic_key != mx_key:
|
|
586
|
-
raise ValueError("Claude Matrx route must set ANTHROPIC_API_KEY to the same mx_ key as MATRX_API_KEY")
|
|
587
|
-
|
|
588
577
|
custom_headers = (plan.env.get("ANTHROPIC_CUSTOM_HEADERS") or "").strip()
|
|
589
578
|
if not custom_headers:
|
|
590
579
|
raise ValueError("Claude Matrx route is missing ANTHROPIC_CUSTOM_HEADERS")
|
|
591
580
|
lowered_headers = custom_headers.lower()
|
|
581
|
+
if "x-matrx-key:" not in lowered_headers:
|
|
582
|
+
raise ValueError("Claude Matrx route is missing ANTHROPIC_CUSTOM_HEADERS with X-Matrx-Key")
|
|
592
583
|
if "x-matrx-session-id:" not in lowered_headers:
|
|
593
584
|
raise ValueError("Claude Matrx route is missing ANTHROPIC_CUSTOM_HEADERS with X-Matrx-Session-Id")
|
|
594
585
|
if "x-matrx-provider: claude_code" not in lowered_headers:
|
|
@@ -598,6 +589,8 @@ def _validate_claude_launch_plan(plan: LaunchPlan, state: dict) -> None:
|
|
|
598
589
|
|
|
599
590
|
if plan.env.get("ANTHROPIC_AUTH_TOKEN"):
|
|
600
591
|
raise ValueError("Claude Matrx route should not set ANTHROPIC_AUTH_TOKEN")
|
|
592
|
+
if plan.env.get("ANTHROPIC_API_KEY"):
|
|
593
|
+
raise ValueError("Claude Matrx route should not set ANTHROPIC_API_KEY")
|
|
601
594
|
|
|
602
595
|
|
|
603
596
|
def _validate_codex_launch_plan(plan: LaunchPlan, state: dict) -> None:
|
|
@@ -647,15 +640,14 @@ def describe_launch_plan(plan: LaunchPlan, state: dict) -> list[str]:
|
|
|
647
640
|
]
|
|
648
641
|
|
|
649
642
|
if plan.tool == "claude":
|
|
650
|
-
base_url =
|
|
643
|
+
base_url = ensure_root_url(state.get("auth", {}).get("matrx", {}).get("base_url"))
|
|
651
644
|
custom_headers = (plan.env.get("ANTHROPIC_CUSTOM_HEADERS") or "").strip()
|
|
652
|
-
anthropic_key = (plan.env.get("ANTHROPIC_API_KEY") or "").strip()
|
|
653
645
|
return [
|
|
654
646
|
"Launching claude via Matrx",
|
|
655
647
|
f" base_url: {base_url or DEFAULT_MATRX_BASE_URL}",
|
|
656
648
|
f" auth_source: {plan.auth_source}",
|
|
657
649
|
f" custom_headers_present: {bool(custom_headers)}",
|
|
658
|
-
f" proxy_key_present: {
|
|
650
|
+
f" proxy_key_present: {'x-matrx-key:' in custom_headers.lower()}",
|
|
659
651
|
f" subscription_token_available: {bool(_resolve_claude_subscription_token(state))}",
|
|
660
652
|
" runtime_route: env injection",
|
|
661
653
|
" persistent_route: disabled",
|
package/src/matrx/cli/main.py
CHANGED
|
@@ -226,9 +226,9 @@ def _run_matrx_browser_login(
|
|
|
226
226
|
return result
|
|
227
227
|
|
|
228
228
|
|
|
229
|
-
def _complete_matrx_login(state: dict) -> tuple[dict, bool]:
|
|
229
|
+
def _complete_matrx_login(state: dict, *, force: bool = False) -> tuple[dict, bool]:
|
|
230
230
|
auth_cfg = state.setdefault("auth", {}).setdefault("matrx", {})
|
|
231
|
-
if _has_matrx_login(state, env=os.environ):
|
|
231
|
+
if not force and _has_matrx_login(state, env=os.environ):
|
|
232
232
|
return state, False
|
|
233
233
|
if not _is_interactive_terminal():
|
|
234
234
|
raise ValueError("Login required. Run: mtrx login matrx --key mx_... or set MTRX_KEY")
|
|
@@ -263,8 +263,7 @@ def _complete_codex_login() -> None:
|
|
|
263
263
|
|
|
264
264
|
|
|
265
265
|
def _complete_claude_login(state: dict) -> tuple[dict, bool]:
|
|
266
|
-
|
|
267
|
-
if imported or claude_oauth_available():
|
|
266
|
+
if claude_oauth_available():
|
|
268
267
|
return state, False
|
|
269
268
|
if not _is_interactive_terminal():
|
|
270
269
|
raise ValueError(
|
|
@@ -335,12 +334,12 @@ def _cmd_login(args) -> int:
|
|
|
335
334
|
None,
|
|
336
335
|
base_url=state["auth"]["matrx"].get("base_url"),
|
|
337
336
|
)
|
|
338
|
-
if not key:
|
|
337
|
+
if args.web or not key:
|
|
339
338
|
if not args.web and not _is_interactive_terminal():
|
|
340
339
|
print("--key is required for non-interactive Matrx login", file=sys.stderr)
|
|
341
340
|
return 1
|
|
342
341
|
try:
|
|
343
|
-
state, changed = _complete_matrx_login(state)
|
|
342
|
+
state, changed = _complete_matrx_login(state, force=args.web)
|
|
344
343
|
except ValueError as exc:
|
|
345
344
|
print(str(exc), file=sys.stderr)
|
|
346
345
|
return 1
|