Compare commits

..

1 Commits

Author SHA1 Message Date
huanghuoguoguo 869567c975 fix(skills): bootstrap generated lbs wrapper 2026-06-20 17:19:35 +08:00
7 changed files with 30 additions and 47 deletions
+1 -7
View File
@@ -84,13 +84,7 @@ class CommandManager:
privilege = 1 privilege = 1
admins = self.ap.instance_config.data['admins'] if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.instance_config.data['admins']:
launcher_session_id = f'{query.launcher_type.value}_{query.launcher_id}'
sender_session_id = f'person_{query.sender_id}'
# 兼容老版本匹配 launcher_session_id(群管理: group_xxx 私聊管理: person_xxx
# 新实现匹配 sender_session_id(个人管理员: person_xxx,在任何群聊中生效)
if launcher_session_id in admins or sender_session_id in admins:
privilege = 2 privilege = 2
ctx = command_context.ExecuteContext( ctx = command_context.ExecuteContext(
@@ -23,13 +23,7 @@ class CommandHandler(handler.MessageHandler):
privilege = 1 privilege = 1
admins = self.ap.instance_config.data['admins'] if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.instance_config.data['admins']:
launcher_session_id = f'{query.launcher_type.value}_{query.launcher_id}'
sender_session_id = f'person_{query.sender_id}'
# 兼容老版本匹配 launcher_session_id(群管理: group_xxx 私聊管理: person_xxx
# 新实现匹配 sender_session_id(个人管理员: person_xxx,在任何群聊中生效)
if launcher_session_id in admins or sender_session_id in admins:
privilege = 2 privilege = 2
spt = command_text.split(' ') spt = command_text.split(' ')
@@ -646,7 +646,7 @@ export default function ModelsPanel({
</PanelBody> </PanelBody>
<Dialog open={providerFormOpen} onOpenChange={setProviderFormOpen}> <Dialog open={providerFormOpen} onOpenChange={setProviderFormOpen}>
<DialogContent className="w-full max-w-[calc(100%-2rem)] p-4 sm:max-w-[600px] sm:p-6"> <DialogContent className="w-[600px] p-6">
<DialogHeader> <DialogHeader>
<DialogTitle> <DialogTitle>
{editingProviderId {editingProviderId
@@ -38,12 +38,7 @@ export function PanelBody({
children: React.ReactNode; children: React.ReactNode;
}) { }) {
return ( return (
<div <div className={cn('min-h-0 flex-1 overflow-auto px-6 py-5', className)}>
className={cn(
'min-h-0 flex-1 overflow-auto px-3 py-4 sm:px-6 sm:py-5',
className,
)}
>
{children} {children}
</div> </div>
); );
@@ -109,10 +109,10 @@ export default function MonitoringFilters({
}; };
return ( return (
<div className="flex w-full flex-col gap-3 sm:w-auto sm:flex-row sm:flex-wrap sm:items-center sm:gap-6"> <div className="flex flex-wrap items-center gap-6">
{/* Bot Filter */} {/* Bot Filter */}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<label className="w-20 shrink-0 text-sm font-medium text-foreground sm:w-auto sm:whitespace-nowrap"> <label className="text-sm font-medium text-foreground whitespace-nowrap">
{t('monitoring.filters.bot')} {t('monitoring.filters.bot')}
</label> </label>
<Select <Select
@@ -120,7 +120,7 @@ export default function MonitoringFilters({
onValueChange={handleBotChange} onValueChange={handleBotChange}
disabled={loadingBots} disabled={loadingBots}
> >
<SelectTrigger className="h-9 w-full sm:w-[140px]"> <SelectTrigger className="h-9 w-[140px]">
<SelectValue <SelectValue
placeholder={ placeholder={
loadingBots loadingBots
@@ -144,7 +144,7 @@ export default function MonitoringFilters({
{/* Pipeline Filter */} {/* Pipeline Filter */}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<label className="w-20 shrink-0 text-sm font-medium text-foreground sm:w-auto sm:whitespace-nowrap"> <label className="text-sm font-medium text-foreground whitespace-nowrap">
{t('monitoring.filters.pipeline')} {t('monitoring.filters.pipeline')}
</label> </label>
<Select <Select
@@ -152,7 +152,7 @@ export default function MonitoringFilters({
onValueChange={handlePipelineChange} onValueChange={handlePipelineChange}
disabled={loadingPipelines} disabled={loadingPipelines}
> >
<SelectTrigger className="h-9 w-full sm:w-[140px]"> <SelectTrigger className="h-9 w-[140px]">
<SelectValue <SelectValue
placeholder={ placeholder={
loadingPipelines loadingPipelines
@@ -176,11 +176,11 @@ export default function MonitoringFilters({
{/* Time Range Filter */} {/* Time Range Filter */}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<label className="w-20 shrink-0 text-sm font-medium text-foreground sm:w-auto sm:whitespace-nowrap"> <label className="text-sm font-medium text-foreground whitespace-nowrap">
{t('monitoring.filters.timeRange')} {t('monitoring.filters.timeRange')}
</label> </label>
<Select value={timeRange} onValueChange={handleTimeRangeChange}> <Select value={timeRange} onValueChange={handleTimeRangeChange}>
<SelectTrigger className="h-9 w-full sm:w-[150px]"> <SelectTrigger className="h-9 w-[150px]">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
+17 -17
View File
@@ -270,7 +270,7 @@ function MonitoringPageContent() {
{/* Filters and Refresh Button - Sticky */} {/* Filters and Refresh Button - Sticky */}
<div className="sticky top-0 z-10 -mt-1 pb-5 pt-1 bg-background"> <div className="sticky top-0 z-10 -mt-1 pb-5 pt-1 bg-background">
<div> <div>
<div className="flex flex-col gap-3 p-3 bg-card rounded-xl border sm:flex-row sm:flex-wrap sm:items-center sm:justify-between sm:gap-4 sm:p-4"> <div className="flex flex-wrap items-center justify-between gap-4 p-4 bg-card rounded-xl border">
<MonitoringFilters <MonitoringFilters
selectedBots={filterState.selectedBots} selectedBots={filterState.selectedBots}
selectedPipelines={filterState.selectedPipelines} selectedPipelines={filterState.selectedPipelines}
@@ -285,7 +285,7 @@ function MonitoringPageContent() {
variant="outline" variant="outline"
size="sm" size="sm"
onClick={handleRefresh} onClick={handleRefresh}
className="flex-1 shadow-sm sm:flex-shrink-0 sm:flex-none" className="shadow-sm flex-shrink-0"
> >
<RefreshCw className="w-4 h-4 mr-2" /> <RefreshCw className="w-4 h-4 mr-2" />
{t('monitoring.refreshData')} {t('monitoring.refreshData')}
@@ -312,27 +312,27 @@ function MonitoringPageContent() {
onValueChange={setActiveTab} onValueChange={setActiveTab}
className="w-full" className="w-full"
> >
<div className="px-3 pt-4 sm:px-6"> <div className="px-6 pt-4">
<TabsList className="h-12 w-full justify-start gap-1 overflow-x-auto p-1 sm:w-auto"> <TabsList className="h-12 p-1">
<TabsTrigger value="messages" className="px-3 py-2 sm:px-6"> <TabsTrigger value="messages" className="px-6 py-2">
{t('monitoring.tabs.messages')} {t('monitoring.tabs.messages')}
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="modelCalls" className="px-3 py-2 sm:px-6"> <TabsTrigger value="modelCalls" className="px-6 py-2">
{t('monitoring.tabs.modelCalls')} {t('monitoring.tabs.modelCalls')}
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="tokens" className="px-3 py-2 sm:px-6"> <TabsTrigger value="tokens" className="px-6 py-2">
{t('monitoring.tabs.tokens')} {t('monitoring.tabs.tokens')}
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="feedback" className="px-3 py-2 sm:px-6"> <TabsTrigger value="feedback" className="px-6 py-2">
{t('monitoring.tabs.feedback')} {t('monitoring.tabs.feedback')}
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="errors" className="px-3 py-2 sm:px-6"> <TabsTrigger value="errors" className="px-6 py-2">
{t('monitoring.tabs.errors')} {t('monitoring.tabs.errors')}
</TabsTrigger> </TabsTrigger>
</TabsList> </TabsList>
</div> </div>
<TabsContent value="messages" className="p-3 m-0 sm:p-6"> <TabsContent value="messages" className="p-6 m-0">
<div> <div>
{loading && ( {loading && (
<div className="py-12 flex justify-center"> <div className="py-12 flex justify-center">
@@ -362,7 +362,7 @@ function MonitoringPageContent() {
> >
{/* Message Header - Always Visible */} {/* Message Header - Always Visible */}
<div <div
className="p-3 cursor-pointer hover:bg-accent transition-colors sm:p-5" className="p-5 cursor-pointer hover:bg-accent transition-colors"
onClick={() => toggleMessageExpand(msg.id)} onClick={() => toggleMessageExpand(msg.id)}
> >
<div className="flex items-start justify-between"> <div className="flex items-start justify-between">
@@ -466,7 +466,7 @@ function MonitoringPageContent() {
</div> </div>
</TabsContent> </TabsContent>
<TabsContent value="modelCalls" className="p-3 m-0 sm:p-6"> <TabsContent value="modelCalls" className="p-6 m-0">
<div> <div>
{loading && ( {loading && (
<div className="py-12 flex justify-center"> <div className="py-12 flex justify-center">
@@ -482,7 +482,7 @@ function MonitoringPageContent() {
{data.modelCalls.map((call) => ( {data.modelCalls.map((call) => (
<div <div
key={call.id} key={call.id}
className="border rounded-xl p-3 transition-all duration-200 sm:p-5" className="border rounded-xl p-5 transition-all duration-200"
> >
<div className="flex justify-between items-start mb-3"> <div className="flex justify-between items-start mb-3">
<div className="flex-1"> <div className="flex-1">
@@ -672,7 +672,7 @@ function MonitoringPageContent() {
</div> </div>
</TabsContent> </TabsContent>
<TabsContent value="tokens" className="p-3 m-0 sm:p-6"> <TabsContent value="tokens" className="p-6 m-0">
<TokenMonitoring <TokenMonitoring
botIds={ botIds={
filterState.selectedBots.length > 0 filterState.selectedBots.length > 0
@@ -690,7 +690,7 @@ function MonitoringPageContent() {
/> />
</TabsContent> </TabsContent>
<TabsContent value="feedback" className="p-3 m-0 sm:p-6"> <TabsContent value="feedback" className="p-6 m-0">
<div> <div>
{loading && ( {loading && (
<div className="py-12 flex justify-center"> <div className="py-12 flex justify-center">
@@ -722,7 +722,7 @@ function MonitoringPageContent() {
</div> </div>
</TabsContent> </TabsContent>
<TabsContent value="errors" className="p-3 m-0 sm:p-6"> <TabsContent value="errors" className="p-6 m-0">
<div> <div>
{loading && ( {loading && (
<div className="py-12 flex justify-center"> <div className="py-12 flex justify-center">
@@ -739,7 +739,7 @@ function MonitoringPageContent() {
> >
{/* Error Header - Always Visible */} {/* Error Header - Always Visible */}
<div <div
className="p-3 cursor-pointer hover:bg-red-50 dark:hover:bg-red-950/50 transition-colors bg-red-50/50 dark:bg-red-950/30 sm:p-5" className="p-5 cursor-pointer hover:bg-red-50 dark:hover:bg-red-950/50 transition-colors bg-red-50/50 dark:bg-red-950/30"
onClick={() => toggleErrorExpand(error.id)} onClick={() => toggleErrorExpand(error.id)}
> >
<div className="flex items-start justify-between"> <div className="flex items-start justify-between">
@@ -90,7 +90,7 @@ export default function PluginLogs({
return ( return (
<div className="flex h-full flex-col"> <div className="flex h-full flex-col">
<div className="flex shrink-0 flex-wrap items-center gap-2 px-1 pb-3 sm:px-6"> <div className="flex shrink-0 flex-wrap items-center gap-2 px-6 pb-3">
<Select value={level} onValueChange={setLevel}> <Select value={level} onValueChange={setLevel}>
<SelectTrigger className="h-8 w-[130px]"> <SelectTrigger className="h-8 w-[130px]">
<SelectValue /> <SelectValue />
@@ -132,7 +132,7 @@ export default function PluginLogs({
<div <div
ref={scrollRef} ref={scrollRef}
onScroll={handleScroll} onScroll={handleScroll}
className="min-h-0 flex-1 overflow-auto bg-gray-50 px-3 py-3 font-mono text-xs leading-relaxed dark:bg-gray-900/40 sm:px-6" className="min-h-0 flex-1 overflow-auto bg-gray-50 px-6 py-3 font-mono text-xs leading-relaxed dark:bg-gray-900/40"
> >
{logs.length === 0 ? ( {logs.length === 0 ? (
<div className="py-8 text-center text-sm text-gray-500 dark:text-gray-400"> <div className="py-8 text-center text-sm text-gray-500 dark:text-gray-400">