@innvisor/conny-ai 9.8.2 → 9.8.4
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.
- package/CHANGELOG.md +12 -0
- package/conny_app.py +5 -3
- package/conny_cli.py +3 -0
- package/conny_studio.py +53 -11
- package/npm/conny.js +2 -2
- package/package.json +1 -1
- package/src/conny/channels/cli.py +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 9.8.4 - 2026-06-02
|
|
4
|
+
|
|
5
|
+
- made bare `conny` route to the modern onboarding/chat surface instead of the legacy help screen
|
|
6
|
+
- kept `conny init` untouched while preserving the same banner and branding in the post-onboarding chat UI
|
|
7
|
+
- aligned the legacy Python CLI fallback so direct `conny_cli.py` launches follow the same start behavior
|
|
8
|
+
|
|
9
|
+
## 9.8.3 - 2026-06-02
|
|
10
|
+
|
|
11
|
+
- made `conny` open the real chat interface after onboarding instead of the setup flow
|
|
12
|
+
- kept `conny init` unchanged and preserved its banner/design exactly
|
|
13
|
+
- added slash-command chat shortcuts with a Codex-style launcher header
|
|
14
|
+
|
|
3
15
|
## 9.8.2 - 2026-06-02
|
|
4
16
|
|
|
5
17
|
- persisted the language selected in `conny init` so the rest of the CLI loads it automatically
|
package/conny_app.py
CHANGED
|
@@ -282,10 +282,12 @@ def _sh(*a):
|
|
|
282
282
|
|
|
283
283
|
def main():
|
|
284
284
|
signal.signal(signal.SIGINT, lambda *_: sys.exit(0))
|
|
285
|
-
if first_run() and not (len(sys.argv)>1 and sys.argv[1] in ("help","--help","-h","-v","--version")):
|
|
286
|
-
onboard()
|
|
287
285
|
if len(sys.argv) <= 1:
|
|
288
|
-
|
|
286
|
+
if first_run():
|
|
287
|
+
onboard()
|
|
288
|
+
return
|
|
289
|
+
cmd_chat()
|
|
290
|
+
return
|
|
289
291
|
else:
|
|
290
292
|
route(sys.argv[1], " ".join(sys.argv[2:]))
|
|
291
293
|
|
package/conny_cli.py
CHANGED
|
@@ -11845,6 +11845,9 @@ def main():
|
|
|
11845
11845
|
if not workspace_is_configured() or not get_instances():
|
|
11846
11846
|
cmd_init(args)
|
|
11847
11847
|
return
|
|
11848
|
+
modern_entrypoint = Path(os.environ.get("CONNY_DIR", os.path.dirname(os.path.abspath(__file__)))) / "conny_app.py"
|
|
11849
|
+
subprocess.call([sys.executable, str(modern_entrypoint)])
|
|
11850
|
+
return
|
|
11848
11851
|
|
|
11849
11852
|
# Help
|
|
11850
11853
|
if args.help or cmd in ("help", "--help", "-h", ""):
|
package/conny_studio.py
CHANGED
|
@@ -1,20 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""conny_studio.py — Interactive CLI
|
|
2
|
+
"""conny_studio.py — Interactive CLI chat with live monitoring."""
|
|
3
3
|
import asyncio
|
|
4
4
|
import json
|
|
5
5
|
import os
|
|
6
6
|
import sys
|
|
7
7
|
import time
|
|
8
8
|
import uuid
|
|
9
|
+
import subprocess
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
from datetime import datetime
|
|
11
12
|
|
|
12
13
|
import httpx
|
|
14
|
+
from rich.console import Console
|
|
13
15
|
|
|
14
16
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
17
|
+
from conny_design import LOGO_FULL, SEP, ICON_BRAND
|
|
15
18
|
from conny_uncertainty import UncertaintyDetector
|
|
16
19
|
from conny_voice import ConnyVoice
|
|
17
20
|
|
|
21
|
+
CONSOLE = Console()
|
|
22
|
+
VERSION = "9.8.2"
|
|
23
|
+
try:
|
|
24
|
+
package_path = Path(__file__).resolve().parent / "package.json"
|
|
25
|
+
if package_path.exists():
|
|
26
|
+
VERSION = json.loads(package_path.read_text(encoding="utf-8")).get("version", VERSION)
|
|
27
|
+
except Exception:
|
|
28
|
+
pass
|
|
29
|
+
|
|
18
30
|
STUDIO_DIR = Path.home() / ".conny" / "studio" / "memory"
|
|
19
31
|
API_URL = "http://localhost:8001/test"
|
|
20
32
|
|
|
@@ -69,11 +81,16 @@ class ConnyStudio:
|
|
|
69
81
|
}, ensure_ascii=False) + "\n")
|
|
70
82
|
|
|
71
83
|
async def handle_command(self, cmd: str) -> str:
|
|
84
|
+
if cmd in ("/help", "/menu", "/start"):
|
|
85
|
+
return (
|
|
86
|
+
"Comandos: /help /menu /clear /history /models /config /language "
|
|
87
|
+
"/export /reload-persona /fix-last"
|
|
88
|
+
)
|
|
72
89
|
if cmd == "/clear":
|
|
73
90
|
self.history = []
|
|
74
91
|
self.chat_id = f"studio_{uuid.uuid4().hex[:8]}"
|
|
75
92
|
return "Session cleared. New conversation started."
|
|
76
|
-
elif cmd
|
|
93
|
+
elif cmd in ("/history", "/show-memory"):
|
|
77
94
|
if not self.history:
|
|
78
95
|
return "No turns in memory yet."
|
|
79
96
|
lines = []
|
|
@@ -81,6 +98,14 @@ class ConnyStudio:
|
|
|
81
98
|
role = "YOU" if h["role"] == "user" else "MEL"
|
|
82
99
|
lines.append(f" [{role}] {h['content'][:80]}")
|
|
83
100
|
return "\n".join(lines)
|
|
101
|
+
elif cmd == "/models":
|
|
102
|
+
return self._run_cli_command("modelo")
|
|
103
|
+
elif cmd == "/config":
|
|
104
|
+
return self._run_cli_command("config")
|
|
105
|
+
elif cmd == "/language":
|
|
106
|
+
return self._run_cli_command("language")
|
|
107
|
+
elif cmd in ("/new", "/init"):
|
|
108
|
+
return self._run_cli_command("init")
|
|
84
109
|
elif cmd == "/show-failures":
|
|
85
110
|
if not self.failures_file.exists():
|
|
86
111
|
return "No failures detected this session."
|
|
@@ -101,13 +126,28 @@ class ConnyStudio:
|
|
|
101
126
|
return "No previous turn to fix."
|
|
102
127
|
return f"Unknown command: {cmd}"
|
|
103
128
|
|
|
129
|
+
def _run_cli_command(self, command: str) -> str:
|
|
130
|
+
cli = Path(__file__).resolve().parent / "conny_cli.py"
|
|
131
|
+
if not cli.exists():
|
|
132
|
+
return f"CLI no disponible para /{command}"
|
|
133
|
+
try:
|
|
134
|
+
print(f"\033[90m[system] launching: conny {command}\033[0m")
|
|
135
|
+
subprocess.run([sys.executable, str(cli), command], check=False)
|
|
136
|
+
return f"/{command} closed. Back in chat."
|
|
137
|
+
except Exception as exc:
|
|
138
|
+
return f"No pude abrir /{command}: {exc}"
|
|
139
|
+
|
|
104
140
|
def print_header(self):
|
|
105
|
-
print(
|
|
106
|
-
print(
|
|
107
|
-
print(f"
|
|
108
|
-
print(
|
|
109
|
-
print("
|
|
110
|
-
print("
|
|
141
|
+
print()
|
|
142
|
+
CONSOLE.print(LOGO_FULL)
|
|
143
|
+
CONSOLE.print(f" {ICON_BRAND} v{VERSION} · chat real")
|
|
144
|
+
CONSOLE.print(SEP)
|
|
145
|
+
print(f" Instance: {self.instance_id}")
|
|
146
|
+
print(f" Session: {self.session_id}")
|
|
147
|
+
print(" Comandos: /help /menu /clear /history /models /config /language /export")
|
|
148
|
+
print(" Atajos: 1=models 2=config 3=language 4=help")
|
|
149
|
+
CONSOLE.print(SEP)
|
|
150
|
+
print()
|
|
111
151
|
|
|
112
152
|
def print_scores(self, scores):
|
|
113
153
|
conf = scores["confidence"]
|
|
@@ -122,14 +162,16 @@ class ConnyStudio:
|
|
|
122
162
|
self.print_header()
|
|
123
163
|
while True:
|
|
124
164
|
try:
|
|
125
|
-
user_input = input("\033[1;32m[YOU]\033[0m ")
|
|
165
|
+
user_input = input("\033[1;32m[YOU]\033[0m ").strip()
|
|
126
166
|
except (EOFError, KeyboardInterrupt):
|
|
127
167
|
print("\n\033[90mSession ended.\033[0m")
|
|
128
168
|
break
|
|
129
|
-
if not user_input
|
|
169
|
+
if not user_input:
|
|
130
170
|
continue
|
|
171
|
+
if user_input in ("1", "2", "3", "4"):
|
|
172
|
+
user_input = { "1": "/models", "2": "/config", "3": "/language", "4": "/help" }[user_input]
|
|
131
173
|
if user_input.startswith("/"):
|
|
132
|
-
result = await self.handle_command(user_input
|
|
174
|
+
result = await self.handle_command(user_input)
|
|
133
175
|
print(f"\033[1;33m[SYSTEM]\033[0m {result}")
|
|
134
176
|
continue
|
|
135
177
|
try:
|
package/npm/conny.js
CHANGED
|
@@ -485,7 +485,7 @@ function execConny(argv) {
|
|
|
485
485
|
}
|
|
486
486
|
|
|
487
487
|
const args = process.argv.slice(2);
|
|
488
|
-
const isHelp = args.
|
|
488
|
+
const isHelp = args.includes("-h") || args.includes("--help") || args.includes("help");
|
|
489
489
|
const isVersion = args.includes("-v") || args.includes("--version") || args.includes("version");
|
|
490
490
|
const isBootstrapCheck = args.includes("--bootstrap-check");
|
|
491
491
|
const isJson = args.includes("--json");
|
|
@@ -518,7 +518,7 @@ if (isHelp) {
|
|
|
518
518
|
process.exit(0);
|
|
519
519
|
}
|
|
520
520
|
|
|
521
|
-
const launchArgs = args
|
|
521
|
+
const launchArgs = args;
|
|
522
522
|
|
|
523
523
|
if (!execConny(launchArgs)) {
|
|
524
524
|
fail(`No pude iniciar Conny desde ${connyHome}`);
|
package/package.json
CHANGED
|
@@ -11785,6 +11785,9 @@ def main():
|
|
|
11785
11785
|
if not workspace_is_configured() or not get_instances():
|
|
11786
11786
|
cmd_init(args)
|
|
11787
11787
|
return
|
|
11788
|
+
modern_entrypoint = Path(os.environ.get("CONNY_DIR", os.path.dirname(os.path.abspath(__file__)))) / "conny_app.py"
|
|
11789
|
+
subprocess.call([sys.executable, str(modern_entrypoint)])
|
|
11790
|
+
return
|
|
11788
11791
|
|
|
11789
11792
|
# Help
|
|
11790
11793
|
if args.help or cmd in ("help", "--help", "-h", ""):
|