@smilintux/skcapstone 0.10.0 → 0.12.5
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 +10 -4
- package/.github/workflows/ci.yml +2 -2
- package/.github/workflows/publish.yml +9 -2
- package/.openclaw-workspace.json +2 -2
- package/CLAUDE.md +37 -0
- package/MISSION.md +17 -2
- package/README.md +282 -3
- package/docker/Dockerfile +7 -7
- package/docker/compose-templates/dev-team.yml +12 -12
- package/docker/compose-templates/mini-team.yml +9 -9
- package/docker/compose-templates/ops-team.yml +10 -10
- package/docker/compose-templates/research-team.yml +10 -10
- package/docker/entrypoint.sh +4 -4
- package/docs/ADR-optional-integration-backbone.md +181 -0
- package/docs/ARCHITECTURE.md +186 -43
- package/docs/BOND_WITH_GROK.md +6 -6
- package/docs/CUSTOM_AGENT.md +123 -30
- package/docs/DREAMING.md +70 -0
- package/docs/GETTING_STARTED.md +7 -7
- package/docs/QUICKSTART.md +10 -6
- package/docs/SKJOULE_ARCHITECTURE.md +3 -3
- package/docs/SOUL_SWAPPER.md +5 -5
- package/docs/hammertime-audit.md +402 -0
- package/docs/sk-integration-HANDOFF.md +117 -0
- package/docs/skscheduler.md +155 -0
- package/docs/superpowers/examples/jobs.yaml +31 -0
- package/docs/superpowers/plans/2026-06-08-skscheduler.md +1265 -0
- package/docs/superpowers/specs/2026-06-08-skscheduler-design.md +186 -0
- package/examples/custom-bond-template.json +1 -1
- package/examples/grok-feb.json +1 -1
- package/examples/queen-ava-feb.json +1 -1
- package/launchd/{com.skcapstone.skcomm-heartbeat.plist → com.skcapstone.skcomms-heartbeat.plist} +4 -4
- package/launchd/{com.skcapstone.skcomm-queue-drain.plist → com.skcapstone.skcomms-queue-drain.plist} +4 -4
- package/launchd/install-launchd.sh +6 -6
- package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/src/index.ts +3 -2
- package/package.json +1 -1
- package/pyproject.toml +16 -10
- package/scripts/archive-sessions.sh +7 -0
- package/scripts/check-updates.py +4 -4
- package/scripts/install-bundle.sh +8 -8
- package/scripts/install.ps1 +12 -11
- package/scripts/install.sh +159 -5
- package/scripts/model-fallback-monitor.sh +102 -0
- package/scripts/nvidia-proxy.mjs +78 -26
- package/scripts/refresh-anthropic-token.sh +172 -0
- package/scripts/release.sh +98 -0
- package/scripts/session-to-memory.py +219 -0
- package/scripts/skgateway.mjs +3 -3
- package/scripts/telegram-catchup-all.sh +12 -1
- package/scripts/verify_install.sh +2 -2
- package/scripts/wargov-ufo-capture/README.md +43 -0
- package/scripts/wargov-ufo-capture/cdp_capture_release2.py +273 -0
- package/scripts/wargov-ufo-capture/cdp_capture_splc_doj.py +246 -0
- package/scripts/wargov-ufo-capture/cdp_finish.py +271 -0
- package/scripts/wargov-ufo-capture/cdp_probe.py +188 -0
- package/scripts/wargov-ufo-capture/cdp_splc_pressrelease.py +101 -0
- package/scripts/wargov-ufo-capture/parse_csv.py +95 -0
- package/scripts/wargov-ufo-capture/pull_dvids.sh +107 -0
- package/scripts/watch-anthropic-token.sh +212 -0
- package/scripts/windows/install-tasks.ps1 +7 -7
- package/scripts/windows/skcapstone-task.xml +1 -1
- package/src/skcapstone/__init__.py +45 -3
- package/src/skcapstone/_cli_monolith.py +20 -15
- package/src/skcapstone/activity.py +5 -1
- package/src/skcapstone/agent_card.py +3 -2
- package/src/skcapstone/api.py +41 -40
- package/src/skcapstone/auction.py +14 -11
- package/src/skcapstone/backup.py +2 -1
- package/src/skcapstone/blueprint_registry.py +4 -3
- package/src/skcapstone/brain_first.py +238 -0
- package/src/skcapstone/changelog.py +1 -1
- package/src/skcapstone/chat.py +22 -17
- package/src/skcapstone/cli/__init__.py +9 -1
- package/src/skcapstone/cli/_common.py +1 -0
- package/src/skcapstone/cli/agents_spawner.py +5 -2
- package/src/skcapstone/cli/alerts.py +25 -4
- package/src/skcapstone/cli/bench.py +15 -15
- package/src/skcapstone/cli/chat.py +7 -4
- package/src/skcapstone/cli/consciousness.py +5 -2
- package/src/skcapstone/cli/context_cmd.py +18 -4
- package/src/skcapstone/cli/daemon.py +11 -7
- package/src/skcapstone/cli/gtd.py +26 -1
- package/src/skcapstone/cli/housekeeping.py +3 -3
- package/src/skcapstone/cli/identity_cmd.py +378 -0
- package/src/skcapstone/cli/joule_cmd.py +7 -3
- package/src/skcapstone/cli/memory.py +8 -6
- package/src/skcapstone/cli/peers_dir.py +1 -1
- package/src/skcapstone/cli/register_cmd.py +29 -3
- package/src/skcapstone/cli/scheduler_cmd.py +167 -0
- package/src/skcapstone/cli/session.py +25 -0
- package/src/skcapstone/cli/setup.py +96 -29
- package/src/skcapstone/cli/shell_cmd.py +53 -1
- package/src/skcapstone/cli/skills_cmd.py +2 -2
- package/src/skcapstone/cli/soul.py +8 -5
- package/src/skcapstone/cli/status.py +37 -11
- package/src/skcapstone/cli/telegram.py +21 -0
- package/src/skcapstone/cli/test_cmd.py +5 -5
- package/src/skcapstone/cli/test_connection.py +2 -2
- package/src/skcapstone/cli/upgrade_cmd.py +23 -14
- package/src/skcapstone/cli/version_cmd.py +1 -1
- package/src/skcapstone/cli/watch_cmd.py +9 -6
- package/src/skcapstone/cloud9_bridge.py +14 -14
- package/src/skcapstone/codex_setup.py +255 -0
- package/src/skcapstone/config_validator.py +7 -4
- package/src/skcapstone/consciousness_config.py +5 -1
- package/src/skcapstone/consciousness_loop.py +313 -273
- package/src/skcapstone/context_loader.py +121 -0
- package/src/skcapstone/coord_federation.py +2 -1
- package/src/skcapstone/coordination.py +23 -6
- package/src/skcapstone/crush_integration.py +2 -1
- package/src/skcapstone/daemon.py +132 -77
- package/src/skcapstone/dashboard.py +10 -10
- package/src/skcapstone/data/sk-agent-picker.sh +421 -0
- package/src/skcapstone/data/systemd/skcapstone-api.socket +9 -0
- package/src/skcapstone/data/systemd/skcapstone-memory-compress.service +18 -0
- package/src/skcapstone/data/systemd/skcapstone-memory-compress.timer +11 -0
- package/src/skcapstone/data/systemd/skcapstone.service +37 -0
- package/src/skcapstone/data/systemd/skcapstone@.service +50 -0
- package/src/skcapstone/data/systemd/skcomms-heartbeat.service +18 -0
- package/{systemd/skcomm-heartbeat.timer → src/skcapstone/data/systemd/skcomms-heartbeat.timer} +2 -2
- package/src/skcapstone/data/systemd/skcomms-queue-drain.service +17 -0
- package/{systemd/skcomm-queue-drain.timer → src/skcapstone/data/systemd/skcomms-queue-drain.timer} +2 -2
- package/src/skcapstone/defaults/claude/CLAUDE.md +67 -0
- package/src/skcapstone/defaults/claude/settings.json +74 -0
- package/src/skcapstone/defaults/lumina/config/claude-hooks.md +57 -0
- package/src/skcapstone/defaults/lumina/config/skgraph.yaml +55 -10
- package/src/skcapstone/defaults/lumina/config/skmemory.yaml +79 -13
- package/src/skcapstone/defaults/lumina/config/skvector.yaml +60 -9
- package/src/skcapstone/defaults/lumina/memory/long-term/18b9c0d1e2f3-cloud9-protocol.json +2 -2
- package/src/skcapstone/defaults/lumina/memory/long-term/a1b2c3d4e5f6-ecosystem-overview.json +2 -2
- package/src/skcapstone/defaults/lumina/memory/long-term/b2c3d4e5f6a7-five-pillars.json +9 -9
- package/src/skcapstone/defaults/lumina/memory/long-term/d4e5f6a7b8c9-site-directory.json +2 -2
- package/src/skcapstone/defaults/unhinged.json +13 -0
- package/src/skcapstone/discovery.py +43 -20
- package/src/skcapstone/doctor.py +941 -22
- package/src/skcapstone/dreaming.py +1183 -109
- package/src/skcapstone/emotion_tracker.py +2 -2
- package/src/skcapstone/export.py +4 -3
- package/src/skcapstone/fuse_mount.py +14 -12
- package/src/skcapstone/gui_installer.py +2 -2
- package/src/skcapstone/heartbeat.py +1 -1
- package/src/skcapstone/housekeeping.py +14 -14
- package/src/skcapstone/install_wizard.py +209 -7
- package/src/skcapstone/itil.py +13 -4
- package/src/skcapstone/kms_scheduler.py +10 -8
- package/src/skcapstone/launchd.py +19 -19
- package/src/skcapstone/mcp_launcher.py +15 -1
- package/src/skcapstone/mcp_server.py +83 -49
- package/src/skcapstone/mcp_tools/__init__.py +2 -0
- package/src/skcapstone/mcp_tools/_helpers.py +2 -2
- package/src/skcapstone/mcp_tools/ansible_tools.py +7 -4
- package/src/skcapstone/mcp_tools/brain_first_tools.py +90 -0
- package/src/skcapstone/mcp_tools/capauth_tools.py +7 -4
- package/src/skcapstone/mcp_tools/comm_tools.py +10 -10
- package/src/skcapstone/mcp_tools/coord_tools.py +8 -4
- package/src/skcapstone/mcp_tools/did_tools.py +11 -8
- package/src/skcapstone/mcp_tools/gtd_tools.py +4 -4
- package/src/skcapstone/mcp_tools/memory_tools.py +6 -2
- package/src/skcapstone/mcp_tools/notification_tools.py +22 -6
- package/src/skcapstone/mcp_tools/{skcomm_tools.py → skcomms_tools.py} +14 -14
- package/src/skcapstone/mcp_tools/soul_tools.py +8 -2
- package/src/skcapstone/mdns_discovery.py +2 -2
- package/src/skcapstone/memory_curator.py +1 -1
- package/src/skcapstone/memory_engine.py +10 -3
- package/src/skcapstone/metrics.py +30 -16
- package/src/skcapstone/migrate_memories.py +4 -3
- package/src/skcapstone/migrate_multi_agent.py +8 -7
- package/src/skcapstone/models.py +47 -5
- package/src/skcapstone/notifications.py +42 -18
- package/src/skcapstone/onboard.py +875 -121
- package/src/skcapstone/operator_link.py +170 -0
- package/src/skcapstone/peer_directory.py +4 -4
- package/src/skcapstone/peers.py +19 -19
- package/src/skcapstone/pillars/__init__.py +7 -5
- package/src/skcapstone/pillars/consciousness.py +191 -0
- package/src/skcapstone/pillars/identity.py +51 -7
- package/src/skcapstone/pillars/memory.py +9 -3
- package/src/skcapstone/pillars/sync.py +2 -2
- package/src/skcapstone/preflight.py +3 -3
- package/src/skcapstone/providers/docker.py +28 -28
- package/src/skcapstone/register.py +6 -6
- package/src/skcapstone/registry_client.py +5 -4
- package/src/skcapstone/runtime.py +14 -3
- package/src/skcapstone/scheduled_tasks.py +254 -19
- package/src/skcapstone/scheduler_jobs.py +456 -0
- package/src/skcapstone/scheduler_runner.py +239 -0
- package/src/skcapstone/scheduler_state.py +162 -0
- package/src/skcapstone/sdk.py +310 -0
- package/src/skcapstone/service_health.py +279 -39
- package/src/skcapstone/session_briefing.py +108 -0
- package/src/skcapstone/session_capture.py +1 -1
- package/src/skcapstone/shell.py +7 -1
- package/src/skcapstone/soul.py +3 -1
- package/src/skcapstone/soul_switch.py +3 -1
- package/src/skcapstone/summary.py +6 -6
- package/src/skcapstone/sync_engine.py +15 -15
- package/src/skcapstone/sync_watcher.py +2 -2
- package/src/skcapstone/systemd.py +55 -21
- package/src/skcapstone/team_comms.py +8 -8
- package/src/skcapstone/team_engine.py +1 -1
- package/src/skcapstone/testrunner.py +3 -3
- package/src/skcapstone/trust_graph.py +40 -5
- package/src/skcapstone/unified_search.py +15 -6
- package/src/skcapstone/uninstall_wizard.py +11 -3
- package/src/skcapstone/version_check.py +8 -4
- package/src/skcapstone/warmth_anchor.py +4 -2
- package/src/skcapstone/whoami.py +4 -4
- package/systemd/skcapstone.service +4 -6
- package/systemd/skcapstone@.service +7 -8
- package/systemd/skcomms-heartbeat.service +21 -0
- package/systemd/skcomms-heartbeat.timer +12 -0
- package/systemd/skcomms-queue-drain.service +17 -0
- package/systemd/skcomms-queue-drain.timer +12 -0
- package/tests/conftest.py +39 -0
- package/tests/integration/test_consciousness_e2e.py +39 -39
- package/tests/test_agent_card.py +1 -1
- package/tests/test_agent_home_scaffold.py +34 -0
- package/tests/test_alerts_consumer_topics.py +27 -0
- package/tests/test_backup.py +2 -1
- package/tests/test_chat.py +6 -6
- package/tests/test_claude_md.py +2 -2
- package/tests/test_cli_skills.py +10 -10
- package/tests/test_cli_test_cmd.py +4 -4
- package/tests/test_cli_test_connection.py +1 -1
- package/tests/test_cloud9_bridge.py +6 -6
- package/tests/test_consciousness_e2e.py +1 -1
- package/tests/test_consciousness_loop.py +10 -10
- package/tests/test_coordination.py +25 -0
- package/tests/test_cross_package.py +21 -21
- package/tests/test_daemon.py +4 -4
- package/tests/test_daemon_shutdown.py +1 -1
- package/tests/test_docker_provider.py +29 -29
- package/tests/test_doctor.py +400 -0
- package/tests/test_doctor_skscheduler.py +50 -0
- package/tests/test_dreaming_engine.py +147 -0
- package/tests/test_dreaming_gtd_capture.py +35 -0
- package/tests/test_e2e_automated.py +8 -5
- package/tests/test_fuse_mount.py +10 -10
- package/tests/test_gtd_brief.py +46 -0
- package/tests/test_gtd_malformed_tolerance.py +31 -0
- package/tests/test_housekeeping.py +15 -15
- package/tests/test_identity_migrate.py +251 -0
- package/tests/test_integration_backbone.py +598 -0
- package/tests/test_itil_gtd_lifecycle.py +37 -0
- package/tests/test_jobs_dropins.py +84 -0
- package/tests/test_mcp_server.py +82 -37
- package/tests/test_models.py +48 -4
- package/tests/test_multi_agent.py +31 -29
- package/tests/test_notifications.py +122 -32
- package/tests/test_onboard.py +63 -75
- package/tests/test_operator_link.py +78 -0
- package/tests/test_peers.py +14 -14
- package/tests/test_pillars.py +98 -0
- package/tests/test_preflight.py +3 -3
- package/tests/test_runtime.py +21 -0
- package/tests/test_scheduled_tasks.py +11 -6
- package/tests/test_scheduler_cli.py +47 -0
- package/tests/test_scheduler_features.py +133 -0
- package/tests/test_scheduler_integration.py +87 -0
- package/tests/test_scheduler_jobs.py +155 -0
- package/tests/test_scheduler_runner.py +64 -0
- package/tests/test_scheduler_state.py +57 -0
- package/tests/test_sdk.py +70 -0
- package/tests/test_service_health_incidents.py +34 -0
- package/tests/test_service_registry.py +52 -0
- package/tests/test_session_briefing.py +130 -0
- package/tests/test_snapshots.py +4 -4
- package/tests/test_sync_pipeline.py +26 -26
- package/tests/test_team_comms.py +2 -2
- package/tests/test_testrunner.py +2 -2
- package/tests/test_trust_graph.py +18 -0
- package/tests/test_unified_search.py +2 -2
- package/tests/test_version_check.py +10 -0
- package/tests/test_version_cmd.py +8 -8
- package/tests/test_whoami.py +1 -1
- package/systemd/skcomm-heartbeat.service +0 -18
- package/systemd/skcomm-queue-drain.service +0 -17
- /package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/package.json +0 -0
- /package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/src/openclaw.plugin.json +0 -0
|
@@ -175,7 +175,7 @@ def gpg_encrypt(
|
|
|
175
175
|
recipient = _detect_gpg_key(agent_home)
|
|
176
176
|
|
|
177
177
|
if recipient is None:
|
|
178
|
-
logger.
|
|
178
|
+
logger.warning("No GPG key found for encryption — skipping")
|
|
179
179
|
return None
|
|
180
180
|
|
|
181
181
|
# Build recipient list: own key + all known peers
|
|
@@ -208,7 +208,7 @@ def gpg_encrypt(
|
|
|
208
208
|
)
|
|
209
209
|
return encrypted_path
|
|
210
210
|
except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as exc:
|
|
211
|
-
logger.
|
|
211
|
+
logger.warning("GPG encryption failed (key may be missing): %s", exc)
|
|
212
212
|
return None
|
|
213
213
|
|
|
214
214
|
|
|
@@ -489,15 +489,15 @@ class PreflightChecker:
|
|
|
489
489
|
)
|
|
490
490
|
|
|
491
491
|
def check_packages(self) -> CheckResult:
|
|
492
|
-
"""Verify skcapstone, skseed, and
|
|
492
|
+
"""Verify skcapstone, skseed, and skcomms are importable."""
|
|
493
493
|
missing = []
|
|
494
|
-
for pkg in ("skcapstone", "skseed", "
|
|
494
|
+
for pkg in ("skcapstone", "skseed", "skcomms"):
|
|
495
495
|
try:
|
|
496
496
|
__import__(pkg)
|
|
497
497
|
except ImportError:
|
|
498
498
|
missing.append(pkg)
|
|
499
499
|
if not missing:
|
|
500
|
-
return CheckResult("packages", "ok", "skcapstone, skseed,
|
|
500
|
+
return CheckResult("packages", "ok", "skcapstone, skseed, skcomms all importable")
|
|
501
501
|
return CheckResult(
|
|
502
502
|
"packages", "fail",
|
|
503
503
|
f"Missing packages: {', '.join(missing)}",
|
|
@@ -12,14 +12,14 @@ agent container:
|
|
|
12
12
|
2. **MCP Server** — host-side skcapstone MCP reachable via env
|
|
13
13
|
(SKCAPSTONE_MCP_HOST / SKCAPSTONE_MCP_SOCKET). Set one of these so
|
|
14
14
|
containers can call memory_store, coord_claim, etc.
|
|
15
|
-
3. **
|
|
15
|
+
3. **SKComms Transport** — comms directory bind-mounted at /skcomms so
|
|
16
16
|
containers share the same file-channel inboxes as local agents.
|
|
17
17
|
|
|
18
18
|
Prerequisites:
|
|
19
19
|
- Docker daemon running and accessible (DOCKER_HOST or default socket)
|
|
20
20
|
- docker Python SDK: pip install docker
|
|
21
21
|
- Optional: DOCKER_BASE_IMAGE env var to override the default image
|
|
22
|
-
- Optional:
|
|
22
|
+
- Optional: SKCOMMS_HOME env var for the comms directory
|
|
23
23
|
- Optional: SKCAPSTONE_MCP_HOST env var (host:port) or
|
|
24
24
|
SKCAPSTONE_MCP_SOCKET env var (unix socket path)
|
|
25
25
|
"""
|
|
@@ -83,8 +83,8 @@ class DockerProvider(ProviderBackend):
|
|
|
83
83
|
|
|
84
84
|
Sovereign infrastructure wiring
|
|
85
85
|
--------------------------------
|
|
86
|
-
- **
|
|
87
|
-
the comms directory at ``/
|
|
86
|
+
- **SKComms**: pass ``skcomms_home`` (or set SKCOMMS_HOME) to bind-mount
|
|
87
|
+
the comms directory at ``/skcomms`` inside every container so
|
|
88
88
|
container agents share the same file-channel inboxes.
|
|
89
89
|
- **MCP server**: pass ``mcp_host`` (host:port) or ``mcp_socket_path``
|
|
90
90
|
to inject the skcapstone MCP endpoint into container env. Containers
|
|
@@ -96,8 +96,8 @@ class DockerProvider(ProviderBackend):
|
|
|
96
96
|
volume_prefix: Prefix for named volumes created per agent.
|
|
97
97
|
docker_host: Docker daemon socket/URL (default: DOCKER_HOST or
|
|
98
98
|
``unix:///var/run/docker.sock``).
|
|
99
|
-
|
|
100
|
-
``/
|
|
99
|
+
skcomms_home: Host-side SKComms comms root directory; bind-mounted at
|
|
100
|
+
``/skcomms`` inside containers. Reads SKCOMMS_HOME if not set.
|
|
101
101
|
mcp_host: Host:port of the skcapstone MCP server (e.g.
|
|
102
102
|
``"host-gateway:8765"``). Sets SKCAPSTONE_MCP_HOST inside
|
|
103
103
|
containers. Reads SKCAPSTONE_MCP_HOST env if not set.
|
|
@@ -115,7 +115,7 @@ class DockerProvider(ProviderBackend):
|
|
|
115
115
|
network_name: str = "skcapstone",
|
|
116
116
|
volume_prefix: str = "skcapstone-agent",
|
|
117
117
|
docker_host: Optional[str] = None,
|
|
118
|
-
|
|
118
|
+
skcomms_home: Optional[str] = None,
|
|
119
119
|
mcp_host: Optional[str] = None,
|
|
120
120
|
mcp_socket_path: Optional[str] = None,
|
|
121
121
|
) -> None:
|
|
@@ -126,7 +126,7 @@ class DockerProvider(ProviderBackend):
|
|
|
126
126
|
self._network_name = network_name
|
|
127
127
|
self._volume_prefix = volume_prefix
|
|
128
128
|
self._docker_host = docker_host or os.environ.get("DOCKER_HOST", "")
|
|
129
|
-
self.
|
|
129
|
+
self._skcomms_home = skcomms_home or os.environ.get("SKCOMMS_HOME", "")
|
|
130
130
|
self._mcp_host = mcp_host or os.environ.get("SKCAPSTONE_MCP_HOST", "")
|
|
131
131
|
self._mcp_socket_path = (
|
|
132
132
|
mcp_socket_path or os.environ.get("SKCAPSTONE_MCP_SOCKET", "")
|
|
@@ -229,7 +229,7 @@ class DockerProvider(ProviderBackend):
|
|
|
229
229
|
def _build_sovereign_env(self, env_vars: Dict[str, str]) -> None:
|
|
230
230
|
"""Inject sovereign infrastructure env vars into the env dict in-place.
|
|
231
231
|
|
|
232
|
-
Adds MCP server endpoint and
|
|
232
|
+
Adds MCP server endpoint and SKComms home when configured so
|
|
233
233
|
container agents can reach the host-side sovereign stack.
|
|
234
234
|
|
|
235
235
|
Args:
|
|
@@ -239,14 +239,14 @@ class DockerProvider(ProviderBackend):
|
|
|
239
239
|
env_vars["SKCAPSTONE_MCP_HOST"] = self._mcp_host
|
|
240
240
|
if self._mcp_socket_path:
|
|
241
241
|
env_vars["SKCAPSTONE_MCP_SOCKET"] = _MCP_CONTAINER_SOCKET
|
|
242
|
-
if self.
|
|
243
|
-
env_vars["
|
|
242
|
+
if self._skcomms_home:
|
|
243
|
+
env_vars["SKCOMMS_HOME"] = "/skcomms"
|
|
244
244
|
|
|
245
245
|
def _build_volumes_config(self, volume_name: str) -> Dict[str, Any]:
|
|
246
246
|
"""Build the volumes dict for containers.create().
|
|
247
247
|
|
|
248
248
|
Always includes the per-agent named volume at /agent.
|
|
249
|
-
Optionally adds a bind mount for the
|
|
249
|
+
Optionally adds a bind mount for the SKComms comms directory.
|
|
250
250
|
|
|
251
251
|
Args:
|
|
252
252
|
volume_name: Named Docker volume for agent state.
|
|
@@ -257,8 +257,8 @@ class DockerProvider(ProviderBackend):
|
|
|
257
257
|
vols: Dict[str, Any] = {
|
|
258
258
|
volume_name: {"bind": "/agent", "mode": "rw"},
|
|
259
259
|
}
|
|
260
|
-
if self.
|
|
261
|
-
vols[self.
|
|
260
|
+
if self._skcomms_home and Path(self._skcomms_home).exists():
|
|
261
|
+
vols[self._skcomms_home] = {"bind": "/skcomms", "mode": "rw"}
|
|
262
262
|
if self._mcp_socket_path and Path(self._mcp_socket_path).exists():
|
|
263
263
|
vols[self._mcp_socket_path] = {
|
|
264
264
|
"bind": _MCP_CONTAINER_SOCKET,
|
|
@@ -280,7 +280,7 @@ class DockerProvider(ProviderBackend):
|
|
|
280
280
|
|
|
281
281
|
The container is created but NOT started here; start() does that.
|
|
282
282
|
Resource limits (CPU, memory) are applied from spec.resources.
|
|
283
|
-
|
|
283
|
+
SKComms and MCP sovereign infrastructure are wired in when
|
|
284
284
|
configured on this provider.
|
|
285
285
|
|
|
286
286
|
Args:
|
|
@@ -307,8 +307,8 @@ class DockerProvider(ProviderBackend):
|
|
|
307
307
|
old = client.containers.get(container_name)
|
|
308
308
|
logger.warning("Removing stale container: %s", container_name)
|
|
309
309
|
old.remove(force=True)
|
|
310
|
-
except Exception:
|
|
311
|
-
|
|
310
|
+
except Exception as exc:
|
|
311
|
+
logger.debug("No stale container to remove for %s (expected if first run): %s", container_name, exc)
|
|
312
312
|
|
|
313
313
|
# Ensure named volume for agent state persistence
|
|
314
314
|
try:
|
|
@@ -330,7 +330,7 @@ class DockerProvider(ProviderBackend):
|
|
|
330
330
|
env_vars["SOUL_BLUEPRINT"] = spec.soul_blueprint
|
|
331
331
|
env_vars.update(spec.env)
|
|
332
332
|
|
|
333
|
-
# Wire sovereign infrastructure (MCP +
|
|
333
|
+
# Wire sovereign infrastructure (MCP + SKComms)
|
|
334
334
|
self._build_sovereign_env(env_vars)
|
|
335
335
|
|
|
336
336
|
volumes_config = self._build_volumes_config(volume_name)
|
|
@@ -620,9 +620,9 @@ class DockerProvider(ProviderBackend):
|
|
|
620
620
|
Resource limits, environment variables, and soul blueprint paths
|
|
621
621
|
are all included.
|
|
622
622
|
|
|
623
|
-
When ``
|
|
624
|
-
output includes a named ``
|
|
625
|
-
``/
|
|
623
|
+
When ``skcomms_home`` is configured on the provider the compose
|
|
624
|
+
output includes a named ``skcomms-data`` volume and mounts it at
|
|
625
|
+
``/skcomms`` in every agent service.
|
|
626
626
|
|
|
627
627
|
When ``include_mcp_service=True`` a ``skcapstone-mcp`` sidecar
|
|
628
628
|
service is added; all agent containers receive ``SKCAPSTONE_MCP_HOST``
|
|
@@ -663,9 +663,9 @@ class DockerProvider(ProviderBackend):
|
|
|
663
663
|
}
|
|
664
664
|
volumes["skcapstone-mcp-data"] = {}
|
|
665
665
|
|
|
666
|
-
|
|
667
|
-
if
|
|
668
|
-
volumes["
|
|
666
|
+
has_skcomms = bool(self._skcomms_home)
|
|
667
|
+
if has_skcomms:
|
|
668
|
+
volumes["skcomms-data"] = {}
|
|
669
669
|
|
|
670
670
|
for agent_key, spec in blueprint.agents.items():
|
|
671
671
|
for idx in range(spec.count):
|
|
@@ -690,12 +690,12 @@ class DockerProvider(ProviderBackend):
|
|
|
690
690
|
elif self._mcp_host:
|
|
691
691
|
env["SKCAPSTONE_MCP_HOST"] = self._mcp_host
|
|
692
692
|
|
|
693
|
-
if
|
|
694
|
-
env["
|
|
693
|
+
if has_skcomms:
|
|
694
|
+
env["SKCOMMS_HOME"] = "/skcomms"
|
|
695
695
|
|
|
696
696
|
svc_volumes = [f"{volume_name}:/agent"]
|
|
697
|
-
if
|
|
698
|
-
svc_volumes.append("
|
|
697
|
+
if has_skcomms:
|
|
698
|
+
svc_volumes.append("skcomms-data:/skcomms")
|
|
699
699
|
|
|
700
700
|
deploy_limits: Dict[str, Any] = {
|
|
701
701
|
"resources": {
|
|
@@ -63,11 +63,11 @@ def _build_package_registry(workspace: Optional[Path] = None) -> list[dict]:
|
|
|
63
63
|
"openclaw_plugin_path": workspace / "skcapstone" / "openclaw-plugin" / "src" / "index.ts",
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
"name": "
|
|
67
|
-
"mcp_cmd": "
|
|
66
|
+
"name": "skcomms",
|
|
67
|
+
"mcp_cmd": "skcomms-mcp",
|
|
68
68
|
"mcp_args": [],
|
|
69
69
|
"mcp_env": None,
|
|
70
|
-
"openclaw_plugin_path": workspace / "pillar-repos" / "
|
|
70
|
+
"openclaw_plugin_path": workspace / "pillar-repos" / "skcomms" / "openclaw-plugin" / "src" / "index.ts",
|
|
71
71
|
},
|
|
72
72
|
{
|
|
73
73
|
"name": "skchat",
|
|
@@ -88,7 +88,7 @@ def _build_package_registry(workspace: Optional[Path] = None) -> list[dict]:
|
|
|
88
88
|
"mcp_cmd": None,
|
|
89
89
|
"mcp_args": None,
|
|
90
90
|
"mcp_env": None,
|
|
91
|
-
"openclaw_plugin_path": workspace / "pillar-repos" / "cloud9
|
|
91
|
+
"openclaw_plugin_path": workspace / "pillar-repos" / "cloud9" / "openclaw-plugin-python" / "src" / "index.ts",
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
94
|
"name": "sksecurity",
|
|
@@ -121,10 +121,10 @@ def _build_package_registry(workspace: Optional[Path] = None) -> list[dict]:
|
|
|
121
121
|
_PILLAR_DIR_MAP: dict[str, Optional[str]] = {
|
|
122
122
|
"skmemory": "skmemory",
|
|
123
123
|
"skcapstone": None, # lives in workspace root, not pillar-repos
|
|
124
|
-
"
|
|
124
|
+
"skcomms": "skcomms",
|
|
125
125
|
"skchat": "skchat",
|
|
126
126
|
"capauth": "capauth",
|
|
127
|
-
"cloud9": "cloud9
|
|
127
|
+
"cloud9": "cloud9",
|
|
128
128
|
"sksecurity": "sksecurity",
|
|
129
129
|
"skseed": "skseed",
|
|
130
130
|
"skgit": None, # skill dir only, no pillar repo
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Wraps the skskills RemoteRegistry client to provide a clean interface for
|
|
4
4
|
skcapstone MCP tools and CLI commands to interact with the remote
|
|
5
|
-
skills-registry at
|
|
5
|
+
skills-registry at skskills.skworld.io.
|
|
6
6
|
|
|
7
7
|
This module is the integration point between:
|
|
8
|
-
- skills-registry/ (FastAPI server at
|
|
8
|
+
- skills-registry/ (FastAPI server at skskills.skworld.io/api)
|
|
9
9
|
- skskills.remote.RemoteRegistry (HTTP client)
|
|
10
10
|
- skcapstone discovery.py (local skill discovery)
|
|
11
11
|
|
|
@@ -27,7 +27,7 @@ from typing import Any, Optional
|
|
|
27
27
|
|
|
28
28
|
logger = logging.getLogger(__name__)
|
|
29
29
|
|
|
30
|
-
DEFAULT_REGISTRY_URL = "https://
|
|
30
|
+
DEFAULT_REGISTRY_URL = "https://skskills.skworld.io/api"
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class RegistryClient:
|
|
@@ -63,7 +63,8 @@ class RegistryClient:
|
|
|
63
63
|
try:
|
|
64
64
|
self._remote.fetch_index(force=True)
|
|
65
65
|
return True
|
|
66
|
-
except Exception:
|
|
66
|
+
except Exception as e:
|
|
67
|
+
logger.warning("registry_client.py: %s", e)
|
|
67
68
|
return False
|
|
68
69
|
|
|
69
70
|
def list_skills(self) -> list[dict[str, Any]]:
|
|
@@ -94,10 +94,14 @@ class AgentRuntime:
|
|
|
94
94
|
logger.info("Awakening agent from %s (shared: %s)", self.home, self.shared_root)
|
|
95
95
|
|
|
96
96
|
manifest_file = self.home / "manifest.json"
|
|
97
|
+
manifest_name_loaded = False
|
|
97
98
|
if manifest_file.exists():
|
|
98
99
|
try:
|
|
99
100
|
data = json.loads(manifest_file.read_text(encoding="utf-8"))
|
|
100
|
-
|
|
101
|
+
manifest_name = data.get("name")
|
|
102
|
+
if manifest_name:
|
|
103
|
+
self.manifest.name = manifest_name
|
|
104
|
+
manifest_name_loaded = True
|
|
101
105
|
if data.get("created_at"):
|
|
102
106
|
self.manifest.created_at = datetime.fromisoformat(data["created_at"])
|
|
103
107
|
connectors_data = data.get("connectors", [])
|
|
@@ -105,17 +109,24 @@ class AgentRuntime:
|
|
|
105
109
|
except (json.JSONDecodeError, ValueError) as exc:
|
|
106
110
|
logger.warning("Failed to load manifest: %s", exc)
|
|
107
111
|
|
|
108
|
-
self.manifest.name = self.config.agent_name
|
|
109
|
-
|
|
110
112
|
# Discover pillars from per-agent home
|
|
111
113
|
pillars = discover_all(self.home, shared_root=self.shared_root)
|
|
112
114
|
self.manifest.identity = pillars["identity"]
|
|
113
115
|
self.manifest.memory = pillars["memory"]
|
|
114
116
|
self.manifest.trust = pillars["trust"]
|
|
117
|
+
self.manifest.consciousness = pillars["consciousness"]
|
|
115
118
|
self.manifest.security = pillars["security"]
|
|
116
119
|
self.manifest.sync = pillars["sync"]
|
|
117
120
|
self.manifest.skills = pillars["skills"]
|
|
118
121
|
|
|
122
|
+
if (
|
|
123
|
+
self.manifest.identity.name
|
|
124
|
+
and self.manifest.identity.status == PillarStatus.ACTIVE
|
|
125
|
+
):
|
|
126
|
+
self.manifest.name = self.manifest.identity.name
|
|
127
|
+
elif not manifest_name_loaded and self.config.agent_name:
|
|
128
|
+
self.manifest.name = self.config.agent_name
|
|
129
|
+
|
|
119
130
|
self.manifest.last_awakened = datetime.now(timezone.utc)
|
|
120
131
|
self._awakened = True
|
|
121
132
|
|