Persist open file access mode setting across restarts in obsidian

Allows a lightweight mechanism to persist this user preference.
Improve hover text a bit for readability.

Resolves #1209
This commit is contained in:
Debanjum
2025-08-20 12:46:05 -07:00
parent 2884853c98
commit eb2f0ec6bc
2 changed files with 30 additions and 6 deletions

View File

@@ -104,6 +104,9 @@ export class KhojChatView extends KhojPaneView {
super(leaf, plugin); super(leaf, plugin);
this.fileInteractions = new FileInteractions(this.app); this.fileInteractions = new FileInteractions(this.app);
// Initialize file access mode from persisted settings
this.fileAccessMode = this.setting.fileAccessMode ?? 'read';
this.waitingForLocation = true; this.waitingForLocation = true;
fetch("https://ipapi.co/json") fetch("https://ipapi.co/json")
@@ -271,29 +274,48 @@ export class KhojChatView extends KhojPaneView {
text: "File Access", text: "File Access",
attr: { attr: {
class: "khoj-input-row-button clickable-icon", class: "khoj-input-row-button clickable-icon",
title: "Toggle file access mode (Read Only)", title: "Toggle open file access",
}, },
}); });
setIcon(fileAccessButton, "file-search"); // Set initial icon based on persisted setting
fileAccessButton.addEventListener('click', () => { switch (this.fileAccessMode) {
case 'none':
setIcon(fileAccessButton, "file-x");
fileAccessButton.title = "Toggle open file access (No Access)";
break;
case 'write':
setIcon(fileAccessButton, "file-edit");
fileAccessButton.title = "Toggle open file access (Read & Write)";
break;
case 'read':
default:
setIcon(fileAccessButton, "file-search");
fileAccessButton.title = "Toggle open file access (Read Only)";
break;
}
fileAccessButton.addEventListener('click', async () => {
// Cycle through modes: none -> read -> write -> none // Cycle through modes: none -> read -> write -> none
switch (this.fileAccessMode) { switch (this.fileAccessMode) {
case 'none': case 'none':
this.fileAccessMode = 'read'; this.fileAccessMode = 'read';
setIcon(fileAccessButton, "file-search"); setIcon(fileAccessButton, "file-search");
fileAccessButton.title = "Toggle file access mode (Read Only)"; fileAccessButton.title = "Toggle open file access (Read Only)";
break; break;
case 'read': case 'read':
this.fileAccessMode = 'write'; this.fileAccessMode = 'write';
setIcon(fileAccessButton, "file-edit"); setIcon(fileAccessButton, "file-edit");
fileAccessButton.title = "Toggle file access mode (Read & Write)"; fileAccessButton.title = "Toggle open file access (Read & Write)";
break; break;
case 'write': case 'write':
this.fileAccessMode = 'none'; this.fileAccessMode = 'none';
setIcon(fileAccessButton, "file-x"); setIcon(fileAccessButton, "file-x");
fileAccessButton.title = "Toggle file access mode (No Access)"; fileAccessButton.title = "Toggle open file access (No Access)";
break; break;
} }
// Persist the updated mode to settings
this.setting.fileAccessMode = this.fileAccessMode;
await this.plugin.saveSettings();
}); });
let chatInput = inputRow.createEl("textarea", { let chatInput = inputRow.createEl("textarea", {

View File

@@ -38,6 +38,7 @@ export interface KhojSetting {
syncFolders: string[]; syncFolders: string[];
syncInterval: number; syncInterval: number;
autoVoiceResponse: boolean; autoVoiceResponse: boolean;
fileAccessMode: 'none' | 'read' | 'write';
selectedChatModelId: string | null; // Mirrors server's selected_chat_model_config selectedChatModelId: string | null; // Mirrors server's selected_chat_model_config
availableChatModels: ModelOption[]; availableChatModels: ModelOption[];
} }
@@ -58,6 +59,7 @@ export const DEFAULT_SETTINGS: KhojSetting = {
syncFolders: [], syncFolders: [],
syncInterval: 60, syncInterval: 60,
autoVoiceResponse: true, autoVoiceResponse: true,
fileAccessMode: 'read',
selectedChatModelId: null, // Will be populated from server selectedChatModelId: null, // Will be populated from server
availableChatModels: [], availableChatModels: [],
} }