* fix(agent): persist /model selection to .env, TOML, and DB
The /model command only wrote selected_model to the DB and config.toml,
but env vars from ~/.ironclaw/.env (e.g. NEARAI_MODEL) have the highest
priority in LlmConfig::resolve_model(). The .env value was never
updated, so it always shadowed the new model on restart.
Now persist_selected_model updates all three persistence layers:
1. The backend-specific model env var in ~/.ironclaw/.env (only if the
var already exists, to avoid injecting new vars)
2. The config.toml file (created if absent, since TOML > DB priority)
3. The DB settings table (for completeness)
Also adds diagnostic logging when the DB store is unavailable.
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
* fix(agent): address PR review — backend from deps, exact .env match
Review feedback:
- Use resolved llm_backend from AgentDeps instead of re-reading from
disk/env (fixes DB-only backend detection, eliminates redundant I/O)
- Match .env var with exact "KEY=" prefix and skip commented lines
(prevents false matches on NEARAI_MODEL_VERSION etc.)
- TOML is now loaded once (no double-read for backend + model update)
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
* feat(db): add list_dispatched_routine_runs to RoutineStore trait
Add method to query routine runs with status='running' AND job_id IS NOT NULL,
enabling the routine engine to sync completion status from background jobs.
Implements for both PostgreSQL and libSQL backends.
[skip-regression-check]
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix(routines): sync dispatched full-job runs with background job status (#697)
Full-job routines were immediately marked Ok on dispatch, so
failures/completions were never reflected in the routine run record.
Now dispatch returns Running status, and a periodic sync checks linked
jobs to update the run when the job completes, fails, or is cancelled.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix(routines): fail fast when sandbox unavailable at dispatch time (#697)
Thread sandbox_available bool from Docker detection through AgentDeps
to RoutineEngine. Full-job routines now fail immediately with a clear
error message when sandbox is enabled but Docker is not available,
instead of dispatching a job that silently fails.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* feat(startup): notify user when sandbox unavailable (#697)
When sandbox is enabled but Docker is not installed or not running,
send a user-visible warning through all channels at startup (with a
2s delay to let channels connect). Previously this was only logged
via tracing::warn, invisible to TUI/web users.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* style: fix formatting in routine_engine.rs
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix(tests): set sandbox_available=true in test rig for full_job traces
Test rig doesn't use real Docker — full_job routines execute via trace
replay. Setting sandbox_available=true allows the routine_news_digest
trace test to dispatch full_job routines as before.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix(routines): address review feedback on sync_dispatched_runs (#697)
- Sanitize last_reason from job transitions before using in
notifications (truncate to 500 chars, strip control characters)
- Treat Submitted as in-progress (can still transition to Failed),
only Completed and Accepted are terminal success states
- Add test for sanitize_summary
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix(tests): add missing sandbox_available field to test constructors
Staging added sandbox_available to AgentDeps and RoutineEngine::new.
Add the missing field/argument in test files to fix CI compilation.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix: sanitize job reason in notifications, fix state handling for Submitted/Accepted
- Enhance sanitize_summary to strip HTML tags and collapse whitespace,
preventing injection via untrusted container job reasons
- Use char-boundary-safe truncation to avoid panics on multi-byte strings
- Treat Submitted and Accepted as in-progress states (continue polling)
rather than terminal success, since they can still transition to Failed
- Increase channel-connect delay from 2s to 5s and add debug log for
sandbox-unavailable warning delivery
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
* Replace sandbox_available bool with SandboxReadiness enum
Distinguishes DisabledByConfig from DockerUnavailable so full-job
routine errors give actionable guidance instead of a generic message.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* ci: re-trigger CI with latest changes
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix: add missing owner_id arg to send_notification call
Co-Authored-By: Claude Opus 4.6 <[email protected]>
* fix: update e2e tests to use SandboxReadiness enum
Co-Authored-By: Claude Opus 4.6 <[email protected]>
---------
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: [email protected] <[email protected]>
- Add `builder: None` to AgentDeps initializer in e2e_telegram_message_routing
test (field added in #712 but test not updated)
- Update go_to_extensions() in test_telegram_hot_activation to navigate via
settings tab -> extensions subtab (extensions tab was moved to settings)
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>