@smilintux/skcapstone 0.4.6 → 0.5.0

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 (77) hide show
  1. package/.github/workflows/publish.yml +8 -1
  2. package/docs/CUSTOM_AGENT.md +184 -0
  3. package/docs/GETTING_STARTED.md +3 -0
  4. package/launchd/com.skcapstone.daemon.plist +52 -0
  5. package/launchd/com.skcapstone.memory-compress.plist +45 -0
  6. package/launchd/com.skcapstone.skcomm-heartbeat.plist +33 -0
  7. package/launchd/com.skcapstone.skcomm-queue-drain.plist +34 -0
  8. package/launchd/install-launchd.sh +156 -0
  9. package/package.json +1 -1
  10. package/pyproject.toml +1 -1
  11. package/scripts/archive-sessions.sh +88 -0
  12. package/scripts/install.sh +39 -8
  13. package/scripts/notion-api.py +259 -0
  14. package/scripts/nvidia-proxy.mjs +878 -0
  15. package/scripts/proxy-monitor.sh +89 -0
  16. package/scripts/refresh-anthropic-token.sh +94 -0
  17. package/scripts/skgateway.mjs +856 -0
  18. package/scripts/telegram-catchup-all.sh +136 -0
  19. package/scripts/watch-anthropic-token.sh +117 -0
  20. package/src/skcapstone/__init__.py +1 -1
  21. package/src/skcapstone/_cli_monolith.py +4 -4
  22. package/src/skcapstone/api.py +36 -35
  23. package/src/skcapstone/auction.py +8 -8
  24. package/src/skcapstone/blueprint_registry.py +2 -2
  25. package/src/skcapstone/blueprints/builtins/itil-operations.yaml +40 -0
  26. package/src/skcapstone/brain_first.py +238 -0
  27. package/src/skcapstone/chat.py +4 -4
  28. package/src/skcapstone/cli/__init__.py +2 -0
  29. package/src/skcapstone/cli/agents_spawner.py +5 -2
  30. package/src/skcapstone/cli/chat.py +5 -2
  31. package/src/skcapstone/cli/consciousness.py +5 -2
  32. package/src/skcapstone/cli/daemon.py +116 -41
  33. package/src/skcapstone/cli/itil.py +434 -0
  34. package/src/skcapstone/cli/memory.py +4 -4
  35. package/src/skcapstone/cli/skills_cmd.py +2 -2
  36. package/src/skcapstone/cli/soul.py +5 -2
  37. package/src/skcapstone/cli/status.py +11 -8
  38. package/src/skcapstone/cli/upgrade_cmd.py +7 -4
  39. package/src/skcapstone/cli/watch_cmd.py +9 -6
  40. package/src/skcapstone/config_validator.py +7 -4
  41. package/src/skcapstone/consciousness_config.py +27 -0
  42. package/src/skcapstone/consciousness_loop.py +20 -18
  43. package/src/skcapstone/coordination.py +6 -2
  44. package/src/skcapstone/daemon.py +51 -42
  45. package/src/skcapstone/dashboard.py +8 -8
  46. package/src/skcapstone/defaults/lumina/config/claude-hooks.md +42 -0
  47. package/src/skcapstone/doctor.py +5 -2
  48. package/src/skcapstone/dreaming.py +1440 -0
  49. package/src/skcapstone/emotion_tracker.py +2 -2
  50. package/src/skcapstone/export.py +2 -2
  51. package/src/skcapstone/fuse_mount.py +21 -13
  52. package/src/skcapstone/heartbeat.py +33 -29
  53. package/src/skcapstone/itil.py +1104 -0
  54. package/src/skcapstone/launchd.py +426 -0
  55. package/src/skcapstone/mcp_server.py +306 -4
  56. package/src/skcapstone/mcp_tools/__init__.py +4 -0
  57. package/src/skcapstone/mcp_tools/_helpers.py +2 -2
  58. package/src/skcapstone/mcp_tools/ansible_tools.py +7 -4
  59. package/src/skcapstone/mcp_tools/brain_first_tools.py +90 -0
  60. package/src/skcapstone/mcp_tools/capauth_tools.py +7 -4
  61. package/src/skcapstone/mcp_tools/coord_tools.py +8 -4
  62. package/src/skcapstone/mcp_tools/did_tools.py +9 -6
  63. package/src/skcapstone/mcp_tools/gtd_tools.py +1 -1
  64. package/src/skcapstone/mcp_tools/itil_tools.py +657 -0
  65. package/src/skcapstone/mcp_tools/memory_tools.py +6 -2
  66. package/src/skcapstone/mcp_tools/soul_tools.py +6 -2
  67. package/src/skcapstone/mdns_discovery.py +2 -2
  68. package/src/skcapstone/metrics.py +8 -8
  69. package/src/skcapstone/migrate_memories.py +2 -2
  70. package/src/skcapstone/models.py +14 -0
  71. package/src/skcapstone/onboard.py +137 -14
  72. package/src/skcapstone/peer_directory.py +2 -2
  73. package/src/skcapstone/providers/docker.py +2 -2
  74. package/src/skcapstone/scheduled_tasks.py +107 -0
  75. package/src/skcapstone/service_health.py +83 -4
  76. package/src/skcapstone/sync_watcher.py +2 -2
  77. package/src/skcapstone/systemd.py +17 -0
