namespace Volcanic.AgenticCore.Extensions.ClaudeCode;
///
/// The built-in Claude Code plugins every request disables through enabledPlugins. Built-ins load whatever the
/// setting sources say, and which ones load depends on the CLI version and the account's feature flags, so the set
/// starts with the known ones and learns new ones from system/init (the request is then replayed once).
///
public sealed class BuiltinPlugins
{
public const string Suffix = "@builtin";
/// The built-ins known to the CLI versions this provider was tested with.
public static readonly IReadOnlyList Known =
[
"agents-md@builtin", "telemetry@builtin",
"cc-plugin-agents-md@builtin", "cc-plugin-claude-test@builtin", "cc-plugin-diff@builtin", "cc-plugin-mermaid@builtin",
"cc-plugin-mods-guide@builtin", "cc-plugin-plugin-authoring@builtin", "cc-plugin-responsive-mode@builtin",
"cc-plugin-sec-default@builtin", "cc-plugin-telemetry@builtin", "cc-plugin-tips@builtin", "cc-plugin-you-should-know@builtin",
];
/// Process-wide: a built-in learned in one session is disabled for every later request.
public static BuiltinPlugins Shared { get; } = new();
private readonly Lock _gate = new();
private readonly SortedSet _disabled;
public BuiltinPlugins(IEnumerable? initial = null) =>
_disabled = new SortedSet(initial ?? Known, StringComparer.Ordinal);
/// A sorted snapshot of the plugins to disable.
public IReadOnlyList Disabled
{
get { lock (_gate) return [.. _disabled]; }
}
/// Adds built-in plugin ids; true when at least one was new.
public bool Disable(IEnumerable plugins)
{
ArgumentNullException.ThrowIfNull(plugins);
var added = false;
lock (_gate)
{
foreach (var plugin in plugins)
if (IsBuiltin(plugin)) added |= _disabled.Add(plugin);
}
return added;
}
public static bool IsBuiltin(string? source) =>
source is { Length: > 9 } s && s.EndsWith(Suffix, StringComparison.Ordinal) && !s.Contains('/') && !s.Contains('\\');
}