edgecitadel 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edgecitadel-0.1.0/.env.example +32 -0
- edgecitadel-0.1.0/.gitignore +89 -0
- edgecitadel-0.1.0/PKG-INFO +147 -0
- edgecitadel-0.1.0/README.md +129 -0
- edgecitadel-0.1.0/aggregator/CLAUDE.md +25 -0
- edgecitadel-0.1.0/aggregator/Dockerfile +12 -0
- edgecitadel-0.1.0/aggregator/__init__.py +0 -0
- edgecitadel-0.1.0/aggregator/aggregator.py +498 -0
- edgecitadel-0.1.0/aggregator/database.py +495 -0
- edgecitadel-0.1.0/aggregator/jetstream_bootstrap.py +18 -0
- edgecitadel-0.1.0/aggregator/lab_inventory.py +293 -0
- edgecitadel-0.1.0/aggregator/liveness.py +61 -0
- edgecitadel-0.1.0/aggregator/main.py +528 -0
- edgecitadel-0.1.0/aggregator/memory.py +135 -0
- edgecitadel-0.1.0/aggregator/models.py +98 -0
- edgecitadel-0.1.0/aggregator/pytest.ini +4 -0
- edgecitadel-0.1.0/aggregator/requirements-dev.txt +4 -0
- edgecitadel-0.1.0/aggregator/requirements.txt +9 -0
- edgecitadel-0.1.0/aggregator/validator.py +19 -0
- edgecitadel-0.1.0/aggregator/websocket_hub.py +103 -0
- edgecitadel-0.1.0/docker-compose.yml +67 -0
- edgecitadel-0.1.0/edgecitadel/__init__.py +3 -0
- edgecitadel-0.1.0/edgecitadel/cli.py +39 -0
- edgecitadel-0.1.0/frontend/CLAUDE.md +26 -0
- edgecitadel-0.1.0/frontend/Dockerfile +13 -0
- edgecitadel-0.1.0/frontend/eslint.config.js +30 -0
- edgecitadel-0.1.0/frontend/index.html +15 -0
- edgecitadel-0.1.0/frontend/nginx.conf +9 -0
- edgecitadel-0.1.0/frontend/package-lock.json +5225 -0
- edgecitadel-0.1.0/frontend/package.json +41 -0
- edgecitadel-0.1.0/frontend/postcss.config.js +6 -0
- edgecitadel-0.1.0/frontend/src/App.jsx +74 -0
- edgecitadel-0.1.0/frontend/src/App.test.jsx +68 -0
- edgecitadel-0.1.0/frontend/src/Layout.jsx +113 -0
- edgecitadel-0.1.0/frontend/src/api/client.js +59 -0
- edgecitadel-0.1.0/frontend/src/components/AgentCard.jsx +53 -0
- edgecitadel-0.1.0/frontend/src/components/AgentDetail.jsx +324 -0
- edgecitadel-0.1.0/frontend/src/components/AgentRegistry.jsx +165 -0
- edgecitadel-0.1.0/frontend/src/components/AgentSidebar.jsx +102 -0
- edgecitadel-0.1.0/frontend/src/components/ChatHistory.jsx +391 -0
- edgecitadel-0.1.0/frontend/src/components/CommFlow.jsx +202 -0
- edgecitadel-0.1.0/frontend/src/components/CommandInput.jsx +118 -0
- edgecitadel-0.1.0/frontend/src/components/ConversationThread.jsx +133 -0
- edgecitadel-0.1.0/frontend/src/components/HeaderBar.jsx +97 -0
- edgecitadel-0.1.0/frontend/src/components/LogViewer.jsx +247 -0
- edgecitadel-0.1.0/frontend/src/components/MessageBubble.jsx +361 -0
- edgecitadel-0.1.0/frontend/src/components/MessageInspector.jsx +290 -0
- edgecitadel-0.1.0/frontend/src/components/RegistryRow.jsx +60 -0
- edgecitadel-0.1.0/frontend/src/components/RegistryRow.test.jsx +16 -0
- edgecitadel-0.1.0/frontend/src/components/StatusBadge.jsx +32 -0
- edgecitadel-0.1.0/frontend/src/components/StatusBadge.test.jsx +15 -0
- edgecitadel-0.1.0/frontend/src/components/TaskBoard.jsx +230 -0
- edgecitadel-0.1.0/frontend/src/components/TaskBoard.test.jsx +115 -0
- edgecitadel-0.1.0/frontend/src/components/TaskCard.jsx +65 -0
- edgecitadel-0.1.0/frontend/src/components/Toast.jsx +25 -0
- edgecitadel-0.1.0/frontend/src/hooks/realtimeEvents.js +38 -0
- edgecitadel-0.1.0/frontend/src/hooks/realtimeEvents.test.js +68 -0
- edgecitadel-0.1.0/frontend/src/hooks/useWebSocket.js +111 -0
- edgecitadel-0.1.0/frontend/src/index.css +26 -0
- edgecitadel-0.1.0/frontend/src/main.jsx +10 -0
- edgecitadel-0.1.0/frontend/src/stores/appStore.js +251 -0
- edgecitadel-0.1.0/frontend/src/test/setup.js +8 -0
- edgecitadel-0.1.0/frontend/src/utils/agentColors.js +32 -0
- edgecitadel-0.1.0/frontend/src/utils/formatTime.js +20 -0
- edgecitadel-0.1.0/frontend/src/utils/heartbeatAge.js +8 -0
- edgecitadel-0.1.0/frontend/src/utils/taskReducer.js +248 -0
- edgecitadel-0.1.0/frontend/src/utils/taskReducer.test.js +280 -0
- edgecitadel-0.1.0/frontend/tailwind.config.js +36 -0
- edgecitadel-0.1.0/frontend/tests/tooling-contract.test.cjs +19 -0
- edgecitadel-0.1.0/frontend/vite.config.js +26 -0
- edgecitadel-0.1.0/native-plugins/.agents/plugins/marketplace.json +20 -0
- edgecitadel-0.1.0/native-plugins/.claude-plugin/marketplace.json +13 -0
- edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/.claude-plugin/plugin.json +9 -0
- edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/.mcp.json +8 -0
- edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/hooks/hooks.json +15 -0
- edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/skills/edgecitadel/SKILL.md +16 -0
- edgecitadel-0.1.0/native-plugins/pi-edgecitadel/extensions/edgecitadel.ts +85 -0
- edgecitadel-0.1.0/native-plugins/pi-edgecitadel/package.json +22 -0
- edgecitadel-0.1.0/native-plugins/pi-edgecitadel/skills/edgecitadel/SKILL.md +12 -0
- edgecitadel-0.1.0/native-plugins/pi-edgecitadel/tsconfig.json +12 -0
- edgecitadel-0.1.0/native-plugins/plugins/edgecitadel/.codex-plugin/plugin.json +19 -0
- edgecitadel-0.1.0/native-plugins/plugins/edgecitadel/.mcp.json +8 -0
- edgecitadel-0.1.0/native-plugins/plugins/edgecitadel/skills/edgecitadel/SKILL.md +17 -0
- edgecitadel-0.1.0/nats/nats.conf +34 -0
- edgecitadel-0.1.0/nats/nats.conf.tpl +34 -0
- edgecitadel-0.1.0/nginx/default.conf +44 -0
- edgecitadel-0.1.0/plugin-toolkit/pyproject.toml +38 -0
- edgecitadel-0.1.0/plugin-toolkit/schemas/agent-plugin.v1alpha1.schema.json +277 -0
- edgecitadel-0.1.0/plugin-toolkit/schemas/agent-skill-binding.v1alpha1.schema.json +122 -0
- edgecitadel-0.1.0/plugin-toolkit/schemas/plugin-lock.v1.schema.json +93 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/__init__.py +6 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/__main__.py +3 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/client.py +85 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/managed_runtime.py +205 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/mcp.py +346 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/rpc.py +44 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/service.py +533 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/store.py +2015 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/supervisor.py +452 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/transport.py +453 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/__init__.py +0 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/agent_card.py +81 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/jetstream.py +73 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/outcome_store.py +742 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/pull_consumer.py +452 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/task_executor.py +782 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/task_publisher.py +29 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/task_types.py +21 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/template.py +151 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/validator.py +206 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/__init__.py +21 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/_values.py +57 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/knowledge.py +34 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/lifecycle.py +46 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/py.typed +0 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/runtime.py +36 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/skills.py +35 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/transport.py +71 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/__init__.py +1 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/__main__.py +3 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/cli.py +46 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/errors.py +84 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/inventory.py +399 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/loader.py +353 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/nats_admin.py +95 -0
- edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/validator.py +468 -0
- edgecitadel-0.1.0/plugins/README.md +125 -0
- edgecitadel-0.1.0/plugins/examples/echo/README.md +13 -0
- edgecitadel-0.1.0/plugins/examples/echo/plugin.lock.json +50 -0
- edgecitadel-0.1.0/plugins/examples/echo/plugin.yaml +40 -0
- edgecitadel-0.1.0/plugins/examples/echo/runtime/__init__.py +1 -0
- edgecitadel-0.1.0/plugins/examples/echo/runtime/__main__.py +129 -0
- edgecitadel-0.1.0/plugins/examples/echo/skills/echo/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/examples/echo/skills/echo/binding.yaml +20 -0
- edgecitadel-0.1.0/plugins/examples/echo/skills/echo/schemas/input.json +7 -0
- edgecitadel-0.1.0/plugins/examples/echo/skills/echo/schemas/output.json +7 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/README.md +41 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/plugin.lock.json +62 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/plugin.yaml +41 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/runtime/__init__.py +1 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/runtime/__main__.py +8 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/SKILL.md +15 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/assets/README.md +3 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/binding.yaml +20 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/references/README.md +3 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/schemas/input.json +13 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/schemas/output.json +13 -0
- edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/scripts/README.md +3 -0
- edgecitadel-0.1.0/plugins/gemma/README.md +19 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/__init__.py +0 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/__main__.py +11 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/adapter.py +175 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/config.yaml +54 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/memory_client.py +79 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/ollama_client.py +82 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/prompt.py +18 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/requirements.txt +1 -0
- edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/skills.py +58 -0
- edgecitadel-0.1.0/plugins/gemma/plugin.lock.json +144 -0
- edgecitadel-0.1.0/plugins/gemma/plugin.yaml +43 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/hermes/README.md +15 -0
- edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/__init__.py +0 -0
- edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/__main__.py +4 -0
- edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/adapter.py +107 -0
- edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/config.yaml +20 -0
- edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/hermes_client.py +120 -0
- edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/requirements.txt +1 -0
- edgecitadel-0.1.0/plugins/hermes/plugin.lock.json +66 -0
- edgecitadel-0.1.0/plugins/hermes/plugin.yaml +42 -0
- edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/README.md +16 -0
- edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/__init__.py +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/__main__.py +8 -0
- edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/adapter.py +272 -0
- edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/client.py +85 -0
- edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/config.yaml +29 -0
- edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/requirements.txt +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/plugin.lock.json +132 -0
- edgecitadel-0.1.0/plugins/homeassistant/plugin.yaml +43 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/SKILL.md +11 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/binding.yaml +8 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/schemas/input.json +1 -0
- edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/schemas/output.json +1 -0
- edgecitadel-0.1.0/plugins/shell/README.md +13 -0
- edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/__init__.py +1 -0
- edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/__main__.py +11 -0
- edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/adapter.py +58 -0
- edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/config.yaml +17 -0
- edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/requirements.txt +1 -0
- edgecitadel-0.1.0/plugins/shell/plugin.lock.json +62 -0
- edgecitadel-0.1.0/plugins/shell/plugin.yaml +41 -0
- edgecitadel-0.1.0/plugins/shell/skills/shell-exec/SKILL.md +13 -0
- edgecitadel-0.1.0/plugins/shell/skills/shell-exec/binding.yaml +20 -0
- edgecitadel-0.1.0/plugins/shell/skills/shell-exec/schemas/input.json +14 -0
- edgecitadel-0.1.0/plugins/shell/skills/shell-exec/schemas/output.json +11 -0
- edgecitadel-0.1.0/pyproject.toml +102 -0
- edgecitadel-0.1.0/schemas/agent-card.v1.json +102 -0
- edgecitadel-0.1.0/schemas/envelope.v1.json +82 -0
- edgecitadel-0.1.0/schemas/research-event.v1.json +18 -0
- edgecitadel-0.1.0/schemas/research-manifest.v1.json +119 -0
- edgecitadel-0.1.0/schemas/research-trial.v1.json +80 -0
- edgecitadel-0.1.0/schemas/task-correlation.v1.json +117 -0
- edgecitadel-0.1.0/schemas/tests/test_agent_card_schema.py +111 -0
- edgecitadel-0.1.0/schemas/tests/test_envelope_schema.py +144 -0
- edgecitadel-0.1.0/schemas/tests/test_task_correlation_schema.py +180 -0
- edgecitadel-0.1.0/scripts/__init__.py +1 -0
- edgecitadel-0.1.0/scripts/edgecitadel_cli.py +2962 -0
- edgecitadel-0.1.0/scripts/nats_leaf.py +521 -0
- edgecitadel-0.1.0/scripts/plugin_runner.py +66 -0
- edgecitadel-0.1.0/scripts/research/__init__.py +1 -0
- edgecitadel-0.1.0/scripts/research/lab_config.py +179 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
NATS_TOKEN=change-me
|
|
2
|
+
NATS_LEAF_USERNAME=change-me-leaf-user
|
|
3
|
+
NATS_LEAF_PASSWORD=change-me-leaf-password
|
|
4
|
+
OPENCLAW_TOKEN=change-me-scoped
|
|
5
|
+
EDGECITADEL_ADMIN_TOKEN=change-me-admin
|
|
6
|
+
# Set EC_ENABLE_MQTT=1 before running scripts/render-nats-conf.sh to
|
|
7
|
+
# enable deploy-time MQTT ingress. Default off.
|
|
8
|
+
EC_ENABLE_MQTT=0
|
|
9
|
+
|
|
10
|
+
# Gemma adapter (Phase 2). See adapters/gemma/README.md.
|
|
11
|
+
OLLAMA_HOST=localhost
|
|
12
|
+
OLLAMA_PORT=11434
|
|
13
|
+
# Default: gemma4:e2b (smallest "efficient" variant, ~2B params).
|
|
14
|
+
# To switch, set OLLAMA_MODEL to one of:
|
|
15
|
+
# gemma4:e2b — efficient 2B (default; lowest VRAM, fastest)
|
|
16
|
+
# gemma4:e4b — efficient 4B (better reasoning, ~2× memory)
|
|
17
|
+
# gemma4:26b — full 26B (Mac Mini-class hosts only)
|
|
18
|
+
# gemma4:31b — full 31B (workstation/A100-class)
|
|
19
|
+
# Pull first: ollama pull <tag>
|
|
20
|
+
OLLAMA_MODEL=gemma4:e2b
|
|
21
|
+
OLLAMA_TIMEOUT_SEC=120
|
|
22
|
+
|
|
23
|
+
# Watchdog adapter (Phase 3.1)
|
|
24
|
+
# Override only for tests that can't wait the production thresholds.
|
|
25
|
+
# Defaults: floor=20s, tolerance=5s, check cadence=5s.
|
|
26
|
+
# WATCHDOG_THRESHOLD_FLOOR_SEC=2
|
|
27
|
+
# WATCHDOG_TOLERANCE_SEC=1
|
|
28
|
+
# WATCHDOG_CHECK_CADENCE_SEC=1
|
|
29
|
+
|
|
30
|
+
# Phase 2.5 conversational memory (aggregator-owned SQLite + NATS API)
|
|
31
|
+
# Override only for tests / staging. Default 30 days = 2592000 seconds.
|
|
32
|
+
# MEMORY_RETENTION_SEC=2592000
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
env/
|
|
8
|
+
venv/
|
|
9
|
+
.venv/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
dist/
|
|
12
|
+
build/
|
|
13
|
+
|
|
14
|
+
# Node
|
|
15
|
+
node_modules/
|
|
16
|
+
frontend/dist/
|
|
17
|
+
.vite/
|
|
18
|
+
|
|
19
|
+
# Data
|
|
20
|
+
data/*.db
|
|
21
|
+
data/*.sqlite
|
|
22
|
+
data/research/
|
|
23
|
+
!data/.gitkeep
|
|
24
|
+
nats/data/
|
|
25
|
+
|
|
26
|
+
# Claude Code local settings
|
|
27
|
+
.claude/.claude/
|
|
28
|
+
.claude/settings.local.json
|
|
29
|
+
.claude/*.local.md
|
|
30
|
+
CLAUDE.local.md
|
|
31
|
+
|
|
32
|
+
# Environment
|
|
33
|
+
.env
|
|
34
|
+
.env.local
|
|
35
|
+
.env.production
|
|
36
|
+
|
|
37
|
+
# OpenClaw client config (contains secrets)
|
|
38
|
+
openclaw-client/openclaw.conf
|
|
39
|
+
openclaw-client/agent.env
|
|
40
|
+
openclaw-client/node_modules/
|
|
41
|
+
|
|
42
|
+
# IDE
|
|
43
|
+
.vscode/
|
|
44
|
+
.idea/
|
|
45
|
+
*.swp
|
|
46
|
+
*.swo
|
|
47
|
+
|
|
48
|
+
# OS
|
|
49
|
+
.DS_Store
|
|
50
|
+
Thumbs.db
|
|
51
|
+
|
|
52
|
+
# Test artifacts
|
|
53
|
+
test-artifacts/
|
|
54
|
+
e2e/test-results/
|
|
55
|
+
e2e/playwright-report/
|
|
56
|
+
tmp/e2e/
|
|
57
|
+
tmp/operator-evidence*/
|
|
58
|
+
|
|
59
|
+
# Raw video (keep only final mp4/gif)
|
|
60
|
+
docs/demo-raw.webm
|
|
61
|
+
|
|
62
|
+
# Docker
|
|
63
|
+
*.log
|
|
64
|
+
|
|
65
|
+
# Git worktrees
|
|
66
|
+
.worktrees/
|
|
67
|
+
|
|
68
|
+
# Superpowers — keep all brainstorm/spec/plan artifacts local-only.
|
|
69
|
+
# Visual companion mockups:
|
|
70
|
+
.superpowers/
|
|
71
|
+
# Design specs and implementation plans (per-developer working artifacts):
|
|
72
|
+
docs/superpowers/
|
|
73
|
+
adapters/*/agent.env
|
|
74
|
+
|
|
75
|
+
# Phase 5: deploy script's runtime log files (the deploy script writes timestamped logs)
|
|
76
|
+
deploy/*.log
|
|
77
|
+
|
|
78
|
+
# Operator note: scheduled tasks lock from claude harness
|
|
79
|
+
.claude/scheduled_tasks.lock
|
|
80
|
+
|
|
81
|
+
# Frontend dev-only configs (developer working artifacts; not part of the
|
|
82
|
+
# canonical vite config). e.g. vite.config.prodproxy.js — points the local
|
|
83
|
+
# dev server at a remote aggregator for ad-hoc verification.
|
|
84
|
+
frontend/vite.config.*.js
|
|
85
|
+
!frontend/vite.config.js
|
|
86
|
+
|
|
87
|
+
# E2E manual probes — one-off browser-driven scripts that target real
|
|
88
|
+
# (often production) data. Not part of the regular Playwright suite.
|
|
89
|
+
e2e/scripts/
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: edgecitadel
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Create, join, and operate an EdgeCitadel agent network
|
|
5
|
+
Project-URL: Homepage, https://github.com/zhonghaozhan/EdgeCitadel
|
|
6
|
+
Project-URL: Repository, https://github.com/zhonghaozhan/EdgeCitadel
|
|
7
|
+
Author: EdgeCitadel contributors
|
|
8
|
+
License: MIT
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Operating System :: MacOS
|
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Requires-Python: >=3.12
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# EdgeCitadel
|
|
20
|
+
|
|
21
|
+
EdgeCitadel connects AI Agents across a Core and enrolled Edge hosts. It runs
|
|
22
|
+
complete Managed Agents such as Gemma and Home Assistant adapters, and connects
|
|
23
|
+
active Pi, Claude Code, and Codex sessions through their native plugin systems.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
Choose one method:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install edgecitadel
|
|
31
|
+
# or
|
|
32
|
+
brew install edgecitadel
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Verify it with `edgecitadel --version`.
|
|
36
|
+
|
|
37
|
+
## Create a Core
|
|
38
|
+
|
|
39
|
+
Start Docker, then choose a hostname or IP that Edge hosts can reach:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
edgecitadel create --host core.example.internal
|
|
43
|
+
edgecitadel doctor
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The command checks local requirements and prints the dashboard URL.
|
|
47
|
+
|
|
48
|
+
## Join an Edge
|
|
49
|
+
|
|
50
|
+
Create a one-time invitation on the Core:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
edgecitadel invite --node-id studio-macmini --host core.example.internal
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Run the returned `edgecitadel join` command on the Edge. The default
|
|
57
|
+
`single-client` mode connects the EdgeCitadel service directly to Core NATS:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
edgecitadel join 'ecjoin://...'
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Use `nats_leaf` when Agents on this host must keep communicating while the Core
|
|
64
|
+
connection is unavailable:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
brew install nats-server # macOS; use your system package manager elsewhere
|
|
68
|
+
edgecitadel join 'ecjoin://...' --messaging-mode nats_leaf
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
In both modes, Agent integrations talk to the host-local EdgeCitadel service.
|
|
72
|
+
Only `nats_leaf` needs a local NATS server; it is the durable local message bus
|
|
73
|
+
and maintains the outbound Leaf connection to Core.
|
|
74
|
+
|
|
75
|
+
## Install a Managed Agent
|
|
76
|
+
|
|
77
|
+
Managed Agents are complete runtimes operated by EdgeCitadel:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
edgecitadel agent install gemma
|
|
81
|
+
edgecitadel agent list
|
|
82
|
+
edgecitadel agent status edgecitadel.gemma
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Home Assistant is installed the same way after its URL, token, and allowlist are
|
|
86
|
+
configured. EdgeCitadel operates the adapter and never installs or removes Home
|
|
87
|
+
Assistant itself. See the [Gemma guide](plugins/gemma/README.md) and
|
|
88
|
+
[Home Assistant guide](plugins/homeassistant/README.md).
|
|
89
|
+
|
|
90
|
+
## Connect an existing Agent
|
|
91
|
+
|
|
92
|
+
These plugins add Agent discovery, delegation, inbox, task-state, trace, and
|
|
93
|
+
diagnostic tools to an active host session. They do not start the host in the
|
|
94
|
+
background, and EdgeCitadel does not pass NATS credentials through the plugin
|
|
95
|
+
protocol.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# Pi
|
|
99
|
+
pi install "$(edgecitadel connector path pi)"
|
|
100
|
+
|
|
101
|
+
# Claude Code
|
|
102
|
+
claude plugin marketplace add "$(edgecitadel connector path claude-code)"
|
|
103
|
+
claude plugin install edgecitadel@edgecitadel
|
|
104
|
+
|
|
105
|
+
# Codex
|
|
106
|
+
codex plugin marketplace add "$(edgecitadel connector path codex)"
|
|
107
|
+
codex plugin add edgecitadel@edgecitadel
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Start a new host session, then use its `edgecitadel_*` tools. Inspect active
|
|
111
|
+
connections with `edgecitadel connector list` and `edgecitadel connector status
|
|
112
|
+
<connector-id>`.
|
|
113
|
+
|
|
114
|
+
## Operate
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
edgecitadel status
|
|
118
|
+
edgecitadel doctor
|
|
119
|
+
edgecitadel service status
|
|
120
|
+
edgecitadel task list --connector-id <connector-id>
|
|
121
|
+
edgecitadel trace list --connector-id <connector-id>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Stop a Core without deleting its data with `edgecitadel down`.
|
|
125
|
+
|
|
126
|
+
## Upgrade or uninstall
|
|
127
|
+
|
|
128
|
+
Use the package manager that installed EdgeCitadel:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
pip install --upgrade edgecitadel
|
|
132
|
+
pip uninstall edgecitadel
|
|
133
|
+
|
|
134
|
+
brew upgrade edgecitadel
|
|
135
|
+
brew uninstall edgecitadel
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Before uninstalling an Edge, run `edgecitadel service stop`; in `nats_leaf`
|
|
139
|
+
mode also run `edgecitadel messaging stop`. Uninstall preserves local state in
|
|
140
|
+
`~/.edgecitadel`.
|
|
141
|
+
|
|
142
|
+
More detail: [onboarding and troubleshooting](docs/onboarding.md) and
|
|
143
|
+
[contributing](CONTRIBUTING.md).
|
|
144
|
+
|
|
145
|
+
## License
|
|
146
|
+
|
|
147
|
+
MIT
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# EdgeCitadel
|
|
2
|
+
|
|
3
|
+
EdgeCitadel connects AI Agents across a Core and enrolled Edge hosts. It runs
|
|
4
|
+
complete Managed Agents such as Gemma and Home Assistant adapters, and connects
|
|
5
|
+
active Pi, Claude Code, and Codex sessions through their native plugin systems.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Choose one method:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install edgecitadel
|
|
13
|
+
# or
|
|
14
|
+
brew install edgecitadel
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Verify it with `edgecitadel --version`.
|
|
18
|
+
|
|
19
|
+
## Create a Core
|
|
20
|
+
|
|
21
|
+
Start Docker, then choose a hostname or IP that Edge hosts can reach:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
edgecitadel create --host core.example.internal
|
|
25
|
+
edgecitadel doctor
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The command checks local requirements and prints the dashboard URL.
|
|
29
|
+
|
|
30
|
+
## Join an Edge
|
|
31
|
+
|
|
32
|
+
Create a one-time invitation on the Core:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
edgecitadel invite --node-id studio-macmini --host core.example.internal
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Run the returned `edgecitadel join` command on the Edge. The default
|
|
39
|
+
`single-client` mode connects the EdgeCitadel service directly to Core NATS:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
edgecitadel join 'ecjoin://...'
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Use `nats_leaf` when Agents on this host must keep communicating while the Core
|
|
46
|
+
connection is unavailable:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
brew install nats-server # macOS; use your system package manager elsewhere
|
|
50
|
+
edgecitadel join 'ecjoin://...' --messaging-mode nats_leaf
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
In both modes, Agent integrations talk to the host-local EdgeCitadel service.
|
|
54
|
+
Only `nats_leaf` needs a local NATS server; it is the durable local message bus
|
|
55
|
+
and maintains the outbound Leaf connection to Core.
|
|
56
|
+
|
|
57
|
+
## Install a Managed Agent
|
|
58
|
+
|
|
59
|
+
Managed Agents are complete runtimes operated by EdgeCitadel:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
edgecitadel agent install gemma
|
|
63
|
+
edgecitadel agent list
|
|
64
|
+
edgecitadel agent status edgecitadel.gemma
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Home Assistant is installed the same way after its URL, token, and allowlist are
|
|
68
|
+
configured. EdgeCitadel operates the adapter and never installs or removes Home
|
|
69
|
+
Assistant itself. See the [Gemma guide](plugins/gemma/README.md) and
|
|
70
|
+
[Home Assistant guide](plugins/homeassistant/README.md).
|
|
71
|
+
|
|
72
|
+
## Connect an existing Agent
|
|
73
|
+
|
|
74
|
+
These plugins add Agent discovery, delegation, inbox, task-state, trace, and
|
|
75
|
+
diagnostic tools to an active host session. They do not start the host in the
|
|
76
|
+
background, and EdgeCitadel does not pass NATS credentials through the plugin
|
|
77
|
+
protocol.
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Pi
|
|
81
|
+
pi install "$(edgecitadel connector path pi)"
|
|
82
|
+
|
|
83
|
+
# Claude Code
|
|
84
|
+
claude plugin marketplace add "$(edgecitadel connector path claude-code)"
|
|
85
|
+
claude plugin install edgecitadel@edgecitadel
|
|
86
|
+
|
|
87
|
+
# Codex
|
|
88
|
+
codex plugin marketplace add "$(edgecitadel connector path codex)"
|
|
89
|
+
codex plugin add edgecitadel@edgecitadel
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Start a new host session, then use its `edgecitadel_*` tools. Inspect active
|
|
93
|
+
connections with `edgecitadel connector list` and `edgecitadel connector status
|
|
94
|
+
<connector-id>`.
|
|
95
|
+
|
|
96
|
+
## Operate
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
edgecitadel status
|
|
100
|
+
edgecitadel doctor
|
|
101
|
+
edgecitadel service status
|
|
102
|
+
edgecitadel task list --connector-id <connector-id>
|
|
103
|
+
edgecitadel trace list --connector-id <connector-id>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Stop a Core without deleting its data with `edgecitadel down`.
|
|
107
|
+
|
|
108
|
+
## Upgrade or uninstall
|
|
109
|
+
|
|
110
|
+
Use the package manager that installed EdgeCitadel:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pip install --upgrade edgecitadel
|
|
114
|
+
pip uninstall edgecitadel
|
|
115
|
+
|
|
116
|
+
brew upgrade edgecitadel
|
|
117
|
+
brew uninstall edgecitadel
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Before uninstalling an Edge, run `edgecitadel service stop`; in `nats_leaf`
|
|
121
|
+
mode also run `edgecitadel messaging stop`. Uninstall preserves local state in
|
|
122
|
+
`~/.edgecitadel`.
|
|
123
|
+
|
|
124
|
+
More detail: [onboarding and troubleshooting](docs/onboarding.md) and
|
|
125
|
+
[contributing](CONTRIBUTING.md).
|
|
126
|
+
|
|
127
|
+
## License
|
|
128
|
+
|
|
129
|
+
MIT
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Aggregator Guide
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
|
|
5
|
+
- This directory contains the FastAPI backend, NATS integration, and SQLite persistence layer.
|
|
6
|
+
- Primary entrypoints are `main.py`, `aggregator.py`, `database.py`, and `models.py`.
|
|
7
|
+
|
|
8
|
+
## Local Rules
|
|
9
|
+
|
|
10
|
+
- Keep changes consistent with the current lightweight structure: direct modules, no ORM, sync SQLite access.
|
|
11
|
+
- Preserve the subject naming and transport assumptions already documented in the code and repo docs.
|
|
12
|
+
- Avoid incidental refactors across unrelated endpoints, parsers, and DB helpers.
|
|
13
|
+
- When backend changes alter API shape, message schema, or runtime assumptions, update the relevant docs and call out any required frontend or e2e follow-up.
|
|
14
|
+
|
|
15
|
+
## Commands
|
|
16
|
+
|
|
17
|
+
- Install contributor deps: `pip install -r requirements-dev.txt`
|
|
18
|
+
- Run dev server: `uvicorn main:app --host 0.0.0.0 --port 8000 --reload`
|
|
19
|
+
- Syntax check: `python3 -m py_compile *.py`
|
|
20
|
+
|
|
21
|
+
## Validation
|
|
22
|
+
|
|
23
|
+
- For Python changes, run `python3 -m py_compile *.py`.
|
|
24
|
+
- For backend behavior changes, prefer a stack-backed smoke check in addition to syntax validation when the environment is available.
|
|
25
|
+
- If behavior depends on NATS or Docker services, mention any runtime checks you could not execute.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
FROM python:3.12-slim
|
|
2
|
+
WORKDIR /app/aggregator
|
|
3
|
+
COPY plugin-toolkit/ /app/plugin-toolkit/
|
|
4
|
+
COPY aggregator/requirements.txt ./requirements.txt
|
|
5
|
+
RUN pip install --no-cache-dir -r requirements.txt -e /app/plugin-toolkit
|
|
6
|
+
WORKDIR /app
|
|
7
|
+
COPY aggregator/ ./aggregator/
|
|
8
|
+
COPY schemas/ ./schemas/
|
|
9
|
+
COPY scripts/__init__.py ./scripts/__init__.py
|
|
10
|
+
COPY scripts/research/__init__.py ./scripts/research/__init__.py
|
|
11
|
+
COPY scripts/research/lab_config.py ./scripts/research/lab_config.py
|
|
12
|
+
CMD ["uvicorn", "aggregator.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
File without changes
|