devops-bot-sdk 1.4.79__tar.gz → 1.4.81__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.79 → devops_bot_sdk-1.4.81}/PKG-INFO +1 -1
  2. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
  3. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/pyproject.toml +1 -1
  4. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/__init__.py +2 -2
  5. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/client.py +1 -1
  6. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/ipc/handlers.py +14 -7
  7. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/README.md +0 -0
  8. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/devops_bot_sdk.egg-info/SOURCES.txt +0 -0
  9. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
  10. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
  11. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/devops_bot_sdk.egg-info/requires.txt +0 -0
  12. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/devops_bot_sdk.egg-info/top_level.txt +0 -0
  13. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/collectors/__init__.py +0 -0
  14. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/collectors/files.py +0 -0
  15. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/collectors/process.py +0 -0
  16. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/collectors/screenshot.py +0 -0
  17. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/config.py +0 -0
  18. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/crucial.py +0 -0
  19. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/exceptions.py +0 -0
  20. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/git_ops.py +0 -0
  21. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/graphify.py +0 -0
  22. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/hooks/__init__.py +0 -0
  23. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/hooks/crucial_guard.py +0 -0
  24. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/ipc/__init__.py +0 -0
  25. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/ipc/electron_bridge.py +0 -0
  26. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/local_exec.py +0 -0
  27. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/models/__init__.py +0 -0
  28. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/models/envelope.py +0 -0
  29. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/models/requests.py +0 -0
  30. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/models/responses.py +0 -0
  31. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/models/snapshots.py +0 -0
  32. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/py.typed +0 -0
  33. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/run_auto.py +0 -0
  34. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/sse.py +0 -0
  35. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/test.py +0 -0
  36. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/test_pipeline.py +0 -0
  37. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/sdk/updater.py +0 -0
  38. {devops_bot_sdk-1.4.79 → devops_bot_sdk-1.4.81}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devops-bot-sdk
3
- Version: 1.4.79
3
+ Version: 1.4.81
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.79
3
+ Version: 1.4.81
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.79"
7
+ version = "1.4.81"
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.79
3
+ Version: 1.4.81
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.79"
33
+ __version__ = "1.4.81"
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.79"
61
+ SDK_VERSION = "1.4.81"
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
@@ -578,9 +578,12 @@ def _build_epic_prompt(jira_key: str, summary: str, description: str | None,
578
578
  "}\n\n"
579
579
  "Do NOT produce humanInstructions for the stories — created stories are clean "
580
580
  "user-story artifacts; implementation instructions are added later.\n"
581
- "Create as many stories as the epic genuinely needs (do not pad or truncate "
582
- "artificially); each story must be independently implementable.\n"
583
- "assigneeEmail is OPTIONAL per story: set it ONLY when the epic explicitly "
581
+ + (f"Generate EXACTLY {story_count} user stor{'y' if story_count == 1 else 'ies'} "
582
+ "the epic explicitly asks for this many; do not produce more or fewer.\n"
583
+ if story_count else
584
+ "Create as many stories as the epic genuinely needs (do not pad or truncate "
585
+ "artificially); each story must be independently implementable.\n")
586
+ + "assigneeEmail is OPTIONAL per story: set it ONLY when the epic explicitly "
584
587
  "assigns that specific work to a named person/email (e.g. 'assign the API to "
585
588
  "alice@x.com'); otherwise omit it.\n\n"
586
589
  "=== EPIC FORMAT (epic_description MUST follow this exactly) ===\n"
@@ -876,12 +879,16 @@ async def _handle_epic(
876
879
  ).model_dump())
877
880
 
878
881
  # 1. Generate the decomposition, grounded in the codebase where one exists.
882
+ # If the description/instructions ask for a specific number of stories, honor
883
+ # it exactly; otherwise the model decides (bounded by _MAX_EPIC_STORIES).
884
+ story_count = _extract_story_count(description) or _extract_story_count(human)
885
+ limit = story_count or _MAX_EPIC_STORIES
879
886
  try:
880
887
  await graphify.prepare(project_path)
881
888
  except Exception: # noqa: BLE001
882
889
  pass
883
890
  gen = await _run_generation(
884
- _build_epic_prompt(jira_key, summary, description, human),
891
+ _build_epic_prompt(jira_key, summary, description, human, story_count=story_count),
885
892
  project_path, send=send, thread_id=thread_id,
886
893
  label=f"Epic {jira_key}: generating user stories",
887
894
  github_token=await client.github_token(),
@@ -924,7 +931,7 @@ async def _handle_epic(
924
931
  await send(Envelope(
925
932
  type="step_update", thread_id=thread_id,
926
933
  data={"jira_task_id": tid, "current_step": f"Epic {jira_key}: marked Done — "
927
- f"creating {min(len(stories), _MAX_EPIC_STORIES)} user Story(ies)"},
934
+ f"creating {min(len(stories), limit)} user Story(ies)"},
928
935
  ).model_dump())
929
936
 
930
937
  # 3. Create a To Do child Task per story, inheriting the Epic's fields.
@@ -933,7 +940,7 @@ async def _handle_epic(
933
940
  # inherited assignee — but ONLY on the CHILD task, never on the parent Epic.
934
941
  desc_email = _extract_email(description) or _extract_email(human)
935
942
  created: list[str] = []
936
- for st in stories[:_MAX_EPIC_STORIES]:
943
+ for st in stories[:limit]:
937
944
  if not isinstance(st, dict) or not (st.get("summary") or "").strip():
938
945
  continue
939
946
  # Precedence: a per-story email the model extracted → an email in the
@@ -976,7 +983,7 @@ async def _handle_epic(
976
983
  d = Path(stories_dir).expanduser()
977
984
  d.mkdir(parents=True, exist_ok=True) # create from scratch
978
985
  written = 0
979
- for i, st in enumerate(stories[:_MAX_EPIC_STORIES], 1):
986
+ for i, st in enumerate(stories[:limit], 1):
980
987
  if not isinstance(st, dict) or not (st.get("summary") or "").strip():
981
988
  continue
982
989
  title = str(st.get("summary", "")).strip()