forgexa-cli 1.37.2__tar.gz → 1.37.4__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 (27) hide show
  1. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/PKG-INFO +1 -1
  2. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/__init__.py +1 -1
  3. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/daemon.py +22 -3
  4. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli.egg-info/PKG-INFO +1 -1
  5. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/pyproject.toml +1 -1
  6. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/README.md +0 -0
  7. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/_build_config.py +0 -0
  8. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/_local_bind.py +0 -0
  9. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/agent_core.py +0 -0
  10. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/autoupgrade.py +0 -0
  11. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/main.py +0 -0
  12. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli/py.typed +0 -0
  13. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli.egg-info/SOURCES.txt +0 -0
  14. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli.egg-info/dependency_links.txt +0 -0
  15. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli.egg-info/entry_points.txt +0 -0
  16. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli.egg-info/requires.txt +0 -0
  17. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/forgexa_cli.egg-info/top_level.txt +0 -0
  18. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/setup.cfg +0 -0
  19. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_auth_and_runtime_commands.py +0 -0
  20. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_autoupgrade.py +0 -0
  21. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_check_command.py +0 -0
  22. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_expiry_warnings_and_revoke.py +0 -0
  23. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_local_bind_commands.py +0 -0
  24. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_runtime_credentials.py +0 -0
  25. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_session_credentials.py +0 -0
  26. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/tests/test_silent_install.py +0 -0
  27. {forgexa_cli-1.37.2 → forgexa_cli-1.37.4}/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.37.2
3
+ Version: 1.37.4
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.37.2"
2
+ __version__ = "1.37.4"
@@ -910,7 +910,7 @@ except (ImportError, ModuleNotFoundError):
910
910
  # DAEMON_VERSION is the protocol/logic version of the daemon code.
911
911
  # Kept in sync with pyproject.toml version via bump-version.sh.
912
912
  # CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
913
- DAEMON_VERSION = "1.37.2"
913
+ DAEMON_VERSION = "1.37.4"
914
914
 
915
915
 
916
916
  def _detect_client_type() -> str:
@@ -4742,6 +4742,19 @@ class ProcessManager:
4742
4742
  or signals["has_meaningful_content"]
4743
4743
  )
4744
4744
 
4745
+ @staticmethod
4746
+ def has_verified_agent_completion(result: "TaskResult") -> bool:
4747
+ """Return True when structured output proves the agent completed a real turn."""
4748
+ combined = "\n".join(part for part in (result.stdout, result.stderr) if part)
4749
+ signals = ProcessManager._extract_output_signals(combined)
4750
+ return bool(
4751
+ signals["has_assistant_events"]
4752
+ and signals["has_meaningful_content"]
4753
+ and (signals["has_result"] or signals["has_turn_completed"])
4754
+ and not signals["has_turn_failed"]
4755
+ and not signals["error_messages"]
4756
+ )
4757
+
4745
4758
  @staticmethod
4746
4759
  def _copilot_completed_without_result(stdout: str) -> bool:
4747
4760
  """Implementation lives in agent_core._copilot_completed_without_result."""
@@ -9077,10 +9090,16 @@ class RuntimeDaemon:
9077
9090
  int(result.metrics.get("token_input", 0) or 0)
9078
9091
  + int(result.metrics.get("token_output", 0) or 0)
9079
9092
  ) > 0
9080
- if not has_uncommitted and not has_committed and not has_tokens:
9093
+ has_verified_completion = self.process_manager.has_verified_agent_completion(result)
9094
+ if (
9095
+ not has_uncommitted
9096
+ and not has_committed
9097
+ and not has_tokens
9098
+ and not has_verified_completion
9099
+ ):
9081
9100
  logger.warning(
9082
9101
  "Task %s (%s) agent reported success but produced no file changes "
9083
- "and no token usage — marking as failed",
9102
+ "or verified completion evidence — marking as failed",
9084
9103
  task.task_id, task.node_type,
9085
9104
  )
9086
9105
  result.status = "failed"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.37.2
3
+ Version: 1.37.4
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.37.2"
3
+ version = "1.37.4"
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