You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
**Loop hardening:** top-level **`doom_loop_enabled`** in `config.toml` (default true) enables ml-intern-style detection of repeated identical tool calls before each LLM step; a corrective **user** message is persisted when triggered (`src/agent/doom_loop.rs`). Independently, the pure controller in `src/agent/budget.rs` tracks LLM turns, wall time, provider-reported tokens, provider retries, context recoveries, repeated typed tool root causes, and observable progress. It emits run-scoped typed warnings, stops three consecutive failures with the same `(tool, error code)` as `Stuck::RepeatedRootCause`, stops sustained no-progress runs as `Stuck::NoProgress`, and retains `max_iterations` only as the absolute LLM-turn ceiling. Steering and context recovery reset no-progress only; successful new evidence may also clear the repeated-root-cause streak, while consumed time/tokens/retries are never refunded.
57
57
58
+
**Run-scoped LLM providers:**`AgentLogic` keeps the active provider and its credentials behind one lock and snapshots that pair, plus the filtered failover candidates, when a run is admitted. Active runs and already-admitted FIFO items never read process-global provider state. A `/model` switch atomically changes the pair for subsequent admissions; an inbound accepted after the switch keeps the new pair even when it waits behind an older run. Sub-agents use the same snapshot contract. Embedders that need failover candidates use `AgentLogic::new_with_fallback_providers`; `AgentLogic::new` remains the compatibility path with no candidates.
59
+
58
60
### Structured LLM Extraction
59
61
If you are asking the LLM to yield a structured JSON payload internally (e.g. for reflection or summarization outside of the standard `ToolCall` registry):
60
62
**DO NOT** use brittle string matching like `text.find('{')`.
Use `/model` in the TUI to open the interactive model selector, or `/model gemini-2-5-flash` to switch directly. Your choice is remembered across restarts.
105
105
106
+
Provider selection is isolated per accepted run. Switching models does not alter an in-flight run; messages accepted after the switch use the new provider and credentials even if they wait in that chat's FIFO. Configured failover candidates are also snapshotted per run, so concurrent chats cannot overwrite one another's fallback policy.
107
+
106
108
### Skill management
107
109
108
110
isanagent supports installing specialized **skills** (structured procedures and instructions) from remote GitHub repositories. You can install an entire repository of skills or a specific one using shorthand `owner/repo` or full URLs.
Version 0.11 intentionally removes the process-global and independently
285
+
mutable provider-credential APIs. These removals are breaking changes:
286
+
287
+
| Removed 0.10 API | 0.11 replacement |
288
+
| --- | --- |
289
+
|`set_fallback_providers(specs)`| Pass `specs` to `AgentLogic::new_with_fallback_providers(params, specs)`. |
290
+
|`agent.provider_credentials_handle()` followed by independent writes | Build the matching provider and call `agent.switch_provider_with_credentials(provider, credentials).await`. |
291
+
292
+
`switch_provider(provider)` and `set_provider_credentials(credentials)` remain
293
+
temporary compatibility shims. The provider-only form clears credential
294
+
identity and disables failover for later admissions; the credential-only form
295
+
rebuilds a standard provider. Custom provider embedders should migrate directly
296
+
to `switch_provider_with_credentials` so the provider and its credentials become
The central reasoning actor. All fields private. Constructed via `pub fn new(params: AgentLogicParams) -> Self`[src/agent/mod.rs:1073](../src/agent/mod.rs#L1073). Implements `ActorLogic<BusMessage>` at [src/agent/mod.rs:1270](../src/agent/mod.rs#L1270).
285
302
303
+
Provider configuration changes must use
304
+
`switch_provider_with_credentials(provider, credentials)` so the provider and
305
+
the credential identity become visible in one write. The older
306
+
`switch_provider(provider)` and `set_provider_credentials(credentials)` methods
307
+
remain source-compatible migration shims: the former clears credential identity
308
+
and disables fallback for later admissions, while the latter rebuilds a standard
309
+
provider from the supplied credentials. Custom provider embedders must migrate
310
+
to the paired method. No supported API exposes a mutable credential handle.
311
+
286
312
> **Overhaul touchpoint.** PR-5 adds a pub method `trigger_compaction(chat_id, options)` to this struct.
`AgentLogic::new(params)` preserves the compatibility path with no failover candidates. Embedding crates that configure failover use `AgentLogic::new_with_fallback_providers(params, candidates)`. The candidate vector is owned by that `AgentLogic`; every admitted main-agent or sub-agent run snapshots its provider, credential identity, and filtered fallbacks. Runtime model switches therefore affect only later admissions.
346
+
318
347
**This struct is on the critical compatibility path.** Adding fields here is breaking without `#[non_exhaustive]` because constructors enumerate every field. Phase 0.0b must add the marker and document the workaround (use struct-update syntax with a default).
0 commit comments