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.
Files changed (242) hide show
  1. edgecitadel-0.1.0/.env.example +32 -0
  2. edgecitadel-0.1.0/.gitignore +89 -0
  3. edgecitadel-0.1.0/PKG-INFO +147 -0
  4. edgecitadel-0.1.0/README.md +129 -0
  5. edgecitadel-0.1.0/aggregator/CLAUDE.md +25 -0
  6. edgecitadel-0.1.0/aggregator/Dockerfile +12 -0
  7. edgecitadel-0.1.0/aggregator/__init__.py +0 -0
  8. edgecitadel-0.1.0/aggregator/aggregator.py +498 -0
  9. edgecitadel-0.1.0/aggregator/database.py +495 -0
  10. edgecitadel-0.1.0/aggregator/jetstream_bootstrap.py +18 -0
  11. edgecitadel-0.1.0/aggregator/lab_inventory.py +293 -0
  12. edgecitadel-0.1.0/aggregator/liveness.py +61 -0
  13. edgecitadel-0.1.0/aggregator/main.py +528 -0
  14. edgecitadel-0.1.0/aggregator/memory.py +135 -0
  15. edgecitadel-0.1.0/aggregator/models.py +98 -0
  16. edgecitadel-0.1.0/aggregator/pytest.ini +4 -0
  17. edgecitadel-0.1.0/aggregator/requirements-dev.txt +4 -0
  18. edgecitadel-0.1.0/aggregator/requirements.txt +9 -0
  19. edgecitadel-0.1.0/aggregator/validator.py +19 -0
  20. edgecitadel-0.1.0/aggregator/websocket_hub.py +103 -0
  21. edgecitadel-0.1.0/docker-compose.yml +67 -0
  22. edgecitadel-0.1.0/edgecitadel/__init__.py +3 -0
  23. edgecitadel-0.1.0/edgecitadel/cli.py +39 -0
  24. edgecitadel-0.1.0/frontend/CLAUDE.md +26 -0
  25. edgecitadel-0.1.0/frontend/Dockerfile +13 -0
  26. edgecitadel-0.1.0/frontend/eslint.config.js +30 -0
  27. edgecitadel-0.1.0/frontend/index.html +15 -0
  28. edgecitadel-0.1.0/frontend/nginx.conf +9 -0
  29. edgecitadel-0.1.0/frontend/package-lock.json +5225 -0
  30. edgecitadel-0.1.0/frontend/package.json +41 -0
  31. edgecitadel-0.1.0/frontend/postcss.config.js +6 -0
  32. edgecitadel-0.1.0/frontend/src/App.jsx +74 -0
  33. edgecitadel-0.1.0/frontend/src/App.test.jsx +68 -0
  34. edgecitadel-0.1.0/frontend/src/Layout.jsx +113 -0
  35. edgecitadel-0.1.0/frontend/src/api/client.js +59 -0
  36. edgecitadel-0.1.0/frontend/src/components/AgentCard.jsx +53 -0
  37. edgecitadel-0.1.0/frontend/src/components/AgentDetail.jsx +324 -0
  38. edgecitadel-0.1.0/frontend/src/components/AgentRegistry.jsx +165 -0
  39. edgecitadel-0.1.0/frontend/src/components/AgentSidebar.jsx +102 -0
  40. edgecitadel-0.1.0/frontend/src/components/ChatHistory.jsx +391 -0
  41. edgecitadel-0.1.0/frontend/src/components/CommFlow.jsx +202 -0
  42. edgecitadel-0.1.0/frontend/src/components/CommandInput.jsx +118 -0
  43. edgecitadel-0.1.0/frontend/src/components/ConversationThread.jsx +133 -0
  44. edgecitadel-0.1.0/frontend/src/components/HeaderBar.jsx +97 -0
  45. edgecitadel-0.1.0/frontend/src/components/LogViewer.jsx +247 -0
  46. edgecitadel-0.1.0/frontend/src/components/MessageBubble.jsx +361 -0
  47. edgecitadel-0.1.0/frontend/src/components/MessageInspector.jsx +290 -0
  48. edgecitadel-0.1.0/frontend/src/components/RegistryRow.jsx +60 -0
  49. edgecitadel-0.1.0/frontend/src/components/RegistryRow.test.jsx +16 -0
  50. edgecitadel-0.1.0/frontend/src/components/StatusBadge.jsx +32 -0
  51. edgecitadel-0.1.0/frontend/src/components/StatusBadge.test.jsx +15 -0
  52. edgecitadel-0.1.0/frontend/src/components/TaskBoard.jsx +230 -0
  53. edgecitadel-0.1.0/frontend/src/components/TaskBoard.test.jsx +115 -0
  54. edgecitadel-0.1.0/frontend/src/components/TaskCard.jsx +65 -0
  55. edgecitadel-0.1.0/frontend/src/components/Toast.jsx +25 -0
  56. edgecitadel-0.1.0/frontend/src/hooks/realtimeEvents.js +38 -0
  57. edgecitadel-0.1.0/frontend/src/hooks/realtimeEvents.test.js +68 -0
  58. edgecitadel-0.1.0/frontend/src/hooks/useWebSocket.js +111 -0
  59. edgecitadel-0.1.0/frontend/src/index.css +26 -0
  60. edgecitadel-0.1.0/frontend/src/main.jsx +10 -0
  61. edgecitadel-0.1.0/frontend/src/stores/appStore.js +251 -0
  62. edgecitadel-0.1.0/frontend/src/test/setup.js +8 -0
  63. edgecitadel-0.1.0/frontend/src/utils/agentColors.js +32 -0
  64. edgecitadel-0.1.0/frontend/src/utils/formatTime.js +20 -0
  65. edgecitadel-0.1.0/frontend/src/utils/heartbeatAge.js +8 -0
  66. edgecitadel-0.1.0/frontend/src/utils/taskReducer.js +248 -0
  67. edgecitadel-0.1.0/frontend/src/utils/taskReducer.test.js +280 -0
  68. edgecitadel-0.1.0/frontend/tailwind.config.js +36 -0
  69. edgecitadel-0.1.0/frontend/tests/tooling-contract.test.cjs +19 -0
  70. edgecitadel-0.1.0/frontend/vite.config.js +26 -0
  71. edgecitadel-0.1.0/native-plugins/.agents/plugins/marketplace.json +20 -0
  72. edgecitadel-0.1.0/native-plugins/.claude-plugin/marketplace.json +13 -0
  73. edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/.claude-plugin/plugin.json +9 -0
  74. edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/.mcp.json +8 -0
  75. edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/hooks/hooks.json +15 -0
  76. edgecitadel-0.1.0/native-plugins/claude-code-edgecitadel/skills/edgecitadel/SKILL.md +16 -0
  77. edgecitadel-0.1.0/native-plugins/pi-edgecitadel/extensions/edgecitadel.ts +85 -0
  78. edgecitadel-0.1.0/native-plugins/pi-edgecitadel/package.json +22 -0
  79. edgecitadel-0.1.0/native-plugins/pi-edgecitadel/skills/edgecitadel/SKILL.md +12 -0
  80. edgecitadel-0.1.0/native-plugins/pi-edgecitadel/tsconfig.json +12 -0
  81. edgecitadel-0.1.0/native-plugins/plugins/edgecitadel/.codex-plugin/plugin.json +19 -0
  82. edgecitadel-0.1.0/native-plugins/plugins/edgecitadel/.mcp.json +8 -0
  83. edgecitadel-0.1.0/native-plugins/plugins/edgecitadel/skills/edgecitadel/SKILL.md +17 -0
  84. edgecitadel-0.1.0/nats/nats.conf +34 -0
  85. edgecitadel-0.1.0/nats/nats.conf.tpl +34 -0
  86. edgecitadel-0.1.0/nginx/default.conf +44 -0
  87. edgecitadel-0.1.0/plugin-toolkit/pyproject.toml +38 -0
  88. edgecitadel-0.1.0/plugin-toolkit/schemas/agent-plugin.v1alpha1.schema.json +277 -0
  89. edgecitadel-0.1.0/plugin-toolkit/schemas/agent-skill-binding.v1alpha1.schema.json +122 -0
  90. edgecitadel-0.1.0/plugin-toolkit/schemas/plugin-lock.v1.schema.json +93 -0
  91. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/__init__.py +6 -0
  92. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/__main__.py +3 -0
  93. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/client.py +85 -0
  94. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/managed_runtime.py +205 -0
  95. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/mcp.py +346 -0
  96. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/rpc.py +44 -0
  97. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/service.py +533 -0
  98. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/store.py +2015 -0
  99. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/supervisor.py +452 -0
  100. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_agentd/transport.py +453 -0
  101. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/__init__.py +0 -0
  102. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/agent_card.py +81 -0
  103. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/jetstream.py +73 -0
  104. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/outcome_store.py +742 -0
  105. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/pull_consumer.py +452 -0
  106. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/task_executor.py +782 -0
  107. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/task_publisher.py +29 -0
  108. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/task_types.py +21 -0
  109. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/template.py +151 -0
  110. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_runtime/validator.py +206 -0
  111. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/__init__.py +21 -0
  112. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/_values.py +57 -0
  113. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/knowledge.py +34 -0
  114. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/lifecycle.py +46 -0
  115. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/py.typed +0 -0
  116. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/runtime.py +36 -0
  117. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/skills.py +35 -0
  118. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_plugin_sdk/transport.py +71 -0
  119. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/__init__.py +1 -0
  120. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/__main__.py +3 -0
  121. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/cli.py +46 -0
  122. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/errors.py +84 -0
  123. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/inventory.py +399 -0
  124. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/loader.py +353 -0
  125. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/nats_admin.py +95 -0
  126. edgecitadel-0.1.0/plugin-toolkit/src/edgecitadel_supervisor/validator.py +468 -0
  127. edgecitadel-0.1.0/plugins/README.md +125 -0
  128. edgecitadel-0.1.0/plugins/examples/echo/README.md +13 -0
  129. edgecitadel-0.1.0/plugins/examples/echo/plugin.lock.json +50 -0
  130. edgecitadel-0.1.0/plugins/examples/echo/plugin.yaml +40 -0
  131. edgecitadel-0.1.0/plugins/examples/echo/runtime/__init__.py +1 -0
  132. edgecitadel-0.1.0/plugins/examples/echo/runtime/__main__.py +129 -0
  133. edgecitadel-0.1.0/plugins/examples/echo/skills/echo/SKILL.md +11 -0
  134. edgecitadel-0.1.0/plugins/examples/echo/skills/echo/binding.yaml +20 -0
  135. edgecitadel-0.1.0/plugins/examples/echo/skills/echo/schemas/input.json +7 -0
  136. edgecitadel-0.1.0/plugins/examples/echo/skills/echo/schemas/output.json +7 -0
  137. edgecitadel-0.1.0/plugins/examples/placeholder/README.md +41 -0
  138. edgecitadel-0.1.0/plugins/examples/placeholder/plugin.lock.json +62 -0
  139. edgecitadel-0.1.0/plugins/examples/placeholder/plugin.yaml +41 -0
  140. edgecitadel-0.1.0/plugins/examples/placeholder/runtime/__init__.py +1 -0
  141. edgecitadel-0.1.0/plugins/examples/placeholder/runtime/__main__.py +8 -0
  142. edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/SKILL.md +15 -0
  143. edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/assets/README.md +3 -0
  144. edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/binding.yaml +20 -0
  145. edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/references/README.md +3 -0
  146. edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/schemas/input.json +13 -0
  147. edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/schemas/output.json +13 -0
  148. edgecitadel-0.1.0/plugins/examples/placeholder/skills/placeholder/scripts/README.md +3 -0
  149. edgecitadel-0.1.0/plugins/gemma/README.md +19 -0
  150. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/__init__.py +0 -0
  151. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/__main__.py +11 -0
  152. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/adapter.py +175 -0
  153. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/config.yaml +54 -0
  154. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/memory_client.py +79 -0
  155. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/ollama_client.py +82 -0
  156. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/prompt.py +18 -0
  157. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/requirements.txt +1 -0
  158. edgecitadel-0.1.0/plugins/gemma/edgecitadel_gemma_plugin/skills.py +58 -0
  159. edgecitadel-0.1.0/plugins/gemma/plugin.lock.json +144 -0
  160. edgecitadel-0.1.0/plugins/gemma/plugin.yaml +43 -0
  161. edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/SKILL.md +11 -0
  162. edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/binding.yaml +8 -0
  163. edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/schemas/input.json +1 -0
  164. edgecitadel-0.1.0/plugins/gemma/skills/gemma-classifier/schemas/output.json +1 -0
  165. edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/SKILL.md +11 -0
  166. edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/binding.yaml +8 -0
  167. edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/schemas/input.json +1 -0
  168. edgecitadel-0.1.0/plugins/gemma/skills/gemma-code-explainer/schemas/output.json +1 -0
  169. edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/SKILL.md +11 -0
  170. edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/binding.yaml +8 -0
  171. edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/schemas/input.json +1 -0
  172. edgecitadel-0.1.0/plugins/gemma/skills/gemma-reasoner/schemas/output.json +1 -0
  173. edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/SKILL.md +11 -0
  174. edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/binding.yaml +8 -0
  175. edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/schemas/input.json +1 -0
  176. edgecitadel-0.1.0/plugins/gemma/skills/gemma-summarizer/schemas/output.json +1 -0
  177. edgecitadel-0.1.0/plugins/hermes/README.md +15 -0
  178. edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/__init__.py +0 -0
  179. edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/__main__.py +4 -0
  180. edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/adapter.py +107 -0
  181. edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/config.yaml +20 -0
  182. edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/hermes_client.py +120 -0
  183. edgecitadel-0.1.0/plugins/hermes/edgecitadel_hermes_plugin/requirements.txt +1 -0
  184. edgecitadel-0.1.0/plugins/hermes/plugin.lock.json +66 -0
  185. edgecitadel-0.1.0/plugins/hermes/plugin.yaml +42 -0
  186. edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/SKILL.md +11 -0
  187. edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/binding.yaml +8 -0
  188. edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/schemas/input.json +1 -0
  189. edgecitadel-0.1.0/plugins/hermes/skills/hermes-reasoner/schemas/output.json +1 -0
  190. edgecitadel-0.1.0/plugins/homeassistant/README.md +16 -0
  191. edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/__init__.py +1 -0
  192. edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/__main__.py +8 -0
  193. edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/adapter.py +272 -0
  194. edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/client.py +85 -0
  195. edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/config.yaml +29 -0
  196. edgecitadel-0.1.0/plugins/homeassistant/edgecitadel_homeassistant_plugin/requirements.txt +1 -0
  197. edgecitadel-0.1.0/plugins/homeassistant/plugin.lock.json +132 -0
  198. edgecitadel-0.1.0/plugins/homeassistant/plugin.yaml +43 -0
  199. edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/SKILL.md +11 -0
  200. edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/binding.yaml +8 -0
  201. edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/schemas/input.json +1 -0
  202. edgecitadel-0.1.0/plugins/homeassistant/skills/control-light/schemas/output.json +1 -0
  203. edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/SKILL.md +11 -0
  204. edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/binding.yaml +8 -0
  205. edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/schemas/input.json +1 -0
  206. edgecitadel-0.1.0/plugins/homeassistant/skills/read-camera-luma/schemas/output.json +1 -0
  207. edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/SKILL.md +11 -0
  208. edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/binding.yaml +8 -0
  209. edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/schemas/input.json +1 -0
  210. edgecitadel-0.1.0/plugins/homeassistant/skills/read-state/schemas/output.json +1 -0
  211. edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/SKILL.md +11 -0
  212. edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/binding.yaml +8 -0
  213. edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/schemas/input.json +1 -0
  214. edgecitadel-0.1.0/plugins/homeassistant/skills/run-sequence/schemas/output.json +1 -0
  215. edgecitadel-0.1.0/plugins/shell/README.md +13 -0
  216. edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/__init__.py +1 -0
  217. edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/__main__.py +11 -0
  218. edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/adapter.py +58 -0
  219. edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/config.yaml +17 -0
  220. edgecitadel-0.1.0/plugins/shell/edgecitadel_shell_plugin/requirements.txt +1 -0
  221. edgecitadel-0.1.0/plugins/shell/plugin.lock.json +62 -0
  222. edgecitadel-0.1.0/plugins/shell/plugin.yaml +41 -0
  223. edgecitadel-0.1.0/plugins/shell/skills/shell-exec/SKILL.md +13 -0
  224. edgecitadel-0.1.0/plugins/shell/skills/shell-exec/binding.yaml +20 -0
  225. edgecitadel-0.1.0/plugins/shell/skills/shell-exec/schemas/input.json +14 -0
  226. edgecitadel-0.1.0/plugins/shell/skills/shell-exec/schemas/output.json +11 -0
  227. edgecitadel-0.1.0/pyproject.toml +102 -0
  228. edgecitadel-0.1.0/schemas/agent-card.v1.json +102 -0
  229. edgecitadel-0.1.0/schemas/envelope.v1.json +82 -0
  230. edgecitadel-0.1.0/schemas/research-event.v1.json +18 -0
  231. edgecitadel-0.1.0/schemas/research-manifest.v1.json +119 -0
  232. edgecitadel-0.1.0/schemas/research-trial.v1.json +80 -0
  233. edgecitadel-0.1.0/schemas/task-correlation.v1.json +117 -0
  234. edgecitadel-0.1.0/schemas/tests/test_agent_card_schema.py +111 -0
  235. edgecitadel-0.1.0/schemas/tests/test_envelope_schema.py +144 -0
  236. edgecitadel-0.1.0/schemas/tests/test_task_correlation_schema.py +180 -0
  237. edgecitadel-0.1.0/scripts/__init__.py +1 -0
  238. edgecitadel-0.1.0/scripts/edgecitadel_cli.py +2962 -0
  239. edgecitadel-0.1.0/scripts/nats_leaf.py +521 -0
  240. edgecitadel-0.1.0/scripts/plugin_runner.py +66 -0
  241. edgecitadel-0.1.0/scripts/research/__init__.py +1 -0
  242. 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