kyber-chat 1.0.0__tar.gz → 2026.2.6.2__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.
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/PKG-INFO +1 -1
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/__init__.py +1 -1
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/config/schema.py +1 -1
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/server.py +38 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/app.js +29 -1
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/index.html +4 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/pyproject.toml +1 -1
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/.gitignore +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/LICENSE +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/README.md +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/package.json +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/index.ts +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/server.ts +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/types.d.ts +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/whatsapp.ts +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/tsconfig.json +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/__main__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/context.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/loop.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/memory.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/skills.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/subagent.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/base.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/filesystem.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/message.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/registry.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/shell.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/spawn.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/task_status.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/web.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/bus/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/bus/events.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/bus/queue.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/base.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/discord.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/feishu.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/manager.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/telegram.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/whatsapp.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cli/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cli/commands.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/config/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/config/loader.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cron/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cron/service.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cron/types.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/favicon.png +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/kyber_logo.png +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/styles.css +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/heartbeat/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/heartbeat/service.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/base.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/litellm_provider.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/transcription.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/session/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/session/manager.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/README.md +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/github/SKILL.md +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/skill-creator/SKILL.md +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/summarize/SKILL.md +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/tmux/SKILL.md +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/tmux/scripts/find-sessions.sh +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/tmux/scripts/wait-for-text.sh +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/weather/SKILL.md +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/utils/__init__.py +0 -0
- {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/utils/helpers.py +0 -0
|
@@ -53,7 +53,7 @@ class ChannelsConfig(BaseModel):
|
|
|
53
53
|
class AgentDefaults(BaseModel):
|
|
54
54
|
"""Default agent configuration."""
|
|
55
55
|
workspace: str = "~/.kyber/workspace"
|
|
56
|
-
model: str = "google/gemini-
|
|
56
|
+
model: str = "google/gemini-3-flash-preview"
|
|
57
57
|
provider: str = "openrouter" # Default provider
|
|
58
58
|
max_tokens: int = 8192
|
|
59
59
|
temperature: float = 0.7
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import platform
|
|
5
6
|
import secrets
|
|
7
|
+
import subprocess
|
|
6
8
|
from pathlib import Path
|
|
7
9
|
from typing import Any
|
|
8
10
|
|
|
@@ -21,6 +23,30 @@ MAX_BODY_BYTES = 1 * 1024 * 1024 # 1 MB
|
|
|
21
23
|
LOCAL_HOSTS = {"127.0.0.1", "localhost", "::1"}
|
|
22
24
|
|
|
23
25
|
|
|
26
|
+
def _restart_gateway_service() -> tuple[bool, str]:
|
|
27
|
+
"""Restart the gateway service via the platform's service manager."""
|
|
28
|
+
system = platform.system()
|
|
29
|
+
try:
|
|
30
|
+
if system == "Darwin":
|
|
31
|
+
plist = Path.home() / "Library" / "LaunchAgents" / "chat.kyber.gateway.plist"
|
|
32
|
+
if not plist.exists():
|
|
33
|
+
return False, "Gateway launchd plist not found"
|
|
34
|
+
subprocess.run(["launchctl", "unload", str(plist)], capture_output=True, timeout=10)
|
|
35
|
+
subprocess.run(["launchctl", "load", str(plist)], capture_output=True, timeout=10, check=True)
|
|
36
|
+
elif system == "Linux":
|
|
37
|
+
subprocess.run(
|
|
38
|
+
["systemctl", "--user", "restart", "kyber-gateway.service"],
|
|
39
|
+
capture_output=True, timeout=15, check=True,
|
|
40
|
+
)
|
|
41
|
+
else:
|
|
42
|
+
return False, f"Unsupported platform: {system}"
|
|
43
|
+
except subprocess.CalledProcessError as e:
|
|
44
|
+
return False, f"Service restart failed: {e.stderr.decode().strip() if e.stderr else str(e)}"
|
|
45
|
+
except Exception as e:
|
|
46
|
+
return False, str(e)
|
|
47
|
+
return True, "Gateway service restarted"
|
|
48
|
+
|
|
49
|
+
|
|
24
50
|
class SecurityHeadersMiddleware(BaseHTTPMiddleware):
|
|
25
51
|
async def dispatch(self, request: Request, call_next): # type: ignore[override]
|
|
26
52
|
response = await call_next(request)
|
|
@@ -116,7 +142,19 @@ def create_dashboard_app(config: Config) -> FastAPI:
|
|
|
116
142
|
config.dashboard.auth_token = current.dashboard.auth_token.strip() or secrets.token_urlsafe(32)
|
|
117
143
|
|
|
118
144
|
save_config(config)
|
|
145
|
+
|
|
146
|
+
# Restart gateway so it picks up the new config
|
|
147
|
+
gw_ok, gw_msg = _restart_gateway_service()
|
|
148
|
+
|
|
119
149
|
payload = convert_to_camel(config.model_dump())
|
|
150
|
+
payload["_gatewayRestarted"] = gw_ok
|
|
151
|
+
payload["_gatewayMessage"] = gw_msg
|
|
120
152
|
return JSONResponse(payload)
|
|
121
153
|
|
|
154
|
+
@app.post("/api/restart-gateway", dependencies=[Depends(_require_token)])
|
|
155
|
+
async def restart_gateway() -> JSONResponse:
|
|
156
|
+
ok, msg = _restart_gateway_service()
|
|
157
|
+
status = 200 if ok else 502
|
|
158
|
+
return JSONResponse({"ok": ok, "message": msg}, status_code=status)
|
|
159
|
+
|
|
122
160
|
return app
|
|
@@ -15,6 +15,7 @@ const pageDesc = $('pageDesc');
|
|
|
15
15
|
const contentBody = $('contentBody');
|
|
16
16
|
const saveBtn = $('saveBtn');
|
|
17
17
|
const refreshBtn = $('refreshBtn');
|
|
18
|
+
const restartGwBtn = $('restartGwBtn');
|
|
18
19
|
const toast = $('toast');
|
|
19
20
|
|
|
20
21
|
let config = null;
|
|
@@ -148,8 +149,16 @@ async function saveConfig() {
|
|
|
148
149
|
try {
|
|
149
150
|
const res = await apiFetch(`${API}/config`, { method: 'PUT', body: JSON.stringify(payload) });
|
|
150
151
|
config = await res.json();
|
|
152
|
+
const gwRestarted = config._gatewayRestarted;
|
|
153
|
+
const gwMessage = config._gatewayMessage;
|
|
154
|
+
delete config._gatewayRestarted;
|
|
155
|
+
delete config._gatewayMessage;
|
|
151
156
|
savedAt.textContent = 'Saved ' + new Date().toLocaleTimeString();
|
|
152
|
-
|
|
157
|
+
if (gwRestarted) {
|
|
158
|
+
showToast('Saved — gateway restarted', 'success');
|
|
159
|
+
} else {
|
|
160
|
+
showToast('Saved — gateway restart failed: ' + (gwMessage || 'unknown'), 'error');
|
|
161
|
+
}
|
|
153
162
|
markClean();
|
|
154
163
|
renderSection();
|
|
155
164
|
} catch {
|
|
@@ -439,6 +448,25 @@ document.getElementById('sidebarNav').addEventListener('click', (e) => {
|
|
|
439
448
|
saveBtn.addEventListener('click', saveConfig);
|
|
440
449
|
refreshBtn.addEventListener('click', loadConfig);
|
|
441
450
|
|
|
451
|
+
restartGwBtn.addEventListener('click', async () => {
|
|
452
|
+
restartGwBtn.disabled = true;
|
|
453
|
+
restartGwBtn.textContent = 'Restarting…';
|
|
454
|
+
try {
|
|
455
|
+
const res = await apiFetch(`${API}/restart-gateway`, { method: 'POST' });
|
|
456
|
+
const data = await res.json();
|
|
457
|
+
if (data.ok) {
|
|
458
|
+
showToast('Gateway restarted', 'success');
|
|
459
|
+
} else {
|
|
460
|
+
showToast('Restart failed: ' + data.message, 'error');
|
|
461
|
+
}
|
|
462
|
+
} catch {
|
|
463
|
+
showToast('Restart request failed', 'error');
|
|
464
|
+
} finally {
|
|
465
|
+
restartGwBtn.disabled = false;
|
|
466
|
+
restartGwBtn.innerHTML = '<svg width="14" height="14" viewBox="0 0 16 16" fill="none"><path d="M2 2v5h5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M3.05 10A6 6 0 1 0 4 4.5L2 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg> Restart Gateway';
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
|
|
442
470
|
tokenSubmit.addEventListener('click', async () => {
|
|
443
471
|
const t = tokenInput.value.trim();
|
|
444
472
|
if (!t) return;
|
|
@@ -91,6 +91,10 @@
|
|
|
91
91
|
<svg width="14" height="14" viewBox="0 0 16 16" fill="none"><path d="M1 8a7 7 0 0113.1-3.5M15 8A7 7 0 011.9 11.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M14 1v4h-4M2 15v-4h4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
92
92
|
Refresh
|
|
93
93
|
</button>
|
|
94
|
+
<button id="restartGwBtn" class="btn btn-ghost" title="Restart the gateway service">
|
|
95
|
+
<svg width="14" height="14" viewBox="0 0 16 16" fill="none"><path d="M2 2v5h5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M3.05 10A6 6 0 1 0 4 4.5L2 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
96
|
+
Restart Gateway
|
|
97
|
+
</button>
|
|
94
98
|
<button id="saveBtn" class="btn btn-primary">Save Changes</button>
|
|
95
99
|
</div>
|
|
96
100
|
</header>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|