chore: v0.2.2 release — arbitrary socket names #32

Open
mahmoud wants to merge 29 commits from development into main
Owner

Includes fix for arbitrary socket name routing (explorer_rpc.sock etc).

Includes fix for arbitrary socket name routing (explorer_rpc.sock etc).
Fix agent Python executor for hyphenated service names (#26)
Some checks failed
Build & Test / check (push) Failing after 36s
33e984809f
- to_class_name() now splits on both '_' and '-' so recipe-server → RecipeServer
- Add to_python_module_name() to normalize hyphens → underscores for Python identifiers
- Cache files, staged clients, and interface stubs all use normalized names
- LLM system prompt explicitly forbids pip install — all clients are pre-staged
- Add tests for hyphenated service name handling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace persistent venv with uv run --isolated for sandboxed execution (#26)
Some checks failed
Build & Test / check (push) Failing after 37s
0907936af8
Remove all venv creation/management code (ensure_python_env, python_executable).
Scripts now execute via `uv run --script --no-project --isolated` which gives
each invocation a clean, ephemeral environment with no state leakage between
runs. Falls back to python3 if uv is not available.

This eliminates:
- Persistent venv at ~/.hero/var/router/python/venv
- Complex uv/python3 venv creation fallback chain
- Risk of stale packages or side effects between agent runs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add dynamic models, agent_run MCP tool, and improved error display (#27)
Some checks failed
Build & Test / check (push) Failing after 55s
6f0bf37619
- Add GET /api/models endpoint proxying ai.models to hero_aibroker
- Replace hard-coded 3-model dropdown with dynamic fetch from all providers
- Add agent_run tool to every service's MCP tools/list and tools/call
- Improve agent error display with alert styling and formatted answers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge development_26 and development_27 into development
Some checks failed
Build & Test / check (push) Failing after 38s
960e05dafe
Brings in:
- #26: Fix hyphenated service names, sandboxed uv run execution
- #27: Dynamic models, agent_run MCP tool, improved error display

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix models endpoint to handle ai.models OpenAI-compatible response format
Some checks failed
Build & Test / check (push) Failing after 35s
0374d48ae3
ai.models returns {object:"list", data:[{id:...}]}, not {models:[...]}.
Extract the data array in Rust and handle all response shapes in JS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: support arbitrary socket names in URL routing
All checks were successful
Build & Test / check (push) Successful in 2m38s
Build & Test / check (pull_request) Successful in 2m32s
c6ed792555
Before: /{service}/{name}/* where name is not rpc/ui/admin/rest/api
mapped to web_{name}.sock. Custom sockets like explorer_rpc.sock
were unreachable.

Now: check if {name}.sock exists directly on disk first. Only fall
back to web_{name}.sock if the direct name doesn't exist.

Closes #28
Reviewed-on: #29
chore: bump version to 0.2.1
Some checks failed
Create Release / build (linux-amd64-musl, true, x86_64-unknown-linux-musl) (push) Failing after 3s
Build & Test / check (push) Has been cancelled
Build & Test / check (pull_request) Has been cancelled
12f42cd2ad
Merge branch 'main' into development
All checks were successful
Build & Test / check (push) Successful in 2m51s
Build & Test / check (pull_request) Successful in 3m23s
9328552a5c
Add global multi-service agent with intelligent service selection (#31)
Some checks failed
Build & Test / check (push) Failing after 38s
760e682309
Two-step pipeline: LLM first selects which services the prompt needs
from a catalog of all healthy services, then generates a multi-service
Python script using all selected clients.

- Add run_global_agent() with build_service_catalog() and LLM selector
- Add POST /api/agent global endpoint (no service name in URL)
- Add Agent button to navbar with full agent panel UI
- Supports model selection, retries, answer/output/script tabs
- Shows which services were selected in the result badge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
chore: bump version to 0.2.2
Some checks failed
Build & Test / check (push) Failing after 37s
Build & Test / check (pull_request) Failing after 41s
dd7814c818
style: apply cargo fmt to agent.rs and routes.rs
All checks were successful
Build & Test / check (pull_request) Successful in 2m35s
Build & Test / check (push) Successful in 2m54s
e2b3d9c703
merge: main into development — resolve conflicts
Some checks failed
Build & Test / check (push) Failing after 40s
Build & Test / check (pull_request) Failing after 56s
d31a594ebf
mahmoud force-pushed development from d31a594ebf
Some checks failed
Build & Test / check (push) Failing after 40s
Build & Test / check (pull_request) Failing after 56s
to e2b3d9c703
All checks were successful
Build & Test / check (pull_request) Successful in 2m35s
Build & Test / check (push) Successful in 2m54s
2026-04-10 15:32:05 +00:00
Compare
feat: integrate hero_logic for DAG-based agent execution
Some checks failed
Build & Test / check (push) Failing after 37s
Build & Test / check (pull_request) Failing after 58s
68c8a14eb0
Add optional hero_logic integration to agent endpoints. When hero_logic
is running (socket detected), agent requests are delegated to it for
DAG-based workflow execution with per-node logging, token tracking, and
configurable pipelines. Falls back gracefully to the existing inline
pipeline when hero_logic is unavailable.

New functions:
- logic_socket_path(), call_logic_rpc(), wait_for_play() - RPC helpers
- run_agent_via_logic() - single-service agent via hero_logic
- run_global_agent_via_logic() - multi-service agent via hero_logic
- extract_agent_response() - maps hero_logic Play to AgentResponse

Refs: #34

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: remove inline agent pipeline, use hero_logic exclusively
Some checks failed
Build & Test / check (push) Failing after 36s
Build & Test / check (pull_request) Failing after 38s
e17652eb51
Strip out the entire duplicated inline pipeline (LLM calls, script
execution, retry loops, summarization) from agent.rs. The agent now
delegates exclusively to hero_logic for DAG-based workflow execution.

Removed ~740 lines of code:
- execute_script(), is_command_available(), ExecutionResult
- call_llm(), strip_code_fences()
- summarize_result(), summarize_error(), summarize_global_result()
- All inline retry/execution logic in run_agent() and run_global_agent()

Kept: service context prep (interfaces, client staging, catalog),
hero_logic RPC helpers, fetch_models().

Refs: #34

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: unify single-service and global agent into one code path
Some checks failed
Build & Test / check (push) Failing after 33s
Build & Test / check (pull_request) Failing after 35s
71240fcc56
Service agent is just a global agent with a single-entry catalog.
Both endpoints now use the same `run_agent()` function with an optional
service filter, and the same `service_agent` workflow template.

Removed: AgentRequest/GlobalAgentRequest duplication,
AgentResponse/GlobalAgentResponse split, run_global_agent() function.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: chat-style agent UI with play detail endpoint
Some checks failed
Build & Test / check (push) Failing after 37s
Build & Test / check (pull_request) Failing after 37s
7421fd87e8
- Replace form-based agent panel with chat interface (message bubbles,
  conversation history, thinking indicator, collapsible script/output)
- Add play_sid to AgentResponse for hero_logic workflow tracing
- Add GET /api/agent/play/:play_sid proxy endpoint for play inspection
- Add Workflows link to hero_logic in both global and per-service agent
- Enter to send, Shift+Enter for newline, auto-resize textarea

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: sessions 17-18 — native dioxus islands, new URL routing, OSIS auth fix, build safety
Some checks are pending
Build & Test / check (push) Waiting to run
Build & Test / check (pull_request) Waiting to run
a5b4a6ee0a
- 18 native dioxus-bootstrap-css _app crates with ConnectionStatusIndicator
- Proxy → hero_router routing model (/<service>/<socket_type>/<path>)
- Socket convention migration (per-service directories)
- OSIS auth dispatch fix (OsisAppWrapper::handle_custom)
- Build parallelism limits for thermal safety
- hero_services → hero_zero rename
- Service TOML URL fixes for new routing pattern

Signed-off-by: mik-tf
fix: correct hero_logic socket path (underscore not hyphen)
Some checks failed
Build & Test / check (push) Failing after 54s
Build & Test / check (pull_request) Failing after 50s
471f4f5413
The socket is at hero_logic/rpc.sock, not hero-logic/rpc.sock.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add HTML play viewer page for agent workflow inspection
Some checks failed
Build & Test / check (pull_request) Failing after 39s
Build & Test / check (push) Failing after 41s
f07f866711
- Add GET /agent/play/:play_sid route that renders a user-friendly
  HTML page showing play status, node runs, logs, tokens, and errors
- Each node run is collapsible with input/output/error details
- Update chat UI play links to point to HTML viewer instead of raw JSON
- Raw JSON still available at GET /api/agent/play/:play_sid

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Update axum-core to 0.4.5 and matchit to 0.7.3.
- Update axum to 0.8.8 and matchit to 0.8.4.
- Replace resp.status() and resp.headers().clone() with resp.into_parts().
- Use Body::new(incoming) instead of Body::from(body_bytes).
- Add async-stream, async-stream-impl, async-tungstenite, axum, axum-core, byteorder, etc.
- Update several other dioxus-related dependencies.
Merge branch 'development' of https://forge.ourworld.tf/lhumina_code/hero_router into development
Some checks failed
Build & Test / check (pull_request) Failing after 37s
Build & Test / check (push) Failing after 42s
713cda27ac
refactor: Simplify conditional logic and signal usage
Some checks failed
Build & Test / check (push) Failing after 36s
Build & Test / check (pull_request) Failing after 37s
ddac499950
- Make `last_scan` signal immutable
- Combine fetch and deserialization for contexts
- Combine fetch and deserialization for logs
- Remove unused `log_id` variable
- Simplify `$ref` path splitting logic
- Simplify enum value checking
ci: Update CI to run separate checks
Some checks failed
Build & Test / check (push) Has been cancelled
Build & Test / check (pull_request) Has been cancelled
363802885a
- Add formatting check step
- Add clippy linting step
- Add separate test step
- Change build step to release build
ci: reorder and rename CI steps
All checks were successful
Build & Test / check (pull_request) Successful in 1m39s
Build & Test / check (push) Successful in 2m7s
5c9c909f5c
- Rename toolchain setup step
- Reorder test, format, and clippy steps
- Update command names in CI steps
Implement WebSocket upgrade detection and tunneling through Unix sockets,
enabling real-time communication with backend services via WebSocket.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Merge branch 'development' of https://forge.ourworld.tf/lhumina_code/hero_router into development
All checks were successful
Build & Test / check (push) Successful in 2m11s
Build & Test / check (pull_request) Successful in 2m15s
4001ebbe99
fix: update Workflows link and fix per-service agent JS errors
All checks were successful
Build & Test / check (pull_request) Successful in 1m37s
Build & Test / check (push) Successful in 1m40s
bfef4f7d0c
- Point Workflows link to /hero_logic/ui/ (proxied through hero_router)
- Fix JS redeclaration errors in service.html partial (IIFE wrapping)
- Fix per-service agent chat feature parity with global agent

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: update scanner socket comments to directory convention
All checks were successful
Build & Test / check (push) Successful in 3m0s
Build & Test / check (pull_request) Successful in 3m31s
e2a7e325ed
lhumina_code/home#116

Signed-off-by: mik-tf
feat: split hero_router into separate RPC and UI routers with dedicated sockets
All checks were successful
Build & Test / check (push) Successful in 1m42s
Build & Test / check (pull_request) Successful in 2m21s
e5544202cb
- Separate OpenRPC/JSON-RPC logic from admin dashboard into two routers:
  - build_rpc_router(): JSON-RPC 2.0 only, listens on rpc.sock
  - build_ui_router(): Admin dashboard, reverse proxy, MCP gateway, listens on ui.sock
- Add ui_socket_path() config helper for dashboard socket
- Add socket-only mode support (--port 0) for headless deployments
- Update discovery manifests to distinguish between protocols (openrpc vs ui)
- Add runsocket Makefile target for testing socket-only mode
- Make router_openrpc_spec() public for handler visibility

This aligns with hero_sockets convention where each service exposes
both machine-callable (rpc.sock) and browser-callable (ui.sock) interfaces.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
fix: migrate agent to service_agent_v3 template
Some checks failed
Build & Test / check (pull_request) Failing after 1m23s
Build & Test / check (push) Failing after 1m28s
17b60bdd67
The v3 workflow is self-contained — it dynamically discovers services,
compiles Python stubs, generates code, executes it, and summarizes
results all inside hero_logic. This eliminates Rust-side precomputation
of service catalogs and client staging.

- Remove build_service_catalog(), get_service_interface(),
  stage_client_library(), agent_base_dir() dead code
- run_agent() no longer needs RouterCache; only passes prompt + model
- Update extract_agent_response() for v3's loop-based DAG structure
- Update OpenRPC spec summary to reference service_agent_v3

Fixes #36

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: remove model selector, link workflow to hero_logic_ui editor
Some checks failed
Build & Test / check (push) Failing after 1m6s
Build & Test / check (pull_request) Failing after 1m6s
a127d9b63f
- Remove model selector and retries dropdowns from both global and
  per-service agent UIs (model is now managed by the workflow template)
- Replace static "Workflows" link with dynamic "Workflow" link that
  points to the specific workflow in hero_logic_ui after agent runs
- Workflow link fetches play's workflow_sid via router.agent.play RPC
  and constructs /hero_logic/ui/workflows/{sid} URL

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: live node progress display in agent UI
Some checks failed
Build & Test / check (pull_request) Failing after 1m8s
Build & Test / check (push) Failing after 1m8s
88bdfe665a
Replace "Thinking..." with real-time step-by-step progress:
- New router.agent.start RPC returns play_sid immediately (non-blocking)
- UI polls router.agent.play every 800ms for node status updates
- Displays each workflow step with status icons:
  - check (success), x (failed), arrow (running), dash (skipped)
- Shows retry iterations inline (e.g. "Generating Python code (attempt 2)")
- Workflow link appears after start, pointing to hero_logic_ui editor

Also removes model selector and retries dropdowns from both global
and per-service agent UIs (managed by the workflow template now).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: OSIS set methods — auto-convert dicts to OTOML format
Some checks failed
Build & Test / check (push) Failing after 1m6s
Build & Test / check (pull_request) Failing after 1m10s
b5c2590a7e
The generated Python clients now detect OSIS .set() methods and
automatically serialize dict parameters to OTOML format (O: prefix
+ TOML key=value pairs) as expected by the OSIS server handler.

Previously the client sent {"data": {...}} but the OSIS handler
expected {"obj": "O:\nkey = value\n..."}, causing all OSIS object
creation to fail with "Missing required parameter: obj".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: include data structure schemas in Python interface stubs
Some checks failed
Build & Test / check (pull_request) Failing after 33s
Build & Test / check (push) Failing after 33s
dab65eb073
The interface stubs now include a "Data Structures" section showing all
schema definitions from the OpenRPC spec — field names, types, required
markers, and descriptions. This gives the LLM the information it needs
to construct valid objects for OSIS set() methods (e.g. knowing that
Event requires 'title' not 'name').

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: remove old agent_handler from routes.rs
Some checks failed
Build & Test / check (push) Failing after 1m33s
Build & Test / check (pull_request) Failing after 2m18s
d59b2031c0
The per-service agent endpoint (POST /:service/agent) used the old
AgentRequest type and run_agent(cache, ...) signature that no longer
exist after the v3 migration. Agent is now exclusively accessed via
the JSON-RPC methods router.agent.start and router.agent.run.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: remove OTOML workaround from Python client codegen
Some checks failed
Build & Test / check (push) Failing after 1m42s
Build & Test / check (pull_request) Failing after 2m16s
4540a40740
Now that hero_rpc's OSIS handler accepts JSON "data" directly
(0dc2c90), the Python client no longer needs to convert dicts to
OTOML format. The generated .set() methods send {"data": dict}
which the server deserializes via serde_json.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Updated to latest versions of axum, tokio, clap, libc, and other
indirect dependencies. No breaking changes or behavior modifications.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Merge branch 'development' of forge.ourworld.tf:lhumina_code/hero_router into development
Some checks failed
Build & Test / check (pull_request) Failing after 2m14s
Build & Test / check (push) Failing after 2m16s
19897a0d86
refactor: consolidate RPC dispatch through ui_rpc_handler
Some checks failed
Build & Test / check (pull_request) Failing after 1m31s
Build & Test / check (push) Failing after 1m32s
8e64b6fcb6
Remove separate /rpc route handler and delegate unknown methods to the
router's RPC dispatcher, reducing route duplication.
Some checks failed
Build & Test / check (pull_request) Failing after 1m31s
Build & Test / check (push) Failing after 1m32s
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin development:development
git switch development
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lhumina_code/hero_router!32
No description provided.