Skip to content

Commit 5d5a4d5

Browse files
authored
Merge pull request #66 from Sewer56/refactor/group-tool-metadata
Move built-in tool guidance to ToolPrompt and report static request footprint
2 parents ae8f939 + 11cce2b commit 5d5a4d5

73 files changed

Lines changed: 3275 additions & 2132 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/llm-coding-tools-agents/src/runtime/builder.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ mod tests {
8181
use crate::runtime::tool_catalog::{default_tools, ToolCatalogEntry, ToolCatalogKind};
8282
use crate::runtime::AgentDefaults;
8383
use crate::{AgentCatalog, AgentConfig, AgentMode};
84-
use llm_coding_tools_core::tool_names;
84+
use llm_coding_tools_core::tool_metadata::{glob as glob_meta, read as read_meta};
8585
use llm_coding_tools_core::TaskSettings;
8686

8787
fn sample_config(name: &str, model: Option<&str>) -> AgentConfig {
@@ -108,8 +108,8 @@ mod tests {
108108
top_p: Some(0.95),
109109
};
110110
let tools = vec![
111-
ToolCatalogEntry::new(tool_names::READ, ToolCatalogKind::Read),
112-
ToolCatalogEntry::new(tool_names::GLOB, ToolCatalogKind::Glob),
111+
ToolCatalogEntry::new(read_meta::NAME, ToolCatalogKind::Read),
112+
ToolCatalogEntry::new(glob_meta::NAME, ToolCatalogKind::Glob),
113113
];
114114

115115
let runtime = AgentRuntimeBuilder::new()

src/llm-coding-tools-agents/src/runtime/task.rs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use super::state::AgentRuntime;
99
use super::tool_catalog::{ToolCatalogEntry, ToolCatalogKind};
1010
use crate::{AgentCatalog, AgentConfig, AgentMode, RulesetExt};
1111
use llm_coding_tools_core::permissions::Ruleset;
12-
use llm_coding_tools_core::tool_names;
12+
use llm_coding_tools_core::tool_metadata::task as task_meta;
1313

1414
/// Compact metadata used to describe one callable Task target.
1515
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -69,7 +69,7 @@ pub fn callable_targets<'a>(catalog: &'a AgentCatalog, caller_name: &str) -> Vec
6969

7070
let agents = sorted_agents(catalog);
7171
let task_rules = Ruleset::from_permission_config(&caller.permission);
72-
let has_explicit_task_permission = caller.permission.contains_key(tool_names::TASK);
72+
let has_explicit_task_permission = caller.permission.contains_key(task_meta::NAME);
7373
let mut targets = Vec::with_capacity(agents.len());
7474

7575
// Keep only non-primary targets that survive `permission.task` filtering.
@@ -95,7 +95,7 @@ fn target_is_callable(
9595
) -> bool {
9696
matches!(target.mode, AgentMode::All | AgentMode::Subagent)
9797
&& (!has_explicit_task_permission
98-
|| task_rules.is_allowed(tool_names::TASK, target.name.as_ref()))
98+
|| task_rules.is_allowed(task_meta::NAME, target.name.as_ref()))
9999
}
100100

