|
1 | 1 | import { Plugin, WorkspaceLeaf, Notice, requestUrl } from "obsidian"; |
| 2 | +import * as semver from "semver"; |
2 | 3 | import { ChatView, VIEW_TYPE_CHAT } from "./components/chat/ChatView"; |
3 | 4 | import { |
4 | 5 | createSettingsStore, |
@@ -469,18 +470,77 @@ export default class AgentClientPlugin extends Plugin { |
469 | 470 | this.settingsStore.set(this.settings); |
470 | 471 | } |
471 | 472 |
|
472 | | - async checkForUpdates(): Promise<boolean> { |
| 473 | + /** |
| 474 | + * Fetch the latest stable release version from GitHub. |
| 475 | + */ |
| 476 | + private async fetchLatestStable(): Promise<string | null> { |
473 | 477 | const response = await requestUrl({ |
474 | 478 | url: "https://api.github.com/repos/RAIT-09/obsidian-agent-client/releases/latest", |
475 | 479 | }); |
476 | 480 | const data = response.json as { tag_name?: string }; |
477 | | - const latestVersion = data.tag_name; |
478 | | - const currentVersion = this.manifest.version; |
| 481 | + return data.tag_name ? semver.clean(data.tag_name) : null; |
| 482 | + } |
| 483 | + |
| 484 | + /** |
| 485 | + * Fetch the latest prerelease version from GitHub. |
| 486 | + */ |
| 487 | + private async fetchLatestPrerelease(): Promise<string | null> { |
| 488 | + const response = await requestUrl({ |
| 489 | + url: "https://api.github.com/repos/RAIT-09/obsidian-agent-client/releases", |
| 490 | + }); |
| 491 | + const releases = response.json as Array<{ |
| 492 | + tag_name: string; |
| 493 | + prerelease: boolean; |
| 494 | + }>; |
| 495 | + |
| 496 | + // Find the first prerelease (releases are sorted by date descending) |
| 497 | + const latestPrerelease = releases.find((r) => r.prerelease); |
| 498 | + return latestPrerelease |
| 499 | + ? semver.clean(latestPrerelease.tag_name) |
| 500 | + : null; |
| 501 | + } |
479 | 502 |
|
480 | | - if (latestVersion !== currentVersion) { |
481 | | - new Notice(`[Agent Client] Update available: v${latestVersion}`); |
482 | | - return true; |
| 503 | + /** |
| 504 | + * Check for plugin updates. |
| 505 | + * - Stable version users: compare with latest stable release |
| 506 | + * - Prerelease users: compare with both latest stable and latest prerelease |
| 507 | + */ |
| 508 | + async checkForUpdates(): Promise<boolean> { |
| 509 | + const currentVersion = |
| 510 | + semver.clean(this.manifest.version) || this.manifest.version; |
| 511 | + const isCurrentPrerelease = semver.prerelease(currentVersion) !== null; |
| 512 | + |
| 513 | + if (isCurrentPrerelease) { |
| 514 | + // Prerelease user: check both stable and prerelease |
| 515 | + const [latestStable, latestPrerelease] = await Promise.all([ |
| 516 | + this.fetchLatestStable(), |
| 517 | + this.fetchLatestPrerelease(), |
| 518 | + ]); |
| 519 | + |
| 520 | + const hasNewerStable = |
| 521 | + latestStable && semver.gt(latestStable, currentVersion); |
| 522 | + const hasNewerPrerelease = |
| 523 | + latestPrerelease && semver.gt(latestPrerelease, currentVersion); |
| 524 | + |
| 525 | + if (hasNewerStable || hasNewerPrerelease) { |
| 526 | + // Prefer stable version notification if available |
| 527 | + const newestVersion = hasNewerStable |
| 528 | + ? latestStable |
| 529 | + : latestPrerelease; |
| 530 | + new Notice( |
| 531 | + `[Agent Client] Update available: v${newestVersion}`, |
| 532 | + ); |
| 533 | + return true; |
| 534 | + } |
| 535 | + } else { |
| 536 | + // Stable version user: check stable only |
| 537 | + const latestStable = await this.fetchLatestStable(); |
| 538 | + if (latestStable && semver.gt(latestStable, currentVersion)) { |
| 539 | + new Notice(`[Agent Client] Update available: v${latestStable}`); |
| 540 | + return true; |
| 541 | + } |
483 | 542 | } |
| 543 | + |
484 | 544 | return false; |
485 | 545 | } |
486 | 546 |
|
|
0 commit comments