mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
[codex] core: restore absolute turn context cwd (#28629)
## Why #28152 jumped the gun on moving the rollout format to store URIs, and would likely break compat with some features that don't go through the same types as the core logic. ## What Make `TurnContextItem.cwd` an `AbsolutePathBuf` again, remove test added for `PathUri` serialization in rollouts. Also drops a bunch of error paths that are no longer needed.
This commit is contained in:
committed by
GitHub
Unverified
parent
69bc0645ac
commit
3d02c443bc
@@ -125,7 +125,7 @@ impl LiveThread {
|
||||
}
|
||||
}
|
||||
}
|
||||
let metadata_sync = ThreadMetadataSync::for_resume(¶ms)?;
|
||||
let metadata_sync = ThreadMetadataSync::for_resume(¶ms);
|
||||
Ok(Self {
|
||||
thread_id,
|
||||
thread_store,
|
||||
@@ -151,7 +151,7 @@ impl LiveThread {
|
||||
.metadata_sync
|
||||
.lock()
|
||||
.await
|
||||
.observe_appended_items(canonical_items.as_slice())?;
|
||||
.observe_appended_items(canonical_items.as_slice());
|
||||
if let Some(update) = update {
|
||||
self.thread_store
|
||||
.update_thread_metadata(UpdateThreadMetadataParams {
|
||||
|
||||
@@ -18,8 +18,6 @@ use crate::CreateThreadParams;
|
||||
use crate::GitInfoPatch;
|
||||
use crate::ResumeThreadParams;
|
||||
use crate::ThreadMetadataPatch;
|
||||
use crate::ThreadStoreError;
|
||||
use crate::ThreadStoreResult;
|
||||
|
||||
const IMAGE_ONLY_USER_MESSAGE_PLACEHOLDER: &str = "[Image]";
|
||||
#[cfg(not(test))]
|
||||
@@ -92,7 +90,7 @@ impl ThreadMetadataSync {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn for_resume(params: &ResumeThreadParams) -> ThreadStoreResult<Self> {
|
||||
pub(crate) fn for_resume(params: &ResumeThreadParams) -> Self {
|
||||
let mut sync = Self {
|
||||
thread_id: params.thread_id,
|
||||
cwd_seen: params
|
||||
@@ -110,11 +108,11 @@ impl ThreadMetadataSync {
|
||||
defer_resume_update_until_append: false,
|
||||
};
|
||||
if let Some(history) = params.history.as_deref() {
|
||||
let update = sync.observe_resume_history(history)?;
|
||||
let update = sync.observe_resume_history(history);
|
||||
sync.merge_pending_update(update);
|
||||
sync.defer_resume_update_until_append = sync.pending_update.is_some();
|
||||
}
|
||||
Ok(sync)
|
||||
sync
|
||||
}
|
||||
|
||||
pub(crate) fn take_pending_update(&self) -> Option<PendingThreadMetadataPatch> {
|
||||
@@ -150,7 +148,7 @@ impl ThreadMetadataSync {
|
||||
pub(crate) fn observe_appended_items(
|
||||
&mut self,
|
||||
items: &[RolloutItem],
|
||||
) -> ThreadStoreResult<Option<PendingThreadMetadataPatch>> {
|
||||
) -> Option<PendingThreadMetadataPatch> {
|
||||
self.defer_create_update_until_history_exists = false;
|
||||
self.defer_resume_update_until_append = false;
|
||||
let affects_metadata = items
|
||||
@@ -162,10 +160,7 @@ impl ThreadMetadataSync {
|
||||
let mut update = if affects_metadata {
|
||||
self.observe_items(items)?
|
||||
} else {
|
||||
Some(thread_updated_at_touch())
|
||||
};
|
||||
let Some(update) = update else {
|
||||
return Ok(None);
|
||||
thread_updated_at_touch()
|
||||
};
|
||||
if advances_recency {
|
||||
update.advance_recency_at = Some(Utc::now());
|
||||
@@ -180,15 +175,12 @@ impl ThreadMetadataSync {
|
||||
Instant::now().duration_since(last_touch) < THREAD_UPDATED_AT_TOUCH_INTERVAL
|
||||
})
|
||||
{
|
||||
return Ok(None);
|
||||
return None;
|
||||
}
|
||||
Ok(self.take_pending_update())
|
||||
self.take_pending_update()
|
||||
}
|
||||
|
||||
fn observe_items(
|
||||
&mut self,
|
||||
items: &[RolloutItem],
|
||||
) -> ThreadStoreResult<Option<ThreadMetadataPatch>> {
|
||||
fn observe_items(&mut self, items: &[RolloutItem]) -> Option<ThreadMetadataPatch> {
|
||||
self.observe_items_with_update(
|
||||
items,
|
||||
ThreadMetadataPatch {
|
||||
@@ -198,10 +190,7 @@ impl ThreadMetadataSync {
|
||||
)
|
||||
}
|
||||
|
||||
fn observe_resume_history(
|
||||
&mut self,
|
||||
items: &[RolloutItem],
|
||||
) -> ThreadStoreResult<Option<ThreadMetadataPatch>> {
|
||||
fn observe_resume_history(&mut self, items: &[RolloutItem]) -> Option<ThreadMetadataPatch> {
|
||||
self.observe_items_with_update(items, ThreadMetadataPatch::default())
|
||||
}
|
||||
|
||||
@@ -209,9 +198,9 @@ impl ThreadMetadataSync {
|
||||
&mut self,
|
||||
items: &[RolloutItem],
|
||||
mut update: ThreadMetadataPatch,
|
||||
) -> ThreadStoreResult<Option<ThreadMetadataPatch>> {
|
||||
) -> Option<ThreadMetadataPatch> {
|
||||
if items.is_empty() {
|
||||
return Ok(None);
|
||||
return None;
|
||||
}
|
||||
for item in items {
|
||||
match item {
|
||||
@@ -244,23 +233,14 @@ impl ThreadMetadataSync {
|
||||
}
|
||||
}
|
||||
RolloutItem::TurnContext(turn_ctx) => {
|
||||
if !self.cwd_seen
|
||||
&& let Ok(cwd) = turn_ctx.cwd.to_abs_path()
|
||||
{
|
||||
if !self.cwd_seen {
|
||||
self.cwd_seen = true;
|
||||
update.cwd = Some(cwd.into_path_buf());
|
||||
update.cwd = Some(turn_ctx.cwd.clone().into_path_buf());
|
||||
}
|
||||
update.model = Some(turn_ctx.model.clone());
|
||||
update.reasoning_effort = turn_ctx.effort.clone();
|
||||
update.approval_mode = Some(turn_ctx.approval_policy);
|
||||
update.permission_profile =
|
||||
Some(turn_ctx.permission_profile().map_err(|err| {
|
||||
ThreadStoreError::Internal {
|
||||
message: format!(
|
||||
"failed to hydrate turn permission profile: {err}"
|
||||
),
|
||||
}
|
||||
})?);
|
||||
update.permission_profile = Some(turn_ctx.permission_profile());
|
||||
}
|
||||
RolloutItem::EventMsg(EventMsg::UserMessage(user)) => {
|
||||
if let Some(preview) = user_message_preview(user) {
|
||||
@@ -302,7 +282,7 @@ impl ThreadMetadataSync {
|
||||
| RolloutItem::Compacted(_) => {}
|
||||
}
|
||||
}
|
||||
Ok(Some(update))
|
||||
Some(update)
|
||||
}
|
||||
|
||||
fn merge_pending_update(&mut self, update: Option<ThreadMetadataPatch>) {
|
||||
@@ -422,8 +402,7 @@ mod tests {
|
||||
RolloutItem::SessionMeta(session_meta(thread_id)),
|
||||
RolloutItem::EventMsg(EventMsg::UserMessage(user_message("hello metadata"))),
|
||||
],
|
||||
))
|
||||
.expect("resume metadata should hydrate");
|
||||
));
|
||||
|
||||
let update = sync.take_pending_update().expect("pending metadata update");
|
||||
assert_eq!(
|
||||
@@ -462,8 +441,7 @@ mod tests {
|
||||
))),
|
||||
RolloutItem::EventMsg(EventMsg::UserMessage(user_message("first user text"))),
|
||||
],
|
||||
))
|
||||
.expect("resume metadata should hydrate");
|
||||
));
|
||||
|
||||
let update = sync.take_pending_update().expect("pending metadata update");
|
||||
assert_eq!(update.patch.preview.as_deref(), Some("ship the refactor"));
|
||||
@@ -482,8 +460,7 @@ mod tests {
|
||||
vec![RolloutItem::EventMsg(EventMsg::UserMessage(user_message(
|
||||
"first user text",
|
||||
)))],
|
||||
))
|
||||
.expect("resume metadata should hydrate");
|
||||
));
|
||||
let pending = sync.take_pending_update().expect("pending resume metadata");
|
||||
sync.mark_pending_update_applied(&pending);
|
||||
|
||||
@@ -491,7 +468,6 @@ mod tests {
|
||||
.observe_appended_items(&[RolloutItem::EventMsg(EventMsg::UserMessage(user_message(
|
||||
"later user text",
|
||||
)))])
|
||||
.expect("appended metadata should hydrate")
|
||||
.expect("updated_at touch");
|
||||
|
||||
assert_eq!(update.patch.preview, None);
|
||||
@@ -503,8 +479,7 @@ mod tests {
|
||||
#[test]
|
||||
fn metadata_irrelevant_items_coalesce_updated_at_touches() {
|
||||
let thread_id = ThreadId::new();
|
||||
let mut sync = ThreadMetadataSync::for_resume(&resume_params(thread_id, Vec::new()))
|
||||
.expect("resume metadata should hydrate");
|
||||
let mut sync = ThreadMetadataSync::for_resume(&resume_params(thread_id, Vec::new()));
|
||||
let item = RolloutItem::Compacted(CompactedItem {
|
||||
message: "compacted".to_string(),
|
||||
replacement_history: None,
|
||||
@@ -513,14 +488,12 @@ mod tests {
|
||||
|
||||
let first = sync
|
||||
.observe_appended_items(std::slice::from_ref(&item))
|
||||
.expect("appended metadata should hydrate")
|
||||
.expect("first touch should apply immediately");
|
||||
assert!(first.patch.updated_at.is_some());
|
||||
sync.mark_pending_update_applied(&first);
|
||||
|
||||
assert!(
|
||||
sync.observe_appended_items(std::slice::from_ref(&item))
|
||||
.expect("appended metadata should hydrate")
|
||||
.is_none(),
|
||||
"second touch inside the coalescing window should wait for a barrier"
|
||||
);
|
||||
@@ -560,8 +533,7 @@ mod tests {
|
||||
RolloutItem::SessionMeta(session_meta(thread_id)),
|
||||
RolloutItem::EventMsg(EventMsg::UserMessage(user_message("hello metadata"))),
|
||||
],
|
||||
))
|
||||
.expect("resume metadata should hydrate");
|
||||
));
|
||||
|
||||
assert!(
|
||||
sync.take_pending_update_for_existing_history().is_none(),
|
||||
@@ -571,7 +543,6 @@ mod tests {
|
||||
sync.observe_appended_items(&[RolloutItem::EventMsg(EventMsg::UserMessage(
|
||||
user_message("new append"),
|
||||
))])
|
||||
.expect("appended metadata should hydrate")
|
||||
.is_some(),
|
||||
"the first append should flush resume metadata together with append metadata"
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user