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.
Files changed (71) hide show
  1. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/PKG-INFO +1 -1
  2. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/__init__.py +1 -1
  3. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/config/schema.py +1 -1
  4. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/server.py +38 -0
  5. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/app.js +29 -1
  6. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/index.html +4 -0
  7. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/pyproject.toml +1 -1
  8. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/.gitignore +0 -0
  9. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/LICENSE +0 -0
  10. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/README.md +0 -0
  11. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/package.json +0 -0
  12. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/index.ts +0 -0
  13. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/server.ts +0 -0
  14. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/types.d.ts +0 -0
  15. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/src/whatsapp.ts +0 -0
  16. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/bridge/tsconfig.json +0 -0
  17. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/__main__.py +0 -0
  18. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/__init__.py +0 -0
  19. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/context.py +0 -0
  20. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/loop.py +0 -0
  21. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/memory.py +0 -0
  22. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/skills.py +0 -0
  23. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/subagent.py +0 -0
  24. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/__init__.py +0 -0
  25. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/base.py +0 -0
  26. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/filesystem.py +0 -0
  27. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/message.py +0 -0
  28. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/registry.py +0 -0
  29. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/shell.py +0 -0
  30. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/spawn.py +0 -0
  31. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/task_status.py +0 -0
  32. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/agent/tools/web.py +0 -0
  33. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/bus/__init__.py +0 -0
  34. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/bus/events.py +0 -0
  35. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/bus/queue.py +0 -0
  36. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/__init__.py +0 -0
  37. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/base.py +0 -0
  38. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/discord.py +0 -0
  39. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/feishu.py +0 -0
  40. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/manager.py +0 -0
  41. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/telegram.py +0 -0
  42. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/channels/whatsapp.py +0 -0
  43. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cli/__init__.py +0 -0
  44. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cli/commands.py +0 -0
  45. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/config/__init__.py +0 -0
  46. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/config/loader.py +0 -0
  47. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cron/__init__.py +0 -0
  48. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cron/service.py +0 -0
  49. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/cron/types.py +0 -0
  50. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/__init__.py +0 -0
  51. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/favicon.png +0 -0
  52. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/kyber_logo.png +0 -0
  53. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/dashboard/static/styles.css +0 -0
  54. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/heartbeat/__init__.py +0 -0
  55. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/heartbeat/service.py +0 -0
  56. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/__init__.py +0 -0
  57. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/base.py +0 -0
  58. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/litellm_provider.py +0 -0
  59. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/providers/transcription.py +0 -0
  60. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/session/__init__.py +0 -0
  61. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/session/manager.py +0 -0
  62. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/README.md +0 -0
  63. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/github/SKILL.md +0 -0
  64. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/skill-creator/SKILL.md +0 -0
  65. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/summarize/SKILL.md +0 -0
  66. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/tmux/SKILL.md +0 -0
  67. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/tmux/scripts/find-sessions.sh +0 -0
  68. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/tmux/scripts/wait-for-text.sh +0 -0
  69. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/skills/weather/SKILL.md +0 -0
  70. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/utils/__init__.py +0 -0
  71. {kyber_chat-1.0.0 → kyber_chat-2026.2.6.2}/kyber/utils/helpers.py +0 -0
@@ -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
@@ -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__ = "💎"
@@ -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
@@ -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
  [project]
2
2
  name = "kyber-chat"
3
- version = "1.0.0"
3
+ version = "2026.2.6.2"
4
4
  description = "A lightweight personal AI assistant framework"
5
5
  requires-python = ">=3.11"
6
6
  license = {text = "MIT"}
File without changes
File without changes
File without changes