Commit Graph

4400 Commits

Author SHA1 Message Date
Alexander Whitestone
de6f0d174c fix: add CLI voice beep toggle
All checks were successful
Lint / lint (pull_request) Successful in 9s
Closes #952
2026-04-22 11:32:33 -04:00
d574690abe Merge pull request 'feat: The Sovereign Accountant — Agent Telemetry' (#1009) from feat/sovereign-accountant-agent-1776866068545 into main
All checks were successful
Lint / lint (pull_request) Successful in 19s
Lint / lint (push) Successful in 28s
2026-04-22 13:55:16 +00:00
e208885de6 feat: wire telemetry hooks into auxiliary client
All checks were successful
Lint / lint (pull_request) Successful in 10s
2026-04-22 13:54:32 +00:00
cd84fa2084 feat: add telemetry logger for token accounting 2026-04-22 13:54:30 +00:00
63babca056 Merge pull request 'docs: poka-yoke integration phase 3 status (#967)' (#976) from fix/967 into main
All checks were successful
Lint / lint (push) Successful in 11s
2026-04-22 13:39:43 +00:00
cab3c82c5c Merge pull request '[claude] Add update/restart action buttons to web dashboard (#961)' (#968) from claude/issue-961 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 13:39:36 +00:00
64a8059f9f Merge pull request '[claude] Verify hardcoded-home path guard on burn/921 branch (#962)' (#964) from claude/issue-962 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 13:39:32 +00:00
90f6fdef60 Merge pull request 'feat: Autonomous Regression Sentry — verify_impact tool' (#970) from feat/impact-analysis-tool-1776826592325 into main
All checks were successful
Lint / lint (push) Successful in 11s
2026-04-22 13:38:47 +00:00
18e3533a0a Merge pull request 'feat: The Budgetary Sovereign Router — Efficiency Sauce' (#1008) from feat/budgetary-router-1776864510362 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 13:38:40 +00:00
60ccd825ec Merge pull request 'feat: The Sovereign Teleport — State Migration Sauce' (#1007) from feat/sovereign-teleport-1776864503956 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 13:38:36 +00:00
e7d5a7f2cf Merge pull request 'feat: The Scavenger Fixer — Closing the Autonomous Loop' (#975) from feat/autonomous-scavenger-fix-1776827712502 into main
All checks were successful
Lint / lint (push) Successful in 13s
2026-04-22 13:38:03 +00:00
9aaac192cf Merge pull request 'test(#798): Parallel tool calling — 2+ tools per response' (#988) from fix/798 into main
All checks were successful
Lint / lint (push) Successful in 9s
2026-04-22 13:36:37 +00:00
f3d88ec31d Merge pull request '[claude] Wire Gemma 4 vision into browser_tool for screenshot analysis (#816)' (#947) from claude/issue-816 into main
All checks were successful
Lint / lint (push) Successful in 13s
2026-04-22 13:36:20 +00:00
2f22570622 Merge pull request 'feat(web-console): Self-healing browser CDP + operator cockpit (#394)' (#934) from feat/web-console-394 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 13:36:14 +00:00
2022322606 Merge pull request 'feat: Deep Dive Security Integration - Multilayer Defense' (#929) from feat/security-deep-dive-1776732106631 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 13:36:08 +00:00
d6ec32fe93 Merge pull request 'feat: implement SHIELD Multilingual Defense & Input Sanitization' (#918) from feat/shield-multilingual-1776700482647 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 13:36:05 +00:00
2b284e75f6 Merge pull request 'feat: Multi-Agent Concurrency Guard — "Secret Sauce" for Fleet Scaling' (#969) from feat/fleet-concurrency-guard-1776826501792 into main
All checks were successful
Lint / lint (push) Successful in 16s
2026-04-22 13:29:01 +00:00
efa1fc034e feat: Budgetary Sovereign Router — Complexity-aware steering
All checks were successful
Lint / lint (pull_request) Successful in 25s
2026-04-22 13:28:31 +00:00
99d925d40b feat: Sovereign Teleport — Cross-environment agent migration
All checks were successful
Lint / lint (pull_request) Successful in 28s
2026-04-22 13:28:25 +00:00
Alexander Whitestone
ed250b1ca8 test(#798): Strengthen parallel tool calling tests + fix flaky concurrent tests
All checks were successful
Lint / lint (pull_request) Successful in 10s
- Add TestAIAgentConcurrentExecution with 8 integration tests exercising
  _execute_tool_calls_concurrent through AIAgent for 2/3/4-tool batches,
  pass-rate reporting, and Gemma 4-style read patterns.
- Fix test_malformed_json_args_forces_sequential: use JSON array '[1,2,3]'
  instead of unrepairable garbage now that repair_and_load_json handles
  most malformed input.
- Fix test_concurrent_handles_tool_error: replace racy call_count list
  with deterministic failure based on tool_call_id to eliminate flaky
  failures under ThreadPoolExecutor.

Closes #798
2026-04-22 01:34:24 -04:00
Alexander Whitestone
1f5067e94a Merge: bring in prior QA work on path guard (Refs #962)
All checks were successful
Lint / lint (pull_request) Successful in 15s
2026-04-22 00:25:50 -04:00
Alexander Whitestone
798ca3aa06 chore: sync with remote claude/issue-961 branch
All checks were successful
Lint / lint (pull_request) Successful in 22s
Refs #961

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 00:04:51 -04:00
Alexander Whitestone
5d3e13ede2 test: add pre-commit path guard hook from burn/921 (Refs #962)
All checks were successful
Lint / lint (pull_request) Successful in 24s
Brings hooks/pre-commit-path-guard.py from burn/921-poka-yoke-hardcoded-paths
to complete QA verification of all guard layers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 23:55:38 -04:00
82a076bf4d docs: poka-yoke integration phase 3 status (#967)
All checks were successful
Lint / lint (pull_request) Successful in 8s
2026-04-22 03:24:26 +00:00
16eab5d503 Merge pull request '[claude] A2A auth — mutual TLS between fleet agents (#806)' (#948) from claude/issue-806 into main
All checks were successful
Lint / lint (push) Successful in 13s
Merge PR #948: A2A auth — mutual TLS between fleet agents (#806)
2026-04-22 03:19:42 +00:00
81f7347bcb feat: Scavenger Fixer — Autonomous tech debt healing
All checks were successful
Lint / lint (pull_request) Successful in 22s
2026-04-22 03:15:17 +00:00
c7a2d439c1 Merge pull request 'feat: The Sovereign Scavenger — Automated Tech Debt Recovery' (#974) from feat/sovereign-scavenger-1776827259631 into main
All checks were successful
Lint / lint (push) Successful in 12s
2026-04-22 03:14:14 +00:00
8ad8520bd2 Merge pull request 'feat: Execution Safety Sentry — GOFAI Risk Analysis' (#973) from feat/static-analyzer-gofai-1776826921747 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 03:14:07 +00:00
9c7c88823f Merge pull request 'feat: Local Inference Story — Freeing the fleet from cloud dependency' (#972) from feat/local-inference-bridge-1776826896029 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 03:14:03 +00:00
aa45e02238 Merge pull request 'feat: GOFAI Semantic Sentry — Deterministic code verification' (#971) from feat/symbolic-verify-gofai-1776826842170 into main
Some checks failed
Lint / lint (push) Has been cancelled
2026-04-22 03:14:01 +00:00
3266c39e8e feat: Sovereign Scavenger — Turning tech debt into actionable backlog
All checks were successful
Lint / lint (pull_request) Successful in 18s
2026-04-22 03:07:40 +00:00
Alexander Whitestone
e8886f10c8 feat: add Update Hermes and Restart Gateway action buttons to web dashboard
All checks were successful
Lint / lint (pull_request) Successful in 10s
Implements the action button lifecycle described in #961:
- POST /api/actions/restart-gateway  — sends SIGTERM to the gateway PID
- POST /api/actions/update-hermes    — runs pip upgrade in a background job
- GET  /api/actions/jobs/{job_id}    — polls job status/output

Frontend (StatusPage.tsx):
- "Restart Gateway" button with spinning icon while running, then
  success/error message that clears after 5–8 s
- "Update Hermes" button that polls the job endpoint every 2 s;
  shows collapsible pip output on completion
- Page remains responsive (buttons disabled only during their own action)

Also adds i18n strings to en.ts, zh.ts, and the shared types.ts interface.

Fixes #961

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 23:04:10 -04:00
93a855d4e3 feat: Static Risk Analyzer (GOFAI) for execution safety
All checks were successful
Lint / lint (pull_request) Successful in 8s
2026-04-22 03:02:02 +00:00
5a0bdb556e feat: Local Inference Bridge — Bypassing cloud for local tasks
All checks were successful
Lint / lint (pull_request) Successful in 17s
2026-04-22 03:01:37 +00:00
d619d279f8 feat: Symbolic Sentry (GOFAI) for deterministic code audits
All checks were successful
Lint / lint (pull_request) Successful in 15s
2026-04-22 03:00:44 +00:00
d3b13a6aa5 feat: add verify_impact tool for regression guarding
All checks were successful
Lint / lint (pull_request) Successful in 16s
2026-04-22 02:56:33 +00:00
77d2430a44 feat: add Fleet-Wide File Concurrency Guard
All checks were successful
Lint / lint (pull_request) Successful in 19s
2026-04-22 02:55:04 +00:00
Alexander Whitestone
d2ce6b8749 test: verify action endpoints for restart-gateway and update-hermes
All checks were successful
Lint / lint (pull_request) Successful in 27s
Add TestActionEndpoints class to test_web_server.py covering:
- POST /api/actions/restart-gateway sends SIGUSR1 to gateway PID
- 409 when gateway is not running
- 500 when os.kill raises a signal error
- POST /api/actions/update-hermes returns ok=true on zero exit
- ok=false on non-zero exit code with stderr in detail
- ok=false on timeout
- Both endpoints reject unauthenticated requests

All 7 new tests pass (83 total in the file).

Refs #961
2026-04-21 22:41:27 -04:00
Alexander Whitestone
a8a086548d feat: add restart gateway and update Hermes action buttons to web dashboard
All checks were successful
Lint / lint (pull_request) Successful in 29s
Implements the update/restart action buttons called out in issue #961:

- Backend (web_server.py): two new POST endpoints
  - /api/actions/restart-gateway — sends SIGUSR1 to the running gateway PID
  - /api/actions/update-hermes  — runs `hermes update --yes` in a subprocess
- Frontend (api.ts): restartGateway() / updateHermes() API helpers + ActionResponse type
- UI (StatusPage.tsx): "Actions" card with Restart Gateway and Update Hermes buttons
  - idle → running (spinner) → success/failure states
  - feedback detail text; auto-resets to idle after 8 s
- i18n: new status.actions / restartGateway / updateHermes strings in en, zh, and types

Refs #961

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 22:30:22 -04:00
Alexander Whitestone
9e00a59791 test: verify hardcoded-home path guard from burn/921 branch
All checks were successful
Lint / lint (pull_request) Successful in 29s
Cherry-picks tools/path_guard.py and tests/test_path_guard.py from
burn/921-poka-yoke-hardcoded-paths (commit 5dcb905). All 21 tests pass:

- hardcoded /Users/<name>/ paths are rejected at runtime
- hardcoded /home/<name>/ paths are rejected at runtime
- ~/.hermes/... via expanduser() passes (safe, expanded at runtime)
- valid relative and /tmp/ absolute paths pass
- static scanner catches violations and respects # noqa: hardcoded-path-ok
- comments are skipped by scanner
- directory scanner skips test files and __pycache__

Refs #962

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 22:26:54 -04:00
Alexander Whitestone
9ef7682ee2 chore: merge remote claude/issue-816 — deduplicate gemma-4-27b-it in models.py
All checks were successful
Lint / lint (pull_request) Successful in 30s
Merged prior implementation (PR #947) and resolved conflicts.
Removed duplicate "gemma-4-27b-it" entry introduced during merge.

Refs #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 21:27:51 -04:00
Alexander Whitestone
e157a22639 feat: wire Gemma 4 vision into browser_tool for screenshot analysis
- Add `_BROWSER_VISION_DEFAULT_MODEL = "google/gemma-4-27b-it"` constant
- Rewrite `_get_vision_model()` with 4-tier resolution:
  1. BROWSER_VISION_MODEL env var (browser-specific override)
  2. auxiliary.browser_vision.model config key
  3. AUXILIARY_VISION_MODEL env var (backward compat)
  4. google/gemma-4-27b-it default (Gemma 4 native multimodal)
- Extract `_load_browser_vision_config()` helper for testability
- Always set call_kwargs["model"] (remove redundant `if vision_model` guard)
- Read timeout from auxiliary.browser_vision.timeout before auxiliary.vision.timeout
- Register gemma-4-27b-it in Gemini provider model catalog
- Document auxiliary.browser_vision section in cli-config.yaml.example
- Add 12 unit tests in tests/tools/test_browser_vision_model.py covering all
  resolution tiers, backward compat, error fallthrough, and type guarantees

Fixes #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 21:26:03 -04:00
Alexander Whitestone
671283389c feat: Wire Gemma 4 vision into browser_tool for screenshot analysis
All checks were successful
Lint / lint (pull_request) Successful in 8s
_get_vision_model() now resolves via a layered priority chain:
  1. BROWSER_VISION_MODEL env var (browser-specific override)
  2. config.yaml browser.vision_model
  3. AUXILIARY_VISION_MODEL env var (backward-compat shared override)
  4. google/gemma-4-27b-it — Gemma 4 native multimodal default

Add browser.vision_model config key to hermes_cli/config.py defaults
with inline documentation.

call_kwargs["model"] is now always set (model is never None), and a
debug log line records which model is in use for each screenshot.

Fixes #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 20:51:04 -04:00
Alexander Whitestone
17cc4bac90 feat: complete Gemma 4 browser_vision wiring — task routing, timeout, tests
All checks were successful
Lint / lint (pull_request) Successful in 10s
Building on the Gemma 4 default already on this branch:

- Change call_llm() task from "vision" to "browser_vision" in browser_vision()
  so auxiliary.browser_vision.* config is consulted for provider/model/timeout
- Route call_llm(task="browser_vision") through the vision provider resolution
  path in auxiliary_client.py (same as task="vision")
- Fix timeout resolution: check auxiliary.browser_vision.timeout before
  auxiliary.vision.timeout (allows browser-specific timeout override)
- Add timeout option to auxiliary.browser_vision in cli-config.yaml.example
- Add test_browser_vision_gemma4.py covering: task routing assertions,
  call_llm() vision branch routing, and timeout config key ordering

Refs #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 19:43:42 -04:00
Alexander Whitestone
1843545d66 chore: merge remote branch — resolve conflicts, use canonical implementation
All checks were successful
Lint / lint (pull_request) Successful in 8s
Merge remote claude/issue-816 which contains the full Gemma 4 browser
vision implementation. Resolved conflicts by taking the remote's cleaner
variable names and docstrings while keeping the same 4-tier resolution
logic. All 12 tests pass.

Refs #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 18:50:22 -04:00
Alexander Whitestone
c643ac90da feat: wire Gemma 4 vision into browser_tool for screenshot analysis
- Add `_BROWSER_VISION_DEFAULT_MODEL = "google/gemma-4-27b-it"` constant
- Rewrite `_get_vision_model()` with 4-tier resolution:
    1. BROWSER_VISION_MODEL env var (browser-specific override)
    2. auxiliary.browser_vision.model config key
    3. AUXILIARY_VISION_MODEL env var (backward compat)
    4. Gemma 4 27B default
- Remove `if vision_model:` guard — function now always returns a string
- Update browser_vision tool description to surface Gemma 4 as default
- Register gemma-4-27b-it in Gemini provider model catalog (models.py)
- Document auxiliary.browser_vision.model in cli-config.yaml.example
- Add 14 unit tests covering all priority levels and backward compat

Fixes #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 18:47:03 -04:00
Alexander Whitestone
da9c4cf10c feat: wire Gemma 4 vision into browser_tool for screenshot analysis
All checks were successful
Lint / lint (pull_request) Successful in 7s
Extends `_get_vision_model()` with a 5-level resolution chain:
1. `BROWSER_VISION_MODEL` env var — browser-specific override
2. `auxiliary.browser.vision_model` config key — per-install default
3. `AUXILIARY_VISION_MODEL` env var — backward-compat shared override
4. Auto-select `gemma-4-27b-it` when the main provider is Gemini/Google
5. `None` — fall through to `call_llm` vision router

Adds `_BROWSER_VISION_DEFAULT_MODEL = "gemma-4-27b-it"` constant and
registers `gemma-4-27b-it` in the Gemini provider model catalog.

16 new tests in `tests/tools/test_browser_vision_model.py` cover each
priority level, edge cases (empty env, config exceptions, wrong provider).

Fixes #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 18:18:30 -04:00
Alexander Whitestone
4214082fb6 feat: A2A auth — mutual TLS between fleet agents
All checks were successful
Lint / lint (pull_request) Successful in 8s
Implements mTLS for securing agent-to-agent communication in the Hermes
fleet. Fixes #806.

Changes:
- scripts/gen_fleet_ca.sh: generate a self-signed Fleet CA (4096-bit RSA,
  10-year validity) that signs all agent certificates
- scripts/gen_agent_cert.sh: generate per-agent certs (Timmy, Allegro,
  Ezra) signed by the fleet CA with SAN entries and clientAuth/serverAuth
  extended key usage
- agent/mtls.py: new module providing:
  - build_server_ssl_context() — TLS_SERVER context with CERT_REQUIRED,
    enforces client cert against Fleet CA
  - build_client_ssl_context() — TLS_CLIENT context for outbound A2A calls
  - MTLSMiddleware — ASGI middleware that rejects unauthenticated requests
    to A2A routes (/.well-known/agent-card*, /api/agent-card, /a2a/) with
    HTTP 403 when mTLS is enabled
  - is_mtls_configured() — checks HERMES_MTLS_CERT/KEY/CA env vars
- hermes_cli/web_server.py: wire MTLSMiddleware into the FastAPI app;
  pass SSL context to uvicorn when HERMES_MTLS_* env vars are set so
  the server runs TLS with mandatory client cert verification
- ansible/roles/hermes_mtls/: Ansible role to distribute Fleet CA cert,
  agent cert, and agent key to fleet nodes; writes an env file with
  HERMES_MTLS_* vars and restarts the hermes-gateway service
- ansible/fleet_mtls.yml: fleet-wide playbook referencing the role for
  Timmy, Allegro, and Ezra nodes
- tests/test_mtls.py: 15 tests covering is_mtls_configured, SSL context
  creation with real cryptography-generated certs, and MTLSMiddleware
  (unauthorized agent rejected → 403, authorized agent accepted → 200)

mTLS is opt-in: set HERMES_MTLS_CERT, HERMES_MTLS_KEY, and HERMES_MTLS_CA
to enable. When unset, the server behaves exactly as before.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 18:04:00 -04:00
Alexander Whitestone
95bb842a21 feat: Wire Gemma 4 vision into browser_tool for screenshot analysis
All checks were successful
Lint / lint (pull_request) Successful in 8s
Default browser_vision screenshots to google/gemma-4-27b-it (Gemma 4
native multimodal) for reduced latency and unified text+vision model.

Resolution order for _get_vision_model():
1. BROWSER_VISION_MODEL env var (new, browser-specific override)
2. auxiliary.browser_vision.model in config.yaml (new config key)
3. AUXILIARY_VISION_MODEL env var (existing global vision override)
4. Default: google/gemma-4-27b-it

Backward compatibility: existing AUXILIARY_VISION_MODEL users are
unaffected — their override still flows through to browser_vision.

Also documents the new auxiliary.browser_vision config section in
cli-config.yaml.example and adds 14 unit tests covering the full
priority chain.

Fixes #816

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 17:14:32 -04:00
Alexander Whitestone
ac28444bf2 feat: add A2AMTLSServer routing API, A2AMTLSClient, and expand tests to 20 (#806)
All checks were successful
Lint / lint (pull_request) Successful in 9s
Builds on the existing A2AServer / build_*_ssl_context foundation:

- agent/a2a_mtls.py:
  - Add A2AMTLSServer: routing-based HTTPS server with add_route() and
    context-manager (__enter__/__exit__) lifecycle support
  - Add A2AMTLSClient: fleet-cert-presenting HTTP client with .get() / .post()
  - Widen imports (json, Callable, Dict, urlopen)

- tests/agent/test_a2a_mtls.py:
  - Fix datetime.utcnow() deprecation — use datetime.now(timezone.utc)
  - Add TestA2AMTLSServerAndClient (9 tests): routing GET/POST, 404,
    context-manager stop, rogue-cert rejection, A2AMTLSClient, concurrency
  - Total: 11 → 20 passing tests

Refs #806
2026-04-21 15:21:10 -04:00