effero 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 (151) hide show
  1. effero-0.1.0/.github/CODEOWNERS +2 -0
  2. effero-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
  3. effero-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +25 -0
  4. effero-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +33 -0
  5. effero-0.1.0/.github/workflows/ci.yml +80 -0
  6. effero-0.1.0/.github/workflows/release.yml +72 -0
  7. effero-0.1.0/.gitignore +57 -0
  8. effero-0.1.0/CHANGELOG.md +46 -0
  9. effero-0.1.0/CODE_OF_CONDUCT.md +139 -0
  10. effero-0.1.0/CONTRIBUTING.md +104 -0
  11. effero-0.1.0/Cargo.lock +915 -0
  12. effero-0.1.0/Cargo.toml +13 -0
  13. effero-0.1.0/Dockerfile +23 -0
  14. effero-0.1.0/LICENSE +201 -0
  15. effero-0.1.0/PKG-INFO +415 -0
  16. effero-0.1.0/README.md +345 -0
  17. effero-0.1.0/SECURITY.md +32 -0
  18. effero-0.1.0/crates/README.md +60 -0
  19. effero-0.1.0/crates/effero-edge-mcp/Cargo.toml +11 -0
  20. effero-0.1.0/crates/effero-edge-mcp/README.md +76 -0
  21. effero-0.1.0/crates/effero-edge-mcp/src/main.rs +140 -0
  22. effero-0.1.0/crates/effero-safety-kernel/Cargo.toml +15 -0
  23. effero-0.1.0/crates/effero-safety-kernel/README.md +130 -0
  24. effero-0.1.0/crates/effero-safety-kernel/policies/example.yaml +39 -0
  25. effero-0.1.0/crates/effero-safety-kernel/src/bin/effero-safety-kerneld.rs +70 -0
  26. effero-0.1.0/crates/effero-safety-kernel/src/condition.rs +377 -0
  27. effero-0.1.0/crates/effero-safety-kernel/src/engine.rs +160 -0
  28. effero-0.1.0/crates/effero-safety-kernel/src/lib.rs +20 -0
  29. effero-0.1.0/crates/effero-safety-kernel/src/policy.rs +76 -0
  30. effero-0.1.0/crates/effero-safety-kernel/src/server.rs +93 -0
  31. effero-0.1.0/crates/effero-safety-kernel/tests/integration.rs +45 -0
  32. effero-0.1.0/docker-compose.yml +13 -0
  33. effero-0.1.0/docs/architecture.md +11 -0
  34. effero-0.1.0/examples/desktop-copilot/README.md +20 -0
  35. effero-0.1.0/examples/desktop-copilot/effero.yaml +13 -0
  36. effero-0.1.0/examples/desktop-copilot/main.py +33 -0
  37. effero-0.1.0/examples/local-smart-home/README.md +51 -0
  38. effero-0.1.0/examples/local-smart-home/effero.yaml +31 -0
  39. effero-0.1.0/examples/local-smart-home/main.py +33 -0
  40. effero-0.1.0/pyproject.toml +89 -0
  41. effero-0.1.0/rust-toolchain.toml +2 -0
  42. effero-0.1.0/src/effero/__init__.py +26 -0
  43. effero-0.1.0/src/effero/adapters/__init__.py +21 -0
  44. effero-0.1.0/src/effero/adapters/base.py +22 -0
  45. effero-0.1.0/src/effero/adapters/cloud_api/__init__.py +7 -0
  46. effero-0.1.0/src/effero/adapters/cloud_api/client.py +68 -0
  47. effero-0.1.0/src/effero/adapters/mqtt_matter/__init__.py +66 -0
  48. effero-0.1.0/src/effero/adapters/mqtt_matter/client.py +583 -0
  49. effero-0.1.0/src/effero/adapters/mqtt_matter/matter.py +609 -0
  50. effero-0.1.0/src/effero/adapters/mqtt_matter/protocol.py +593 -0
  51. effero-0.1.0/src/effero/adapters/mqtt_matter/telemetry.py +410 -0
  52. effero-0.1.0/src/effero/adapters/ros2/__init__.py +23 -0
  53. effero-0.1.0/src/effero/adapters/ros2/bridge.py +479 -0
  54. effero-0.1.0/src/effero/adapters/serial_gpio/__init__.py +31 -0
  55. effero-0.1.0/src/effero/adapters/serial_gpio/client.py +216 -0
  56. effero-0.1.0/src/effero/adapters/serial_gpio/framing.py +501 -0
  57. effero-0.1.0/src/effero/config.py +97 -0
  58. effero-0.1.0/src/effero/core/__init__.py +15 -0
  59. effero-0.1.0/src/effero/core/agent/__init__.py +134 -0
  60. effero-0.1.0/src/effero/core/event_bus.py +64 -0
  61. effero-0.1.0/src/effero/core/fleet/__init__.py +34 -0
  62. effero-0.1.0/src/effero/core/fleet/auction.py +680 -0
  63. effero-0.1.0/src/effero/core/fleet/coordinator.py +254 -0
  64. effero-0.1.0/src/effero/core/memory/__init__.py +21 -0
  65. effero-0.1.0/src/effero/core/memory/episodic.py +52 -0
  66. effero-0.1.0/src/effero/core/memory/semantic.py +226 -0
  67. effero-0.1.0/src/effero/core/memory/working.py +52 -0
  68. effero-0.1.0/src/effero/core/planner/__init__.py +7 -0
  69. effero-0.1.0/src/effero/core/planner/planner.py +190 -0
  70. effero-0.1.0/src/effero/core/router/__init__.py +29 -0
  71. effero-0.1.0/src/effero/core/router/anthropic_backend.py +98 -0
  72. effero-0.1.0/src/effero/core/router/base.py +52 -0
  73. effero-0.1.0/src/effero/core/router/google_backend.py +166 -0
  74. effero-0.1.0/src/effero/core/router/openai_backend.py +96 -0
  75. effero-0.1.0/src/effero/core/router/router.py +80 -0
  76. effero-0.1.0/src/effero/interfaces/__init__.py +1 -0
  77. effero-0.1.0/src/effero/interfaces/cli.py +196 -0
  78. effero-0.1.0/src/effero/interfaces/server.py +310 -0
  79. effero-0.1.0/src/effero/interfaces/static/index.html +325 -0
  80. effero-0.1.0/src/effero/perception/__init__.py +23 -0
  81. effero-0.1.0/src/effero/perception/audio/__init__.py +25 -0
  82. effero-0.1.0/src/effero/perception/audio/asr.py +138 -0
  83. effero-0.1.0/src/effero/perception/audio/pipeline.py +106 -0
  84. effero-0.1.0/src/effero/perception/audio/tts.py +96 -0
  85. effero-0.1.0/src/effero/perception/base.py +30 -0
  86. effero-0.1.0/src/effero/perception/sensors/__init__.py +17 -0
  87. effero-0.1.0/src/effero/perception/sensors/pipeline.py +143 -0
  88. effero-0.1.0/src/effero/perception/vision/__init__.py +43 -0
  89. effero-0.1.0/src/effero/perception/vision/detector.py +143 -0
  90. effero-0.1.0/src/effero/perception/vision/pipeline.py +75 -0
  91. effero-0.1.0/src/effero/perception/vision/stream.py +360 -0
  92. effero-0.1.0/src/effero/perception/vision/vla.py +526 -0
  93. effero-0.1.0/src/effero/protocols/__init__.py +27 -0
  94. effero-0.1.0/src/effero/protocols/a2a.py +183 -0
  95. effero-0.1.0/src/effero/protocols/mcp_server.py +102 -0
  96. effero-0.1.0/src/effero/protocols/wyoming.py +258 -0
  97. effero-0.1.0/src/effero/py.typed +1 -0
  98. effero-0.1.0/src/effero/safety/__init__.py +48 -0
  99. effero-0.1.0/src/effero/safety/approval.py +152 -0
  100. effero-0.1.0/src/effero/safety/client.py +70 -0
  101. effero-0.1.0/src/effero/safety/policies/example.yaml +39 -0
  102. effero-0.1.0/src/effero/sdk/__init__.py +9 -0
  103. effero-0.1.0/src/effero/sdk/skill.py +132 -0
  104. effero-0.1.0/src/effero/skills/__init__.py +10 -0
  105. effero-0.1.0/src/effero/skills/community/__init__.py +6 -0
  106. effero-0.1.0/src/effero/skills/computer_use/__init__.py +70 -0
  107. effero-0.1.0/src/effero/skills/computer_use/browser.py +160 -0
  108. effero-0.1.0/src/effero/skills/computer_use/desktop.py +1170 -0
  109. effero-0.1.0/src/effero/skills/computer_use/file_ops.py +57 -0
  110. effero-0.1.0/src/effero/skills/computer_use/shell.py +38 -0
  111. effero-0.1.0/src/effero/skills/iot/__init__.py +18 -0
  112. effero-0.1.0/src/effero/skills/iot/lights.py +49 -0
  113. effero-0.1.0/src/effero/skills/iot/sensors.py +30 -0
  114. effero-0.1.0/src/effero/skills/iot/thermostat.py +43 -0
  115. effero-0.1.0/src/effero/skills/robotics/__init__.py +56 -0
  116. effero-0.1.0/src/effero/skills/robotics/arm.py +330 -0
  117. effero-0.1.0/src/effero/skills/robotics/collision.py +340 -0
  118. effero-0.1.0/src/effero/skills/robotics/navigate.py +193 -0
  119. effero-0.1.0/src/effero/skills/robotics/trajectory.py +355 -0
  120. effero-0.1.0/tests/test_a2a_protocol.py +101 -0
  121. effero-0.1.0/tests/test_actuator_framing.py +475 -0
  122. effero-0.1.0/tests/test_browser_real.py +75 -0
  123. effero-0.1.0/tests/test_browser_skills.py +25 -0
  124. effero-0.1.0/tests/test_cli.py +20 -0
  125. effero-0.1.0/tests/test_cli_commands.py +52 -0
  126. effero-0.1.0/tests/test_config.py +81 -0
  127. effero-0.1.0/tests/test_config_env.py +79 -0
  128. effero-0.1.0/tests/test_desktop_real.py +543 -0
  129. effero-0.1.0/tests/test_event_bus.py +61 -0
  130. effero-0.1.0/tests/test_fleet.py +47 -0
  131. effero-0.1.0/tests/test_fleet_auction.py +746 -0
  132. effero-0.1.0/tests/test_fleet_coordinator_integration.py +181 -0
  133. effero-0.1.0/tests/test_hitl_approval.py +128 -0
  134. effero-0.1.0/tests/test_matter_commissioning.py +290 -0
  135. effero-0.1.0/tests/test_mcp_server.py +64 -0
  136. effero-0.1.0/tests/test_memory.py +59 -0
  137. effero-0.1.0/tests/test_mqtt_live.py +538 -0
  138. effero-0.1.0/tests/test_perception_video_real.py +349 -0
  139. effero-0.1.0/tests/test_planner.py +122 -0
  140. effero-0.1.0/tests/test_robotics_real.py +120 -0
  141. effero-0.1.0/tests/test_robotics_trajectory.py +352 -0
  142. effero-0.1.0/tests/test_router.py +99 -0
  143. effero-0.1.0/tests/test_safety_client.py +65 -0
  144. effero-0.1.0/tests/test_semantic_memory.py +95 -0
  145. effero-0.1.0/tests/test_server.py +98 -0
  146. effero-0.1.0/tests/test_server_websockets.py +79 -0
  147. effero-0.1.0/tests/test_skill_registry.py +125 -0
  148. effero-0.1.0/tests/test_telemetry_normalization.py +171 -0
  149. effero-0.1.0/tests/test_vla.py +42 -0
  150. effero-0.1.0/tests/test_vla_onnx.py +209 -0
  151. effero-0.1.0/tests/test_wyoming.py +73 -0
