Compare commits

...

6 Commits

Author SHA1 Message Date
Oliver Kieselbach d23010d08e bump pointer: internal (dictionary button follow-up released: web on fdbe009)
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-13 01:49:52 +01:00
Oliver Kieselbach fdbe00929a Merge pull request #218 from okieselbach/agents/vuln-dictionary-hint
Web: Auto-Map's answer for a missing NVD dictionary names the button that loads it
2026-11-13 01:44:24 +01:00
Oliver Kieselbach 5c20042618 bump pointer: internal, .claude/commands (D-439 released: backend 1.5.1335 and web on b9889e3, MCP 1.6.601 on fa4a016)
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-13 01:40:50 +01:00
Oliver Kieselbach 25f1a0ec3e Vulnerability data: the dictionary sync's comment says a download takes a few seconds
Comment only; it carried the same estimate as the button's tooltip.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-13 01:29:02 +01:00
Oliver Kieselbach 320517fc80 Web: Auto-Map's answer for a missing NVD dictionary names the button that loads it
The reason text for no_dictionary pointed to the nightly sync only. The dictionary can be loaded on
demand, so the text names Vulnerability Data > Sync NVD Dictionary. The button's tooltip says "a few
seconds" instead of a number.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-13 01:24:55 +01:00
Oliver Kieselbach b9889e387b Merge pull request #217 from okieselbach/agents/vuln-dictionary-button
Vulnerability data: the NVD product dictionary in the sync status, with a button to load it
2026-11-13 01:09:17 +01:00
6 changed files with 8 additions and 6 deletions
@@ -19,7 +19,7 @@ namespace AutopilotMonitor.Functions.Functions.Vulnerability
/// Downloads the NVD product dictionary now instead of waiting for the nightly run, which is
/// otherwise the only thing that loads it: on a new installation, and after a night whose
/// download failed, the operator's Auto-Map has no dictionary until 03:00 UTC. Synchronous
/// (a download takes about a quarter of a minute); 409 while a refresh runs on this instance.
/// (a download takes a few seconds); 409 while a refresh runs on this instance.
/// Global Admin only.
/// </summary>
public class TriggerCpeDictionarySyncFunction
@@ -614,7 +614,7 @@ export function VulnerabilityDataSection({
onClick={handleSyncDictionary}
disabled={!canMutate || syncingDictionary || syncing || syncingMsrc || reseedingSeed || reseedingCommunity}
className="inline-flex items-center px-4 py-2 text-sm font-medium rounded-md text-white bg-teal-700 hover:bg-teal-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors shadow-sm"
title="Downloads the NVD product dictionary now instead of waiting for the nightly run (about 15 seconds). Auto-Map needs it."
title="Downloads the NVD product dictionary now instead of waiting for the nightly run. Takes a few seconds. Auto-Map needs it."
>
{syncingDictionary ? (
<>
@@ -40,7 +40,9 @@ describe("autoResolveReasonText", () => {
expect(autoResolveReasonText("nvd_unavailable")).toBe("NVD did not answer; try again later");
expect(autoResolveReasonText("already_mapped")).toBe("Already mapped");
expect(autoResolveReasonText("ignored")).toBe("On the ignore list");
expect(autoResolveReasonText("no_dictionary")).toBe("The NVD product dictionary has not been loaded yet (nightly sync)");
expect(autoResolveReasonText("no_dictionary")).toBe(
"The NVD product dictionary has not been loaded yet (Vulnerability Data > Sync NVD Dictionary loads it)",
);
expect(autoResolveReasonText("empty_name")).toBe("No name");
});
@@ -12,7 +12,7 @@ const AUTO_RESOLVE_REASONS = new Map<string, string>([
["nvd_unavailable", "NVD did not answer; try again later"],
["already_mapped", "Already mapped"],
["ignored", "On the ignore list"],
["no_dictionary", "The NVD product dictionary has not been loaded yet (nightly sync)"],
["no_dictionary", "The NVD product dictionary has not been loaded yet (Vulnerability Data > Sync NVD Dictionary loads it)"],
["empty_name", "No name"],
]);