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.
Files changed (29) hide show
  1. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/PKG-INFO +1 -1
  2. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/__init__.py +1 -1
  3. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/daemon.py +31 -5
  4. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/PKG-INFO +1 -1
  5. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/pyproject.toml +1 -1
  6. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/README.md +0 -0
  7. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/_build_config.py +0 -0
  8. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/_local_bind.py +0 -0
  9. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/agent_core.py +0 -0
  10. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/autoupgrade.py +0 -0
  11. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/main.py +0 -0
  12. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/py.typed +0 -0
  13. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/runtime_evidence.py +0 -0
  14. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli/zcode_protocol.py +0 -0
  15. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/SOURCES.txt +0 -0
  16. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/dependency_links.txt +0 -0
  17. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/entry_points.txt +0 -0
  18. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/requires.txt +0 -0
  19. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/forgexa_cli.egg-info/top_level.txt +0 -0
  20. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/setup.cfg +0 -0
  21. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_auth_and_runtime_commands.py +0 -0
  22. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_autoupgrade.py +0 -0
  23. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_check_command.py +0 -0
  24. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_expiry_warnings_and_revoke.py +0 -0
  25. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_local_bind_commands.py +0 -0
  26. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_runtime_credentials.py +0 -0
  27. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_session_credentials.py +0 -0
  28. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_silent_install.py +0 -0
  29. {forgexa_cli-1.57.0 → forgexa_cli-1.57.1}/tests/test_upgrade_observability.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.57.0
3
+ Version: 1.57.1
4
4
  Summary: Forgexa CLI — command-line client and AI agent runtime for the Forgexa platform
5
5
  Author-email: Jason Sun <dev.winds@gmail.com>
6
6
  License-Expression: MIT
@@ -1,2 +1,2 @@
1
1
  """forgexa-cli — Forgexa command-line client."""
2
- __version__ = "1.57.0"
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.0"
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(os.environ.copy()),
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(os.environ.copy()),
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(os.environ.copy()),
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
- failure_code="agent_idle_timeout",
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,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.57.0
3
+ Version: 1.57.1
4
4
  Summary: Forgexa CLI — command-line client and AI agent runtime for the Forgexa platform
5
5
  Author-email: Jason Sun <dev.winds@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "forgexa-cli"
3
- version = "1.57.0"
3
+ version = "1.57.1"
4
4
  description = "Forgexa CLI — command-line client and AI agent runtime for the Forgexa platform"
5
5
  requires-python = ">=3.9"
6
6
  license = "MIT"
File without changes
File without changes