#pragma once // Step 545: Context Bundle Minimizer #include #include #include #include struct ContextBundleInput { std::string taskitemId; std::vector contractTargets; std::vector contractSymbols; std::vector contractOps; std::vector fileContext; std::vector projectContext; std::vector dependencyContext; bool narrowOperation = true; }; struct ContextBundleOutput { std::vector minimalContext; std::vector removedContext; }; class ContextBundleMinimizer { public: static ContextBundleOutput minimize(const ContextBundleInput& input) { ContextBundleOutput out; auto mustKeep = seedMustKeep(input); appendFiltered(input.fileContext, mustKeep, out.minimalContext, out.removedContext); if (!input.narrowOperation) { appendFiltered(input.projectContext, mustKeep, out.minimalContext, out.removedContext); appendFiltered(input.dependencyContext, mustKeep, out.minimalContext, out.removedContext); } else { appendFiltered(input.projectContext, mustKeep, out.minimalContext, out.removedContext, /*strict=*/true); appendFiltered(input.dependencyContext, mustKeep, out.minimalContext, out.removedContext, /*strict=*/true); } dedupe(out.minimalContext); dedupe(out.removedContext); return out; } private: static std::set seedMustKeep(const ContextBundleInput& input) { std::set keys; for (const auto& t : input.contractTargets) keys.insert(t); for (const auto& s : input.contractSymbols) keys.insert(s); for (const auto& o : input.contractOps) keys.insert(o); return keys; } static void appendFiltered(const std::vector& context, const std::set& keys, std::vector& keep, std::vector& drop, bool strict = false) { for (const auto& item : context) { bool relevant = containsAny(item, keys); if (relevant || (!strict && looksStructural(item))) { keep.push_back(item); } else { drop.push_back(item); } } } static bool containsAny(const std::string& item, const std::set& keys) { for (const auto& k : keys) { if (!k.empty() && item.find(k) != std::string::npos) return true; } return false; } static bool looksStructural(const std::string& item) { return item.find("file:") == 0 || item.find("ast:") == 0 || item.find("diag:") == 0; } static void dedupe(std::vector& items) { std::sort(items.begin(), items.end()); items.erase(std::unique(items.begin(), items.end()), items.end()); } };