/** * 治理台取数 —— 每个查询一把键,写动作后按键失效。 * 前端零过程状态:所有画面都是服务端投影的函数,刷新即重建(§9.2)。 */ import { useQuery } from '@tanstack/react-query'; import type { UseQueryResult } from '@tanstack/react-query'; import type { ClosureReport, GovActivitiesOutput, GovApprovalsOutput, GovChannelsOutput, GovGrantsOutput, GovLedgerPageOutput, GovLlmOutput, GovMemoryOutput, GovMetricsOutput, GovObjectsOutput, GovPackagesOutput, GovStaffOutput, GovTaskLogOutput, GovTasksOutput, GovToolsOutput, GovTriggersOutput, GovWorkGroupsOutput, GovWorkflowOutput, ProcessPackage, } from '@contracts'; import { browseLedgerRoute, govMetricsRoute, govTaskLogRoute, govWorkflowRoute, listActivitiesRoute, listActivityMemoryRoute, listApprovalsRoute, listChannelsRoute, listGovTasksRoute, listGrantsRoute, listLedgerObjectsRoute, listLlmInstancesRoute, listProcessPackagesRoute, listStaffRoute, listToolsRoute, listTriggersRoute, listWorkGroupsRoute, validateProcessRoute, } from '@contracts'; import { call } from '@web-shared/typed-fetch.ts'; export type GovTasks = GovTasksOutput; export type GovApprovals = GovApprovalsOutput; export type GovStaff = GovStaffOutput; export type GovActivities = GovActivitiesOutput; export type GovTools = GovToolsOutput; export type GovObjects = GovObjectsOutput; export type GovLedgerPage = GovLedgerPageOutput; export type GovMemory = GovMemoryOutput; export type GovMetrics = GovMetricsOutput; export type GovChannels = GovChannelsOutput; export type GovLlm = GovLlmOutput; export type GovWorkflow = GovWorkflowOutput; export type GovTaskLog = GovTaskLogOutput; export type GovGrants = GovGrantsOutput; /** `enabled: false` 供设计中心用 —— 那一面不看运行态,别去要一份自己无权也无用的数据 */ export const useGovTasks = (opts?: { enabled?: boolean }): UseQueryResult => useQuery({ queryKey: ['gov', 'tasks'], queryFn: () => call(listGovTasksRoute), enabled: opts?.enabled ?? true, }); export const useGovApprovals = (): UseQueryResult => useQuery({ queryKey: ['gov', 'approvals'], queryFn: () => call(listApprovalsRoute) }); export const useGovStaff = (): UseQueryResult => useQuery({ queryKey: ['gov', 'staff'], queryFn: () => call(listStaffRoute) }); export const useGovGrants = (positionId: string | undefined): UseQueryResult => useQuery({ queryKey: ['gov', 'grants', positionId], queryFn: () => call(listGrantsRoute, { params: { positionId: positionId! } }), enabled: positionId !== undefined, }); export const useGovPackages = (): UseQueryResult => useQuery({ queryKey: ['gov', 'process'], queryFn: () => call(listProcessPackagesRoute) }); /** * 每个包一份闭合报告 —— 磁贴上的「边 n/m」、待补清单、发布门、驾驶舱的未闭合草稿数都读它。 * 一处算、多处读:两张首页各算一遍就会各说各话。 */ export const useGovPkgReports = ( packages: readonly ProcessPackage[], ): UseQueryResult> => useQuery({ queryKey: ['gov', 'process-reports', packages.map((p) => `${p.id}@${p.version}`).join(',')], enabled: packages.length > 0, queryFn: async () => { const entries = await Promise.all( packages.map( async (p) => [`${p.id}@${p.version}`, await call(validateProcessRoute, { body: { pkg: p } })] as const, ), ); return new Map(entries); }, }); export type GovWorkGroups = GovWorkGroupsOutput; export const useGovWorkGroups = (): UseQueryResult => useQuery({ queryKey: ['gov', 'work-groups'], queryFn: () => call(listWorkGroupsRoute) }); export const useGovTriggers = (): UseQueryResult => useQuery({ queryKey: ['gov', 'triggers'], queryFn: () => call(listTriggersRoute) }); export const useGovActivities = (): UseQueryResult => useQuery({ queryKey: ['gov', 'activities'], queryFn: () => call(listActivitiesRoute) }); export const useGovTools = (): UseQueryResult => useQuery({ queryKey: ['gov', 'tools'], queryFn: () => call(listToolsRoute) }); export const useGovObjects = (opts?: { enabled?: boolean }): UseQueryResult => useQuery({ queryKey: ['gov', 'objects'], queryFn: () => call(listLedgerObjectsRoute), enabled: opts?.enabled ?? true, }); export const useGovLedger = (domain: string | undefined, object: string | undefined): UseQueryResult => useQuery({ queryKey: ['gov', 'ledger', domain, object], queryFn: () => call(browseLedgerRoute, { params: { domain: domain!, object: object! } }), enabled: domain !== undefined && object !== undefined, }); export const useGovMemory = (activityId: string | undefined): UseQueryResult => useQuery({ queryKey: ['gov', 'memory', activityId], queryFn: () => call(listActivityMemoryRoute, { params: { activityId: activityId! } }), enabled: activityId !== undefined, }); export const useGovMetrics = (): UseQueryResult => useQuery({ queryKey: ['gov', 'metrics'], queryFn: () => call(govMetricsRoute) }); export const useGovChannels = (): UseQueryResult => useQuery({ queryKey: ['gov', 'channels'], queryFn: () => call(listChannelsRoute) }); export const useGovLlm = (): UseQueryResult => useQuery({ queryKey: ['gov', 'llm'], queryFn: () => call(listLlmInstancesRoute) }); export const useGovWorkflow = (id: string): UseQueryResult => useQuery({ queryKey: ['gov', 'workflow', id], queryFn: () => call(govWorkflowRoute, { params: { id } }) }); export const useGovTaskLog = (taskId: string): UseQueryResult => useQuery({ queryKey: ['gov', 'tasklog', taskId], queryFn: () => call(govTaskLogRoute, { params: { taskId } }) });