mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
[2 of 2] Finish moving goal runtime to extension (#26548)
## Stack 1. [#26547](https://github.com/openai/codex/pull/26547) - [1 of 2] Align goal extension with core behavior 2. [#26548](https://github.com/openai/codex/pull/26548) - [2 of 2] Move goal runtime to extension ## Why This PR completes the switch of the goal behavior to the extension-backed runtime and removes the old core goal implementation. ## What Changed - Installs the goal extension for app-server `ThreadManager` sessions. - Routes app-server thread goal `get`, `set`, and `clear` through `GoalService`. - Uses thread-idle lifecycle emission after goal resume and snapshot ordering so the extension can decide whether to continue the goal. - Forwards extension goal updates through a FIFO async app-server notification path so backpressure does not drop them or reorder updates. - Keeps review turns from enabling goal runtime behavior. - Plans extension tools before dynamic tools so built-in goal tool names keep their old precedence when goals are enabled. - Removes the old core goal runtime, core goal tool handlers, and core goal tool specs. - Updates tests that were coupled to the core-owned goal runtime while leaving the legacy `<goal_context>` compatibility path in core for old threads. - Removes the stale cargo-shear ignore now that `codex-goal-extension` is used by the workspace. - Keeps realtime event matching exhaustive after removing the old goal-specific realtime text path. ## Validation - Ran manual `/goal` runs in TUI. Validated time accounting matched wall-clock time and goal lifecycle state transitions.
This commit is contained in:
committed by
GitHub
Unverified
parent
679cc08445
commit
479a14cf59
@@ -33,14 +33,14 @@ fn detects_subagent_notification_fragment_case_insensitively() {
|
||||
#[test]
|
||||
fn detects_internal_model_context_fragment() {
|
||||
let text = InternalModelContextFragment::new(
|
||||
InternalContextSource::from_static("goal"),
|
||||
"Continue working toward the active thread goal.",
|
||||
InternalContextSource::from_static("extension"),
|
||||
"Internal steering.",
|
||||
)
|
||||
.render();
|
||||
|
||||
assert_eq!(
|
||||
text,
|
||||
"<codex_internal_context source=\"goal\">\nContinue working toward the active thread goal.\n</codex_internal_context>"
|
||||
"<codex_internal_context source=\"extension\">\nInternal steering.\n</codex_internal_context>"
|
||||
);
|
||||
assert!(is_contextual_user_fragment(&ContentItem::InputText {
|
||||
text
|
||||
@@ -65,7 +65,7 @@ fn does_not_hide_arbitrary_context_tags() {
|
||||
#[test]
|
||||
fn rejects_invalid_internal_model_context_source() {
|
||||
assert!(!is_contextual_user_fragment(&ContentItem::InputText {
|
||||
text: "<codex_internal_context source=\"Goal\">\nbody\n</codex_internal_context>"
|
||||
text: "<codex_internal_context source=\"Extension\">\nbody\n</codex_internal_context>"
|
||||
.to_string(),
|
||||
}));
|
||||
}
|
||||
@@ -73,13 +73,13 @@ fn rejects_invalid_internal_model_context_source() {
|
||||
#[test]
|
||||
fn contextual_user_fragment_is_dyn_compatible() {
|
||||
let fragment: Box<dyn ContextualUserFragment> = Box::new(InternalModelContextFragment::new(
|
||||
InternalContextSource::from_static("goal"),
|
||||
"Continue working toward the active thread goal.",
|
||||
InternalContextSource::from_static("extension"),
|
||||
"Internal steering.",
|
||||
));
|
||||
|
||||
assert_eq!(
|
||||
fragment.render(),
|
||||
"<codex_internal_context source=\"goal\">\nContinue working toward the active thread goal.\n</codex_internal_context>"
|
||||
"<codex_internal_context source=\"extension\">\nInternal steering.\n</codex_internal_context>"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user