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.
- effero-0.1.0/.github/CODEOWNERS +2 -0
- effero-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
- effero-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +25 -0
- effero-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +33 -0
- effero-0.1.0/.github/workflows/ci.yml +80 -0
- effero-0.1.0/.github/workflows/release.yml +72 -0
- effero-0.1.0/.gitignore +57 -0
- effero-0.1.0/CHANGELOG.md +46 -0
- effero-0.1.0/CODE_OF_CONDUCT.md +139 -0
- effero-0.1.0/CONTRIBUTING.md +104 -0
- effero-0.1.0/Cargo.lock +915 -0
- effero-0.1.0/Cargo.toml +13 -0
- effero-0.1.0/Dockerfile +23 -0
- effero-0.1.0/LICENSE +201 -0
- effero-0.1.0/PKG-INFO +415 -0
- effero-0.1.0/README.md +345 -0
- effero-0.1.0/SECURITY.md +32 -0
- effero-0.1.0/crates/README.md +60 -0
- effero-0.1.0/crates/effero-edge-mcp/Cargo.toml +11 -0
- effero-0.1.0/crates/effero-edge-mcp/README.md +76 -0
- effero-0.1.0/crates/effero-edge-mcp/src/main.rs +140 -0
- effero-0.1.0/crates/effero-safety-kernel/Cargo.toml +15 -0
- effero-0.1.0/crates/effero-safety-kernel/README.md +130 -0
- effero-0.1.0/crates/effero-safety-kernel/policies/example.yaml +39 -0
- effero-0.1.0/crates/effero-safety-kernel/src/bin/effero-safety-kerneld.rs +70 -0
- effero-0.1.0/crates/effero-safety-kernel/src/condition.rs +377 -0
- effero-0.1.0/crates/effero-safety-kernel/src/engine.rs +160 -0
- effero-0.1.0/crates/effero-safety-kernel/src/lib.rs +20 -0
- effero-0.1.0/crates/effero-safety-kernel/src/policy.rs +76 -0
- effero-0.1.0/crates/effero-safety-kernel/src/server.rs +93 -0
- effero-0.1.0/crates/effero-safety-kernel/tests/integration.rs +45 -0
- effero-0.1.0/docker-compose.yml +13 -0
- effero-0.1.0/docs/architecture.md +11 -0
- effero-0.1.0/examples/desktop-copilot/README.md +20 -0
- effero-0.1.0/examples/desktop-copilot/effero.yaml +13 -0
- effero-0.1.0/examples/desktop-copilot/main.py +33 -0
- effero-0.1.0/examples/local-smart-home/README.md +51 -0
- effero-0.1.0/examples/local-smart-home/effero.yaml +31 -0
- effero-0.1.0/examples/local-smart-home/main.py +33 -0
- effero-0.1.0/pyproject.toml +89 -0
- effero-0.1.0/rust-toolchain.toml +2 -0
- effero-0.1.0/src/effero/__init__.py +26 -0
- effero-0.1.0/src/effero/adapters/__init__.py +21 -0
- effero-0.1.0/src/effero/adapters/base.py +22 -0
- effero-0.1.0/src/effero/adapters/cloud_api/__init__.py +7 -0
- effero-0.1.0/src/effero/adapters/cloud_api/client.py +68 -0
- effero-0.1.0/src/effero/adapters/mqtt_matter/__init__.py +66 -0
- effero-0.1.0/src/effero/adapters/mqtt_matter/client.py +583 -0
- effero-0.1.0/src/effero/adapters/mqtt_matter/matter.py +609 -0
- effero-0.1.0/src/effero/adapters/mqtt_matter/protocol.py +593 -0
- effero-0.1.0/src/effero/adapters/mqtt_matter/telemetry.py +410 -0
- effero-0.1.0/src/effero/adapters/ros2/__init__.py +23 -0
- effero-0.1.0/src/effero/adapters/ros2/bridge.py +479 -0
- effero-0.1.0/src/effero/adapters/serial_gpio/__init__.py +31 -0
- effero-0.1.0/src/effero/adapters/serial_gpio/client.py +216 -0
- effero-0.1.0/src/effero/adapters/serial_gpio/framing.py +501 -0
- effero-0.1.0/src/effero/config.py +97 -0
- effero-0.1.0/src/effero/core/__init__.py +15 -0
- effero-0.1.0/src/effero/core/agent/__init__.py +134 -0
- effero-0.1.0/src/effero/core/event_bus.py +64 -0
- effero-0.1.0/src/effero/core/fleet/__init__.py +34 -0
- effero-0.1.0/src/effero/core/fleet/auction.py +680 -0
- effero-0.1.0/src/effero/core/fleet/coordinator.py +254 -0
- effero-0.1.0/src/effero/core/memory/__init__.py +21 -0
- effero-0.1.0/src/effero/core/memory/episodic.py +52 -0
- effero-0.1.0/src/effero/core/memory/semantic.py +226 -0
- effero-0.1.0/src/effero/core/memory/working.py +52 -0
- effero-0.1.0/src/effero/core/planner/__init__.py +7 -0
- effero-0.1.0/src/effero/core/planner/planner.py +190 -0
- effero-0.1.0/src/effero/core/router/__init__.py +29 -0
- effero-0.1.0/src/effero/core/router/anthropic_backend.py +98 -0
- effero-0.1.0/src/effero/core/router/base.py +52 -0
- effero-0.1.0/src/effero/core/router/google_backend.py +166 -0
- effero-0.1.0/src/effero/core/router/openai_backend.py +96 -0
- effero-0.1.0/src/effero/core/router/router.py +80 -0
- effero-0.1.0/src/effero/interfaces/__init__.py +1 -0
- effero-0.1.0/src/effero/interfaces/cli.py +196 -0
- effero-0.1.0/src/effero/interfaces/server.py +310 -0
- effero-0.1.0/src/effero/interfaces/static/index.html +325 -0
- effero-0.1.0/src/effero/perception/__init__.py +23 -0
- effero-0.1.0/src/effero/perception/audio/__init__.py +25 -0
- effero-0.1.0/src/effero/perception/audio/asr.py +138 -0
- effero-0.1.0/src/effero/perception/audio/pipeline.py +106 -0
- effero-0.1.0/src/effero/perception/audio/tts.py +96 -0
- effero-0.1.0/src/effero/perception/base.py +30 -0
- effero-0.1.0/src/effero/perception/sensors/__init__.py +17 -0
- effero-0.1.0/src/effero/perception/sensors/pipeline.py +143 -0
- effero-0.1.0/src/effero/perception/vision/__init__.py +43 -0
- effero-0.1.0/src/effero/perception/vision/detector.py +143 -0
- effero-0.1.0/src/effero/perception/vision/pipeline.py +75 -0
- effero-0.1.0/src/effero/perception/vision/stream.py +360 -0
- effero-0.1.0/src/effero/perception/vision/vla.py +526 -0
- effero-0.1.0/src/effero/protocols/__init__.py +27 -0
- effero-0.1.0/src/effero/protocols/a2a.py +183 -0
- effero-0.1.0/src/effero/protocols/mcp_server.py +102 -0
- effero-0.1.0/src/effero/protocols/wyoming.py +258 -0
- effero-0.1.0/src/effero/py.typed +1 -0
- effero-0.1.0/src/effero/safety/__init__.py +48 -0
- effero-0.1.0/src/effero/safety/approval.py +152 -0
- effero-0.1.0/src/effero/safety/client.py +70 -0
- effero-0.1.0/src/effero/safety/policies/example.yaml +39 -0
- effero-0.1.0/src/effero/sdk/__init__.py +9 -0
- effero-0.1.0/src/effero/sdk/skill.py +132 -0
- effero-0.1.0/src/effero/skills/__init__.py +10 -0
- effero-0.1.0/src/effero/skills/community/__init__.py +6 -0
- effero-0.1.0/src/effero/skills/computer_use/__init__.py +70 -0
- effero-0.1.0/src/effero/skills/computer_use/browser.py +160 -0
- effero-0.1.0/src/effero/skills/computer_use/desktop.py +1170 -0
- effero-0.1.0/src/effero/skills/computer_use/file_ops.py +57 -0
- effero-0.1.0/src/effero/skills/computer_use/shell.py +38 -0
- effero-0.1.0/src/effero/skills/iot/__init__.py +18 -0
- effero-0.1.0/src/effero/skills/iot/lights.py +49 -0
- effero-0.1.0/src/effero/skills/iot/sensors.py +30 -0
- effero-0.1.0/src/effero/skills/iot/thermostat.py +43 -0
- effero-0.1.0/src/effero/skills/robotics/__init__.py +56 -0
- effero-0.1.0/src/effero/skills/robotics/arm.py +330 -0
- effero-0.1.0/src/effero/skills/robotics/collision.py +340 -0
- effero-0.1.0/src/effero/skills/robotics/navigate.py +193 -0
- effero-0.1.0/src/effero/skills/robotics/trajectory.py +355 -0
- effero-0.1.0/tests/test_a2a_protocol.py +101 -0
- effero-0.1.0/tests/test_actuator_framing.py +475 -0
- effero-0.1.0/tests/test_browser_real.py +75 -0
- effero-0.1.0/tests/test_browser_skills.py +25 -0
- effero-0.1.0/tests/test_cli.py +20 -0
- effero-0.1.0/tests/test_cli_commands.py +52 -0
- effero-0.1.0/tests/test_config.py +81 -0
- effero-0.1.0/tests/test_config_env.py +79 -0
- effero-0.1.0/tests/test_desktop_real.py +543 -0
- effero-0.1.0/tests/test_event_bus.py +61 -0
- effero-0.1.0/tests/test_fleet.py +47 -0
- effero-0.1.0/tests/test_fleet_auction.py +746 -0
- effero-0.1.0/tests/test_fleet_coordinator_integration.py +181 -0
- effero-0.1.0/tests/test_hitl_approval.py +128 -0
- effero-0.1.0/tests/test_matter_commissioning.py +290 -0
- effero-0.1.0/tests/test_mcp_server.py +64 -0
- effero-0.1.0/tests/test_memory.py +59 -0
- effero-0.1.0/tests/test_mqtt_live.py +538 -0
- effero-0.1.0/tests/test_perception_video_real.py +349 -0
- effero-0.1.0/tests/test_planner.py +122 -0
- effero-0.1.0/tests/test_robotics_real.py +120 -0
- effero-0.1.0/tests/test_robotics_trajectory.py +352 -0
- effero-0.1.0/tests/test_router.py +99 -0
- effero-0.1.0/tests/test_safety_client.py +65 -0
- effero-0.1.0/tests/test_semantic_memory.py +95 -0
- effero-0.1.0/tests/test_server.py +98 -0
- effero-0.1.0/tests/test_server_websockets.py +79 -0
- effero-0.1.0/tests/test_skill_registry.py +125 -0
- effero-0.1.0/tests/test_telemetry_normalization.py +171 -0
- effero-0.1.0/tests/test_vla.py +42 -0
- effero-0.1.0/tests/test_vla_onnx.py +209 -0
- effero-0.1.0/tests/test_wyoming.py +73 -0
|
@@ -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
|
effero-0.1.0/.gitignore
ADDED
|
@@ -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.
|