101101
pub(super) fn resolve_allowed_tools(
@@ -108,7 +108,7 @@ pub(super) fn resolve_allowed_tools(
108108

109109
let agents = sorted_agents(runtime.catalog());
110110
let task_rules = Ruleset::from_permission_config(&caller.permission);
111-
let has_explicit_task_permission = caller.permission.contains_key(tool_names::TASK);
111+
let has_explicit_task_permission = caller.permission.contains_key(task_meta::NAME);
112112
let mut task_is_callable = false;
113113

114114
// Expose `task` only when at least one delegated target remains callable.
@@ -152,6 +152,9 @@ mod tests {
152152
use ahash::AHashMap;
153153
use indexmap::IndexMap;
154154
use llm_coding_tools_core::permissions::PermissionAction;
155+
use llm_coding_tools_core::tool_metadata::{
156+
bash as bash_meta, read as read_meta, task as task_meta, write as write_meta,
157+
};
155158

156159
fn agent(
157160
name: &str,
@@ -185,12 +188,12 @@ mod tests {
185188
for (pattern, action) in patterns {
186189
map.insert(pattern.to_string(), *action);
187190
}
188-
IndexMap::from([("task".into(), PermissionRule::Pattern(map))])
191+
IndexMap::from([(task_meta::NAME.into(), PermissionRule::Pattern(map))])
189192
}
190193

191194
fn deny_task() -> IndexMap<String, PermissionRule> {
192195
IndexMap::from([(
193-
"task".into(),
196+
task_meta::NAME.into(),
194197
PermissionRule::Action(PermissionAction::Deny),
195198
)])
196199
}
@@ -202,7 +205,7 @@ mod tests {
202205
"agent-a",
203206
AgentMode::All,
204207
"Agent A",
205-
allow_tools(&[tool_names::TASK]),
208+
allow_tools(&[task_meta::NAME]),
206209
)]);
207210

208211
let targets = callable_targets(&catalog, "nonexistent");
@@ -217,7 +220,7 @@ mod tests {
217220
"caller",
218221
AgentMode::All,
219222
"Caller",
220-
allow_tools(&[tool_names::TASK]),
223+
allow_tools(&[task_meta::NAME]),
221224
),
222225
agent("all-target", AgentMode::All, "All Target", IndexMap::new()),
223226
agent(
@@ -249,7 +252,7 @@ mod tests {
249252
"self-agent",
250253
AgentMode::All,
251254
"Self Agent",
252-
allow_tools(&[tool_names::TASK]),
255+
allow_tools(&[task_meta::NAME]),
253256
)]);
254257

255258
let targets = callable_targets(&catalog, "self-agent");
@@ -264,7 +267,7 @@ mod tests {
264267
"caller",
265268
AgentMode::Primary,
266269
"Caller",
267-
allow_tools(&[tool_names::READ]),
270+
allow_tools(&[read_meta::NAME]),
268271
),
269272
agent("all-target", AgentMode::All, "All Target", IndexMap::new()),
270273
agent(
@@ -416,19 +419,19 @@ mod tests {
416419
"zebra",
417420
AgentMode::All,
418421
"Zebra description",
419-
allow_tools(&[tool_names::READ, tool_names::BASH]),
422+
allow_tools(&[read_meta::NAME, bash_meta::NAME]),
420423
),
421424
agent(
422425
"alpha",
423426
AgentMode::All,
424427
"Alpha description",
425-
allow_tools(&[tool_names::WRITE]),
428+
allow_tools(&[write_meta::NAME]),
426429
),
427430
agent(
428431
"caller",
429432
AgentMode::All,
430433
"Caller",
431-
allow_tools(&[tool_names::TASK]),
434+
allow_tools(&[task_meta::NAME]),
432435
),
433436
]);
434437

@@ -480,13 +483,13 @@ mod tests {
480483
]))
481484
.build();
482485

483-
let tool_names: Vec<_> = runtime
486+
let names: Vec<_> = runtime
484487
.allowed_tools("caller")
485488
.iter()
486489
.map(|t| t.name)
487490
.collect();
488491

489-
assert_eq!(tool_names, vec![tool_names::TASK]);
492+
assert_eq!(names, vec![task_meta::NAME]);
490493
}
491494

492495
#[test]
@@ -497,7 +500,7 @@ mod tests {
497500
"caller",
498501
AgentMode::Primary,
499502
"Caller",
500-
allow_tools(&[tool_names::TASK, tool_names::READ]),
503+
allow_tools(&[task_meta::NAME, read_meta::NAME]),
501504
),
502505
agent(
503506
"primary-target",
@@ -508,13 +511,13 @@ mod tests {
508511
]))
509512
.build();
510513

511-
let tool_names: Vec<_> = runtime
514+
let names: Vec<_> = runtime
512515
.allowed_tools("caller")
513516
.iter()
514517
.map(|t| t.name)
515518
.collect();
516519

517-
assert!(tool_names.contains(&tool_names::READ));
518-
assert!(!tool_names.contains(&tool_names::TASK));
520+
assert!(names.contains(&read_meta::NAME));
521+
assert!(!names.contains(&task_meta::NAME));
519522
}
520523
}

src/llm-coding-tools-agents/src/runtime/tool_catalog.rs

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@
1111
//! The default tools are: read, write, edit, glob, grep, bash, webfetch, todoread,
1212
//! todowrite, task.
1313
14-
use llm_coding_tools_core::tool_names;
14+
use llm_coding_tools_core::tool_metadata::{
15+
bash as bash_meta, edit as edit_meta, glob as glob_meta, grep as grep_meta, read as read_meta,
16+
task as task_meta, todo_read as todo_read_meta, todo_write as todo_write_meta,
17+
webfetch as webfetch_meta, write as write_meta,
18+
};
1519

1620
/// One tool the runtime can provide to agents.
1721
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -56,16 +60,16 @@ pub enum ToolCatalogKind {
5660
}
5761