@@ -0,0 +1,2 @@
1
+ # These owners will be the default owners for everything in the repo.
2
+ * @thrive-spectrexq
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: Bug report
3
+ about: Report something that isn't working as expected
4
+ title: "[Bug] "
5
+ labels: bug
6
+ assignees: ""
7
+ ---
8
+
9
+ > ⚠️ If this bug involves a **security or physical-safety** vulnerability (e.g. a skill executing without proper approval, a guardrail bypass, an e-stop failure), please do **not** file it here — follow [`SECURITY.md`](../../SECURITY.md) instead.
10
+
11
+ **Describe the bug**
12
+ A clear, concise description of what's wrong.
13
+
14
+ **To reproduce**
15
+ Steps to reproduce the behavior:
16
+ 1. ...
17
+ 2. ...
18
+ 3. ...
19
+
20
+ **Expected behavior**
21
+ What you expected to happen instead.
22
+
23
+ **Environment**
24
+ - Effero version / commit:
25
+ - Python version:
26
+ - OS:
27
+ - Relevant extras installed (e.g. `voice`, `vision`, `ros2`, `iot`):
28
+ - Hardware involved, if any (robot/board/IoT device model):
29
+
30
+ **Logs / traceback**
31
+ ```
32
+ paste any relevant output here
33
+ ```
34
+
35
+ **Additional context**
36
+ Anything else that might help — config files, a minimal reproduction repo, etc.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest a new skill, adapter, perception backend, or core capability
4
+ title: "[Feature] "
5
+ labels: enhancement
6
+ assignees: ""
7
+ ---
8
+
9
+ **What layer does this touch?**
10
+ (e.g. core/orchestrator, memory, a specific skill, an adapter, a perception backend, safety policy, docs)
11
+
12
+ **What problem does this solve?**
13
+ A clear description of the use case or gap — what can't you do today?
14
+
15
+ **Proposed approach**
16
+ If you have one in mind: what would the skill/adapter/API look like? Feel free to sketch a rough function signature or config shape.
17
+
18
+ **Safety considerations (if applicable)**
19
+ If this involves a new skill or adapter that can act on the physical world, what `SafetyClass` do you think it warrants, and why?
20
+
21
+ **Alternatives considered**
22
+ Any other approaches you thought about and why you didn't prefer them.
23
+
24
+ **Additional context**
25
+ Links, references, related issues/PRs, etc.
@@ -0,0 +1,33 @@
1
+ ## Summary
2
+
3
+ <!-- What does this PR do, and why? -->
4
+
5
+ ## Type of change
6
+
7
+ - [ ] New skill
8
+ - [ ] New adapter
9
+ - [ ] New perception backend
10
+ - [ ] Core runtime (orchestrator / memory / router)
11
+ - [ ] Safety / guardrail policy
12
+ - [ ] Docs / examples
13
+ - [ ] Other (describe above)
14
+
15
+ ## Checklist
16
+
17
+ - [ ] Tests added or updated, and `pytest` passes locally
18
+ - [ ] `ruff check .` and `ruff format --check .` pass
19
+ - [ ] New skills declare an explicit, deliberate `safety_class` (see `CONTRIBUTING.md`)
20
+ - [ ] Any new hardware/network dependency is behind an optional extra in `pyproject.toml`, not a hard dependency
21
+ - [ ] Docs/README/examples updated if behavior or structure changed
22
+
23
+ ## Safety impact
24
+
25
+ <!--
26
+ If this PR adds or changes anything that can act on physical hardware
27
+ (a skill, an adapter, a safety policy), describe the safety implications
28
+ here explicitly, even if you believe they're minor.
29
+ -->
30
+
31
+ ## Related issues
32
+
33
+ <!-- e.g. Closes #123 -->
@@ -0,0 +1,80 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_call:
9
+
10
+ jobs:
11
+ test:
12
+ name: test (py${{ matrix.python-version }})
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ python-version: ["3.11", "3.12"]
18
+
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+
22
+ - name: Set up Python ${{ matrix.python-version }}
23
+ uses: actions/setup-python@v5
24
+ with:
25
+ python-version: ${{ matrix.python-version }}
26
+ cache: "pip"
27
+
28
+ - name: Install project (dev, llm extras)
29
+ run: pip install -e ".[dev,llm]"
30
+
31
+ - name: Lint (ruff check)
32
+ run: ruff check .
33
+
34
+ - name: Format check (ruff format)
35
+ run: ruff format --check .
36
+
37
+ - name: Type check (mypy)
38
+ run: mypy src/effero tests --ignore-missing-imports
39
+
40
+ - name: Install Playwright browsers
41
+ run: playwright install --with-deps chromium
42
+
43
+ - name: Run tests
44
+ run: pytest --cov=effero --cov-report=term-missing
45
+
46
+ rust:
47
+ name: rust (${{ matrix.crate }})
48
+ runs-on: ubuntu-latest
49
+ strategy:
50
+ fail-fast: false
51
+ matrix:
52
+ crate: [effero-safety-kernel, effero-edge-mcp]
53
+
54
+ steps:
55
+ - uses: actions/checkout@v4
56
+
57
+ - name: Install Rust (stable)
58
+ uses: dtolnay/rust-toolchain@stable
59
+
60
+ - uses: Swatinem/rust-cache@v2
61
+ with:
62
+ workspaces: ". -> target"
63
+
64
+ - name: Build
65
+ run: cargo build -p ${{ matrix.crate }}
66
+
67
+ - name: Test
68
+ run: cargo test -p ${{ matrix.crate }}
69
+
70
+ - name: Clippy
71
+ run: cargo clippy -p ${{ matrix.crate }} -- -D warnings
72
+
73
+ docker:
74
+ name: docker build smoke test
75
+ runs-on: ubuntu-latest
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+
79
+ - name: Build Docker image
80
+ run: docker build -t effero:test .
@@ -0,0 +1,72 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write # needed for gh release create
9
+ id-token: write # needed for PyPI trusted publishing
10
+
11
+ jobs:
12
+ # ── Gate: run full CI first ──────────────────────────────────
13
+ ci:
14
+ uses: ./.github/workflows/ci.yml
15
+
16
+ # ── Build distribution artifacts ────────────────────────────
17
+ build:
18
+ name: Build sdist & wheel
19
+ needs: ci
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "3.12"
27
+
28
+ - name: Install build frontend
29
+ run: pip install build
30
+
31
+ - name: Build package
32
+ run: python -m build
33
+
34
+ - uses: actions/upload-artifact@v4
35
+ with:
36
+ name: dist
37
+ path: dist/
38
+
39
+ # ── Publish to PyPI ─────────────────────────────────────────
40
+ publish:
41
+ name: Publish to PyPI
42
+ needs: build
43
+ runs-on: ubuntu-latest
44
+ environment: pypi
45
+ steps:
46
+ - uses: actions/download-artifact@v4
47
+ with:
48
+ name: dist
49
+ path: dist/
50
+
51
+ - uses: pypa/gh-action-pypi-publish@release/v1
52
+
53
+ # ── Create GitHub Release ───────────────────────────────────
54
+ github-release:
55
+ name: Create GitHub Release
56
+ needs: publish
57
+ runs-on: ubuntu-latest
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+
61
+ - uses: actions/download-artifact@v4
62
+ with:
63
+ name: dist
64
+ path: dist/
65
+
66
+ - name: Create Release
67
+ env:
68
+ GH_TOKEN: ${{ github.token }}
69
+ run: |
70
+ gh release create "${{ github.ref_name }}" dist/* \
71
+ --title "Effero ${{ github.ref_name }}" \
72
+ --notes-file CHANGELOG.md
@@ -0,0 +1,57 @@
1
+ # Byte-compiled / cache
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ .pytest_cache/
6
+ .mypy_cache/
7
+ .ruff_cache/
8
+
9
+ # Packaging / build artifacts
10
+ build/
11
+ dist/
12
+ *.egg-info/
13
+ .eggs/
14
+
15
+ # Virtual environments
16
+ .venv/
17
+ venv/
18
+ env/
19
+
20
+ # Environment / secrets
21
+ .env
22
+ .env.*
23
+ !.env.example
24
+
25
+ # Editors / OS
26
+ .vscode/
27
+ .idea/
28
+ .DS_Store
29
+ Thumbs.db
30
+
31
+ # Coverage
32
+ .coverage
33
+ .coverage.*
34
+ htmlcov/
35
+
36
+ # Model weights / local caches (voice, vision, VLA checkpoints etc.)
37
+ models/
38
+ *.gguf
39
+ *.onnx
40
+ *.pt
41
+ *.ckpt
42
+
43
+ # Logs and local runtime state
44
+ *.log
45
+ .effero/
46
+ sessions/
47
+
48
+ # Rust
49
+ /target/
50
+ **/target/
51
+
52
+
53
+ # Agent scratch and teamwork coordination metadata
54
+ .agents/
55
+ ORIGINAL_REQUEST.md
56
+ PROJECT.md
57
+ TEST_INFRA.md
@@ -0,0 +1,46 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0] - 2026-09-08
11
+
12
+ ### Added
13
+ - **Fleet Consensus Integration (`core.fleet`)**:
14
+ - `FleetConfig` model added to `EfferoConfig` (`enabled`, `default_lease_duration`).
15
+ - Opt-in `FleetCoordinator` integration directly in `Agent.__init__`.
16
+ - Task announcement EventBus broadcast (`fleet.cfp.announced`) on `FleetCoordinator.announce_task()`.
17
+ - Failover re-auction history tracking: preservation of `reauction_round`, `previous_bids_count`, and prior metadata.
18
+ - **Hardware MCP Server Unit Testing (`crates/effero-edge-mcp`)**:
19
+ - 3 unit tests added for `EdgeDevice`: default pin state verification, digital write/read state validation, and out-of-range bounds error handling.
20
+ - **Test Coverage Expansion (Zero-Mock)**:
21
+ - `tests/test_config_env.py`: Verified backend-specific API key loading without environment variable clobbering.
22
+ - `tests/test_fleet_coordinator_integration.py`: End-to-end testing of EventBus CFP broadcasting, lease ID consistency, unrevealed sealed bid rejection, and failover re-auction round tracking.
23
+ - `tests/test_a2a_protocol.py`: Testing `AgentCard` serialization, `TaskMessage` lifecycle, and `A2ATaskManager` execution with both standalone and real Agent instances.
24
+ - `tests/test_cli_commands.py`: Unit tests for `build_parser`, `--version`, `skills`, and project scaffolding `init`.
25
+ - `tests/test_server_websockets.py`: Full WebSocket ping/pong lifecycle, `/v1/approvals` GET/POST resolution, and `/v1/memory` inspection using real production `Agent`.
26
+
27
+ ### Fixed
28
+ - **Security / Protocol**:
29
+ - Fixed sealed bid integrity bypass in `SealedBidAuction.close_auction()`: bids with declared commitment hashes that failed to reveal their salt are now strictly rejected.
30
+ - Fixed `TaskLease` ID divergence between `TaskAward` and `LeaseManager.create_lease()`.
31
+ - Fixed `EfferoConfig.from_env()` key clobbering across multiple provider environment variables (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`).
32
+ - Fixed `EventBus.publish()` and `server.py:handle_approval_request()` crashing synchronous callers with `RuntimeError: no running event loop`.
33
+ - **Runtime & Cross-Platform**:
34
+ - Fixed blocking `input()` in interactive CLI REPL (`cli.py:run_repl`) by wrapping in `loop.run_in_executor`.
35
+ - Fixed Windows `connect_read_pipe` incompatibility with ProactorEventLoop in `cli.py:serve_mcp` by using non-blocking executor reads.
36
+ - Fixed `google_backend.py` compatibility with newer `google-genai` SDK (`Part` constructor, union guards, type-annotated tool arguments).
37
+ - Fixed duplicate `module` import symbol in `src/effero/core/router/__init__.py`.
38
+ - Fixed type narrowing on `select_best_node()` in `test_fleet_auction.py`.
39
+ - Resolved all 13 `mypy` static typing errors across the entire codebase.
40
+
41
+ ### Changed
42
+ - **Zero-Mock Production Cleanliness**:
43
+ - Removed silent mock API fallback mode in `CloudAPIAdapter` (`adapters/cloud_api/client.py`); now raises explicit `RuntimeError` when unconnected or dependencies are missing.
44
+ - Removed obsolete "mock fallback" docstrings and unused `_is_mock` flag in `BrowserController` (`skills/computer_use/browser.py`).
45
+ - Centralized `BUILTIN_SKILL_MODULES` constant in `effero.sdk` and deduplicated across `Agent`, `cli.list_skills`, and `cli.serve_mcp`.
46
+ - Updated `effero-safety-kernel/README.md` to reflect actual TCP transport (`127.0.0.1:9400`) rather than Unix domain socket.
@@ -0,0 +1,139 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in
6
+ our community a harassment-free experience for everyone, regardless of
7
+ age, body size, visible or invisible disability, ethnicity, sex
8
+ characteristics, gender identity and expression, level of experience,
9
+ education, socio-economic status, nationality, personal appearance,
10
+ race, religion, or sexual identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open,
13
+ welcoming, diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ - Demonstrating empathy and kindness toward other people
21
+ - Being respectful of differing opinions, viewpoints, and experiences
22
+ - Giving and gracefully accepting constructive feedback
23
+ - Accepting responsibility and apologizing to those affected by our
24
+ mistakes, and learning from the experience
25
+ - Focusing on what is best not just for us as individuals, but for the
26
+ overall community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ - The use of sexualized language or imagery, and sexual attention or
31
+ advances of any kind
32
+ - Trolling, insulting or derogatory comments, and personal or political
33
+ attacks
34
+ - Public or private harassment
35
+ - Publishing others' private information, such as a physical or email
36
+ address, without their explicit permission
37
+ - Other conduct which could reasonably be considered inappropriate in a
38
+ professional setting
39
+
40
+ ## Enforcement Responsibilities
41
+
42
+ Community leaders are responsible for clarifying and enforcing our
43
+ standards of acceptable behavior and will take appropriate and fair
44
+ corrective action in response to any behavior that they deem
45
+ inappropriate, threatening, offensive, or harmful.
46
+
47
+ Community leaders have the right and responsibility to remove, edit, or
48
+ reject comments, commits, code, wiki edits, issues, and other
49
+ contributions that are not aligned to this Code of Conduct, and will
50
+ communicate reasons for moderation decisions when appropriate.
51
+
52
+ ## Scope
53
+
54
+ This Code of Conduct applies within all community spaces, and also
55
+ applies when an individual is officially representing the community in
56
+ public spaces. Examples of representing our community include using an
57
+ official e-mail address, posting via an official social media account,
58
+ or acting as an appointed representative at an online or offline event.
59
+
60
+ ## Enforcement
61
+
62
+ Instances of abusive, harassing, or otherwise unacceptable behavior may
63
+ be reported to the community leaders responsible for enforcement by
64
+ opening a confidential report via GitHub (or, if unavailable publicly,
65
+ via the contact method listed in the repository's profile). All
66
+ complaints will be reviewed and investigated promptly and fairly.
67
+
68
+ All community leaders are obligated to respect the privacy and security
69
+ of the reporter of any incident.
70
+
71
+ ## Enforcement Guidelines
72
+
73
+ Community leaders will follow these Community Impact Guidelines in
74
+ determining the consequences for any action they deem in violation of
75
+ this Code of Conduct:
76
+
77
+ ### 1. Correction
78
+
79
+ **Community Impact**: Use of inappropriate language or other behavior
80
+ deemed unprofessional or unwelcome in the community.
81
+
82
+ **Consequence**: A private, written warning from community leaders,
83
+ providing clarity around the nature of the violation and an explanation
84
+ of why the behavior was inappropriate. A public apology may be
85
+ requested.
86
+
87
+ ### 2. Warning
88
+
89
+ **Community Impact**: A violation through a single incident or series of
90
+ actions.
91
+
92
+ **Consequence**: A warning with consequences for continued behavior. No
93
+ interaction with the people involved, including unsolicited interaction
94
+ with those enforcing the Code of Conduct, for a specified period of
95
+ time. This includes avoiding interactions in community spaces as well as
96
+ external channels like social media. Violating these terms may lead to a
97
+ temporary or permanent ban.
98
+
99
+ ### 3. Temporary Ban
100
+
101
+ **Community Impact**: A serious violation of community standards,
102
+ including sustained inappropriate behavior.
103
+
104
+ **Consequence**: A temporary ban from any sort of interaction or public
105
+ communication with the community for a specified period of time. No
106
+ public or private interaction with the people involved, including
107
+ unsolicited interaction with those enforcing the Code of Conduct, is
108
+ allowed during this period. Violating these terms may lead to a
109
+ permanent ban.
110
+
111
+ ### 4. Permanent Ban
112
+
113
+ **Community Impact**: Demonstrating a pattern of violation of community
114
+ standards, including sustained inappropriate behavior, harassment of an
115
+ individual, or aggression toward or disparagement of classes of
116
+ individuals.
117
+
118
+ **Consequence**: A permanent ban from any sort of public interaction
119
+ within the community.
120
+
121
+ ## Attribution
122
+
123
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
124
+ version 2.1, available at
125
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
126
+
127
+ Community Impact Guidelines were inspired by
128
+ [Mozilla's code of conduct enforcement ladder][mozilla].
129
+
130
+ [homepage]: https://www.contributor-covenant.org
131
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
132
+ [mozilla]: https://github.com/mozilla/diversity
133
+
134
+ For answers to common questions about this code of conduct, see the FAQ
135
+ at [https://www.contributor-covenant.org/faq][faq]. Translations are
136
+ available at [https://www.contributor-covenant.org/translations][translations].
137
+
138
+ [faq]: https://www.contributor-covenant.org/faq
139
+ [translations]: https://www.contributor-covenant.org/translations
@@ -0,0 +1,104 @@
1
+ # Contributing to Effero
2
+
3
+ Thanks for considering a contribution — Effero is community-built from day one, and the easiest, highest-leverage contributions are new **skills** and **adapters**, not core-runtime changes. This guide covers both.
4
+
5
+ By participating in this project you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md).
6
+
7
+ ## Ways to contribute
8
+
9
+ - **New skills** (`src/effero/skills/`) — the easiest entry point. A skill is a small, testable function wrapped in `@skill(...)` (see `src/effero/sdk/skill.py` and the Quickstart in `README.md`).
10
+ - **New adapters** (`src/effero/adapters/`) — a new IoT protocol, robot middleware, or microcontroller board.
11
+ - **The Rust crates** (`crates/`) — the safety-kernel engine and the embedded MCP server template. See [`crates/README.md`](crates/README.md); `effero-edge-mcp` in particular needs someone to confirm it actually compiles on a modern toolchain (see that crate's README) — a great first Rust contribution.
12
+ - **New perception backends** (`src/effero/perception/`) — support for an ASR/TTS/vision/VLA model not yet wired in.
13
+ - **Safety policy review** (`src/effero/safety/`) — Effero touches physical hardware; extra scrutiny here is always welcome, even just review comments on a PR.
14
+ - **Docs and examples** (`docs/`, `examples/`) — a new worked example is often more valuable than a core-code PR.
15
+ - **Bug reports and feature requests** — use the issue templates; see [Reporting issues](#reporting-issues) below.
16
+
17
+ If you're not sure where something fits, open an issue first and ask — that's a completely valid way to start.
18
+
19
+ ## Development setup
20
+
21
+ Effero targets Python 3.11+.
22
+
23
+ ```bash
24
+ git clone https://github.com/thrive-spectrexq/effero.git
25
+ cd effero
26
+ python -m venv .venv
27
+ source .venv/bin/activate # .venv\Scripts\activate on Windows
28
+ pip install -e ".[dev]"
29
+ ```
30
+
31
+ Optional extras (`voice`, `vision`, `ros2`, `iot`) pull in the corresponding heavier dependencies and are only needed if you're touching that subsystem:
32
+
33
+ ```bash
34
+ pip install -e ".[dev,voice]"
35
+ ```
36
+
37
+ ### Rust crates
38
+
39
+ The `crates/` workspace (safety kernel + edge MCP server) needs Rust
40
+ 1.85+ (Rust 2024 edition). `rust-toolchain.toml` at the repo root pins
41
+ `channel = "stable"`, so `rustup` fetches the right version automatically:
42
+
43
+ ```bash
44
+ cargo build --workspace
45
+ cargo test --workspace
46
+ ```
47
+
48
+ See [`crates/README.md`](crates/README.md) for the status of each crate
49
+ before you start — one builds and is tested, the other needs its first
50
+ real compile.
51
+
52
+ ### Running checks locally
53
+
54
+ ```bash
55
+ pytest # tests
56
+ ruff check . # lint
57
+ ruff format --check . # formatting
58
+ mypy src/effero # type checking
59
+ ```
60
+
61
+ CI runs the same checks on every pull request (`.github/workflows/ci.yml`) — please make sure they pass locally first.
62
+
63
+ ## Adding a new skill
64
+
65
+ 1. Pick the right subpackage under `src/effero/skills/` (`robotics/`, `iot/`, `computer_use/`, or `community/` for anything that doesn't fit a first-party category yet).
66
+ 2. Write the skill as a plain, typed Python function and wrap it with `@skill(name=..., description=..., safety_class=...)`.
67
+ 3. **Choose the safety class deliberately** — see the enum docstring in `src/effero/sdk/skill.py`:
68
+ - `READ_ONLY` for anything that cannot change external state.
69
+ - `ACT_AUTONOMOUS` only for actions you're confident are safe to run unattended.
70
+ - `ACT_WITH_APPROVAL` for anything with real-world consequences you're not fully confident about.
71
+ - `ACT_RESTRICTED` (the default posture for new community skills) — simulation/dry-run only until a maintainer promotes it.
72
+ 4. Add a unit test under `tests/`.
73
+ 5. If the skill needs a new declarative safety rule, propose it in `src/effero/safety/policies/` as part of the same PR, and call it out explicitly in the PR description.
74
+
75
+ ## Adding a new adapter
76
+
77
+ Adapters live in `src/effero/adapters/` and should:
78
+
79
+ - Keep any heavy/optional dependency (e.g. `rclpy`, `paho-mqtt`) behind an optional extra in `pyproject.toml`, not a hard dependency — see the existing `ros2` and `iot` extras for the pattern.
80
+ - Avoid importing the optional dependency at module top-level, so `import effero` keeps working on machines that don't have that hardware stack installed.
81
+ - Come with at least one example under `examples/` showing it wired into a real (or simulated) device.
82
+
83
+ ## Pull request checklist
84
+
85
+ - [ ] Tests added or updated, and `pytest` passes locally.
86
+ - [ ] `ruff check .` and `ruff format --check .` pass.
87
+ - [ ] New skills declare an explicit, deliberate `safety_class`.
88
+ - [ ] Any new hardware/network dependency is behind an optional extra, not a hard dependency.
89
+ - [ ] Docs/README/examples updated if behavior or structure changed.
90
+ - [ ] Commits are reasonably scoped and the PR description explains *why*, not just *what*.
91
+
92
+ ## Reporting issues
93
+
94
+ Please use the issue templates (`.github/ISSUE_TEMPLATE/`) for bug reports and feature requests. For anything touching **physical safety** (a skill or adapter that could cause real-world harm if it misbehaves), please say so explicitly in the issue title or first line — those get prioritized.
95
+
96
+ If you believe you've found a security vulnerability, please follow [`SECURITY.md`](SECURITY.md) instead of opening a public issue.
97
+
98
+ ## Commit and review conventions
99
+
100
+ - Prefer small, focused PRs over large ones — easier to review, easier to revert if something's wrong.
101
+ - Write commit messages that explain intent (`fix: guard against negative celsius in thermostat skill`, not `fix bug`).
102
+ - One approving review from a maintainer is required to merge; PRs touching `src/effero/safety/` may require two.
103
+
104
+ Thank you for helping build this — even a single well-tested skill is a genuinely useful contribution.