mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-02 21:32:10 +03:00
* chore(release): v3.7.4 — version bump, openapi and changelog sync * fix: preserve previous_response_id and conversation_id fields on empty input array (#1729) * fix: bypass UI validation block for optional API keys and fix string fallback typing (#1721) * fix(proxy): disable HTTP keep-alive and pipelining in Undici proxy dispatcher to prevent socket hang up * feat(proxy): implement bulk proxy import via pipe-delimited parser with update-or-create logic * docs: update changelog for v3.7.4 fixes and proxy features * test: update responses store expectations for empty input arrays * feat(pwa): add fullscreen installable PWA with manifest, service worker, and cross-platform app icons. (#1728) Integrated into release/v3.7.4 * Fix image provider validation and Stability image requests (#1726) Integrated into release/v3.7.4 * docs: add PR 1726 and PR 1728 to v3.7.4 changelog * fix(security): replace insecure Math.random with crypto.getRandomValues for fallback UUID generation * fix(migrations): intercept 007 migration to use IF NOT EXISTS logic on fresh installs Fixes #1733 * test: fix typescript compilation errors in unit tests * fix(db): reconcile legacy reasoning cache migration * chore(release): bump to v3.7.4 — changelog, docs, version sync * fix(cc-compatible): preserve Claude Code system skeleton (#1740) Integrated into release/v3.7.4 * docs(changelog): update for PR #1740 merge * docs(changelog): include workflow updates * fix(db): reconcile legacy reasoning cache migration (#1734) Integrated into release/v3.7.4 * Add endpoint tunnel visibility settings (#1743) Integrated into release/v3.7.4 * Normalize max reasoning effort for Codex routing (#1744) Integrated into release/v3.7.4 * Fix Claude Code gateway config helper (#1745) Integrated into release/v3.7.4 * Refresh CLI fingerprint provider profiles (#1746) Integrated into release/v3.7.4 * Integrated into release/v3.7.4 (PR #1742) * docs(changelog): update for PRs 1742-1746 --------- Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com> Co-authored-by: Yash Ghule <y.ghule77@gmail.com> Co-authored-by: backryun <bakryun0718@proton.me> Co-authored-by: dhaern <manker_lol@hotmail.com> Co-authored-by: Randi <55005611+rdself@users.noreply.github.com> Co-authored-by: Duncan L <leungd@gmail.com>
78 lines
2.1 KiB
JavaScript
78 lines
2.1 KiB
JavaScript
const CACHE_NAME = "omniroute-pwa-v1";
|
|
const APP_SHELL = [
|
|
"/",
|
|
"/offline",
|
|
"/manifest.webmanifest",
|
|
"/icon-512.png",
|
|
"/apple-touch-icon.png",
|
|
];
|
|
const EXCLUDED_PATH_PREFIXES = ["/api/", "/a2a", "/dashboard/endpoint"];
|
|
|
|
self.addEventListener("install", (event) => {
|
|
event.waitUntil(
|
|
caches
|
|
.open(CACHE_NAME)
|
|
.then((cache) => cache.addAll(APP_SHELL))
|
|
.then(() => self.skipWaiting())
|
|
);
|
|
});
|
|
|
|
self.addEventListener("activate", (event) => {
|
|
event.waitUntil(
|
|
caches
|
|
.keys()
|
|
.then((keys) =>
|
|
Promise.all(keys.filter((key) => key !== CACHE_NAME).map((key) => caches.delete(key)))
|
|
)
|
|
.then(() => self.clients.claim())
|
|
);
|
|
});
|
|
|
|
self.addEventListener("fetch", (event) => {
|
|
if (event.request.method !== "GET") {
|
|
return;
|
|
}
|
|
|
|
const requestUrl = new URL(event.request.url);
|
|
const isSameOrigin = requestUrl.origin === self.location.origin;
|
|
const isExcludedPath = EXCLUDED_PATH_PREFIXES.some((prefix) =>
|
|
requestUrl.pathname.startsWith(prefix)
|
|
);
|
|
const destination = event.request.destination;
|
|
const isStaticAsset = ["style", "script", "image", "font"].includes(destination);
|
|
const isNavigateRequest = event.request.mode === "navigate";
|
|
|
|
// Never cache API/dashboard traffic with potentially auth-sensitive content.
|
|
if (!isSameOrigin || isExcludedPath) {
|
|
return;
|
|
}
|
|
|
|
event.respondWith(
|
|
(async () => {
|
|
if (isNavigateRequest) {
|
|
try {
|
|
return await fetch(event.request);
|
|
} catch {
|
|
return (await caches.match("/offline")) || Response.error();
|
|
}
|
|
}
|
|
|
|
if (!isStaticAsset) {
|
|
return fetch(event.request);
|
|
}
|
|
|
|
const cachedResponse = await caches.match(event.request);
|
|
if (cachedResponse) {
|
|
return cachedResponse;
|
|
}
|
|
|
|
const networkResponse = await fetch(event.request);
|
|
if (networkResponse && networkResponse.status === 200) {
|
|
const responseClone = networkResponse.clone();
|
|
void caches.open(CACHE_NAME).then((cache) => cache.put(event.request, responseClone));
|
|
}
|
|
return networkResponse;
|
|
})()
|
|
);
|
|
});
|