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.