devops-bot-sdk 1.4.45__tar.gz → 1.4.46__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.45 → devops_bot_sdk-1.4.46}/PKG-INFO +1 -1
  2. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
  3. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/pyproject.toml +1 -1
  4. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/__init__.py +2 -2
  5. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/client.py +1 -1
  6. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/ipc/handlers.py +21 -28
  7. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/README.md +0 -0
  8. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/devops_bot_sdk.egg-info/SOURCES.txt +0 -0
  9. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
  10. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
  11. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/devops_bot_sdk.egg-info/requires.txt +0 -0
  12. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/devops_bot_sdk.egg-info/top_level.txt +0 -0
  13. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/collectors/__init__.py +0 -0
  14. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/collectors/files.py +0 -0
  15. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/collectors/process.py +0 -0
  16. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/collectors/screenshot.py +0 -0
  17. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/config.py +0 -0
  18. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/crucial.py +0 -0
  19. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/exceptions.py +0 -0
  20. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/git_ops.py +0 -0
  21. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/graphify.py +0 -0
  22. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/hooks/__init__.py +0 -0
  23. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/hooks/crucial_guard.py +0 -0
  24. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/ipc/__init__.py +0 -0
  25. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/ipc/electron_bridge.py +0 -0
  26. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/local_exec.py +0 -0
  27. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/models/__init__.py +0 -0
  28. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/models/envelope.py +0 -0
  29. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/models/requests.py +0 -0
  30. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/models/responses.py +0 -0
  31. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/models/snapshots.py +0 -0
  32. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/py.typed +0 -0
  33. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/run_auto.py +0 -0
  34. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/sse.py +0 -0
  35. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/test.py +0 -0
  36. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/test_pipeline.py +0 -0
  37. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/sdk/updater.py +0 -0
  38. {devops_bot_sdk-1.4.45 → devops_bot_sdk-1.4.46}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devops-bot-sdk
3
- Version: 1.4.45
3
+ Version: 1.4.46
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.45
3
+ Version: 1.4.46
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.45"
7
+ version = "1.4.46"
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.45
3
+ Version: 1.4.46
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.45"
33
+ __version__ = "1.4.46"
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.45"
61
+ SDK_VERSION = "1.4.46"
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
@@ -653,18 +653,24 @@ async def _handle_story(
653
653
  github_token=await client.github_token(),
654
654
  )
655
655
  prd = (gen.get("result") or "").strip() if gen.get("ok") else ""
656
- if not prd:
656
+ if prd:
657
+ # PRD lives alongside the user story in the (now Task) description.
658
+ new_description = f"{user_story}\n\n---\n\n{_PRD_MARKER}\n\n{prd}"[:20000]
659
+ else:
660
+ # PRD generation failed — do NOT abandon the story: it must still become
661
+ # a Task (per "a Story once run should be changed into Task"). The PRD
662
+ # directive stays in humanInstructions, so the later coding run can still
663
+ # produce the PRD.md file.
657
664
  reason = (gen.get("error") or "PRD generation produced no content")[:200]
658
- # Leave the Story To Do (never mark it In Progress/Done/Backlog) so a
659
- # retry or the developer can pick it up.
660
- await client.log_activity(f"Story {jira_key}: PRD generation failed — {reason}")
665
+ await client.log_activity(
666
+ f"Story {jira_key}: PRD not pre-generated ({reason}) converting to Task anyway"
667
+ )
661
668
  await send(Envelope(
662
- type=Envelope.TYPE_ERROR, thread_id=thread_id,
663
- data={"code": "STORY_PRD_FAILED", "task_id": tid, "message": reason},
669
+ type="step_update", thread_id=thread_id,
670
+ data={"jira_task_id": tid,
671
+ "current_step": f"Story {jira_key}: PRD generation skipped ({reason[:60]}) "
672
+ "— converting to Task"},
664
673
  ).model_dump())
665
- return
666
- # PRD lives alongside the user story in the (now Task) description.
667
- new_description = f"{user_story}\n\n---\n\n{_PRD_MARKER}\n\n{prd}"[:20000]
668
674
 
669
675
  # Convert Story → Task on the SAME ticket; leave it To Do so the next run codes
670
676
  # it. humanInstructions are untouched (they still carry the location + any PRD
@@ -682,14 +688,15 @@ async def _handle_story(
682
688
  ).model_dump())
683
689
  return
684
690
 
691
+ prd_in_desc = bool(new_description) or already_has_prd
685
692
  await client.log_activity(
686
- f"Story {jira_key}: converted to Task{' with PRD' if wants_prd else ''} (To Do)"
693
+ f"Story {jira_key}: converted to Task{' with PRD' if prd_in_desc else ''} (To Do)"
687
694
  )
688
695
  await send(Envelope(
689
696
  type="step_update", thread_id=thread_id,
690
697
  data={"jira_task_id": tid,
691
698
  "current_step": f"Story {jira_key} → Task (To Do)"
692
- + (" + PRD in description" if wants_prd else "")
699
+ + (" + PRD in description" if prd_in_desc else "")
693
700
  + " — run again to implement"},
694
701
  ).model_dump())
695
702
 
@@ -2527,21 +2534,6 @@ async def handle_orchestrate_auto_local_run(
2527
2534
  project_path = _resolve_local_project_path(task, payload)
2528
2535
  ttype = str(task.get("type") or "").strip().lower()
2529
2536
 
2530
- # User STORIES are for the ASSIGNED DEVELOPERS, not the bot: the default
2531
- # auto-loop skips Story-type tickets and never marks them In Progress or
2532
- # Done. (An explicit target — `agentos-auto ticket <KEY>`, i.e. only_keys
2533
- # set — still lets the bot act on a Story: generate its PRD and convert
2534
- # it to a Task.) Once a ticket is a TASK it is coded normally
2535
- # (In Progress → Done), even when it descended from an Epic/Story.
2536
- if ttype == "story" and not only_keys:
2537
- await send(Envelope(
2538
- type="step_update", thread_id=thread_id,
2539
- data={"jira_task_id": tid,
2540
- "current_step": f"({idx}/{total}) {jira_key}: skipped — user Story "
2541
- f"left for the assigned developer"},
2542
- ).model_dump())
2543
- continue
2544
-
2545
2537
  await send(Envelope(
2546
2538
  type="step_update", thread_id=thread_id,
2547
2539
  data={"current_step": f"({idx}/{total}) {jira_key}: {task.get('summary', '')}".rstrip(": "),
@@ -2550,8 +2542,9 @@ async def handle_orchestrate_auto_local_run(
2550
2542
 
2551
2543
  # Staged decomposition — an EPIC and a STORY are transformed, not coded:
2552
2544
  # Epic → decompose into user Stories (To Do), mark Epic Done
2553
- # Story → (optional PRD) + convert to Task (To Do) [only when targeted]
2554
- # Task → implemented by the normal pipeline below
2545
+ # Story → (optional PRD) + ALWAYS convert to Task (To Do); a Story is
2546
+ # never marked In Progress/Done only ever converted
2547
+ # Task → implemented by the normal pipeline below (In Progress → Done)
2555
2548
  # Each is isolated: a failure must not abort the remaining queue.
2556
2549
  if ttype in ("epic", "story"):
2557
2550
  handler = _handle_epic if ttype == "epic" else _handle_story