@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
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChatAuthorizationRuntime:ChatPlugin 内置授权能力。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 授权能力归属于 ChatPlugin,不再作为独立 plugin 注册。
|
|
6
|
-
* - chat runtime 仍通过通用 plugin hook / resolve 点调用,保持执行链路统一。
|
|
7
|
-
* - action 名称统一带 `authorization-` 前缀,避免和 chat 会话动作混淆。
|
|
8
|
-
*/
|
|
9
|
-
import { createAction } from "@downcity/agent";
|
|
10
|
-
import { z } from "zod";
|
|
11
|
-
import { CHAT_PLUGIN_POINTS } from "../../chat/runtime/PluginPoints.js";
|
|
12
|
-
import { CHAT_AUTHORIZATION_ACTIONS, CHAT_AUTHORIZATION_CATALOG, } from "../../auth/types/AuthPlugin.js";
|
|
13
|
-
import { readChatAuthorizationConfig, setChatAuthorizationUserRole, writeChatAuthorizationConfig, } from "../../auth/runtime/AuthorizationConfig.js";
|
|
14
|
-
import { evaluateIncomingChatAuthorization, resolveAuthorizedUserRole, } from "../../auth/runtime/AuthorizationPolicy.js";
|
|
15
|
-
import { readAuthorizationSnapshot, recordObservedAuthorizationPrincipal, } from "../../auth/runtime/AuthorizationStore.js";
|
|
16
|
-
function toChannel(value) {
|
|
17
|
-
const text = String(value || "").trim().toLowerCase();
|
|
18
|
-
if (text === "telegram" || text === "feishu" || text === "qq")
|
|
19
|
-
return text;
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
function toRecord(value) {
|
|
23
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
24
|
-
return {};
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
function toEvaluateInput(payload) {
|
|
28
|
-
const channel = toChannel(payload.channel);
|
|
29
|
-
if (!channel) {
|
|
30
|
-
throw new Error("chat.authorizeIncoming requires a valid channel");
|
|
31
|
-
}
|
|
32
|
-
return {
|
|
33
|
-
channel,
|
|
34
|
-
chatId: String(payload.chatId || "").trim(),
|
|
35
|
-
...(typeof payload.chatType === "string" ? { chatType: payload.chatType.trim() } : {}),
|
|
36
|
-
...(typeof payload.userId === "string" ? { userId: payload.userId.trim() } : {}),
|
|
37
|
-
...(typeof payload.username === "string" ? { username: payload.username.trim() } : {}),
|
|
38
|
-
...(typeof payload.chatTitle === "string" ? { chatTitle: payload.chatTitle.trim() } : {}),
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
function toSnapshotData(snapshot) {
|
|
42
|
-
return {
|
|
43
|
-
catalog: CHAT_AUTHORIZATION_CATALOG,
|
|
44
|
-
config: snapshot.config,
|
|
45
|
-
users: snapshot.users,
|
|
46
|
-
chats: snapshot.chats,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 创建 ChatPlugin 内置授权 hooks。
|
|
51
|
-
*/
|
|
52
|
-
export function createChatAuthorizationHooks() {
|
|
53
|
-
return {
|
|
54
|
-
guard: {
|
|
55
|
-
[CHAT_PLUGIN_POINTS.authorizeIncoming]: [
|
|
56
|
-
async ({ context, value }) => {
|
|
57
|
-
const input = value && typeof value === "object" && !Array.isArray(value)
|
|
58
|
-
? value
|
|
59
|
-
: {};
|
|
60
|
-
const evaluateInput = toEvaluateInput(input);
|
|
61
|
-
const authorizationConfig = readChatAuthorizationConfig(context);
|
|
62
|
-
const result = evaluateIncomingChatAuthorization({
|
|
63
|
-
config: context.config,
|
|
64
|
-
channel: evaluateInput.channel,
|
|
65
|
-
input: evaluateInput,
|
|
66
|
-
authorizationConfig,
|
|
67
|
-
});
|
|
68
|
-
if (result.decision !== "allow") {
|
|
69
|
-
throw new Error(result.reason || "chat authorization blocked");
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
],
|
|
73
|
-
},
|
|
74
|
-
effect: {
|
|
75
|
-
[CHAT_PLUGIN_POINTS.observePrincipal]: [
|
|
76
|
-
async ({ context, value }) => {
|
|
77
|
-
const input = toRecord(value);
|
|
78
|
-
const channel = toChannel(input.channel);
|
|
79
|
-
if (!channel) {
|
|
80
|
-
throw new Error("chat.observePrincipal requires a valid channel");
|
|
81
|
-
}
|
|
82
|
-
await recordObservedAuthorizationPrincipal({
|
|
83
|
-
context,
|
|
84
|
-
channel,
|
|
85
|
-
chatId: String(input.chatId || "").trim(),
|
|
86
|
-
...(typeof input.chatType === "string"
|
|
87
|
-
? { chatType: input.chatType.trim() }
|
|
88
|
-
: {}),
|
|
89
|
-
...(typeof input.chatTitle === "string"
|
|
90
|
-
? { chatTitle: input.chatTitle.trim() }
|
|
91
|
-
: {}),
|
|
92
|
-
...(typeof input.userId === "string"
|
|
93
|
-
? { userId: input.userId.trim() }
|
|
94
|
-
: {}),
|
|
95
|
-
...(typeof input.username === "string"
|
|
96
|
-
? { username: input.username.trim() }
|
|
97
|
-
: {}),
|
|
98
|
-
});
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* 创建 ChatPlugin 内置授权 resolve 点。
|
|
106
|
-
*/
|
|
107
|
-
export function createChatAuthorizationResolves() {
|
|
108
|
-
return {
|
|
109
|
-
[CHAT_PLUGIN_POINTS.resolveUserRole]: async ({ context, value }) => {
|
|
110
|
-
const input = value && typeof value === "object" && !Array.isArray(value)
|
|
111
|
-
? value
|
|
112
|
-
: {};
|
|
113
|
-
const channel = toChannel(input.channel);
|
|
114
|
-
if (!channel) {
|
|
115
|
-
throw new Error("chat.resolveUserRole requires a valid channel");
|
|
116
|
-
}
|
|
117
|
-
const role = resolveAuthorizedUserRole({
|
|
118
|
-
channel,
|
|
119
|
-
userId: String(input.userId || "").trim(),
|
|
120
|
-
rootPath: context.rootPath,
|
|
121
|
-
});
|
|
122
|
-
return (role || null);
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* 创建 ChatPlugin 内置授权 actions。
|
|
128
|
-
*/
|
|
129
|
-
export function createChatAuthorizationActions() {
|
|
130
|
-
return {
|
|
131
|
-
[CHAT_AUTHORIZATION_ACTIONS.snapshot]: createAction({
|
|
132
|
-
description: "Read chat authorization snapshot (catalog/config/users/chats).",
|
|
133
|
-
input_schema: {
|
|
134
|
-
zod: z.object({}).passthrough(),
|
|
135
|
-
json_schema: { type: "object", properties: {} },
|
|
136
|
-
},
|
|
137
|
-
execute: async ({ context }) => {
|
|
138
|
-
const snapshot = await readAuthorizationSnapshot({
|
|
139
|
-
context,
|
|
140
|
-
});
|
|
141
|
-
return {
|
|
142
|
-
success: true,
|
|
143
|
-
data: toSnapshotData(snapshot),
|
|
144
|
-
};
|
|
145
|
-
},
|
|
146
|
-
}),
|
|
147
|
-
[CHAT_AUTHORIZATION_ACTIONS.readConfig]: createAction({
|
|
148
|
-
description: "Read current chat authorization config.",
|
|
149
|
-
input_schema: {
|
|
150
|
-
zod: z.object({}).passthrough(),
|
|
151
|
-
json_schema: { type: "object", properties: {} },
|
|
152
|
-
},
|
|
153
|
-
execute: async ({ context }) => {
|
|
154
|
-
return {
|
|
155
|
-
success: true,
|
|
156
|
-
data: readChatAuthorizationConfig(context),
|
|
157
|
-
};
|
|
158
|
-
},
|
|
159
|
-
}),
|
|
160
|
-
[CHAT_AUTHORIZATION_ACTIONS.writeConfig]: createAction({
|
|
161
|
-
description: "Write chat authorization config as a full replacement.",
|
|
162
|
-
input_schema: {
|
|
163
|
-
zod: z.object({
|
|
164
|
-
config: z.record(z.string(), z.unknown()).optional(),
|
|
165
|
-
}),
|
|
166
|
-
json_schema: {
|
|
167
|
-
type: "object",
|
|
168
|
-
properties: {
|
|
169
|
-
config: { type: "object", description: "Authorization config." },
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
},
|
|
173
|
-
execute: async ({ context, input }) => {
|
|
174
|
-
const body = toRecord(input);
|
|
175
|
-
const nextConfig = body.config && typeof body.config === "object" && !Array.isArray(body.config)
|
|
176
|
-
? body.config
|
|
177
|
-
: {};
|
|
178
|
-
await writeChatAuthorizationConfig({
|
|
179
|
-
context,
|
|
180
|
-
nextConfig,
|
|
181
|
-
});
|
|
182
|
-
return {
|
|
183
|
-
success: true,
|
|
184
|
-
data: readChatAuthorizationConfig(context),
|
|
185
|
-
};
|
|
186
|
-
},
|
|
187
|
-
}),
|
|
188
|
-
[CHAT_AUTHORIZATION_ACTIONS.setUserRole]: createAction({
|
|
189
|
-
description: "Set the role for a channel user.",
|
|
190
|
-
input_schema: {
|
|
191
|
-
zod: z.object({
|
|
192
|
-
channel: z.enum(["telegram", "feishu", "qq"]),
|
|
193
|
-
userId: z.string(),
|
|
194
|
-
roleId: z.string(),
|
|
195
|
-
}),
|
|
196
|
-
json_schema: {
|
|
197
|
-
type: "object",
|
|
198
|
-
required: ["channel", "userId", "roleId"],
|
|
199
|
-
properties: {
|
|
200
|
-
channel: { type: "string", enum: ["telegram", "feishu", "qq"] },
|
|
201
|
-
userId: { type: "string" },
|
|
202
|
-
roleId: { type: "string" },
|
|
203
|
-
},
|
|
204
|
-
},
|
|
205
|
-
},
|
|
206
|
-
execute: async ({ context, input }) => {
|
|
207
|
-
const body = toRecord(input);
|
|
208
|
-
const channel = toChannel(body.channel);
|
|
209
|
-
if (!channel) {
|
|
210
|
-
return {
|
|
211
|
-
success: false,
|
|
212
|
-
error: "authorization-set-user-role requires a valid channel",
|
|
213
|
-
message: "authorization-set-user-role requires a valid channel",
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
await setChatAuthorizationUserRole({
|
|
217
|
-
context,
|
|
218
|
-
channel,
|
|
219
|
-
userId: String(body.userId || "").trim(),
|
|
220
|
-
roleId: String(body.roleId || "").trim(),
|
|
221
|
-
});
|
|
222
|
-
return {
|
|
223
|
-
success: true,
|
|
224
|
-
data: readChatAuthorizationConfig(context),
|
|
225
|
-
};
|
|
226
|
-
},
|
|
227
|
-
}),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
//# sourceMappingURL=ChatAuthorizationRuntime.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChatAuthorizationRuntime.js","sourceRoot":"","sources":["../../../src/chat/runtime/ChatAuthorizationRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PluginDispatch:chat 领域的 plugin 调用辅助。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - chat plugin runtime 只依赖这里,不直接依赖某个具体 plugin 模块路径。
|
|
6
|
-
* - 这里封装 chat 领域的 plugin 点调用语义,保持 service 边界稳定。
|
|
7
|
-
*/
|
|
8
|
-
import type { AgentContext } from "@downcity/agent";
|
|
9
|
-
import type { ChatAuthorizationEvaluateInput, ChatAuthorizationRole } from "../../auth/types/AuthPlugin.js";
|
|
10
|
-
import type { ChatDispatchChannel } from "../../chat/types/ChatDispatcher.js";
|
|
11
|
-
/**
|
|
12
|
-
* 观测入站主体。
|
|
13
|
-
*/
|
|
14
|
-
export declare function observeIncomingChatPrincipal(params: {
|
|
15
|
-
context: AgentContext;
|
|
16
|
-
channel: ChatDispatchChannel;
|
|
17
|
-
chatId: string;
|
|
18
|
-
chatType?: string;
|
|
19
|
-
chatTitle?: string;
|
|
20
|
-
userId?: string;
|
|
21
|
-
username?: string;
|
|
22
|
-
}): Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* 校验入站消息是否允许执行。
|
|
25
|
-
*
|
|
26
|
-
* 关键点(中文)
|
|
27
|
-
* - 这是 guard 语义:允许则静默返回,拒绝则直接抛错。
|
|
28
|
-
* - 这样 chat plugin runtime 可以像处理中间件一样串联 guard 点。
|
|
29
|
-
*/
|
|
30
|
-
export declare function guardIncomingChat(params: {
|
|
31
|
-
context: AgentContext;
|
|
32
|
-
channel: ChatDispatchChannel;
|
|
33
|
-
input: ChatAuthorizationEvaluateInput;
|
|
34
|
-
}): Promise<void>;
|
|
35
|
-
/**
|
|
36
|
-
* 解析用户角色。
|
|
37
|
-
*/
|
|
38
|
-
export declare function resolveIncomingChatUserRole(params: {
|
|
39
|
-
context: AgentContext;
|
|
40
|
-
channel: ChatDispatchChannel;
|
|
41
|
-
userId?: string;
|
|
42
|
-
}): Promise<ChatAuthorizationRole | undefined>;
|
|
43
|
-
//# sourceMappingURL=PluginDispatch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginDispatch.d.ts","sourceRoot":"","sources":["../../../src/chat/runtime/PluginDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAEV,8BAA8B,EAC9B,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQ1E;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAShB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,EAAE,8BAA8B,CAAC;CACvC,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAW7C"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PluginDispatch:chat 领域的 plugin 调用辅助。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - chat plugin runtime 只依赖这里,不直接依赖某个具体 plugin 模块路径。
|
|
6
|
-
* - 这里封装 chat 领域的 plugin 点调用语义,保持 service 边界稳定。
|
|
7
|
-
*/
|
|
8
|
-
import { CHAT_PLUGIN_POINTS } from "../../chat/runtime/PluginPoints.js";
|
|
9
|
-
function toRecord(value) {
|
|
10
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
11
|
-
return {};
|
|
12
|
-
return value;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* 观测入站主体。
|
|
16
|
-
*/
|
|
17
|
-
export async function observeIncomingChatPrincipal(params) {
|
|
18
|
-
await params.context.plugins.effect(CHAT_PLUGIN_POINTS.observePrincipal, {
|
|
19
|
-
channel: params.channel,
|
|
20
|
-
chatId: params.chatId,
|
|
21
|
-
...(params.chatType ? { chatType: params.chatType } : {}),
|
|
22
|
-
...(params.chatTitle ? { chatTitle: params.chatTitle } : {}),
|
|
23
|
-
...(params.userId ? { userId: params.userId } : {}),
|
|
24
|
-
...(params.username ? { username: params.username } : {}),
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* 校验入站消息是否允许执行。
|
|
29
|
-
*
|
|
30
|
-
* 关键点(中文)
|
|
31
|
-
* - 这是 guard 语义:允许则静默返回,拒绝则直接抛错。
|
|
32
|
-
* - 这样 chat plugin runtime 可以像处理中间件一样串联 guard 点。
|
|
33
|
-
*/
|
|
34
|
-
export async function guardIncomingChat(params) {
|
|
35
|
-
await params.context.plugins.guard(CHAT_PLUGIN_POINTS.authorizeIncoming, {
|
|
36
|
-
channel: params.channel,
|
|
37
|
-
chatId: params.input.chatId,
|
|
38
|
-
...(params.input.chatType ? { chatType: params.input.chatType } : {}),
|
|
39
|
-
...(params.input.userId ? { userId: params.input.userId } : {}),
|
|
40
|
-
...(params.input.username ? { username: params.input.username } : {}),
|
|
41
|
-
...(params.input.chatTitle ? { chatTitle: params.input.chatTitle } : {}),
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* 解析用户角色。
|
|
46
|
-
*/
|
|
47
|
-
export async function resolveIncomingChatUserRole(params) {
|
|
48
|
-
const result = await params.context.plugins.resolve(CHAT_PLUGIN_POINTS.resolveUserRole, {
|
|
49
|
-
channel: params.channel,
|
|
50
|
-
...(params.userId ? { userId: params.userId } : {}),
|
|
51
|
-
});
|
|
52
|
-
const role = toRecord(result);
|
|
53
|
-
if (!role.roleId)
|
|
54
|
-
return undefined;
|
|
55
|
-
return role;
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=PluginDispatch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginDispatch.js","sourceRoot":"","sources":["../../../src/chat/runtime/PluginDispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth 授权配置读写工具。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 静态授权规则直接存放在项目 `.downcity/chat/authorization/config.json`。
|
|
6
|
-
* - 授权核心模型为 role / permission / binding。
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import fs from "fs-extra";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import type { AgentContext } from "@downcity/agent";
|
|
12
|
-
import type {
|
|
13
|
-
ChatAuthorizationConfig,
|
|
14
|
-
ChatAuthorizationChannel,
|
|
15
|
-
ChatAuthorizationPermission,
|
|
16
|
-
ChatAuthorizationRole,
|
|
17
|
-
ChatChannelAuthorizationConfig,
|
|
18
|
-
} from "@/auth/types/AuthPlugin.js";
|
|
19
|
-
import {
|
|
20
|
-
CHAT_AUTHORIZATION_CHANNELS,
|
|
21
|
-
CHAT_AUTHORIZATION_PERMISSIONS,
|
|
22
|
-
createDefaultChatAuthorizationRoles,
|
|
23
|
-
} from "@/auth/types/AuthPlugin.js";
|
|
24
|
-
|
|
25
|
-
const CHANNELS: ChatAuthorizationChannel[] = [...CHAT_AUTHORIZATION_CHANNELS];
|
|
26
|
-
|
|
27
|
-
export const DEFAULT_CHAT_AUTHORIZATION_PERMISSIONS: ChatAuthorizationPermission[] = [
|
|
28
|
-
...CHAT_AUTHORIZATION_PERMISSIONS,
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
function normalizeText(value: unknown): string | undefined {
|
|
32
|
-
const text = String(value || "").trim();
|
|
33
|
-
return text ? text : undefined;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function normalizePermissionList(values: unknown[] | undefined): ChatAuthorizationPermission[] {
|
|
37
|
-
const allowed = new Set<string>(DEFAULT_CHAT_AUTHORIZATION_PERMISSIONS);
|
|
38
|
-
if (!Array.isArray(values)) return [];
|
|
39
|
-
return [
|
|
40
|
-
...new Set(
|
|
41
|
-
values
|
|
42
|
-
.map((value) => normalizeText(value))
|
|
43
|
-
.filter(
|
|
44
|
-
(value): value is ChatAuthorizationPermission =>
|
|
45
|
-
Boolean(value && allowed.has(value)),
|
|
46
|
-
),
|
|
47
|
-
),
|
|
48
|
-
];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function buildDefaultRole(roleId: "default" | "member" | "admin"): ChatAuthorizationRole {
|
|
52
|
-
return createDefaultChatAuthorizationRoles()[roleId];
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function normalizeRoleMap(input: unknown): Record<string, ChatAuthorizationRole> {
|
|
56
|
-
const defaultRoles = createDefaultChatAuthorizationRoles();
|
|
57
|
-
if (!input || typeof input !== "object" || Array.isArray(input)) return defaultRoles;
|
|
58
|
-
const roles: Record<string, ChatAuthorizationRole> = {};
|
|
59
|
-
for (const [rawRoleId, rawRole] of Object.entries(input)) {
|
|
60
|
-
const roleId = normalizeText(rawRoleId);
|
|
61
|
-
if (!roleId) continue;
|
|
62
|
-
const roleObj =
|
|
63
|
-
rawRole && typeof rawRole === "object" && !Array.isArray(rawRole)
|
|
64
|
-
? (rawRole as {
|
|
65
|
-
name?: unknown;
|
|
66
|
-
description?: unknown;
|
|
67
|
-
permissions?: unknown[];
|
|
68
|
-
roleId?: unknown;
|
|
69
|
-
})
|
|
70
|
-
: null;
|
|
71
|
-
if (!roleObj) continue;
|
|
72
|
-
const builtinRole = defaultRoles[roleId];
|
|
73
|
-
roles[roleId] = {
|
|
74
|
-
roleId,
|
|
75
|
-
name: normalizeText(roleObj.name) || builtinRole?.name || roleId,
|
|
76
|
-
...(normalizeText(roleObj.description) || builtinRole?.description
|
|
77
|
-
? {
|
|
78
|
-
description:
|
|
79
|
-
normalizeText(roleObj.description) || builtinRole?.description || undefined,
|
|
80
|
-
}
|
|
81
|
-
: {}),
|
|
82
|
-
permissions: normalizePermissionList(roleObj.permissions),
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
if (Object.keys(roles).length === 0) return defaultRoles;
|
|
86
|
-
if (!roles.default) roles.default = buildDefaultRole("default");
|
|
87
|
-
return roles;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function normalizeBindingMap(
|
|
91
|
-
input: unknown,
|
|
92
|
-
roles: Record<string, ChatAuthorizationRole>,
|
|
93
|
-
): Record<string, string> {
|
|
94
|
-
if (!input || typeof input !== "object" || Array.isArray(input)) return {};
|
|
95
|
-
const out: Record<string, string> = {};
|
|
96
|
-
for (const [rawId, rawRoleId] of Object.entries(input)) {
|
|
97
|
-
const entityId = normalizeText(rawId);
|
|
98
|
-
const roleId = normalizeText(rawRoleId);
|
|
99
|
-
if (!entityId || !roleId || !roles[roleId]) continue;
|
|
100
|
-
out[entityId] = roleId;
|
|
101
|
-
}
|
|
102
|
-
return out;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function normalizeChannelConfig(
|
|
106
|
-
input: unknown,
|
|
107
|
-
roles: Record<string, ChatAuthorizationRole>,
|
|
108
|
-
): ChatChannelAuthorizationConfig {
|
|
109
|
-
const raw =
|
|
110
|
-
input && typeof input === "object" && !Array.isArray(input)
|
|
111
|
-
? (input as {
|
|
112
|
-
defaultUserRoleId?: unknown;
|
|
113
|
-
userRoles?: unknown;
|
|
114
|
-
})
|
|
115
|
-
: {};
|
|
116
|
-
const defaultUserRoleId = normalizeText(raw.defaultUserRoleId) || "default";
|
|
117
|
-
return {
|
|
118
|
-
defaultUserRoleId: roles[defaultUserRoleId] ? defaultUserRoleId : "default",
|
|
119
|
-
userRoles: normalizeBindingMap(raw.userRoles, roles),
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function normalizeAuthorizationConfig(input: unknown): ChatAuthorizationConfig {
|
|
124
|
-
const raw =
|
|
125
|
-
input && typeof input === "object" && !Array.isArray(input)
|
|
126
|
-
? (input as { roles?: unknown; channels?: Record<string, unknown> })
|
|
127
|
-
: {};
|
|
128
|
-
const roles = normalizeRoleMap(raw.roles);
|
|
129
|
-
const channels: Partial<Record<ChatAuthorizationChannel, ChatChannelAuthorizationConfig>> = {};
|
|
130
|
-
for (const channel of CHANNELS) {
|
|
131
|
-
channels[channel] = normalizeChannelConfig(raw.channels?.[channel], roles);
|
|
132
|
-
}
|
|
133
|
-
return { roles, channels };
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
function cloneAuthorizationConfig(
|
|
137
|
-
input: ChatAuthorizationConfig | undefined,
|
|
138
|
-
): ChatAuthorizationConfig {
|
|
139
|
-
return normalizeAuthorizationConfig(input ? JSON.parse(JSON.stringify(input)) : {});
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function getChatAuthorizationConfigPath(projectRoot: string): string {
|
|
143
|
-
return path.join(projectRoot, ".downcity", "chat", "authorization", "config.json");
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function readAuthorizationConfigFromProjectRoot(projectRoot: string): ChatAuthorizationConfig {
|
|
147
|
-
const normalizedProjectRoot = normalizeText(projectRoot);
|
|
148
|
-
if (!normalizedProjectRoot) return normalizeAuthorizationConfig({});
|
|
149
|
-
const file = getChatAuthorizationConfigPath(normalizedProjectRoot);
|
|
150
|
-
if (!fs.existsSync(file)) return normalizeAuthorizationConfig({});
|
|
151
|
-
try {
|
|
152
|
-
return normalizeAuthorizationConfig(fs.readJsonSync(file));
|
|
153
|
-
} catch {
|
|
154
|
-
return normalizeAuthorizationConfig({});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
async function writeAuthorizationConfigToPlatform(params: {
|
|
159
|
-
projectRoot: string;
|
|
160
|
-
nextConfig: ChatAuthorizationConfig;
|
|
161
|
-
}): Promise<void> {
|
|
162
|
-
const normalizedProjectRoot = normalizeText(params.projectRoot);
|
|
163
|
-
if (!normalizedProjectRoot) throw new Error("projectRoot is required");
|
|
164
|
-
const file = getChatAuthorizationConfigPath(normalizedProjectRoot);
|
|
165
|
-
await fs.ensureDir(path.dirname(file));
|
|
166
|
-
await fs.writeJson(file, normalizeAuthorizationConfig(params.nextConfig), {
|
|
167
|
-
spaces: 2,
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function ensureChannelConfig(
|
|
172
|
-
config: ChatAuthorizationConfig,
|
|
173
|
-
channel: ChatAuthorizationChannel,
|
|
174
|
-
): ChatChannelAuthorizationConfig {
|
|
175
|
-
config.roles = normalizeRoleMap(config.roles);
|
|
176
|
-
config.channels ??= {};
|
|
177
|
-
config.channels[channel] = normalizeChannelConfig(config.channels[channel], config.roles);
|
|
178
|
-
return config.channels[channel] as ChatChannelAuthorizationConfig;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* 同步读取当前 agent 的授权配置。
|
|
183
|
-
*/
|
|
184
|
-
export function readChatAuthorizationConfigSync(projectRoot: string): ChatAuthorizationConfig {
|
|
185
|
-
return readAuthorizationConfigFromProjectRoot(projectRoot);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* 读取当前 agent 的授权配置。
|
|
190
|
-
*/
|
|
191
|
-
export function readChatAuthorizationConfig(
|
|
192
|
-
contextOrProjectRoot: Pick<AgentContext, "rootPath"> | string,
|
|
193
|
-
): ChatAuthorizationConfig {
|
|
194
|
-
if (typeof contextOrProjectRoot === "string") {
|
|
195
|
-
return readAuthorizationConfigFromProjectRoot(contextOrProjectRoot);
|
|
196
|
-
}
|
|
197
|
-
return readAuthorizationConfigFromProjectRoot(contextOrProjectRoot.rootPath);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* 覆盖写入整份授权配置。
|
|
202
|
-
*/
|
|
203
|
-
export async function writeChatAuthorizationConfig(params: {
|
|
204
|
-
context: Pick<AgentContext, "rootPath">;
|
|
205
|
-
nextConfig: ChatAuthorizationConfig;
|
|
206
|
-
}): Promise<void> {
|
|
207
|
-
await writeAuthorizationConfigToPlatform({
|
|
208
|
-
projectRoot: params.context.rootPath,
|
|
209
|
-
nextConfig: params.nextConfig,
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* 读取角色列表。
|
|
215
|
-
*/
|
|
216
|
-
export function listChatAuthorizationRoles(params: {
|
|
217
|
-
config: ChatAuthorizationConfig;
|
|
218
|
-
}): ChatAuthorizationRole[] {
|
|
219
|
-
const config = normalizeAuthorizationConfig(params.config);
|
|
220
|
-
return Object.values(config.roles || {}).sort((a, b) => a.roleId.localeCompare(b.roleId));
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* 设置用户角色。
|
|
225
|
-
*/
|
|
226
|
-
export async function setChatAuthorizationUserRole(params: {
|
|
227
|
-
context: Pick<AgentContext, "rootPath">;
|
|
228
|
-
channel: ChatAuthorizationChannel;
|
|
229
|
-
userId: string;
|
|
230
|
-
roleId: string;
|
|
231
|
-
}): Promise<void> {
|
|
232
|
-
const userId = normalizeText(params.userId);
|
|
233
|
-
const roleId = normalizeText(params.roleId);
|
|
234
|
-
if (!userId || !roleId) throw new Error("userId and roleId are required");
|
|
235
|
-
const authorization = cloneAuthorizationConfig(
|
|
236
|
-
readAuthorizationConfigFromProjectRoot(params.context.rootPath),
|
|
237
|
-
);
|
|
238
|
-
authorization.roles = normalizeRoleMap(authorization.roles);
|
|
239
|
-
const channelConfig = ensureChannelConfig(authorization, params.channel);
|
|
240
|
-
if (!authorization.roles?.[roleId]) throw new Error(`Unknown roleId: ${roleId}`);
|
|
241
|
-
channelConfig.userRoles ??= {};
|
|
242
|
-
channelConfig.userRoles[userId] = roleId;
|
|
243
|
-
await writeAuthorizationConfigToPlatform({
|
|
244
|
-
projectRoot: params.context.rootPath,
|
|
245
|
-
nextConfig: authorization,
|
|
246
|
-
});
|
|
247
|
-
}
|