Skip to main content

harness_read/
types.rs

1use harness_core::{PermissionPolicy, ToolError};
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone)]
5pub struct ReadSessionConfig {
6    pub cwd: String,
7    pub permissions: PermissionPolicy,
8    pub model_context_tokens: Option<u64>,
9    pub tokens_per_byte: Option<f64>,
10    pub max_file_size: Option<u64>,
11    pub max_bytes: Option<usize>,
12    pub default_limit: Option<usize>,
13    pub max_line_length: Option<usize>,
14}
15
16impl ReadSessionConfig {
17    pub fn new(cwd: impl Into<String>, permissions: PermissionPolicy) -> Self {
18        Self {
19            cwd: cwd.into(),
20            permissions,
21            model_context_tokens: None,
22            tokens_per_byte: None,
23            max_file_size: None,
24            max_bytes: None,
25            default_limit: None,
26            max_line_length: None,
27        }
28    }
29}
30
31impl std::fmt::Debug for ReadSessionConfig {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        f.debug_struct("ReadSessionConfig")
34            .field("cwd", &self.cwd)
35            .field("permissions", &self.permissions)
36            .finish()
37    }
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct TextMeta {
42    pub path: String,
43    pub total_lines: usize,
44    pub returned_lines: usize,
45    pub offset: usize,
46    pub limit: usize,
47    pub byte_cap: bool,
48    pub more: bool,
49    pub sha256: String,
50    pub mtime_ms: u64,
51    pub size_bytes: u64,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct DirMeta {
56    pub path: String,
57    pub total_entries: usize,
58    pub returned_entries: usize,
59    pub offset: usize,
60    pub limit: usize,
61    pub more: bool,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct AttachmentMeta {
66    pub path: String,
67    pub mime: String,
68    pub size_bytes: u64,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct Attachment {
73    pub mime: String,
74    pub data_url: String,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct TextReadResult {
79    pub output: String,
80    pub meta: TextMeta,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct DirReadResult {
85    pub output: String,
86    pub meta: DirMeta,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct AttachmentReadResult {
91    pub output: String,
92    pub attachments: Vec<Attachment>,
93    pub meta: AttachmentMeta,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct ErrorReadResult {
98    pub error: ToolError,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
102#[serde(tag = "kind", rename_all = "snake_case")]
103pub enum ReadResult {
104    #[serde(rename = "text")]
105    Text(TextReadResult),
106    #[serde(rename = "directory")]
107    Directory(DirReadResult),
108    #[serde(rename = "attachment")]
109    Attachment(AttachmentReadResult),
110    #[serde(rename = "error")]
111    Error(ErrorReadResult),
112}
113
114impl From<ErrorReadResult> for ReadResult {
115    fn from(e: ErrorReadResult) -> Self {
116        ReadResult::Error(e)
117    }
118}