devops-bot-sdk 1.4.76__tar.gz → 1.4.79__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.76 → devops_bot_sdk-1.4.79}/PKG-INFO +1 -1
  2. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
  3. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/pyproject.toml +1 -1
  4. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/__init__.py +2 -2
  5. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/client.py +1 -1
  6. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/ipc/handlers.py +44 -4
  7. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/README.md +0 -0
  8. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/SOURCES.txt +0 -0
  9. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
  10. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
  11. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/requires.txt +0 -0
  12. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/top_level.txt +0 -0
  13. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/__init__.py +0 -0
  14. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/files.py +0 -0
  15. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/process.py +0 -0
  16. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/screenshot.py +0 -0
  17. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/config.py +0 -0
  18. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/crucial.py +0 -0
  19. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/exceptions.py +0 -0
  20. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/git_ops.py +0 -0
  21. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/graphify.py +0 -0
  22. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/hooks/__init__.py +0 -0
  23. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/hooks/crucial_guard.py +0 -0
  24. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/ipc/__init__.py +0 -0
  25. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/ipc/electron_bridge.py +0 -0
  26. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/local_exec.py +0 -0
  27. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/__init__.py +0 -0
  28. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/envelope.py +0 -0
  29. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/requests.py +0 -0
  30. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/responses.py +0 -0
  31. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/snapshots.py +0 -0
  32. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/py.typed +0 -0
  33. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/run_auto.py +0 -0
  34. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/sse.py +0 -0
  35. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/test.py +0 -0
  36. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/test_pipeline.py +0 -0
  37. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/updater.py +0 -0
  38. {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devops-bot-sdk
3
- Version: 1.4.76
3
+ Version: 1.4.79
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.76
3
+ Version: 1.4.79
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.76"
7
+ version = "1.4.79"
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.76
3
+ Version: 1.4.79
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.76"
33
+ __version__ = "1.4.79"
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.76"
61
+ SDK_VERSION = "1.4.79"
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
@@ -531,7 +531,7 @@ _PRD_FORMAT = (
531
531
 
532
532
 
533
533
  def _build_epic_prompt(jira_key: str, summary: str, description: str | None,
534
- human_instructions: str | None) -> str:
534
+ human_instructions: str | None, story_count: int | None = None) -> str:
535
535
  """Read-only prompt that turns an Epic into a decomposition JSON."""
536
536
  parts: list[str] = [
537
537
  "You are decomposing a JIRA EPIC into implementable user stories. This is "
@@ -650,6 +650,37 @@ _STORIES_DIR_HINT = re.compile(
650
650
  )
651
651
 
652
652
 
653
+ # An explicit "build N user stories" count in the description/instructions.
654
+ _STORY_COUNT_WORDS = {
655
+ "one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6,
656
+ "seven": 7, "eight": 8, "nine": 9, "ten": 10, "eleven": 11, "twelve": 12,
657
+ }
658
+ _STORY_COUNT_RE = re.compile(
659
+ r"\b(\d{1,2})\s+(?:user\s+)?stor(?:y|ies)\b"
660
+ r"|\b(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)"
661
+ r"\s+(?:user\s+)?stor(?:y|ies)\b",
662
+ re.I,
663
+ )
664
+
665
+
666
+ def _extract_story_count(text: str | None) -> int | None:
667
+ """A requested number of user stories from the text (e.g. "build 3 user stories",
668
+ "create five stories"), or None. Bounded to a sane max."""
669
+ if not text:
670
+ return None
671
+ m = _STORY_COUNT_RE.search(text)
672
+ if not m:
673
+ return None
674
+ if m.group(1):
675
+ try:
676
+ n = int(m.group(1))
677
+ except ValueError:
678
+ return None
679
+ else:
680
+ n = _STORY_COUNT_WORDS.get((m.group(2) or "").lower(), 0)
681
+ return min(n, 50) if n and n >= 1 else None
682
+
683
+
653
684
  def _extract_stories_dir(text: str | None) -> str | None:
654
685
  """A directory the instructions ask the user stories to be WRITTEN into, or None.
655
686
 
@@ -2490,15 +2521,19 @@ _PATH_ROOTS = (
2490
2521
  # end-of-line. The root is anchored to a known top-level dir to limit false
2491
2522
  # positives in prose; for an inline path followed by other words on the SAME
2492
2523
  # line, quote it (see _QUOTED_PATH_RE) to avoid grabbing the trailing text.
2493
- _ABS_PATH_RE = re.compile(rf"(?<![\w.])/(?:{_PATH_ROOTS})(?:/[A-Za-z0-9._\- ]+)+")
2524
+ _ABS_PATH_RE = re.compile(rf"(?<![\w.:])/(?:{_PATH_ROOTS})(?:/[A-Za-z0-9._\- ]+)+")
2494
2525
  _HOME_PATH_RE = re.compile(r"(?<![\w.])~(?:/[A-Za-z0-9._\- ]+)+")
2495
2526
  # Windows path. Folder names may contain SPACES (e.g. "BA activities clone"), so a
2496
2527
  # segment is any run of valid path chars (everything except \ / : * ? " < > | and
2497
2528
  # newline) up to the next separator — it must NOT stop at the first space.
2498
2529
  _WIN_PATH_RE = re.compile(r"[A-Za-z]:\\(?:[^\\/:*?\"<>|\r\n]+\\?)+")
2530
+ # Windows path written with FORWARD slashes (e.g. C:/Users/me/new_tasks) — common on
2531
+ # Windows. Unquoted form disallows spaces (quote it if a folder has spaces) so it
2532
+ # stops cleanly at the end of the path instead of swallowing trailing prose.
2533
+ _WIN_FS_PATH_RE = re.compile(r"[A-Za-z]:/(?:[A-Za-z0-9._\-]+/?)+")
2499
2534
  # A QUOTED path (single/double/back quotes) — the reliable way to give a path that
2500
- # contains spaces, on any OS. Captures the full content between the quotes.
2501
- _QUOTED_PATH_RE = re.compile(r"""["'`]\s*((?:[A-Za-z]:\\|~/|/)[^"'`\r\n]+?)\s*["'`]""")
2535
+ # contains spaces, on any OS. Accepts a drive letter with EITHER separator (C:\ or C:/).
2536
+ _QUOTED_PATH_RE = re.compile(r"""["'`]\s*((?:[A-Za-z]:[\\/]|~/|/)[^"'`\r\n]+?)\s*["'`]""")
2502
2537
  _FILE_SEG_RE = re.compile(r"\.[A-Za-z0-9]{1,6}$")
2503
2538
 
2504
2539
 
@@ -2550,6 +2585,9 @@ def _extract_path_from_text(text: str | None) -> str | None:
2550
2585
  p = _clean_path(m.group(0))
2551
2586
  return _dir_of(str(Path.home() / p[2:])) or None
2552
2587
  m = _WIN_PATH_RE.search(text)
2588
+ if m:
2589
+ return _dir_of(_clean_path(m.group(0))) or None
2590
+ m = _WIN_FS_PATH_RE.search(text)
2553
2591
  if m:
2554
2592
  return _dir_of(_clean_path(m.group(0))) or None
2555
2593
  return None
@@ -2579,6 +2617,8 @@ def _extract_all_paths(text: str | None) -> list[str]:
2579
2617
  found.append((m.start(), _dir_of(str(Path.home() / p[2:]))))
2580
2618
  for m in _WIN_PATH_RE.finditer(text):
2581
2619
  found.append((m.start(), _dir_of(_clean_path(m.group(0)))))
2620
+ for m in _WIN_FS_PATH_RE.finditer(text):
2621
+ found.append((m.start(), _dir_of(_clean_path(m.group(0)))))
2582
2622
  found.sort(key=lambda x: x[0])
2583
2623
  out: list[str] = []
2584
2624
  for _, p in found: