This repository has been archived on 2026-10-29. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
Epiphany/epiphany-codex-bridge/src/scene_protocol.rs
2026-05-20 15:03:44 +01:00

189 lines
8.5 KiB
Rust

use codex_app_server_protocol::ThreadEpiphanyScene;
use codex_app_server_protocol::ThreadEpiphanySceneAction;
use codex_app_server_protocol::ThreadEpiphanySceneChurn;
use codex_app_server_protocol::ThreadEpiphanySceneGraph;
use codex_app_server_protocol::ThreadEpiphanySceneInvestigationCheckpoint;
use codex_app_server_protocol::ThreadEpiphanySceneRecord;
use codex_app_server_protocol::ThreadEpiphanySceneRecords;
use codex_app_server_protocol::ThreadEpiphanySceneRetrieval;
use codex_app_server_protocol::ThreadEpiphanySceneSource;
use codex_app_server_protocol::ThreadEpiphanySceneStateStatus;
use codex_app_server_protocol::ThreadEpiphanySceneStatusCount;
use codex_app_server_protocol::ThreadEpiphanySceneSubgoal;
use epiphany_core::EpiphanyScene as CoreEpiphanyScene;
use epiphany_core::EpiphanySceneAction as CoreEpiphanySceneAction;
use epiphany_core::EpiphanySceneChurn as CoreEpiphanySceneChurn;
use epiphany_core::EpiphanySceneGraph as CoreEpiphanySceneGraph;
use epiphany_core::EpiphanySceneInvestigationCheckpoint as CoreEpiphanySceneInvestigationCheckpoint;
use epiphany_core::EpiphanySceneRecord as CoreEpiphanySceneRecord;
use epiphany_core::EpiphanySceneRecords as CoreEpiphanySceneRecords;
use epiphany_core::EpiphanySceneRetrieval as CoreEpiphanySceneRetrieval;
use epiphany_core::EpiphanySceneSource as CoreEpiphanySceneSource;
use epiphany_core::EpiphanySceneStateStatus as CoreEpiphanySceneStateStatus;
use epiphany_core::EpiphanySceneStatusCount as CoreEpiphanySceneStatusCount;
use epiphany_core::EpiphanySceneSubgoal as CoreEpiphanySceneSubgoal;
pub fn protocol_scene(scene: CoreEpiphanyScene) -> ThreadEpiphanyScene {
ThreadEpiphanyScene {
state_status: match scene.state_status {
CoreEpiphanySceneStateStatus::Missing => ThreadEpiphanySceneStateStatus::Missing,
CoreEpiphanySceneStateStatus::Ready => ThreadEpiphanySceneStateStatus::Ready,
},
source: match scene.source {
CoreEpiphanySceneSource::Stored => ThreadEpiphanySceneSource::Stored,
CoreEpiphanySceneSource::Live => ThreadEpiphanySceneSource::Live,
},
revision: scene.revision,
objective: scene.objective,
active_subgoal: scene.active_subgoal.map(protocol_scene_subgoal),
subgoals: scene
.subgoals
.into_iter()
.map(protocol_scene_subgoal)
.collect(),
invariant_status_counts: scene
.invariant_status_counts
.into_iter()
.map(protocol_scene_status_count)
.collect(),
graph: protocol_scene_graph(scene.graph),
retrieval: scene.retrieval.map(protocol_scene_retrieval),
investigation_checkpoint: scene
.investigation_checkpoint
.map(protocol_scene_investigation_checkpoint),
observations: protocol_scene_records(scene.observations),
evidence: protocol_scene_records(scene.evidence),
churn: scene.churn.map(protocol_scene_churn),
available_actions: scene
.available_actions
.into_iter()
.map(protocol_scene_action)
.collect(),
}
}
pub fn protocol_scene_action(action: CoreEpiphanySceneAction) -> ThreadEpiphanySceneAction {
match action {
CoreEpiphanySceneAction::Index => ThreadEpiphanySceneAction::Index,
CoreEpiphanySceneAction::Retrieve => ThreadEpiphanySceneAction::Retrieve,
CoreEpiphanySceneAction::Distill => ThreadEpiphanySceneAction::Distill,
CoreEpiphanySceneAction::Context => ThreadEpiphanySceneAction::Context,
CoreEpiphanySceneAction::Planning => ThreadEpiphanySceneAction::Planning,
CoreEpiphanySceneAction::GraphQuery => ThreadEpiphanySceneAction::GraphQuery,
CoreEpiphanySceneAction::Jobs => ThreadEpiphanySceneAction::Jobs,
CoreEpiphanySceneAction::Roles => ThreadEpiphanySceneAction::Roles,
CoreEpiphanySceneAction::Coordinator => ThreadEpiphanySceneAction::Coordinator,
CoreEpiphanySceneAction::RoleLaunch => ThreadEpiphanySceneAction::RoleLaunch,
CoreEpiphanySceneAction::RoleResult => ThreadEpiphanySceneAction::RoleResult,
CoreEpiphanySceneAction::RoleAccept => ThreadEpiphanySceneAction::RoleAccept,
CoreEpiphanySceneAction::JobLaunch => ThreadEpiphanySceneAction::JobLaunch,
CoreEpiphanySceneAction::JobInterrupt => ThreadEpiphanySceneAction::JobInterrupt,
CoreEpiphanySceneAction::Freshness => ThreadEpiphanySceneAction::Freshness,
CoreEpiphanySceneAction::Pressure => ThreadEpiphanySceneAction::Pressure,
CoreEpiphanySceneAction::Reorient => ThreadEpiphanySceneAction::Reorient,
CoreEpiphanySceneAction::Crrc => ThreadEpiphanySceneAction::Crrc,
CoreEpiphanySceneAction::ReorientLaunch => ThreadEpiphanySceneAction::ReorientLaunch,
CoreEpiphanySceneAction::ReorientResult => ThreadEpiphanySceneAction::ReorientResult,
CoreEpiphanySceneAction::ReorientAccept => ThreadEpiphanySceneAction::ReorientAccept,
CoreEpiphanySceneAction::Propose => ThreadEpiphanySceneAction::Propose,
CoreEpiphanySceneAction::Promote => ThreadEpiphanySceneAction::Promote,
CoreEpiphanySceneAction::Update => ThreadEpiphanySceneAction::Update,
}
}
fn protocol_scene_subgoal(subgoal: CoreEpiphanySceneSubgoal) -> ThreadEpiphanySceneSubgoal {
ThreadEpiphanySceneSubgoal {
id: subgoal.id,
title: subgoal.title,
status: subgoal.status,
summary: subgoal.summary,
active: subgoal.active,
}
}
fn protocol_scene_status_count(
count: CoreEpiphanySceneStatusCount,
) -> ThreadEpiphanySceneStatusCount {
ThreadEpiphanySceneStatusCount {
status: count.status,
count: count.count,
}
}
fn protocol_scene_graph(graph: CoreEpiphanySceneGraph) -> ThreadEpiphanySceneGraph {
ThreadEpiphanySceneGraph {
architecture_node_count: graph.architecture_node_count,
architecture_edge_count: graph.architecture_edge_count,
dataflow_node_count: graph.dataflow_node_count,
dataflow_edge_count: graph.dataflow_edge_count,
link_count: graph.link_count,
active_node_ids: graph.active_node_ids,
active_edge_ids: graph.active_edge_ids,
open_question_count: graph.open_question_count,
open_gap_count: graph.open_gap_count,
dirty_paths: graph.dirty_paths,
checkpoint_id: graph.checkpoint_id,
checkpoint_summary: graph.checkpoint_summary,
}
}
fn protocol_scene_retrieval(retrieval: CoreEpiphanySceneRetrieval) -> ThreadEpiphanySceneRetrieval {
ThreadEpiphanySceneRetrieval {
workspace_root: retrieval.workspace_root,
status: retrieval.status,
semantic_available: retrieval.semantic_available,
index_revision: retrieval.index_revision,
indexed_file_count: retrieval.indexed_file_count,
indexed_chunk_count: retrieval.indexed_chunk_count,
shard_count: retrieval.shard_count,
dirty_path_count: retrieval.dirty_path_count,
}
}
fn protocol_scene_investigation_checkpoint(
checkpoint: CoreEpiphanySceneInvestigationCheckpoint,
) -> ThreadEpiphanySceneInvestigationCheckpoint {
ThreadEpiphanySceneInvestigationCheckpoint {
checkpoint_id: checkpoint.checkpoint_id,
kind: checkpoint.kind,
disposition: checkpoint.disposition,
focus: checkpoint.focus,
summary: checkpoint.summary,
next_action: checkpoint.next_action,
captured_at_turn_id: checkpoint.captured_at_turn_id,
open_question_count: checkpoint.open_question_count,
code_ref_count: checkpoint.code_ref_count,
evidence_count: checkpoint.evidence_count,
}
}
fn protocol_scene_records(records: CoreEpiphanySceneRecords) -> ThreadEpiphanySceneRecords {
ThreadEpiphanySceneRecords {
total_count: records.total_count,
latest: records
.latest
.into_iter()
.map(protocol_scene_record)
.collect(),
}
}
fn protocol_scene_record(record: CoreEpiphanySceneRecord) -> ThreadEpiphanySceneRecord {
ThreadEpiphanySceneRecord {
id: record.id,
kind: record.kind,
status: record.status,
summary: record.summary,
code_ref_count: record.code_ref_count,
}
}
fn protocol_scene_churn(churn: CoreEpiphanySceneChurn) -> ThreadEpiphanySceneChurn {
ThreadEpiphanySceneChurn {
understanding_status: churn.understanding_status,
diff_pressure: churn.diff_pressure,
graph_freshness: churn.graph_freshness,
warning: churn.warning,
unexplained_writes: churn.unexplained_writes,
}
}