@downcity/plugins 1.0.152 → 1.0.156
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 +18 -21
- package/bin/chat/channels/BaseChatChannel.d.ts.map +1 -1
- package/bin/chat/channels/BaseChatChannel.js +48 -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 +2 -0
- package/bin/chat/channels/telegram/Bot.d.ts.map +1 -1
- package/bin/chat/channels/telegram/Bot.js +8 -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 +90 -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 +59 -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 +11 -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,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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationConfig.js","sourceRoot":"","sources":["../../../src/auth/runtime/AuthorizationConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth 授权判定逻辑。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 角色模型替代旧的 allowlist/pairing 模型。
|
|
6
|
-
* - 判定统一走“用户角色 + 权限集合”,群聊只看发言用户自身权限。
|
|
7
|
-
*/
|
|
8
|
-
import type { DowncityConfig } from "@downcity/agent";
|
|
9
|
-
import type { ChatAuthorizationConfig, ChatAuthorizationChannel, ChatAuthorizationEvaluateInput, ChatAuthorizationEvaluateResult, ChatAuthorizationRole } from "../../auth/types/AuthPlugin.js";
|
|
10
|
-
/**
|
|
11
|
-
* 解析用户授权角色。
|
|
12
|
-
*/
|
|
13
|
-
export declare function resolveAuthorizedUserRole(params: {
|
|
14
|
-
channel: ChatAuthorizationChannel;
|
|
15
|
-
userId?: string;
|
|
16
|
-
authorizationConfig?: ChatAuthorizationConfig;
|
|
17
|
-
rootPath?: string;
|
|
18
|
-
}): ChatAuthorizationRole | undefined;
|
|
19
|
-
/**
|
|
20
|
-
* 执行入站授权判定。
|
|
21
|
-
*/
|
|
22
|
-
export declare function evaluateIncomingChatAuthorization(params: {
|
|
23
|
-
config: DowncityConfig;
|
|
24
|
-
channel: ChatAuthorizationChannel;
|
|
25
|
-
input: ChatAuthorizationEvaluateInput;
|
|
26
|
-
authorizationConfig?: ChatAuthorizationConfig;
|
|
27
|
-
}): ChatAuthorizationEvaluateResult;
|
|
28
|
-
//# sourceMappingURL=AuthorizationPolicy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationPolicy.d.ts","sourceRoot":"","sources":["../../../src/auth/runtime/AuthorizationPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,8BAA8B,EAC9B,+BAA+B,EAE/B,qBAAqB,EAEtB,MAAM,4BAA4B,CAAC;AAqEpC;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,qBAAqB,GAAG,SAAS,CAepC;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE;IACxD,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;IAClC,KAAK,EAAE,8BAA8B,CAAC;IACtC,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;CAC/C,GAAG,+BAA+B,CA+ClC"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth 授权判定逻辑。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 角色模型替代旧的 allowlist/pairing 模型。
|
|
6
|
-
* - 判定统一走“用户角色 + 权限集合”,群聊只看发言用户自身权限。
|
|
7
|
-
*/
|
|
8
|
-
import { createDefaultChatAuthorizationRoles } from "../../auth/types/AuthPlugin.js";
|
|
9
|
-
import { readChatAuthorizationConfigSync } from "../../auth/runtime/AuthorizationConfig.js";
|
|
10
|
-
function normalizeText(value) {
|
|
11
|
-
const text = String(value || "").trim();
|
|
12
|
-
return text ? text : undefined;
|
|
13
|
-
}
|
|
14
|
-
function isDirectMessage(channel, chatType) {
|
|
15
|
-
const type = String(chatType || "").trim().toLowerCase();
|
|
16
|
-
if (!type)
|
|
17
|
-
return true;
|
|
18
|
-
if (channel === "telegram")
|
|
19
|
-
return type === "private";
|
|
20
|
-
if (channel === "feishu")
|
|
21
|
-
return type === "p2p";
|
|
22
|
-
if (channel === "qq")
|
|
23
|
-
return type === "private" || type === "c2c";
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
function resolveAuthorizationRoles(authorizationConfig) {
|
|
27
|
-
const raw = authorizationConfig?.roles;
|
|
28
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
29
|
-
return createDefaultChatAuthorizationRoles();
|
|
30
|
-
}
|
|
31
|
-
return Object.keys(raw).length > 0 ? raw : createDefaultChatAuthorizationRoles();
|
|
32
|
-
}
|
|
33
|
-
function resolveChannelAuthorizationConfig(channel, authorizationConfig) {
|
|
34
|
-
const raw = authorizationConfig?.channels?.[channel];
|
|
35
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
36
|
-
return {
|
|
37
|
-
defaultUserRoleId: "default",
|
|
38
|
-
userRoles: {},
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
return raw;
|
|
42
|
-
}
|
|
43
|
-
function resolveRole(roleId, roles) {
|
|
44
|
-
if (roleId && roles?.[roleId])
|
|
45
|
-
return roles[roleId];
|
|
46
|
-
if (roles?.default)
|
|
47
|
-
return roles.default;
|
|
48
|
-
return { roleId: "default", name: "Default", permissions: [] };
|
|
49
|
-
}
|
|
50
|
-
function hasPermission(role, permission) {
|
|
51
|
-
return role.permissions.includes(permission);
|
|
52
|
-
}
|
|
53
|
-
function resolveUserRole(params) {
|
|
54
|
-
const userId = normalizeText(params.userId);
|
|
55
|
-
const defaultRoleId = normalizeText(params.channelConfig.defaultUserRoleId) || "default";
|
|
56
|
-
const boundRoleId = userId ? normalizeText(params.channelConfig.userRoles?.[userId]) : undefined;
|
|
57
|
-
return resolveRole(boundRoleId || defaultRoleId, params.roles);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 解析用户授权角色。
|
|
61
|
-
*/
|
|
62
|
-
export function resolveAuthorizedUserRole(params) {
|
|
63
|
-
const userId = normalizeText(params.userId);
|
|
64
|
-
if (!userId)
|
|
65
|
-
return undefined;
|
|
66
|
-
const authorizationConfig = params.authorizationConfig ||
|
|
67
|
-
(params.rootPath
|
|
68
|
-
? readChatAuthorizationConfigSync(params.rootPath)
|
|
69
|
-
: undefined);
|
|
70
|
-
const roles = resolveAuthorizationRoles(authorizationConfig);
|
|
71
|
-
const channelConfig = resolveChannelAuthorizationConfig(params.channel, authorizationConfig);
|
|
72
|
-
return resolveUserRole({
|
|
73
|
-
roles,
|
|
74
|
-
channelConfig,
|
|
75
|
-
userId,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* 执行入站授权判定。
|
|
80
|
-
*/
|
|
81
|
-
export function evaluateIncomingChatAuthorization(params) {
|
|
82
|
-
const channelConfig = resolveChannelAuthorizationConfig(params.channel, params.authorizationConfig);
|
|
83
|
-
const roles = resolveAuthorizationRoles(params.authorizationConfig);
|
|
84
|
-
const direct = isDirectMessage(params.channel, params.input.chatType);
|
|
85
|
-
const userRole = resolveUserRole({
|
|
86
|
-
roles,
|
|
87
|
-
channelConfig,
|
|
88
|
-
userId: params.input.userId,
|
|
89
|
-
});
|
|
90
|
-
const isOwner = hasPermission(userRole, "agent.manage");
|
|
91
|
-
if (direct) {
|
|
92
|
-
return hasPermission(userRole, "chat.dm.use")
|
|
93
|
-
? {
|
|
94
|
-
decision: "allow",
|
|
95
|
-
isOwner,
|
|
96
|
-
userRoleId: userRole.roleId,
|
|
97
|
-
userPermissions: [...userRole.permissions],
|
|
98
|
-
reason: "dm_role_allowed",
|
|
99
|
-
}
|
|
100
|
-
: {
|
|
101
|
-
decision: "block",
|
|
102
|
-
isOwner,
|
|
103
|
-
userRoleId: userRole.roleId,
|
|
104
|
-
userPermissions: [...userRole.permissions],
|
|
105
|
-
reason: "dm_role_blocked",
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
return hasPermission(userRole, "chat.group.use")
|
|
109
|
-
? {
|
|
110
|
-
decision: "allow",
|
|
111
|
-
isOwner,
|
|
112
|
-
userRoleId: userRole.roleId,
|
|
113
|
-
userPermissions: [...userRole.permissions],
|
|
114
|
-
reason: "group_user_role_allowed",
|
|
115
|
-
}
|
|
116
|
-
: {
|
|
117
|
-
decision: "block",
|
|
118
|
-
isOwner,
|
|
119
|
-
userRoleId: userRole.roleId,
|
|
120
|
-
userPermissions: [...userRole.permissions],
|
|
121
|
-
reason: "user_group_permission_blocked",
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=AuthorizationPolicy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationPolicy.js","sourceRoot":"","sources":["../../../src/auth/runtime/AuthorizationPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth 授权运行时状态存储。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 所有动态状态(观测用户 / 会话)统一落盘到 `.downcity/chat/authorization/state.json`。
|
|
6
|
-
* - 静态授权配置保存在同目录下的 `config.json`,不和运行时观测数据混写。
|
|
7
|
-
*/
|
|
8
|
-
import type { ChatAuthorizationSnapshot } from "../../auth/types/AuthPlugin.js";
|
|
9
|
-
import type { AgentContext } from "@downcity/agent";
|
|
10
|
-
import type { ChatDispatchChannel } from "../../chat/types/ChatDispatcher.js";
|
|
11
|
-
/**
|
|
12
|
-
* 记录观测到的用户 / 会话。
|
|
13
|
-
*/
|
|
14
|
-
export declare function recordObservedAuthorizationPrincipal(params: {
|
|
15
|
-
context: Pick<AgentContext, "rootPath">;
|
|
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
|
-
export declare function readAuthorizationSnapshot(params: {
|
|
27
|
-
context: Pick<AgentContext, "rootPath">;
|
|
28
|
-
}): Promise<ChatAuthorizationSnapshot>;
|
|
29
|
-
//# sourceMappingURL=AuthorizationStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationStore.d.ts","sourceRoot":"","sources":["../../../src/auth/runtime/AuthorizationStore.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAGV,yBAAyB,EAE1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAwI1E;;GAEG;AACH,wBAAsB,oCAAoC,CAAC,MAAM,EAAE;IACjE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACxC,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,CAyChB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;CACzC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAOrC"}
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth 授权运行时状态存储。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 所有动态状态(观测用户 / 会话)统一落盘到 `.downcity/chat/authorization/state.json`。
|
|
6
|
-
* - 静态授权配置保存在同目录下的 `config.json`,不和运行时观测数据混写。
|
|
7
|
-
*/
|
|
8
|
-
import fs from "fs-extra";
|
|
9
|
-
import path from "node:path";
|
|
10
|
-
import { readChatAuthorizationConfig } from "../../auth/runtime/AuthorizationConfig.js";
|
|
11
|
-
function getAuthorizationStatePath(rootPath) {
|
|
12
|
-
return path.join(rootPath, ".downcity", "chat", "authorization", "state.json");
|
|
13
|
-
}
|
|
14
|
-
function normalizeText(value) {
|
|
15
|
-
const text = String(value || "").trim();
|
|
16
|
-
return text ? text : undefined;
|
|
17
|
-
}
|
|
18
|
-
function buildUserKey(channel, userId) {
|
|
19
|
-
return `${channel}:${userId}`;
|
|
20
|
-
}
|
|
21
|
-
function buildChatKey(channel, chatId) {
|
|
22
|
-
return `${channel}:${chatId}`;
|
|
23
|
-
}
|
|
24
|
-
function createEmptyState() {
|
|
25
|
-
return {
|
|
26
|
-
v: 1,
|
|
27
|
-
updatedAt: Date.now(),
|
|
28
|
-
usersByKey: {},
|
|
29
|
-
chatsByKey: {},
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
function normalizeObservedUser(input) {
|
|
33
|
-
if (!input || typeof input !== "object")
|
|
34
|
-
return null;
|
|
35
|
-
const channel = normalizeText(input.channel);
|
|
36
|
-
const userId = normalizeText(input.userId);
|
|
37
|
-
if (!channel || !userId)
|
|
38
|
-
return null;
|
|
39
|
-
return {
|
|
40
|
-
v: 1,
|
|
41
|
-
channel,
|
|
42
|
-
userId,
|
|
43
|
-
...(normalizeText(input.username) ? { username: normalizeText(input.username) } : {}),
|
|
44
|
-
...(normalizeText(input.lastChatId) ? { lastChatId: normalizeText(input.lastChatId) } : {}),
|
|
45
|
-
...(normalizeText(input.lastChatTitle)
|
|
46
|
-
? { lastChatTitle: normalizeText(input.lastChatTitle) }
|
|
47
|
-
: {}),
|
|
48
|
-
...(normalizeText(input.lastChatType)
|
|
49
|
-
? { lastChatType: normalizeText(input.lastChatType) }
|
|
50
|
-
: {}),
|
|
51
|
-
firstSeenAt: typeof input.firstSeenAt === "number" && Number.isFinite(input.firstSeenAt)
|
|
52
|
-
? input.firstSeenAt
|
|
53
|
-
: Date.now(),
|
|
54
|
-
lastSeenAt: typeof input.lastSeenAt === "number" && Number.isFinite(input.lastSeenAt)
|
|
55
|
-
? input.lastSeenAt
|
|
56
|
-
: Date.now(),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
function normalizeObservedChat(input) {
|
|
60
|
-
if (!input || typeof input !== "object")
|
|
61
|
-
return null;
|
|
62
|
-
const channel = normalizeText(input.channel);
|
|
63
|
-
const chatId = normalizeText(input.chatId);
|
|
64
|
-
if (!channel || !chatId)
|
|
65
|
-
return null;
|
|
66
|
-
return {
|
|
67
|
-
v: 1,
|
|
68
|
-
channel,
|
|
69
|
-
chatId,
|
|
70
|
-
...(normalizeText(input.chatTitle) ? { chatTitle: normalizeText(input.chatTitle) } : {}),
|
|
71
|
-
...(normalizeText(input.chatType) ? { chatType: normalizeText(input.chatType) } : {}),
|
|
72
|
-
...(normalizeText(input.lastActorId)
|
|
73
|
-
? { lastActorId: normalizeText(input.lastActorId) }
|
|
74
|
-
: {}),
|
|
75
|
-
...(normalizeText(input.lastActorName)
|
|
76
|
-
? { lastActorName: normalizeText(input.lastActorName) }
|
|
77
|
-
: {}),
|
|
78
|
-
firstSeenAt: typeof input.firstSeenAt === "number" && Number.isFinite(input.firstSeenAt)
|
|
79
|
-
? input.firstSeenAt
|
|
80
|
-
: Date.now(),
|
|
81
|
-
lastSeenAt: typeof input.lastSeenAt === "number" && Number.isFinite(input.lastSeenAt)
|
|
82
|
-
? input.lastSeenAt
|
|
83
|
-
: Date.now(),
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
function normalizeStateFile(input) {
|
|
87
|
-
const out = createEmptyState();
|
|
88
|
-
out.updatedAt =
|
|
89
|
-
typeof input?.updatedAt === "number" && Number.isFinite(input.updatedAt)
|
|
90
|
-
? input.updatedAt
|
|
91
|
-
: Date.now();
|
|
92
|
-
const users = input?.usersByKey;
|
|
93
|
-
if (users && typeof users === "object") {
|
|
94
|
-
for (const [key, value] of Object.entries(users)) {
|
|
95
|
-
const normalized = normalizeObservedUser(value);
|
|
96
|
-
if (!normalized)
|
|
97
|
-
continue;
|
|
98
|
-
out.usersByKey[key] = normalized;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
const chats = input?.chatsByKey;
|
|
102
|
-
if (chats && typeof chats === "object") {
|
|
103
|
-
for (const [key, value] of Object.entries(chats)) {
|
|
104
|
-
const normalized = normalizeObservedChat(value);
|
|
105
|
-
if (!normalized)
|
|
106
|
-
continue;
|
|
107
|
-
out.chatsByKey[key] = normalized;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return out;
|
|
111
|
-
}
|
|
112
|
-
async function readState(rootPath) {
|
|
113
|
-
const file = getAuthorizationStatePath(rootPath);
|
|
114
|
-
const raw = (await fs.readJson(file).catch(() => null));
|
|
115
|
-
return normalizeStateFile(raw);
|
|
116
|
-
}
|
|
117
|
-
async function writeState(rootPath, state) {
|
|
118
|
-
const file = getAuthorizationStatePath(rootPath);
|
|
119
|
-
await fs.ensureDir(path.dirname(file));
|
|
120
|
-
await fs.writeJson(file, state, { spaces: 2 });
|
|
121
|
-
}
|
|
122
|
-
function readAuthorizationConfig(context) {
|
|
123
|
-
return readChatAuthorizationConfig(context.rootPath);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* 记录观测到的用户 / 会话。
|
|
127
|
-
*/
|
|
128
|
-
export async function recordObservedAuthorizationPrincipal(params) {
|
|
129
|
-
const chatId = normalizeText(params.chatId);
|
|
130
|
-
if (!chatId)
|
|
131
|
-
return;
|
|
132
|
-
const now = Date.now();
|
|
133
|
-
const state = await readState(params.context.rootPath);
|
|
134
|
-
const chatKey = buildChatKey(params.channel, chatId);
|
|
135
|
-
const prevChat = state.chatsByKey[chatKey];
|
|
136
|
-
state.chatsByKey[chatKey] = {
|
|
137
|
-
v: 1,
|
|
138
|
-
channel: params.channel,
|
|
139
|
-
chatId,
|
|
140
|
-
...(normalizeText(params.chatTitle) ? { chatTitle: normalizeText(params.chatTitle) } : {}),
|
|
141
|
-
...(normalizeText(params.chatType) ? { chatType: normalizeText(params.chatType) } : {}),
|
|
142
|
-
...(normalizeText(params.userId) ? { lastActorId: normalizeText(params.userId) } : {}),
|
|
143
|
-
...(normalizeText(params.username) ? { lastActorName: normalizeText(params.username) } : {}),
|
|
144
|
-
firstSeenAt: prevChat?.firstSeenAt ?? now,
|
|
145
|
-
lastSeenAt: now,
|
|
146
|
-
};
|
|
147
|
-
const userId = normalizeText(params.userId);
|
|
148
|
-
if (userId) {
|
|
149
|
-
const userKey = buildUserKey(params.channel, userId);
|
|
150
|
-
const prevUser = state.usersByKey[userKey];
|
|
151
|
-
state.usersByKey[userKey] = {
|
|
152
|
-
v: 1,
|
|
153
|
-
channel: params.channel,
|
|
154
|
-
userId,
|
|
155
|
-
...(normalizeText(params.username) ? { username: normalizeText(params.username) } : {}),
|
|
156
|
-
lastChatId: chatId,
|
|
157
|
-
...(normalizeText(params.chatTitle)
|
|
158
|
-
? { lastChatTitle: normalizeText(params.chatTitle) }
|
|
159
|
-
: {}),
|
|
160
|
-
...(normalizeText(params.chatType) ? { lastChatType: normalizeText(params.chatType) } : {}),
|
|
161
|
-
firstSeenAt: prevUser?.firstSeenAt ?? now,
|
|
162
|
-
lastSeenAt: now,
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
state.updatedAt = now;
|
|
166
|
-
await writeState(params.context.rootPath, state);
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* 读取授权快照(配置 + 动态状态)。
|
|
170
|
-
*/
|
|
171
|
-
export async function readAuthorizationSnapshot(params) {
|
|
172
|
-
const state = await readState(params.context.rootPath);
|
|
173
|
-
return {
|
|
174
|
-
config: readAuthorizationConfig(params.context),
|
|
175
|
-
users: Object.values(state.usersByKey).sort((a, b) => b.lastSeenAt - a.lastSeenAt),
|
|
176
|
-
chats: Object.values(state.chatsByKey).sort((a, b) => b.lastSeenAt - a.lastSeenAt),
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
//# sourceMappingURL=AuthorizationStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationStore.js","sourceRoot":"","sources":["../../../src/auth/runtime/AuthorizationStore.ts"],"names":[],"mappings":"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"}
|