Events / Hooks
In order to enable a tighter integration between CodeCompanion and your Neovim config, the plugin fires events at various points during its lifecycle.
List of Events
The events that you can access are:
CodeCompanionChatCreated- Fired after a chat has been created for the first timeCodeCompanionChatOpened- Fired after a chat has been openedCodeCompanionChatHidden- Fired after a chat has been hiddenCodeCompanionChatClosed- Fired after a chat has been permanently closedCodeCompanionChatStopped- Fired after a chat has been stoppedCodeCompanionChatAdapter- Fired after the adapter has been set in the chatCodeCompanionChatModel- Fired after the model has been set in the chatCodeCompanionChatPin- Fired after a pinned reference has been updated in the messages tableCodeCompanionAgentStarted- Fired when an agent has been initiated to run toolsCodeCompanionAgentFinished- Fired when an agent has finished running all toolsCodeCompanionToolAdded- Fired when a tool has been added to a chatCodeCompanionToolStarted- Fired when a tool has started executingCodeCompanionToolFinished- Fired when a tool has finished executingCodeCompanionInlineStarted- Fired at the start of the Inline strategyCodeCompanionInlineFinished- Fired at the end of the Inline strategyCodeCompanionRequestStarted- Fired at the start of any API requestCodeCompanionRequestStreaming- Fired at the start of a streaming API requestCodeCompanionRequestFinished- Fired at the end of any API requestCodeCompanionDiffAttached- Fired when in Diff modeCodeCompanionDiffDetached- Fired when exiting Diff mode
Event Data
Each event also comes with a data payload. For example, with CodeCompanionRequestStarted:
lua
{
buf = 10,
data = {
adapter = {
formatted_name = "Copilot",
model = "o3-mini-2025-01-31",
name = "copilot"
},
bufnr = 10,
id = 6107753,
strategy = "chat"
},
event = "User",
file = "CodeCompanionRequestStarted",
group = 14,
id = 30,
match = "CodeCompanionRequestStarted"
}And the CodeCompanionRequestFinished also has a data.status value.
Consuming an Event
Events can be hooked into as follows:
lua
local group = vim.api.nvim_create_augroup("CodeCompanionHooks", {})
vim.api.nvim_create_autocmd({ "User" }, {
pattern = "CodeCompanionInline*",
group = group,
callback = function(request)
if request.match == "CodeCompanionInlineFinished" then
-- Format the buffer after the inline request has completed
require("conform").format({ bufnr = request.buf })
end
end,
})