fix(session): log --last 0 means no backlog
debug.log handed `last` to the timeline query, where 0 means every entry, so `log --follow --last 0` streamed the whole ring of up to 8192 entries before the new ones, where an agent reads it as tail -n 0 -f: nothing old, only what comes next. 0 now means no backlog, followed or not, and the guide says that --follow starts with the last 50. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
29f1eed9ab
commit
b95c594be8
2 changed files with 7 additions and 3 deletions
|
|
@ -462,11 +462,14 @@ namespace Crafter::Debug {
|
||||||
}
|
}
|
||||||
if (!known) return exchange->Reply(MakeErrorReply(Codes::invalidParams, std::format("kinds: '{}' is not one of log, warn, error, check, event, agent, pause, stdio", kind)));
|
if (!known) return exchange->Reply(MakeErrorReply(Codes::invalidParams, std::format("kinds: '{}' is not one of log, warn, error, check, event, agent, pause, stdio", kind)));
|
||||||
}
|
}
|
||||||
|
// `last` 0 means none, as with tail -n 0: a follower that only
|
||||||
|
// wants what comes next. (A TimelineQuery's 0 means all.)
|
||||||
Detail::TimelineQuery backlog = query;
|
Detail::TimelineQuery backlog = query;
|
||||||
backlog.last = decoded->last;
|
backlog.last = decoded->last;
|
||||||
|
const auto recent = [&] { return decoded->last == 0 ? std::vector<TimelineEntry>() : Detail::Timeline::Instance().Query(backlog); };
|
||||||
if (!decoded->follow) {
|
if (!decoded->follow) {
|
||||||
Value entries = Value::MakeArray();
|
Value entries = Value::MakeArray();
|
||||||
for (const TimelineEntry& entry : Detail::Timeline::Instance().Query(backlog)) entries.Push(EntryValue(entry));
|
for (const TimelineEntry& entry : recent()) entries.Push(EntryValue(entry));
|
||||||
return exchange->Reply(MakeReply(Object({ { "entries", std::move(entries) }, { "lastSequence", Value(Detail::Timeline::Instance().LastSequence()) } })));
|
return exchange->Reply(MakeReply(Object({ { "entries", std::move(entries) }, { "lastSequence", Value(Detail::Timeline::Instance().LastSequence()) } })));
|
||||||
}
|
}
|
||||||
// The backlog and the registration happen under one lock, which
|
// The backlog and the registration happen under one lock, which
|
||||||
|
|
@ -474,7 +477,7 @@ namespace Crafter::Debug {
|
||||||
// every entry once and in order. Stream never blocks.
|
// every entry once and in order. Stream never blocks.
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
const std::uint64_t upTo = Detail::Timeline::Instance().LastSequence();
|
const std::uint64_t upTo = Detail::Timeline::Instance().LastSequence();
|
||||||
for (const TimelineEntry& entry : Detail::Timeline::Instance().Query(backlog)) {
|
for (const TimelineEntry& entry : recent()) {
|
||||||
if (entry.sequence > upTo) continue;
|
if (entry.sequence > upTo) continue;
|
||||||
if (!exchange->Stream(Object({ { "entry", EntryValue(entry) } }))) return;
|
if (!exchange->Stream(Object({ { "entry", EntryValue(entry) } }))) return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -984,7 +984,8 @@ memory are a debugger's job; `crafter-debug debugger` prints how to attach one.
|
||||||
trace <sample> --history a Debug::Sample's recent history
|
trace <sample> --history a Debug::Sample's recent history
|
||||||
log [--last 50] [--level info|warn|error] [--cat <glob>] [--grep <text>]
|
log [--last 50] [--level info|warn|error] [--cat <glob>] [--grep <text>]
|
||||||
[--since-frame n] [--kinds log,warn,error,check,event,agent,pause,stdio]
|
[--since-frame n] [--kinds log,warn,error,check,event,agent,pause,stdio]
|
||||||
log --follow [--for 30m] streams new entries; run it under Monitor
|
log --follow [--for 30m] the last 50 (--last; 0 for none), then new
|
||||||
|
entries as they come; run it under Monitor
|
||||||
screenshot [-o shot.png] default ./build/crafter-debug-shots/
|
screenshot [-o shot.png] default ./build/crafter-debug-shots/
|
||||||
quit [--force] --force exits even if the loop is stuck
|
quit [--force] --force exits even if the loop is stuck
|
||||||
debugger how to attach lldb or gdb
|
debugger how to attach lldb or gdb
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue