forgexa-cli 1.15.5__tar.gz → 1.15.7__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.
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.15.5
3
+ Version: 1.15.7
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
- License: MIT
6
+ License-Expression: MIT
7
7
  Project-URL: Homepage, https://forgexa.net
8
8
  Project-URL: Documentation, https://docs.forgexa.net
9
9
  Project-URL: Repository, https://github.com/forgexa/forgexa
@@ -12,7 +12,6 @@ Keywords: forgexa,ai,software-factory,cli,devops,agent
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
15
- Classifier: License :: OSI Approved :: MIT License
16
15
  Classifier: Operating System :: OS Independent
17
16
  Classifier: Programming Language :: Python :: 3
18
17
  Classifier: Programming Language :: Python :: 3.9
@@ -1,2 +1,2 @@
1
1
  """forgexa-cli — Forgexa command-line client."""
2
- __version__ = "1.15.5"
2
+ __version__ = "1.15.7"
@@ -523,7 +523,7 @@ except (ImportError, ModuleNotFoundError):
523
523
  # DAEMON_VERSION is the protocol/logic version of the daemon code.
524
524
  # Kept in sync with pyproject.toml version via bump-version.sh.
525
525
  # CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
526
- DAEMON_VERSION = "1.15.5"
526
+ DAEMON_VERSION = "1.15.7"
527
527
 
528
528
 
529
529
  def _detect_client_type() -> str:
@@ -862,6 +862,62 @@ def _daemon_extract_copilot_output(raw: str) -> str:
862
862
  return raw
863
863
 
864
864
 
865
+ def _daemon_extract_codex_output(raw: str) -> str:
866
+ """Extract assistant text from Codex JSONL output."""
867
+ assistant_messages: list[str] = []
868
+ fallback_parts: list[str] = []
869
+
870
+ for line in raw.split("\n"):
871
+ line = line.strip()
872
+ if not line:
873
+ continue
874
+ try:
875
+ data = json.loads(line)
876
+ except json.JSONDecodeError:
877
+ fallback_parts.append(line)
878
+ continue
879
+ if not isinstance(data, dict):
880
+ continue
881
+
882
+ if data.get("type") == "item.completed":
883
+ item = data.get("item") or {}
884
+ if item.get("type") == "agent_message":
885
+ text = item.get("text") or ""
886
+ if isinstance(text, str) and text.strip():
887
+ assistant_messages.append(text.strip())
888
+ continue
889
+
890
+ if data.get("type") != "message" or data.get("role") != "assistant":
891
+ continue
892
+
893
+ content = data.get("content", [])
894
+ if isinstance(content, str) and content.strip():
895
+ assistant_messages.append(content.strip())
896
+ continue
897
+ if not isinstance(content, list):
898
+ continue
899
+
900
+ texts: list[str] = []
901
+ for block in content:
902
+ if not isinstance(block, dict):
903
+ continue
904
+ if block.get("type") not in ("text", "output_text"):
905
+ continue
906
+ text = block.get("text") or block.get("content") or ""
907
+ if isinstance(text, str) and text.strip():
908
+ texts.append(text)
909
+
910
+ joined = "\n".join(texts).strip()
911
+ if joined:
912
+ assistant_messages.append(joined)
913
+
914
+ if assistant_messages:
915
+ return assistant_messages[-1]
916
+
917
+ fallback = "\n".join(fallback_parts).strip()
918
+ return fallback or raw
919
+
920
+
865
921
  def _daemon_extract_claude_output(raw: str) -> str:
866
922
  """Extract result text from Claude CLI JSON/stream-json output."""
867
923
  raw = raw.strip()
@@ -990,6 +1046,8 @@ def _daemon_extract_agent_output(agent_id: str, raw: str) -> str:
990
1046
  return _daemon_extract_claude_output(raw)
991
1047
  if agent_id == "copilot":
992
1048
  return _daemon_extract_copilot_output(raw)
1049
+ if agent_id == "codex":
1050
+ return _daemon_extract_codex_output(raw)
993
1051
  if agent_id == "opencode":
994
1052
  return _daemon_extract_opencode_output(raw)
995
1053
  return raw
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.15.5
3
+ Version: 1.15.7
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
- License: MIT
6
+ License-Expression: MIT
7
7
  Project-URL: Homepage, https://forgexa.net
8
8
  Project-URL: Documentation, https://docs.forgexa.net
9
9
  Project-URL: Repository, https://github.com/forgexa/forgexa
@@ -12,7 +12,6 @@ Keywords: forgexa,ai,software-factory,cli,devops,agent
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
15
- Classifier: License :: OSI Approved :: MIT License
16
15
  Classifier: Operating System :: OS Independent
17
16
  Classifier: Programming Language :: Python :: 3
18
17
  Classifier: Programming Language :: Python :: 3.9
@@ -1,9 +1,9 @@
1
1
  [project]
2
2
  name = "forgexa-cli"
3
- version = "1.15.5"
3
+ version = "1.15.7"
4
4
  description = "Forgexa CLI — command-line client and AI agent runtime for the Forgexa platform"
5
5
  requires-python = ">=3.9"
6
- license = { text = "MIT" }
6
+ license = "MIT"
7
7
  authors = [
8
8
  { name = "Jason Sun", email = "dev.winds@gmail.com" },
9
9
  ]
@@ -13,7 +13,6 @@ classifiers = [
13
13
  "Development Status :: 4 - Beta",
14
14
  "Environment :: Console",
15
15
  "Intended Audience :: Developers",
16
- "License :: OSI Approved :: MIT License",
17
16
  "Operating System :: OS Independent",
18
17
  "Programming Language :: Python :: 3",
19
18
  "Programming Language :: Python :: 3.9",
@@ -46,7 +45,7 @@ forgexa = "forgexa_cli.main:main"
46
45
  forgexa-daemon = "forgexa_cli.daemon:main_sync"
47
46
 
48
47
  [build-system]
49
- requires = ["setuptools>=75.0"]
48
+ requires = ["setuptools>=77.0.0"]
50
49
  build-backend = "setuptools.build_meta"
51
50
 
52
51
  [tool.setuptools.packages.find]
File without changes
File without changes