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
{{ message }}
Repository navigation
Commit 1ca196f
Browse filesBrowse the repository at this point in the historyBrowse files
feat(tui): add footer to choose every message footer detail the same way
Message footers grew one setting per detail, each with its own value
shape: turn_timing.time/duration are booleans, timestamps is a type
list, footer_variant is a boolean, and the agent, model and total have
no setting at all. There was also no way to see a message's ID, which
is what logs, the database and the API key everything by.
footer in tui.json has one key per detail - agent, model, variant,
time, duration, total and the new message_id - and every key takes the
same value: true/"all", false/"none", "important", or a list of entry
types from the timestamps vocabulary (user, assistant, text, reasoning,
tool, error, compaction), which may include "important". "important"
selects the landmarks ctrl+shift+up/down stops on, reusing
navigationTargets(..., "landmark"); a message-level entry counts when
the message or one of its parts is one (isLandmark in navigation.ts).
A type a key does not apply to has no effect, which each key's schema
description lists.
message_id shows the msg_ ID at the end of user and assistant footers
as plain text, so it can be selected with the mouse to copy. Time,
duration and message_id also give a turn's earlier steps a footer once
they finish, as turn_timing did.
Unset keys keep today's behavior: turn_timing, footer_variant and
timestamps map onto footer.time, footer.duration and footer.variant
(footerSelections in config/index.tsx), and /timestamps, /turn-times
and /turn-durations persist as before. A key set in footer decides on
every start and its toggle lasts until exit, as timestamps already did.
Defaults render the upstream footer unchanged.
AI-Tool: opencode 1.18.34-vt-163-907b3bc518
AI-Model: anthropic/claude-opus-5-5
AI-Variant: high
AI-Platform: linux
AI-Harness: Vibeterm 18dc0eb
AI-Session-ID: ses_ee68aab01ffei41gwUGJ5ESj6W
"Show how long each assistant turn took; the final turn also keeps the total since the prompt (default: false)",
53
53
}),
54
54
}).annotate({
55
-
description: "Default per-turn timing in assistant message footers; toggle at runtime from the command palette",
55
+
description:
56
+
"Legacy default per-turn timing in assistant message footers, used while footer.time and footer.duration are unset; toggle at runtime with /turn-times and /turn-durations",
agent: footerElement("The agent that ran a turn, in assistant footers. Applies to: assistant. Default: all."),
188
+
model: footerElement(
189
+
"The model a turn ran on, in assistant footers; model_label picks its name or id. Applies to: assistant. Default: all.",
190
+
),
191
+
variant: footerElement(
192
+
"The variant a turn ran with, such as its reasoning effort ('high'), after the model; turns without a variant show nothing. Applies to: assistant. Default: none, or all with the legacy footer_variant: true.",
193
+
),
194
+
time: footerElement(
195
+
[
196
+
"When an entry happened: the time of day if today, the date and time otherwise.",
197
+
"Applies to: user (prompt sent), assistant (turn finished, in its footer), text (text block finished, below it),",
198
+
"reasoning (thinking block finished), tool (tool call finished), error (turn failed, in its error box),",
199
+
"compaction (compaction started, in its divider).",
200
+
"Default: the legacy timestamps list when set; otherwise prompts and turns follow /timestamps and /turn-times",
201
+
"(turn_timing.time for turns) and the other types are hidden.",
202
+
].join(" "),
203
+
),
204
+
duration: footerElement(
205
+
[
206
+
"How long an entry took. Applies to: assistant (the turn's own message), reasoning (the thinking block),",
207
+
"tool (the tool call).",
208
+
"Default: reasoning; turns follow /turn-durations (turn_timing.duration); tool calls when the legacy",
209
+
"timestamps list includes 'tool'.",
210
+
].join(" "),
211
+
),
212
+
total: footerElement(
213
+
"Time from the prompt to the end of the turn. Applies to: assistant, and only on a turn's final message, so 'important' and 'assistant' select the same footers as 'all'. Default: all.",
214
+
),
215
+
message_id: footerElement(
216
+
"The message ID (msg_...), selectable for drag-to-copy, at the end of the footer. Applies to: user, assistant. Default: none.",
217
+
),
218
+
}).annotate({
219
+
description: [
220
+
"Which details message footers show. Every element takes the same value.",
221
+
"Assistant footers always show on a turn's last message; time, duration and message_id also show them on",
222
+
"the turn's earlier messages they select.",
223
+
"An element set here decides on every start, and its runtime toggle (/timestamps, /turn-times,",
224
+
"/turn-durations) lasts until the TUI exits; unset, those toggles persist.",
225
+
"Selecting a type an element does not apply to has no effect.",
"Show the model varianta turn ran with, such as its reasoning effort ('high'), after the model in assistant message footers; turns without a variant are unchanged (default: false)",
369
+
"Legacy alias of footer.variant: true shows the variant a turn ran with, such as its reasoning effort ('high'), after the model in assistant message footers(default: false). footer.variant wins when set",
0 commit comments