diff --git a/src/lib/common/LoadingToComplete.svelte b/src/lib/common/LoadingToComplete.svelte
index 40b7f43f..d0d520a8 100644
--- a/src/lib/common/LoadingToComplete.svelte
+++ b/src/lib/common/LoadingToComplete.svelte
@@ -5,14 +5,20 @@
export let isLoading = false;
export let isComplete = false;
export let isError = false;
+ export let spinnerClasses = '';
+ export let spinnerStyles = '';
+ export let spinnerSize = 50;
export let successText = 'Update completed!';
export let errorText = 'Error!';
- export let spinnerSize = 50;
{#if isLoading}
-
+
{/if}
diff --git a/src/lib/common/shared/GlobalHeader.svelte b/src/lib/common/shared/GlobalHeader.svelte
new file mode 100644
index 00000000..d54e0c38
--- /dev/null
+++ b/src/lib/common/shared/GlobalHeader.svelte
@@ -0,0 +1,29 @@
+
\ No newline at end of file
diff --git a/src/lib/helpers/http.js b/src/lib/helpers/http.js
index 43405900..8e49d548 100644
--- a/src/lib/helpers/http.js
+++ b/src/lib/helpers/http.js
@@ -31,7 +31,7 @@ const retryQueue = {
/** @param {{config: import('axios').InternalAxiosRequestConfig, resolve: (value: any) => void, reject: (reason?: any) => void}} item */
enqueue(item) {
this.queue.push(item);
-
+ console.log('queue', this.queue.length);
if (!this.isRefreshingToken) {
const user = getUserStore();
if (!isTokenExired(user.expires)) {
@@ -130,7 +130,7 @@ axios.interceptors.response.use(
loaderStore.set(false);
const originalRequest = error?.config || {};
const user = getUserStore();
- console.log("renew token count.", user.renew_token_count);
+
if (!user?.token || user.renew_token_count >= retryQueue.maxRenewTokenCount) {
retryQueue.queue = [];
redirectToLogin();
@@ -185,7 +185,7 @@ function skipLoader(config) {
new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/create', 'g'),
new RegExp('http(s*)://(.*?)/knowledge/document/(.*?)/page', 'g'),
new RegExp('http(s*)://(.*?)/users', 'g'),
- new RegExp('http(s*)://(.*?)/instruct/chat-completion', 'g'),
+ new RegExp('http(s*)://(.*?)/instruct/(.*?)', 'g'),
new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'),
new RegExp('http(s*)://(.*?)/agent/(.*?)/code-script/generate', 'g'),
new RegExp('http(s*)://(.*?)/renew-token', 'g')
@@ -208,24 +208,30 @@ function skipLoader(config) {
/** @type {RegExp[]} */
const getRegexes = [
+ new RegExp('http(s*)://(.*?)/plugin/menu', 'g'),
new RegExp('http(s*)://(.*?)/setting/(.*?)', 'g'),
+ new RegExp('http(s*)://(.*?)/roles', 'g'),
+ new RegExp('http(s*)://(.*?)/role/options', 'g'),
+ new RegExp('http(s*)://(.*?)/role/(.*?)/details', 'g'),
+ new RegExp('http(s*)://(.*?)/user/(.*?)/details', 'g'),
new RegExp('http(s*)://(.*?)/user/me', 'g'),
- new RegExp('http(s*)://(.*?)/plugin/menu', 'g'),
new RegExp('http(s*)://(.*?)/address/options(.*?)', 'g'),
+ new RegExp('http(s*)://(.*?)/agents', 'g'),
+ new RegExp('http(s*)://(.*?)/agent/options', 'g'),
+ new RegExp('http(s*)://(.*?)/agent/labels', 'g'),
+ new RegExp('http(s*)://(.*?)/agent/tasks', 'g'),
+ new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'),
+ new RegExp('http(s*)://(.*?)/conversation/state/keys', 'g'),
new RegExp('http(s*)://(.*?)/conversation/(.*?)/files/(.*?)', 'g'),
+ new RegExp('http(s*)://(.*?)/llm-configs', 'g'),
new RegExp('http(s*)://(.*?)/llm-provider/(.*?)/models', 'g'),
new RegExp('http(s*)://(.*?)/knowledge/vector/collections', 'g'),
new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/exist', 'g'),
- new RegExp('http(s*)://(.*?)/role/options', 'g'),
- new RegExp('http(s*)://(.*?)/role/(.*?)/details', 'g'),
- new RegExp('http(s*)://(.*?)/user/(.*?)/details', 'g'),
- new RegExp('http(s*)://(.*?)/agent/labels', 'g'),
- new RegExp('http(s*)://(.*?)/conversation/state/keys', 'g'),
+ new RegExp('http(s*)://(.*?)/logger/instruction/log', 'g'),
new RegExp('http(s*)://(.*?)/logger/instruction/log/keys', 'g'),
new RegExp('http(s*)://(.*?)/logger/conversation/(.*?)/content-log', 'g'),
new RegExp('http(s*)://(.*?)/logger/conversation/(.*?)/state-log', 'g'),
- new RegExp('http(s*)://(.*?)/mcp/server-configs', 'g'),
- new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g')
+ new RegExp('http(s*)://(.*?)/mcp/server-configs', 'g')
];
if (config.method === 'post' && postRegexes.some(regex => regex.test(config.url || ''))) {
@@ -276,7 +282,9 @@ function skipGlobalError(config) {
];
/** @type {RegExp[]} */
- const getRegexes = [];
+ const getRegexes = [
+ new RegExp('http(s*)://(.*?)/agents', 'g')
+ ];
if (config.method === 'post' && postRegexes.some(regex => regex.test(config.url || ''))) {
return true;
diff --git a/src/lib/helpers/utils/common.js b/src/lib/helpers/utils/common.js
index e6170626..5a348daf 100644
--- a/src/lib/helpers/utils/common.js
+++ b/src/lib/helpers/utils/common.js
@@ -120,18 +120,19 @@ export function getPagingQueryParams(args, defaults = { defaultPageSize: 12, max
/**
* @param {URL} url
* @param {import('$commonTypes').KeyValuePair[]} pairs
- * @param {() => void} [callback]
+ * @param {(args0: URL) => void} [callback]
*/
export function setUrlQueryParams(url, pairs, callback) {
if (!pairs?.length) {
return;
}
+ url.search = '';
pairs?.map(p => {
url.searchParams.set(p.key, p.value);
});
- callback?.();
+ callback?.(url);
}
/**
@@ -175,6 +176,19 @@ export function splitTextByCase(str) {
return text;
}
+/**
+ * @param {string} url
+ */
+export function getCleanUrl(url) {
+ if (!url) return url;
+
+ if (url.startsWith('/')) {
+ url = url.substring(1);
+ }
+
+ return url;
+}
+
/**
* @param {string} timeRange
* @returns {{ startTime: string | null, endTime: string | null }}
diff --git a/src/lib/scss/custom/common/_common.scss b/src/lib/scss/custom/common/_common.scss
index f23a183f..e4230d5d 100644
--- a/src/lib/scss/custom/common/_common.scss
+++ b/src/lib/scss/custom/common/_common.scss
@@ -204,3 +204,17 @@ button:focus {
text-overflow: ellipsis;
}
}
+
+.text-btn {
+ background: none;
+ border: none;
+ padding: 0;
+ color: inherit;
+ font-weight: 500;
+ cursor: pointer;
+
+ &:hover {
+ text-decoration: none;
+ background: none;
+ }
+}
\ No newline at end of file
diff --git a/src/lib/scss/custom/components/_loader.scss b/src/lib/scss/custom/components/_loader.scss
index 39c7979d..a095d4ce 100644
--- a/src/lib/scss/custom/components/_loader.scss
+++ b/src/lib/scss/custom/components/_loader.scss
@@ -1,5 +1,5 @@
.loader {
- position: fixed;
+ position: absolute;
z-index: 9999;
background-color: rgba(255, 255, 255, 0.8);
top: 0;
diff --git a/src/lib/scss/custom/pages/_agent.scss b/src/lib/scss/custom/pages/_agent.scss
index afa4c72d..6cc4c4b1 100644
--- a/src/lib/scss/custom/pages/_agent.scss
+++ b/src/lib/scss/custom/pages/_agent.scss
@@ -1,10 +1,37 @@
.agents-header-container {
display: flex;
+ flex-wrap: wrap;
justify-content: space-between;
+ gap: 15px;
+ align-items: center;
+
+ @media (max-width: 576px) {
+ flex-direction: column;
+ justify-content: center;
+ gap: 12px;
+
+ > div {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ }
+ }
.agent-filter {
display: flex;
- gap: 10px
+ flex-wrap: wrap;
+ gap: 10px;
+ align-items: center;
+
+ @media (max-width: 576px) {
+ width: 100%;
+ flex-direction: column;
+ gap: 8px;
+
+ > * {
+ width: 100%;
+ }
+ }
}
}
diff --git a/src/lib/services/agent-service.js b/src/lib/services/agent-service.js
index 4b6d0995..caa9e172 100644
--- a/src/lib/services/agent-service.js
+++ b/src/lib/services/agent-service.js
@@ -16,9 +16,10 @@ export async function getSettings() {
* Get agent list
* @param {import('$agentTypes').AgentFilter} filter
* @param {boolean} checkAuth
+ * @param {AbortSignal | null} signal
* @returns {Promise>}
*/
-export async function getAgents(filter, checkAuth = false) {
+export async function getAgents(filter, checkAuth = false, signal = null) {
let url = endpoints.agentListUrl;
const response = await axios.get(url, {
params: {
@@ -28,7 +29,8 @@ export async function getAgents(filter, checkAuth = false) {
paramsSerializer: {
dots: true,
indexes: null,
- }
+ },
+ signal: signal || undefined
});
return response.data;
}
diff --git a/src/lib/services/role-service.js b/src/lib/services/role-service.js
index 15f40116..77033144 100644
--- a/src/lib/services/role-service.js
+++ b/src/lib/services/role-service.js
@@ -1,5 +1,6 @@
import { endpoints } from './api-endpoints.js';
import axios from 'axios';
+import qs from 'qs';
/**
* Get role options
@@ -17,7 +18,10 @@ export async function getRoleOptions() {
* @returns {Promise}
*/
export async function getRoles(filter = null) {
- const response = await axios.post(endpoints.rolesUrl, filter);
+ const response = await axios.get(endpoints.rolesUrl, {
+ params: filter,
+ paramsSerializer: (params) => qs.stringify(params, { encode: false, allowDots: true, arrayFormat: "indices" })
+ });
return response.data;
}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index e56fb9f1..783b44c7 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,11 +1,6 @@
-{#if isLoading}
-
-{/if}
-
-
-