Skip to content

Commit 3b03518

Browse files
committed
Merge branch 'main' of github.com:block/goose into evict-sessions-from-cache
* 'main' of github.com:block/goose: fix: replace unwrap() with graceful error in scheduler execute_job (#7436) fix: Dictation API error message shows incorrect limit (#7423) fix(acp): Use ACP schema types for session/list (#7409) fix(desktop): make bundle and updater asset naming configurable (#7337) fix(openai): preserve order in Responses API history (#7500) Use the correct Goose emoji 🪿 instead of Swan in README.md (#7485) feat(ui): implement fullscreen and pip display modes for MCP Apps (#7312) Disable tool pair summarization (#7481)
2 parents 460e324 + dc8e36f commit 3b03518

File tree

18 files changed

+867
-142
lines changed

18 files changed

+867
-142
lines changed

CUSTOM_DISTROS.md

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ goose's architecture is designed for extensibility. Organizations can create "re
4646
|---------------|---------------|------------|
4747
| Preconfigure a model/provider | `config.yaml`, `init-config.yaml`, environment variables | Low |
4848
| Add custom AI providers | `crates/goose/src/providers/declarative/` | Low |
49-
| Bundle custom MCP extensions | `config.yaml` extensions section, `ui/desktop/src/built-in-extensions.json` | Medium |
49+
| Bundle custom MCP extensions | `config.yaml` extensions section, `ui/desktop/src/built-in-extensions.json`, `ui/desktop/src/components/settings/extensions/bundled-extensions.json` | Medium |
5050
| Modify system prompts | `crates/goose/src/prompts/` | Low |
5151
| Customize desktop branding | `ui/desktop/` (icons, names, colors) | Medium |
5252
| Build a new UI (web, mobile) | Integrate with `goose-server` REST API | High |
@@ -191,7 +191,11 @@ async def query_data_lake(query: str) -> str:
191191
return results
192192
```
193193

194-
2. **Bundle as a built-in extension** by adding to `ui/desktop/src/built-in-extensions.json`:
194+
2. **Bundle as a built-in extension** by adding to either:
195+
- `ui/desktop/src/built-in-extensions.json` (core built-ins surfaced in extension UI)
196+
- `ui/desktop/src/components/settings/extensions/bundled-extensions.json` (bundled extension catalog in Settings)
197+
198+
Example:
195199

196200
```json
197201
{
@@ -268,6 +272,26 @@ You are an AI assistant called [YourName], created by [YourCompany].
268272
- Component text and labels
269273
- Feature visibility
270274

275+
5. **Align packaging and updater names** when rebranding:
276+
- Update static branding metadata in `ui/desktop/package.json` (`productName`, description) and Linux desktop templates (`ui/desktop/forge.deb.desktop`, `ui/desktop/forge.rpm.desktop`)
277+
278+
- Set build/release environment variables consistently:
279+
- `GITHUB_OWNER` and `GITHUB_REPO` for publisher + updater repository lookup
280+
- `GOOSE_BUNDLE_NAME` for bundle/debug scripts and updater asset naming (defaults to `Goose`)
281+
282+
Example:
283+
284+
```bash
285+
export GITHUB_OWNER="your-org"
286+
export GITHUB_REPO="your-goose-fork"
287+
export GOOSE_BUNDLE_NAME="InsightStream-goose"
288+
```
289+
290+
6. **Use this branding consistency checklist** before release:
291+
- Application metadata (`forge.config.ts`, `package.json`, `index.html`) uses your distro name
292+
- Release artifact names and updater lookup names are consistent
293+
- Desktop launchers (Linux `.desktop` templates) point to the same executable name produced by packaging
294+
271295
### Technical Details
272296

273297
- Electron config: `ui/desktop/forge.config.ts`

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Designed for maximum flexibility, goose works with any LLM and supports multi-mo
3535
- [Diagnostics & Reporting](https://block.github.io/goose/docs/troubleshooting/diagnostics-and-reporting)
3636
- [Known Issues](https://block.github.io/goose/docs/troubleshooting/known-issues)
3737

38-
# a little goose humor 🦢
38+
# a little goose humor 🪿
3939

4040
> Why did the developer choose goose as their AI agent?
4141
>

crates/goose-acp/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ goose = { path = "../goose" }
2323
goose-mcp = { path = "../goose-mcp" }
2424
rmcp = { workspace = true }
2525
sacp = "10.1.0"
26-
agent-client-protocol-schema = { version = "0.10", features = ["unstable_session_model"] }
26+
agent-client-protocol-schema = { version = "0.10", features = ["unstable_session_model", "unstable_session_list"] }
2727
anyhow = { workspace = true }
2828
tokio = { workspace = true }
2929
tokio-util = { workspace = true, features = ["compat", "rt"] }

crates/goose-acp/src/custom_requests.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,6 @@ pub struct GetSessionResponse {
8282
pub session: serde_json::Value,
8383
}
8484

85-
/// List all sessions.
86-
#[derive(Debug, Serialize, JsonSchema)]
87-
pub struct ListSessionsResponse {
88-
pub sessions: Vec<serde_json::Value>,
89-
}
90-
9185
/// Delete a session.
9286
#[derive(Debug, Deserialize, JsonSchema)]
9387
pub struct DeleteSessionRequest {

crates/goose-acp/src/server.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ use sacp::schema::{
2424
AgentCapabilities, AuthMethod, AuthenticateRequest, AuthenticateResponse, BlobResourceContents,
2525
CancelNotification, Content, ContentBlock, ContentChunk, EmbeddedResource,
2626
EmbeddedResourceResource, ImageContent, InitializeRequest, InitializeResponse,
27-
LoadSessionRequest, LoadSessionResponse, McpCapabilities, McpServer, ModelId, ModelInfo,
28-
NewSessionRequest, NewSessionResponse, PermissionOption, PermissionOptionKind,
29-
PromptCapabilities, PromptRequest, PromptResponse, RequestPermissionOutcome,
30-
RequestPermissionRequest, ResourceLink, SessionId, SessionModelState, SessionNotification,
27+
ListSessionsResponse, LoadSessionRequest, LoadSessionResponse, McpCapabilities, McpServer,
28+
ModelId, ModelInfo, NewSessionRequest, NewSessionResponse, PermissionOption,
29+
PermissionOptionKind, PromptCapabilities, PromptRequest, PromptResponse,
30+
RequestPermissionOutcome, RequestPermissionRequest, ResourceLink, SessionCapabilities,
31+
SessionId, SessionInfo, SessionListCapabilities, SessionModelState, SessionNotification,
3132
SessionUpdate, SetSessionModelRequest, SetSessionModelResponse, StopReason, TextContent,
3233
TextResourceContents, ToolCall, ToolCallContent, ToolCallId, ToolCallLocation, ToolCallStatus,
3334
ToolCallUpdate, ToolCallUpdateFields, ToolKind,
@@ -664,6 +665,7 @@ impl GooseAcpAgent {
664665

665666
let capabilities = AgentCapabilities::new()
666667
.load_session(true)
668+
.session_capabilities(SessionCapabilities::new().list(SessionListCapabilities::new()))
667669
.prompt_capabilities(
668670
PromptCapabilities::new()
669671
.image(true)
@@ -1097,14 +1099,15 @@ impl GooseAcpAgent {
10971099
.list_sessions()
10981100
.await
10991101
.map_err(|e| sacp::Error::internal_error().data(e.to_string()))?;
1100-
let sessions_json = sessions
1102+
let session_infos: Vec<SessionInfo> = sessions
11011103
.into_iter()
1102-
.map(|s| serde_json::to_value(&s))
1103-
.collect::<Result<Vec<_>, _>>()
1104-
.map_err(|e| sacp::Error::internal_error().data(e.to_string()))?;
1105-
Ok(ListSessionsResponse {
1106-
sessions: sessions_json,
1107-
})
1104+
.map(|s| {
1105+
SessionInfo::new(SessionId::new(s.id), s.working_dir)
1106+
.title(s.name)
1107+
.updated_at(s.updated_at.to_rfc3339())
1108+
})
1109+
.collect();
1110+
Ok(ListSessionsResponse::new(session_infos))
11081111
}
11091112

11101113
#[custom_method("session/get")]
@@ -1286,6 +1289,14 @@ impl JrMessageHandler for GooseAcpHandler {
12861289
request_cx.respond(json)?;
12871290
Ok(())
12881291
}
1292+
MessageCx::Request(req, request_cx) if req.method == "session/list" => {
1293+
let resp = agent.on_list_sessions().await?;
1294+
let json = serde_json::to_value(resp).map_err(|e| {
1295+
sacp::Error::internal_error().data(e.to_string())
1296+
})?;
1297+
request_cx.respond(json)?;
1298+
Ok(())
1299+
}
12891300
MessageCx::Request(req, request_cx) if req.method.starts_with('_') => {
12901301
match agent.handle_custom_request(&req.method, req.params).await {
12911302
Ok(json) => request_cx.respond(json)?,

crates/goose-server/src/routes/dictation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fn convert_error(e: anyhow::Error) -> ErrorResponse {
127127
(status = 400, description = "Invalid request (bad base64 or unsupported format)"),
128128
(status = 401, description = "Invalid API key"),
129129
(status = 412, description = "Provider not configured"),
130-
(status = 413, description = "Audio file too large (max 25MB)"),
130+
(status = 413, description = "Audio file too large (max 50MB)"),
131131
(status = 429, description = "Rate limit exceeded"),
132132
(status = 500, description = "Internal server error"),
133133
(status = 502, description = "Provider API error"),

crates/goose/src/context_mgmt/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ use tracing::log::warn;
1818

1919
pub const DEFAULT_COMPACTION_THRESHOLD: f64 = 0.8;
2020

21+
/// Feature flag to enable/disable tool pair summarization.
22+
/// Set to `false` to disable summarizing old tool call/response pairs.
23+
/// TODO: Re-enable once tool summarization stability issues are resolved.
24+
const ENABLE_TOOL_PAIR_SUMMARIZATION: bool = false;
25+
2126
const CONVERSATION_CONTINUATION_TEXT: &str =
2227
"Your context was compacted. The previous message contains a summary of the conversation so far.
2328
Do not mention that you read a summary or that conversation summarization occurred.
@@ -509,6 +514,12 @@ pub fn maybe_summarize_tool_pair(
509514
cutoff: usize,
510515
) -> JoinHandle<Option<(Message, String)>> {
511516
tokio::spawn(async move {
517+
// Tool pair summarization is currently disabled via feature flag.
518+
// See ENABLE_TOOL_PAIR_SUMMARIZATION constant above.
519+
if !ENABLE_TOOL_PAIR_SUMMARIZATION {
520+
return None;
521+
}
522+
512523
if let Some(tool_id) = tool_id_to_summarize(&conversation, cutoff) {
513524
match summarize_tool_call(provider.as_ref(), &session_id, &conversation, &tool_id).await
514525
{

0 commit comments

Comments
 (0)