Files
JX-BPOS/apps/web/src/shared/gov/gov-route.ts
T
ChaiHaoandClaude Opus 5 a9cd6d10c7 M6(2/n): 治理台九功能 + SSE 订阅层 + 读/治分权
治理台按 §9.1 拆成九个 gov-* feature,共用件落 shared/gov:
  · 外壳(左轨/顶栏/面包屑/页签/整页下钻)自原型 Governance.tsx 平移,
    DOM 与 g-* 类名原样;路由状态即应用状态,区/页签/下钻栈全编码进 hash 可深链
  · 编排画布 diagram-js 画布件 1:1 平移(flow-layout/flow-node-paint/FlowDiagram),
    新增 pkg-to-graph 把 ProcessPackage 转成画布图模型;统一报价 v1 全图 12 节点 15 边渲染通过
  · 后端补四路由:审批单 / 工作流下钻 / 通道实例 / 度量仪表

SSE 订阅层(§9.2):app 层单一连接,按信封目标失效缓存;
组件不再自行轮询(去掉 refetchInterval)。广播只说「哪个目标动了」,不带业务载荷,
且在投递已落库已送达之后才发 —— 不是第二条投递链路。

两处实质修正:
  · 治理路由一律要 govern → 读路由改要 read。客体三类 × 动作三种的分法就是为此:
    BD 有 task:read 能看在途、动不了控制事件;一律 govern 等于把三种动作压成一种
  · 控制事件/恢复/改派原记为 engine-transition(归机器产出)→ 新增 control 条目种类,
    归人裁决侧。归侧是按动作类型的纯推导,所以「谁干的」必须体现在 kind 上;
    否则人的叫停会被算进自主率的机器分子

判据 ⑩ 治理台一半跑通:在途监控 / 叫停 / 恢复,治理动作留痕可查。
无权查看不再画成空清单,按岗位说明缺哪一项。

gates: tsc / eslint / depcruise(286 模块)/ api-report / 360 测试 全绿

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
2026-07-27 03:28:40 +08:00

