diff --git a/frontend/packages/agent/src/app.js b/frontend/packages/agent/src/app.js index abde53ea..80c7b15a 100644 --- a/frontend/packages/agent/src/app.js +++ b/frontend/packages/agent/src/app.js @@ -1809,6 +1809,34 @@ window.marked = marked; } return; } + // plugin_install: claude is loading/finishing a plugin (MCP server or + // slash-command provider). Show the status so the operator knows when + // a fresh session is loading its toolset. + if (v.subtype === 'plugin_install') { + const status = v.status === 'completed' ? '✓ done' + : v.status === 'started' ? 'loading…' + : (v.status || '?'); + api.row('note', '⚙ plugin install · ' + status); + return; + } + // commands_changed: the set of available slash commands changed (usually + // right after plugin_install). Show the count in the summary; expand to + // see the full list. + if (v.subtype === 'commands_changed') { + const cmds = Array.isArray(v.commands) ? v.commands : []; + if (!cmds.length) { + api.row('note', '⚙ commands changed · (empty)'); + return; + } + const summary = '⚙ commands changed · ' + cmds.length + ' available'; + const body = cmds.map((c) => { + const aliases = c.aliases && c.aliases.length + ? ' [/' + c.aliases.join(', /') + ']' : ''; + return '/' + c.name + aliases; + }).join('\n'); + api.details('note', summary, body); + return; + } // Other system subtypes (context_window_exceeded, etc.) — render a // muted note with the subtype label; reserve the loud orange `sys` // catch-all for truly unrecognised top-level types.