im_wower
·
2026-03-21
actions.ts
1export type AuthResourceBinding = "none" | "controller" | "worker";
2
3export const AUTH_ACTIONS = [
4 "controllers.heartbeat",
5 "leader.acquire",
6 "tasks.create",
7 "tasks.plan",
8 "tasks.claim",
9 "steps.heartbeat",
10 "steps.checkpoint",
11 "steps.complete",
12 "steps.fail",
13 "system.pause",
14 "system.resume",
15 "system.drain",
16 "system.state.read",
17 "tasks.read",
18 "tasks.logs.read",
19 "runs.read",
20 "maintenance.promote",
21 "maintenance.demote"
22] as const;
23
24export type AuthAction = (typeof AUTH_ACTIONS)[number];
25
26export interface AuthActionDescriptor {
27 summary: string;
28 mutatesState: boolean;
29 resourceBinding: AuthResourceBinding;
30}
31
32export const AUTH_ACTION_DESCRIPTORS = {
33 "controllers.heartbeat": {
34 summary: "controller 上报心跳并刷新自身活跃状态",
35 mutatesState: true,
36 resourceBinding: "controller"
37 },
38 "leader.acquire": {
39 summary: "controller 获取或续租 leader lease",
40 mutatesState: true,
41 resourceBinding: "controller"
42 },
43 "tasks.create": {
44 summary: "通过可见 control 会话创建新 task",
45 mutatesState: true,
46 resourceBinding: "none"
47 },
48 "tasks.plan": {
49 summary: "leader conductor 持久化已验收的 plan",
50 mutatesState: true,
51 resourceBinding: "controller"
52 },
53 "tasks.claim": {
54 summary: "controller 领取待规划 task 或下一个 runnable step",
55 mutatesState: true,
56 resourceBinding: "controller"
57 },
58 "steps.heartbeat": {
59 summary: "worker 为已分配 step 持续续心跳",
60 mutatesState: true,
61 resourceBinding: "worker"
62 },
63 "steps.checkpoint": {
64 summary: "worker 为已分配 step 写 checkpoint",
65 mutatesState: true,
66 resourceBinding: "worker"
67 },
68 "steps.complete": {
69 summary: "worker 标记已分配 step 完成",
70 mutatesState: true,
71 resourceBinding: "worker"
72 },
73 "steps.fail": {
74 summary: "worker 标记已分配 step 失败",
75 mutatesState: true,
76 resourceBinding: "worker"
77 },
78 "system.pause": {
79 summary: "暂停系统调度",
80 mutatesState: true,
81 resourceBinding: "none"
82 },
83 "system.resume": {
84 summary: "恢复系统调度",
85 mutatesState: true,
86 resourceBinding: "none"
87 },
88 "system.drain": {
89 summary: "进入 drain 模式,停止新分配",
90 mutatesState: true,
91 resourceBinding: "none"
92 },
93 "system.state.read": {
94 summary: "读取当前系统状态、队列和运行态汇总",
95 mutatesState: false,
96 resourceBinding: "none"
97 },
98 "tasks.read": {
99 summary: "读取 task 详情",
100 mutatesState: false,
101 resourceBinding: "none"
102 },
103 "tasks.logs.read": {
104 summary: "读取 task 或 run 关联日志",
105 mutatesState: false,
106 resourceBinding: "none"
107 },
108 "runs.read": {
109 summary: "读取 run 详情",
110 mutatesState: false,
111 resourceBinding: "none"
112 },
113 "maintenance.promote": {
114 summary: "执行主备切换或 promote 类维护操作",
115 mutatesState: true,
116 resourceBinding: "none"
117 },
118 "maintenance.demote": {
119 summary: "执行 demote 或维护降级操作",
120 mutatesState: true,
121 resourceBinding: "none"
122 }
123} satisfies Record<AuthAction, AuthActionDescriptor>;
124
125export function isReadAction(action: AuthAction): boolean {
126 return !AUTH_ACTION_DESCRIPTORS[action].mutatesState;
127}