165 lines
6.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 治理台的分级页面路由 —— 自原型 `Governance.tsx` 第 25–90 行平移。
*
* 「**不用抽屉、不用弹窗**:每一层内容都有自己的页面。」
* 区 → 对象 → 子维度 → 元素,顶部面包屑可回跳任意一级,Esc / 返回退一级。
*/
export type Route =
| { k: 'wf'; id: string }
| { k: 'task'; id: string }
| { k: 'tasklog'; id: string }
| { k: 'apr'; id: string }
| { k: 'emp'; id: string }
| { k: 'role'; id: string }
| { k: 'pkg'; id: string }
| { k: 'edges'; id: string }
| { k: 'trigger'; id: string }
| { k: 'act'; id: string }
| { k: 'tool'; id: string }
| { k: 'obj'; id: string }
| { k: 'mem'; id: string }
| { k: 'llm'; id: string }
| { k: 'chan'; id: string };
/** 九功能 —— 每一项对应架构中的一件,治理台由此覆盖全部五层 */
export const GOV_ZONES = ['tasks', 'people', 'workflows', 'triggers', 'library', 'tools', 'data', 'memory', 'system'] as const;
export type GovZone = (typeof GOV_ZONES)[number];
export const ZONES: ReadonlyArray<{ key: GovZone; label: string; icon: string }> = [
{ key: 'tasks', label: '任务', icon: 'activity' },
{ key: 'people', label: '员工', icon: 'users' },
{ key: 'workflows', label: '工作流', icon: 'workflow' },
{ key: 'triggers', label: '触发器', icon: 'zap' },
{ key: 'library', label: '活动库', icon: 'boxes' },
{ key: 'tools', label: '工具', icon: 'wrench' },
{ key: 'data', label: '数据', icon: 'database' },
{ key: 'memory', label: '记忆', icon: 'layers' },
{ key: 'system', label: '系统', icon: 'settings' },
];
/** 区元信息:标题 / 定位说明 / 主色 —— 说明文取自两卷规范,不是装饰 */
export const ZM: Readonly<Record<GovZone, { title: string; desc: string; accent: string; icon: string }>> = {
tasks: {
title: '任务管理',
icon: 'activity',
accent: 'linear-gradient(140deg,#3370ff,#245bdb)',
desc: '运行态:任务与工作流两级运行时实例的在途监控、干预与控制——任务 = 活动被调起的一次运行,恰有一名负责人;工作流 = 流程包的一次运行,状态由流内各任务聚合投影而来。审批点卡到审批人工位,是流程层的人裁节点、不是任务。控制事件三种语义:暂停可恢复、叫停归负责人、终止级联作废。治理不改定义。',
},
people: {
title: '员工管理',
icon: 'users',
accent: 'linear-gradient(140deg,#2bc7d4,#0e9fd8)',
desc: '员工负载、岗位与授权。权限按岗位授予:客体三类 × 动作三种;停用前置检查——在途任务与待答卡须先改派完毕。',
},
workflows: {
title: '工作流管理',
icon: 'workflow',
accent: 'linear-gradient(140deg,#4954e6,#3a44c9)',
desc: '设计态:流程包的五要素编排(活动 · 审批点 · 网关 · 触发器 · 流程包)与版本。编排即定契约——连线即映射、画图即校验,边不闭合不得发布。工作流 = 流程包的运行时实例。',
},
triggers: {
title: '触发器配置',
icon: 'zap',
accent: 'linear-gradient(140deg,#ff8800,#de7802)',
desc: '起单时机的规则清单:周期 / 事件 / 登记三类。触发器与流程包平级——不入包结构、不随包版本,增删启停不改任何版本。',
},
library: {
title: '活动库管理',
icon: 'boxes',
accent: 'linear-gradient(140deg,#0aa294,#0a6a64)',
desc: '已安装活动的资产货架:活动是任务的定义——编排引用一个活动,运行时就长出一个任务。审批点与网关是系统内置要素,零开发、不入库。业务分类 × 活动类型两维,每活动两条版本序列。',
},
tools: {
title: '工具管理',
icon: 'wrench',
accent: 'linear-gradient(140deg,#7f3bf5,#5b21cf)',
desc: '能力目录:功能工具按效应等级分列——读类过程中自由调用,写类只登记动作意向、放行后落地。密钥只存治理台。',
},
data: {
title: '数据管理',
icon: 'database',
accent: 'linear-gradient(140deg,#0e9fd8,#245bdb)',
desc: '域 × 对象的承载全景:声明物化(最大化合并、只增不破坏)与调用接入(事实源在外)。数据可以自生长,权力不可以自生长。',
},
memory: {
title: '记忆管理',
icon: 'layers',
accent: 'linear-gradient(140deg,#f14ba9,#c92d86)',
desc: '度量仪表 + 进化队列:自主率与纠正率成对读,复合为有效自主率。候选增量必经回放与人放行才成为模型。',
},
system: {
title: '系统管理',
icon: 'settings',
accent: 'linear-gradient(140deg,#46586a,#2b3644)',
desc: '系统边界的配置面:LLM 实例(名称间接层)、通道实例(归属键规则与默认认领岗位)、系统用途模型绑定。',
},
};
/** 区内页签:一页一个维度 —— 不把四种维度摞在同一屏 */
export const TABS: Readonly<Record<GovZone, ReadonlyArray<{ key: string; label: string; ico: string }>>> = {
tasks: [
{ key: 'board', label: '运行看板', ico: 'activity' },
{ key: 'list', label: '任务', ico: 'list-checks' },
{ key: 'apr', label: '审批单', ico: 'shield-check' },
{ key: 'todo', label: '需处置', ico: 'flag' },
],
people: [
{ key: 'emp', label: '员工', ico: 'users' },
{ key: 'roles', label: '岗位授权', ico: 'key' },
],
workflows: [{ key: 'pkgs', label: '流程包', ico: 'boxes' }],
triggers: [{ key: 'rules', label: '起单规则', ico: 'zap' }],
library: [{ key: 'shelf', label: '活动货架', ico: 'boxes' }],
tools: [{ key: 'catalog', label: '能力目录', ico: 'wrench' }],
data: [{ key: 'domains', label: '数据对象', ico: 'database' }],
memory: [
{ key: 'metrics', label: '度量仪表', ico: 'gauge' },
{ key: 'layers', label: '活动记忆', ico: 'layers' },
],
system: [
{ key: 'llm', label: 'LLM 实例', ico: 'cpu' },
{ key: 'chan', label: '通道实例', ico: 'mail' },
],
};
export function routeLabel(r: Route): string {
switch (r.k) {
case 'wf':
return '工作流';
case 'task':
return '任务';
case 'tasklog':
return '任务日志';
case 'apr':
return '审批单';
case 'emp':
return '员工';
case 'role':
return '岗位授权';
case 'pkg':
return '流程包';
case 'edges':
return '边映射';
case 'trigger':
return '触发器';
case 'act':
return '活动';
case 'tool':
return '工具';
case 'obj':
return '数据对象';
case 'mem':
return '活动记忆';
case 'llm':
return 'LLM 实例';
case 'chan':
return '通道实例';
}
}
export type Nav = {
push: (r: Route) => void;
jump: (z: GovZone, tab: string, r?: Route) => void;
};