19. Status indicators and prompts
[!ref] Full details in the User Manual, "Sessions".
19.1 Sidebar status dot
| Colour | Meaning |
|---|---|
| Green | All good |
| Amber | Credential expiring within an hour / rate-limit warning / channel reconnecting |
| Red | Offline / credential expired / serious error |
| Grey | Not signed in |
19.1.1 Context-usage ring
The ring showing current context-window usage changes colour by tier:
| Usage | Colour |
|---|---|
| < 75% | Normal |
| ≥ 75% | Yellow |
| ≥ 90% | Red (near the context limit — continue / compact) |
19.2 Session tab badges
| Badge | Meaning |
|---|---|
| Number | N new messages in this session (counted only when away) |
| An assistant is running in this session | |
| 🌙 | This session has background subtasks |
| Red dot | Pending approval in this session |
19.3 Send-button states
| Shape | Meaning |
|---|---|
| Send (default) | Assistant idle; click sends |
| Stop | Assistant running; cascades kill, and cancels all of this session's session routines (§18.7) |
| Greyed | Input is empty |
19.4 The two session-level switches in the input area
| Switch | Default | Notes |
|---|---|---|
| Shield (unrestricted mode) | Off | See §14.4.1 |
| Internet (local mode) | Internet tools enabled | Clicking raises a "Disable internet tools?" confirmation. When on, the built-in internet tools are disabled; applies per session and is restored after a restart; subagents inherit it. Slash command: /local |
19.5 Trace panel
| Dimension | Value |
|---|---|
| Entry point | Session stats popover → "Trace" tab (next to Stats) |
| Data source | Server-side aggregation of the session JSONL; loaded once on open, no polling; auto-refreshed once when the current run finishes |
| Run split | Split by real user messages, newest run by default; each run chip carries steps / tool calls / tokens / failures |
| Step window | Last 500 steps by default (aggregates stay complete); "N earlier steps omitted" with "Load earlier" paging |
| Filter | All / Tools only / Errors only |
| Subagent drill-down | Agent / AgentParallel steps offer "Sub-trace"; jumping to the message stream is disabled while drilled down (those line numbers belong to the sub-session file) |
| Suspected-loop threshold | The same (tool, args) fingerprint repeated ≥ 3 times raises the warning |
| Aggregate semantics | "Total tokens" includes steps already excluded from the context window; "Gate injections" = the sum of gate / goal / compact / todo / self-heal auto-injections |
| Special steps | "Context compaction (SUMMARY)" states how many records it absorbed; "Todo paused" marks a <todo-status>paused</todo-status> (the tag never appears in the body) |
| Trend | A "Prompt per turn" series (prompt tokens of the assistant steps in the window) |
| Export | See §24.5 |
| Error state | "Failed to read the trace — click Refresh to retry" |
Per-tool metrics table: count / failures / P50 / P95 / max duration.
19.6 Pending queue (live guidance)
| Item | Value |
|---|---|
| When it queues | Only the current session counts: Agent running or IM outbound delivery in progress → queue; a send in flight or generation in progress in this session → ignored if identical to the in-flight text ("Previous message is still sending — ignored this duplicate send"), queued otherwise; anything else is sent directly |
| Not queued | With pending images ("Images cannot be sent while a turn is running"); when there is no session yet the text stays in the input box |
| Input placeholder | "Live guidance: Enter to queue; injected in batch when the current turn ends…" |
| strip | "Pending N" (Inbox icon); hidden while a form-style question is shown; the queue is not persisted and is isolated per session |
| Default delivery | When the turn ends naturally or the session goes idle, merged in enqueue order with \n\n into one user message; not sent during compaction; only the current session's queue is sent |
"Prioritize" (step_end) |
Injected when the current step finishes (after tool results land, before the next model request); during the final reply, a follow-up round runs in the same process after the reply to handle it |
"Handle now" (interrupt) |
Cuts off the current generation: body / reasoning already output is kept (if nothing was output yet, the placeholder "(生成被用户打断)" — "(generation interrupted by the user)" — is used), unfinished tool calls are not executed; while tools are executing it doesn't interrupt and is delivered at the "Prioritize" point. Can be upgraded from "Prioritize", never downgraded |
| Points where it isn't injected | Before the first request, when this step ended in an error, while tool calls are still pending execution, when the step limit is reached → held until after the turn and sent as a new turn |
| After delivery | Shows "Prioritized · handled when the current step finishes" / "Handling now"; leaves the queue only when a user record with the same id streams back; can't be withdrawn |
| Delivery failure | "Can't insert this guidance right now. It stays in the queue and is sent when the turn ends." |
| Clear all | Clears only undelivered items; toast "Dropped N pending guidance message(s)" |
| Returned to input box | User stop / send aborted or failed / restart or regenerate failed / self-heal didn't start → returned, ahead of the existing draft (after the original text when a restate-intent bar is cancelled); toast "Returned N guidance message(s) to the input box" |
19.7 Marked messages
| Item | Value |
|---|---|
| Entry | Message right-click or message-handle menu "Mark message / Remove mark"; messages not yet persisted (e.g. while streaming) can't be marked |
| Badge | 14 px bookmark icon on the left of the message, indicator only (not clickable); gives way to the message handle on hover / with the menu open / while generating |
| strip | "Marked N"; sorted by the messages' order in the session; hidden when there are no marks |
| Click a row to locate | Unloaded earlier pages are paged in upward automatically; collapsed tool groups are expanded automatically; switching session mid-way abandons the jump |
| Copy as Markdown / Save HTML | Only messages with body text (not a tool result, and non-empty after trimming whitespace); greyed out when none has body text, with the hover text "The marked messages have no text to export (only tool calls, reasoning or images)"; title "{session name} · Marked messages" |
| Export .zsession | Same confirmation dialog as session export (with redaction); a reply with tool calls goes together with its tool results, and a marked tool result together with the reply it belongs to (pairing limited to the same declaration); record ids are regenerated; the session name gets the suffix " (标记摘录)" (" (marked excerpt)") |
| Clear marks | Removes marks only, never deletes messages |
| Storage | Session YAML marked_messages (id + marked_at), written only by the backend; remapped to new ids on session duplication / starting a new session from here (marks after the branch point are dropped); removed automatically when a message is deleted |
19.8 Effort (Landi N2.7)
| Level id | Display name | Notes |
|---|---|---|
none |
Off | Answers directly, fastest |
low |
Low | Light thinking |
high |
High (default) | Thorough thinking; high is also sent when unset |
xhigh |
Extra high | Deeper thinking |
max |
Max | Full thinking budget; slowest and uses the most |
| Item | Value |
|---|---|
| Display condition | Only "澜砥 N2.7" in the built-in AVL-Zero and its --suffixed variants (e.g. "澜砥 N2.7-Flash"); hidden for other models (including same-named models in custom providers) |
| Entry | Battery-icon button to the right of the model name in the input area; slider ends "Faster / More effort"; drag previews, release saves; ←→ / Home / End, Enter / Space selects, Esc closes |
| Save granularity | Per model (params.reasoning_effort), applies to every session using that model, from the next message; "Reset to default" returns to unset |
| Auxiliary calls | Compaction summaries, automatic renaming, memory extraction, hook completion, sec.decompile / code.ask and the like always send none |
| Sent record | llm_meta.reasoning_effort; the stats panel protocol line shows "Effort: {level}", or "Default" when the parameter was dropped. If the upstream rejects it, the call is retried without the parameter, and the rejected level isn't sent again for 24 hours |
</think> fallback |
N2.7 series, no level sent this time, empty reasoning field and </think> in the body → everything before the first </think> moves into reasoning; the persisted record and the history fed back are already split (during streaming it still shows in the body first) |
19.9 Inline tool-call progress
| Source | Text / cadence |
|---|---|
Waiting for model output (sec.decompile / code.ask) |
Heartbeat every 20 seconds: "等待 {模型} 输出(已 Ns)" (waiting for {model} output, N s so far) → "{模型} 思考中(已 Ns, 思考 ~N tokens)" ({model} thinking, N s, ~N reasoning tokens) → "{模型} 生成中(约 P%, 预计还需 ~Ms, 已 Ns, ~N tokens, R tok/s)" ({model} generating, about P %, ~M s remaining, N s, ~N tokens, R tok/s); the percentage is based on the same tool / model's history (in-process EMA, not reported on the first call), capped at 99% |
| Building the code index (≥ 8 files to index) | "建立代码索引 X/N" (building code index X/N) + ratio bar; over the cap: "已达 N 个文件上限, 另有 M 个未进索引" (N-file cap reached, M more not indexed) |
| Running timer | Appears once the tool has actually been executing for 60 seconds, then re-syncs every 20 seconds while the frontend ticks every 0.5 seconds; "已运行 45s" (running 45s) / "已运行 1m05s / 上限 2m00s" (running 1m05s / limit 2m00s). Limit = time already run when the announcement arrived + the announced time limit; not sent if the tool reported progress within 30 seconds; not sent for Agent / AgentParallel / TaskOutput / TaskStop / TaskWait / ask_user |
| Default tool time limits | fs.exec 120 s (adjustable via parameter / tools.yaml); test.run 300 s; lint.run 180 s; sast.run 240 s; sec.decompile / code.ask = model timeout |
| Presentation | Right of the tool name: spinner + text (at most 70% of the row width), with a 48 px thin progress bar when there's a ratio; only in-flight calls light up; for a non-current session an in-place-updating progress toast pops up (auto-closes after 30 seconds), not for the running timer; in Compact density the call showing progress isn't merged into "N tool call attempts" |
19.10 Repetition detection
| Layer | Criterion | Result |
|---|---|---|
| Line-level cut-off within a turn | Within the last 25 effective lines, the same line ≥ 3 times with at least two adjacent, or ≥ 5 times; short lines count; code blocks, table rows starting with |, punctuation-only lines and an unterminated last line while streaming don't count; responses with tool calls aren't cut |
Cancels this request, keeps one pass of the body, finish_reason=repetition; reasoning already streamed is kept; the next request carries an invisible reminder at the tail |
| Cross-turn | The last 25 assistant turns without tool calls on the repetition chain; real user input / tool results / turns with tool calls / halt records break the chain, auto_* continuations are transparent |
≥ 3 times a transient reminder, ≥ 5 times stronger, ≥ 8 times or 3 accumulated single-turn cut-offs → halt: writes a visible system record and pauses the automatic-continuation family |
| Alerts | At 3 / 5 times and on halt | Session list "Possible spin" (persisted); the 3 / 5 toasts only pop for a non-current session, the halt toast pops for the current session too |
Unlike the "repeated-call notice" (graded prompts at 3 / 8 / 20 identical tool calls, polling tools exempt, prompts only in tool results, no halt), repetition detection only looks at reply body text without tool calls.
