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