feat(memory,dashboard,channel,cron): raise read endpoints out of viewer

This commit is contained in:
matevip 2026-05-15 10:18:20 +08:00
parent 3ba22b99f3
commit 9fc2e5f04f
7 changed files with 24 additions and 22 deletions

View File

@ -43,7 +43,7 @@ public class ChannelController {
private final ChannelVerifierRegistry verifierRegistry; private final ChannelVerifierRegistry verifierRegistry;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("admin")
@Operation(summary = "获取渠道列表") @Operation(summary = "获取渠道列表")
@GetMapping @GetMapping
public R<List<ChannelEntity>> list( public R<List<ChannelEntity>> list(
@ -52,7 +52,7 @@ public class ChannelController {
return R.ok(channelService.listChannelsByWorkspace(wsId)); return R.ok(channelService.listChannelsByWorkspace(wsId));
} }
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("admin")
@Operation(summary = "按类型获取渠道列表") @Operation(summary = "按类型获取渠道列表")
@GetMapping("/type/{channelType}") @GetMapping("/type/{channelType}")
public R<List<ChannelEntity>> listByType(@PathVariable String channelType, public R<List<ChannelEntity>> listByType(@PathVariable String channelType,
@ -61,7 +61,7 @@ public class ChannelController {
return R.ok(channelService.listChannelsByTypeAndWorkspace(channelType, wsId)); return R.ok(channelService.listChannelsByTypeAndWorkspace(channelType, wsId));
} }
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("admin")
@Operation(summary = "获取渠道详情") @Operation(summary = "获取渠道详情")
@GetMapping("/{id}") @GetMapping("/{id}")
public R<ChannelEntity> get(@PathVariable Long id, public R<ChannelEntity> get(@PathVariable Long id,
@ -140,7 +140,7 @@ public class ChannelController {
return R.ok(channelManager.getStatus()); return R.ok(channelManager.getStatus());
} }
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("admin")
@Operation(summary = "获取指定渠道的实时健康状态(真连接状态,前端绿点应该绑这个)") @Operation(summary = "获取指定渠道的实时健康状态(真连接状态,前端绿点应该绑这个)")
@GetMapping("/{id}/health") @GetMapping("/{id}/health")
public R<Map<String, Object>> health(@PathVariable Long id, public R<Map<String, Object>> health(@PathVariable Long id,

View File

@ -38,7 +38,7 @@ public class CronJobController {
@Operation(summary = "获取定时任务列表") @Operation(summary = "获取定时任务列表")
@GetMapping @GetMapping
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<CronJobDTO>> list( public R<List<CronJobDTO>> list(
@RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) { @RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) {
return R.ok(cronJobService.list(resolve(workspaceId))); return R.ok(cronJobService.list(resolve(workspaceId)));
@ -46,7 +46,7 @@ public class CronJobController {
@Operation(summary = "获取定时任务详情") @Operation(summary = "获取定时任务详情")
@GetMapping("/{id}") @GetMapping("/{id}")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<CronJobDTO> get(@PathVariable Long id, public R<CronJobDTO> get(@PathVariable Long id,
@RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) { @RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) {
return R.ok(cronJobService.getById(id, resolve(workspaceId))); return R.ok(cronJobService.getById(id, resolve(workspaceId)));
@ -70,7 +70,7 @@ public class CronJobController {
@Operation(summary = "删除定时任务") @Operation(summary = "删除定时任务")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
@RequireWorkspaceRole("admin") @RequireWorkspaceRole("member")
public R<Void> delete(@PathVariable Long id, public R<Void> delete(@PathVariable Long id,
@RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) { @RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) {
cronJobService.delete(id, resolve(workspaceId)); cronJobService.delete(id, resolve(workspaceId));
@ -103,7 +103,7 @@ public class CronJobController {
*/ */
@Operation(summary = "查询会话下正在执行的定时任务运行") @Operation(summary = "查询会话下正在执行的定时任务运行")
@GetMapping("/active-runs") @GetMapping("/active-runs")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<ActiveCronRunVO>> activeRuns( public R<List<ActiveCronRunVO>> activeRuns(
@RequestParam("conversationId") String conversationId) { @RequestParam("conversationId") String conversationId) {
return R.ok(cronJobRunService.listActiveByConversation(conversationId)); return R.ok(cronJobRunService.listActiveByConversation(conversationId));

View File

@ -36,7 +36,7 @@ public class DashboardController {
@Operation(summary = "获取概览统计") @Operation(summary = "获取概览统计")
@GetMapping("/overview") @GetMapping("/overview")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<Map<String, Object>> overview( public R<Map<String, Object>> overview(
@RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) { @RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId) {
return R.ok(dashboardService.getOverview(workspaceId)); return R.ok(dashboardService.getOverview(workspaceId));
@ -44,7 +44,7 @@ public class DashboardController {
@Operation(summary = "获取日用量趋势") @Operation(summary = "获取日用量趋势")
@GetMapping("/trend") @GetMapping("/trend")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<Map<String, Object>>> trend( public R<List<Map<String, Object>>> trend(
@RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId, @RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId,
@RequestParam(defaultValue = "30") int days) { @RequestParam(defaultValue = "30") int days) {
@ -53,7 +53,7 @@ public class DashboardController {
@Operation(summary = "获取 CronJob 执行历史") @Operation(summary = "获取 CronJob 执行历史")
@GetMapping("/cron-runs/{cronJobId}") @GetMapping("/cron-runs/{cronJobId}")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<CronJobRunEntity>> cronJobRuns( public R<List<CronJobRunEntity>> cronJobRuns(
@PathVariable Long cronJobId, @PathVariable Long cronJobId,
@RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId, @RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId,
@ -74,7 +74,7 @@ public class DashboardController {
@Operation(summary = "获取最近执行记录(当前 workspace 关联的 CronJob") @Operation(summary = "获取最近执行记录(当前 workspace 关联的 CronJob")
@GetMapping("/cron-runs") @GetMapping("/cron-runs")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<CronJobRunEntity>> recentRuns( public R<List<CronJobRunEntity>> recentRuns(
@RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId, @RequestHeader(value = "X-Workspace-Id", required = false) Long workspaceId,
@RequestParam(defaultValue = "20") int limit) { @RequestParam(defaultValue = "20") int limit) {

View File

@ -41,7 +41,7 @@ public class DreamController {
@Operation(summary = "List dream reports (paginated, newest first)") @Operation(summary = "List dream reports (paginated, newest first)")
@GetMapping("/reports") @GetMapping("/reports")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<Map<String, Object>> listReports( public R<Map<String, Object>> listReports(
@PathVariable Long agentId, @PathVariable Long agentId,
@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "1") int page,
@ -63,7 +63,7 @@ public class DreamController {
@Operation(summary = "Get a single dream report by ID") @Operation(summary = "Get a single dream report by ID")
@GetMapping("/reports/{reportId}") @GetMapping("/reports/{reportId}")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<DreamReportEntity> getReport( public R<DreamReportEntity> getReport(
@PathVariable Long agentId, @PathVariable Long agentId,
@PathVariable Long reportId) { @PathVariable Long reportId) {
@ -82,7 +82,7 @@ public class DreamController {
@Operation(summary = "Subscribe to dream events (SSE)") @Operation(summary = "Subscribe to dream events (SSE)")
@GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE) @GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public SseEmitter subscribeDreamEvents(@PathVariable Long agentId) { public SseEmitter subscribeDreamEvents(@PathVariable Long agentId) {
return eventBroadcaster.register(agentId); return eventBroadcaster.register(agentId);
} }
@ -91,7 +91,7 @@ public class DreamController {
@Operation(summary = "Get morning card for current user + agent") @Operation(summary = "Get morning card for current user + agent")
@GetMapping("/morning-card") @GetMapping("/morning-card")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<Map<String, Object>> getMorningCard(@PathVariable Long agentId, Authentication auth) { public R<Map<String, Object>> getMorningCard(@PathVariable Long agentId, Authentication auth) {
Long userId = resolveUserId(auth); Long userId = resolveUserId(auth);
if (userId == null) return R.fail("Not authenticated"); if (userId == null) return R.fail("Not authenticated");
@ -101,7 +101,7 @@ public class DreamController {
@Operation(summary = "Mark morning card as seen") @Operation(summary = "Mark morning card as seen")
@PostMapping("/morning-card/seen") @PostMapping("/morning-card/seen")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<Void> markMorningCardSeen(@PathVariable Long agentId, public R<Void> markMorningCardSeen(@PathVariable Long agentId,
@RequestBody Map<String, Object> body, @RequestBody Map<String, Object> body,
Authentication auth) { Authentication auth) {

View File

@ -92,7 +92,7 @@ public class MemoryController {
@Operation(summary = "查询 Dreaming 状态(配置、统计、上次运行时间)") @Operation(summary = "查询 Dreaming 状态(配置、统计、上次运行时间)")
@GetMapping("/{agentId}/dreaming/status") @GetMapping("/{agentId}/dreaming/status")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<Map<String, Object>> getDreamingStatus(@PathVariable Long agentId) { public R<Map<String, Object>> getDreamingStatus(@PathVariable Long agentId) {
Map<String, Object> status = recallService.getDreamingStatus(agentId); Map<String, Object> status = recallService.getDreamingStatus(agentId);
status.put("lastRunTime", dreamingScheduler.getLastRunTime()); status.put("lastRunTime", dreamingScheduler.getLastRunTime());
@ -101,14 +101,14 @@ public class MemoryController {
@Operation(summary = "查询召回候选列表(含评分详情)") @Operation(summary = "查询召回候选列表(含评分详情)")
@GetMapping("/{agentId}/dreaming/candidates") @GetMapping("/{agentId}/dreaming/candidates")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<Map<String, Object>>> getDreamingCandidates(@PathVariable Long agentId) { public R<List<Map<String, Object>>> getDreamingCandidates(@PathVariable Long agentId) {
return R.ok(recallService.listCandidatesWithDetails(agentId)); return R.ok(recallService.listCandidatesWithDetails(agentId));
} }
@Operation(summary = "查询 DREAMS.md 整合日记") @Operation(summary = "查询 DREAMS.md 整合日记")
@GetMapping("/{agentId}/dreaming/dreams") @GetMapping("/{agentId}/dreaming/dreams")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<Map<String, Object>> getDreams(@PathVariable Long agentId) { public R<Map<String, Object>> getDreams(@PathVariable Long agentId) {
WorkspaceFileEntity file = workspaceFileService.getFile(agentId, "DREAMS.md"); WorkspaceFileEntity file = workspaceFileService.getFile(agentId, "DREAMS.md");
Map<String, Object> result = new LinkedHashMap<>(); Map<String, Object> result = new LinkedHashMap<>();

View File

@ -44,7 +44,7 @@ public class FactController {
@Operation(summary = "List facts for an agent") @Operation(summary = "List facts for an agent")
@GetMapping @GetMapping
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<FactEntity>> listFacts(@PathVariable Long agentId, public R<List<FactEntity>> listFacts(@PathVariable Long agentId,
@RequestParam(required = false) String keyword) { @RequestParam(required = false) String keyword) {
LambdaQueryWrapper<FactEntity> query = new LambdaQueryWrapper<FactEntity>() LambdaQueryWrapper<FactEntity> query = new LambdaQueryWrapper<FactEntity>()
@ -165,7 +165,7 @@ public class FactController {
@Operation(summary = "List unresolved contradictions") @Operation(summary = "List unresolved contradictions")
@GetMapping("/contradictions") @GetMapping("/contradictions")
@RequireWorkspaceRole("viewer") @RequireWorkspaceRole("member")
public R<List<FactContradictionEntity>> listContradictions(@PathVariable Long agentId) { public R<List<FactContradictionEntity>> listContradictions(@PathVariable Long agentId) {
return R.ok(contradictionMapper.selectList( return R.ok(contradictionMapper.selectList(
new LambdaQueryWrapper<FactContradictionEntity>() new LambdaQueryWrapper<FactContradictionEntity>()

View File

@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.*;
import vip.mate.common.result.R; import vip.mate.common.result.R;
import vip.mate.workspace.conversation.TokenUsageService; import vip.mate.workspace.conversation.TokenUsageService;
import vip.mate.workspace.conversation.vo.TokenUsageSummaryVO; import vip.mate.workspace.conversation.vo.TokenUsageSummaryVO;
import vip.mate.workspace.core.annotation.RequireWorkspaceRole;
import java.time.LocalDate; import java.time.LocalDate;
@ -26,6 +27,7 @@ public class TokenUsageController {
@Operation(summary = "获取 Token 使用统计") @Operation(summary = "获取 Token 使用统计")
@GetMapping @GetMapping
@RequireWorkspaceRole("member")
public R<TokenUsageSummaryVO> getSummary( public R<TokenUsageSummaryVO> getSummary(
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate, @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,