chore: remove unused code and suppress noisy Claude Code logs
- Delete unused files: retry.js, app-init.js, model-manager.js - Remove duplicate error helpers from helpers.js (exist in errors.js) - Remove unused exports from signature-cache.js, logger.js - Remove unused frontend code: ErrorHandler methods, validators, canDelete, destroy - Make internal functions private in thinking-utils.js - Remove commented-out code from constants.js - Remove deprecated .glass-panel CSS class - Add silent handler for Claude Code event logging (/api/event_logging/batch) - Suppress logging for /v1/messages/count_tokens (501 responses) - Fix catch-all to use originalUrl (wildcard strips req.path) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -115,8 +115,6 @@
|
||||
animation: fadeIn 0.4s ease-out forwards;
|
||||
}
|
||||
|
||||
/* Note: .glass-panel has been deprecated. Use .view-card instead for consistency. */
|
||||
|
||||
.nav-item.active {
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
|
||||
2
public/css/style.css
generated
2
public/css/style.css
generated
File diff suppressed because one or more lines are too long
@@ -374,7 +374,6 @@
|
||||
<script src="js/components/claude-config.js"></script>
|
||||
<script src="js/components/logs-viewer.js"></script>
|
||||
<script src="js/components/server-config.js"></script>
|
||||
<script src="js/components/model-manager.js"></script>
|
||||
<!-- 4. App (registers Alpine components from window.Components) -->
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
/**
|
||||
* App Initialization (Non-module version)
|
||||
* This must load BEFORE Alpine initializes
|
||||
*/
|
||||
|
||||
document.addEventListener('alpine:init', () => {
|
||||
// App component registration
|
||||
|
||||
// Main App Controller
|
||||
Alpine.data('app', () => ({
|
||||
// Re-expose store properties for easier access in navbar
|
||||
get connectionStatus() {
|
||||
return Alpine.store('data').connectionStatus;
|
||||
},
|
||||
get loading() {
|
||||
return Alpine.store('data').loading;
|
||||
},
|
||||
|
||||
init() {
|
||||
// App component initialization
|
||||
|
||||
// Theme setup
|
||||
document.documentElement.setAttribute('data-theme', 'black');
|
||||
document.documentElement.classList.add('dark');
|
||||
|
||||
// Chart Defaults
|
||||
if (typeof Chart !== 'undefined') {
|
||||
Chart.defaults.color = window.utils.getThemeColor('--color-text-dim');
|
||||
Chart.defaults.borderColor = window.utils.getThemeColor('--color-space-border');
|
||||
Chart.defaults.font.family = '"JetBrains Mono", monospace';
|
||||
}
|
||||
|
||||
// Start Data Polling
|
||||
this.startAutoRefresh();
|
||||
document.addEventListener('refresh-interval-changed', () => this.startAutoRefresh());
|
||||
|
||||
// Initial Data Fetch (separate from health check)
|
||||
Alpine.store('data').fetchData();
|
||||
},
|
||||
|
||||
refreshTimer: null,
|
||||
isTabVisible: true,
|
||||
|
||||
fetchData() {
|
||||
Alpine.store('data').fetchData();
|
||||
},
|
||||
|
||||
startAutoRefresh() {
|
||||
if (this.refreshTimer) clearInterval(this.refreshTimer);
|
||||
const baseInterval = parseInt(Alpine.store('settings').refreshInterval);
|
||||
if (baseInterval > 0) {
|
||||
// Setup visibility change listener (only once)
|
||||
if (!this._visibilitySetup) {
|
||||
this._visibilitySetup = true;
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
this.isTabVisible = !document.hidden;
|
||||
if (this.isTabVisible) {
|
||||
// Tab became visible - fetch immediately and restart timer
|
||||
Alpine.store('data').fetchData();
|
||||
this.startAutoRefresh();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Schedule next refresh with jitter
|
||||
const scheduleNext = () => {
|
||||
// Add ±20% random jitter to prevent synchronized requests
|
||||
const jitter = (Math.random() - 0.5) * 0.4; // -0.2 to +0.2
|
||||
const interval = baseInterval * (1 + jitter);
|
||||
|
||||
// Slow down when tab is hidden (reduce frequency by 3x)
|
||||
const actualInterval = this.isTabVisible
|
||||
? interval
|
||||
: interval * 3;
|
||||
|
||||
this.refreshTimer = setTimeout(() => {
|
||||
Alpine.store('data').fetchData();
|
||||
scheduleNext(); // Reschedule with new jitter
|
||||
}, actualInterval * 1000);
|
||||
};
|
||||
|
||||
scheduleNext();
|
||||
}
|
||||
},
|
||||
|
||||
// Translation helper for modal (not in a component scope)
|
||||
t(key) {
|
||||
return Alpine.store('global').t(key);
|
||||
},
|
||||
|
||||
// Add account handler for modal
|
||||
async addAccountWeb(reAuthEmail = null) {
|
||||
const password = Alpine.store('global').webuiPassword;
|
||||
try {
|
||||
const urlPath = reAuthEmail
|
||||
? `/api/auth/url?email=${encodeURIComponent(reAuthEmail)}`
|
||||
: '/api/auth/url';
|
||||
|
||||
const { response, newPassword } = await window.utils.request(urlPath, {}, password);
|
||||
if (newPassword) Alpine.store('global').webuiPassword = newPassword;
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.status === 'ok') {
|
||||
const width = 600;
|
||||
const height = 700;
|
||||
const left = (screen.width - width) / 2;
|
||||
const top = (screen.height - height) / 2;
|
||||
|
||||
window.open(
|
||||
data.url,
|
||||
'google_oauth',
|
||||
`width=${width},height=${height},top=${top},left=${left},scrollbars=yes`
|
||||
);
|
||||
|
||||
const messageHandler = (event) => {
|
||||
if (event.data?.type === 'oauth-success') {
|
||||
const store = Alpine.store('global');
|
||||
const successMsg = reAuthEmail
|
||||
? store.t('accountReauthSuccess')
|
||||
: store.t('accountAddedSuccess');
|
||||
store.showToast(successMsg, 'success');
|
||||
Alpine.store('data').fetchData();
|
||||
|
||||
const modal = document.getElementById('add_account_modal');
|
||||
if (modal) modal.close();
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener('message', messageHandler);
|
||||
setTimeout(() => window.removeEventListener('message', messageHandler), 300000);
|
||||
} else {
|
||||
Alpine.store('global').showToast(data.error || Alpine.store('global').t('failedToGetAuthUrl'), 'error');
|
||||
}
|
||||
} catch (e) {
|
||||
Alpine.store('global').showToast(Alpine.store('global').t('failedToStartOAuth') + ': ' + e.message, 'error');
|
||||
}
|
||||
}
|
||||
}));
|
||||
});
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* Model Manager Component
|
||||
* Handles model configuration (pinning, hiding, aliasing, mapping)
|
||||
* Registers itself to window.Components for Alpine.js to consume
|
||||
*/
|
||||
window.Components = window.Components || {};
|
||||
|
||||
window.Components.modelManager = () => ({
|
||||
// Track which model is currently being edited (null = none)
|
||||
editingModelId: null,
|
||||
|
||||
init() {
|
||||
// Component is ready
|
||||
},
|
||||
|
||||
/**
|
||||
* Start editing a model's mapping
|
||||
* @param {string} modelId - The model to edit
|
||||
*/
|
||||
startEditing(modelId) {
|
||||
this.editingModelId = modelId;
|
||||
},
|
||||
|
||||
/**
|
||||
* Stop editing
|
||||
*/
|
||||
stopEditing() {
|
||||
this.editingModelId = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if a model is being edited
|
||||
* @param {string} modelId - The model to check
|
||||
*/
|
||||
isEditing(modelId) {
|
||||
return this.editingModelId === modelId;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update model configuration (delegates to shared utility)
|
||||
* @param {string} modelId - The model ID to update
|
||||
* @param {object} configUpdates - Configuration updates (pinned, hidden, alias, mapping)
|
||||
*/
|
||||
async updateModelConfig(modelId, configUpdates) {
|
||||
return window.ModelConfigUtils.updateModelConfig(modelId, configUpdates);
|
||||
}
|
||||
});
|
||||
@@ -381,13 +381,6 @@ document.addEventListener('alpine:init', () => {
|
||||
});
|
||||
|
||||
return rows;
|
||||
},
|
||||
|
||||
destroy() {
|
||||
this.stopHealthCheck();
|
||||
if (this._visibilityHandler) {
|
||||
document.removeEventListener('visibilitychange', this._visibilityHandler);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -187,13 +187,3 @@ window.AccountActions.reloadAccounts = async function() {
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 检查账号是否可以删除
|
||||
* 来自 Antigravity 数据库的账号(source='database')不可删除
|
||||
* @param {object} account - 账号对象
|
||||
* @returns {boolean} true 表示可删除
|
||||
*/
|
||||
window.AccountActions.canDelete = function(account) {
|
||||
return account && account.source !== 'database';
|
||||
};
|
||||
|
||||
@@ -46,39 +46,6 @@ window.ErrorHandler.safeAsync = async function(fn, errorMessage = null, options
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Wrap a component method with error handling
|
||||
* @param {Function} method - Method to wrap
|
||||
* @param {string} errorMessage - Error message prefix
|
||||
* @returns {Function} Wrapped method
|
||||
*/
|
||||
window.ErrorHandler.wrapMethod = function(method, errorMessage = null) {
|
||||
return async function(...args) {
|
||||
return window.ErrorHandler.safeAsync(
|
||||
() => method.apply(this, args),
|
||||
errorMessage || Alpine.store('global').t('operationFailed')
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Show a success toast notification
|
||||
* @param {string} message - Success message
|
||||
*/
|
||||
window.ErrorHandler.showSuccess = function(message) {
|
||||
const store = Alpine.store('global');
|
||||
store.showToast(message, 'success');
|
||||
};
|
||||
|
||||
/**
|
||||
* Show an info toast notification
|
||||
* @param {string} message - Info message
|
||||
*/
|
||||
window.ErrorHandler.showInfo = function(message) {
|
||||
const store = Alpine.store('global');
|
||||
store.showToast(message, 'info');
|
||||
};
|
||||
|
||||
/**
|
||||
* Show an error toast notification
|
||||
* @param {string} message - Error message
|
||||
@@ -90,23 +57,6 @@ window.ErrorHandler.showError = function(message, error = null) {
|
||||
store.showToast(fullMessage, 'error');
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate and execute an API call with error handling
|
||||
* @param {Function} apiCall - Async function that makes the API call
|
||||
* @param {string} successMessage - Message to show on success (optional)
|
||||
* @param {string} errorMessage - Message to show on error
|
||||
* @returns {Promise<any>} API response or undefined on error
|
||||
*/
|
||||
window.ErrorHandler.apiCall = async function(apiCall, successMessage = null, errorMessage = 'API call failed') {
|
||||
const result = await window.ErrorHandler.safeAsync(apiCall, errorMessage);
|
||||
|
||||
if (result !== undefined && successMessage) {
|
||||
window.ErrorHandler.showSuccess(successMessage);
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* Execute an async function with automatic loading state management
|
||||
* @param {Function} asyncFn - Async function to execute
|
||||
|
||||
@@ -47,71 +47,6 @@ window.Validators.validateRange = function(value, min, max, fieldName = 'Value')
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate a port number
|
||||
* @param {number} port - Port number to validate
|
||||
* @returns {object} { isValid: boolean, value: number, error: string|null }
|
||||
*/
|
||||
window.Validators.validatePort = function(port) {
|
||||
const { PORT_MIN, PORT_MAX } = window.AppConstants.VALIDATION;
|
||||
return window.Validators.validateRange(port, PORT_MIN, PORT_MAX, 'Port');
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate a string is not empty
|
||||
* @param {string} value - String to validate
|
||||
* @param {string} fieldName - Name of the field for error messages
|
||||
* @returns {object} { isValid: boolean, value: string, error: string|null }
|
||||
*/
|
||||
window.Validators.validateNotEmpty = function(value, fieldName = 'Field') {
|
||||
const trimmedValue = String(value || '').trim();
|
||||
const t = Alpine.store('global').t;
|
||||
|
||||
if (trimmedValue.length === 0) {
|
||||
return {
|
||||
isValid: false,
|
||||
value: trimmedValue,
|
||||
error: t('cannotBeEmpty', { fieldName })
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
isValid: true,
|
||||
value: trimmedValue,
|
||||
error: null
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate a boolean value
|
||||
* @param {any} value - Value to validate as boolean
|
||||
* @returns {object} { isValid: boolean, value: boolean, error: string|null }
|
||||
*/
|
||||
window.Validators.validateBoolean = function(value) {
|
||||
if (typeof value === 'boolean') {
|
||||
return {
|
||||
isValid: true,
|
||||
value: value,
|
||||
error: null
|
||||
};
|
||||
}
|
||||
|
||||
// Try to coerce common values
|
||||
if (value === 'true' || value === 1 || value === '1') {
|
||||
return { isValid: true, value: true, error: null };
|
||||
}
|
||||
|
||||
if (value === 'false' || value === 0 || value === '0') {
|
||||
return { isValid: true, value: false, error: null };
|
||||
}
|
||||
|
||||
return {
|
||||
isValid: false,
|
||||
value: false,
|
||||
error: Alpine.store('global').t('mustBeTrueOrFalse')
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate a timeout/duration value (in milliseconds)
|
||||
* @param {number} value - Timeout value in ms
|
||||
@@ -124,16 +59,6 @@ window.Validators.validateTimeout = function(value, minMs = null, maxMs = null)
|
||||
return window.Validators.validateRange(value, minMs ?? TIMEOUT_MIN, maxMs ?? TIMEOUT_MAX, 'Timeout');
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate log limit
|
||||
* @param {number} value - Log limit value
|
||||
* @returns {object} { isValid: boolean, value: number, error: string|null }
|
||||
*/
|
||||
window.Validators.validateLogLimit = function(value) {
|
||||
const { LOG_LIMIT_MIN, LOG_LIMIT_MAX } = window.AppConstants.VALIDATION;
|
||||
return window.Validators.validateRange(value, LOG_LIMIT_MIN, LOG_LIMIT_MAX, 'Log limit');
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate and sanitize input with custom validator
|
||||
* @param {any} value - Value to validate
|
||||
@@ -150,21 +75,3 @@ window.Validators.validate = function(value, validator, showError = true) {
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a validated input handler for Alpine.js
|
||||
* @param {Function} validator - Validator function
|
||||
* @param {Function} onValid - Callback when validation passes
|
||||
* @returns {Function} Handler function
|
||||
*/
|
||||
window.Validators.createHandler = function(validator, onValid) {
|
||||
return function(value) {
|
||||
const result = window.Validators.validate(value, validator, true);
|
||||
|
||||
if (result.isValid && onValid) {
|
||||
onValid.call(this, result.value);
|
||||
}
|
||||
|
||||
return result.value;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user