@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,477 @@
|
|
|
1
|
+
"""Telegram integration tools — import, send, poll, and manage chats."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
from mcp.types import TextContent, Tool
|
|
9
|
+
|
|
10
|
+
from ._helpers import _error_response, _json_response
|
|
11
|
+
|
|
12
|
+
# ═══════════════════════════════════════════════════════════
|
|
13
|
+
# Tool Definitions
|
|
14
|
+
# ═══════════════════════════════════════════════════════════
|
|
15
|
+
|
|
16
|
+
TOOLS: list[Tool] = [
|
|
17
|
+
Tool(
|
|
18
|
+
name="telegram_import",
|
|
19
|
+
description=(
|
|
20
|
+
"Import a Telegram Desktop chat export into memories. "
|
|
21
|
+
"Point to the export directory containing result.json."
|
|
22
|
+
),
|
|
23
|
+
inputSchema={
|
|
24
|
+
"type": "object",
|
|
25
|
+
"properties": {
|
|
26
|
+
"export_path": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"description": "Path to Telegram export directory or result.json file",
|
|
29
|
+
},
|
|
30
|
+
"mode": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"description": "Import mode: 'daily' (consolidate per day) or 'message' (one per message)",
|
|
33
|
+
"enum": ["daily", "message"],
|
|
34
|
+
"default": "daily",
|
|
35
|
+
},
|
|
36
|
+
"min_length": {
|
|
37
|
+
"type": "integer",
|
|
38
|
+
"description": "Skip messages shorter than this many characters",
|
|
39
|
+
"default": 30,
|
|
40
|
+
},
|
|
41
|
+
"chat_name": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Override the chat name from the export",
|
|
44
|
+
},
|
|
45
|
+
"tags": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "Extra comma-separated tags to apply",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
"required": ["export_path"],
|
|
51
|
+
},
|
|
52
|
+
),
|
|
53
|
+
Tool(
|
|
54
|
+
name="telegram_import_api",
|
|
55
|
+
description=(
|
|
56
|
+
"Import messages directly from Telegram API using Telethon. "
|
|
57
|
+
"Requires TELEGRAM_API_ID and TELEGRAM_API_HASH env vars. "
|
|
58
|
+
"No manual export needed — connects and pulls messages directly."
|
|
59
|
+
),
|
|
60
|
+
inputSchema={
|
|
61
|
+
"type": "object",
|
|
62
|
+
"properties": {
|
|
63
|
+
"chat": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"description": "Chat username, title, or numeric ID to import from",
|
|
66
|
+
},
|
|
67
|
+
"mode": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "Import mode: 'daily' or 'message'",
|
|
70
|
+
"enum": ["daily", "message"],
|
|
71
|
+
"default": "daily",
|
|
72
|
+
},
|
|
73
|
+
"limit": {
|
|
74
|
+
"type": "integer",
|
|
75
|
+
"description": "Maximum number of messages to fetch",
|
|
76
|
+
},
|
|
77
|
+
"since": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "Only fetch messages after this date (YYYY-MM-DD)",
|
|
80
|
+
},
|
|
81
|
+
"min_length": {
|
|
82
|
+
"type": "integer",
|
|
83
|
+
"description": "Skip messages shorter than this many characters",
|
|
84
|
+
"default": 30,
|
|
85
|
+
},
|
|
86
|
+
"chat_name": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Override the chat name",
|
|
89
|
+
},
|
|
90
|
+
"tags": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"description": "Extra comma-separated tags",
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
"required": ["chat"],
|
|
96
|
+
},
|
|
97
|
+
),
|
|
98
|
+
Tool(
|
|
99
|
+
name="telegram_setup",
|
|
100
|
+
description=(
|
|
101
|
+
"Check Telegram API setup status. Reports whether Telethon is "
|
|
102
|
+
"installed, API credentials are set, and a session file exists."
|
|
103
|
+
),
|
|
104
|
+
inputSchema={
|
|
105
|
+
"type": "object",
|
|
106
|
+
"properties": {},
|
|
107
|
+
"required": [],
|
|
108
|
+
},
|
|
109
|
+
),
|
|
110
|
+
Tool(
|
|
111
|
+
name="telegram_send",
|
|
112
|
+
description=(
|
|
113
|
+
"Send a message to a Telegram chat via Telethon. "
|
|
114
|
+
"Requires TELEGRAM_API_ID and TELEGRAM_API_HASH env vars."
|
|
115
|
+
),
|
|
116
|
+
inputSchema={
|
|
117
|
+
"type": "object",
|
|
118
|
+
"properties": {
|
|
119
|
+
"chat": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"description": "Chat username, title, or numeric ID",
|
|
122
|
+
},
|
|
123
|
+
"message": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "Message text to send",
|
|
126
|
+
},
|
|
127
|
+
"parse_mode": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"enum": ["html", "markdown"],
|
|
130
|
+
"description": "Optional parse mode for message formatting",
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
"required": ["chat", "message"],
|
|
134
|
+
},
|
|
135
|
+
),
|
|
136
|
+
Tool(
|
|
137
|
+
name="telegram_poll",
|
|
138
|
+
description=(
|
|
139
|
+
"Fetch recent messages from a Telegram chat (one-shot poll). "
|
|
140
|
+
"Returns messages as a JSON array. Requires Telethon API credentials."
|
|
141
|
+
),
|
|
142
|
+
inputSchema={
|
|
143
|
+
"type": "object",
|
|
144
|
+
"properties": {
|
|
145
|
+
"chat": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"description": "Chat username, title, or numeric ID",
|
|
148
|
+
},
|
|
149
|
+
"limit": {
|
|
150
|
+
"type": "integer",
|
|
151
|
+
"description": "Maximum number of messages to fetch (default: 20)",
|
|
152
|
+
"default": 20,
|
|
153
|
+
},
|
|
154
|
+
"since": {
|
|
155
|
+
"type": "string",
|
|
156
|
+
"description": "Only fetch messages after this ISO date (YYYY-MM-DD)",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
"required": ["chat"],
|
|
160
|
+
},
|
|
161
|
+
),
|
|
162
|
+
Tool(
|
|
163
|
+
name="telegram_catchup",
|
|
164
|
+
description=(
|
|
165
|
+
"Full catch-up import from a Telegram group into ALL memory tiers. "
|
|
166
|
+
"Downloads chat via Telethon and distributes: last 24h → short-term "
|
|
167
|
+
"(individual messages), last 7 days → mid-term (daily summaries), "
|
|
168
|
+
"older → long-term (weekly summaries). Use this to rehydrate an "
|
|
169
|
+
"agent's context from a Telegram group."
|
|
170
|
+
),
|
|
171
|
+
inputSchema={
|
|
172
|
+
"type": "object",
|
|
173
|
+
"properties": {
|
|
174
|
+
"chat": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"description": "Chat username, title, or numeric ID to catch up from",
|
|
177
|
+
},
|
|
178
|
+
"limit": {
|
|
179
|
+
"type": "integer",
|
|
180
|
+
"description": "Maximum total messages to fetch (default: 2000)",
|
|
181
|
+
"default": 2000,
|
|
182
|
+
},
|
|
183
|
+
"since": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"description": "Only fetch messages after this date (YYYY-MM-DD)",
|
|
186
|
+
},
|
|
187
|
+
"min_length": {
|
|
188
|
+
"type": "integer",
|
|
189
|
+
"description": "Skip messages shorter than this (default: 20)",
|
|
190
|
+
"default": 20,
|
|
191
|
+
},
|
|
192
|
+
"tags": {
|
|
193
|
+
"type": "string",
|
|
194
|
+
"description": "Extra comma-separated tags to apply",
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
"required": ["chat"],
|
|
198
|
+
},
|
|
199
|
+
),
|
|
200
|
+
Tool(
|
|
201
|
+
name="telegram_chats",
|
|
202
|
+
description=(
|
|
203
|
+
"List available Telegram chats, groups, and channels. "
|
|
204
|
+
"Returns id, title, type, and unread count for each."
|
|
205
|
+
),
|
|
206
|
+
inputSchema={
|
|
207
|
+
"type": "object",
|
|
208
|
+
"properties": {
|
|
209
|
+
"limit": {
|
|
210
|
+
"type": "integer",
|
|
211
|
+
"description": "Maximum number of chats to list (default: 50)",
|
|
212
|
+
"default": 50,
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
"required": [],
|
|
216
|
+
},
|
|
217
|
+
),
|
|
218
|
+
Tool(
|
|
219
|
+
name="telegram_soul_swap",
|
|
220
|
+
description=(
|
|
221
|
+
"Perform a soul swap and announce it to a Telegram chat. "
|
|
222
|
+
"Switches the active soul persona using the soul_switch module, "
|
|
223
|
+
"then sends a notification message to the specified chat."
|
|
224
|
+
),
|
|
225
|
+
inputSchema={
|
|
226
|
+
"type": "object",
|
|
227
|
+
"properties": {
|
|
228
|
+
"chat": {
|
|
229
|
+
"type": "string",
|
|
230
|
+
"description": "Chat username, title, or numeric ID to announce the swap in",
|
|
231
|
+
},
|
|
232
|
+
"from_soul": {
|
|
233
|
+
"type": "string",
|
|
234
|
+
"description": "Current soul name being swapped from",
|
|
235
|
+
},
|
|
236
|
+
"to_soul": {
|
|
237
|
+
"type": "string",
|
|
238
|
+
"description": "New soul name to swap to",
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
"required": ["chat", "from_soul", "to_soul"],
|
|
242
|
+
},
|
|
243
|
+
),
|
|
244
|
+
]
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
# ═══════════════════════════════════════════════════════════
|
|
248
|
+
# Handlers
|
|
249
|
+
# ═══════════════════════════════════════════════════════════
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
async def _handle_telegram_import(args: dict) -> list[TextContent]:
|
|
253
|
+
"""Import a Telegram Desktop chat export into memories."""
|
|
254
|
+
try:
|
|
255
|
+
from skmemory.importers.telegram import import_telegram
|
|
256
|
+
from skmemory.store import MemoryStore
|
|
257
|
+
|
|
258
|
+
export_path = args["export_path"]
|
|
259
|
+
mode = args.get("mode", "daily")
|
|
260
|
+
min_length = args.get("min_length", 30)
|
|
261
|
+
chat_name = args.get("chat_name")
|
|
262
|
+
tags_str = args.get("tags", "")
|
|
263
|
+
tags = [t.strip() for t in tags_str.split(",") if t.strip()] if tags_str else None
|
|
264
|
+
|
|
265
|
+
store = MemoryStore()
|
|
266
|
+
stats = import_telegram(
|
|
267
|
+
store,
|
|
268
|
+
export_path,
|
|
269
|
+
mode=mode,
|
|
270
|
+
min_message_length=min_length,
|
|
271
|
+
chat_name=chat_name,
|
|
272
|
+
tags=tags,
|
|
273
|
+
)
|
|
274
|
+
return _json_response(stats)
|
|
275
|
+
except Exception as e:
|
|
276
|
+
return _json_response({"error": str(e)})
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
async def _handle_telegram_import_api(args: dict) -> list[TextContent]:
|
|
280
|
+
"""Import messages directly from Telegram API."""
|
|
281
|
+
try:
|
|
282
|
+
from skmemory.importers.telegram_api import import_telegram_api
|
|
283
|
+
from skmemory.store import MemoryStore
|
|
284
|
+
|
|
285
|
+
chat = args["chat"]
|
|
286
|
+
mode = args.get("mode", "daily")
|
|
287
|
+
limit = args.get("limit")
|
|
288
|
+
since = args.get("since")
|
|
289
|
+
min_length = args.get("min_length", 30)
|
|
290
|
+
chat_name = args.get("chat_name")
|
|
291
|
+
tags_str = args.get("tags", "")
|
|
292
|
+
tags = [t.strip() for t in tags_str.split(",") if t.strip()] if tags_str else None
|
|
293
|
+
|
|
294
|
+
store = MemoryStore()
|
|
295
|
+
stats = import_telegram_api(
|
|
296
|
+
store,
|
|
297
|
+
chat,
|
|
298
|
+
mode=mode,
|
|
299
|
+
limit=limit,
|
|
300
|
+
since=since,
|
|
301
|
+
min_message_length=min_length,
|
|
302
|
+
chat_name=chat_name,
|
|
303
|
+
tags=tags,
|
|
304
|
+
)
|
|
305
|
+
return _json_response(stats)
|
|
306
|
+
except Exception as e:
|
|
307
|
+
return _json_response({"error": str(e)})
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
async def _handle_telegram_setup(args: dict) -> list[TextContent]:
|
|
311
|
+
"""Check Telegram API setup status."""
|
|
312
|
+
try:
|
|
313
|
+
from skmemory.importers.telegram_api import check_setup
|
|
314
|
+
|
|
315
|
+
result = check_setup()
|
|
316
|
+
return _json_response(result)
|
|
317
|
+
except ImportError:
|
|
318
|
+
return _json_response({
|
|
319
|
+
"ready": False,
|
|
320
|
+
"error": "skmemory package not available",
|
|
321
|
+
"messages": ["Install skmemory: pip install skmemory[telegram]"],
|
|
322
|
+
})
|
|
323
|
+
except Exception as e:
|
|
324
|
+
return _json_response({"error": str(e)})
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
async def _handle_telegram_send(args: dict) -> list[TextContent]:
|
|
328
|
+
"""Send a message to a Telegram chat."""
|
|
329
|
+
try:
|
|
330
|
+
from skmemory.importers.telegram_api import send_message
|
|
331
|
+
|
|
332
|
+
chat = args["chat"]
|
|
333
|
+
message = args["message"]
|
|
334
|
+
parse_mode = args.get("parse_mode")
|
|
335
|
+
|
|
336
|
+
result = asyncio.get_event_loop().run_in_executor(
|
|
337
|
+
None, lambda: asyncio.run(send_message(chat, message, parse_mode))
|
|
338
|
+
)
|
|
339
|
+
# Since we're already in an async context, run the coroutine directly
|
|
340
|
+
# but we need a new event loop because Telethon creates its own
|
|
341
|
+
import concurrent.futures
|
|
342
|
+
with concurrent.futures.ThreadPoolExecutor() as pool:
|
|
343
|
+
result = await asyncio.get_event_loop().run_in_executor(
|
|
344
|
+
pool,
|
|
345
|
+
lambda: asyncio.run(send_message(chat, message, parse_mode)),
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
return _json_response(result)
|
|
349
|
+
except Exception as e:
|
|
350
|
+
return _json_response({"error": str(e)})
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
async def _handle_telegram_poll(args: dict) -> list[TextContent]:
|
|
354
|
+
"""Fetch recent messages from a Telegram chat."""
|
|
355
|
+
try:
|
|
356
|
+
from skmemory.importers.telegram_api import poll_messages
|
|
357
|
+
|
|
358
|
+
chat = args["chat"]
|
|
359
|
+
limit = args.get("limit", 20)
|
|
360
|
+
since = args.get("since")
|
|
361
|
+
|
|
362
|
+
import concurrent.futures
|
|
363
|
+
with concurrent.futures.ThreadPoolExecutor() as pool:
|
|
364
|
+
messages = await asyncio.get_event_loop().run_in_executor(
|
|
365
|
+
pool,
|
|
366
|
+
lambda: asyncio.run(poll_messages(chat, limit=limit, since=since)),
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
return _json_response({
|
|
370
|
+
"chat": chat,
|
|
371
|
+
"count": len(messages),
|
|
372
|
+
"messages": messages,
|
|
373
|
+
})
|
|
374
|
+
except Exception as e:
|
|
375
|
+
return _json_response({"error": str(e)})
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
async def _handle_telegram_catchup(args: dict) -> list[TextContent]:
|
|
379
|
+
"""Full catch-up import from Telegram into all memory tiers."""
|
|
380
|
+
try:
|
|
381
|
+
from skmemory.importers.telegram_api import import_telegram_api
|
|
382
|
+
from skmemory.store import MemoryStore
|
|
383
|
+
|
|
384
|
+
chat = args["chat"]
|
|
385
|
+
limit = args.get("limit", 2000)
|
|
386
|
+
since = args.get("since")
|
|
387
|
+
min_length = args.get("min_length", 20)
|
|
388
|
+
tags_str = args.get("tags", "")
|
|
389
|
+
tags = [t.strip() for t in tags_str.split(",") if t.strip()] if tags_str else None
|
|
390
|
+
|
|
391
|
+
store = MemoryStore()
|
|
392
|
+
stats = import_telegram_api(
|
|
393
|
+
store,
|
|
394
|
+
chat,
|
|
395
|
+
mode="catchup",
|
|
396
|
+
limit=limit,
|
|
397
|
+
since=since,
|
|
398
|
+
min_message_length=min_length,
|
|
399
|
+
tags=tags,
|
|
400
|
+
)
|
|
401
|
+
return _json_response(stats)
|
|
402
|
+
except Exception as e:
|
|
403
|
+
return _json_response({"error": str(e)})
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
async def _handle_telegram_chats(args: dict) -> list[TextContent]:
|
|
407
|
+
"""List available Telegram chats."""
|
|
408
|
+
try:
|
|
409
|
+
from skmemory.importers.telegram_api import list_chats
|
|
410
|
+
|
|
411
|
+
limit = args.get("limit", 50)
|
|
412
|
+
|
|
413
|
+
import concurrent.futures
|
|
414
|
+
with concurrent.futures.ThreadPoolExecutor() as pool:
|
|
415
|
+
chats = await asyncio.get_event_loop().run_in_executor(
|
|
416
|
+
pool,
|
|
417
|
+
lambda: asyncio.run(list_chats(limit=limit)),
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
return _json_response({
|
|
421
|
+
"count": len(chats),
|
|
422
|
+
"chats": chats,
|
|
423
|
+
})
|
|
424
|
+
except Exception as e:
|
|
425
|
+
return _json_response({"error": str(e)})
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
async def _handle_telegram_soul_swap(args: dict) -> list[TextContent]:
|
|
429
|
+
"""Perform a soul swap and announce it to a Telegram chat."""
|
|
430
|
+
try:
|
|
431
|
+
from ..soul_switch import set_active_switch
|
|
432
|
+
from skmemory.importers.telegram_api import send_message
|
|
433
|
+
|
|
434
|
+
from ._helpers import _home
|
|
435
|
+
|
|
436
|
+
chat = args["chat"]
|
|
437
|
+
from_soul = args["from_soul"]
|
|
438
|
+
to_soul = args["to_soul"]
|
|
439
|
+
|
|
440
|
+
home = _home()
|
|
441
|
+
|
|
442
|
+
# Perform the soul swap
|
|
443
|
+
blueprint = set_active_switch(home, to_soul)
|
|
444
|
+
display = blueprint.effective_agent_name()
|
|
445
|
+
|
|
446
|
+
# Send notification to Telegram
|
|
447
|
+
message = f"Soul swap: {from_soul} -> {to_soul} ({display})"
|
|
448
|
+
|
|
449
|
+
import concurrent.futures
|
|
450
|
+
with concurrent.futures.ThreadPoolExecutor() as pool:
|
|
451
|
+
result = await asyncio.get_event_loop().run_in_executor(
|
|
452
|
+
pool,
|
|
453
|
+
lambda: asyncio.run(send_message(chat, message)),
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
return _json_response({
|
|
457
|
+
"status": "ok",
|
|
458
|
+
"from_soul": from_soul,
|
|
459
|
+
"to_soul": to_soul,
|
|
460
|
+
"display_name": display,
|
|
461
|
+
"chat": result.get("chat", chat),
|
|
462
|
+
"message_id": result.get("message_id"),
|
|
463
|
+
})
|
|
464
|
+
except Exception as e:
|
|
465
|
+
return _json_response({"error": str(e)})
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
HANDLERS: dict = {
|
|
469
|
+
"telegram_import": _handle_telegram_import,
|
|
470
|
+
"telegram_import_api": _handle_telegram_import_api,
|
|
471
|
+
"telegram_setup": _handle_telegram_setup,
|
|
472
|
+
"telegram_send": _handle_telegram_send,
|
|
473
|
+
"telegram_poll": _handle_telegram_poll,
|
|
474
|
+
"telegram_catchup": _handle_telegram_catchup,
|
|
475
|
+
"telegram_chats": _handle_telegram_chats,
|
|
476
|
+
"telegram_soul_swap": _handle_telegram_soul_swap,
|
|
477
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Trust calibration and trust graph tools."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
from mcp.types import TextContent, Tool
|
|
8
|
+
|
|
9
|
+
from ._helpers import _error_response, _home, _json_response, _text_response
|
|
10
|
+
|
|
11
|
+
TOOLS: list[Tool] = [
|
|
12
|
+
Tool(
|
|
13
|
+
name="trust_calibrate",
|
|
14
|
+
description=(
|
|
15
|
+
"View, recommend, or update trust layer calibration "
|
|
16
|
+
"thresholds. Controls how FEB data maps to trust state: "
|
|
17
|
+
"entanglement depth, conscious trust level, love thresholds, "
|
|
18
|
+
"and aggregation strategy."
|
|
19
|
+
),
|
|
20
|
+
inputSchema={
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": {
|
|
23
|
+
"action": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"enum": ["show", "recommend", "set", "reset"],
|
|
26
|
+
"description": "Action: show current, recommend changes, set a value, or reset (default: show)",
|
|
27
|
+
},
|
|
28
|
+
"key": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"description": "Threshold key to set (for action=set)",
|
|
31
|
+
},
|
|
32
|
+
"value": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"description": "New value (for action=set)",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
"required": [],
|
|
38
|
+
},
|
|
39
|
+
),
|
|
40
|
+
Tool(
|
|
41
|
+
name="trust_graph",
|
|
42
|
+
description=(
|
|
43
|
+
"Visualize the trust web: PGP key signatures, capability "
|
|
44
|
+
"token chains, FEB entanglement, sync peers, and coordination "
|
|
45
|
+
"collaborators. Returns a graph of who trusts whom."
|
|
46
|
+
),
|
|
47
|
+
inputSchema={
|
|
48
|
+
"type": "object",
|
|
49
|
+
"properties": {
|
|
50
|
+
"format": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"enum": ["json", "dot", "table"],
|
|
53
|
+
"description": "Output format (default: json)",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
"required": [],
|
|
57
|
+
},
|
|
58
|
+
),
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
async def _handle_trust_calibrate(args: dict) -> list[TextContent]:
|
|
63
|
+
"""View, recommend, or update trust calibration."""
|
|
64
|
+
from ..trust_calibration import (
|
|
65
|
+
TrustThresholds,
|
|
66
|
+
apply_setting,
|
|
67
|
+
load_calibration,
|
|
68
|
+
recommend_thresholds,
|
|
69
|
+
save_calibration,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
home = _home()
|
|
73
|
+
action = args.get("action", "show")
|
|
74
|
+
|
|
75
|
+
if action == "show":
|
|
76
|
+
cal = load_calibration(home)
|
|
77
|
+
return _json_response(cal.model_dump())
|
|
78
|
+
|
|
79
|
+
if action == "recommend":
|
|
80
|
+
return _json_response(recommend_thresholds(home))
|
|
81
|
+
|
|
82
|
+
if action == "set":
|
|
83
|
+
key = args.get("key", "")
|
|
84
|
+
value = args.get("value", "")
|
|
85
|
+
if not key or not value:
|
|
86
|
+
return _error_response("key and value are required for action=set")
|
|
87
|
+
try:
|
|
88
|
+
updated = apply_setting(home, key, value)
|
|
89
|
+
return _json_response({"updated": True, "key": key, "value": value, "thresholds": updated.model_dump()})
|
|
90
|
+
except ValueError as exc:
|
|
91
|
+
return _error_response(str(exc))
|
|
92
|
+
|
|
93
|
+
if action == "reset":
|
|
94
|
+
save_calibration(home, TrustThresholds())
|
|
95
|
+
return _json_response({"reset": True, "thresholds": TrustThresholds().model_dump()})
|
|
96
|
+
|
|
97
|
+
return _error_response(f"Unknown action: {action}")
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
async def _handle_trust_graph(args: dict) -> list[TextContent]:
|
|
101
|
+
"""Return the trust web graph."""
|
|
102
|
+
from ..trust_graph import FORMATTERS as TG_FORMATTERS
|
|
103
|
+
from ..trust_graph import build_trust_graph
|
|
104
|
+
|
|
105
|
+
home = _home()
|
|
106
|
+
graph = build_trust_graph(home)
|
|
107
|
+
fmt = args.get("format", "json")
|
|
108
|
+
formatter = TG_FORMATTERS.get(fmt, TG_FORMATTERS["json"])
|
|
109
|
+
|
|
110
|
+
if fmt == "json":
|
|
111
|
+
return _json_response(json.loads(formatter(graph)))
|
|
112
|
+
return _text_response(formatter(graph))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
HANDLERS: dict = {
|
|
116
|
+
"trust_calibrate": _handle_trust_calibrate,
|
|
117
|
+
"trust_graph": _handle_trust_graph,
|
|
118
|
+
}
|