forked from ChaiHao/BPOS-MVP
治理台按 §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
165 lines
6.7 KiB
TypeScript
165 lines
6.7 KiB
TypeScript
/**
|
||
* 治理台的分级页面路由 —— 自原型 `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;
|
||
};
|