use std::sync::Arc;use agent_client_protocol as acp;use chrono::{Local, Utc};use gpui::{App, SharedString, Task};use schemars::JsonSchema;use serde::{Deserialize, Serialize};use crate::{AgentTool, ToolCallEventStream};#[derive(Debug, Serialize, Deserialize, JsonSchema)]#[serde(rename_all = "snake_case")]#[schemars(inline)]pub enum Timezone { /// Use UTC for the datetime. Utc, /// Use local time for the datetime. Local,}/// Returns the current datetime in RFC 3339 format./// Only use this tool when the user specifically asks for it or the current task would benefit from knowing the current datetime.#[derive(Debug, Serialize, Deserialize, JsonSchema)]pub struct NowToolInput { /// The timezone to use for the datetime. timezone: Timezone,}pub struct NowTool;impl AgentTool for NowTool { type Input = NowToolInput; type Output = String; const NAME: &'static str = "now"; fn kind() -> acp::ToolKind { acp::ToolKind::Other } fn initial_title( &self, _input: Result<Self::Input, serde_json::Value>, _cx: &mut App, ) -> SharedString { "Get current time".into() } fn run( self: Arc<Self>, input: Self::Input, _event_stream: ToolCallEventStream, _cx: &mut App, ) -> Task<Result<String, String>> { let now = match input.timezone { Timezone::Utc => Utc::now().to_rfc3339(), Timezone::Local => Local::now().to_rfc3339(), }; Task::ready(Ok(format!("The current datetime is {now}."))) }}
use std::sync::Arc;
use agent_client_protocol as acp;
use chrono::{Local, Utc};
use gpui::{App, SharedString, Task};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::{AgentTool, ToolCallEventStream};
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
#[schemars(inline)]
pub enum Timezone {
/// Use UTC for the datetime.
Utc,
/// Use local time for the datetime.
Local,
}
/// Returns the current datetime in RFC 3339 format.
/// Only use this tool when the user specifically asks for it or the current task would benefit from knowing the current datetime.
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct NowToolInput {
/// The timezone to use for the datetime.
timezone: Timezone,
}
pub struct NowTool;
impl AgentTool for NowTool {
type Input = NowToolInput;
type Output = String;
const NAME: &'static str = "now";
fn kind() -> acp::ToolKind {
acp::ToolKind::Other
}
fn initial_title(
&self,
_input: Result<Self::Input, serde_json::Value>,
_cx: &mut App,
) -> SharedString {
"Get current time".into()
}
fn run(
self: Arc<Self>,
input: Self::Input,
_event_stream: ToolCallEventStream,
_cx: &mut App,
) -> Task<Result<String, String>> {
let now = match input.timezone {
Timezone::Utc => Utc::now().to_rfc3339(),
Timezone::Local => Local::now().to_rfc3339(),
};
Task::ready(Ok(format!("The current datetime is {now}.")))
}
}