65 lines
3.9 KiB
Markdown
65 lines
3.9 KiB
Markdown
# Universal Worker Agent Phase 2: Runtime Detection ↔ Worker Registration Integration
|
|
|
|
**Date**: 2026-02-05
|
|
|
|
## Summary
|
|
|
|
Integrated the Phase 1 runtime auto-detection module with the worker registration system so that `attune-agent` workers register with rich interpreter metadata (binary paths, versions) in their capabilities, enabling the system to distinguish agents from standard workers and know exactly which interpreters are available and where.
|
|
|
|
## Changes
|
|
|
|
### 1. `crates/worker/src/runtime_detect.rs`
|
|
- Added `Serialize` and `Deserialize` derives to `DetectedRuntime` so instances can be stored as structured JSON in worker capabilities.
|
|
|
|
### 2. `crates/worker/src/registration.rs`
|
|
- Added `use crate::runtime_detect::DetectedRuntime` import.
|
|
- Added `set_detected_runtimes(&mut self, runtimes: Vec<DetectedRuntime>)` method that stores detected interpreter metadata under the `detected_interpreters` capability key as a JSON array of `{name, path, version}` objects.
|
|
- Added `set_agent_mode(&mut self, is_agent: bool)` method that sets an `agent_mode` boolean capability to distinguish agent workers from standard workers.
|
|
- Both methods are additive — the existing `runtimes` string list capability remains for backward compatibility.
|
|
|
|
### 3. `crates/worker/src/service.rs`
|
|
- Added `detected_runtimes: Option<Vec<DetectedRuntime>>` field to `WorkerService` (initialized to `None` in `new()`).
|
|
- Added `pub fn with_detected_runtimes(mut self, runtimes: Vec<DetectedRuntime>) -> Self` builder method that stores agent detection results for use during `start()`.
|
|
- Updated `start()` to call `registration.set_detected_runtimes()` and `registration.set_agent_mode(true)` before `register()` when detected runtimes are present.
|
|
- Standard `attune-worker` binary is completely unaffected — the field stays `None` and no agent-specific code runs.
|
|
|
|
### 4. `crates/worker/src/agent_main.rs`
|
|
- Added `agent_detected_runtimes: Option<Vec<DetectedRuntime>>` variable to stash detection results.
|
|
- After auto-detection runs and sets `ATTUNE_WORKER_RUNTIMES`, the detected `Vec` is saved into `agent_detected_runtimes`.
|
|
- After `WorkerService::new()`, calls `.with_detected_runtimes(detected)` if auto-detection ran, so the registration includes full interpreter metadata.
|
|
|
|
### 5. `crates/worker/src/lib.rs`
|
|
- Added `pub use runtime_detect::DetectedRuntime` re-export for convenient access.
|
|
|
|
## Capability Format
|
|
|
|
After Phase 2, an agent worker's `capabilities` JSON in the `worker` table looks like:
|
|
|
|
```json
|
|
{
|
|
"runtimes": ["shell", "python", "node"],
|
|
"max_concurrent_executions": 10,
|
|
"worker_version": "0.1.0",
|
|
"agent_mode": true,
|
|
"detected_interpreters": [
|
|
{"name": "shell", "path": "/bin/bash", "version": "5.2.15"},
|
|
{"name": "python", "path": "/usr/bin/python3", "version": "3.12.1"},
|
|
{"name": "node", "path": "/usr/bin/node", "version": "20.11.0"}
|
|
]
|
|
}
|
|
```
|
|
|
|
Standard `attune-worker` instances do NOT have `agent_mode` or `detected_interpreters` keys.
|
|
|
|
## Design Decisions
|
|
|
|
- **Builder pattern** (`with_detected_runtimes`) rather than a separate constructor — keeps the API surface minimal and avoids duplicating `new()` logic.
|
|
- **Explicit `set_agent_mode`** separate from `set_detected_runtimes` — allows independent control, though in practice they're always called together for agents.
|
|
- **JSON serialization via `serde_json::json!()` macro** rather than `serde_json::to_value(&runtimes)` — gives explicit control over the capability shape and avoids coupling the DB format to the Rust struct layout.
|
|
- **No changes to the `Worker` model or database schema** — `detected_interpreters` and `agent_mode` are stored inside the existing `capabilities` JSONB column.
|
|
|
|
## Verification
|
|
|
|
- `cargo check --workspace` — zero errors, zero warnings
|
|
- `cargo test -p attune-worker` — 139 tests pass (105 unit + 17 dependency isolation + 8 log truncation + 7 security + 2 doc-tests)
|
|
- Standard `attune-worker` binary path is completely unchanged |