@downcity/plugins 1.0.57 → 1.0.60
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/BuiltinPlugins.d.ts +24 -2
- package/bin/BuiltinPlugins.d.ts.map +1 -1
- package/bin/BuiltinPlugins.js +18 -5
- package/bin/BuiltinPlugins.js.map +1 -1
- package/bin/auth/types/AuthPlugin.d.ts +12 -16
- package/bin/auth/types/AuthPlugin.d.ts.map +1 -1
- package/bin/auth/types/AuthPlugin.js +9 -13
- package/bin/auth/types/AuthPlugin.js.map +1 -1
- package/bin/chat/ChatPlugin.d.ts +37 -6
- package/bin/chat/ChatPlugin.d.ts.map +1 -1
- package/bin/chat/ChatPlugin.js +58 -80
- package/bin/chat/ChatPlugin.js.map +1 -1
- package/bin/chat/Index.d.ts +4 -1
- package/bin/chat/Index.d.ts.map +1 -1
- package/bin/chat/Index.js +2 -1
- package/bin/chat/Index.js.map +1 -1
- package/bin/chat/channels/Configuration.d.ts +1 -1
- package/bin/chat/channels/Configuration.js +1 -1
- package/bin/chat/channels/RuntimeChannel.d.ts +145 -0
- package/bin/chat/channels/RuntimeChannel.d.ts.map +1 -0
- package/bin/chat/channels/RuntimeChannel.js +148 -0
- package/bin/chat/channels/RuntimeChannel.js.map +1 -0
- package/bin/chat/runtime/ChatAuthorizationRuntime.d.ts +22 -0
- package/bin/chat/runtime/ChatAuthorizationRuntime.d.ts.map +1 -0
- package/bin/chat/runtime/ChatAuthorizationRuntime.js +189 -0
- package/bin/chat/runtime/ChatAuthorizationRuntime.js.map +1 -0
- package/bin/chat/runtime/ChatChannelActions.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelActions.js +19 -9
- package/bin/chat/runtime/ChatChannelActions.js.map +1 -1
- package/bin/chat/runtime/ChatChannelConfig.d.ts +2 -18
- package/bin/chat/runtime/ChatChannelConfig.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelConfig.js +2 -73
- package/bin/chat/runtime/ChatChannelConfig.js.map +1 -1
- package/bin/chat/runtime/ChatChannelCore.d.ts +22 -1
- package/bin/chat/runtime/ChatChannelCore.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelCore.js +5 -5
- package/bin/chat/runtime/ChatChannelCore.js.map +1 -1
- package/bin/chat/runtime/ChatPluginActionRegistry.js +1 -1
- package/bin/chat/runtime/ChatPluginActionRegistry.js.map +1 -1
- package/bin/chat/runtime/PluginPoints.d.ts +3 -3
- package/bin/chat/runtime/PluginPoints.js +3 -3
- package/bin/chat/types/ChannelStatus.d.ts +1 -1
- package/bin/chat/types/ChatPluginOptions.d.ts +76 -0
- package/bin/chat/types/ChatPluginOptions.d.ts.map +1 -0
- package/bin/chat/types/ChatPluginOptions.js +10 -0
- package/bin/chat/types/ChatPluginOptions.js.map +1 -0
- package/bin/contact/ContactPlugin.d.ts +6 -1
- package/bin/contact/ContactPlugin.d.ts.map +1 -1
- package/bin/contact/ContactPlugin.js +9 -8
- package/bin/contact/ContactPlugin.js.map +1 -1
- package/bin/contact/types/ContactPluginOptions.d.ts +29 -0
- package/bin/contact/types/ContactPluginOptions.d.ts.map +1 -0
- package/bin/contact/types/ContactPluginOptions.js +9 -0
- package/bin/contact/types/ContactPluginOptions.js.map +1 -0
- package/bin/index.d.ts +7 -4
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +3 -2
- package/bin/index.js.map +1 -1
- package/bin/skill/Action.d.ts.map +1 -1
- package/bin/skill/Action.js +2 -2
- package/bin/skill/Action.js.map +1 -1
- package/bin/skill/Command.js +5 -5
- package/bin/skill/Command.js.map +1 -1
- package/bin/skill/Plugin.js +1 -1
- package/bin/skill/Plugin.js.map +1 -1
- package/bin/skill/runtime/Discovery.d.ts +4 -4
- package/bin/skill/runtime/Discovery.d.ts.map +1 -1
- package/bin/skill/runtime/Discovery.js +5 -5
- package/bin/skill/runtime/Discovery.js.map +1 -1
- package/bin/skill/runtime/Paths.d.ts +1 -5
- package/bin/skill/runtime/Paths.d.ts.map +1 -1
- package/bin/skill/runtime/Paths.js +1 -9
- package/bin/skill/runtime/Paths.js.map +1 -1
- package/bin/skill/runtime/Prompt.d.ts +2 -2
- package/bin/skill/runtime/Prompt.d.ts.map +1 -1
- package/bin/skill/runtime/Prompt.js +3 -3
- package/bin/skill/runtime/Prompt.js.map +1 -1
- package/bin/skill/runtime/Store.d.ts +2 -2
- package/bin/skill/runtime/Store.d.ts.map +1 -1
- package/bin/skill/runtime/Store.js.map +1 -1
- package/bin/skill/runtime/SystemProvider.js +4 -4
- package/bin/skill/runtime/SystemProvider.js.map +1 -1
- package/bin/skill/runtime/Types.d.ts +3 -3
- package/bin/skill/runtime/Types.d.ts.map +1 -1
- package/bin/skill/types/{ClaudeSkill.d.ts → SkillDefinition.d.ts} +4 -4
- package/bin/skill/types/SkillDefinition.d.ts.map +1 -0
- package/bin/skill/types/{ClaudeSkill.js → SkillDefinition.js} +2 -2
- package/bin/skill/types/SkillDefinition.js.map +1 -0
- package/bin/skill/types/SkillPlugin.d.ts +2 -2
- package/bin/skill/types/SkillPlugin.d.ts.map +1 -1
- package/bin/web/Plugin.js +1 -1
- package/bin/web/Plugin.js.map +1 -1
- package/bin/web/runtime/Install.js +2 -2
- package/bin/web/runtime/Install.js.map +1 -1
- package/bin/web/types/WebPlugin.d.ts +2 -1
- package/bin/web/types/WebPlugin.d.ts.map +1 -1
- package/bin/workboard/Plugin.d.ts +23 -3
- package/bin/workboard/Plugin.d.ts.map +1 -1
- package/bin/workboard/Plugin.js +66 -85
- package/bin/workboard/Plugin.js.map +1 -1
- package/package.json +2 -2
- package/src/BuiltinPlugins.ts +41 -5
- package/src/auth/types/AuthPlugin.ts +12 -17
- package/src/chat/ChatPlugin.ts +92 -89
- package/src/chat/Index.ts +18 -1
- package/src/chat/channels/Configuration.ts +1 -1
- package/src/chat/channels/RuntimeChannel.ts +264 -0
- package/src/chat/runtime/ChatAuthorizationRuntime.ts +229 -0
- package/src/chat/runtime/ChatChannelActions.ts +24 -9
- package/src/chat/runtime/ChatChannelConfig.ts +2 -100
- package/src/chat/runtime/ChatChannelCore.ts +20 -8
- package/src/chat/runtime/ChatPluginActionRegistry.ts +1 -1
- package/src/chat/runtime/PluginPoints.ts +3 -3
- package/src/chat/types/ChannelStatus.ts +1 -1
- package/src/chat/types/ChatPluginOptions.ts +79 -0
- package/src/contact/ContactPlugin.ts +17 -9
- package/src/contact/types/ContactPluginOptions.ts +30 -0
- package/src/index.ts +23 -7
- package/src/skill/Action.ts +10 -7
- package/src/skill/Command.ts +5 -5
- package/src/skill/Plugin.ts +1 -1
- package/src/skill/runtime/Discovery.ts +14 -11
- package/src/skill/runtime/Paths.ts +1 -13
- package/src/skill/runtime/Prompt.ts +5 -5
- package/src/skill/runtime/Store.ts +6 -3
- package/src/skill/runtime/SystemProvider.ts +4 -4
- package/src/skill/runtime/Types.ts +3 -3
- package/src/skill/types/{ClaudeSkill.ts → SkillDefinition.ts} +3 -3
- package/src/skill/types/SkillPlugin.ts +2 -2
- package/src/web/Plugin.ts +1 -1
- package/src/web/runtime/Install.ts +3 -3
- package/src/web/types/WebPlugin.ts +2 -2
- package/src/workboard/Plugin.ts +80 -95
- package/bin/auth/Plugin.d.ts +0 -17
- package/bin/auth/Plugin.d.ts.map +0 -1
- package/bin/auth/Plugin.js +0 -199
- package/bin/auth/Plugin.js.map +0 -1
- package/bin/chat/ChatPluginTypes.d.ts +0 -122
- package/bin/chat/ChatPluginTypes.d.ts.map +0 -1
- package/bin/chat/ChatPluginTypes.js +0 -10
- package/bin/chat/ChatPluginTypes.js.map +0 -1
- package/bin/skill/types/ClaudeSkill.d.ts.map +0 -1
- package/bin/skill/types/ClaudeSkill.js.map +0 -1
- package/src/auth/Plugin.ts +0 -237
- package/src/chat/ChatPluginTypes.ts +0 -126
package/bin/auth/Plugin.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChatAuthorizationPlugin。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - chat-authorization 是内建且必需的 plugin,不走可选启停语义。
|
|
6
|
-
* - 静态授权配置与动态观测态都收敛在项目 `.downcity/chat/authorization/`。
|
|
7
|
-
* - 它只负责聊天主体授权,不负责 Town HTTP Bearer token 或路由访问鉴权。
|
|
8
|
-
*/
|
|
9
|
-
import { BasePlugin } from "@downcity/agent/internal/plugin/core/BasePlugin.js";
|
|
10
|
-
/**
|
|
11
|
-
* ChatAuthorizationPlugin:统一承载聊天用户授权能力。
|
|
12
|
-
*/
|
|
13
|
-
export declare class ChatAuthorizationPlugin extends BasePlugin {
|
|
14
|
-
readonly name = "chat-authorization";
|
|
15
|
-
constructor();
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=Plugin.d.ts.map
|
package/bin/auth/Plugin.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/auth/Plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AAyNhF;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,QAAQ,CAAC,IAAI,wBAAkC;;CAMhD"}
|
package/bin/auth/Plugin.js
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChatAuthorizationPlugin。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - chat-authorization 是内建且必需的 plugin,不走可选启停语义。
|
|
6
|
-
* - 静态授权配置与动态观测态都收敛在项目 `.downcity/chat/authorization/`。
|
|
7
|
-
* - 它只负责聊天主体授权,不负责 Town HTTP Bearer token 或路由访问鉴权。
|
|
8
|
-
*/
|
|
9
|
-
import { BasePlugin } from "@downcity/agent/internal/plugin/core/BasePlugin.js";
|
|
10
|
-
import { CHAT_PLUGIN_POINTS } from "../chat/runtime/PluginPoints.js";
|
|
11
|
-
import { CHAT_AUTHORIZATION_ACTIONS, CHAT_AUTHORIZATION_CATALOG, CHAT_AUTHORIZATION_PLUGIN_NAME, } from "../auth/types/AuthPlugin.js";
|
|
12
|
-
import { readChatAuthorizationConfig, setChatAuthorizationUserRole, writeChatAuthorizationConfig, } from "../auth/runtime/AuthorizationConfig.js";
|
|
13
|
-
import { evaluateIncomingChatAuthorization, resolveAuthorizedUserRole, } from "../auth/runtime/AuthorizationPolicy.js";
|
|
14
|
-
import { readAuthorizationSnapshot, recordObservedAuthorizationPrincipal, } from "../auth/runtime/AuthorizationStore.js";
|
|
15
|
-
function toChannel(value) {
|
|
16
|
-
const text = String(value || "").trim().toLowerCase();
|
|
17
|
-
if (text === "telegram" || text === "feishu" || text === "qq")
|
|
18
|
-
return text;
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
function toRecord(value) {
|
|
22
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
23
|
-
return {};
|
|
24
|
-
return value;
|
|
25
|
-
}
|
|
26
|
-
function toEvaluateInput(payload) {
|
|
27
|
-
const channel = toChannel(payload.channel);
|
|
28
|
-
if (!channel) {
|
|
29
|
-
throw new Error("chat-authorization.authorize_incoming requires a valid channel");
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
channel,
|
|
33
|
-
chatId: String(payload.chatId || "").trim(),
|
|
34
|
-
...(typeof payload.chatType === "string" ? { chatType: payload.chatType.trim() } : {}),
|
|
35
|
-
...(typeof payload.userId === "string" ? { userId: payload.userId.trim() } : {}),
|
|
36
|
-
...(typeof payload.username === "string" ? { username: payload.username.trim() } : {}),
|
|
37
|
-
...(typeof payload.chatTitle === "string" ? { chatTitle: payload.chatTitle.trim() } : {}),
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
function toSnapshotData(snapshot) {
|
|
41
|
-
return {
|
|
42
|
-
catalog: CHAT_AUTHORIZATION_CATALOG,
|
|
43
|
-
config: snapshot.config,
|
|
44
|
-
users: snapshot.users,
|
|
45
|
-
chats: snapshot.chats,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function createChatAuthorizationPluginDefinition() {
|
|
49
|
-
return {
|
|
50
|
-
name: CHAT_AUTHORIZATION_PLUGIN_NAME,
|
|
51
|
-
title: "Chat Access",
|
|
52
|
-
description: "Controls who can talk to the agent through chat platforms, records observed users and chats, and resolves each user's effective role for downstream service decisions.",
|
|
53
|
-
availability() {
|
|
54
|
-
return {
|
|
55
|
-
enabled: true,
|
|
56
|
-
available: true,
|
|
57
|
-
reasons: [],
|
|
58
|
-
};
|
|
59
|
-
},
|
|
60
|
-
hooks: {
|
|
61
|
-
guard: {
|
|
62
|
-
[CHAT_PLUGIN_POINTS.authorizeIncoming]: [
|
|
63
|
-
async ({ context, value }) => {
|
|
64
|
-
const input = value && typeof value === "object" && !Array.isArray(value)
|
|
65
|
-
? value
|
|
66
|
-
: {};
|
|
67
|
-
const evaluateInput = toEvaluateInput(input);
|
|
68
|
-
const authorizationConfig = readChatAuthorizationConfig(context);
|
|
69
|
-
const result = evaluateIncomingChatAuthorization({
|
|
70
|
-
config: context.config,
|
|
71
|
-
channel: evaluateInput.channel,
|
|
72
|
-
input: evaluateInput,
|
|
73
|
-
authorizationConfig,
|
|
74
|
-
});
|
|
75
|
-
if (result.decision !== "allow") {
|
|
76
|
-
throw new Error(result.reason || "chat authorization blocked");
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
},
|
|
81
|
-
effect: {
|
|
82
|
-
[CHAT_PLUGIN_POINTS.observePrincipal]: [
|
|
83
|
-
async ({ context, value }) => {
|
|
84
|
-
const input = toRecord(value);
|
|
85
|
-
const channel = toChannel(input.channel);
|
|
86
|
-
if (!channel) {
|
|
87
|
-
throw new Error("chat.observePrincipal requires a valid channel");
|
|
88
|
-
}
|
|
89
|
-
await recordObservedAuthorizationPrincipal({
|
|
90
|
-
context,
|
|
91
|
-
channel,
|
|
92
|
-
chatId: String(input.chatId || "").trim(),
|
|
93
|
-
...(typeof input.chatType === "string"
|
|
94
|
-
? { chatType: input.chatType.trim() }
|
|
95
|
-
: {}),
|
|
96
|
-
...(typeof input.chatTitle === "string"
|
|
97
|
-
? { chatTitle: input.chatTitle.trim() }
|
|
98
|
-
: {}),
|
|
99
|
-
...(typeof input.userId === "string"
|
|
100
|
-
? { userId: input.userId.trim() }
|
|
101
|
-
: {}),
|
|
102
|
-
...(typeof input.username === "string"
|
|
103
|
-
? { username: input.username.trim() }
|
|
104
|
-
: {}),
|
|
105
|
-
});
|
|
106
|
-
},
|
|
107
|
-
],
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
resolves: {
|
|
111
|
-
[CHAT_PLUGIN_POINTS.resolveUserRole]: async ({ context, value }) => {
|
|
112
|
-
const input = value && typeof value === "object" && !Array.isArray(value)
|
|
113
|
-
? value
|
|
114
|
-
: {};
|
|
115
|
-
const channel = toChannel(input.channel);
|
|
116
|
-
if (!channel) {
|
|
117
|
-
throw new Error("chat.resolveUserRole requires a valid channel");
|
|
118
|
-
}
|
|
119
|
-
const role = resolveAuthorizedUserRole({
|
|
120
|
-
channel,
|
|
121
|
-
userId: String(input.userId || "").trim(),
|
|
122
|
-
rootPath: context.rootPath,
|
|
123
|
-
});
|
|
124
|
-
return (role || null);
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
actions: {
|
|
128
|
-
[CHAT_AUTHORIZATION_ACTIONS.snapshot]: {
|
|
129
|
-
execute: async ({ context }) => {
|
|
130
|
-
const snapshot = await readAuthorizationSnapshot({
|
|
131
|
-
context,
|
|
132
|
-
});
|
|
133
|
-
return {
|
|
134
|
-
success: true,
|
|
135
|
-
data: toSnapshotData(snapshot),
|
|
136
|
-
};
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
[CHAT_AUTHORIZATION_ACTIONS.readConfig]: {
|
|
140
|
-
execute: async ({ context }) => {
|
|
141
|
-
return {
|
|
142
|
-
success: true,
|
|
143
|
-
data: readChatAuthorizationConfig(context),
|
|
144
|
-
};
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
[CHAT_AUTHORIZATION_ACTIONS.writeConfig]: {
|
|
148
|
-
execute: async ({ context, payload }) => {
|
|
149
|
-
const body = toRecord(payload);
|
|
150
|
-
const nextConfig = body.config && typeof body.config === "object" && !Array.isArray(body.config)
|
|
151
|
-
? body.config
|
|
152
|
-
: {};
|
|
153
|
-
await writeChatAuthorizationConfig({
|
|
154
|
-
context,
|
|
155
|
-
nextConfig,
|
|
156
|
-
});
|
|
157
|
-
return {
|
|
158
|
-
success: true,
|
|
159
|
-
data: readChatAuthorizationConfig(context),
|
|
160
|
-
};
|
|
161
|
-
},
|
|
162
|
-
},
|
|
163
|
-
[CHAT_AUTHORIZATION_ACTIONS.setUserRole]: {
|
|
164
|
-
execute: async ({ context, payload }) => {
|
|
165
|
-
const body = toRecord(payload);
|
|
166
|
-
const channel = toChannel(body.channel);
|
|
167
|
-
if (!channel) {
|
|
168
|
-
return {
|
|
169
|
-
success: false,
|
|
170
|
-
error: "set-user-role requires a valid channel",
|
|
171
|
-
message: "set-user-role requires a valid channel",
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
await setChatAuthorizationUserRole({
|
|
175
|
-
context,
|
|
176
|
-
channel,
|
|
177
|
-
userId: String(body.userId || "").trim(),
|
|
178
|
-
roleId: String(body.roleId || "").trim(),
|
|
179
|
-
});
|
|
180
|
-
return {
|
|
181
|
-
success: true,
|
|
182
|
-
data: readChatAuthorizationConfig(context),
|
|
183
|
-
};
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* ChatAuthorizationPlugin:统一承载聊天用户授权能力。
|
|
191
|
-
*/
|
|
192
|
-
export class ChatAuthorizationPlugin extends BasePlugin {
|
|
193
|
-
name = CHAT_AUTHORIZATION_PLUGIN_NAME;
|
|
194
|
-
constructor() {
|
|
195
|
-
super();
|
|
196
|
-
Object.assign(this, createChatAuthorizationPluginDefinition());
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
//# sourceMappingURL=Plugin.js.map
|
package/bin/auth/Plugin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../../src/auth/Plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChatPlugin SDK / runtime 配置类型。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 这里定义 `new ChatPlugin({...})` 的显式注入接口。
|
|
6
|
-
* - 构造参数只承载显式渠道配置与 queue 行为,不再承载自定义存储/解析器注入。
|
|
7
|
-
* - 若未显式提供渠道凭据,ChatPlugin 会直接回退到默认全局账号池 `~/.downcity/downcity.db`。
|
|
8
|
-
*/
|
|
9
|
-
import type { ChatQueueWorkerConfig } from "../chat/types/ChatQueueWorker.js";
|
|
10
|
-
/**
|
|
11
|
-
* Telegram 显式渠道配置。
|
|
12
|
-
*/
|
|
13
|
-
export interface ChatPluginTelegramOptions {
|
|
14
|
-
/**
|
|
15
|
-
* 是否启用当前渠道。
|
|
16
|
-
*
|
|
17
|
-
* 说明(中文)
|
|
18
|
-
* - 省略时,若显式提供了 `botToken`,默认视为启用。
|
|
19
|
-
* - 传入 `false` 时会强制关闭,即使提供了凭据也不会启动。
|
|
20
|
-
*/
|
|
21
|
-
enabled?: boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Telegram Bot Token。
|
|
24
|
-
*/
|
|
25
|
-
botToken: string;
|
|
26
|
-
/**
|
|
27
|
-
* 可选的显式账户 ID。
|
|
28
|
-
*
|
|
29
|
-
* 说明(中文)
|
|
30
|
-
* - 主要用于让上层产品把 runtime 渠道与自己的 account 池关联起来。
|
|
31
|
-
* - 省略时会使用 runtime 合成的临时 ID。
|
|
32
|
-
*/
|
|
33
|
-
channelAccountId?: string;
|
|
34
|
-
/**
|
|
35
|
-
* 渠道展示名。
|
|
36
|
-
*/
|
|
37
|
-
name?: string;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Feishu 显式渠道配置。
|
|
41
|
-
*/
|
|
42
|
-
export interface ChatPluginFeishuOptions {
|
|
43
|
-
/**
|
|
44
|
-
* 是否启用当前渠道。
|
|
45
|
-
*/
|
|
46
|
-
enabled?: boolean;
|
|
47
|
-
/**
|
|
48
|
-
* Feishu / Lark App ID。
|
|
49
|
-
*/
|
|
50
|
-
appId: string;
|
|
51
|
-
/**
|
|
52
|
-
* Feishu / Lark App Secret。
|
|
53
|
-
*/
|
|
54
|
-
appSecret: string;
|
|
55
|
-
/**
|
|
56
|
-
* 可选的 Open API 域名。
|
|
57
|
-
*/
|
|
58
|
-
domain?: string;
|
|
59
|
-
/**
|
|
60
|
-
* 可选的显式账户 ID。
|
|
61
|
-
*/
|
|
62
|
-
channelAccountId?: string;
|
|
63
|
-
/**
|
|
64
|
-
* 渠道展示名。
|
|
65
|
-
*/
|
|
66
|
-
name?: string;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* QQ 显式渠道配置。
|
|
70
|
-
*/
|
|
71
|
-
export interface ChatPluginQqOptions {
|
|
72
|
-
/**
|
|
73
|
-
* 是否启用当前渠道。
|
|
74
|
-
*/
|
|
75
|
-
enabled?: boolean;
|
|
76
|
-
/**
|
|
77
|
-
* QQ Bot App ID。
|
|
78
|
-
*/
|
|
79
|
-
appId: string;
|
|
80
|
-
/**
|
|
81
|
-
* QQ Bot App Secret。
|
|
82
|
-
*/
|
|
83
|
-
appSecret: string;
|
|
84
|
-
/**
|
|
85
|
-
* 是否使用 QQ 沙箱模式。
|
|
86
|
-
*/
|
|
87
|
-
sandbox?: boolean;
|
|
88
|
-
/**
|
|
89
|
-
* 可选的显式账户 ID。
|
|
90
|
-
*/
|
|
91
|
-
channelAccountId?: string;
|
|
92
|
-
/**
|
|
93
|
-
* 渠道展示名。
|
|
94
|
-
*/
|
|
95
|
-
name?: string;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* ChatPlugin 显式构造参数。
|
|
99
|
-
*/
|
|
100
|
-
export interface ChatPluginOptions {
|
|
101
|
-
/**
|
|
102
|
-
* Chat queue worker 运行配置。
|
|
103
|
-
*
|
|
104
|
-
* 说明(中文)
|
|
105
|
-
* - 显式传入时优先级高于 `downcity.json.plugins.chat.queue`。
|
|
106
|
-
* - 可用于不同 client 定制并发、突发合并等行为。
|
|
107
|
-
*/
|
|
108
|
-
queue?: Partial<ChatQueueWorkerConfig>;
|
|
109
|
-
/**
|
|
110
|
-
* Telegram 渠道显式配置。
|
|
111
|
-
*/
|
|
112
|
-
telegram?: ChatPluginTelegramOptions;
|
|
113
|
-
/**
|
|
114
|
-
* Feishu 渠道显式配置。
|
|
115
|
-
*/
|
|
116
|
-
feishu?: ChatPluginFeishuOptions;
|
|
117
|
-
/**
|
|
118
|
-
* QQ 渠道显式配置。
|
|
119
|
-
*/
|
|
120
|
-
qq?: ChatPluginQqOptions;
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=ChatPluginTypes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPluginTypes.d.ts","sourceRoot":"","sources":["../../src/chat/ChatPluginTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC;;OAEG;IACH,EAAE,CAAC,EAAE,mBAAmB,CAAC;CAC1B"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChatPlugin SDK / runtime 配置类型。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 这里定义 `new ChatPlugin({...})` 的显式注入接口。
|
|
6
|
-
* - 构造参数只承载显式渠道配置与 queue 行为,不再承载自定义存储/解析器注入。
|
|
7
|
-
* - 若未显式提供渠道凭据,ChatPlugin 会直接回退到默认全局账号池 `~/.downcity/downcity.db`。
|
|
8
|
-
*/
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=ChatPluginTypes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPluginTypes.js","sourceRoot":"","sources":["../../src/chat/ChatPluginTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeSkill.d.ts","sourceRoot":"","sources":["../../../src/skill/types/ClaudeSkill.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,MAAM,EAAE,eAAe,CAAC;IACxB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeSkill.js","sourceRoot":"","sources":["../../../src/skill/types/ClaudeSkill.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
package/src/auth/Plugin.ts
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChatAuthorizationPlugin。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - chat-authorization 是内建且必需的 plugin,不走可选启停语义。
|
|
6
|
-
* - 静态授权配置与动态观测态都收敛在项目 `.downcity/chat/authorization/`。
|
|
7
|
-
* - 它只负责聊天主体授权,不负责 Town HTTP Bearer token 或路由访问鉴权。
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { BasePlugin } from "@downcity/agent/internal/plugin/core/BasePlugin.js";
|
|
11
|
-
import type { Plugin } from "@downcity/agent/internal/plugin/types/Plugin.js";
|
|
12
|
-
import type { JsonValue } from "@downcity/agent/internal/types/common/Json.js";
|
|
13
|
-
import { CHAT_PLUGIN_POINTS } from "@/chat/runtime/PluginPoints.js";
|
|
14
|
-
import {
|
|
15
|
-
CHAT_AUTHORIZATION_ACTIONS,
|
|
16
|
-
CHAT_AUTHORIZATION_CATALOG,
|
|
17
|
-
CHAT_AUTHORIZATION_PLUGIN_NAME,
|
|
18
|
-
type ChatAuthorizationObservePrincipalPayload,
|
|
19
|
-
type ChatAuthorizationSetUserRolePayload,
|
|
20
|
-
type ChatAuthorizationWriteConfigPayload,
|
|
21
|
-
type ChatAuthorizationConfig,
|
|
22
|
-
type ChatAuthorizationEvaluateInput,
|
|
23
|
-
type ChatAuthorizationSnapshot,
|
|
24
|
-
} from "@/auth/types/AuthPlugin.js";
|
|
25
|
-
import {
|
|
26
|
-
readChatAuthorizationConfig,
|
|
27
|
-
setChatAuthorizationUserRole,
|
|
28
|
-
writeChatAuthorizationConfig,
|
|
29
|
-
} from "@/auth/runtime/AuthorizationConfig.js";
|
|
30
|
-
import {
|
|
31
|
-
evaluateIncomingChatAuthorization,
|
|
32
|
-
resolveAuthorizedUserRole,
|
|
33
|
-
} from "@/auth/runtime/AuthorizationPolicy.js";
|
|
34
|
-
import {
|
|
35
|
-
readAuthorizationSnapshot,
|
|
36
|
-
recordObservedAuthorizationPrincipal,
|
|
37
|
-
} from "@/auth/runtime/AuthorizationStore.js";
|
|
38
|
-
import type { ChatDispatchChannel } from "@/chat/types/ChatDispatcher.js";
|
|
39
|
-
|
|
40
|
-
function toChannel(value: unknown): ChatDispatchChannel | null {
|
|
41
|
-
const text = String(value || "").trim().toLowerCase();
|
|
42
|
-
if (text === "telegram" || text === "feishu" || text === "qq") return text;
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function toRecord(value: unknown): Record<string, unknown> {
|
|
47
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
48
|
-
return value as Record<string, unknown>;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function toEvaluateInput(payload: Record<string, unknown>): ChatAuthorizationEvaluateInput {
|
|
52
|
-
const channel = toChannel(payload.channel);
|
|
53
|
-
if (!channel) {
|
|
54
|
-
throw new Error("chat-authorization.authorize_incoming requires a valid channel");
|
|
55
|
-
}
|
|
56
|
-
return {
|
|
57
|
-
channel,
|
|
58
|
-
chatId: String(payload.chatId || "").trim(),
|
|
59
|
-
...(typeof payload.chatType === "string" ? { chatType: payload.chatType.trim() } : {}),
|
|
60
|
-
...(typeof payload.userId === "string" ? { userId: payload.userId.trim() } : {}),
|
|
61
|
-
...(typeof payload.username === "string" ? { username: payload.username.trim() } : {}),
|
|
62
|
-
...(typeof payload.chatTitle === "string" ? { chatTitle: payload.chatTitle.trim() } : {}),
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function toSnapshotData(snapshot: ChatAuthorizationSnapshot): JsonValue {
|
|
67
|
-
return {
|
|
68
|
-
catalog: CHAT_AUTHORIZATION_CATALOG as unknown as JsonValue,
|
|
69
|
-
config: snapshot.config as unknown as JsonValue,
|
|
70
|
-
users: snapshot.users as unknown as JsonValue,
|
|
71
|
-
chats: snapshot.chats as unknown as JsonValue,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function createChatAuthorizationPluginDefinition(): Plugin {
|
|
76
|
-
return {
|
|
77
|
-
name: CHAT_AUTHORIZATION_PLUGIN_NAME,
|
|
78
|
-
title: "Chat Access",
|
|
79
|
-
description:
|
|
80
|
-
"Controls who can talk to the agent through chat platforms, records observed users and chats, and resolves each user's effective role for downstream service decisions.",
|
|
81
|
-
availability() {
|
|
82
|
-
return {
|
|
83
|
-
enabled: true,
|
|
84
|
-
available: true,
|
|
85
|
-
reasons: [],
|
|
86
|
-
};
|
|
87
|
-
},
|
|
88
|
-
hooks: {
|
|
89
|
-
guard: {
|
|
90
|
-
[CHAT_PLUGIN_POINTS.authorizeIncoming]: [
|
|
91
|
-
async ({ context, value }) => {
|
|
92
|
-
const input =
|
|
93
|
-
value && typeof value === "object" && !Array.isArray(value)
|
|
94
|
-
? (value as Record<string, unknown>)
|
|
95
|
-
: {};
|
|
96
|
-
const evaluateInput = toEvaluateInput(input);
|
|
97
|
-
const authorizationConfig = readChatAuthorizationConfig(context);
|
|
98
|
-
const result = evaluateIncomingChatAuthorization({
|
|
99
|
-
config: context.config,
|
|
100
|
-
channel: evaluateInput.channel,
|
|
101
|
-
input: evaluateInput,
|
|
102
|
-
authorizationConfig,
|
|
103
|
-
});
|
|
104
|
-
if (result.decision !== "allow") {
|
|
105
|
-
throw new Error(result.reason || "chat authorization blocked");
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
effect: {
|
|
111
|
-
[CHAT_PLUGIN_POINTS.observePrincipal]: [
|
|
112
|
-
async ({ context, value }) => {
|
|
113
|
-
const input = toRecord(
|
|
114
|
-
value,
|
|
115
|
-
) as unknown as ChatAuthorizationObservePrincipalPayload;
|
|
116
|
-
const channel = toChannel(input.channel);
|
|
117
|
-
if (!channel) {
|
|
118
|
-
throw new Error("chat.observePrincipal requires a valid channel");
|
|
119
|
-
}
|
|
120
|
-
await recordObservedAuthorizationPrincipal({
|
|
121
|
-
context,
|
|
122
|
-
channel,
|
|
123
|
-
chatId: String(input.chatId || "").trim(),
|
|
124
|
-
...(typeof input.chatType === "string"
|
|
125
|
-
? { chatType: input.chatType.trim() }
|
|
126
|
-
: {}),
|
|
127
|
-
...(typeof input.chatTitle === "string"
|
|
128
|
-
? { chatTitle: input.chatTitle.trim() }
|
|
129
|
-
: {}),
|
|
130
|
-
...(typeof input.userId === "string"
|
|
131
|
-
? { userId: input.userId.trim() }
|
|
132
|
-
: {}),
|
|
133
|
-
...(typeof input.username === "string"
|
|
134
|
-
? { username: input.username.trim() }
|
|
135
|
-
: {}),
|
|
136
|
-
});
|
|
137
|
-
},
|
|
138
|
-
],
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
resolves: {
|
|
142
|
-
[CHAT_PLUGIN_POINTS.resolveUserRole]: async ({ context, value }) => {
|
|
143
|
-
const input =
|
|
144
|
-
value && typeof value === "object" && !Array.isArray(value)
|
|
145
|
-
? (value as Record<string, unknown>)
|
|
146
|
-
: {};
|
|
147
|
-
const channel = toChannel(input.channel);
|
|
148
|
-
if (!channel) {
|
|
149
|
-
throw new Error("chat.resolveUserRole requires a valid channel");
|
|
150
|
-
}
|
|
151
|
-
const role = resolveAuthorizedUserRole({
|
|
152
|
-
channel,
|
|
153
|
-
userId: String(input.userId || "").trim(),
|
|
154
|
-
rootPath: context.rootPath,
|
|
155
|
-
});
|
|
156
|
-
return ((role || null) as unknown) as JsonValue;
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
actions: {
|
|
160
|
-
[CHAT_AUTHORIZATION_ACTIONS.snapshot]: {
|
|
161
|
-
execute: async ({ context }) => {
|
|
162
|
-
const snapshot = await readAuthorizationSnapshot({
|
|
163
|
-
context,
|
|
164
|
-
});
|
|
165
|
-
return {
|
|
166
|
-
success: true,
|
|
167
|
-
data: toSnapshotData(snapshot),
|
|
168
|
-
};
|
|
169
|
-
},
|
|
170
|
-
},
|
|
171
|
-
[CHAT_AUTHORIZATION_ACTIONS.readConfig]: {
|
|
172
|
-
execute: async ({ context }) => {
|
|
173
|
-
return {
|
|
174
|
-
success: true,
|
|
175
|
-
data: readChatAuthorizationConfig(context) as unknown as JsonValue,
|
|
176
|
-
};
|
|
177
|
-
},
|
|
178
|
-
},
|
|
179
|
-
[CHAT_AUTHORIZATION_ACTIONS.writeConfig]: {
|
|
180
|
-
execute: async ({ context, payload }) => {
|
|
181
|
-
const body = toRecord(
|
|
182
|
-
payload,
|
|
183
|
-
) as unknown as ChatAuthorizationWriteConfigPayload;
|
|
184
|
-
const nextConfig =
|
|
185
|
-
body.config && typeof body.config === "object" && !Array.isArray(body.config)
|
|
186
|
-
? (body.config as ChatAuthorizationConfig)
|
|
187
|
-
: {};
|
|
188
|
-
await writeChatAuthorizationConfig({
|
|
189
|
-
context,
|
|
190
|
-
nextConfig,
|
|
191
|
-
});
|
|
192
|
-
return {
|
|
193
|
-
success: true,
|
|
194
|
-
data: readChatAuthorizationConfig(context) as unknown as JsonValue,
|
|
195
|
-
};
|
|
196
|
-
},
|
|
197
|
-
},
|
|
198
|
-
[CHAT_AUTHORIZATION_ACTIONS.setUserRole]: {
|
|
199
|
-
execute: async ({ context, payload }) => {
|
|
200
|
-
const body = toRecord(
|
|
201
|
-
payload,
|
|
202
|
-
) as unknown as ChatAuthorizationSetUserRolePayload;
|
|
203
|
-
const channel = toChannel(body.channel);
|
|
204
|
-
if (!channel) {
|
|
205
|
-
return {
|
|
206
|
-
success: false,
|
|
207
|
-
error: "set-user-role requires a valid channel",
|
|
208
|
-
message: "set-user-role requires a valid channel",
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
await setChatAuthorizationUserRole({
|
|
212
|
-
context,
|
|
213
|
-
channel,
|
|
214
|
-
userId: String(body.userId || "").trim(),
|
|
215
|
-
roleId: String(body.roleId || "").trim(),
|
|
216
|
-
});
|
|
217
|
-
return {
|
|
218
|
-
success: true,
|
|
219
|
-
data: readChatAuthorizationConfig(context) as unknown as JsonValue,
|
|
220
|
-
};
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
},
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* ChatAuthorizationPlugin:统一承载聊天用户授权能力。
|
|
229
|
-
*/
|
|
230
|
-
export class ChatAuthorizationPlugin extends BasePlugin {
|
|
231
|
-
readonly name = CHAT_AUTHORIZATION_PLUGIN_NAME;
|
|
232
|
-
|
|
233
|
-
constructor() {
|
|
234
|
-
super();
|
|
235
|
-
Object.assign(this, createChatAuthorizationPluginDefinition());
|
|
236
|
-
}
|
|
237
|
-
}
|