@@ -0,0 +1,89 @@
1
+ #!/bin/bash
2
+ # proxy-monitor.sh — Quick health check for nvidia-proxy tuning
3
+ # Usage: ./proxy-monitor.sh [minutes] (default: last 30 minutes)
4
+ MINS=${1:-30}
5
+ if [[ "$OSTYPE" == "darwin"* ]]; then
6
+ SINCE=$(date -v-${MINS}M '+%Y-%m-%d %H:%M:%S')
7
+ else
8
+ SINCE=$(date -d "$MINS minutes ago" '+%Y-%m-%d %H:%M:%S')
9
+ fi
10
+
11
+ echo "=== NVIDIA Proxy Monitor (last ${MINS}m) ==="
12
+ echo ""
13
+
14
+ # Request count & model breakdown
15
+ echo "--- Requests by Model ---"
16
+ journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
17
+ | grep -oP 'model=\K[^ ]+' | sort | uniq -c | sort -rn
18
+ echo ""
19
+
20
+ # Body size stats
21
+ echo "--- Body Sizes (bytes) ---"
22
+ SIZES=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
23
+ | grep -oP 'bodyLen=\K[0-9]+' | sort -n)
24
+ if [ -n "$SIZES" ]; then
25
+ COUNT=$(echo "$SIZES" | wc -l)
26
+ MIN=$(echo "$SIZES" | head -1)
27
+ MAX=$(echo "$SIZES" | tail -1)
28
+ AVG=$(echo "$SIZES" | awk '{s+=$1} END {printf "%.0f", s/NR}')
29
+ echo " count=$COUNT min=${MIN} avg=${AVG} max=${MAX} limit=120000"
30
+ if [ "$MAX" -gt 100000 ]; then
31
+ echo " ⚠️ Max approaching limit — consider bumping MAX_BODY_BYTES"
32
+ elif [ "$MAX" -lt 40000 ]; then
33
+ echo " ✅ Plenty of headroom — no conversation trimming needed"
34
+ else
35
+ echo " 👀 Moderate usage — monitor for growth"
36
+ fi
37
+ else
38
+ echo " (no requests)"
39
+ fi
40
+ echo ""
41
+
42
+ # Trimming events
43
+ echo "--- Trimming Events ---"
44
+ CONV_TRIM=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
45
+ | grep -c "trimmed history")
46
+ AGGRESSIVE=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
47
+ | grep -c "AGGRESSIVE")
48
+ SYS_TRIM=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
49
+ | grep -c "trimmed system prompt")
50
+ TOOL_LIMIT=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
51
+ | grep -c "TOOL LIMIT")
52
+ echo " conversation trims: $CONV_TRIM"
53
+ echo " aggressive trims: $AGGRESSIVE"
54
+ echo " system prompt trims: $SYS_TRIM"
55
+ echo " tool limit hits: $TOOL_LIMIT"
56
+ if [ "$AGGRESSIVE" -gt 0 ]; then
57
+ echo " ⚠️ Aggressive trims happening — bump MAX_BODY_BYTES or keepEnd"
58
+ elif [ "$CONV_TRIM" -gt 0 ]; then
59
+ echo " 👀 Some conversation trimming — watch if it increases"
60
+ else
61
+ echo " ✅ No conversation trimming — settings have headroom"
62
+ fi
63
+ echo ""
64
+
65
+ # Error/retry stats
66
+ echo "--- Errors & Retries ---"
67
+ RETRIES=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
68
+ | grep -c "attempt=[2-4]")
69
+ ERRORS=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
70
+ | grep -cE "4[0-9]{2}|5[0-9]{2}|error|Error")
71
+ OK=$(journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
72
+ | grep -c "200 OK")
73
+ echo " 200 OK: $OK"
74
+ echo " retries: $RETRIES"
75
+ echo " errors: $ERRORS"
76
+ echo ""
77
+
78
+ # Response times (rough — from consecutive timestamps)
79
+ echo "--- Keyword Activations ---"
80
+ journalctl --user -u nvidia-proxy --no-pager --since "$SINCE" 2>/dev/null \
81
+ | grep -oP 'keyword-activated tools: \[\K[^\]]+' \
82
+ | tr ',' '\n' | sort | uniq -c | sort -rn | head -10
83
+ echo ""
84
+
85
+ # Current settings
86
+ echo "--- Current Proxy Settings ---"
87
+ grep -E "MAX_BODY_BYTES|MAX_SYSTEM_BYTES|allTools.length >|counter >= |keepEnd.*Math" \
88
+ /home/cbrd21/clawd/skcapstone-repos/skcapstone/scripts/nvidia-proxy.mjs 2>/dev/null \
89
+ | sed 's/^[[:space:]]*/ /'
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env bash
2
+ # Sync Anthropic OAuth token from Claude Code credentials to OpenClaw gateway
3
+ #
4
+ # Claude Code manages its own token refresh internally (writing to .credentials.json).
5
+ # This script simply reads the current token and syncs it to:
6
+ # 1. ~/.openclaw/openclaw.json (anthropic provider apiKey)
7
+ # 2. ~/.openclaw/.env (ANTHROPIC_API_KEY)
8
+ # 3. systemd override (ANTHROPIC_API_KEY env var)
9
+ # Then restarts the gateway if the token changed.
10
+ #
11
+ # Run via systemd timer every 2 hours.
12
+ set -euo pipefail
13
+
14
+ _sed_i() { if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' "$@"; else sed -i "$@"; fi; }
15
+
16
+ CREDS="$HOME/.claude/.credentials.json"
17
+ OPENCLAW_JSON="$HOME/.openclaw/openclaw.json"
18
+ OPENCLAW_ENV="$HOME/.openclaw/.env"
19
+ OVERRIDE_CONF="$HOME/.config/systemd/user/openclaw-gateway.service.d/override.conf"
20
+
21
+ if [ ! -f "$CREDS" ]; then
22
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] Claude credentials not found at $CREDS"
23
+ exit 1
24
+ fi
25
+
26
+ # Read current token and expiry from Claude Code credentials
27
+ ACCESS_TOKEN=$(python3 -c "import json; print(json.load(open('$CREDS'))['claudeAiOauth']['accessToken'])")
28
+ EXPIRES_AT=$(python3 -c "import json; print(json.load(open('$CREDS'))['claudeAiOauth']['expiresAt'])")
29
+
30
+ REMAINING=$(python3 -c "import time; print(f'{($EXPIRES_AT/1000 - time.time())/3600:.1f}h')")
31
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] Current token: ${ACCESS_TOKEN:0:20}... (expires in $REMAINING)"
32
+
33
+ # Check what's currently in the systemd override
34
+ OLD_TOKEN=""
35
+ if [ -f "$OVERRIDE_CONF" ]; then
36
+ OLD_TOKEN=$(grep "ANTHROPIC_API_KEY=" "$OVERRIDE_CONF" 2>/dev/null | sed 's/.*ANTHROPIC_API_KEY=//' || true)
37
+ fi
38
+
39
+ if [ "$OLD_TOKEN" = "$ACCESS_TOKEN" ]; then
40
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] Token already synced, no changes needed"
41
+ exit 0
42
+ fi
43
+
44
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] Token mismatch detected, syncing..."
45
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] Old: ${OLD_TOKEN:0:20}..."
46
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] New: ${ACCESS_TOKEN:0:20}..."
47
+
48
+ # 1. Update openclaw.json
49
+ if [ -f "$OPENCLAW_JSON" ]; then
50
+ python3 -c "
51
+ import json
52
+ with open('$OPENCLAW_JSON') as f:
53
+ cfg = json.load(f)
54
+ if 'providers' in cfg.get('models', {}):
55
+ if 'anthropic' in cfg['models']['providers']:
56
+ cfg['models']['providers']['anthropic']['apiKey'] = '$ACCESS_TOKEN'
57
+ with open('$OPENCLAW_JSON', 'w') as f:
58
+ json.dump(cfg, f, indent=2)
59
+ f.write('\n')
60
+ print('[sync] Updated openclaw.json')
61
+ else:
62
+ print('[sync] No anthropic provider in openclaw.json')
63
+ else:
64
+ print('[sync] No providers section in openclaw.json')
65
+ "
66
+ fi
67
+
68
+ # 2. Update .env
69
+ if grep -q "^ANTHROPIC_API_KEY=" "$OPENCLAW_ENV" 2>/dev/null; then
70
+ _sed_i "s|^ANTHROPIC_API_KEY=.*|ANTHROPIC_API_KEY=$ACCESS_TOKEN|" "$OPENCLAW_ENV"
71
+ else
72
+ echo "ANTHROPIC_API_KEY=$ACCESS_TOKEN" >> "$OPENCLAW_ENV"
73
+ fi
74
+ echo "[sync] Updated .env"
75
+
76
+ # 3. Update systemd override
77
+ NVIDIA_KEY=$(grep "NVIDIA_API_KEY=" "$OVERRIDE_CONF" 2>/dev/null | sed 's/.*NVIDIA_API_KEY=//' || true)
78
+ cat > "$OVERRIDE_CONF" << EOF
79
+ [Unit]
80
+ StartLimitIntervalSec=60
81
+ StartLimitBurst=10
82
+
83
+ [Service]
84
+ RestartSec=10
85
+ Environment=NVIDIA_API_KEY=${NVIDIA_KEY}
86
+ Environment=ANTHROPIC_API_KEY=${ACCESS_TOKEN}
87
+ EOF
88
+ echo "[sync] Updated systemd override"
89
+
90
+ # 4. Reload and restart gateway
91
+ systemctl --user daemon-reload
92
+ systemctl --user restart openclaw-gateway
93
+
94
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] Gateway restarted with synced token (expires in $REMAINING)"