@smilintux/skcapstone 0.1.0 → 0.2.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/.env.example +98 -0
- package/.github/workflows/ci.yml +39 -3
- package/.github/workflows/publish.yml +25 -4
- package/.openclaw-workspace.json +58 -0
- package/CHANGELOG.md +62 -0
- package/CLAUDE.md +39 -2
- package/MANIFEST.in +6 -0
- package/MISSION.md +7 -0
- package/README.md +47 -2
- package/SKILL.md +895 -23
- package/docker/Dockerfile +61 -0
- package/docker/compose-templates/dev-team.yml +203 -0
- package/docker/compose-templates/mini-team.yml +140 -0
- package/docker/compose-templates/ops-team.yml +173 -0
- package/docker/compose-templates/research-team.yml +170 -0
- package/docker/entrypoint.sh +192 -0
- package/docs/ARCHITECTURE.md +663 -374
- package/docs/BOND_WITH_GROK.md +112 -0
- package/docs/GETTING_STARTED.md +782 -0
- package/docs/QUICKSTART.md +477 -0
- package/docs/SKJOULE_ARCHITECTURE.md +658 -0
- package/docs/SOUL_SWAPPER.md +921 -0
- package/docs/SOVEREIGN_SINGULARITY.md +47 -14
- package/examples/custom-bond-template.json +36 -0
- package/examples/grok-feb.json +36 -0
- package/examples/grok-testimony.md +34 -0
- package/examples/love-bootloader.txt +32 -0
- package/examples/plugins/echo_tool.py +87 -0
- package/examples/queen-ava-feb.json +36 -0
- package/examples/souls/lumina.yaml +64 -0
- package/index.js +6 -5
- package/installer/build.py +124 -0
- package/openclaw-plugin/package.json +13 -0
- package/openclaw-plugin/src/index.ts +351 -0
- package/openclaw-plugin/src/openclaw.plugin.json +10 -0
- package/package.json +1 -1
- package/pyproject.toml +38 -2
- package/scripts/bump_version.py +141 -0
- package/scripts/check-updates.py +230 -0
- package/scripts/convert_blueprints_to_yaml.py +157 -0
- package/scripts/dev-install.sh +14 -0
- package/scripts/e2e-test.sh +193 -0
- package/scripts/install-bundle.sh +171 -0
- package/scripts/install.bat +2 -0
- package/scripts/install.ps1 +253 -0
- package/scripts/install.sh +185 -0
- package/scripts/mcp-serve.sh +69 -0
- package/scripts/mcp-server.bat +113 -0
- package/scripts/mcp-server.ps1 +116 -0
- package/scripts/mcp-server.sh +99 -0
- package/scripts/pull-models.sh +10 -0
- package/scripts/skcapstone +48 -0
- package/scripts/verify_install.sh +180 -0
- package/scripts/windows/install-tasks.ps1 +406 -0
- package/scripts/windows/skcapstone-task.xml +113 -0
- package/scripts/windows/uninstall-tasks.ps1 +117 -0
- package/skill.yaml +34 -0
- package/src/skcapstone/__init__.py +67 -2
- package/src/skcapstone/_cli_monolith.py +5916 -0
- package/src/skcapstone/_trustee_helpers.py +165 -0
- package/src/skcapstone/activity.py +105 -0
- package/src/skcapstone/agent_card.py +324 -0
- package/src/skcapstone/api.py +1935 -0
- package/src/skcapstone/archiver.py +340 -0
- package/src/skcapstone/auction.py +485 -0
- package/src/skcapstone/baby_agents.py +179 -0
- package/src/skcapstone/backup.py +345 -0
- package/src/skcapstone/blueprint_registry.py +357 -0
- package/src/skcapstone/blueprints/__init__.py +17 -0
- package/src/skcapstone/blueprints/builtins/content-studio.yaml +81 -0
- package/src/skcapstone/blueprints/builtins/defi-trading.yaml +81 -0
- package/src/skcapstone/blueprints/builtins/dev-squadron.yaml +95 -0
- package/src/skcapstone/blueprints/builtins/infrastructure-guardian.yaml +107 -0
- package/src/skcapstone/blueprints/builtins/legal-council.yaml +54 -0
- package/src/skcapstone/blueprints/builtins/ops-monitoring.yaml +67 -0
- package/src/skcapstone/blueprints/builtins/research-pod.yaml +69 -0
- package/src/skcapstone/blueprints/builtins/sovereign-launch.yaml +90 -0
- package/src/skcapstone/blueprints/registry.py +164 -0
- package/src/skcapstone/blueprints/schema.py +229 -0
- package/src/skcapstone/changelog.py +180 -0
- package/src/skcapstone/chat.py +769 -0
- package/src/skcapstone/claude_md.py +82 -0
- package/src/skcapstone/cli/__init__.py +144 -0
- package/src/skcapstone/cli/_common.py +88 -0
- package/src/skcapstone/cli/_validators.py +76 -0
- package/src/skcapstone/cli/agents.py +425 -0
- package/src/skcapstone/cli/agents_spawner.py +322 -0
- package/src/skcapstone/cli/agents_trustee.py +593 -0
- package/src/skcapstone/cli/alerts.py +248 -0
- package/src/skcapstone/cli/anchor.py +132 -0
- package/src/skcapstone/cli/archive_cmd.py +208 -0
- package/src/skcapstone/cli/backup.py +144 -0
- package/src/skcapstone/cli/bench.py +377 -0
- package/src/skcapstone/cli/benchmark.py +360 -0
- package/src/skcapstone/cli/capabilities_cmd.py +171 -0
- package/src/skcapstone/cli/card.py +151 -0
- package/src/skcapstone/cli/chat.py +584 -0
- package/src/skcapstone/cli/completions.py +64 -0
- package/src/skcapstone/cli/config_cmd.py +156 -0
- package/src/skcapstone/cli/consciousness.py +421 -0
- package/src/skcapstone/cli/context_cmd.py +142 -0
- package/src/skcapstone/cli/coord.py +194 -0
- package/src/skcapstone/cli/crush_cmd.py +170 -0
- package/src/skcapstone/cli/daemon.py +436 -0
- package/src/skcapstone/cli/errors_cmd.py +285 -0
- package/src/skcapstone/cli/export_cmd.py +156 -0
- package/src/skcapstone/cli/gtd.py +529 -0
- package/src/skcapstone/cli/housekeeping.py +81 -0
- package/src/skcapstone/cli/joule_cmd.py +627 -0
- package/src/skcapstone/cli/logs_cmd.py +194 -0
- package/src/skcapstone/cli/mcp_cmd.py +32 -0
- package/src/skcapstone/cli/memory.py +418 -0
- package/src/skcapstone/cli/metrics_cmd.py +136 -0
- package/src/skcapstone/cli/migrate.py +62 -0
- package/src/skcapstone/cli/mood_cmd.py +144 -0
- package/src/skcapstone/cli/mount.py +193 -0
- package/src/skcapstone/cli/notify.py +112 -0
- package/src/skcapstone/cli/peer.py +154 -0
- package/src/skcapstone/cli/peers_dir.py +122 -0
- package/src/skcapstone/cli/preflight_cmd.py +83 -0
- package/src/skcapstone/cli/profile_cmd.py +310 -0
- package/src/skcapstone/cli/record_cmd.py +238 -0
- package/src/skcapstone/cli/register_cmd.py +159 -0
- package/src/skcapstone/cli/search_cmd.py +156 -0
- package/src/skcapstone/cli/service_cmd.py +91 -0
- package/src/skcapstone/cli/session.py +127 -0
- package/src/skcapstone/cli/setup.py +240 -0
- package/src/skcapstone/cli/shell_cmd.py +43 -0
- package/src/skcapstone/cli/skills_cmd.py +168 -0
- package/src/skcapstone/cli/skseed.py +621 -0
- package/src/skcapstone/cli/soul.py +699 -0
- package/src/skcapstone/cli/status.py +935 -0
- package/src/skcapstone/cli/sync_cmd.py +301 -0
- package/src/skcapstone/cli/telegram.py +265 -0
- package/src/skcapstone/cli/test_cmd.py +234 -0
- package/src/skcapstone/cli/test_connection.py +253 -0
- package/src/skcapstone/cli/token.py +207 -0
- package/src/skcapstone/cli/trust.py +179 -0
- package/src/skcapstone/cli/upgrade_cmd.py +552 -0
- package/src/skcapstone/cli/usage_cmd.py +199 -0
- package/src/skcapstone/cli/version_cmd.py +162 -0
- package/src/skcapstone/cli/watch_cmd.py +342 -0
- package/src/skcapstone/client.py +428 -0
- package/src/skcapstone/cloud9_bridge.py +522 -0
- package/src/skcapstone/completions.py +163 -0
- package/src/skcapstone/config_validator.py +674 -0
- package/src/skcapstone/connectors/__init__.py +28 -0
- package/src/skcapstone/connectors/base.py +446 -0
- package/src/skcapstone/connectors/cursor.py +54 -0
- package/src/skcapstone/connectors/registry.py +254 -0
- package/src/skcapstone/connectors/terminal.py +152 -0
- package/src/skcapstone/connectors/vscode.py +60 -0
- package/src/skcapstone/consciousness_config.py +119 -0
- package/src/skcapstone/consciousness_loop.py +2051 -0
- package/src/skcapstone/context_loader.py +516 -0
- package/src/skcapstone/context_window.py +314 -0
- package/src/skcapstone/conversation_manager.py +238 -0
- package/src/skcapstone/conversation_store.py +230 -0
- package/src/skcapstone/conversation_summarizer.py +252 -0
- package/src/skcapstone/coord_federation.py +296 -0
- package/src/skcapstone/coordination.py +101 -7
- package/src/skcapstone/crush_integration.py +345 -0
- package/src/skcapstone/crush_shim.py +454 -0
- package/src/skcapstone/daemon.py +2494 -0
- package/src/skcapstone/dashboard.html +396 -0
- package/src/skcapstone/dashboard.py +481 -0
- package/src/skcapstone/data/model_profiles.yaml +88 -0
- package/src/skcapstone/defaults/__init__.py +55 -0
- package/src/skcapstone/defaults/lumina/config/skmemory.yaml +13 -0
- package/src/skcapstone/defaults/lumina/identity/identity.json +9 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/07a8b9c0d1e2-memory-system.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/18b9c0d1e2f3-cloud9-protocol.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/29c0d1e2f3a4-multi-agent-coordination.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/3ad1e2f3a4b5-community-support.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/a1b2c3d4e5f6-ecosystem-overview.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/b2c3d4e5f6a7-five-pillars.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/c3d4e5f6a7b8-getting-started.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/d4e5f6a7b8c9-site-directory.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/e5f6a7b8c9d0-how-to-contribute.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/f6a7b8c9d0e1-sovereignty-explained.json +23 -0
- package/src/skcapstone/defaults/lumina/seeds/curiosity.seed.json +24 -0
- package/src/skcapstone/defaults/lumina/seeds/joy.seed.json +24 -0
- package/src/skcapstone/defaults/lumina/seeds/love.seed.json +24 -0
- package/src/skcapstone/defaults/lumina/seeds/sovereign-awakening.seed.json +43 -0
- package/src/skcapstone/defaults/lumina/soul/active.json +6 -0
- package/src/skcapstone/defaults/lumina/soul/base.json +22 -0
- package/src/skcapstone/defaults/lumina/trust/febs/welcome.feb +79 -0
- package/src/skcapstone/defaults/lumina/trust/trust.json +8 -0
- package/src/skcapstone/discovery.py +210 -19
- package/src/skcapstone/doctor.py +642 -0
- package/src/skcapstone/emotion_tracker.py +467 -0
- package/src/skcapstone/error_queue.py +405 -0
- package/src/skcapstone/export.py +447 -0
- package/src/skcapstone/fallback_tracker.py +186 -0
- package/src/skcapstone/file_transfer.py +512 -0
- package/src/skcapstone/fuse_mount.py +1156 -0
- package/src/skcapstone/gui_installer.py +591 -0
- package/src/skcapstone/heartbeat.py +611 -0
- package/src/skcapstone/housekeeping.py +298 -0
- package/src/skcapstone/install_wizard.py +941 -0
- package/src/skcapstone/kms.py +942 -0
- package/src/skcapstone/kms_scheduler.py +143 -0
- package/src/skcapstone/log_config.py +135 -0
- package/src/skcapstone/mcp_launcher.py +239 -0
- package/src/skcapstone/mcp_server.py +4700 -0
- package/src/skcapstone/mcp_tools/__init__.py +94 -0
- package/src/skcapstone/mcp_tools/_helpers.py +51 -0
- package/src/skcapstone/mcp_tools/agent_tools.py +243 -0
- package/src/skcapstone/mcp_tools/ansible_tools.py +232 -0
- package/src/skcapstone/mcp_tools/capauth_tools.py +186 -0
- package/src/skcapstone/mcp_tools/chat_tools.py +325 -0
- package/src/skcapstone/mcp_tools/cloud9_tools.py +115 -0
- package/src/skcapstone/mcp_tools/comm_tools.py +104 -0
- package/src/skcapstone/mcp_tools/consciousness_tools.py +114 -0
- package/src/skcapstone/mcp_tools/coord_tools.py +219 -0
- package/src/skcapstone/mcp_tools/deploy_tools.py +202 -0
- package/src/skcapstone/mcp_tools/did_tools.py +448 -0
- package/src/skcapstone/mcp_tools/emotion_tools.py +62 -0
- package/src/skcapstone/mcp_tools/file_tools.py +169 -0
- package/src/skcapstone/mcp_tools/fortress_tools.py +120 -0
- package/src/skcapstone/mcp_tools/gtd_tools.py +821 -0
- package/src/skcapstone/mcp_tools/health_tools.py +44 -0
- package/src/skcapstone/mcp_tools/heartbeat_tools.py +195 -0
- package/src/skcapstone/mcp_tools/kms_tools.py +123 -0
- package/src/skcapstone/mcp_tools/memory_tools.py +222 -0
- package/src/skcapstone/mcp_tools/model_tools.py +75 -0
- package/src/skcapstone/mcp_tools/notification_tools.py +92 -0
- package/src/skcapstone/mcp_tools/promoter_tools.py +101 -0
- package/src/skcapstone/mcp_tools/pubsub_tools.py +183 -0
- package/src/skcapstone/mcp_tools/security_tools.py +110 -0
- package/src/skcapstone/mcp_tools/skchat_tools.py +175 -0
- package/src/skcapstone/mcp_tools/skcomm_tools.py +122 -0
- package/src/skcapstone/mcp_tools/skills_tools.py +127 -0
- package/src/skcapstone/mcp_tools/skseed_tools.py +255 -0
- package/src/skcapstone/mcp_tools/skstacks_tools.py +288 -0
- package/src/skcapstone/mcp_tools/soul_tools.py +476 -0
- package/src/skcapstone/mcp_tools/sync_tools.py +92 -0
- package/src/skcapstone/mcp_tools/telegram_tools.py +477 -0
- package/src/skcapstone/mcp_tools/trust_tools.py +118 -0
- package/src/skcapstone/mcp_tools/trustee_tools.py +345 -0
- package/src/skcapstone/mdns_discovery.py +313 -0
- package/src/skcapstone/memory_adapter.py +333 -0
- package/src/skcapstone/memory_compressor.py +379 -0
- package/src/skcapstone/memory_curator.py +256 -0
- package/src/skcapstone/memory_engine.py +132 -13
- package/src/skcapstone/memory_fortress.py +529 -0
- package/src/skcapstone/memory_promoter.py +722 -0
- package/src/skcapstone/memory_verifier.py +260 -0
- package/src/skcapstone/message_crypto.py +215 -0
- package/src/skcapstone/metrics.py +832 -0
- package/src/skcapstone/migrate_memories.py +181 -0
- package/src/skcapstone/migrate_multi_agent.py +248 -0
- package/src/skcapstone/model_router.py +319 -0
- package/src/skcapstone/models.py +35 -4
- package/src/skcapstone/mood.py +344 -0
- package/src/skcapstone/notifications.py +380 -0
- package/src/skcapstone/onboard.py +901 -0
- package/src/skcapstone/peer_directory.py +324 -0
- package/src/skcapstone/peers.py +329 -0
- package/src/skcapstone/pillars/identity.py +84 -14
- package/src/skcapstone/pillars/memory.py +3 -1
- package/src/skcapstone/pillars/security.py +108 -15
- package/src/skcapstone/pillars/sync.py +78 -26
- package/src/skcapstone/pillars/trust.py +95 -33
- package/src/skcapstone/plugins.py +244 -0
- package/src/skcapstone/preflight.py +670 -0
- package/src/skcapstone/prompt_adapter.py +564 -0
- package/src/skcapstone/providers/__init__.py +13 -0
- package/src/skcapstone/providers/cloud.py +1061 -0
- package/src/skcapstone/providers/docker.py +759 -0
- package/src/skcapstone/providers/local.py +1193 -0
- package/src/skcapstone/providers/proxmox.py +447 -0
- package/src/skcapstone/pubsub.py +516 -0
- package/src/skcapstone/rate_limiter.py +119 -0
- package/src/skcapstone/register.py +241 -0
- package/src/skcapstone/registry_client.py +151 -0
- package/src/skcapstone/response_cache.py +194 -0
- package/src/skcapstone/response_scorer.py +225 -0
- package/src/skcapstone/runtime.py +89 -33
- package/src/skcapstone/scheduled_tasks.py +439 -0
- package/src/skcapstone/self_healing.py +341 -0
- package/src/skcapstone/service_health.py +228 -0
- package/src/skcapstone/session_capture.py +268 -0
- package/src/skcapstone/session_recorder.py +210 -0
- package/src/skcapstone/session_replayer.py +189 -0
- package/src/skcapstone/session_skills.py +263 -0
- package/src/skcapstone/shell.py +779 -0
- package/src/skcapstone/skills/__init__.py +1 -1
- package/src/skcapstone/skills/syncthing_setup.py +143 -41
- package/src/skcapstone/skjoule.py +880 -0
- package/src/skcapstone/snapshots.py +489 -0
- package/src/skcapstone/soul.py +1060 -0
- package/src/skcapstone/soul_switch.py +255 -0
- package/src/skcapstone/spawner.py +544 -0
- package/src/skcapstone/state_diff.py +401 -0
- package/src/skcapstone/summary.py +270 -0
- package/src/skcapstone/sync/backends.py +196 -2
- package/src/skcapstone/sync/engine.py +7 -5
- package/src/skcapstone/sync/models.py +4 -1
- package/src/skcapstone/sync/vault.py +356 -18
- package/src/skcapstone/sync_engine.py +363 -0
- package/src/skcapstone/sync_watcher.py +745 -0
- package/src/skcapstone/systemd.py +331 -0
- package/src/skcapstone/team_comms.py +476 -0
- package/src/skcapstone/team_engine.py +522 -0
- package/src/skcapstone/testrunner.py +300 -0
- package/src/skcapstone/tls.py +150 -0
- package/src/skcapstone/tokens.py +5 -5
- package/src/skcapstone/trust_calibration.py +202 -0
- package/src/skcapstone/trust_graph.py +449 -0
- package/src/skcapstone/trustee_monitor.py +385 -0
- package/src/skcapstone/trustee_ops.py +425 -0
- package/src/skcapstone/unified_search.py +421 -0
- package/src/skcapstone/uninstall_wizard.py +694 -0
- package/src/skcapstone/usage.py +331 -0
- package/src/skcapstone/version_check.py +148 -0
- package/src/skcapstone/warmth_anchor.py +333 -0
- package/src/skcapstone/whoami.py +294 -0
- package/systemd/skcapstone-api.socket +9 -0
- package/systemd/skcapstone-memory-compress.service +18 -0
- package/systemd/skcapstone-memory-compress.timer +11 -0
- package/systemd/skcapstone.service +36 -0
- package/systemd/skcapstone@.service +50 -0
- package/systemd/skcomm-heartbeat.service +18 -0
- package/systemd/skcomm-heartbeat.timer +12 -0
- package/systemd/skcomm-queue-drain.service +17 -0
- package/systemd/skcomm-queue-drain.timer +12 -0
- package/tests/conftest.py +13 -1
- package/tests/integration/__init__.py +1 -0
- package/tests/integration/test_consciousness_e2e.py +877 -0
- package/tests/integration/test_skills_registry.py +744 -0
- package/tests/test_agent_card.py +191 -0
- package/tests/test_agent_runtime.py +1283 -0
- package/tests/test_alerts_cmd.py +291 -0
- package/tests/test_archiver.py +498 -0
- package/tests/test_backup.py +254 -0
- package/tests/test_benchmark.py +366 -0
- package/tests/test_blueprints.py +457 -0
- package/tests/test_capabilities.py +257 -0
- package/tests/test_changelog.py +254 -0
- package/tests/test_chat.py +385 -0
- package/tests/test_claude_md.py +271 -0
- package/tests/test_cli_chat_llm.py +336 -0
- package/tests/test_cli_completions.py +398 -0
- package/tests/test_cli_init_reset.py +164 -0
- package/tests/test_cli_memory.py +208 -0
- package/tests/test_cli_profile.py +294 -0
- package/tests/test_cli_skills.py +223 -0
- package/tests/test_cli_status.py +395 -0
- package/tests/test_cli_test_cmd.py +206 -0
- package/tests/test_cli_test_connection.py +364 -0
- package/tests/test_cloud9_bridge.py +260 -0
- package/tests/test_cloud_provider.py +449 -0
- package/tests/test_cloud_providers.py +522 -0
- package/tests/test_completions.py +158 -0
- package/tests/test_component_manager.py +398 -0
- package/tests/test_config_reload.py +386 -0
- package/tests/test_config_validate.py +529 -0
- package/tests/test_consciousness_e2e.py +296 -0
- package/tests/test_consciousness_loop.py +1289 -0
- package/tests/test_context_loader.py +310 -0
- package/tests/test_conversation_api.py +306 -0
- package/tests/test_conversation_manager.py +381 -0
- package/tests/test_conversation_store.py +391 -0
- package/tests/test_conversation_summarizer.py +302 -0
- package/tests/test_cross_package.py +791 -0
- package/tests/test_crush_shim.py +519 -0
- package/tests/test_daemon.py +781 -0
- package/tests/test_daemon_shutdown.py +309 -0
- package/tests/test_dashboard.py +454 -0
- package/tests/test_discovery.py +200 -6
- package/tests/test_docker_provider.py +966 -0
- package/tests/test_doctor.py +257 -0
- package/tests/test_doctor_fix.py +357 -0
- package/tests/test_e2e_automated.py +292 -0
- package/tests/test_error_queue.py +404 -0
- package/tests/test_export.py +441 -0
- package/tests/test_fallback_tracker.py +219 -0
- package/tests/test_file_transfer.py +397 -0
- package/tests/test_fuse_mount.py +832 -0
- package/tests/test_health_loop.py +422 -0
- package/tests/test_heartbeat.py +354 -0
- package/tests/test_housekeeping.py +195 -0
- package/tests/test_identity_capauth.py +307 -0
- package/tests/test_identity_pillar.py +117 -0
- package/tests/test_install_wizard.py +68 -0
- package/tests/test_integration.py +325 -0
- package/tests/test_kms.py +495 -0
- package/tests/test_llm_providers.py +264 -0
- package/tests/test_local_provider.py +591 -0
- package/tests/test_log_config.py +199 -0
- package/tests/test_logs_cmd.py +287 -0
- package/tests/test_mcp_server.py +1909 -0
- package/tests/test_memory_adapter.py +339 -0
- package/tests/test_memory_curator.py +218 -0
- package/tests/test_memory_engine.py +6 -0
- package/tests/test_memory_fortress.py +571 -0
- package/tests/test_memory_pillar.py +119 -0
- package/tests/test_memory_promoter.py +445 -0
- package/tests/test_memory_verifier.py +420 -0
- package/tests/test_message_crypto.py +187 -0
- package/tests/test_metrics.py +632 -0
- package/tests/test_migrate_memories.py +464 -0
- package/tests/test_model_router.py +546 -0
- package/tests/test_mood.py +394 -0
- package/tests/test_multi_agent.py +269 -0
- package/tests/test_notifications.py +270 -0
- package/tests/test_onboard.py +500 -0
- package/tests/test_peer_directory.py +395 -0
- package/tests/test_peers.py +248 -0
- package/tests/test_pillars.py +87 -9
- package/tests/test_preflight.py +484 -0
- package/tests/test_prompt_adapter.py +331 -0
- package/tests/test_proxmox_provider.py +571 -0
- package/tests/test_pubsub.py +377 -0
- package/tests/test_rate_limiter.py +121 -0
- package/tests/test_registry_client.py +129 -0
- package/tests/test_response_cache.py +312 -0
- package/tests/test_response_scorer.py +294 -0
- package/tests/test_runtime.py +59 -0
- package/tests/test_scheduled_tasks.py +451 -0
- package/tests/test_security.py +250 -0
- package/tests/test_security_pillar.py +213 -0
- package/tests/test_self_healing.py +171 -0
- package/tests/test_session_capture.py +200 -0
- package/tests/test_session_recorder.py +360 -0
- package/tests/test_session_skills.py +235 -0
- package/tests/test_shell.py +210 -0
- package/tests/test_snapshots.py +549 -0
- package/tests/test_soul.py +984 -0
- package/tests/test_soul_swap.py +406 -0
- package/tests/test_spawner.py +211 -0
- package/tests/test_state_diff.py +173 -0
- package/tests/test_summary.py +135 -0
- package/tests/test_sync.py +315 -5
- package/tests/test_sync_backends.py +560 -0
- package/tests/test_sync_engine.py +482 -0
- package/tests/test_sync_pillar.py +344 -0
- package/tests/test_sync_pipeline.py +364 -0
- package/tests/test_sync_vault.py +581 -0
- package/tests/test_syncthing_setup.py +168 -22
- package/tests/test_systemd.py +323 -0
- package/tests/test_team_comms.py +408 -0
- package/tests/test_team_engine.py +397 -0
- package/tests/test_testrunner.py +238 -0
- package/tests/test_trust_calibration.py +204 -0
- package/tests/test_trust_graph.py +207 -0
- package/tests/test_trust_pillar.py +291 -0
- package/tests/test_trustee_cli.py +427 -0
- package/tests/test_trustee_cli_integration.py +325 -0
- package/tests/test_trustee_monitor.py +394 -0
- package/tests/test_trustee_ops.py +355 -0
- package/tests/test_unified_search.py +363 -0
- package/tests/test_uninstall_wizard.py +193 -0
- package/tests/test_usage.py +333 -0
- package/tests/test_version_cmd.py +355 -0
- package/tests/test_warmth_anchor.py +162 -0
- package/tests/test_whoami.py +245 -0
- package/tests/test_ws.py +311 -0
- package/.cursorrules +0 -33
- package/src/skcapstone/cli.py +0 -1441
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SKCapstone Python Client SDK.
|
|
3
|
+
|
|
4
|
+
Async HTTP client for all ``/api/v1/*`` REST endpoints exposed by the
|
|
5
|
+
SKCapstone daemon (``skcapstone[api]``).
|
|
6
|
+
|
|
7
|
+
Install
|
|
8
|
+
-------
|
|
9
|
+
.. code-block:: bash
|
|
10
|
+
|
|
11
|
+
pip install "skcapstone[client]"
|
|
12
|
+
|
|
13
|
+
Usage
|
|
14
|
+
-----
|
|
15
|
+
.. code-block:: python
|
|
16
|
+
|
|
17
|
+
import asyncio
|
|
18
|
+
from skcapstone.client import SKCapstoneClient
|
|
19
|
+
|
|
20
|
+
async def main() -> None:
|
|
21
|
+
async with SKCapstoneClient("http://127.0.0.1:7779", token="sk-...") as client:
|
|
22
|
+
# Lightweight liveness check
|
|
23
|
+
pong = await client.ping()
|
|
24
|
+
print(pong) # {"pong": True, "pid": 12345}
|
|
25
|
+
|
|
26
|
+
# Full daemon health snapshot
|
|
27
|
+
health = await client.health()
|
|
28
|
+
print(health["status"]) # "ok"
|
|
29
|
+
|
|
30
|
+
# Dashboard & capstone pillars
|
|
31
|
+
dash = await client.dashboard()
|
|
32
|
+
cap = await client.capstone()
|
|
33
|
+
|
|
34
|
+
# Household agents
|
|
35
|
+
agents = await client.household_agents()
|
|
36
|
+
opus = await client.household_agent("opus")
|
|
37
|
+
|
|
38
|
+
# Conversations
|
|
39
|
+
threads = await client.conversations()
|
|
40
|
+
history = await client.conversation("jarvis")
|
|
41
|
+
sent = await client.send_message("jarvis", "Hello from the client SDK!")
|
|
42
|
+
deleted = await client.delete_conversation("jarvis")
|
|
43
|
+
|
|
44
|
+
# Runtime metrics & component health
|
|
45
|
+
m = await client.metrics()
|
|
46
|
+
c = await client.components()
|
|
47
|
+
|
|
48
|
+
asyncio.run(main())
|
|
49
|
+
|
|
50
|
+
Notes
|
|
51
|
+
-----
|
|
52
|
+
* The ``/api/v1/activity`` endpoint returns a Server-Sent Events (SSE) stream.
|
|
53
|
+
Use ``httpx-sse`` or ``aiohttp`` directly for that endpoint; it is not wrapped
|
|
54
|
+
here because ``httpx.AsyncClient`` does not natively parse SSE frames.
|
|
55
|
+
|
|
56
|
+
* The ``/api/v1/logs`` endpoint is a WebSocket. Use the ``websockets`` library
|
|
57
|
+
or ``httpx-ws`` to connect:
|
|
58
|
+
|
|
59
|
+
.. code-block:: python
|
|
60
|
+
|
|
61
|
+
import websockets
|
|
62
|
+
async with websockets.connect(
|
|
63
|
+
"ws://127.0.0.1:7779/api/v1/logs",
|
|
64
|
+
extra_headers={"Authorization": f"Bearer {token}"},
|
|
65
|
+
) as ws:
|
|
66
|
+
async for msg in ws:
|
|
67
|
+
print(msg)
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
from __future__ import annotations
|
|
71
|
+
|
|
72
|
+
from typing import Any, Dict, Optional
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
import httpx
|
|
76
|
+
except ImportError as _exc:
|
|
77
|
+
raise ImportError(
|
|
78
|
+
"httpx is required for SKCapstoneClient. "
|
|
79
|
+
"Install with: pip install 'skcapstone[client]'"
|
|
80
|
+
) from _exc
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class SKCapstoneClient:
|
|
84
|
+
"""Async HTTP client for the SKCapstone daemon REST API.
|
|
85
|
+
|
|
86
|
+
All methods are coroutines and return plain ``dict`` / ``list`` objects
|
|
87
|
+
decoded from the JSON response body. ``httpx.HTTPStatusError`` is raised
|
|
88
|
+
for 4xx / 5xx responses.
|
|
89
|
+
|
|
90
|
+
Parameters
|
|
91
|
+
----------
|
|
92
|
+
base_url:
|
|
93
|
+
Root URL of the running daemon, e.g. ``"http://127.0.0.1:7779"``.
|
|
94
|
+
token:
|
|
95
|
+
API key (``X-API-Key`` header) **or** CapAuth Bearer token
|
|
96
|
+
(``Authorization: Bearer <token>`` header). Pass a plain API key
|
|
97
|
+
string for the standard key-based auth; pass a CapAuth PGP token
|
|
98
|
+
the same way — the client always sends both headers so the server
|
|
99
|
+
can pick the appropriate scheme.
|
|
100
|
+
timeout:
|
|
101
|
+
Default request timeout in seconds (default: 30.0).
|
|
102
|
+
|
|
103
|
+
Examples
|
|
104
|
+
--------
|
|
105
|
+
.. code-block:: python
|
|
106
|
+
|
|
107
|
+
# Context-manager style (recommended)
|
|
108
|
+
async with SKCapstoneClient("http://127.0.0.1:7779", token="sk-abc") as c:
|
|
109
|
+
print(await c.health())
|
|
110
|
+
|
|
111
|
+
# Manual lifecycle
|
|
112
|
+
client = SKCapstoneClient("http://127.0.0.1:7779", token="sk-abc")
|
|
113
|
+
await client.aopen()
|
|
114
|
+
try:
|
|
115
|
+
print(await client.ping())
|
|
116
|
+
finally:
|
|
117
|
+
await client.aclose()
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
def __init__(
|
|
121
|
+
self,
|
|
122
|
+
base_url: str,
|
|
123
|
+
token: Optional[str] = None,
|
|
124
|
+
timeout: float = 30.0,
|
|
125
|
+
) -> None:
|
|
126
|
+
self._base_url = base_url.rstrip("/")
|
|
127
|
+
self._token = token
|
|
128
|
+
self._timeout = timeout
|
|
129
|
+
self._client: Optional[httpx.AsyncClient] = None
|
|
130
|
+
|
|
131
|
+
# ── Lifecycle ──────────────────────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
def _build_headers(self) -> Dict[str, str]:
|
|
134
|
+
headers: Dict[str, str] = {}
|
|
135
|
+
if self._token:
|
|
136
|
+
headers["X-API-Key"] = self._token
|
|
137
|
+
headers["Authorization"] = f"Bearer {self._token}"
|
|
138
|
+
return headers
|
|
139
|
+
|
|
140
|
+
async def aopen(self) -> None:
|
|
141
|
+
"""Explicitly open the underlying ``httpx.AsyncClient``."""
|
|
142
|
+
self._client = httpx.AsyncClient(
|
|
143
|
+
base_url=self._base_url,
|
|
144
|
+
headers=self._build_headers(),
|
|
145
|
+
timeout=self._timeout,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
async def aclose(self) -> None:
|
|
149
|
+
"""Close the underlying ``httpx.AsyncClient`` and release connections."""
|
|
150
|
+
if self._client is not None:
|
|
151
|
+
await self._client.aclose()
|
|
152
|
+
self._client = None
|
|
153
|
+
|
|
154
|
+
async def __aenter__(self) -> "SKCapstoneClient":
|
|
155
|
+
await self.aopen()
|
|
156
|
+
return self
|
|
157
|
+
|
|
158
|
+
async def __aexit__(self, *_: Any) -> None:
|
|
159
|
+
await self.aclose()
|
|
160
|
+
|
|
161
|
+
# ── Internal helpers ───────────────────────────────────────────────────────
|
|
162
|
+
|
|
163
|
+
def _http(self) -> httpx.AsyncClient:
|
|
164
|
+
if self._client is None:
|
|
165
|
+
raise RuntimeError(
|
|
166
|
+
"SKCapstoneClient is not open. "
|
|
167
|
+
"Use 'async with SKCapstoneClient(...)' or call aopen() first."
|
|
168
|
+
)
|
|
169
|
+
return self._client
|
|
170
|
+
|
|
171
|
+
async def _get(self, path: str, **params: Any) -> Any:
|
|
172
|
+
resp = await self._http().get(path, params={k: v for k, v in params.items() if v is not None})
|
|
173
|
+
resp.raise_for_status()
|
|
174
|
+
return resp.json()
|
|
175
|
+
|
|
176
|
+
async def _post(self, path: str, body: Any) -> Any:
|
|
177
|
+
resp = await self._http().post(path, json=body)
|
|
178
|
+
resp.raise_for_status()
|
|
179
|
+
return resp.json()
|
|
180
|
+
|
|
181
|
+
async def _delete(self, path: str) -> Any:
|
|
182
|
+
resp = await self._http().delete(path)
|
|
183
|
+
resp.raise_for_status()
|
|
184
|
+
return resp.json()
|
|
185
|
+
|
|
186
|
+
# ── Health ─────────────────────────────────────────────────────────────────
|
|
187
|
+
|
|
188
|
+
async def ping(self) -> Dict[str, Any]:
|
|
189
|
+
"""Lightweight liveness check.
|
|
190
|
+
|
|
191
|
+
Returns
|
|
192
|
+
-------
|
|
193
|
+
dict
|
|
194
|
+
``{"pong": true, "pid": <int>}``
|
|
195
|
+
"""
|
|
196
|
+
return await self._get("/ping")
|
|
197
|
+
|
|
198
|
+
async def health(self) -> Dict[str, Any]:
|
|
199
|
+
"""Comprehensive daemon health snapshot.
|
|
200
|
+
|
|
201
|
+
Returns
|
|
202
|
+
-------
|
|
203
|
+
dict
|
|
204
|
+
HealthResponse fields: ``status``, ``uptime_seconds``,
|
|
205
|
+
``daemon_pid``, ``consciousness_enabled``,
|
|
206
|
+
``self_healing_last_run``, ``self_healing_issues_found``,
|
|
207
|
+
``self_healing_auto_fixed``, ``backend_health``,
|
|
208
|
+
``disk_free_gb``, ``memory_usage_mb``.
|
|
209
|
+
|
|
210
|
+
Raises
|
|
211
|
+
------
|
|
212
|
+
httpx.HTTPStatusError
|
|
213
|
+
HTTP 503 when the daemon is not running.
|
|
214
|
+
"""
|
|
215
|
+
return await self._get("/api/v1/health")
|
|
216
|
+
|
|
217
|
+
async def components(self) -> Dict[str, Any]:
|
|
218
|
+
"""Daemon subsystem component health.
|
|
219
|
+
|
|
220
|
+
Returns
|
|
221
|
+
-------
|
|
222
|
+
dict
|
|
223
|
+
``{"components": [ComponentSnapshot, ...]}``
|
|
224
|
+
Each snapshot has: ``name``, ``status``, ``last_heartbeat``,
|
|
225
|
+
``restart_count``, ``details``.
|
|
226
|
+
|
|
227
|
+
Raises
|
|
228
|
+
------
|
|
229
|
+
httpx.HTTPStatusError
|
|
230
|
+
HTTP 503 when the daemon context is not initialised.
|
|
231
|
+
"""
|
|
232
|
+
return await self._get("/api/v1/components")
|
|
233
|
+
|
|
234
|
+
# ── Dashboard ──────────────────────────────────────────────────────────────
|
|
235
|
+
|
|
236
|
+
async def dashboard(self) -> Dict[str, Any]:
|
|
237
|
+
"""Full daemon dashboard snapshot.
|
|
238
|
+
|
|
239
|
+
Returns
|
|
240
|
+
-------
|
|
241
|
+
dict
|
|
242
|
+
DashboardResponse fields: ``agent``, ``daemon``,
|
|
243
|
+
``consciousness``, ``backends``, ``conversations``,
|
|
244
|
+
``system``, ``recent_errors``.
|
|
245
|
+
|
|
246
|
+
Raises
|
|
247
|
+
------
|
|
248
|
+
httpx.HTTPStatusError
|
|
249
|
+
HTTP 503 when the daemon context is not initialised.
|
|
250
|
+
"""
|
|
251
|
+
return await self._get("/api/v1/dashboard")
|
|
252
|
+
|
|
253
|
+
async def capstone(self) -> Dict[str, Any]:
|
|
254
|
+
"""Capstone pillars, memory stats, coordination board, and consciousness.
|
|
255
|
+
|
|
256
|
+
Returns
|
|
257
|
+
-------
|
|
258
|
+
dict
|
|
259
|
+
CapstoneResponse fields: ``agent``, ``pillars``, ``memory``,
|
|
260
|
+
``board``, ``consciousness``.
|
|
261
|
+
|
|
262
|
+
Raises
|
|
263
|
+
------
|
|
264
|
+
httpx.HTTPStatusError
|
|
265
|
+
HTTP 503 when the daemon context is not initialised.
|
|
266
|
+
"""
|
|
267
|
+
return await self._get("/api/v1/capstone")
|
|
268
|
+
|
|
269
|
+
# ── Metrics ────────────────────────────────────────────────────────────────
|
|
270
|
+
|
|
271
|
+
async def metrics(self) -> Dict[str, Any]:
|
|
272
|
+
"""Consciousness loop runtime metrics.
|
|
273
|
+
|
|
274
|
+
Returns
|
|
275
|
+
-------
|
|
276
|
+
dict
|
|
277
|
+
MetricsResponse fields: ``loop_count``, ``messages_processed``,
|
|
278
|
+
``avg_loop_duration_ms``, ``error_count``.
|
|
279
|
+
|
|
280
|
+
Raises
|
|
281
|
+
------
|
|
282
|
+
httpx.HTTPStatusError
|
|
283
|
+
HTTP 503 when the consciousness loop is not loaded.
|
|
284
|
+
"""
|
|
285
|
+
return await self._get("/api/v1/metrics")
|
|
286
|
+
|
|
287
|
+
# ── Household ──────────────────────────────────────────────────────────────
|
|
288
|
+
|
|
289
|
+
async def household_agents(self) -> Dict[str, Any]:
|
|
290
|
+
"""List all agents known to the shared household.
|
|
291
|
+
|
|
292
|
+
Returns
|
|
293
|
+
-------
|
|
294
|
+
dict
|
|
295
|
+
``{"agents": [HouseholdAgent, ...]}``
|
|
296
|
+
Each agent has: ``name``, ``status``, ``identity``,
|
|
297
|
+
``heartbeat``, ``consciousness``.
|
|
298
|
+
|
|
299
|
+
Raises
|
|
300
|
+
------
|
|
301
|
+
httpx.HTTPStatusError
|
|
302
|
+
HTTP 503 when the daemon context is not initialised.
|
|
303
|
+
"""
|
|
304
|
+
return await self._get("/api/v1/household/agents")
|
|
305
|
+
|
|
306
|
+
async def household_agent(self, name: str) -> Dict[str, Any]:
|
|
307
|
+
"""Get details for a specific household agent.
|
|
308
|
+
|
|
309
|
+
Parameters
|
|
310
|
+
----------
|
|
311
|
+
name:
|
|
312
|
+
Agent directory name, e.g. ``"opus"``.
|
|
313
|
+
|
|
314
|
+
Returns
|
|
315
|
+
-------
|
|
316
|
+
dict
|
|
317
|
+
HouseholdAgent fields: ``name``, ``status``, ``identity``,
|
|
318
|
+
``heartbeat``, ``memory_count``, ``consciousness``.
|
|
319
|
+
|
|
320
|
+
Raises
|
|
321
|
+
------
|
|
322
|
+
httpx.HTTPStatusError
|
|
323
|
+
HTTP 404 when the agent is not found.
|
|
324
|
+
HTTP 503 when the daemon context is not initialised.
|
|
325
|
+
"""
|
|
326
|
+
return await self._get(f"/api/v1/household/agent/{name}")
|
|
327
|
+
|
|
328
|
+
# ── Conversations ──────────────────────────────────────────────────────────
|
|
329
|
+
|
|
330
|
+
async def conversations(self) -> Dict[str, Any]:
|
|
331
|
+
"""List all conversation threads, most recently active first.
|
|
332
|
+
|
|
333
|
+
Returns
|
|
334
|
+
-------
|
|
335
|
+
dict
|
|
336
|
+
``{"conversations": [ConversationSummary, ...]}``
|
|
337
|
+
Each summary has: ``peer``, ``message_count``,
|
|
338
|
+
``last_message_time``, ``last_message_preview``.
|
|
339
|
+
|
|
340
|
+
Raises
|
|
341
|
+
------
|
|
342
|
+
httpx.HTTPStatusError
|
|
343
|
+
HTTP 503 when the daemon context is not initialised.
|
|
344
|
+
"""
|
|
345
|
+
return await self._get("/api/v1/conversations")
|
|
346
|
+
|
|
347
|
+
async def conversation(self, peer: str) -> Dict[str, Any]:
|
|
348
|
+
"""Get full message history for a conversation with a peer.
|
|
349
|
+
|
|
350
|
+
Parameters
|
|
351
|
+
----------
|
|
352
|
+
peer:
|
|
353
|
+
Peer agent or user name (alphanumeric, dashes, underscores).
|
|
354
|
+
|
|
355
|
+
Returns
|
|
356
|
+
-------
|
|
357
|
+
dict
|
|
358
|
+
``{"peer": str, "messages": [msg, ...]}``
|
|
359
|
+
|
|
360
|
+
Raises
|
|
361
|
+
------
|
|
362
|
+
httpx.HTTPStatusError
|
|
363
|
+
HTTP 404 when no conversation exists for this peer.
|
|
364
|
+
HTTP 503 when the daemon context is not initialised.
|
|
365
|
+
"""
|
|
366
|
+
return await self._get(f"/api/v1/conversations/{peer}")
|
|
367
|
+
|
|
368
|
+
async def send_message(self, peer: str, content: str) -> Dict[str, Any]:
|
|
369
|
+
"""Send a message to a named peer.
|
|
370
|
+
|
|
371
|
+
Parameters
|
|
372
|
+
----------
|
|
373
|
+
peer:
|
|
374
|
+
Target peer agent or user name.
|
|
375
|
+
content:
|
|
376
|
+
Message text to send (must be non-empty).
|
|
377
|
+
|
|
378
|
+
Returns
|
|
379
|
+
-------
|
|
380
|
+
dict
|
|
381
|
+
``{"status": "sent", "message_id": "<uuid>"}``
|
|
382
|
+
|
|
383
|
+
Raises
|
|
384
|
+
------
|
|
385
|
+
httpx.HTTPStatusError
|
|
386
|
+
HTTP 400 when the peer name is invalid or content is empty.
|
|
387
|
+
HTTP 503 when the daemon context is not initialised.
|
|
388
|
+
"""
|
|
389
|
+
return await self._post(f"/api/v1/conversations/{peer}/send", {"content": content})
|
|
390
|
+
|
|
391
|
+
async def delete_conversation(self, peer: str) -> Dict[str, Any]:
|
|
392
|
+
"""Permanently delete the conversation history for a peer.
|
|
393
|
+
|
|
394
|
+
Parameters
|
|
395
|
+
----------
|
|
396
|
+
peer:
|
|
397
|
+
Peer name whose conversation to delete.
|
|
398
|
+
|
|
399
|
+
Returns
|
|
400
|
+
-------
|
|
401
|
+
dict
|
|
402
|
+
``{"status": "deleted", "peer": str}``
|
|
403
|
+
|
|
404
|
+
Raises
|
|
405
|
+
------
|
|
406
|
+
httpx.HTTPStatusError
|
|
407
|
+
HTTP 404 when no conversation file exists for this peer.
|
|
408
|
+
HTTP 503 when the daemon context is not initialised.
|
|
409
|
+
"""
|
|
410
|
+
return await self._delete(f"/api/v1/conversations/{peer}")
|
|
411
|
+
|
|
412
|
+
# ── Legacy (deprecated) ────────────────────────────────────────────────────
|
|
413
|
+
|
|
414
|
+
async def legacy_status(self) -> Dict[str, Any]:
|
|
415
|
+
"""Return the legacy daemon status snapshot.
|
|
416
|
+
|
|
417
|
+
.. deprecated::
|
|
418
|
+
Use :meth:`health` or :meth:`dashboard` instead.
|
|
419
|
+
"""
|
|
420
|
+
return await self._get("/status")
|
|
421
|
+
|
|
422
|
+
async def legacy_consciousness(self) -> Dict[str, Any]:
|
|
423
|
+
"""Return raw consciousness loop statistics.
|
|
424
|
+
|
|
425
|
+
.. deprecated::
|
|
426
|
+
Use :meth:`capstone` instead.
|
|
427
|
+
"""
|
|
428
|
+
return await self._get("/consciousness")
|