event-model, client-core, transcript-ui: carry main's LimitReached event
The merge that brought main into rustify added Event::LimitReached to the server's drivers, but on this branch the enum lives in event-model, which the merge left without it, so ai-server (and ui-sandbox.sh) did not build. Definition copied from main's driver.rs; the fold mirrors TranscriptItems.kt's LimitNote; the iris row shows the epoch until P1 brings a time formatter. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
46d3a6fd41
commit
c07d544aeb
3 files changed
+44
No files matched your search
@@ -112,6 +112,13 @@ pub enum TranscriptItem {
|
|||||||
ClearedNote {
|
ClearedNote {
|
||||||
seq: u64,
|
seq: u64,
|
||||||
},
|
},
|
||||||
|
/// The account's usage limit stopped the turn; `resets_at` is epoch
|
||||||
|
/// seconds when the dialect said when it lifts (`LimitNote` in
|
||||||
|
/// `TranscriptItems.kt`).
|
||||||
|
LimitNote {
|
||||||
|
seq: u64,
|
||||||
|
resets_at: Option<f64>,
|
||||||
|
},
|
||||||
CompactedNote {
|
CompactedNote {
|
||||||
seq: u64,
|
seq: u64,
|
||||||
pre_tokens: Option<u64>,
|
pre_tokens: Option<u64>,
|
||||||
@@ -131,6 +138,7 @@ impl TranscriptItem {
|
|||||||
| Self::CommandRow { seq, .. }
|
| Self::CommandRow { seq, .. }
|
||||||
| Self::Note { seq, .. }
|
| Self::Note { seq, .. }
|
||||||
| Self::ClearedNote { seq }
|
| Self::ClearedNote { seq }
|
||||||
|
| Self::LimitNote { seq, .. }
|
||||||
| Self::CompactedNote { seq, .. } => *seq,
|
| Self::CompactedNote { seq, .. } => *seq,
|
||||||
Self::QuestionCard(card) => card.seq,
|
Self::QuestionCard(card) => card.seq,
|
||||||
}
|
}
|
||||||
@@ -525,6 +533,14 @@ pub fn fold_event(items: &[TranscriptItem], entry: &SeqEvent) -> Vec<TranscriptI
|
|||||||
items.push(TranscriptItem::ClearedNote { seq });
|
items.push(TranscriptItem::ClearedNote { seq });
|
||||||
items
|
items
|
||||||
}
|
}
|
||||||
|
Event::LimitReached { resets_at } => {
|
||||||
|
let mut items = items.to_vec();
|
||||||
|
items.push(TranscriptItem::LimitNote {
|
||||||
|
seq,
|
||||||
|
resets_at: *resets_at,
|
||||||
|
});
|
||||||
|
items
|
||||||
|
}
|
||||||
Event::Compacted {
|
Event::Compacted {
|
||||||
pre_tokens,
|
pre_tokens,
|
||||||
post_tokens,
|
post_tokens,
|
||||||
|
|||||||
@@ -305,6 +305,25 @@ pub enum Event {
|
|||||||
/// it, which is why this is written down rather than left to be inferred
|
/// it, which is why this is written down rather than left to be inferred
|
||||||
/// from a second example that does not exist.
|
/// from a second example that does not exist.
|
||||||
Cleared,
|
Cleared,
|
||||||
|
/// The account behind this session has no quota left, so the turn stopped
|
||||||
|
/// without finishing.
|
||||||
|
///
|
||||||
|
/// Its own event rather than an [`Event::Error`] carrying the dialect's
|
||||||
|
/// sentence, because two things act on it that cannot read English: the
|
||||||
|
/// transcript draws it as a state the session is in rather than as a
|
||||||
|
/// failure of something it did, and `crate::resume` schedules the message
|
||||||
|
/// that picks the work back up. Recognising it belongs to the driver, which
|
||||||
|
/// is the only layer that knows its dialect's wording -- above here nothing
|
||||||
|
/// matches on strings.
|
||||||
|
///
|
||||||
|
/// `resets_at` is epoch seconds, and `None` is a real state: the dialect
|
||||||
|
/// said the limit was hit without saying when it lifts. Nothing here
|
||||||
|
/// invents one -- what the wait is actually decided against is the usage
|
||||||
|
/// endpoint, and this is the hint that starts the waiting.
|
||||||
|
LimitReached {
|
||||||
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
|
resets_at: Option<f64>,
|
||||||
|
},
|
||||||
Error {
|
Error {
|
||||||
message: String,
|
message: String,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -60,6 +60,15 @@ fn item_content(item: &TranscriptItem) -> (Option<&str>, String) {
|
|||||||
TranscriptItem::PeerNote { from, text, .. } => (Some(from.as_str()), text.clone()),
|
TranscriptItem::PeerNote { from, text, .. } => (Some(from.as_str()), text.clone()),
|
||||||
TranscriptItem::Note { text, .. } => (None, text.clone()),
|
TranscriptItem::Note { text, .. } => (None, text.clone()),
|
||||||
TranscriptItem::ClearedNote { .. } => (None, "_Context cleared._".to_string()),
|
TranscriptItem::ClearedNote { .. } => (None, "_Context cleared._".to_string()),
|
||||||
|
// Epoch seconds as-is until the port has a relative-time formatter
|
||||||
|
// (P1); the Compose `LimitRow` draws it as a countdown.
|
||||||
|
TranscriptItem::LimitNote { resets_at, .. } => (
|
||||||
|
None,
|
||||||
|
match resets_at {
|
||||||
|
Some(at) => format!("_Usage limit reached; resets at {at:.0} (epoch seconds)._"),
|
||||||
|
None => "_Usage limit reached._".to_string(),
|
||||||
|
},
|
||||||
|
),
|
||||||
TranscriptItem::CompactedNote {
|
TranscriptItem::CompactedNote {
|
||||||
pre_tokens,
|
pre_tokens,
|
||||||
post_tokens,
|
post_tokens,
|
||||||
|
|||||||
Reference in new issue
Block a user