- Flow
+ 注册
diff --git a/sidepanel/sidepanel.js b/sidepanel/sidepanel.js
index 2f8d7db..93e9c0b 100644
--- a/sidepanel/sidepanel.js
+++ b/sidepanel/sidepanel.js
@@ -9729,7 +9729,7 @@ function getRepositoryHomeUrl() {
return releasesPageUrl.replace(/\/releases\/?$/, '');
}
- return 'https://github.com/QLHazyCoder/codex-oauth-automation-extension';
+ return 'https://github.com/QLHazyCoder/FlowPilot';
}
function getReleaseListUrl() {
@@ -9823,7 +9823,7 @@ function renderUpdateReleaseList(releases = []) {
const version = document.createElement('span');
version.className = 'update-release-version';
- version.textContent = release.displayVersion || `Ultra${release.version}`;
+ version.textContent = release.displayVersion || `FlowPilot${release.version}`;
titleRow.appendChild(version);
if (release.title) {
@@ -9925,21 +9925,21 @@ function renderReleaseSnapshot(snapshot) {
}
case 'ignored': {
- extensionUpdateStatus.textContent = localVersionText || 'Ultra0.0';
+ extensionUpdateStatus.textContent = localVersionText || 'FlowPilot0.0';
extensionUpdateStatus.classList.add('is-version-label');
resetUpdateCard();
break;
}
case 'latest': {
- extensionUpdateStatus.textContent = localVersionText || 'Ultra0.0';
+ extensionUpdateStatus.textContent = localVersionText || 'FlowPilot0.0';
extensionUpdateStatus.classList.add('is-version-label');
resetUpdateCard();
break;
}
case 'empty': {
- extensionUpdateStatus.textContent = localVersionText || 'Ultra0.0';
+ extensionUpdateStatus.textContent = localVersionText || 'FlowPilot0.0';
extensionUpdateStatus.classList.add('is-version-label');
resetUpdateCard();
break;
@@ -9947,7 +9947,7 @@ function renderReleaseSnapshot(snapshot) {
case 'error':
default: {
- extensionUpdateStatus.textContent = localVersionText || 'Ultra0.0';
+ extensionUpdateStatus.textContent = localVersionText || 'FlowPilot0.0';
extensionUpdateStatus.classList.add('is-version-label', 'is-check-failed');
extensionVersionMeta.textContent = snapshot?.errorMessage || 'GitHub Releases 检查失败';
extensionVersionMeta.hidden = false;
@@ -9958,7 +9958,7 @@ function renderReleaseSnapshot(snapshot) {
}
async function initializeReleaseInfo() {
- const fallbackReleaseUrl = sidepanelUpdateService?.releasesPageUrl || 'https://github.com/QLHazyCoder/codex-oauth-automation-extension/releases';
+ const fallbackReleaseUrl = sidepanelUpdateService?.releasesPageUrl || 'https://github.com/QLHazyCoder/FlowPilot/releases';
if (btnReleaseLog) {
btnReleaseLog.onclick = () => openExternalUrl(currentReleaseSnapshot?.logUrl || fallbackReleaseUrl);
@@ -9970,8 +9970,8 @@ async function initializeReleaseInfo() {
const localVersion = sidepanelUpdateService?.getLocalVersionLabel?.(chrome.runtime.getManifest())
|| chrome.runtime.getManifest()?.version_name
- || (chrome.runtime.getManifest()?.version ? `Ultra${chrome.runtime.getManifest().version}` : '');
- extensionUpdateStatus.textContent = localVersion || 'Ultra0.0';
+ || (chrome.runtime.getManifest()?.version ? `FlowPilot${chrome.runtime.getManifest().version}` : '');
+ extensionUpdateStatus.textContent = localVersion || 'FlowPilot0.0';
extensionUpdateStatus.classList.remove('is-update-available', 'is-check-failed');
extensionUpdateStatus.classList.add('is-version-label');
extensionVersionMeta.hidden = true;
diff --git a/sidepanel/update-service.js b/sidepanel/update-service.js
index 06bf5d0..5ac3d1d 100644
--- a/sidepanel/update-service.js
+++ b/sidepanel/update-service.js
@@ -1,6 +1,6 @@
(() => {
const GITHUB_OWNER = 'QLHazyCoder';
- const GITHUB_REPO = 'codex-oauth-automation-extension';
+ const GITHUB_REPO = 'FlowPilot';
const RELEASES_PAGE_URL = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases`;
const RELEASES_API_URL = `https://api.github.com/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases?per_page=10`;
const CACHE_KEY = 'multipage-release-snapshot-v1';
@@ -9,12 +9,16 @@
const FETCH_TIMEOUT_MS = 8000;
const MAX_RELEASES = 10;
const MAX_NOTES_PER_RELEASE = 5;
+ const VERSION_FAMILY_FLOWPILOT = 'flowpilot';
const VERSION_FAMILY_ULTRA = 'ultra';
const VERSION_FAMILY_PRO = 'pro';
const VERSION_FAMILY_LEGACY = 'legacy';
function getVersionFamily(version, fallbackFamily = VERSION_FAMILY_LEGACY) {
const trimmed = String(version || '').trim();
+ if (/^flowpilot/i.test(trimmed)) {
+ return VERSION_FAMILY_FLOWPILOT;
+ }
if (/^ultra/i.test(trimmed)) {
return VERSION_FAMILY_ULTRA;
}
@@ -28,7 +32,7 @@
}
function stripVersionPrefix(version) {
- return String(version || '').trim().replace(/^(?:ultra|pro|v)\s*/i, '');
+ return String(version || '').trim().replace(/^(?:flowpilot|ultra|pro|v)\s*/i, '');
}
function extractVersionCore(version) {
@@ -63,6 +67,9 @@
}
function getVersionFamilyPrefix(family) {
+ if (family === VERSION_FAMILY_FLOWPILOT) {
+ return 'FlowPilot';
+ }
if (family === VERSION_FAMILY_ULTRA) {
return 'Ultra';
}
@@ -73,6 +80,9 @@
}
function getVersionFamilyRank(family) {
+ if (family === VERSION_FAMILY_FLOWPILOT) {
+ return 4;
+ }
if (family === VERSION_FAMILY_ULTRA) {
return 3;
}
@@ -206,7 +216,7 @@
}
function getComparableReleaseVersion(release) {
- const fallbackFamily = [VERSION_FAMILY_ULTRA, VERSION_FAMILY_PRO].includes(release?.family)
+ const fallbackFamily = [VERSION_FAMILY_FLOWPILOT, VERSION_FAMILY_ULTRA, VERSION_FAMILY_PRO].includes(release?.family)
? release.family
: VERSION_FAMILY_LEGACY;
const displayVersion = String(release?.displayVersion || '').trim();
@@ -267,7 +277,7 @@
}
function setIgnoredUpdateVersion(version) {
- const normalized = formatDisplayVersion(version, VERSION_FAMILY_ULTRA) || String(version || '').trim();
+ const normalized = formatDisplayVersion(version, VERSION_FAMILY_FLOWPILOT) || String(version || '').trim();
try {
if (normalized) {
localStorage.setItem(IGNORED_UPDATE_VERSION_KEY, normalized);
@@ -387,17 +397,17 @@
}
function getLocalVersionLabel(manifest = chrome.runtime.getManifest()) {
- const versionName = formatDisplayVersion(manifest?.version_name, VERSION_FAMILY_ULTRA);
+ const versionName = formatDisplayVersion(manifest?.version_name, VERSION_FAMILY_FLOWPILOT);
if (versionName) {
return versionName;
}
const versionCore = extractVersionCore(manifest?.version || '');
- return versionCore ? formatDisplayVersion(`Ultra${versionCore}`, VERSION_FAMILY_ULTRA) : '';
+ return versionCore ? formatDisplayVersion(`FlowPilot${versionCore}`, VERSION_FAMILY_FLOWPILOT) : '';
}
async function getReleaseSnapshot(options = {}) {
- const localVersion = getLocalVersionLabel(chrome.runtime.getManifest()) || 'Ultra0.0';
+ const localVersion = getLocalVersionLabel(chrome.runtime.getManifest()) || 'FlowPilot0.0';
try {
const releases = await loadReleases(options);
@@ -442,6 +452,7 @@
getLocalVersionLabel,
getReleaseSnapshot,
ignoreReleaseSnapshot,
+ repositoryUrl: `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}`,
releasesPageUrl: RELEASES_PAGE_URL,
stripVersionPrefix,
};
diff --git a/tests/update-service.test.js b/tests/update-service.test.js
index 393b891..b6f47f4 100644
--- a/tests/update-service.test.js
+++ b/tests/update-service.test.js
@@ -7,7 +7,7 @@ const source = fs.readFileSync('sidepanel/update-service.js', 'utf8');
function createUpdateService(options = {}) {
const manifest = options.manifest || {
version: '1.0',
- version_name: 'Ultra1.0',
+ version_name: 'FlowPilot1.0',
};
const cache = new Map();
const windowObject = {};
@@ -77,11 +77,11 @@ function createUpdateService(options = {}) {
};
}
-test('getReleaseSnapshot keeps Ultra releases ahead of historical Pro and legacy v releases', async () => {
+test('getReleaseSnapshot keeps FlowPilot releases ahead of historical Ultra, Pro, and legacy v releases', async () => {
const { api } = createUpdateService({
manifest: {
- version: '1.0',
- version_name: 'Ultra1.0',
+ version: '9.99',
+ version_name: 'Ultra9.99',
},
fetchImpl: async () => ({
ok: true,
@@ -106,10 +106,19 @@ test('getReleaseSnapshot keeps Ultra releases ahead of historical Pro and legacy
prerelease: false,
},
{
- tag_name: 'Ultra1.1',
- name: 'Ultra1.1',
- html_url: 'https://example.com/Ultra1.1',
+ tag_name: 'Ultra9.99',
+ name: 'Ultra9.99',
+ html_url: 'https://example.com/Ultra9.99',
published_at: '2026-04-19T00:00:00.000Z',
+ body: '- historical ultra release',
+ draft: false,
+ prerelease: false,
+ },
+ {
+ tag_name: 'FlowPilot1.0',
+ name: 'FlowPilot1.0',
+ html_url: 'https://example.com/FlowPilot1.0',
+ published_at: '2026-04-20T00:00:00.000Z',
body: '- current release',
draft: false,
prerelease: false,
@@ -122,11 +131,11 @@ test('getReleaseSnapshot keeps Ultra releases ahead of historical Pro and legacy
const snapshot = await api.getReleaseSnapshot({ force: true });
assert.equal(snapshot.status, 'update-available');
- assert.equal(snapshot.localVersion, 'Ultra1.0');
- assert.equal(snapshot.latestVersion, 'Ultra1.1');
+ assert.equal(snapshot.localVersion, 'Ultra9.99');
+ assert.equal(snapshot.latestVersion, 'FlowPilot1.0');
assert.deepEqual(
snapshot.newerReleases.map((release) => release.displayVersion),
- ['Ultra1.1']
+ ['FlowPilot1.0']
);
});
@@ -134,7 +143,7 @@ test('getReleaseSnapshot reorders cached releases before choosing latest version
const { api, getFetchCalls } = createUpdateService({
manifest: {
version: '1.0',
- version_name: 'Ultra1.0',
+ version_name: 'FlowPilot1.0',
},
cachedSnapshot: {
fetchedAt: Date.now(),
@@ -158,14 +167,23 @@ test('getReleaseSnapshot reorders cached releases before choosing latest version
notes: [],
},
{
- version: '1.1',
- displayVersion: 'Ultra1.1',
+ version: '9.99',
+ displayVersion: 'Ultra9.99',
family: 'ultra',
title: '',
- url: 'https://example.com/Ultra1.1',
+ url: 'https://example.com/Ultra9.99',
publishedAt: '2026-04-19T00:00:00.000Z',
notes: [],
},
+ {
+ version: '1.1',
+ displayVersion: 'FlowPilot1.1',
+ family: 'flowpilot',
+ title: '',
+ url: 'https://example.com/FlowPilot1.1',
+ publishedAt: '2026-04-20T00:00:00.000Z',
+ notes: [],
+ },
],
},
fetchImpl: async () => {
@@ -177,19 +195,19 @@ test('getReleaseSnapshot reorders cached releases before choosing latest version
assert.equal(getFetchCalls(), 0);
assert.equal(snapshot.status, 'update-available');
- assert.equal(snapshot.latestVersion, 'Ultra1.1');
+ assert.equal(snapshot.latestVersion, 'FlowPilot1.1');
assert.deepEqual(
snapshot.newerReleases.map((release) => release.displayVersion),
- ['Ultra1.1']
+ ['FlowPilot1.1']
);
});
test('getReleaseSnapshot suppresses an ignored latest update until a newer release appears', async () => {
let releases = [
{
- tag_name: 'Ultra1.1',
- name: 'Ultra1.1',
- html_url: 'https://example.com/Ultra1.1',
+ tag_name: 'FlowPilot1.1',
+ name: 'FlowPilot1.1',
+ html_url: 'https://example.com/FlowPilot1.1',
published_at: '2026-04-19T00:00:00.000Z',
body: '- current release',
draft: false,
@@ -199,7 +217,7 @@ test('getReleaseSnapshot suppresses an ignored latest update until a newer relea
const { api } = createUpdateService({
manifest: {
version: '1.0',
- version_name: 'Ultra1.0',
+ version_name: 'FlowPilot1.0',
},
fetchImpl: async () => ({
ok: true,
@@ -211,17 +229,17 @@ test('getReleaseSnapshot suppresses an ignored latest update until a newer relea
const firstSnapshot = await api.getReleaseSnapshot({ force: true });
assert.equal(firstSnapshot.status, 'update-available');
- assert.equal(api.ignoreReleaseSnapshot(firstSnapshot), 'Ultra1.1');
+ assert.equal(api.ignoreReleaseSnapshot(firstSnapshot), 'FlowPilot1.1');
const ignoredSnapshot = await api.getReleaseSnapshot({ force: true });
assert.equal(ignoredSnapshot.status, 'ignored');
- assert.equal(ignoredSnapshot.ignoredVersion, 'Ultra1.1');
+ assert.equal(ignoredSnapshot.ignoredVersion, 'FlowPilot1.1');
releases = [
{
- tag_name: 'Ultra1.2',
- name: 'Ultra1.2',
- html_url: 'https://example.com/Ultra1.2',
+ tag_name: 'FlowPilot1.2',
+ name: 'FlowPilot1.2',
+ html_url: 'https://example.com/FlowPilot1.2',
published_at: '2026-04-20T00:00:00.000Z',
body: '- next release',
draft: false,
@@ -232,5 +250,5 @@ test('getReleaseSnapshot suppresses an ignored latest update until a newer relea
const newerSnapshot = await api.getReleaseSnapshot({ force: true });
assert.equal(newerSnapshot.status, 'update-available');
- assert.equal(newerSnapshot.latestVersion, 'Ultra1.2');
+ assert.equal(newerSnapshot.latestVersion, 'FlowPilot1.2');
});