@downcity/plugins 1.0.153 → 1.0.157
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chat/ChatPlugin.d.ts +2 -10
- package/bin/chat/ChatPlugin.d.ts.map +1 -1
- package/bin/chat/ChatPlugin.js +3 -13
- package/bin/chat/ChatPlugin.js.map +1 -1
- package/bin/chat/PROMPT.direct.d.ts +1 -1
- package/bin/chat/PROMPT.direct.d.ts.map +1 -1
- package/bin/chat/PROMPT.direct.js +1 -1
- package/bin/chat/PROMPT.direct.js.map +1 -1
- package/bin/chat/access/ChatAccessActions.d.ts +11 -0
- package/bin/chat/access/ChatAccessActions.d.ts.map +1 -0
- package/bin/chat/access/ChatAccessActions.js +137 -0
- package/bin/chat/access/ChatAccessActions.js.map +1 -0
- package/bin/chat/access/ChatAccessRuntime.d.ts +17 -0
- package/bin/chat/access/ChatAccessRuntime.d.ts.map +1 -0
- package/bin/chat/access/ChatAccessRuntime.js +31 -0
- package/bin/chat/access/ChatAccessRuntime.js.map +1 -0
- package/bin/chat/access/ChatAccessSchema.d.ts +16 -0
- package/bin/chat/access/ChatAccessSchema.d.ts.map +1 -0
- package/bin/chat/access/ChatAccessSchema.js +99 -0
- package/bin/chat/access/ChatAccessSchema.js.map +1 -0
- package/bin/chat/access/ChatAccessService.d.ts +44 -0
- package/bin/chat/access/ChatAccessService.d.ts.map +1 -0
- package/bin/chat/access/ChatAccessService.js +281 -0
- package/bin/chat/access/ChatAccessService.js.map +1 -0
- package/bin/chat/access/ChatAccessStore.d.ts +67 -0
- package/bin/chat/access/ChatAccessStore.d.ts.map +1 -0
- package/bin/chat/access/ChatAccessStore.js +367 -0
- package/bin/chat/access/ChatAccessStore.js.map +1 -0
- package/bin/chat/accounts/Crypto.d.ts +1 -1
- package/bin/chat/accounts/Crypto.js +1 -1
- package/bin/chat/accounts/Store.d.ts +1 -1
- package/bin/chat/accounts/Store.js +1 -1
- package/bin/chat/channels/BaseChatChannel.d.ts +34 -21
- package/bin/chat/channels/BaseChatChannel.d.ts.map +1 -1
- package/bin/chat/channels/BaseChatChannel.js +71 -58
- package/bin/chat/channels/BaseChatChannel.js.map +1 -1
- package/bin/chat/channels/BaseChatChannelQueue.d.ts +1 -1
- package/bin/chat/channels/BaseChatChannelQueue.d.ts.map +1 -1
- package/bin/chat/channels/BaseChatChannelQueue.js +2 -14
- package/bin/chat/channels/BaseChatChannelQueue.js.map +1 -1
- package/bin/chat/channels/Configuration.d.ts +2 -2
- package/bin/chat/channels/Configuration.d.ts.map +1 -1
- package/bin/chat/channels/Configuration.js +3 -3
- package/bin/chat/channels/Configuration.js.map +1 -1
- package/bin/chat/channels/feishu/Configuration.js +4 -4
- package/bin/chat/channels/feishu/Configuration.js.map +1 -1
- package/bin/chat/channels/feishu/Feishu.d.ts +2 -0
- package/bin/chat/channels/feishu/Feishu.d.ts.map +1 -1
- package/bin/chat/channels/feishu/Feishu.js +8 -7
- package/bin/chat/channels/feishu/Feishu.js.map +1 -1
- package/bin/chat/channels/feishu/FeishuMessageHandler.d.ts +9 -17
- package/bin/chat/channels/feishu/FeishuMessageHandler.d.ts.map +1 -1
- package/bin/chat/channels/feishu/FeishuMessageHandler.js +6 -17
- package/bin/chat/channels/feishu/FeishuMessageHandler.js.map +1 -1
- package/bin/chat/channels/qq/Configuration.js +4 -4
- package/bin/chat/channels/qq/Configuration.js.map +1 -1
- package/bin/chat/channels/qq/QQ.d.ts +2 -0
- package/bin/chat/channels/qq/QQ.d.ts.map +1 -1
- package/bin/chat/channels/qq/QQ.js +8 -7
- package/bin/chat/channels/qq/QQ.js.map +1 -1
- package/bin/chat/channels/qq/QQMessageHandler.d.ts +9 -17
- package/bin/chat/channels/qq/QQMessageHandler.d.ts.map +1 -1
- package/bin/chat/channels/qq/QQMessageHandler.js +7 -25
- package/bin/chat/channels/qq/QQMessageHandler.js.map +1 -1
- package/bin/chat/channels/telegram/Bot.d.ts +12 -0
- package/bin/chat/channels/telegram/Bot.d.ts.map +1 -1
- package/bin/chat/channels/telegram/Bot.js +24 -7
- package/bin/chat/channels/telegram/Bot.js.map +1 -1
- package/bin/chat/channels/telegram/Configuration.js +4 -4
- package/bin/chat/channels/telegram/Configuration.js.map +1 -1
- package/bin/chat/channels/telegram/TelegramMessageHandler.d.ts +9 -17
- package/bin/chat/channels/telegram/TelegramMessageHandler.d.ts.map +1 -1
- package/bin/chat/channels/telegram/TelegramMessageHandler.js +5 -16
- package/bin/chat/channels/telegram/TelegramMessageHandler.js.map +1 -1
- package/bin/chat/runtime/ChatChannelActions.d.ts +3 -2
- package/bin/chat/runtime/ChatChannelActions.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelActions.js +57 -0
- package/bin/chat/runtime/ChatChannelActions.js.map +1 -1
- package/bin/chat/runtime/ChatChannelConfig.d.ts +2 -2
- package/bin/chat/runtime/ChatChannelConfig.js +3 -3
- package/bin/chat/runtime/ChatChannelConfig.js.map +1 -1
- package/bin/chat/runtime/ChatChannelCore.d.ts +2 -2
- package/bin/chat/runtime/ChatChannelCore.js +1 -1
- package/bin/chat/runtime/ChatChannelLifecycle.d.ts +1 -1
- package/bin/chat/runtime/ChatChannelLifecycle.js +1 -1
- package/bin/chat/runtime/PluginPoints.d.ts +0 -24
- package/bin/chat/runtime/PluginPoints.d.ts.map +1 -1
- package/bin/chat/runtime/PluginPoints.js +0 -24
- package/bin/chat/runtime/PluginPoints.js.map +1 -1
- package/bin/chat/runtime/QueuedUserMessage.d.ts.map +1 -1
- package/bin/chat/runtime/QueuedUserMessage.js +0 -2
- package/bin/chat/runtime/QueuedUserMessage.js.map +1 -1
- package/bin/chat/types/ChannelConfiguration.d.ts +4 -4
- package/bin/chat/types/ChannelConfiguration.d.ts.map +1 -1
- package/bin/chat/types/ChatAccess.d.ts +300 -0
- package/bin/chat/types/ChatAccess.d.ts.map +1 -0
- package/bin/chat/types/ChatAccess.js +22 -0
- package/bin/chat/types/ChatAccess.js.map +1 -0
- package/bin/chat/types/ChatPromptContext.d.ts +0 -15
- package/bin/chat/types/ChatPromptContext.d.ts.map +1 -1
- package/bin/index.d.ts +4 -4
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +3 -3
- package/bin/index.js.map +1 -1
- package/bin/skill/Config.d.ts +1 -1
- package/bin/skill/Config.js +1 -1
- package/bin/skill/runtime/Paths.d.ts +1 -1
- package/bin/skill/runtime/Paths.js +1 -1
- package/package.json +6 -4
- package/scripts/chat-access.test.mjs +126 -0
- package/scripts/chat-channel-config.test.mjs +82 -0
- package/src/chat/ChatPlugin.ts +4 -24
- package/src/chat/PROMPT.direct.ts +1 -1
- package/src/chat/PROMPT.direct.ts.txt +1 -1
- package/src/chat/access/ChatAccessActions.ts +159 -0
- package/src/chat/access/ChatAccessRuntime.ts +41 -0
- package/src/chat/access/ChatAccessSchema.ts +104 -0
- package/src/chat/access/ChatAccessService.ts +311 -0
- package/src/chat/access/ChatAccessStore.ts +462 -0
- package/src/chat/accounts/Crypto.ts +1 -1
- package/src/chat/accounts/Store.ts +1 -1
- package/src/chat/channels/BaseChatChannel.ts +86 -80
- package/src/chat/channels/BaseChatChannelQueue.ts +2 -14
- package/src/chat/channels/Configuration.ts +3 -3
- package/src/chat/channels/feishu/Configuration.ts +4 -4
- package/src/chat/channels/feishu/Feishu.ts +11 -9
- package/src/chat/channels/feishu/FeishuMessageHandler.ts +16 -40
- package/src/chat/channels/qq/Configuration.ts +4 -4
- package/src/chat/channels/qq/QQ.ts +11 -9
- package/src/chat/channels/qq/QQMessageHandler.ts +17 -49
- package/src/chat/channels/telegram/Bot.ts +29 -9
- package/src/chat/channels/telegram/Configuration.ts +4 -4
- package/src/chat/channels/telegram/TelegramMessageHandler.ts +15 -39
- package/src/chat/runtime/ChatChannelActions.ts +72 -1
- package/src/chat/runtime/ChatChannelConfig.ts +3 -3
- package/src/chat/runtime/ChatChannelCore.ts +1 -1
- package/src/chat/runtime/ChatChannelLifecycle.ts +1 -1
- package/src/chat/runtime/PluginPoints.ts +0 -24
- package/src/chat/runtime/QueuedUserMessage.ts +0 -2
- package/src/chat/types/ChannelConfiguration.ts +4 -4
- package/src/chat/types/ChatAccess.ts +335 -0
- package/src/chat/types/ChatPromptContext.ts +0 -17
- package/src/index.ts +27 -31
- package/src/skill/Config.ts +1 -1
- package/src/skill/runtime/Paths.ts +1 -1
- package/bin/auth/runtime/AuthorizationConfig.d.ts +0 -41
- package/bin/auth/runtime/AuthorizationConfig.d.ts.map +0 -1
- package/bin/auth/runtime/AuthorizationConfig.js +0 -185
- package/bin/auth/runtime/AuthorizationConfig.js.map +0 -1
- package/bin/auth/runtime/AuthorizationPolicy.d.ts +0 -28
- package/bin/auth/runtime/AuthorizationPolicy.d.ts.map +0 -1
- package/bin/auth/runtime/AuthorizationPolicy.js +0 -124
- package/bin/auth/runtime/AuthorizationPolicy.js.map +0 -1
- package/bin/auth/runtime/AuthorizationStore.d.ts +0 -29
- package/bin/auth/runtime/AuthorizationStore.d.ts.map +0 -1
- package/bin/auth/runtime/AuthorizationStore.js +0 -179
- package/bin/auth/runtime/AuthorizationStore.js.map +0 -1
- package/bin/auth/types/AuthPlugin.d.ts +0 -403
- package/bin/auth/types/AuthPlugin.d.ts.map +0 -1
- package/bin/auth/types/AuthPlugin.js +0 -111
- package/bin/auth/types/AuthPlugin.js.map +0 -1
- package/bin/chat/runtime/ChatAuthorizationRuntime.d.ts +0 -22
- package/bin/chat/runtime/ChatAuthorizationRuntime.d.ts.map +0 -1
- package/bin/chat/runtime/ChatAuthorizationRuntime.js +0 -230
- package/bin/chat/runtime/ChatAuthorizationRuntime.js.map +0 -1
- package/bin/chat/runtime/PluginDispatch.d.ts +0 -43
- package/bin/chat/runtime/PluginDispatch.d.ts.map +0 -1
- package/bin/chat/runtime/PluginDispatch.js +0 -57
- package/bin/chat/runtime/PluginDispatch.js.map +0 -1
- package/src/auth/runtime/AuthorizationConfig.ts +0 -247
- package/src/auth/runtime/AuthorizationPolicy.ts +0 -167
- package/src/auth/runtime/AuthorizationStore.ts +0 -220
- package/src/auth/types/AuthPlugin.ts +0 -540
- package/src/chat/runtime/ChatAuthorizationRuntime.ts +0 -270
- package/src/chat/runtime/PluginDispatch.ts +0 -89
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Access 领域类型。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - Chat Access 只负责外部聊天用户进入当前 Agent 前的准入判定。
|
|
6
|
+
* - 用户唯一身份由 channel、issuer、subject_id 共同确定。
|
|
7
|
+
* - `all` 仅用于管理命令输入,持久化时展开为 direct/group 两条明确记录。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { ChatDispatchChannel } from "@/chat/types/ChatDispatcher.js";
|
|
11
|
+
|
|
12
|
+
/** Chat Plugin 对外暴露的 Access Action。 */
|
|
13
|
+
export const CHAT_ACCESS_ACTIONS = {
|
|
14
|
+
/** 读取 Principal、Grant 和 Request 快照。 */
|
|
15
|
+
snapshot: "access-snapshot",
|
|
16
|
+
/** 批准待处理 Request。 */
|
|
17
|
+
approve: "access-approve",
|
|
18
|
+
/** 拒绝待处理 Request。 */
|
|
19
|
+
deny: "access-deny",
|
|
20
|
+
/** 直接设置已知 Principal 的 Access。 */
|
|
21
|
+
set: "access-set",
|
|
22
|
+
/** 撤销已知 Principal 的 Access。 */
|
|
23
|
+
revoke: "access-revoke",
|
|
24
|
+
} as const;
|
|
25
|
+
|
|
26
|
+
/** Chat Access 支持的消息范围。 */
|
|
27
|
+
export type ChatAccessScope = "direct" | "group";
|
|
28
|
+
|
|
29
|
+
/** Chat Access 管理入口支持的范围。 */
|
|
30
|
+
export type ChatAccessScopeInput = ChatAccessScope | "all";
|
|
31
|
+
|
|
32
|
+
/** Chat Access Grant 效果。 */
|
|
33
|
+
export type ChatAccessEffect = "allow" | "deny";
|
|
34
|
+
|
|
35
|
+
/** Chat Access Request 状态。 */
|
|
36
|
+
export type ChatAccessRequestStatus =
|
|
37
|
+
| "pending"
|
|
38
|
+
| "approved"
|
|
39
|
+
| "denied"
|
|
40
|
+
| "expired";
|
|
41
|
+
|
|
42
|
+
/** Chat Access 判定原因。 */
|
|
43
|
+
export type ChatAccessDecisionReason =
|
|
44
|
+
| "grant_allowed"
|
|
45
|
+
| "grant_denied"
|
|
46
|
+
| "request_pending"
|
|
47
|
+
| "identity_missing";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Chat 平台提供的原始身份与消息来源。
|
|
51
|
+
*/
|
|
52
|
+
export interface ChatAccessIdentityInput {
|
|
53
|
+
/** 当前消息来源渠道。 */
|
|
54
|
+
channel: ChatDispatchChannel;
|
|
55
|
+
/** 当前 Bot/App 的稳定账号标识,不得包含密钥。 */
|
|
56
|
+
issuer: string;
|
|
57
|
+
/** 平台用户稳定 ID。 */
|
|
58
|
+
subject_id: string;
|
|
59
|
+
/** 用户展示名称。 */
|
|
60
|
+
display_name?: string;
|
|
61
|
+
/** 当前平台会话 ID。 */
|
|
62
|
+
chat_id: string;
|
|
63
|
+
/** 当前平台会话类型。 */
|
|
64
|
+
chat_type?: string;
|
|
65
|
+
/** 当前会话展示名称。 */
|
|
66
|
+
chat_title?: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Chat Access 内部规范化主体。
|
|
71
|
+
*/
|
|
72
|
+
export interface ChatAccessPrincipal {
|
|
73
|
+
/** 内部稳定主体 ID。 */
|
|
74
|
+
principal_id: string;
|
|
75
|
+
/** 当前主体来源渠道。 */
|
|
76
|
+
channel: ChatDispatchChannel;
|
|
77
|
+
/** 当前主体所在 Bot/App 账号边界。 */
|
|
78
|
+
issuer: string;
|
|
79
|
+
/** 平台用户稳定 ID。 */
|
|
80
|
+
subject_id: string;
|
|
81
|
+
/** 最近观测到的展示名称。 */
|
|
82
|
+
display_name?: string;
|
|
83
|
+
/** 首次观测时间。 */
|
|
84
|
+
first_seen_at: string;
|
|
85
|
+
/** 最近观测时间。 */
|
|
86
|
+
last_seen_at: string;
|
|
87
|
+
/** 最近发言会话 ID。 */
|
|
88
|
+
last_chat_id?: string;
|
|
89
|
+
/** 最近发言会话类型。 */
|
|
90
|
+
last_chat_type?: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Chat Access Grant。
|
|
95
|
+
*/
|
|
96
|
+
export interface ChatAccessGrant {
|
|
97
|
+
/** Grant 稳定 ID。 */
|
|
98
|
+
grant_id: string;
|
|
99
|
+
/** 关联主体 ID。 */
|
|
100
|
+
principal_id: string;
|
|
101
|
+
/** Grant 适用范围。 */
|
|
102
|
+
scope: ChatAccessScope;
|
|
103
|
+
/** Allow 或 Deny。 */
|
|
104
|
+
effect: ChatAccessEffect;
|
|
105
|
+
/** 执行该变更的可信操作者。 */
|
|
106
|
+
created_by: string;
|
|
107
|
+
/** 创建时间。 */
|
|
108
|
+
created_at: string;
|
|
109
|
+
/** 最近更新时间。 */
|
|
110
|
+
updated_at: string;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Chat Access Request。
|
|
115
|
+
*/
|
|
116
|
+
export interface ChatAccessRequest {
|
|
117
|
+
/** Request 稳定 ID。 */
|
|
118
|
+
request_id: string;
|
|
119
|
+
/** 关联主体 ID。 */
|
|
120
|
+
principal_id: string;
|
|
121
|
+
/** 请求准入范围。 */
|
|
122
|
+
scope: ChatAccessScope;
|
|
123
|
+
/** 触发请求的平台会话 ID。 */
|
|
124
|
+
chat_id: string;
|
|
125
|
+
/** 触发请求的平台会话类型。 */
|
|
126
|
+
chat_type: string;
|
|
127
|
+
/** 当前请求状态。 */
|
|
128
|
+
status: ChatAccessRequestStatus;
|
|
129
|
+
/** 解决该请求的可信操作者。 */
|
|
130
|
+
resolved_by?: string;
|
|
131
|
+
/** 创建时间。 */
|
|
132
|
+
created_at: string;
|
|
133
|
+
/** 最近一次重复请求时间。 */
|
|
134
|
+
last_requested_at: string;
|
|
135
|
+
/** 请求解决时间。 */
|
|
136
|
+
resolved_at?: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 带主体详情的请求展示项。
|
|
141
|
+
*/
|
|
142
|
+
export interface ChatAccessRequestView extends ChatAccessRequest {
|
|
143
|
+
/** 当前请求对应主体。 */
|
|
144
|
+
principal: ChatAccessPrincipal;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* 带 Grant 的主体展示项。
|
|
149
|
+
*/
|
|
150
|
+
export interface ChatAccessPrincipalView {
|
|
151
|
+
/** 当前主体。 */
|
|
152
|
+
principal: ChatAccessPrincipal;
|
|
153
|
+
/** 当前主体所有 Grant。 */
|
|
154
|
+
grants: ChatAccessGrant[];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Chat Access 入站判定结果。
|
|
159
|
+
*/
|
|
160
|
+
export interface ChatAccessDecision {
|
|
161
|
+
/** 是否允许进入 Agent。 */
|
|
162
|
+
allowed: boolean;
|
|
163
|
+
/** 归一化主体 ID;身份缺失时为空字符串。 */
|
|
164
|
+
principal_id: string;
|
|
165
|
+
/** 当前消息对应范围。 */
|
|
166
|
+
scope: ChatAccessScope;
|
|
167
|
+
/** 稳定判定原因。 */
|
|
168
|
+
reason: ChatAccessDecisionReason;
|
|
169
|
+
/** 未批准时创建或复用的 Request ID。 */
|
|
170
|
+
request_id?: string;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* 批准请求输入。
|
|
175
|
+
*/
|
|
176
|
+
export interface ApproveChatAccessRequestInput {
|
|
177
|
+
/** Request ID。 */
|
|
178
|
+
request_id: string;
|
|
179
|
+
/** 可选范围覆盖;默认使用请求自身范围。 */
|
|
180
|
+
scope?: ChatAccessScopeInput;
|
|
181
|
+
/** 执行批准的可信操作者。 */
|
|
182
|
+
operator: string;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* 拒绝请求输入。
|
|
187
|
+
*/
|
|
188
|
+
export interface DenyChatAccessRequestInput {
|
|
189
|
+
/** Request ID。 */
|
|
190
|
+
request_id: string;
|
|
191
|
+
/** 可选范围覆盖;默认使用请求自身范围。 */
|
|
192
|
+
scope?: ChatAccessScopeInput;
|
|
193
|
+
/** 执行拒绝的可信操作者。 */
|
|
194
|
+
operator: string;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* 撤销 Grant 输入。
|
|
199
|
+
*/
|
|
200
|
+
export interface RevokeChatAccessGrantInput {
|
|
201
|
+
/** Principal ID。 */
|
|
202
|
+
principal_id: string;
|
|
203
|
+
/** 要撤销的范围。 */
|
|
204
|
+
scope: ChatAccessScopeInput;
|
|
205
|
+
/** 执行撤销的可信操作者。 */
|
|
206
|
+
operator: string;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** ChatAccessService 构造参数。 */
|
|
210
|
+
export interface ChatAccessServiceOptions {
|
|
211
|
+
/** 当前 Agent 项目根目录。 */
|
|
212
|
+
project_root: string;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** 直接设置 Principal Grant 的输入。 */
|
|
216
|
+
export interface SetChatAccessPrincipalEffectInput {
|
|
217
|
+
/** Principal 稳定 ID。 */
|
|
218
|
+
principal_id: string;
|
|
219
|
+
/** 要设置的 Chat 消息范围。 */
|
|
220
|
+
scope: ChatAccessScopeInput;
|
|
221
|
+
/** 要写入的 Allow/Deny 效果。 */
|
|
222
|
+
effect: ChatAccessEffect;
|
|
223
|
+
/** 执行设置的可信操作者。 */
|
|
224
|
+
operator: string;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Store 新增或更新 Principal 的输入。 */
|
|
228
|
+
export interface UpsertChatAccessPrincipalInput {
|
|
229
|
+
/** Principal 来源渠道。 */
|
|
230
|
+
channel: ChatDispatchChannel;
|
|
231
|
+
/** 当前 Bot/App 的稳定账号边界。 */
|
|
232
|
+
issuer: string;
|
|
233
|
+
/** 平台用户稳定 ID。 */
|
|
234
|
+
subject_id: string;
|
|
235
|
+
/** 最近观测到的展示名称。 */
|
|
236
|
+
display_name?: string;
|
|
237
|
+
/** 最近发言会话 ID。 */
|
|
238
|
+
chat_id?: string;
|
|
239
|
+
/** 最近发言会话类型。 */
|
|
240
|
+
chat_type?: string;
|
|
241
|
+
/** 迁移时提供的首次观测时间。 */
|
|
242
|
+
first_seen_at?: string;
|
|
243
|
+
/** 迁移时提供的最近观测时间。 */
|
|
244
|
+
last_seen_at?: string;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** Store 新增或更新 Grant 的输入。 */
|
|
248
|
+
export interface UpsertChatAccessGrantInput {
|
|
249
|
+
/** 关联 Principal 稳定 ID。 */
|
|
250
|
+
principal_id: string;
|
|
251
|
+
/** Grant 适用范围。 */
|
|
252
|
+
scope: ChatAccessScope;
|
|
253
|
+
/** Grant 的 Allow/Deny 效果。 */
|
|
254
|
+
effect: ChatAccessEffect;
|
|
255
|
+
/** 执行变更的可信操作者。 */
|
|
256
|
+
operator: string;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Store 创建或复用 Request 的输入。 */
|
|
260
|
+
export interface CreateChatAccessRequestInput {
|
|
261
|
+
/** 关联 Principal 稳定 ID。 */
|
|
262
|
+
principal_id: string;
|
|
263
|
+
/** 请求准入范围。 */
|
|
264
|
+
scope: ChatAccessScope;
|
|
265
|
+
/** 触发请求的平台会话 ID。 */
|
|
266
|
+
chat_id: string;
|
|
267
|
+
/** 触发请求的平台会话类型。 */
|
|
268
|
+
chat_type?: string;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** Store 创建或复用 Request 的结果。 */
|
|
272
|
+
export interface CreateChatAccessRequestResult {
|
|
273
|
+
/** 创建或复用后的 Request。 */
|
|
274
|
+
request: ChatAccessRequest;
|
|
275
|
+
/** 本次是否创建了新 Request。 */
|
|
276
|
+
created: boolean;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Store 解决单个 Request 的输入。 */
|
|
280
|
+
export interface ResolveChatAccessRequestStoreInput {
|
|
281
|
+
/** 要解决的 Request ID。 */
|
|
282
|
+
request_id: string;
|
|
283
|
+
/** Request 最终状态。 */
|
|
284
|
+
status: "approved" | "denied";
|
|
285
|
+
/** 执行操作的可信操作者。 */
|
|
286
|
+
operator: string;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** Store 批量解决 Principal pending Request 的输入。 */
|
|
290
|
+
export interface ResolvePendingChatAccessRequestsInput {
|
|
291
|
+
/** 关联 Principal 稳定 ID。 */
|
|
292
|
+
principal_id: string;
|
|
293
|
+
/** 要解决的明确范围集合。 */
|
|
294
|
+
scopes: ChatAccessScope[];
|
|
295
|
+
/** Request 最终状态。 */
|
|
296
|
+
status: "approved" | "denied";
|
|
297
|
+
/** 执行操作的可信操作者。 */
|
|
298
|
+
operator: string;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/** Store 写入审计事件的输入。 */
|
|
302
|
+
export interface InsertChatAccessAuditEventInput {
|
|
303
|
+
/** 可选关联 Principal ID。 */
|
|
304
|
+
principal_id?: string;
|
|
305
|
+
/** 可选关联 Request ID。 */
|
|
306
|
+
request_id?: string;
|
|
307
|
+
/** 稳定审计动作名称。 */
|
|
308
|
+
action: string;
|
|
309
|
+
/** 可选 Chat 消息范围。 */
|
|
310
|
+
scope?: ChatAccessScope;
|
|
311
|
+
/** 可选判定或 Grant 效果。 */
|
|
312
|
+
decision?: string;
|
|
313
|
+
/** 可选可信操作者。 */
|
|
314
|
+
operator?: string;
|
|
315
|
+
/** 可选结构化审计详情。 */
|
|
316
|
+
detail?: Record<string, unknown>;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* 请求列表过滤条件。
|
|
321
|
+
*/
|
|
322
|
+
export interface ListChatAccessRequestsInput {
|
|
323
|
+
/** 可选状态过滤。 */
|
|
324
|
+
status?: ChatAccessRequestStatus;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Chat Access 快照。
|
|
329
|
+
*/
|
|
330
|
+
export interface ChatAccessSnapshot {
|
|
331
|
+
/** 当前 Principal 列表。 */
|
|
332
|
+
principals: ChatAccessPrincipalView[];
|
|
333
|
+
/** 当前 Request 列表。 */
|
|
334
|
+
requests: ChatAccessRequestView[];
|
|
335
|
+
}
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
* - 所有字段均保持可序列化,便于 system prompt 与入站消息文本复用。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type { ChatAuthorizationPermission } from "@/auth/types/AuthPlugin.js";
|
|
11
10
|
import type { ChatDispatchChannel } from "@/chat/types/ChatDispatcher.js";
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -103,22 +102,6 @@ export interface QueuedUserInfoInput {
|
|
|
103
102
|
*/
|
|
104
103
|
username?: string;
|
|
105
104
|
|
|
106
|
-
/**
|
|
107
|
-
* 当前用户在授权系统中的角色 ID。
|
|
108
|
-
*
|
|
109
|
-
* 说明(中文)
|
|
110
|
-
* - 例如 `default`、`member`、`admin`。
|
|
111
|
-
*/
|
|
112
|
-
roleId?: string;
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* 当前用户拥有的权限集合。
|
|
116
|
-
*
|
|
117
|
-
* 说明(中文)
|
|
118
|
-
* - 仅描述授权快照,不代表平台原生权限模型。
|
|
119
|
-
*/
|
|
120
|
-
permissions?: ChatAuthorizationPermission[];
|
|
121
|
-
|
|
122
105
|
/**
|
|
123
106
|
* 当前消息接收时间。
|
|
124
107
|
*
|
package/src/index.ts
CHANGED
|
@@ -32,18 +32,13 @@ export { WorkboardPlugin } from "./workboard/Plugin.js";
|
|
|
32
32
|
export { TaskPlugin } from "./task/TaskPlugin.js";
|
|
33
33
|
export { MemoryPlugin } from "./memory/MemoryPlugin.js";
|
|
34
34
|
export {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
export {
|
|
41
|
-
|
|
42
|
-
CHAT_AUTHORIZATION_CHANNELS,
|
|
43
|
-
CHAT_AUTHORIZATION_POINTS,
|
|
44
|
-
createDefaultChatAuthorizationRoles,
|
|
45
|
-
isChatAuthorizationChannel,
|
|
46
|
-
} from "./auth/types/AuthPlugin.js";
|
|
35
|
+
ChatAccessService,
|
|
36
|
+
is_chat_access_channel,
|
|
37
|
+
resolve_chat_access_scope,
|
|
38
|
+
resolve_chat_access_scopes,
|
|
39
|
+
} from "./chat/access/ChatAccessService.js";
|
|
40
|
+
export { get_chat_access_db_path } from "./chat/access/ChatAccessStore.js";
|
|
41
|
+
export { CHAT_ACCESS_ACTIONS } from "./chat/types/ChatAccess.js";
|
|
47
42
|
|
|
48
43
|
export type {
|
|
49
44
|
ChatChannelAccountListItem,
|
|
@@ -121,22 +116,23 @@ export type {
|
|
|
121
116
|
ImagePluginTextContent,
|
|
122
117
|
} from "./image/types/ImagePlugin.js";
|
|
123
118
|
export type {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
119
|
+
ApproveChatAccessRequestInput,
|
|
120
|
+
ChatAccessDecision,
|
|
121
|
+
ChatAccessDecisionReason,
|
|
122
|
+
ChatAccessEffect,
|
|
123
|
+
ChatAccessGrant,
|
|
124
|
+
ChatAccessIdentityInput,
|
|
125
|
+
ChatAccessPrincipal,
|
|
126
|
+
ChatAccessPrincipalView,
|
|
127
|
+
ChatAccessRequest,
|
|
128
|
+
ChatAccessRequestStatus,
|
|
129
|
+
ChatAccessRequestView,
|
|
130
|
+
ChatAccessScope,
|
|
131
|
+
ChatAccessScopeInput,
|
|
132
|
+
ChatAccessServiceOptions,
|
|
133
|
+
ChatAccessSnapshot,
|
|
134
|
+
DenyChatAccessRequestInput,
|
|
135
|
+
ListChatAccessRequestsInput,
|
|
136
|
+
RevokeChatAccessGrantInput,
|
|
137
|
+
SetChatAccessPrincipalEffectInput,
|
|
138
|
+
} from "./chat/types/ChatAccess.js";
|
package/src/skill/Config.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
5
|
* - roots 分三类:项目内(project)、用户目录(home),以及构造参数路径(custom)
|
|
6
|
-
* - SkillPlugin constructor
|
|
6
|
+
* - SkillPlugin constructor 是唯一配置入口,不读取项目配置文件
|
|
7
7
|
* - 兼容 `<any>/skills` 这种布局:如果 root basename 不是 `skills` 且其子目录 `skills/` 存在,则优先扫描 `<root>/skills`
|
|
8
8
|
*/
|
|
9
9
|
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth 授权配置读写工具。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 静态授权规则直接存放在项目 `.downcity/chat/authorization/config.json`。
|
|
6
|
-
* - 授权核心模型为 role / permission / binding。
|
|
7
|
-
*/
|
|
8
|
-
import type { AgentContext } from "@downcity/agent";
|
|
9
|
-
import type { ChatAuthorizationConfig, ChatAuthorizationChannel, ChatAuthorizationPermission, ChatAuthorizationRole } from "../../auth/types/AuthPlugin.js";
|
|
10
|
-
export declare const DEFAULT_CHAT_AUTHORIZATION_PERMISSIONS: ChatAuthorizationPermission[];
|
|
11
|
-
/**
|
|
12
|
-
* 同步读取当前 agent 的授权配置。
|
|
13
|
-
*/
|
|
14
|
-
export declare function readChatAuthorizationConfigSync(projectRoot: string): ChatAuthorizationConfig;
|
|
15
|
-
/**
|
|
16
|
-
* 读取当前 agent 的授权配置。
|
|
17
|
-
*/
|
|
18
|
-
export declare function readChatAuthorizationConfig(contextOrProjectRoot: Pick<AgentContext, "rootPath"> | string): ChatAuthorizationConfig;
|
|
19
|
-
/**
|
|
20
|
-
* 覆盖写入整份授权配置。
|
|
21
|
-
*/
|
|
22
|
-
export declare function writeChatAuthorizationConfig(params: {
|
|
23
|
-
context: Pick<AgentContext, "rootPath">;
|
|
24
|
-
nextConfig: ChatAuthorizationConfig;
|
|
25
|
-
}): Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* 读取角色列表。
|
|
28
|
-
*/
|
|
29
|
-
export declare function listChatAuthorizationRoles(params: {
|
|
30
|
-
config: ChatAuthorizationConfig;
|
|
31
|
-
}): ChatAuthorizationRole[];
|
|
32
|
-
/**
|
|
33
|
-
* 设置用户角色。
|
|
34
|
-
*/
|
|
35
|
-
export declare function setChatAuthorizationUserRole(params: {
|
|
36
|
-
context: Pick<AgentContext, "rootPath">;
|
|
37
|
-
channel: ChatAuthorizationChannel;
|
|
38
|
-
userId: string;
|
|
39
|
-
roleId: string;
|
|
40
|
-
}): Promise<void>;
|
|
41
|
-
//# sourceMappingURL=AuthorizationConfig.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationConfig.d.ts","sourceRoot":"","sources":["../../../src/auth/runtime/AuthorizationConfig.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EAEtB,MAAM,4BAA4B,CAAC;AASpC,eAAO,MAAM,sCAAsC,EAAE,2BAA2B,EAE/E,CAAC;AAwJF;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,CAE5F;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,oBAAoB,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,MAAM,GAC5D,uBAAuB,CAKzB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACxC,UAAU,EAAE,uBAAuB,CAAC;CACrC,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE,uBAAuB,CAAC;CACjC,GAAG,qBAAqB,EAAE,CAG1B;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACxC,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB"}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth 授权配置读写工具。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 静态授权规则直接存放在项目 `.downcity/chat/authorization/config.json`。
|
|
6
|
-
* - 授权核心模型为 role / permission / binding。
|
|
7
|
-
*/
|
|
8
|
-
import fs from "fs-extra";
|
|
9
|
-
import path from "node:path";
|
|
10
|
-
import { CHAT_AUTHORIZATION_CHANNELS, CHAT_AUTHORIZATION_PERMISSIONS, createDefaultChatAuthorizationRoles, } from "../../auth/types/AuthPlugin.js";
|
|
11
|
-
const CHANNELS = [...CHAT_AUTHORIZATION_CHANNELS];
|
|
12
|
-
export const DEFAULT_CHAT_AUTHORIZATION_PERMISSIONS = [
|
|
13
|
-
...CHAT_AUTHORIZATION_PERMISSIONS,
|
|
14
|
-
];
|
|
15
|
-
function normalizeText(value) {
|
|
16
|
-
const text = String(value || "").trim();
|
|
17
|
-
return text ? text : undefined;
|
|
18
|
-
}
|
|
19
|
-
function normalizePermissionList(values) {
|
|
20
|
-
const allowed = new Set(DEFAULT_CHAT_AUTHORIZATION_PERMISSIONS);
|
|
21
|
-
if (!Array.isArray(values))
|
|
22
|
-
return [];
|
|
23
|
-
return [
|
|
24
|
-
...new Set(values
|
|
25
|
-
.map((value) => normalizeText(value))
|
|
26
|
-
.filter((value) => Boolean(value && allowed.has(value)))),
|
|
27
|
-
];
|
|
28
|
-
}
|
|
29
|
-
function buildDefaultRole(roleId) {
|
|
30
|
-
return createDefaultChatAuthorizationRoles()[roleId];
|
|
31
|
-
}
|
|
32
|
-
function normalizeRoleMap(input) {
|
|
33
|
-
const defaultRoles = createDefaultChatAuthorizationRoles();
|
|
34
|
-
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
35
|
-
return defaultRoles;
|
|
36
|
-
const roles = {};
|
|
37
|
-
for (const [rawRoleId, rawRole] of Object.entries(input)) {
|
|
38
|
-
const roleId = normalizeText(rawRoleId);
|
|
39
|
-
if (!roleId)
|
|
40
|
-
continue;
|
|
41
|
-
const roleObj = rawRole && typeof rawRole === "object" && !Array.isArray(rawRole)
|
|
42
|
-
? rawRole
|
|
43
|
-
: null;
|
|
44
|
-
if (!roleObj)
|
|
45
|
-
continue;
|
|
46
|
-
const builtinRole = defaultRoles[roleId];
|
|
47
|
-
roles[roleId] = {
|
|
48
|
-
roleId,
|
|
49
|
-
name: normalizeText(roleObj.name) || builtinRole?.name || roleId,
|
|
50
|
-
...(normalizeText(roleObj.description) || builtinRole?.description
|
|
51
|
-
? {
|
|
52
|
-
description: normalizeText(roleObj.description) || builtinRole?.description || undefined,
|
|
53
|
-
}
|
|
54
|
-
: {}),
|
|
55
|
-
permissions: normalizePermissionList(roleObj.permissions),
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
if (Object.keys(roles).length === 0)
|
|
59
|
-
return defaultRoles;
|
|
60
|
-
if (!roles.default)
|
|
61
|
-
roles.default = buildDefaultRole("default");
|
|
62
|
-
return roles;
|
|
63
|
-
}
|
|
64
|
-
function normalizeBindingMap(input, roles) {
|
|
65
|
-
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
66
|
-
return {};
|
|
67
|
-
const out = {};
|
|
68
|
-
for (const [rawId, rawRoleId] of Object.entries(input)) {
|
|
69
|
-
const entityId = normalizeText(rawId);
|
|
70
|
-
const roleId = normalizeText(rawRoleId);
|
|
71
|
-
if (!entityId || !roleId || !roles[roleId])
|
|
72
|
-
continue;
|
|
73
|
-
out[entityId] = roleId;
|
|
74
|
-
}
|
|
75
|
-
return out;
|
|
76
|
-
}
|
|
77
|
-
function normalizeChannelConfig(input, roles) {
|
|
78
|
-
const raw = input && typeof input === "object" && !Array.isArray(input)
|
|
79
|
-
? input
|
|
80
|
-
: {};
|
|
81
|
-
const defaultUserRoleId = normalizeText(raw.defaultUserRoleId) || "default";
|
|
82
|
-
return {
|
|
83
|
-
defaultUserRoleId: roles[defaultUserRoleId] ? defaultUserRoleId : "default",
|
|
84
|
-
userRoles: normalizeBindingMap(raw.userRoles, roles),
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
function normalizeAuthorizationConfig(input) {
|
|
88
|
-
const raw = input && typeof input === "object" && !Array.isArray(input)
|
|
89
|
-
? input
|
|
90
|
-
: {};
|
|
91
|
-
const roles = normalizeRoleMap(raw.roles);
|
|
92
|
-
const channels = {};
|
|
93
|
-
for (const channel of CHANNELS) {
|
|
94
|
-
channels[channel] = normalizeChannelConfig(raw.channels?.[channel], roles);
|
|
95
|
-
}
|
|
96
|
-
return { roles, channels };
|
|
97
|
-
}
|
|
98
|
-
function cloneAuthorizationConfig(input) {
|
|
99
|
-
return normalizeAuthorizationConfig(input ? JSON.parse(JSON.stringify(input)) : {});
|
|
100
|
-
}
|
|
101
|
-
function getChatAuthorizationConfigPath(projectRoot) {
|
|
102
|
-
return path.join(projectRoot, ".downcity", "chat", "authorization", "config.json");
|
|
103
|
-
}
|
|
104
|
-
function readAuthorizationConfigFromProjectRoot(projectRoot) {
|
|
105
|
-
const normalizedProjectRoot = normalizeText(projectRoot);
|
|
106
|
-
if (!normalizedProjectRoot)
|
|
107
|
-
return normalizeAuthorizationConfig({});
|
|
108
|
-
const file = getChatAuthorizationConfigPath(normalizedProjectRoot);
|
|
109
|
-
if (!fs.existsSync(file))
|
|
110
|
-
return normalizeAuthorizationConfig({});
|
|
111
|
-
try {
|
|
112
|
-
return normalizeAuthorizationConfig(fs.readJsonSync(file));
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return normalizeAuthorizationConfig({});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
async function writeAuthorizationConfigToPlatform(params) {
|
|
119
|
-
const normalizedProjectRoot = normalizeText(params.projectRoot);
|
|
120
|
-
if (!normalizedProjectRoot)
|
|
121
|
-
throw new Error("projectRoot is required");
|
|
122
|
-
const file = getChatAuthorizationConfigPath(normalizedProjectRoot);
|
|
123
|
-
await fs.ensureDir(path.dirname(file));
|
|
124
|
-
await fs.writeJson(file, normalizeAuthorizationConfig(params.nextConfig), {
|
|
125
|
-
spaces: 2,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
function ensureChannelConfig(config, channel) {
|
|
129
|
-
config.roles = normalizeRoleMap(config.roles);
|
|
130
|
-
config.channels ??= {};
|
|
131
|
-
config.channels[channel] = normalizeChannelConfig(config.channels[channel], config.roles);
|
|
132
|
-
return config.channels[channel];
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* 同步读取当前 agent 的授权配置。
|
|
136
|
-
*/
|
|
137
|
-
export function readChatAuthorizationConfigSync(projectRoot) {
|
|
138
|
-
return readAuthorizationConfigFromProjectRoot(projectRoot);
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* 读取当前 agent 的授权配置。
|
|
142
|
-
*/
|
|
143
|
-
export function readChatAuthorizationConfig(contextOrProjectRoot) {
|
|
144
|
-
if (typeof contextOrProjectRoot === "string") {
|
|
145
|
-
return readAuthorizationConfigFromProjectRoot(contextOrProjectRoot);
|
|
146
|
-
}
|
|
147
|
-
return readAuthorizationConfigFromProjectRoot(contextOrProjectRoot.rootPath);
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* 覆盖写入整份授权配置。
|
|
151
|
-
*/
|
|
152
|
-
export async function writeChatAuthorizationConfig(params) {
|
|
153
|
-
await writeAuthorizationConfigToPlatform({
|
|
154
|
-
projectRoot: params.context.rootPath,
|
|
155
|
-
nextConfig: params.nextConfig,
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* 读取角色列表。
|
|
160
|
-
*/
|
|
161
|
-
export function listChatAuthorizationRoles(params) {
|
|
162
|
-
const config = normalizeAuthorizationConfig(params.config);
|
|
163
|
-
return Object.values(config.roles || {}).sort((a, b) => a.roleId.localeCompare(b.roleId));
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* 设置用户角色。
|
|
167
|
-
*/
|
|
168
|
-
export async function setChatAuthorizationUserRole(params) {
|
|
169
|
-
const userId = normalizeText(params.userId);
|
|
170
|
-
const roleId = normalizeText(params.roleId);
|
|
171
|
-
if (!userId || !roleId)
|
|
172
|
-
throw new Error("userId and roleId are required");
|
|
173
|
-
const authorization = cloneAuthorizationConfig(readAuthorizationConfigFromProjectRoot(params.context.rootPath));
|
|
174
|
-
authorization.roles = normalizeRoleMap(authorization.roles);
|
|
175
|
-
const channelConfig = ensureChannelConfig(authorization, params.channel);
|
|
176
|
-
if (!authorization.roles?.[roleId])
|
|
177
|
-
throw new Error(`Unknown roleId: ${roleId}`);
|
|
178
|
-
channelConfig.userRoles ??= {};
|
|
179
|
-
channelConfig.userRoles[userId] = roleId;
|
|
180
|
-
await writeAuthorizationConfigToPlatform({
|
|
181
|
-
projectRoot: params.context.rootPath,
|
|
182
|
-
nextConfig: authorization,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
//# sourceMappingURL=AuthorizationConfig.js.map
|