-
-
Notifications
You must be signed in to change notification settings - Fork 18
Add Telemetry service #356
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughAdds a TelemetryService (Mixpanel) and telemetry config; removes AnalyticsService; swaps AnalyticsService usages to TelemetryService across controllers; adds telemetry UI and preferences; changes TaskBarController.setErrorLog to accept task context and emits telemetry on errors and incomplete plugin scans; updates application properties and FXML. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant UI as Controller
participant TS as TelemetryService
participant Mix as Mixpanel API
rect rgba(230,240,255,0.5)
note over UI,TS: Emit telemetry for whitelisted events when enabled
User->>UI: Trigger action
UI->>TS: event(name, builder?)
TS->>TS: read TELEMETRY_ENABLED pref
TS->>TS: check allowlist
alt allowed
TS->>TS: build & sanitize props
TS->>Mix: deliver(event(userId, name, props))
Mix-->>TS: ack / IOException
else blocked
TS-->>UI: no-op
end
end
sequenceDiagram
autonumber
participant TR as TaskRunner
participant TBC as TaskBarController
participant TS as TelemetryService
participant UI as Error Dialog
TR->>TBC: setErrorLog(currentTask, title, content)
TBC->>TS: event("/Error/TaskExecution", {taskName, error, content})
TBC->>UI: showErrorDialog(title, content)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
🧹 Nitpick comments (15)
owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java (1)
121-122: Rename telemetry constants and update their usagesThe
rgsearch shows the following usages of the old constant names—these will all need to be updated to the new_KEYsuffixed names after you apply the diff:
TelemetryService.java
- Line 61:
getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID, …)→
getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID_KEY, …)- Line 62:
getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID, userId)→
getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID_KEY, userId)- Line 71:
getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, false)→
getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED_KEY, false)OptionsController.java
- Line 206:
putBoolean(ApplicationDefaults.TELEMETRY_ENABLED, newValue)→
putBoolean(ApplicationDefaults.TELEMETRY_ENABLED_KEY, newValue)- Line 283:
setSelected(getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, true))→
setSelected(getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED_KEY, true))Apply the following diff in ApplicationDefaults.java:
- public static final String TELEMETRY_ENABLED = "TELEMETRY_ENABLED"; - public static final String TELEMETRY_USER_ID = "TELEMETRY_USER_ID"; + /** Whether telemetry is enabled in user preferences. */ + public static final String TELEMETRY_ENABLED_KEY = "TELEMETRY_ENABLED"; + /** Stable, anonymized telemetry user identifier stored in preferences. */ + public static final String TELEMETRY_USER_ID_KEY = "TELEMETRY_USER_ID";This aligns these constants with the existing
_KEYnaming convention and adds concise Javadoc.owlplug-client/src/main/resources/application.properties (1)
13-13: Document what this token is and how to override itAdd a short comment to clarify that this is the public project token (not user data) and can be overridden via standard Spring property mechanisms. Helps future maintainers and downstream packagers.
-owlplug.telemetry.code = 1ef50688f6f98ec583f1aa2170874320 +# Telemetry project token (public, non-PII). Override with: +# -Dowlplug.telemetry.code=... or env OWLPLUG_TELEMETRY_CODE +owlplug.telemetry.code = 1ef50688f6f98ec583f1aa2170874320owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/NewLinkController.java (1)
92-92: Enrich telemetry with minimal, non-sensitive context and add failure telemetryGreat to migrate to TelemetryService. Consider adding basic properties (no paths) and emitting an error event when symlink creation fails. This improves observability without leaking PII.
Apply this diff for success context:
- this.getTelemetryService().event("/Plugins/CreateSymlink"); + this.getTelemetryService().event("/Plugins/CreateSymlink", p -> { + p.put("success", "true"); + p.put("sourceName", linkSourceNameTextField.getText()); // name only, not full path + p.put("os", this.getApplicationDefaults().getRuntimePlatform().getOperatingSystem().name()); + });And update the catch block to capture failures (outside this hunk):
// inside createSymlink(...) catch (IOException e) { ... } this.getTelemetryService().event("/Plugins/CreateSymlink", p -> { p.put("success", "false"); p.put("errorType", e.getClass().getSimpleName()); p.put("message", e.getMessage() != null ? e.getMessage().substring(0, Math.min(120, e.getMessage().length())) : ""); });If you prefer stronger consistency, extract event names to a TelemetryEvents class to avoid string literals spreading further.
owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java (1)
195-195: Include useful startup context; optionally capture first-launch flag before togglingEmitting the event is good. Add basic dimensions like version and OS. If you want a firstLaunch dimension, read it before setting it to false.
Apply this diff for added context:
- this.getTelemetryService().event("/Startup"); + this.getTelemetryService().event("/Startup", p -> { + p.put("version", this.getApplicationDefaults().getVersion()); + p.put("os", this.getApplicationDefaults().getRuntimePlatform().getOperatingSystem().name()); + });Optionally (outside this hunk), capture firstLaunch:
boolean firstLaunch = this.getPreferences().getBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, true); // ... existing logic ... this.getPreferences().putBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, false); // ... this.getTelemetryService().event("/Startup", p -> { p.put("version", this.getApplicationDefaults().getVersion()); p.put("os", this.getApplicationDefaults().getRuntimePlatform().getOperatingSystem().name()); p.put("firstLaunch", Boolean.toString(firstLaunch)); });owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java (1)
134-144: Throttle per-plugin error events and add an aggregate eventPer-plugin events are useful but can be noisy on large sets. Throttle to a reasonable number and send a single aggregate event with the total count.
Apply this diff:
- for (Plugin plugin : incompleteSyncPlugins) { - log.info("Last scan for plugin {} is incomplete", plugin.getName()); - RecoveredPluginView pluginView = new RecoveredPluginView(plugin, pluginService, this.getApplicationDefaults()); - pluginListContainer.getChildren().add(pluginView); - - this.getTelemetryService().event("/Error/PluginScanIncomplete", p -> { - p.put("nativeDiscoveryLoader", this.getPreferences().get( - ApplicationDefaults.PREFERRED_NATIVE_LOADER, "unknown")); - p.put("pluginName", plugin.getName()); - }); - } + int limit = Math.min(incompleteSyncPlugins.size(), 10); + for (int i = 0; i < limit; i++) { + Plugin plugin = incompleteSyncPlugins.get(i); + log.info("Last scan for plugin {} is incomplete", plugin.getName()); + RecoveredPluginView pluginView = new RecoveredPluginView(plugin, pluginService, this.getApplicationDefaults()); + pluginListContainer.getChildren().add(pluginView); + + this.getTelemetryService().event("/Error/PluginScanIncomplete", p -> { + p.put("nativeDiscoveryLoader", this.getPreferences().get( + ApplicationDefaults.PREFERRED_NATIVE_LOADER, "unknown")); + p.put("pluginName", plugin.getName()); + }); + } + if (incompleteSyncPlugins.size() > limit) { + this.getTelemetryService().event("/Error/PluginScanIncomplete/Bulk", p -> { + p.put("count", String.valueOf(incompleteSyncPlugins.size())); + }); + }Optional: replace pluginName with a stable, non-PII identifier if available (e.g., plugin.getId()) to avoid surprises with vendor-specific naming.
owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java (1)
182-184: Telemetry calls: make them resilient and avoid stringly-typed event names
- Ensure TelemetryService.event(...) is non-blocking and swallows/translates exceptions so UI actions (scan/export) are never impacted by telemetry outages.
- To prevent typos and promote consistency across controllers, avoid inline string literals for event names.
Apply this localized change to use constants at call sites:
- this.getTelemetryService().event("/Plugins/Scan"); + this.getTelemetryService().event(EVT_PLUGINS_SCAN);- this.getTelemetryService().event("/Plugins/Export"); + this.getTelemetryService().event(EVT_PLUGINS_EXPORT);And add these constants in the class (outside the shown range, near the class fields):
private static final String EVT_PLUGINS_SCAN = "/Plugins/Scan"; private static final String EVT_PLUGINS_EXPORT = "/Plugins/Export";Alternatively, centralize event names in a shared TelemetryEvents class to keep them DRY project-wide.
Also applies to: 189-191
owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java (1)
69-72: Good instrumentation; keep naming consistent with other controllersLogging “/Projects/Scan” before triggering sync aligns with the Plugins controller. Consider extracting event names to shared constants to avoid drift over time.
owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java (1)
205-213: Guard against missing wiki URL; avoid potential null/blank concatenationIf owlplug.github.wiki.url is missing/blank, concatenation will yield an invalid URL. Add a simple guard.
Apply:
- telemetryHyperlink.setOnAction(e -> { - PlatformUtils.openDefaultBrowser(this.getApplicationDefaults().getEnvProperty("owlplug.github.wiki.url") - + "/Telemetry"); - }); + telemetryHyperlink.setOnAction(e -> { + String wikiBase = this.getApplicationDefaults().getEnvProperty("owlplug.github.wiki.url"); + if (wikiBase != null && !wikiBase.isBlank()) { + PlatformUtils.openDefaultBrowser(wikiBase + "/Telemetry"); + } + });owlplug-client/src/main/java/com/owlplug/core/controllers/BaseController.java (1)
24-24: Telemetry migration verification and recommendations
- Verified that all references to
AnalyticsService(includinggetAnalyticsService()and theAnalyticsServicetype) have been removed—no occurrences found in the codebase.- Confirmed that
TelemetryServiceis registered as a Spring bean via@Service, so dependency injection will always succeed.- Reviewed
owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.javaand found no logic for a “disabled” or no-op mode—no conditional checks, flags, or methods referencing disable/no-op behavior.Recommendation: introduce configuration-driven short-circuiting inside
TelemetryService(for example, reading atelemetry.enabledflag fromApplicationDefaultsor via@Value) so that when telemetry is disabled the service becomes a no-op internally. This ensures callers never need to guard calls and the bean remains present for DI.owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java (2)
112-114: Null-safe error title to avoid empty dialog headingsExceptions often have null messages; prefer a safe fallback. Also, remember this content is later sent to telemetry; keep it concise.
- taskBarController.setErrorLog(currentTask, currentTask.getException().getMessage(), - currentTask.getException().toString()); + String errTitle = currentTask.getException().getMessage(); + if (errTitle == null || errTitle.isBlank()) { + errTitle = currentTask.getException().getClass().getSimpleName(); + } + taskBarController.setErrorLog(currentTask, errTitle, currentTask.getException().toString());
126-129: Same null-safe title for failure pathMirror the safeguard on the failure callback.
- taskBarController.setErrorLog(currentTask, ex.getMessage(), ex.toString()); + String errTitle = (ex.getMessage() == null || ex.getMessage().isBlank()) + ? ex.getClass().getSimpleName() + : ex.getMessage(); + taskBarController.setErrorLog(currentTask, errTitle, ex.toString());owlplug-client/src/main/resources/fxml/OptionsView.fxml (1)
91-97: Clarify copy and improve accessibility/UX for telemetry opt-inCurrent composition (“Send” + hyperlink “Diagnostic Telemetry Data” + “over the network”) reads awkwardly for screen readers and localization. Prefer a self-contained checkbox label and a separate “Learn more” link. Also, the “hyperlink-disabled” style may suggest it’s non-interactive.
- <Label styleClass="heading-2" text="Advanced" /> - <HBox alignment="CENTER_LEFT"> - <CheckBox fx:id="telemetryCheckBox" mnemonicParsing="false" text="Send" /> - <Hyperlink fx:id="telemetryHyperlink" styleClass="hyperlink-disabled" text="Diagnostic Telemetry Data" /> - <Label text="over the network" /> - </HBox> + <Label styleClass="heading-2" text="Advanced" /> + <HBox alignment="CENTER_LEFT" spacing="6.0"> + <CheckBox fx:id="telemetryCheckBox" mnemonicParsing="false" text="Send diagnostic telemetry data over the network" /> + <Hyperlink fx:id="telemetryHyperlink" text="Learn more" /> + </HBox>Confirm that the CSS class “hyperlink-disabled” is purely stylistic and doesn’t disable pointer events. If it does, drop the class or toggle it based on the checkbox state.
owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java (3)
55-63: Guard missing config and stabilize userId initializationIf owlplug.telemetry.code is missing/blank, sending will fail later. Fail fast and log once.
@PostConstruct private void initialize() { mixpanel = new MixpanelAPI("https://api-eu.mixpanel.com/track", "https://api-eu.mixpanel.com/engage"); - messageBuilder = new MessageBuilder(this.getApplicationDefaults().getEnvProperty("owlplug.telemetry.code")); + final String code = this.getApplicationDefaults().getEnvProperty("owlplug.telemetry.code"); + if (code == null || code.isBlank()) { + log.warn("Telemetry disabled: missing 'owlplug.telemetry.code'."); + // Still initialize messageBuilder with a dummy to avoid NPEs; events will be gated out by TELEMETRY_ENABLED. + messageBuilder = new MessageBuilder("disabled"); + } else { + messageBuilder = new MessageBuilder(code); + } @@ - userId = this.getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID, UUID.randomUUID().toString()); - this.getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID, userId); + String existing = this.getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID, null); + userId = (existing == null || existing.isBlank()) ? UUID.randomUUID().toString() : existing; + this.getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID, userId);
70-77: Add debug hints when events are gatedWhen telemetry is disabled or event is not allowed, a one-line debug helps diagnose why nothing shows up.
- if (!this.getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, false)) { - return; - } + if (!this.getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, false)) { + log.debug("Telemetry gated: disabled by user preferences"); + return; + } @@ - if (!ALLOWED_EVENTS.contains(canonicalName)) { - return; - } + if (!ALLOWED_EVENTS.contains(canonicalName)) { + log.debug("Telemetry gated: '{}' not in allowed events {}", canonicalName, ALLOWED_EVENTS); + return; + }
101-101: Consider graceful shutdownIf the app uses Spring lifecycle hooks, optionally shut down the dispatcher to flush pending events on exit.
Add:
@PreDestroy private void shutdown() { dispatcher.shutdown(); }And import jakarta.annotation.PreDestroy.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
⛔ Files ignored due to path filters (1)
owlplug-client/pom.xmlis excluded by!**/*.xml
📒 Files selected for processing (16)
owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java(1 hunks)owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java(2 hunks)owlplug-client/src/main/java/com/owlplug/core/controllers/BaseController.java(3 hunks)owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java(1 hunks)owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java(3 hunks)owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java(1 hunks)owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java(1 hunks)owlplug-client/src/main/java/com/owlplug/core/services/AnalyticsService.java(0 hunks)owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java(1 hunks)owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java(2 hunks)owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java(0 hunks)owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java(1 hunks)owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/NewLinkController.java(1 hunks)owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java(1 hunks)owlplug-client/src/main/resources/application.properties(1 hunks)owlplug-client/src/main/resources/fxml/OptionsView.fxml(3 hunks)
💤 Files with no reviewable changes (2)
- owlplug-client/src/main/java/com/owlplug/core/services/AnalyticsService.java
- owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (6)
owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java (2)
94-98: Verified: telemetry FXML bindings and wiki URL property are presentThe
OptionsView.fxmlfile declares both new controls with the correctfx:idvalues:
- Line 93:
<CheckBox fx:id="telemetryCheckBox" … />- Line 94:
<Hyperlink fx:id="telemetryHyperlink" … />The
application.propertiesfile also includes the required wiki URL key:
- Line 8:
owlplug.github.wiki.url = https://github.com/DropSnorz/OwlPlug/wikiNo further changes are needed.
283-284: Telemetry default opt-in implementation and service enforcement confirmed
- In OptionsController (src/main/java/com/owlplug/core/controllers/OptionsController.java:205–207, 283), the telemetry checkbox’s listener is attached before the initial
setSelected(getBoolean(..., true)). This means on first render the defaulttruevalue is persisted to preferences, enabling telemetry by default.- In TelemetryService (src/main/java/com/owlplug/core/services/TelemetryService.java:71–73),
event(...)callsgetBoolean(..., false)and returns immediately when telemetry is disabled, making it a no-op if the pref isfalse.Please confirm that opting users into telemetry by default aligns with your distribution and compliance requirements.
owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java (1)
370-374: I’ve set up commands to inspect the definitions and nullability of the involved types and methods. Let me know when you have the results.owlplug-client/src/main/resources/fxml/OptionsView.fxml (3)
46-46: Layout tweak is fineReducing the right card prefWidth to 470.0 improves balance with the left pane.
118-118: Spacing improvement around About footer controls looks goodThe added spacing in the footer HBox improves visual clarity.
126-126: Copy change “Open Logs” → “Logs” is fineShorter label aligns with the adjacent “Contribute” button and reduces crowding.
owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java
Show resolved
Hide resolved
owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
Show resolved
Hide resolved
owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
Outdated
Show resolved
Hide resolved
owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
Show resolved
Hide resolved
owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java
Show resolved
Hide resolved
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java (1)
117-125: Evaluate the preference at schedule time to avoid stale readsMinor improvement: read the preference inside the
onScheduledhandler so the latest setting is honored even if the user toggles it between sync success and task scheduling. Current code reads it once before wiring the handler.- if (prefs.getBoolean(ApplicationDefaults.SYNC_FILE_STAT_KEY, true)) { - lookupTask.getTask().setOnScheduled(lookupEvent -> { - if (directoryScope != null) { - createFileStatSyncTask(directoryScope).scheduleNow(); - } else { - createFileStatSyncTask().scheduleNow(); - } - }); - } + lookupTask.getTask().setOnScheduled(lookupEvent -> { + if (!prefs.getBoolean(ApplicationDefaults.SYNC_FILE_STAT_KEY, true)) { + return; + } + if (directoryScope != null) { + createFileStatSyncTask(directoryScope).scheduleNow(); + } else { + createFileStatSyncTask().scheduleNow(); + } + });
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (5)
owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java(1 hunks)owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java(4 hunks)owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java(1 hunks)owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java(1 hunks)owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
- owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java
- owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java
- owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
- owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (1)
owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java (1)
117-117: Preference key rename verified and backward compatibility confirmed
- Confirmed that
ApplicationDefaults.SYNC_FILE_STAT_KEYis defined exactly once inApplicationDefaults.javaas(no priorpublic static final String SYNC_FILE_STAT_KEY = "SYNC_FILE_STAT_KEY";SYNC_FILE_STATconstant or changed literal value)- No lingering references to a non-
_KEYsymbol in the codebase; all calls use the newSYNC_FILE_STAT_KEYEverything looks correct—no further changes needed.
No description provided.