virtuai-cli 0.8.3__tar.gz → 0.8.5__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 (23) hide show
  1. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/PKG-INFO +1 -1
  2. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/pyproject.toml +1 -1
  3. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/__init__.py +1 -1
  4. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/runner.py +53 -0
  5. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli.egg-info/PKG-INFO +1 -1
  6. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/README.md +0 -0
  7. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/setup.cfg +0 -0
  8. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/chat/__init__.py +0 -0
  9. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/chat/ask.py +0 -0
  10. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/chat/command.py +0 -0
  11. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/chat/history.py +0 -0
  12. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/chat/sse.py +0 -0
  13. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/chat/tui.py +0 -0
  14. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/chat/widgets.py +0 -0
  15. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/config.py +0 -0
  16. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/executor.py +0 -0
  17. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/main.py +0 -0
  18. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli/security.py +0 -0
  19. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli.egg-info/SOURCES.txt +0 -0
  20. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli.egg-info/dependency_links.txt +0 -0
  21. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli.egg-info/entry_points.txt +0 -0
  22. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli.egg-info/requires.txt +0 -0
  23. {virtuai_cli-0.8.3 → virtuai_cli-0.8.5}/src/virtuai_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtuai-cli
3
- Version: 0.8.3
3
+ Version: 0.8.5
4
4
  Summary: Run VirtuAI deep agents on your local machine
5
5
  Author-email: uCloudStore <lmoreno@ucloudstore.com>
6
6
  License: Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "virtuai-cli"
7
- version = "0.8.3"
7
+ version = "0.8.5"
8
8
  description = "Run VirtuAI deep agents on your local machine"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,2 +1,2 @@
1
1
  """VirtuAI local CLI."""
2
- __version__ = "0.8.3"
2
+ __version__ = "0.8.5"
@@ -42,9 +42,60 @@ def _audit(workdir: Path, command: str, exit_code: int, elapsed: float) -> None:
42
42
  pass
43
43
 
44
44
  _RECONNECT_DELAYS = [1, 2, 4, 8, 16, 30] # backoff steps
45
+ # Skill file extensions to read from the workdir's skills/ folder.
46
+ _SKILL_EXTENSIONS = {".md", ".txt", ".sh", ".py", ".js", ".ts", ".yaml", ".yml"}
45
47
  _RECV_TIMEOUT = 60.0 # seconds of silence before declaring the connection stale
46
48
 
47
49
 
50
+ def _read_local_memory(workdir: Path) -> str:
51
+ """Concatenate all .md files in {workdir}/memory/ into a single seed string.
52
+
53
+ Returns "" if the folder doesn't exist or is empty so the ready frame is
54
+ unchanged for workdirs without a local memory folder.
55
+ """
56
+ memory_dir = workdir / "memory"
57
+ if not memory_dir.is_dir():
58
+ return ""
59
+ parts: list[str] = []
60
+ for f in sorted(memory_dir.iterdir()):
61
+ if f.is_file() and f.suffix.lower() in {".md", ".txt"}:
62
+ try:
63
+ parts.append(f.read_text(encoding="utf-8", errors="replace"))
64
+ except Exception:
65
+ pass
66
+ return "\n\n".join(parts)
67
+
68
+
69
+ def _read_local_skills(workdir: Path) -> dict[str, str]:
70
+ """Read skill files from {workdir}/skills/ and return {name: content}.
71
+
72
+ Supports two layouts:
73
+ - {workdir}/skills/{name}/SKILL.md (subdirectory layout, mirrors server-side)
74
+ - {workdir}/skills/{name}.md (flat file layout)
75
+
76
+ Only read when the directory exists — returns {} otherwise so the ready
77
+ frame is unchanged for workdirs without a local skills folder.
78
+ """
79
+ skills_dir = workdir / "skills"
80
+ if not skills_dir.is_dir():
81
+ return {}
82
+ skills: dict[str, str] = {}
83
+ for entry in sorted(skills_dir.iterdir()):
84
+ if entry.is_dir():
85
+ skill_md = entry / "SKILL.md"
86
+ if skill_md.is_file():
87
+ try:
88
+ skills[entry.name] = skill_md.read_text(encoding="utf-8", errors="replace")
89
+ except Exception:
90
+ pass
91
+ elif entry.is_file() and entry.suffix.lower() in _SKILL_EXTENSIONS:
92
+ try:
93
+ skills[entry.stem] = entry.read_text(encoding="utf-8", errors="replace")
94
+ except Exception:
95
+ pass
96
+ return skills
97
+
98
+
48
99
  def _default_on_status(level: str, msg: str) -> None:
49
100
  style = {"info": "green", "warn": "yellow", "error": "red"}.get(level, "")
50
101
  console.print(f"[{style}]{msg}[/{style}]" if style else msg)
@@ -71,6 +122,8 @@ async def _handle_frame(
71
122
  "arch": platform.machine(),
72
123
  "python": f"{sys.version_info.major}.{sys.version_info.minor}",
73
124
  "workdir": str(workdir),
125
+ "local_skills": _read_local_skills(workdir),
126
+ "local_memory": _read_local_memory(workdir),
74
127
  }
75
128
  await ws.send(json.dumps(reply))
76
129
  on_status("info", f"Connected. Workdir: {workdir}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtuai-cli
3
- Version: 0.8.3
3
+ Version: 0.8.5
4
4
  Summary: Run VirtuAI deep agents on your local machine
5
5
  Author-email: uCloudStore <lmoreno@ucloudstore.com>
6
6
  License: Proprietary
File without changes
File without changes