fix: resolve 7 type errors in dev branch

- tool_loop_agent_runner.py: add wrapper coroutine for create_task
- tool_image_cache.py: add cast for Self return type
- astr_agent_tool_exec.py: add type ignore for add_tool
- astr_main_agent.py: add type ignores for tool operations
- astr_main_agent_resources.py: add type ignore for msg_dict
- astrbot_config_mgr.py: add type annotations
This commit is contained in:
LIghtJUNction
2026-03-30 18:01:37 +08:00
parent 49d17460d6
commit 9b15a60802
15 changed files with 266 additions and 111 deletions

View File

@@ -42,19 +42,19 @@ class AstrBotConfigManager:
self.confs: dict[str, AstrBotConfig] = {}
"""uuid / "default" -> AstrBotConfig"""
self.confs["default"] = default_config
self.abconf_data = None
self.abconf_data: dict | None = None
self._load_all_configs()
def _get_abconf_data(self) -> dict:
"""获取所有的 abconf 数据"""
if self.abconf_data is None:
self.abconf_data = self.sp.get(
self.abconf_data: dict = self.sp.get(
"abconf_mapping",
{},
scope="global",
scope_id="global",
)
return self.abconf_data
return self.abconf_data # type: ignore[return-value]
def _load_all_configs(self) -> None:
"""Load all configurations from the shared preferences."""
@@ -107,7 +107,7 @@ class AstrBotConfigManager:
abconf_name: str | None = None,
) -> None:
"""保存配置文件的映射关系"""
abconf_data = self.sp.get(
abconf_data: dict = self.sp.get(
"abconf_mapping",
{},
scope="global",

View File

@@ -65,37 +65,43 @@
</div>
<!-- Text (Markdown) -->
<MarkdownRender
<div
v-else-if="
renderPart.type === 'part' &&
renderPart.part?.type === 'plain' &&
renderPart.part?.text?.trim()
"
:key="`${renderPart.key}-${isDark ? 'dark' : 'light'}`"
custom-id="message-list"
:custom-html-tags="['ref']"
:content="normalizeMarkdownContent(renderPart.part?.text)"
:typewriter="false"
class="markdown-content"
:is-dark="isDark"
:monaco-options="{ theme: isDark ? 'vs-dark' : 'vs-light' }"
/>
>
<MarkdownRender
custom-id="message-list"
:custom-html-tags="['ref']"
:content="normalizeMarkdownContent(renderPart.part?.text)"
:typewriter="false"
:is-dark="isDark"
:monaco-options="{ theme: isDark ? 'vs-dark' : 'vs-light' }"
/>
</div>
<!-- Text (Markdown) -->
<MarkdownRender
<div
v-else-if="
renderPart.type === 'part' &&
renderPart.part?.type === 'plain' &&
renderPart.part?.text?.trim()
"
:key="`${renderPart.key}-${isDark ? 'dark' : 'light'}`"
custom-id="message-list"
:custom-html-tags="['ref']"
:content="renderPart.part?.text"
:typewriter="false"
class="markdown-content"
:is-dark="isDark"
/>
>
<MarkdownRender
custom-id="message-list"
:custom-html-tags="['ref']"
:content="renderPart.part?.text"
:typewriter="false"
:is-dark="isDark"
/>
</div>
<!-- Image -->
<div

View File

@@ -13,14 +13,15 @@
</span>
</div>
<div v-if="isExpanded" class="reasoning-content animate-fade-in">
<MarkdownRender
:key="`reasoning-${isDark ? 'dark' : 'light'}`"
:content="reasoning"
class="reasoning-text markdown-content"
:typewriter="false"
:is-dark="isDark"
:style="isDark ? { opacity: '0.85' } : {}"
/>
<div class="reasoning-text markdown-content">
<MarkdownRender
:key="`reasoning-${isDark ? 'dark' : 'light'}`"
:content="reasoning"
:typewriter="false"
:is-dark="isDark"
:style="isDark ? { opacity: '0.85' } : {}"
/>
</div>
</div>
</div>
</template>

View File

@@ -14,7 +14,7 @@
>
<v-card-text
ref="dialogScrollContainer"
class="pa-4 ml-2"
class="pa-4 ml-2 add-platform-body"
style="overflow-y: auto"
>
<div class="d-flex align-start" style="width: 100%">
@@ -40,8 +40,7 @@
rounded="md"
density="compact"
hide-details
class="mt-6"
style="max-width: 30%; min-width: 300px"
class="mt-6 platform-type-field"
>
<template #item="{ props: itemProps, item }">
<v-list-item v-bind="itemProps">
@@ -98,8 +97,7 @@
rounded="md"
density="compact"
hide-details
class="mt-6"
style="max-width: 30%; min-width: 300px"
class="mt-6 platform-type-field"
disabled
/>
<div class="mt-3">
@@ -173,7 +171,7 @@
</v-radio>
<div
v-if="aBConfigRadioVal === '0'"
class="d-flex align-center ml-10 my-2"
class="d-flex align-center ml-10 my-2 config-mode-field-row"
>
<v-select
v-model="selectedAbConfId"
@@ -185,7 +183,7 @@
rounded="md"
density="compact"
hide-details
style="max-width: 30%; min-width: 200px"
class="config-file-field"
/>
<v-btn
icon
@@ -204,7 +202,7 @@
/>
<div
v-if="aBConfigRadioVal === '1'"
class="d-flex align-center"
class="d-flex align-center config-mode-field-row"
>
<v-text-field
v-model="selectedAbConfId"
@@ -213,8 +211,7 @@
rounded="md"
density="compact"
hide-details
style="max-width: 30%; min-width: 200px"
class="ml-10 my-2"
class="ml-10 my-2 config-file-field"
/>
</div>
</v-radio-group>
@@ -265,7 +262,9 @@
</div>
<div v-else>
<div class="mb-3 d-flex align-center justify-space-between">
<div
class="mb-3 d-flex align-center justify-space-between route-toolbar"
>
<div>
<v-btn
v-if="isEditingRoutes"
@@ -302,11 +301,11 @@
:no-data-text="tm('createDialog.noRouteRules')"
hide-default-footer
:items-per-page="-1"
class="mt-2"
class="mt-2 platform-route-table"
variant="outlined"
>
<template #item.source="{ item }">
<div class="d-flex align-center" style="min-width: 250px">
<div class="d-flex align-center route-source-field">
<v-select
v-if="isEditingRoutes"
v-model="item.messageType"
@@ -316,7 +315,7 @@
variant="outlined"
density="compact"
hide-details
style="max-width: 140px"
class="route-message-type-field"
/>
<small v-else>{{
getMessageTypeLabel(item.messageType)
@@ -339,7 +338,7 @@
</template>
<template #item.configId="{ item }">
<div class="d-flex align-center">
<div class="d-flex align-center route-config-cell">
<v-select
v-if="isEditingRoutes"
v-model="item.configId"
@@ -348,7 +347,7 @@
item-value="id"
variant="outlined"
density="compact"
style="min-width: 200px"
class="route-config-field"
hide-details
/>
<div v-else>
@@ -1373,6 +1372,10 @@ export default {
font-size: 12px;
}
.add-platform-body {
overscroll-behavior: contain;
}
.platform-option-logo {
width: 32px;
height: 32px;
@@ -1386,6 +1389,39 @@ export default {
object-fit: contain;
}
.platform-type-field {
width: min(100%, 320px);
max-width: 100%;
}
.config-file-field {
width: min(100%, 320px);
max-width: 100%;
}
.route-source-field {
min-width: 250px;
gap: 8px;
flex-wrap: wrap;
}
.route-message-type-field {
width: 140px;
max-width: 140px;
flex: 0 0 140px;
}
.route-config-cell {
gap: 8px;
flex-wrap: wrap;
}
.route-config-field {
width: 100%;
min-width: 200px;
max-width: 260px;
}
.config-drawer-overlay {
align-items: stretch;
justify-content: flex-end;
@@ -1411,4 +1447,77 @@ export default {
overflow-y: auto;
padding: 16px 16px 24px 16px;
}
@media (max-width: 700px) {
.add-platform-body {
padding: 16px !important;
margin-left: 0 !important;
}
.platform-option-logo {
width: 28px;
height: 28px;
margin-right: 12px;
}
.platform-selection-logo {
width: 18px;
height: 18px;
}
.platform-type-field,
.config-file-field {
width: 100%;
}
.config-mode-field-row {
margin-left: 0 !important;
width: 100%;
flex-wrap: wrap;
}
.route-toolbar {
align-items: flex-start !important;
gap: 8px;
flex-direction: column;
}
.route-source-field {
min-width: 0;
width: 100%;
}
.route-message-type-field {
width: 100%;
max-width: none;
flex-basis: 100%;
}
.route-config-field {
min-width: 0;
max-width: none;
}
.platform-route-table .v-table__wrapper {
overflow-x: auto;
}
.platform-route-table .v-table__wrapper > table {
min-width: 640px;
}
.config-drawer-card {
width: calc(100vw - 16px);
height: calc(100vh - 16px);
margin: 8px;
}
.config-drawer-header {
padding: 12px 14px 10px 14px;
}
.config-drawer-content {
padding: 12px 12px 20px 12px;
}
}
</style>

View File

@@ -395,13 +395,24 @@ function getSpecialSubtype(value) {
<style scoped>
/* === Reactor glassmorphism card === */
.config-reactor-card {
--config-accent-rgb: var(--v-theme-primary);
--config-surface-rgb: var(--v-theme-surface);
--config-on-surface-rgb: var(--v-theme-on-surface);
margin-bottom: 16px;
padding-bottom: 8px;
background: rgba(15, 15, 22, 0.45) !important;
backdrop-filter: blur(20px) saturate(1.2);
border: 1px solid rgba(0, 242, 255, 0.08) !important;
background: rgba(var(--config-surface-rgb), 0.94) !important;
backdrop-filter: blur(18px) saturate(1.08);
border: 1px solid rgba(var(--config-on-surface-rgb), 0.08) !important;
border-radius: 24px !important;
box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.6) !important;
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.08) !important;
}
:global(.v-theme--dark) .config-reactor-card {
background: rgba(var(--config-surface-rgb), 0.72) !important;
border-color: rgba(var(--config-accent-rgb), 0.12) !important;
box-shadow:
inset 0 0 20px rgba(0, 0, 0, 0.35),
0 18px 48px rgba(0, 0, 0, 0.28) !important;
}
.config-section {
@@ -412,7 +423,7 @@ function getSpecialSubtype(value) {
.config-title {
font-size: 1.1rem;
font-weight: 600;
color: rgba(0, 242, 255, 0.9) !important;
color: rgba(var(--config-on-surface-rgb), 0.92) !important;
font-family: "JetBrains Mono", "Fira Code", monospace;
letter-spacing: 0.5px;
display: flex;
@@ -424,29 +435,33 @@ function getSpecialSubtype(value) {
display: inline-block;
width: 3px;
height: 1.1em;
background: linear-gradient(180deg, #00F2FF 0%, rgba(0, 242, 255, 0.2) 100%);
background: linear-gradient(
180deg,
rgba(var(--config-accent-rgb), 0.95) 0%,
rgba(var(--config-accent-rgb), 0.16) 100%
);
border-radius: 2px;
flex-shrink: 0;
box-shadow: 0 0 8px rgba(0, 242, 255, 0.6);
box-shadow: 0 0 10px rgba(var(--config-accent-rgb), 0.24);
}
.config-hint {
font-size: 0.75rem;
color: rgba(228, 225, 230, 0.5);
color: rgba(var(--config-on-surface-rgb), 0.62);
margin-top: 4px;
line-height: 1.5;
}
.config-hint ::v-deep(a),
.property-hint ::v-deep(a) {
color: rgba(0, 242, 255, 0.7);
color: rgba(var(--config-accent-rgb), 0.85);
text-decoration: none;
border-bottom: 1px solid rgba(0, 242, 255, 0.3);
border-bottom: 1px solid rgba(var(--config-accent-rgb), 0.28);
transition: border-color 0.2s;
}
.config-hint ::v-deep(a:hover),
.property-hint ::v-deep(a:hover) {
border-bottom-color: #00F2FF;
border-bottom-color: rgba(var(--config-accent-rgb), 0.8);
}
.metadata-key,
@@ -472,11 +487,11 @@ function getSpecialSubtype(value) {
}
.nested-container {
border: 1px solid rgba(0, 242, 255, 0.06);
border: 1px solid rgba(var(--config-on-surface-rgb), 0.08);
border-radius: 12px;
padding: 12px;
margin: 12px 0;
background: rgba(0, 0, 0, 0.2);
background: rgba(var(--config-accent-rgb), 0.04);
}
.config-row {
@@ -488,7 +503,7 @@ function getSpecialSubtype(value) {
}
.config-row:hover {
background: rgba(0, 242, 255, 0.03);
background: rgba(var(--config-accent-rgb), 0.05);
}
.property-info {
@@ -498,12 +513,12 @@ function getSpecialSubtype(value) {
.property-name {
font-size: 0.875rem;
font-weight: 500;
color: rgba(228, 225, 230, 0.85);
color: rgba(var(--config-on-surface-rgb), 0.88);
}
.property-hint {
font-size: 0.72rem;
color: rgba(228, 225, 230, 0.4);
color: rgba(var(--config-on-surface-rgb), 0.62);
margin-top: 2px;
line-height: 1.4;
}
@@ -522,7 +537,7 @@ function getSpecialSubtype(value) {
}
.config-divider {
border-color: rgba(255, 255, 255, 0.04) !important;
border-color: rgba(var(--config-on-surface-rgb), 0.08) !important;
margin-left: 24px;
}
@@ -537,12 +552,20 @@ function getSpecialSubtype(value) {
top: 4px;
right: 4px;
z-index: 10;
background-color: rgba(0, 0, 0, 0.3);
background-color: rgba(var(--config-on-surface-rgb), 0.08);
border-radius: 4px;
}
:global(.v-theme--dark) .editor-fullscreen-btn {
background-color: rgba(0, 0, 0, 0.28);
}
.editor-fullscreen-btn:hover {
background-color: rgba(0, 0, 0, 0.5);
background-color: rgba(var(--config-on-surface-rgb), 0.14);
}
:global(.v-theme--dark) .editor-fullscreen-btn:hover {
background-color: rgba(0, 0, 0, 0.42);
}
.plugin-set-display-row {
@@ -564,8 +587,8 @@ function getSpecialSubtype(value) {
}
.selected-plugins-full-width {
background: rgba(0, 242, 255, 0.04);
border: 1px solid rgba(0, 242, 255, 0.08);
background: rgba(var(--config-accent-rgb), 0.04);
border: 1px solid rgba(var(--config-accent-rgb), 0.1);
border-radius: 10px;
padding: 12px;
}

View File

@@ -205,11 +205,12 @@ getCurrentVersion();
{{ changelogError }}
</v-alert>
<div v-else-if="changelogContent" class="changelog-content">
<MarkdownRender
:content="changelogContent"
:typewriter="false"
class="markdown-content"
/>
<div class="markdown-content">
<MarkdownRender
:content="changelogContent"
:typewriter="false"
/>
</div>
</div>
</div>
</v-card-text>

View File

@@ -243,20 +243,20 @@
@update:model-value="emitUpdate"
/>
<ListConfigItem
v-else-if="itemMeta?.type === 'list'"
:model-value="modelValue"
class="config-field"
@update:model-value="emitUpdate"
/>
<div v-else-if="itemMeta?.type === 'list'" class="config-field">
<ListConfigItem
:model-value="modelValue"
@update:model-value="emitUpdate"
/>
</div>
<ObjectEditor
v-else-if="itemMeta?.type === 'dict'"
:model-value="modelValue"
:item-meta="itemMeta"
class="config-field"
@update:model-value="emitUpdate"
/>
<div v-else-if="itemMeta?.type === 'dict'" class="config-field">
<ObjectEditor
:model-value="modelValue"
:item-meta="itemMeta"
@update:model-value="emitUpdate"
/>
</div>
<v-text-field
v-else

View File

@@ -1,8 +1,7 @@
<script setup>
import { shallowRef, onMounted, onBeforeUnmount } from "vue";
import axios from "axios";
import { EventSourcePolyfill } from "event-source-polyfill";
import { resolveApiUrl } from "@/utils/request";
import axios, { resolveApiUrl } from "@/utils/request";
let isMounted = false;
const events = shallowRef([]);

View File

@@ -854,11 +854,12 @@ const isChristmas = computed(() => {
overflow-y: auto;
"
>
<MarkdownRender
:content="releaseMessage"
:typewriter="false"
class="markdown-content"
/>
<div class="markdown-content">
<MarkdownRender
:content="releaseMessage"
:typewriter="false"
/>
</div>
</div>
<div class="mb-4 mt-4">
@@ -1022,11 +1023,12 @@ const isChristmas = computed(() => {
{{ selectedReleaseTag }}
</v-card-title>
<v-card-text style="font-size: 14px; max-height: 400px; overflow-y: auto">
<MarkdownRender
:content="selectedReleaseNotes"
:typewriter="false"
class="markdown-content"
/>
<div class="markdown-content">
<MarkdownRender
:content="selectedReleaseNotes"
:typewriter="false"
/>
</div>
</v-card-text>
<v-card-actions>
<v-spacer />

View File

@@ -1,13 +1,18 @@
<script setup lang="ts">
import { useI18n } from "@/i18n/composables";
import { useCustomizerStore } from "@/stores/customizer";
import { computed } from "vue";
import { computed, useAttrs } from "vue";
import { useRoute } from "vue-router";
defineOptions({
inheritAttrs: false,
});
const props = defineProps({ item: Object, level: Number });
const { t } = useI18n();
const customizer = useCustomizerStore();
const route = useRoute();
const attrs = useAttrs();
const itemStyle = computed(() => {
const lvl = props.level ?? 0;
@@ -32,6 +37,7 @@ const isItemActive = computed(() => {
v-if="item.children"
:value="item.title"
:class="{ 'group-bordered': customizer.mini_sidebar }"
v-bind="attrs"
>
<template #activator="{ props }">
<v-list-item
@@ -75,6 +81,7 @@ const isItemActive = computed(() => {
:disabled="item.disabled"
:target="item.type === 'external' ? '_blank' : ''"
:style="itemStyle"
v-bind="attrs"
>
<template #prepend>
<v-icon

View File

@@ -1005,14 +1005,8 @@ export default {
.unsaved-changes-banner {
border-radius: 8px;
}
.v-theme--light .unsaved-changes-banner {
background-color: #f1f4f9 !important;
}
.v-theme--dark .unsaved-changes-banner {
background-color: #2d2d2d !important;
background-color: rgba(var(--v-theme-warning), 0.1) !important;
border: 1px solid rgba(var(--v-theme-warning), 0.16) !important;
}
.unsaved-changes-banner-wrap {

View File

@@ -1,8 +1,8 @@
<script setup>
import TraceDisplayer from "@/components/shared/TraceDisplayer.vue";
import { useModuleI18n } from "@/i18n/composables";
import axios from "@/utils/request";
import { ref, onMounted } from "vue";
import axios from "axios";
const { tm } = useModuleI18n("features/trace");

View File

@@ -253,11 +253,12 @@
<div class="mb-4 text-h3 font-weight-bold">
{{ tm("announcement.title") }}
</div>
<MarkdownRender
:content="welcomeAnnouncement"
:typewriter="false"
class="welcome-announcement-markdown markdown-content"
/>
<div class="welcome-announcement-markdown markdown-content">
<MarkdownRender
:content="welcomeAnnouncement"
:typewriter="false"
/>
</div>
</v-card>
</v-col>
</v-row>

View File

@@ -180,7 +180,7 @@ const marketCategorySelectItems = computed(() =>
</script>
<template>
<v-window-item v-show="activeTab === 'market'">
<div v-show="activeTab === 'market'">
<div class="mb-6 pt-4 pb-4">
<div class="d-flex align-center" style="gap: 12px">
<div class="d-flex align-center" style="gap: 12px; min-width: 0">
@@ -393,7 +393,7 @@ const marketCategorySelectItems = computed(() =>
</div>
</v-expand-transition>
</div>
</v-window-item>
</div>
</template>
<style scoped>

View File

@@ -44,6 +44,10 @@ function mdiFontDownload() {
export default defineConfig(({ command, mode }) => {
const env = loadEnv(mode, process.cwd(), "");
const basePath = env.VITE_BASE_PATH || process.env.BASE_PATH || "/";
const devApiProxyTarget =
env.VITE_DEV_API_PROXY_TARGET ||
process.env.VITE_DEV_API_PROXY_TARGET ||
"";
return {
base: command === "build" ? basePath : "/",
@@ -85,6 +89,14 @@ export default defineConfig(({ command, mode }) => {
server: {
host: "::",
port: 3000,
proxy: devApiProxyTarget
? {
"/api": {
target: devApiProxyTarget,
changeOrigin: true,
},
}
: undefined,
},
};
});