devops-bot-sdk 1.4.70__tar.gz → 1.4.71__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 (38) hide show
  1. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/PKG-INFO +1 -1
  2. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
  3. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/pyproject.toml +1 -1
  4. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/__init__.py +2 -2
  5. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/client.py +1 -1
  6. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/ipc/handlers.py +23 -6
  7. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/README.md +0 -0
  8. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/devops_bot_sdk.egg-info/SOURCES.txt +0 -0
  9. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
  10. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
  11. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/devops_bot_sdk.egg-info/requires.txt +0 -0
  12. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/devops_bot_sdk.egg-info/top_level.txt +0 -0
  13. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/collectors/__init__.py +0 -0
  14. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/collectors/files.py +0 -0
  15. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/collectors/process.py +0 -0
  16. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/collectors/screenshot.py +0 -0
  17. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/config.py +0 -0
  18. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/crucial.py +0 -0
  19. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/exceptions.py +0 -0
  20. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/git_ops.py +0 -0
  21. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/graphify.py +0 -0
  22. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/hooks/__init__.py +0 -0
  23. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/hooks/crucial_guard.py +0 -0
  24. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/ipc/__init__.py +0 -0
  25. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/ipc/electron_bridge.py +0 -0
  26. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/local_exec.py +0 -0
  27. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/models/__init__.py +0 -0
  28. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/models/envelope.py +0 -0
  29. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/models/requests.py +0 -0
  30. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/models/responses.py +0 -0
  31. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/models/snapshots.py +0 -0
  32. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/py.typed +0 -0
  33. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/run_auto.py +0 -0
  34. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/sse.py +0 -0
  35. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/test.py +0 -0
  36. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/test_pipeline.py +0 -0
  37. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/sdk/updater.py +0 -0
  38. {devops_bot_sdk-1.4.70 → devops_bot_sdk-1.4.71}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devops-bot-sdk
3
- Version: 1.4.70
3
+ Version: 1.4.71
4
4
  Summary: DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app
5
5
  Author: noumanaziz2128
6
6
  License-Expression: LicenseRef-Proprietary
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devops-bot-sdk
3
- Version: 1.4.70
3
+ Version: 1.4.71
4
4
  Summary: DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app
5
5
  Author: noumanaziz2128
6
6
  License-Expression: LicenseRef-Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devops-bot-sdk"
7
- version = "1.4.70"
7
+ version = "1.4.71"
8
8
  description = "DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app"
9
9
  readme = "README.md"
10
10
  license = "LicenseRef-Proprietary"
@@ -1,6 +1,6 @@
1
1
  """AgentOS Desktop SDK — thin HTTPS/SSE client for the Electron app.
2
2
 
3
- Version: 1.4.70
3
+ Version: 1.4.71
4
4
 
5
5
  Public surface:
6
6
  BackendClient.from_config() — create client from ~/.agentos/config.toml
@@ -30,7 +30,7 @@ Rules:
30
30
  - All data egress through submit_webhook only
31
31
  """
32
32
 
33
- __version__ = "1.4.70"
33
+ __version__ = "1.4.71"
34
34
  __author__ = "AgentOS"
35
35
 
36
36
  from sdk.client import BackendClient
@@ -58,7 +58,7 @@ def _notify_status(task_id: str, status: str) -> None:
58
58
  pass
59
59
 
60
60
 
61
- SDK_VERSION = "1.4.70"
61
+ SDK_VERSION = "1.4.71"
62
62
  _POLL_INTERVAL = 3.0
63
63
  _POLL_TIMEOUT = 600.0
64
64
  _ORCHESTRATE_TIMEOUT = 2700.0 # 45 min — covers approval wait + VPS execution time
@@ -547,10 +547,11 @@ def _extract_json_block(text: str | None) -> dict | None:
547
547
  return None
548
548
  import json as _json
549
549
  candidates = re.findall(r"```(?:json)?\s*(\{.*?\})\s*```", text, re.S | re.I)
550
- if not candidates:
551
- start, end = text.find("{"), text.rfind("}")
552
- if start != -1 and end > start:
553
- candidates = [text[start:end + 1]]
550
+ # ALWAYS also consider the widest brace span — covers a missing/late closing
551
+ # fence, extra prose around the block, or a fenced capture that fails to parse.
552
+ start, end = text.find("{"), text.rfind("}")
553
+ if start != -1 and end > start:
554
+ candidates.append(text[start:end + 1])
554
555
  for c in reversed(candidates):
555
556
  try:
556
557
  obj = _json.loads(c)
@@ -805,10 +806,26 @@ async def _handle_epic(
805
806
  project_path, allowed_tools=_RECON_ALLOWED_TOOLS, # read-only analysis
806
807
  github_token=await client.github_token(),
807
808
  )
808
- doc = _extract_json_block(gen.get("result")) if gen.get("ok") else None
809
+ # A usage-limit hit must stop and retry later. For ANY other outcome, still try
810
+ # to parse the JSON — the model often produces a valid decomposition even when the
811
+ # run is flagged is_error (e.g. a stray read-only tool denial during exploration),
812
+ # and the result then lands in `error`. Don't discard that work over an is_error flag.
813
+ if gen.get("limit_exceeded"):
814
+ await client.log_activity(f"Epic {jira_key}: usage limit during decomposition — will retry after reset")
815
+ await client.move_to_backlog(tid)
816
+ await send(Envelope(
817
+ type=Envelope.TYPE_ERROR, thread_id=thread_id,
818
+ data={"code": "EPIC_DECOMPOSE_LIMIT", "task_id": tid,
819
+ "message": "Claude usage limit reached during epic decomposition"},
820
+ ).model_dump())
821
+ return
822
+ doc = _extract_json_block(gen.get("result") or gen.get("error") or "")
809
823
  stories = (doc or {}).get("stories") or []
810
824
  if not doc or not stories:
811
- reason = (gen.get("error") or "could not generate a valid decomposition")[:200]
825
+ had_output = bool(gen.get("result") or gen.get("error"))
826
+ reason = ("model output did not contain a parseable decomposition JSON"
827
+ if had_output else
828
+ (gen.get("error") or "no output from the decomposition run"))[:300]
812
829
  await client.log_activity(f"Epic {jira_key}: decomposition failed — {reason}")
813
830
  await client.move_to_backlog(tid)
814
831
  await send(Envelope(