kyber-chat 1.0.0__py3-none-any.whl → 2026.2.6.2__py3-none-any.whl

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/__init__.py CHANGED
@@ -2,5 +2,5 @@
2
2
  kyber - A lightweight AI agent framework
3
3
  """
4
4
 
5
- __version__ = "1.0.0"
5
+ __version__ = "2026.2.6.2"
6
6
  __logo__ = "💎"
kyber/config/schema.py CHANGED
@@ -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-2.5-flash-preview"
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
kyber/dashboard/server.py CHANGED
@@ -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
- showToast('Configuration saved', 'success');
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>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kyber-chat
3
- Version: 1.0.0
3
+ Version: 2026.2.6.2
4
4
  Summary: A lightweight personal AI assistant framework
5
5
  Author: kyber contributors
6
6
  License: MIT
@@ -1,4 +1,4 @@
1
- kyber/__init__.py,sha256=VpQFQmxz16xRrHAr4L0QZKk-HRKuaBOeVyaagwysV4Y,90
1
+ kyber/__init__.py,sha256=XO_t5vGfPByKaWDUKZtrcNXGZvlg43UHc71iTzHymKY,95
2
2
  kyber/__main__.py,sha256=GnuXALV8N2rrM8ljzwkitfT_JNdGS6duBIbBOAVhwQo,141
3
3
  kyber/agent/__init__.py,sha256=2XQIfkYC6flAWz5ymKgJ6Mep0LB0Hvp6unNSr4UyrT8,273
4
4
  kyber/agent/context.py,sha256=PwFMg1KL0-_X-jKkpx7w9EI1VlYyFamYzRbzhFgRS48,7848
@@ -29,15 +29,15 @@ kyber/cli/__init__.py,sha256=rKbjv4nJc1XUP2GSGtDi5YgeP5b1UsvJhJkpQsCWwVs,28
29
29
  kyber/cli/commands.py,sha256=gd8dwhUObINivFaKuG02D5pP5C0w0rSQGBsldP8_uMU,24265
30
30
  kyber/config/__init__.py,sha256=zvSCVmT6XgLhuoDfAGNxAh58eTz8qrwUYNx9lFtUDPs,195
31
31
  kyber/config/loader.py,sha256=-hDE7a6kvOCkdUpkPjMGWCNyN_7-OZ6_CnPmaOuLQzg,2710
32
- kyber/config/schema.py,sha256=h7D6e_ZS1wXfzJRrSlSZJaMVZxvN28iPgOjsJWKswD8,7878
32
+ kyber/config/schema.py,sha256=MQgtZJSFtRvQEwFHuuJiDiQkFSJvAz5WElxRyEUHchM,7876
33
33
  kyber/cron/__init__.py,sha256=evX6oofNybqJ86_-62IsUIwyrSB0hGdU37VguRFbHoI,195
34
34
  kyber/cron/service.py,sha256=cSEyfw1I4LSACevow72_44K6_UtLLJiRP7qtesRQJdc,12029
35
35
  kyber/cron/types.py,sha256=Vx4qLOCu1vE90hqICsACwN3GlWj_GVOYCaV7bCpjCvc,1586
36
36
  kyber/dashboard/__init__.py,sha256=c24XI1WyuOG-phxk9hvC8j5mICZdMVyjnB9NNKHuqNI,128
37
- kyber/dashboard/server.py,sha256=FONDaIz5uExLHp9lDbzor522wD_qijQg46DHgDaHYMk,4691
38
- kyber/dashboard/static/app.js,sha256=G_QGFXO8FxWP8NEymoBkWJkG4GT-nCPYfSW7-iXWxfY,13844
37
+ kyber/dashboard/server.py,sha256=H3Ub8rxHKyUqpA9nUjZpwHlYPYsNKf6zv-bkSfKyRKY,6335
38
+ kyber/dashboard/static/app.js,sha256=R5sUP86p8fAF8nHmSMz9eBepDXdu5tPfSJgHxpm0chs,15066
39
39
  kyber/dashboard/static/favicon.png,sha256=7OddkzMJN5B51-FYW2a_87WD6tFGjpdK9pAz2K8r98o,302086
40
- kyber/dashboard/static/index.html,sha256=rkwdSesIXt7qH_P4266_kSwuc_mVkMR9Mtu1tNFDzNI,5718
40
+ kyber/dashboard/static/index.html,sha256=-I96HsY--iU3Hs2LqOGiG4I36HeldgEtFm6wnXfTcXQ,6184
41
41
  kyber/dashboard/static/kyber_logo.png,sha256=roE9L_V1Fxr3Ku4_vO5Cd3zH17FW121dyzuYNSktavY,279574
42
42
  kyber/dashboard/static/styles.css,sha256=p5JWu5rIpfV5hLbqyuYK6S2jiLncxTOBKAT270KBJmM,11485
43
43
  kyber/heartbeat/__init__.py,sha256=6iDEjnhDiifpKU4FNKrJS_GUYsw8GqFCOQUqh5spzOU,139
@@ -64,8 +64,8 @@ kyber/bridge/src/index.ts,sha256=0TyPqG2_pKINYeV5sANBXq5Su7CvqraO8N_kYbH7_ek,124
64
64
  kyber/bridge/src/server.ts,sha256=9PxZg5LN_4WE1Nob9FuC6q-BwBAZPA9iosXp0epZyAc,2763
65
65
  kyber/bridge/src/types.d.ts,sha256=q1myb2dTPBoosZ9T5WVoteyRTSzkx0jaHghpxQpn078,116
66
66
  kyber/bridge/src/whatsapp.ts,sha256=meJfzBMCbNz8DbhhQklcgdMZgB8POM0BcC1rvpurxQc,5030
67
- kyber_chat-1.0.0.dist-info/METADATA,sha256=wp-wWiLKel-BOWf_OOPhHAGaN4JRdhpHvvwW7NjFJPc,1192
68
- kyber_chat-1.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
69
- kyber_chat-1.0.0.dist-info/entry_points.txt,sha256=PL1YUXp_jpeB1T9RKvVJ3mINrLLkFe69BsaxJKB7vd4,49
70
- kyber_chat-1.0.0.dist-info/licenses/LICENSE,sha256=L8f1oGLQ3ccz7gqTpD0HRF5g5ojNfROfdSkQM2k3rqs,1074
71
- kyber_chat-1.0.0.dist-info/RECORD,,
67
+ kyber_chat-2026.2.6.2.dist-info/METADATA,sha256=ZQ1VWpoGXRSiauWuddT5mVgQhi8KPkrixlOjPF3hv0g,1197
68
+ kyber_chat-2026.2.6.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
69
+ kyber_chat-2026.2.6.2.dist-info/entry_points.txt,sha256=PL1YUXp_jpeB1T9RKvVJ3mINrLLkFe69BsaxJKB7vd4,49
70
+ kyber_chat-2026.2.6.2.dist-info/licenses/LICENSE,sha256=L8f1oGLQ3ccz7gqTpD0HRF5g5ojNfROfdSkQM2k3rqs,1074
71
+ kyber_chat-2026.2.6.2.dist-info/RECORD,,