feat: add manual known-word cache refresh path

- Add CLI command flag  with non-GUI dispatch flow and OSD error handling.

- Add runtime integration call and IPC hook so manual refresh works from command runner without app startup.

- Add public AnkiIntegration manual refresh API with force refresh semantics and guard reuse.

- Preserve default n+1 behavior by fixing config validation for malformed  values and adding tests.
This commit is contained in:
2026-02-15 00:03:38 -08:00
parent fb20e1ca25
commit a1f196ee52
17 changed files with 315 additions and 23 deletions

View File

@@ -445,9 +445,14 @@ export class ConfigService {
: isObject(ac.openRouter)
? ac.openRouter
: {};
const { nPlusOne: _nPlusOneConfigFromAnkiConnect, ...ankiConnectWithoutNPlusOne } =
ac as Record<string, unknown>;
resolved.ankiConnect = {
...resolved.ankiConnect,
...(isObject(ac) ? (ac as Partial<ResolvedConfig["ankiConnect"]>) : {}),
...(isObject(ankiConnectWithoutNPlusOne)
? (ankiConnectWithoutNPlusOne as Partial<ResolvedConfig["ankiConnect"]>)
: {}),
fields: {
...resolved.ankiConnect.fields,
...(isObject(ac.fields)
@@ -598,17 +603,26 @@ export class ConfigService {
behavior.nPlusOneHighlightEnabled,
);
if (legacyNPlusOneHighlightEnabled !== undefined) {
resolved.ankiConnect.nPlusOne.highlightEnabled =
legacyNPlusOneHighlightEnabled;
resolved.ankiConnect.nPlusOne.highlightEnabled =
legacyNPlusOneHighlightEnabled;
warn(
"ankiConnect.behavior.nPlusOneHighlightEnabled",
behavior.nPlusOneHighlightEnabled,
DEFAULT_CONFIG.ankiConnect.nPlusOne.highlightEnabled,
"Legacy key is deprecated; use ankiConnect.nPlusOne.highlightEnabled",
);
} else if (nPlusOneConfig.highlightEnabled !== undefined) {
warn(
"ankiConnect.nPlusOne.highlightEnabled",
nPlusOneConfig.highlightEnabled,
resolved.ankiConnect.nPlusOne.highlightEnabled,
"Expected boolean.",
);
resolved.ankiConnect.nPlusOne.highlightEnabled =
DEFAULT_CONFIG.ankiConnect.nPlusOne.highlightEnabled;
} else {
resolved.ankiConnect.nPlusOne.highlightEnabled =
DEFAULT_CONFIG.ankiConnect.nPlusOne.highlightEnabled;
resolved.ankiConnect.nPlusOne.highlightEnabled =
DEFAULT_CONFIG.ankiConnect.nPlusOne.highlightEnabled;
}
}
@@ -734,6 +748,7 @@ export class ConfigService {
resolved.ankiConnect.nPlusOne.decks,
"Expected an array of strings.",
);
resolved.ankiConnect.nPlusOne.decks = [];
}
if (