v0.45.0 cb619f7

replay.go RawHistoryFolder

1package provider
2
3// WithMessageOrigin records the producing route without changing shared metadata.
4// Explicit provenance survives session replay, compaction, and model switches.
5func WithMessageOrigin(msg Message, providerName, model string) Message {
6	if msg.Role != RoleAssistant || (providerName == "" && model == "") {
7		return msg
8	}
9	meta := make(map[string]string, len(msg.Meta)+2)
10	for k, v := range msg.Meta {
11		meta[k] = v
12	}
13	if meta["provider"] == "" && providerName != "" {
14		meta["provider"] = providerName
15	}
16	if meta["model"] == "" && model != "" {
17		meta["model"] = model
18	}
19	msg.Meta = meta
20	return msg
21}
22
23// replayContent projects model-private state out of foreign assistant turns.
24// The stored transcript and ordinary text/tool blocks remain intact. Unknown
25// provenance retains historical behavior; each wire adapter still validates
26// the shape of opaque items it accepts.
27func replayContent(msg Message, providerName, model string) []Content {
28	if (msg.Meta["provider"] == "" || msg.Meta["provider"] == providerName) &&
29		(msg.Meta["model"] == "" || msg.Meta["model"] == model) {
30		return msg.Content
31	}
32	content := make([]Content, 0, len(msg.Content))
33	for _, block := range msg.Content {
34		switch v := block.(type) {
35		case ReasoningBlock:
36			continue
37		case TextBlock:
38			v.ThoughtSignature = ""
39			block = v
40		case ImageBlock:
41			v.ThoughtSignature = ""
42			block = v
43		case ToolCallBlock:
44			v.ThoughtSignature = ""
45			block = v
46		}
47		content = append(content, block)
48	}
49	return content
50}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 476

↑↓ moveenter openesc close