forgexa-cli 1.57.0__tar.gz → 1.57.1__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.57.0 → forgexa_cli-1.57.1}/PKG-INFO +1 -1
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/__init__.py +1 -1
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/daemon.py +31 -5
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/PKG-INFO +1 -1
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/pyproject.toml +1 -1
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/README.md +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/_build_config.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/_local_bind.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/agent_core.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/autoupgrade.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/main.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/py.typed +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/runtime_evidence.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/zcode_protocol.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/SOURCES.txt +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/dependency_links.txt +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/entry_points.txt +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/requires.txt +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/top_level.txt +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/setup.cfg +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_auth_and_runtime_commands.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_autoupgrade.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_check_command.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_expiry_warnings_and_revoke.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_local_bind_commands.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_runtime_credentials.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_session_credentials.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_silent_install.py +0 -0
- {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_upgrade_observability.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""forgexa-cli — Forgexa command-line client."""
|
|
2
|
-
__version__ = "1.57.
|
|
2
|
+
__version__ = "1.57.1"
|
|
@@ -1150,7 +1150,7 @@ except (ImportError, ModuleNotFoundError):
|
|
|
1150
1150
|
# DAEMON_VERSION is the protocol/logic version of the daemon code.
|
|
1151
1151
|
# Kept in sync with pyproject.toml version via bump-version.sh.
|
|
1152
1152
|
# CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
|
|
1153
|
-
DAEMON_VERSION = "1.57.
|
|
1153
|
+
DAEMON_VERSION = "1.57.1"
|
|
1154
1154
|
|
|
1155
1155
|
|
|
1156
1156
|
def _detect_client_type() -> str:
|
|
@@ -6926,7 +6926,7 @@ class ProcessManager:
|
|
|
6926
6926
|
task_id,
|
|
6927
6927
|
stdin_input=agent_core.qoder_stdin_prompt(prompt),
|
|
6928
6928
|
on_chunk=on_chunk,
|
|
6929
|
-
env=agent_core.qoder_base_env
|
|
6929
|
+
env=await asyncio.to_thread(agent_core.qoder_base_env, os.environ.copy()),
|
|
6930
6930
|
)
|
|
6931
6931
|
finally:
|
|
6932
6932
|
agent_core.release_file_lock(profile_lock)
|
|
@@ -6991,7 +6991,7 @@ class ProcessManager:
|
|
|
6991
6991
|
task_id,
|
|
6992
6992
|
stdin_input=prompt,
|
|
6993
6993
|
on_chunk=on_chunk,
|
|
6994
|
-
env=agent_core.trae_code_base_env
|
|
6994
|
+
env=await asyncio.to_thread(agent_core.trae_code_base_env, os.environ.copy()),
|
|
6995
6995
|
)
|
|
6996
6996
|
finally:
|
|
6997
6997
|
agent_core.release_file_lock(profile_lock)
|
|
@@ -7052,6 +7052,9 @@ class ProcessManager:
|
|
|
7052
7052
|
if on_chunk is None or event.get("type") not in {"model.streaming", "tool.updated"}:
|
|
7053
7053
|
return
|
|
7054
7054
|
payload = event.get("payload") if isinstance(event.get("payload"), dict) else {}
|
|
7055
|
+
# AGT-11 (audit): zcode 0.16.x never emits "model.streaming" —
|
|
7056
|
+
# final text is read back from session/messages after the turn
|
|
7057
|
+
# terminates. This branch is forward-compatibility only.
|
|
7055
7058
|
if event.get("type") == "model.streaming":
|
|
7056
7059
|
text = payload.get("text") or payload.get("delta") or payload.get("content")
|
|
7057
7060
|
line = text.strip() if isinstance(text, str) else ""
|
|
@@ -7069,7 +7072,7 @@ class ProcessManager:
|
|
|
7069
7072
|
client = ZCodeProtocolSession(
|
|
7070
7073
|
[agent.command, "app-server"],
|
|
7071
7074
|
cwd=cwd,
|
|
7072
|
-
env=agent_core.zcode_base_env
|
|
7075
|
+
env=await asyncio.to_thread(agent_core.zcode_base_env, os.environ.copy()),
|
|
7073
7076
|
on_event=on_event,
|
|
7074
7077
|
permission_handler=agent_core.zcode_permission_response,
|
|
7075
7078
|
)
|
|
@@ -7127,7 +7130,10 @@ class ProcessManager:
|
|
|
7127
7130
|
stdout="",
|
|
7128
7131
|
stderr=client.stderr_tail[-10000:] if client is not None else "",
|
|
7129
7132
|
error=f"Timed out after {timeout}s (absolute limit)",
|
|
7130
|
-
|
|
7133
|
+
# AGT-12 (audit): this is the run_turn absolute cap, not an
|
|
7134
|
+
# idle gap — a distinct code keeps retry/degrade policies
|
|
7135
|
+
# from misreading a too-long task as a stuck one.
|
|
7136
|
+
failure_code="zcode_turn_timeout",
|
|
7131
7137
|
)
|
|
7132
7138
|
except ZCodeProtocolError as exc:
|
|
7133
7139
|
return TaskResult(
|
|
@@ -15617,6 +15623,26 @@ class RuntimeDaemon:
|
|
|
15617
15623
|
)
|
|
15618
15624
|
return {"push_error": f"Would push to default branch {current_branch}"}
|
|
15619
15625
|
|
|
15626
|
+
# AGT-10 (audit): last line of defense after a collision was
|
|
15627
|
+
# manually released at gate review — the executed branch must be
|
|
15628
|
+
# this requirement's canonical branch (or the workflow's recorded
|
|
15629
|
+
# analysis branch), never another requirement's.
|
|
15630
|
+
if task.requirement_key and current_branch and expected_branch:
|
|
15631
|
+
if current_branch != expected_branch:
|
|
15632
|
+
logger.error(
|
|
15633
|
+
"CRITICAL: requirement %s is about to push branch '%s' "
|
|
15634
|
+
"which is not its canonical branch '%s' — aborting",
|
|
15635
|
+
task.requirement_key, current_branch, expected_branch,
|
|
15636
|
+
)
|
|
15637
|
+
return {
|
|
15638
|
+
"push_error": (
|
|
15639
|
+
f"Push blocked: branch '{current_branch}' does not belong to "
|
|
15640
|
+
f"requirement {task.requirement_key} (expected '{expected_branch}'). "
|
|
15641
|
+
"A cross-requirement branch collision was likely released at review; "
|
|
15642
|
+
"re-run the fix on the correct branch."
|
|
15643
|
+
),
|
|
15644
|
+
}
|
|
15645
|
+
|
|
15620
15646
|
if task.requirement_key and current_branch:
|
|
15621
15647
|
forbidden_merges = await self._list_unpushed_merge_commits(
|
|
15622
15648
|
workspace_path, current_branch, default_branch,
|
|
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
|