mirror of
https://github.com/AstrBotDevs/AstrBot
synced 2026-07-16 09:40:30 +08:00
* refactor: migrate to fastapi * structure refactor * fix: pyright fix * refactor: improve error handling and public messages in plugin services * feat(api): refactor API client integration and enhance request handling - Updated API client configuration to use a dedicated HTTP client. - Introduced utility functions for generating options, queries, and form data for API requests. - Refactored multiple API methods to utilize the new utility functions for improved consistency and readability. - Renamed types for clarity and updated import statements accordingly. feat(docs): add script to update OpenAPI JSON from YAML spec - Created a Python script to convert OpenAPI YAML specification to JSON format. - The script supports customizable input and output paths. - Ensured the script handles directory creation for output paths and validates the YAML structure. * fix * feat(auth): implement rate limiting for v1 login endpoint and enhance request handling * Refactor dashboard API routers to use legacy_router for backward compatibility - Changed all instances of dashboard_router to legacy_router across multiple API modules including platform, plugins, providers, sessions, skills, stats, subagents, t2i, tools, updates, and asgi_runtime. - Updated route definitions to ensure existing endpoints remain functional under the new router structure. - Introduced support for Quart request context in asgi_runtime to enhance compatibility with existing Quart-based plugins. - Added a test case to validate the functionality of the new Quart request context handling in plugin extensions. * chore: remove cli test * fix: update dashboard tests for fastapi migration * chore: satisfy ruff checks * fix: update openapi api key scopes * fix: sync config scope chip selection * fix: restore quart dependency * docs: clarify quart plugin api compatibility * docs: update openapi scope documentation * fix: use singular skill openapi scope * fix: hide update service exception details * fix: address fastapi review comments * fix: address dashboard review findings * docs: revert unrelated package deployment changes * docs: update agent api generation guidance * feat: add plugin page web api helpers * docs: add plugin page bridge demo * fix: type plugin upload files * fix: stabilize plugin page uploads * fix: type plugin web request proxy * docs: remove plugin page docs example * fix: authenticate plugin page SSE bridge
124 lines
2.8 KiB
Vue
124 lines
2.8 KiB
Vue
<script setup>
|
|
import TraceDisplayer from '@/components/shared/TraceDisplayer.vue';
|
|
import { traceApi } from '@/api/v1';
|
|
import { useModuleI18n } from '@/i18n/composables';
|
|
import { computed, ref, onMounted } from 'vue';
|
|
import { useTheme } from 'vuetify';
|
|
|
|
const { tm } = useModuleI18n('features/trace');
|
|
const theme = useTheme();
|
|
|
|
const isDark = computed(() => theme.global.current.value.dark);
|
|
const traceEnabled = ref(true);
|
|
const loading = ref(false);
|
|
const traceDisplayerKey = ref(0);
|
|
|
|
const fetchTraceSettings = async () => {
|
|
try {
|
|
const res = await traceApi.getSettings();
|
|
if (res.data?.status === 'ok') {
|
|
traceEnabled.value = res.data.data?.trace_enable ?? true;
|
|
}
|
|
} catch (err) {
|
|
console.error('Failed to fetch trace settings:', err);
|
|
}
|
|
};
|
|
|
|
const updateTraceSettings = async () => {
|
|
loading.value = true;
|
|
try {
|
|
await traceApi.updateSettings({
|
|
trace_enable: traceEnabled.value
|
|
});
|
|
// Refresh the TraceDisplayer component to reconnect SSE
|
|
traceDisplayerKey.value += 1;
|
|
} catch (err) {
|
|
console.error('Failed to update trace settings:', err);
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
};
|
|
|
|
onMounted(() => {
|
|
fetchTraceSettings();
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<div class="dashboard-page trace-page" :class="{ 'is-dark': isDark }">
|
|
<v-container fluid class="dashboard-shell trace-shell pa-4 pa-md-6">
|
|
<div class="dashboard-header trace-header">
|
|
<div class="dashboard-header-main">
|
|
<h1 class="dashboard-title">{{ tm('title') }}</h1>
|
|
<p class="dashboard-subtitle">
|
|
{{ tm('hint') }}
|
|
</p>
|
|
</div>
|
|
<div class="dashboard-header-actions">
|
|
<v-switch
|
|
v-model="traceEnabled"
|
|
:loading="loading"
|
|
:disabled="loading"
|
|
color="primary"
|
|
hide-details
|
|
density="compact"
|
|
inset
|
|
@update:model-value="updateTraceSettings"
|
|
>
|
|
<template #label>
|
|
<span class="switch-label">{{ traceEnabled ? tm('recording') : tm('paused') }}</span>
|
|
</template>
|
|
</v-switch>
|
|
</div>
|
|
</div>
|
|
<div class="trace-body">
|
|
<TraceDisplayer :key="traceDisplayerKey" />
|
|
</div>
|
|
</v-container>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'TracePage',
|
|
components: {
|
|
TraceDisplayer
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
@import '@/styles/dashboard-shell.css';
|
|
|
|
.trace-page,
|
|
.trace-shell {
|
|
height: 100%;
|
|
}
|
|
|
|
.trace-shell {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.trace-header {
|
|
flex: 0 0 auto;
|
|
}
|
|
|
|
.trace-body {
|
|
flex: 1 1 auto;
|
|
min-height: 0;
|
|
}
|
|
|
|
.switch-label {
|
|
color: var(--dashboard-muted);
|
|
font-size: 13px;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.trace-header {
|
|
align-items: flex-start;
|
|
}
|
|
}
|
|
</style>
|