diff --git a/package-lock.json b/package-lock.json index d5ceeb4..c7243bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "obsidian-plaud-sync", "version": "1.0.0", - "license": "0-BSD", + "license": "MIT", "dependencies": { "obsidian": "latest" }, @@ -584,7 +584,6 @@ "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -677,6 +676,7 @@ "integrity": "sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18" } @@ -699,7 +699,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@microsoft/eslint-plugin-sdl": { "version": "1.1.0", @@ -899,7 +900,6 @@ "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.35.1", "@typescript-eslint/types": "8.35.1", @@ -1044,9 +1044,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -1054,13 +1054,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -1130,7 +1130,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1149,9 +1148,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -1382,9 +1381,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -1513,7 +1512,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -1934,7 +1934,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -2189,9 +2188,9 @@ } }, "node_modules/eslint-plugin-json-schema-validator/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -2206,9 +2205,9 @@ } }, "node_modules/eslint-plugin-json-schema-validator/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -2223,9 +2222,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-json-schema-validator/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.7.tgz", + "integrity": "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==", "dev": true, "license": "ISC", "dependencies": { @@ -2265,9 +2264,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -2288,13 +2287,13 @@ } }, "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -2692,9 +2691,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -3481,7 +3480,6 @@ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -3524,9 +3522,9 @@ } }, "node_modules/json-schema-migrate/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -3748,9 +3746,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4046,9 +4044,9 @@ "license": "MIT" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -4661,7 +4659,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -4912,7 +4911,6 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4927,7 +4925,6 @@ "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/eslint-plugin": "8.35.1", "@typescript-eslint/parser": "8.35.1", @@ -4985,7 +4982,8 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/which": { "version": "2.0.2", @@ -5103,9 +5101,9 @@ } }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz", + "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==", "dev": true, "license": "ISC", "bin": { @@ -5113,6 +5111,9 @@ }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yaml-eslint-parser": { diff --git a/src/main.ts b/src/main.ts index a9a52d1..36958f3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -44,7 +44,12 @@ function toActionableMessage(error: unknown): string { } function formatSyncSummary(summary: PlaudSyncSummary): string { - return `Plaud sync complete. Created ${summary.created}, updated ${summary.updated}, skipped ${summary.skipped}, failed ${summary.failed}.`; + const parts = [`Created ${summary.created}`, `updated ${summary.updated}`]; + if (summary.renamed > 0) { + parts.push(`renamed ${summary.renamed}`); + } + parts.push(`skipped ${summary.skipped}`, `failed ${summary.failed}`); + return `Plaud sync complete. ${parts.join(', ')}.`; } export default class PlaudSyncPlugin extends Plugin { @@ -52,6 +57,7 @@ export default class PlaudSyncPlugin extends Plugin { private syncRuntime: PlaudSyncRuntime | null = null; async onload(): Promise { + console.log('[plaud-sync] Plugin loading...'); await this.loadSettings(); this.syncRuntime = createPlaudSyncRuntime({ isStartupEnabled: () => this.settings.syncOnStartup, @@ -64,6 +70,7 @@ export default class PlaudSyncPlugin extends Plugin { registerPlaudCommands(this); this.addSettingTab(new PlaudSettingTab(this.app, this)); + console.log('[plaud-sync] Plugin loaded successfully'); void this.syncRuntime.runStartupSync(); } @@ -116,10 +123,26 @@ export default class PlaudSyncPlugin extends Plugin { } private async runSync(trigger: SyncTrigger): Promise { + console.log(`[plaud-sync] Starting ${trigger} sync...`); try { const summary = await this.executeSyncBatch(); + console.log('[plaud-sync] Sync completed:', { + listed: summary.listed, + selected: summary.selected, + created: summary.created, + updated: summary.updated, + renamed: summary.renamed, + skipped: summary.skipped, + failed: summary.failed, + checkpointBefore: new Date(summary.lastSyncAtMsBefore).toISOString(), + checkpointAfter: new Date(summary.lastSyncAtMsAfter).toISOString() + }); if (trigger === 'manual') { - new Notice(formatSyncSummary(summary)); + if (summary.selected === 0 && summary.listed > 0) { + new Notice(`Plaud sync: No new recordings since last sync (${summary.listed} total recordings).`); + } else { + new Notice(formatSyncSummary(summary)); + } } } catch (error) { this.logFailure('sync_failed', error); @@ -160,6 +183,7 @@ export default class PlaudSyncPlugin extends Plugin { syncFolder: this.settings.syncFolder, filenamePattern: this.settings.filenamePattern, updateExisting: this.settings.updateExisting, + excludeWithoutTranscript: this.settings.excludeWithoutTranscript, lastSyncAtMs: this.settings.lastSyncAtMs }, saveCheckpoint: async (nextLastSyncAtMs) => { @@ -268,6 +292,9 @@ export default class PlaudSyncPlugin extends Plugin { }, create: async (path, content) => { await this.app.vault.create(path, content); + }, + rename: async (oldPath, newPath) => { + await this.app.vault.rename(this.requireFile(oldPath), newPath); } }; } diff --git a/src/plaud-api.ts b/src/plaud-api.ts index 1e99ebf..b84f455 100644 --- a/src/plaud-api.ts +++ b/src/plaud-api.ts @@ -19,6 +19,7 @@ export interface PlaudFileSummary { file_id?: string; is_trash?: boolean; start_time?: number; + edit_time?: number; } export interface PlaudFileDetail { diff --git a/src/plaud-normalizer.ts b/src/plaud-normalizer.ts index 373b14d..5b05069 100644 --- a/src/plaud-normalizer.ts +++ b/src/plaud-normalizer.ts @@ -22,7 +22,8 @@ function stripMarkup(value: string): string { return value .replace(/<[^>]*>/g, ' ') .replace(/!\[.*?\]\(.*?\)/g, ' ') - .replace(/\s+/g, ' ') + .replace(/[ \t]+/g, ' ') + .replace(/\n\s*\n\s*\n+/g, '\n\n') .trim(); } @@ -243,3 +244,7 @@ export function normalizePlaudDetail(raw: unknown): NormalizedPlaudDetail { raw: detail }; } + +export function hasTranscript(detail: NormalizedPlaudDetail): boolean { + return detail.transcript.trim().length > 0; +} diff --git a/src/plaud-sync.ts b/src/plaud-sync.ts index 9be447d..d81d210 100644 --- a/src/plaud-sync.ts +++ b/src/plaud-sync.ts @@ -6,6 +6,7 @@ export interface PlaudSyncSettings { syncFolder: string; filenamePattern: string; updateExisting: boolean; + excludeWithoutTranscript: boolean; lastSyncAtMs: number; } @@ -19,6 +20,7 @@ export interface PlaudSyncSummary { selected: number; created: number; updated: number; + renamed: number; skipped: number; failed: number; lastSyncAtMsBefore: number; @@ -105,12 +107,17 @@ export function shouldSyncFile(summary: PlaudFileSummary, lastSyncAtMs: number): return true; } - const startAtMs = normalizeTimestampMs(summary.start_time); - if (startAtMs === 0) { + // Use edit_time to determine if file has changed + // edit_time is in seconds, convert to milliseconds + // This covers both new recordings and transcribed/modified notes + const editTimeSeconds = normalizeTimestampMs(summary.edit_time); + if (editTimeSeconds === 0) { + // If edit_time is missing, sync it to be safe return true; } - return startAtMs > checkpoint; + const editTimeMs = editTimeSeconds * 1000; + return editTimeMs > checkpoint; } export async function runPlaudSync(input: RunPlaudSyncInput): Promise { @@ -120,6 +127,7 @@ export async function runPlaudSync(input: RunPlaudSyncInput): Promise 0) { + checkpointCandidate = Math.max(checkpointCandidate, editTimeSeconds * 1000); + } + continue; + } + const markdown = input.renderMarkdown(normalized); const upsertResult = await input.upsertNote({ vault: input.vault, @@ -147,15 +167,17 @@ export async function runPlaudSync(input: RunPlaudSyncInput): Promise 0) { + checkpointCandidate = Math.max(checkpointCandidate, editTimeSeconds * 1000); + } } catch (error) { failed += 1; failures.push({ @@ -176,6 +198,7 @@ export async function runPlaudSync(input: RunPlaudSyncInput): Promise; write(path: string, content: string): Promise; create(path: string, content: string): Promise; + rename(oldPath: string, newPath: string): Promise; } export interface BuildFilenameInput { @@ -24,8 +25,9 @@ export interface UpsertPlaudNoteInput { } export interface UpsertPlaudNoteResult { - action: 'created' | 'updated' | 'skipped'; + action: 'created' | 'updated' | 'skipped' | 'renamed'; path: string; + oldPath?: string; } function normalizeFolder(folder: string): string { @@ -127,6 +129,12 @@ export async function upsertPlaudNote(input: UpsertPlaudNoteInput): Promise toggle + .setValue(this.plugin.settings.excludeWithoutTranscript) + .onChange(async (value) => { + this.plugin.settings.excludeWithoutTranscript = value; + await this.plugin.saveSettings(); + })); + new Setting(containerEl) .setName('Filename pattern') .setDesc('Pattern used for new synced files.')