5862
const DEFAULT_TOOLS: [ToolCatalogEntry; 10] = [
59-
ToolCatalogEntry::new(tool_names::READ, ToolCatalogKind::Read),
60-
ToolCatalogEntry::new(tool_names::WRITE, ToolCatalogKind::Write),
61-
ToolCatalogEntry::new(tool_names::EDIT, ToolCatalogKind::Edit),
62-
ToolCatalogEntry::new(tool_names::GLOB, ToolCatalogKind::Glob),
63-
ToolCatalogEntry::new(tool_names::GREP, ToolCatalogKind::Grep),
64-
ToolCatalogEntry::new(tool_names::BASH, ToolCatalogKind::Bash),
65-
ToolCatalogEntry::new(tool_names::WEBFETCH, ToolCatalogKind::WebFetch),
66-
ToolCatalogEntry::new(tool_names::TODO_READ, ToolCatalogKind::TodoRead),
67-
ToolCatalogEntry::new(tool_names::TODO_WRITE, ToolCatalogKind::TodoWrite),
68-
ToolCatalogEntry::new(tool_names::TASK, ToolCatalogKind::Task),
63+
ToolCatalogEntry::new(read_meta::NAME, ToolCatalogKind::Read),
64+
ToolCatalogEntry::new(write_meta::NAME, ToolCatalogKind::Write),
65+
ToolCatalogEntry::new(edit_meta::NAME, ToolCatalogKind::Edit),
66+
ToolCatalogEntry::new(glob_meta::NAME, ToolCatalogKind::Glob),
67+
ToolCatalogEntry::new(grep_meta::NAME, ToolCatalogKind::Grep),
68+
ToolCatalogEntry::new(bash_meta::NAME, ToolCatalogKind::Bash),
69+
ToolCatalogEntry::new(webfetch_meta::NAME, ToolCatalogKind::WebFetch),
70+
ToolCatalogEntry::new(todo_read_meta::NAME, ToolCatalogKind::TodoRead),
71+
ToolCatalogEntry::new(todo_write_meta::NAME, ToolCatalogKind::TodoWrite),
72+
ToolCatalogEntry::new(task_meta::NAME, ToolCatalogKind::Task),
6973
];
7074

7175
/// Returns the standard tool set.
@@ -76,23 +80,27 @@ pub fn default_tools() -> Vec<ToolCatalogEntry> {
7680
#[cfg(test)]
7781
mod tests {
7882
use super::{default_tools, ToolCatalogEntry, ToolCatalogKind};
79-
use llm_coding_tools_core::tool_names;
83+
use llm_coding_tools_core::tool_metadata::{
84+
bash as bash_meta, edit as edit_meta, glob as glob_meta, grep as grep_meta,
85+
read as read_meta, task as task_meta, todo_read as todo_read_meta,
86+
todo_write as todo_write_meta, webfetch as webfetch_meta, write as write_meta,
87+
};
8088

8189
#[test]
8290
fn default_tools_match_expected_catalog() {
8391
assert_eq!(
8492
default_tools(),
8593
vec![
86-
ToolCatalogEntry::new(tool_names::READ, ToolCatalogKind::Read),
87-
ToolCatalogEntry::new(tool_names::WRITE, ToolCatalogKind::Write),
88-
ToolCatalogEntry::new(tool_names::EDIT, ToolCatalogKind::Edit),
89-
ToolCatalogEntry::new(tool_names::GLOB, ToolCatalogKind::Glob),
90-
ToolCatalogEntry::new(tool_names::GREP, ToolCatalogKind::Grep),
91-
ToolCatalogEntry::new(tool_names::BASH, ToolCatalogKind::Bash),
92-
ToolCatalogEntry::new(tool_names::WEBFETCH, ToolCatalogKind::WebFetch),
93-
ToolCatalogEntry::new(tool_names::TODO_READ, ToolCatalogKind::TodoRead),
94-
ToolCatalogEntry::new(tool_names::TODO_WRITE, ToolCatalogKind::TodoWrite),
95-
ToolCatalogEntry::new(tool_names::TASK, ToolCatalogKind::Task),
94+
ToolCatalogEntry::new(read_meta::NAME, ToolCatalogKind::Read),
95+
ToolCatalogEntry::new(write_meta::NAME, ToolCatalogKind::Write),
96+
ToolCatalogEntry::new(edit_meta::NAME, ToolCatalogKind::Edit),
97+
ToolCatalogEntry::new(glob_meta::NAME, ToolCatalogKind::Glob),
98+
ToolCatalogEntry::new(grep_meta::NAME, ToolCatalogKind::Grep),
99+
ToolCatalogEntry::new(bash_meta::NAME, ToolCatalogKind::Bash),
100+
ToolCatalogEntry::new(webfetch_meta::NAME, ToolCatalogKind::WebFetch,),
101+
ToolCatalogEntry::new(todo_read_meta::NAME, ToolCatalogKind::TodoRead,),
102+
ToolCatalogEntry::new(todo_write_meta::NAME, ToolCatalogKind::TodoWrite,),
103+
ToolCatalogEntry::new(task_meta::NAME, ToolCatalogKind::Task),
96104
],
97105
);
98106
}

src/llm-coding-tools-core/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ tokio = { version = "1.50", features = ["fs", "io-util", "process", "time"], opt
9090

9191
# Cross-platform process tree management (Job Objects on Windows, process groups on Unix)
9292
process-wrap = { version = "9.1", default-features = false }
93+
# Compile-time string formatting for prompt text and parameter descriptions
94+
const_format = "0.2.35"
9395

9496
[dev-dependencies]
9597
tempfile = "3.27"

0 commit comments

Comments
 (0)