Skip to main content

winx_code_agent/runtime/
workflow.rs

1//! Non-consuming native terminal observations and idempotent prompt receipts.
2
3use serde::{Deserialize, Serialize};
4
5use crate::state::turn::TurnExplanation;
6
7#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
8pub struct WorkflowObservation {
9    pub output: String,
10    pub output_included: bool,
11    pub screen: Vec<String>,
12    pub activity_seq: u64,
13    pub explanation: TurnExplanation,
14    pub prompt_receipt: Option<PromptReceipt>,
15}
16
17#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
18#[serde(rename_all = "snake_case")]
19pub enum PromptDelivery {
20    Delivered,
21    Uncertain,
22}
23
24#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
25#[serde(rename_all = "snake_case")]
26pub enum PromptOutcome {
27    Waiting,
28    AwaitingInput,
29    AwaitingApproval,
30    Exited,
31    TimedOut,
32    GenerationChanged,
33}
34
35#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
36pub struct PromptReceipt {
37    pub prompt_id: String,
38    pub delivery: PromptDelivery,
39    pub activity_observed: bool,
40    pub outcome: PromptOutcome,
41    pub generation: u64,
42    pub baseline_activity_seq: u64,
43}
44
45/// Kept beside the PTY; never serialized or written to telemetry.
46#[derive(Clone, Debug)]
47pub(crate) struct PromptRecord {
48    pub digest: [u8; 32],
49    pub recognizer: String,
50    pub receipt: PromptReceipt,
51    pub activity: std::sync::Arc<std::sync::atomic::AtomicBool>,
52}
53
54/// Retained evidence after a background PTY is reaped. No process or writer survives.
55#[derive(Clone, Debug)]
56pub struct RetainedWorkflow {
57    pub(crate) generation: u64,
58    pub(crate) activity_seq: u64,
59    pub(crate) screen: Vec<String>,
60    pub(crate) osc_title: String,
61    pub(crate) osc_progress: String,
62    pub(crate) receipts: std::collections::HashMap<String, PromptRecord>,
63}