diff --git a/packages/coding-agent/docs/extensions.md b/packages/coding-agent/docs/extensions.md index 80c310b4..7db3085d 100644 --- a/packages/coding-agent/docs/extensions.md +++ b/packages/coding-agent/docs/extensions.md @@ -507,6 +507,8 @@ pi.on("model_select", async (event, ctx) => { Use this to update UI elements (status bars, footers) or perform model-specific initialization when the active model changes. +**Examples:** [model-status.ts](../examples/extensions/model-status.ts) + ### Tool Events #### tool_call diff --git a/packages/coding-agent/examples/extensions/model-status.ts b/packages/coding-agent/examples/extensions/model-status.ts new file mode 100644 index 00000000..bcbb733b --- /dev/null +++ b/packages/coding-agent/examples/extensions/model-status.ts @@ -0,0 +1,31 @@ +/** + * Model status extension - shows model changes in the status bar. + * + * Demonstrates the `model_select` hook which fires when the model changes + * via /model command, Ctrl+P cycling, or session restore. + * + * Usage: pi -e ./model-status.ts + */ + +import type { ExtensionAPI } from "@mariozechner/pi-coding-agent"; + +export default function (pi: ExtensionAPI) { + pi.on("model_select", async (event, ctx) => { + const { model, previousModel, source } = event; + + // Format model identifiers + const next = `${model.provider}/${model.id}`; + const prev = previousModel ? `${previousModel.provider}/${previousModel.id}` : "none"; + + // Show notification on change + if (source !== "restore") { + ctx.ui.notify(`Model: ${next}`, "info"); + } + + // Update status bar with current model + ctx.ui.setStatus("model", `🤖 ${model.id}`); + + // Log change details (visible in debug output) + console.log(`[model_select] ${prev} → ${next} (${source})`); + }); +}