diff --git a/Cargo.lock b/Cargo.lock index b4f3c4aae229..23ce244e91e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "goose" -version = "1.3.0" +version = "1.4.0" dependencies = [ "ahash", "anyhow", @@ -3356,7 +3356,7 @@ dependencies = [ [[package]] name = "goose-bench" -version = "1.3.0" +version = "1.4.0" dependencies = [ "anyhow", "async-trait", @@ -3379,7 +3379,7 @@ dependencies = [ [[package]] name = "goose-cli" -version = "1.3.0" +version = "1.4.0" dependencies = [ "anstream", "anyhow", @@ -3430,7 +3430,7 @@ dependencies = [ [[package]] name = "goose-mcp" -version = "1.3.0" +version = "1.4.0" dependencies = [ "anyhow", "async-trait", @@ -3482,7 +3482,7 @@ dependencies = [ [[package]] name = "goose-server" -version = "1.3.0" +version = "1.4.0" dependencies = [ "anyhow", "async-trait", @@ -3519,7 +3519,7 @@ dependencies = [ [[package]] name = "goose-test" -version = "1.3.0" +version = "1.4.0" dependencies = [ "clap", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 35e756ec7f00..444a421fffb7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ resolver = "2" [workspace.package] edition = "2021" -version = "1.3.0" +version = "1.4.0" authors = ["Block "] license = "Apache-2.0" repository = "https://github.com/block/goose" diff --git a/crates/goose/src/agents/extension_manager.rs b/crates/goose/src/agents/extension_manager.rs index e27c09dedb95..369727c469e7 100644 --- a/crates/goose/src/agents/extension_manager.rs +++ b/crates/goose/src/agents/extension_manager.rs @@ -109,6 +109,7 @@ async fn child_process_client( mut command: Command, timeout: &Option, ) -> ExtensionResult { + #[cfg(unix)] command.process_group(0); let (transport, mut stderr) = TokioChildProcess::builder(command) .stderr(Stdio::piped()) diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 589b3987dbb2..01aad7cd7271 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "Apache-2.0" }, - "version": "1.3.0" + "version": "1.4.0" }, "paths": { "/agent/add_sub_recipes": { diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json index ef74dac64631..1e58ba23cd6f 100644 --- a/ui/desktop/package-lock.json +++ b/ui/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "goose-app", - "version": "1.3.0", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "goose-app", - "version": "1.3.0", + "version": "1.4.0", "license": "Apache-2.0", "dependencies": { "@ai-sdk/openai": "^0.0.72", diff --git a/ui/desktop/package.json b/ui/desktop/package.json index 1456c0017d97..8223e3143c9b 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -1,7 +1,7 @@ { "name": "goose-app", "productName": "Goose", - "version": "1.3.0", + "version": "1.4.0", "description": "Goose App", "engines": { "node": "^22.17.1" diff --git a/ui/desktop/src/components/MarkdownContent.tsx b/ui/desktop/src/components/MarkdownContent.tsx index 3566c6bcccee..15c9b293a983 100644 --- a/ui/desktop/src/components/MarkdownContent.tsx +++ b/ui/desktop/src/components/MarkdownContent.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; @@ -17,16 +17,31 @@ interface MarkdownContentProps { const CodeBlock = ({ language, children }: { language: string; children: string }) => { const [copied, setCopied] = useState(false); + const timeoutRef = useRef(null); + const handleCopy = async () => { try { await navigator.clipboard.writeText(children); setCopied(true); - setTimeout(() => setCopied(false), 2000); // Reset after 2 seconds + + if (timeoutRef.current) { + window.clearTimeout(timeoutRef.current); + } + + timeoutRef.current = window.setTimeout(() => setCopied(false), 2000); } catch (err) { console.error('Failed to copy text: ', err); } }; + useEffect(() => { + return () => { + if (timeoutRef.current) { + window.clearTimeout(timeoutRef.current); + } + }; + }, []); + return (