Intercept slash commands in Prompt handler before reaching LLM:
- /toggle_yolo: toggle auto-approve mode
- /toggle_thinking: toggle Think for Anthropic/Hyper models
- /set_reasoning_effort: set effort level for OpenAI-style models
- /summarize: trigger session summarization
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
756ac52
refactor(acp): dynamic command list based on model
Click to expand commit body
- Remove impossible commands (new_session, switch_session)
- Remove client-handled commands (switch_model, help)
- Remove system: prefix from command names
- Add toggle_thinking only for Anthropic/Hyper models
- Add set_reasoning_effort only for models with ReasoningLevels
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
a32b947
feat(acp): map finish reasons to ACP stop reasons
Click to expand commit body
- Permission denial returns refusal (not an error)
- Context cancellation returns cancelled
- Max tokens from model returns max_tokens
- Other errors still return the error with end_turn
Assisted-by: Claude Sonnet 4 via Crush
- Wire SetSessionModel stub to parse provider:model IDs, validate, and
update the agent's active model via config and coordinator
- Add buildSessionModelState helper to collect available models from all
configured providers
- Include Models in NewSessionResponse and LoadSessionResponse so
clients
can display model selection UI
Assisted-by: Claude Sonnet 4 via Crush
Allows ACP clients to load and resume previous sessions by ID.
- Advertise loadSession capability in Initialize
- Replay message history via SessionUpdate notifications
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
9643516
feat(acp): expose commands via AvailableCommands
Click to expand commit body
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
7181b80
refactor(acp): split sink.go into focused files
Click to expand commit body
Separates the 450-line sink.go into five focused files:
- sink.go: Core struct, NewSink, Start, Stop
- sink_messages.go: HandleMessage, translatePart, translateText,
translateReasoning
- sink_permissions.go: HandlePermission, extractEditParams
- sink_tools.go: translateToolCall, translateToolResult, parseToolInput,
toolKind
- sink_plan.go: HandleSession (todoโplan conversion)
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
4a18274
feat(acp): wire session todos to ACP plan updates
Click to expand commit body
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
007a638
feat(acp): use description as tool call title
Click to expand commit body
Tool calls now display their description (e.g., "Echo a greeting")
instead of the tool name ("bash"). The title is updated when the tool
finishes streaming and input becomes available.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
aa7ad6e
feat(acp): include path in view tool results
Click to expand commit body
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
c6ab2fa
feat(acp): include path in ls tool results
Click to expand commit body
Added Path to LSResponseMetadata and updated the ACP sink to include it
via WithUpdateLocations in tool call updates, enabling clients to show
which directory is being listed.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
7ad212d
feat(acp): structured diff content for edits
Click to expand commit body
Edit/multiedit/write tool results now include ToolDiffContent with full
file before/after states, enabling proper diff rendering in ACP clients.
Permission requests for edit operations also include diff content so
clients can show proposed changes alongside the approval prompt.
Tool response metadata now includes FilePath alongside OldContent and
NewContent fields.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
759f2d2
feat(acp): map tool names to ACP tool kinds
Click to expand commit body
Maps Crush tool names to semantic ACP ToolKinds (read, edit, execute,
search, fetch, other) and extracts file paths from tool input JSON for
richer client rendering.
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
7832f86
fix(acp): use background context for sink lifetime
Click to expand commit body
The request context passed to NewSession may be short-lived. The sink
needs to outlive the request to stream updates for the session.
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
fa7cb91
fix(acp): skip echoing user messages to client
Click to expand commit body
The client already knows what it sent via the prompt request. Echoing
user messages back caused them to appear twice in the client display.
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
e93ba32
feat(acp): subscribe sink to pubsub for streaming
Implements basic ACP (Agent-Client Protocol) server support, allowing
external clients to drive Crush over stdio using JSON-RPC.
- internal/acp/server.go: connection lifecycle and signal handling
- internal/acp/agent.go: implements acp.Agent interface
- internal/acp/sink.go: event sink for translating messages to ACP
updates
- internal/cmd/acp.go: crush acp subcommand
Assisted-by: Claude Opus 4.5 via Crush