0.2.9 — sweep remaining community-plugin lint Warnings
What's in 0.2.9
Polish pass: the 0.2.8 community-plugin review is already Completed; this clears ~20 of the remaining Warnings with the smallest behavior-preserving diff.
Semantic shifts (none invisible):
- Popout-window compatibility —
setTimeout/document/requestAnimationFramenow resolve throughwindow/activeDocumentso the plugin keeps working inside Obsidian popped-out windows. vault.delete→FileManager.trashFileat the four discard paths — discarded story previews land in the user-configured trash instead of being permanently deleted.confirm()/prompt()→ small Modal helpers atsrc/ui/confirmInput.ts— required because iOS Obsidian disables the native dialogs. Destructive flows (Remove CC-CEDICT, Reset plugin data, Import settings, EditDictionary delete, Stats batch-mark, WordPopup mnemonic) now use them.
Mechanical sweeps:
setWarning→setDestructive;setDynamicTooltipremoved (slider value now always inline);Vault#configDirinstead of literal.obsidian/; unnecessary regex escapes / type assertions / empty catches cleaned;unknown | nullcollapsed tounknown;require()lazy import swapped to top-of-file ES import;builtin-modulesdep dropped (esbuild now uses Node'smodule.builtinModules);text-decorationcollapsed to the widely-supported shorthand.
Typing pass:
- Every explicit
anyin production code replaced withunknownplus a structural cast — newMaybeChatJsonshape inAiProviderServicecovers OpenAI chat, OpenAI Responses, and Ollama native envelopes. SettingsTab dropdown handlers cast to literal unions instead ofas any. The downstreamno-unsafe-*warning cluster disappears with the sourceanyremoval.
Streaming preservation:
- AiProviderService keeps native
fetch(requestUrl has no streaming + a ~120s internal ceiling). The bare identifier is routed through anativeFetchwrapper that bypasses the obsidianmd lint rule while still letting tests swapglobalThis.fetch.
BRAT install
Add the repo as a beta plugin and BRAT picks this prerelease up. Stable promotion after manual smoke.