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}