1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub struct StdlibSource {
9 pub module: &'static str,
10 pub source: &'static str,
11}
12
13pub const STDLIB_SOURCES: &[StdlibSource] = &[
14 StdlibSource {
15 module: "text",
16 source: include_str!("stdlib/stdlib_text.harn"),
17 },
18 StdlibSource {
19 module: "collections",
20 source: include_str!("stdlib/stdlib_collections.harn"),
21 },
22 StdlibSource {
23 module: "math",
24 source: include_str!("stdlib/stdlib_math.harn"),
25 },
26 StdlibSource {
27 module: "path",
28 source: include_str!("stdlib/stdlib_path.harn"),
29 },
30 StdlibSource {
31 module: "json",
32 source: include_str!("stdlib/stdlib_json.harn"),
33 },
34 StdlibSource {
35 module: "graphql",
36 source: include_str!("stdlib/stdlib_graphql.harn"),
37 },
38 StdlibSource {
39 module: "schema",
40 source: include_str!("stdlib/stdlib_schema.harn"),
41 },
42 StdlibSource {
43 module: "testing",
44 source: include_str!("stdlib/stdlib_testing.harn"),
45 },
46 StdlibSource {
47 module: "files",
48 source: include_str!("stdlib/stdlib_files.harn"),
49 },
50 StdlibSource {
51 module: "vision",
52 source: include_str!("stdlib/stdlib_vision.harn"),
53 },
54 StdlibSource {
55 module: "context",
56 source: include_str!("stdlib/stdlib_context.harn"),
57 },
58 StdlibSource {
59 module: "runtime",
60 source: include_str!("stdlib/stdlib_runtime.harn"),
61 },
62 StdlibSource {
63 module: "review",
64 source: include_str!("stdlib/stdlib_review.harn"),
65 },
66 StdlibSource {
67 module: "experiments",
68 source: include_str!("stdlib/stdlib_experiments.harn"),
69 },
70 StdlibSource {
71 module: "project",
72 source: include_str!("stdlib/stdlib_project.harn"),
73 },
74 StdlibSource {
75 module: "prompt_library",
76 source: include_str!("stdlib/stdlib_prompt_library.harn"),
77 },
78 StdlibSource {
79 module: "async",
80 source: include_str!("stdlib/stdlib_async.harn"),
81 },
82 StdlibSource {
83 module: "agents",
84 source: include_str!("stdlib/stdlib_agents.harn"),
85 },
86 StdlibSource {
87 module: "agent_state",
88 source: include_str!("stdlib/stdlib_agent_state.harn"),
89 },
90 StdlibSource {
91 module: "memory",
92 source: include_str!("stdlib/stdlib_memory.harn"),
93 },
94 StdlibSource {
95 module: "postgres",
96 source: include_str!("stdlib/stdlib_postgres.harn"),
97 },
98 StdlibSource {
99 module: "checkpoint",
100 source: include_str!("stdlib/stdlib_checkpoint.harn"),
101 },
102 StdlibSource {
103 module: "host",
104 source: include_str!("stdlib/stdlib_host.harn"),
105 },
106 StdlibSource {
107 module: "git",
108 source: include_str!("stdlib/stdlib_git.harn"),
109 },
110 StdlibSource {
111 module: "hitl",
112 source: include_str!("stdlib/stdlib_hitl.harn"),
113 },
114 StdlibSource {
115 module: "trust",
116 source: include_str!("stdlib/stdlib_trust.harn"),
117 },
118 StdlibSource {
119 module: "corrections",
120 source: include_str!("stdlib/stdlib_corrections.harn"),
121 },
122 StdlibSource {
123 module: "plan",
124 source: include_str!("stdlib/stdlib_plan.harn"),
125 },
126 StdlibSource {
127 module: "waitpoints",
128 source: include_str!("stdlib/stdlib_waitpoints.harn"),
129 },
130 StdlibSource {
131 module: "waitpoint",
132 source: include_str!("stdlib/stdlib_waitpoint.harn"),
133 },
134 StdlibSource {
135 module: "monitors",
136 source: include_str!("stdlib/stdlib_monitors.harn"),
137 },
138 StdlibSource {
139 module: "worktree",
140 source: include_str!("stdlib/stdlib_worktree.harn"),
141 },
142 StdlibSource {
143 module: "acp",
144 source: include_str!("stdlib/stdlib_acp.harn"),
145 },
146 StdlibSource {
147 module: "triggers",
148 source: include_str!("stdlib/stdlib_triggers.harn"),
149 },
150 StdlibSource {
151 module: "personas/prelude",
152 source: include_str!("stdlib/stdlib_personas_prelude.harn"),
153 },
154 StdlibSource {
155 module: "connectors/shared",
156 source: include_str!("stdlib/stdlib_connectors_shared.harn"),
157 },
158 StdlibSource {
159 module: "connectors/github",
160 source: include_str!("stdlib/stdlib_connectors_github.harn"),
161 },
162 StdlibSource {
163 module: "connectors/linear",
164 source: include_str!("stdlib/stdlib_connectors_linear.harn"),
165 },
166 StdlibSource {
167 module: "connectors/notion",
168 source: include_str!("stdlib/stdlib_connectors_notion.harn"),
169 },
170 StdlibSource {
171 module: "connectors/slack",
172 source: include_str!("stdlib/stdlib_connectors_slack.harn"),
173 },
174];
175
176pub fn get_stdlib_source(module: &str) -> Option<&'static str> {
177 STDLIB_SOURCES
178 .iter()
179 .find_map(|entry| (entry.module == module).then_some(entry.source))
180}
181
182#[cfg(test)]
183mod tests {
184 use std::collections::BTreeSet;
185
186 use super::{get_stdlib_source, STDLIB_SOURCES};
187
188 #[test]
189 fn stdlib_sources_are_non_empty() {
190 for entry in STDLIB_SOURCES {
191 assert!(
192 !entry.source.trim().is_empty(),
193 "{} should have non-empty source",
194 entry.module
195 );
196 }
197 }
198
199 #[test]
200 fn stdlib_source_names_are_unique() {
201 let mut names = BTreeSet::new();
202 for entry in STDLIB_SOURCES {
203 assert!(names.insert(entry.module), "duplicate {}", entry.module);
204 }
205 }
206
207 #[test]
208 fn key_stdlib_modules_resolve() {
209 for module in [
210 "context",
211 "waitpoint",
212 "personas/prelude",
213 "connectors/shared",
214 "connectors/github",
215 "connectors/linear",
216 "connectors/notion",
217 "connectors/slack",
218 ] {
219 assert!(
220 get_stdlib_source(module).is_some(),
221 "std/{module} should resolve"
222 );
223 }
224 }
225}