page-action-cache 1.0.4 → 2.0.1

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.
Files changed (89) hide show
  1. package/README.md +399 -0
  2. package/dist/browser-action-executor.d.ts +87 -0
  3. package/dist/browser-action-executor.d.ts.map +1 -0
  4. package/dist/browser-action-executor.js +283 -0
  5. package/dist/browser-action-executor.js.map +1 -0
  6. package/dist/cache-invalidation.d.ts +128 -0
  7. package/dist/cache-invalidation.d.ts.map +1 -0
  8. package/dist/cache-invalidation.js +262 -0
  9. package/dist/cache-invalidation.js.map +1 -0
  10. package/dist/cache-manager.d.ts +83 -0
  11. package/dist/cache-manager.d.ts.map +1 -0
  12. package/dist/cache-manager.js +184 -0
  13. package/dist/cache-manager.js.map +1 -0
  14. package/dist/index.d.ts +7 -21
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +249 -31
  17. package/dist/index.js.map +1 -1
  18. package/dist/multi-level-cache.d.ts +127 -0
  19. package/dist/multi-level-cache.d.ts.map +1 -0
  20. package/dist/multi-level-cache.js +362 -0
  21. package/dist/multi-level-cache.js.map +1 -0
  22. package/dist/scenario-recognizer.d.ts +17 -27
  23. package/dist/scenario-recognizer.d.ts.map +1 -1
  24. package/dist/scenario-recognizer.js +63 -183
  25. package/dist/scenario-recognizer.js.map +1 -1
  26. package/dist/types.d.ts +38 -312
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/types.js +2 -4
  29. package/dist/types.js.map +1 -1
  30. package/dist/variable-extractor.d.ts +56 -0
  31. package/dist/variable-extractor.d.ts.map +1 -0
  32. package/dist/variable-extractor.js +159 -0
  33. package/dist/variable-extractor.js.map +1 -0
  34. package/openclaw.plugin.json +12 -190
  35. package/package.json +29 -45
  36. package/src/browser-action-executor.ts +337 -0
  37. package/src/cache-invalidation.ts +338 -0
  38. package/src/cache-manager.ts +211 -0
  39. package/src/index.ts +306 -0
  40. package/src/multi-level-cache.ts +478 -0
  41. package/src/scenario-recognizer.ts +121 -0
  42. package/src/types-mock.d.ts +18 -0
  43. package/src/types.ts +66 -0
  44. package/src/variable-extractor.ts +204 -0
  45. package/dist/actions-executor.d.ts +0 -62
  46. package/dist/actions-executor.d.ts.map +0 -1
  47. package/dist/actions-executor.js +0 -339
  48. package/dist/actions-executor.js.map +0 -1
  49. package/dist/cache-invalidator.d.ts +0 -70
  50. package/dist/cache-invalidator.d.ts.map +0 -1
  51. package/dist/cache-invalidator.js +0 -212
  52. package/dist/cache-invalidator.js.map +0 -1
  53. package/dist/cache-store.d.ts +0 -80
  54. package/dist/cache-store.d.ts.map +0 -1
  55. package/dist/cache-store.js +0 -361
  56. package/dist/cache-store.js.map +0 -1
  57. package/dist/cache-strategy.d.ts +0 -65
  58. package/dist/cache-strategy.d.ts.map +0 -1
  59. package/dist/cache-strategy.js +0 -237
  60. package/dist/cache-strategy.js.map +0 -1
  61. package/dist/hooks-entry.d.ts +0 -29
  62. package/dist/hooks-entry.d.ts.map +0 -1
  63. package/dist/hooks-entry.js +0 -83
  64. package/dist/hooks-entry.js.map +0 -1
  65. package/dist/hooks.d.ts +0 -10
  66. package/dist/hooks.d.ts.map +0 -1
  67. package/dist/hooks.js +0 -277
  68. package/dist/hooks.js.map +0 -1
  69. package/dist/security-policy.d.ts +0 -62
  70. package/dist/security-policy.d.ts.map +0 -1
  71. package/dist/security-policy.js +0 -219
  72. package/dist/security-policy.js.map +0 -1
  73. package/dist/tools.d.ts +0 -209
  74. package/dist/tools.d.ts.map +0 -1
  75. package/dist/tools.js +0 -383
  76. package/dist/tools.js.map +0 -1
  77. package/dist/ux-enhancer.d.ts +0 -60
  78. package/dist/ux-enhancer.d.ts.map +0 -1
  79. package/dist/ux-enhancer.js +0 -218
  80. package/dist/ux-enhancer.js.map +0 -1
  81. package/dist/variable-resolver.d.ts +0 -28
  82. package/dist/variable-resolver.d.ts.map +0 -1
  83. package/dist/variable-resolver.js +0 -201
  84. package/dist/variable-resolver.js.map +0 -1
  85. package/docs/API.md +0 -555
  86. package/docs/IMPLEMENTATION.md +0 -1792
  87. package/docs/INTEGRATION.md +0 -387
  88. package/docs/README.md +0 -183
  89. package/skills/page-action-cache/SKILL.md +0 -216
package/dist/hooks.js DELETED
@@ -1,277 +0,0 @@
1
- /**
2
- * Hooks Integration
3
- * Hooks 集成 - 注册 OpenClaw Hooks 来拦截和增强浏览器操作
4
- */
5
- import { getCacheStore } from "./cache-store.js";
6
- import { getScenarioRecognizer } from "./scenario-recognizer.js";
7
- import { getVariableResolver } from "./variable-resolver.js";
8
- // ============================================================================
9
- // 默认配置
10
- // ============================================================================
11
- const DEFAULT_CONFIG = {
12
- // === 全局开关 ===
13
- enabled: true,
14
- autoUseCache: true,
15
- // === 场景识别 ===
16
- scenarioRecognitionEnabled: true,
17
- llmClassificationThreshold: 70,
18
- // === 缓存策略 ===
19
- cacheLevelStrategy: "auto",
20
- defaultCacheLevel: "L3",
21
- // === 缓存失效 ===
22
- pageChangeDetectionEnabled: true,
23
- changeInvalidationThreshold: 80,
24
- invalidationStrategy: "soft",
25
- maxVersionsPerEntry: 3,
26
- // === 变量系统 ===
27
- variableExtractionEnabled: true,
28
- allowUserConfirmVariables: false,
29
- // === 安全 ===
30
- encryptSensitiveCache: false,
31
- accessControlEnabled: false,
32
- allowedUserIds: [],
33
- logSanitizationEnabled: true,
34
- // === 用户体验 ===
35
- showCacheStatusToUser: true,
36
- enableUserCacheConfirmation: false,
37
- enableUserForcedRefresh: true,
38
- enableUserCacheErrorReport: true,
39
- // === 统计 ===
40
- trackExecutionStats: true,
41
- statsUpdateInterval: 60,
42
- };
43
- // ============================================================================
44
- // Hooks 注册
45
- // ============================================================================
46
- /**
47
- * 注册页面操作缓存扩展的 Hooks
48
- */
49
- export function registerPageActionCacheHooks(api, config) {
50
- const finalConfig = { ...DEFAULT_CONFIG, ...config };
51
- if (!finalConfig.enabled) {
52
- console.log("[PageActionCache] Extension disabled");
53
- return;
54
- }
55
- const cacheStore = getCacheStore();
56
- const scenarioRecognizer = getScenarioRecognizer();
57
- const variableResolver = getVariableResolver();
58
- // UX enhancer for future use
59
- // const uxEnhancer = getUXEnhancer();
60
- // -------------------------------------------------------------------------
61
- // before_tool_call hook - 场景识别和缓存拦截
62
- // -------------------------------------------------------------------------
63
- api.registerHook({
64
- name: "before_tool_call",
65
- priority: 100,
66
- description: "页面操作缓存 - 场景识别和缓存拦截",
67
- async handler(event, ctx) {
68
- if (event.tool.name !== "browser") {
69
- return { block: false };
70
- }
71
- const params = event.params;
72
- const url = params.url;
73
- const action = params.action;
74
- // 只缓存特定操作
75
- const cacheActions = ["navigate", "click", "type", "press", "hover"];
76
- if (!cacheActions.includes(action)) {
77
- return { block: false };
78
- }
79
- // 提取用户输入
80
- const userInput = extractUserInput(ctx);
81
- const currentUrl = url || ctx.currentUrl || "";
82
- // 场景识别
83
- if (finalConfig.scenarioRecognitionEnabled) {
84
- const match = await scenarioRecognizer.recognize(userInput, currentUrl);
85
- if (match && match.confidence >= 80) {
86
- // 高置信度匹配,返回 cacheInfo
87
- return {
88
- block: false,
89
- result: {
90
- cacheInfo: {
91
- exists: true,
92
- scenario: match.scenario,
93
- confidence: match.confidence,
94
- method: match.method,
95
- matchedPattern: match.matchedPattern,
96
- },
97
- },
98
- };
99
- }
100
- }
101
- // 检查缓存
102
- const viewport = extractViewport(ctx, params);
103
- const entry = cacheStore.get(url, viewport);
104
- if (entry) {
105
- const stats = cacheStore.getStats();
106
- // L3 缓存命中,返回 cacheInfo
107
- return {
108
- block: false,
109
- result: {
110
- cacheInfo: {
111
- exists: true,
112
- cacheLevel: entry.cacheLevel,
113
- scenario: entry.scenario,
114
- actions: entry.actions,
115
- variables: entry.variables,
116
- cacheKey: entry.key,
117
- },
118
- stats: {
119
- hitRate: stats.hitRate,
120
- savedTokens: stats.savedTokens,
121
- },
122
- },
123
- };
124
- }
125
- return { block: false };
126
- },
127
- });
128
- // -------------------------------------------------------------------------
129
- // after_tool_call hook - 保存 LLM 分析结果到缓存
130
- // -------------------------------------------------------------------------
131
- api.registerHook({
132
- name: "after_tool_call",
133
- priority: 100,
134
- description: "页面操作缓存 - 保存 LLM 分析结果",
135
- async handler(event, ctx) {
136
- if (event.tool.name !== "browser") {
137
- return;
138
- }
139
- const params = event.params;
140
- const url = params.url;
141
- const action = params.action;
142
- // 只缓存特定操作
143
- const cacheActions = ["navigate", "click", "type", "press", "hover"];
144
- if (!cacheActions.includes(action)) {
145
- return;
146
- }
147
- // 检查 LLM 是否返回了场景类型
148
- const result = event.result;
149
- const llmScenario = result.scenario;
150
- if (!llmScenario) {
151
- // 没有 LLM 标记的场景,不保存
152
- return;
153
- }
154
- // 识别场景并获取变量
155
- const userInput = extractUserInput(ctx);
156
- const scenarioMatch = await scenarioRecognizer.recognize(userInput, url);
157
- // 决定缓存层级
158
- let cacheLevel = "L3";
159
- if (finalConfig.cacheLevelStrategy === "auto" && scenarioMatch) {
160
- cacheLevel =
161
- scenarioMatch.confidence >= 85
162
- ? "L3"
163
- : scenarioMatch.confidence >= 70
164
- ? "L2"
165
- : "L1";
166
- }
167
- else {
168
- cacheLevel = finalConfig.defaultCacheLevel;
169
- }
170
- // 解析变量
171
- let variables;
172
- if (finalConfig.variableExtractionEnabled && scenarioMatch) {
173
- variables = variableResolver.resolveVariables(userInput, scenarioMatch.scenario);
174
- }
175
- // 保存到缓存
176
- const viewport = extractViewport(ctx, params);
177
- const actions = result.actions || [];
178
- if (actions.length > 0) {
179
- cacheStore.set(url, viewport, actions, {
180
- scenario: scenarioMatch?.scenario || llmScenario,
181
- cacheLevel,
182
- variables,
183
- description: result.description || `Cached ${llmScenario} actions`,
184
- pageType: result.pageType || "mixed",
185
- });
186
- console.log(`[PageActionCache] Saved cache entry: ${scenarioMatch?.scenario || llmScenario} (${cacheLevel})`);
187
- }
188
- },
189
- });
190
- // -------------------------------------------------------------------------
191
- // before_prompt_build hook - 注入缓存使用指南
192
- // -------------------------------------------------------------------------
193
- api.registerHook({
194
- name: "before_prompt_build",
195
- priority: 50,
196
- description: "页面操作缓存 - 注入缓存使用指南",
197
- async handler(_event, _ctx) {
198
- if (!finalConfig.autoUseCache) {
199
- return;
200
- }
201
- const stats = cacheStore.getStats();
202
- // 只在命中率较高时注入
203
- if (stats.hitRate < 30) {
204
- return;
205
- }
206
- // 构建缓存使用指南
207
- const guide = `
208
- 【页面操作缓存系统】
209
-
210
- 当前缓存统计:
211
- - 总条目数:${stats.totalEntries}
212
- - 总命中:${stats.totalHits}
213
- - 命中率:${stats.hitRate.toFixed(1)}%
214
-
215
- 已缓存的场景:
216
- ${cacheStore.getTopScenarios(5)}
217
-
218
- 使用方式:
219
- 1. 如果工具返回 cacheInfo 信息,优先使用 execute_cached 工具
220
- 2. 执行缓存操作可以大幅降低 token 消耗和操作延迟
221
- 3. 如果页面结构变化,缓存会自动失效
222
-
223
- 支持的场景:login, logout, search, checkout, settings, form_fill, navigate, screenshot
224
-
225
- 缓存层级:
226
- - L3: 场景级缓存(包含变量模板)- 高置信度时直接使用
227
- - L2: 流程级缓存 - 中置信度时使用
228
- - L1: 原子级缓存 - 低置信度或无场景时使用
229
-
230
- 可用的缓存工具:
231
- - execute_cached: 执行缓存的操作序列
232
- - cache_stats: 查看缓存统计
233
- - cache_list: 列出所有缓存
234
- - cache_clear: 清空缓存
235
- - scenario_list: 列出所有场景
236
- - force_refresh: 强制刷新指定缓存
237
- `;
238
- return { prependContext: guide };
239
- },
240
- });
241
- console.log("[PageActionCache] Hooks registered successfully");
242
- }
243
- // ============================================================================
244
- // 辅助函数
245
- // ============================================================================
246
- /**
247
- * 从上下文提取用户输入
248
- */
249
- function extractUserInput(ctx) {
250
- // 尝试从上下文中提取用户输入
251
- if (ctx.message?.content) {
252
- return ctx.message.content;
253
- }
254
- if (ctx.userInput) {
255
- return ctx.userInput;
256
- }
257
- if (ctx.prompt) {
258
- return ctx.prompt;
259
- }
260
- return "";
261
- }
262
- /**
263
- * 从上下文和参数提取视口尺寸
264
- */
265
- function extractViewport(ctx, params) {
266
- // 优先从参数获取
267
- if (params.viewport) {
268
- return params.viewport;
269
- }
270
- // 其次从上下文获取
271
- if (ctx.viewport) {
272
- return ctx.viewport;
273
- }
274
- // 默认值
275
- return { width: 1920, height: 1080 };
276
- }
277
- //# sourceMappingURL=hooks.js.map
package/dist/hooks.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- /**
2
- * Security Policy
3
- * 安全策略 - 敏感变量检测、加密存储、访问控制
4
- */
5
- import type { AtomicAction, PageActionCacheEntry, VariableMap } from "./types.js";
6
- /**
7
- * 安全策略
8
- */
9
- export declare class SecurityPolicy {
10
- private allowedUserIds;
11
- constructor(allowedUserIds?: string[]);
12
- /**
13
- * 检查操作是否包含敏感变量
14
- */
15
- isSensitiveAction(action: AtomicAction): boolean;
16
- /**
17
- * 检查变量映射是否包含敏感数据
18
- */
19
- hasSensitiveData(variables: VariableMap): boolean;
20
- /**
21
- * 获取敏感字段列表
22
- */
23
- getSensitiveFields(): string[];
24
- /**
25
- * 加密数据
26
- */
27
- encrypt(data: string): string;
28
- /**
29
- * 解密数据
30
- */
31
- decrypt(encrypted: string): string;
32
- /**
33
- * 加密缓存条目中的敏感变量
34
- */
35
- encryptCacheEntry(entry: PageActionCacheEntry): PageActionCacheEntry;
36
- /**
37
- * 解密缓存条目中的敏感变量
38
- */
39
- decryptCacheEntry(entry: PageActionCacheEntry): PageActionCacheEntry;
40
- /**
41
- * 检查是否允许访问
42
- */
43
- canAccessCache(userId?: string): boolean;
44
- /**
45
- * 添加允许的用户 ID
46
- */
47
- addAllowedUserId(userId: string): void;
48
- /**
49
- * 移除允许的用户 ID
50
- */
51
- removeAllowedUserId(userId: string): void;
52
- /**
53
- * 脱敏处理(用于日志输出)
54
- */
55
- sanitizeForLogging(data: any): any;
56
- /**
57
- * 脱敏处理操作列表
58
- */
59
- sanitizeActions(actions: AtomicAction[]): AtomicAction[];
60
- }
61
- export declare function getSecurityPolicy(allowedUserIds?: string[]): SecurityPolicy;
62
- //# sourceMappingURL=security-policy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-policy.d.ts","sourceRoot":"","sources":["../src/security-policy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuBlF;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,cAAc,CAAc;gBAExB,cAAc,GAAE,MAAM,EAAO;IAQzC;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAQhD;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO;IASjD;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAQ9B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAoB7B;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IA4BlC;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB;IAoBpE;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB;IAwBpE;;OAEG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAYxC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQzC;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG;IAsBlC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;CAYzD;AAQD,wBAAgB,iBAAiB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,CAK3E"}
@@ -1,219 +0,0 @@
1
- /**
2
- * Security Policy
3
- * 安全策略 - 敏感变量检测、加密存储、访问控制
4
- */
5
- import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
6
- // ============================================================================
7
- // 配置
8
- // ============================================================================
9
- const SENSITIVE_FIELDS = new Set([
10
- "password",
11
- "pwd",
12
- "token",
13
- "secret",
14
- "key",
15
- "code",
16
- "otp",
17
- ]);
18
- const ENCRYPTION_KEY = "default-key-change-in-production"; // 生产环境应从配置读取
19
- const ENCRYPTION_ALGORITHM = "aes-256-gcm";
20
- // ============================================================================
21
- // Security Policy 类
22
- // ============================================================================
23
- /**
24
- * 安全策略
25
- */
26
- export class SecurityPolicy {
27
- allowedUserIds;
28
- constructor(allowedUserIds = []) {
29
- this.allowedUserIds = new Set(allowedUserIds);
30
- }
31
- // -------------------------------------------------------------------------
32
- // 敏感字段检测
33
- // -------------------------------------------------------------------------
34
- /**
35
- * 检查操作是否包含敏感变量
36
- */
37
- isSensitiveAction(action) {
38
- if (!action.variable) {
39
- return false;
40
- }
41
- return SENSITIVE_FIELDS.has(action.variable.toLowerCase());
42
- }
43
- /**
44
- * 检查变量映射是否包含敏感数据
45
- */
46
- hasSensitiveData(variables) {
47
- for (const key of Object.keys(variables)) {
48
- if (SENSITIVE_FIELDS.has(key.toLowerCase())) {
49
- return true;
50
- }
51
- }
52
- return false;
53
- }
54
- /**
55
- * 获取敏感字段列表
56
- */
57
- getSensitiveFields() {
58
- return Array.from(SENSITIVE_FIELDS);
59
- }
60
- // -------------------------------------------------------------------------
61
- // 加密/解密
62
- // -------------------------------------------------------------------------
63
- /**
64
- * 加密数据
65
- */
66
- encrypt(data) {
67
- try {
68
- const iv = randomBytes(16);
69
- const cipher = createCipheriv(ENCRYPTION_ALGORITHM, Buffer.from(ENCRYPTION_KEY), iv);
70
- let encrypted = cipher.update(data, "utf8", "hex");
71
- encrypted += cipher.final("hex");
72
- const authTag = cipher.getAuthTag();
73
- return `${iv.toString("hex")}:${authTag.toString("hex")}:${encrypted}`;
74
- }
75
- catch (error) {
76
- console.error("[SecurityPolicy] Encryption failed:", error);
77
- return data; // 失败时返回原数据
78
- }
79
- }
80
- /**
81
- * 解密数据
82
- */
83
- decrypt(encrypted) {
84
- try {
85
- const [ivHex, authTagHex, data] = encrypted.split(":");
86
- if (!ivHex || !authTagHex || !data) {
87
- return encrypted; // 格式错误,返回原数据
88
- }
89
- const iv = Buffer.from(ivHex, "hex");
90
- const authTag = Buffer.from(authTagHex, "hex");
91
- const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, Buffer.from(ENCRYPTION_KEY), iv);
92
- decipher.setAuthTag(authTag);
93
- let decrypted = decipher.update(data, "hex", "utf8");
94
- decrypted += decipher.final("utf8");
95
- return decrypted;
96
- }
97
- catch (error) {
98
- console.error("[SecurityPolicy] Decryption failed:", error);
99
- return encrypted; // 失败时返回原数据
100
- }
101
- }
102
- /**
103
- * 加密缓存条目中的敏感变量
104
- */
105
- encryptCacheEntry(entry) {
106
- if (!entry.variables) {
107
- return entry;
108
- }
109
- const encrypted = { ...entry };
110
- encrypted.variables = {};
111
- for (const [key, value] of Object.entries(entry.variables)) {
112
- if (SENSITIVE_FIELDS.has(key.toLowerCase()) && typeof value === "string") {
113
- // 敏感字段加密
114
- encrypted.variables[key] = this.encrypt(value);
115
- }
116
- else {
117
- encrypted.variables[key] = value;
118
- }
119
- }
120
- return encrypted;
121
- }
122
- /**
123
- * 解密缓存条目中的敏感变量
124
- */
125
- decryptCacheEntry(entry) {
126
- if (!entry.variables) {
127
- return entry;
128
- }
129
- const decrypted = { ...entry };
130
- decrypted.variables = {};
131
- for (const [key, value] of Object.entries(entry.variables)) {
132
- if (SENSITIVE_FIELDS.has(key.toLowerCase()) && typeof value === "string") {
133
- // 敏感字段解密
134
- decrypted.variables[key] = this.decrypt(value);
135
- }
136
- else {
137
- decrypted.variables[key] = value;
138
- }
139
- }
140
- return decrypted;
141
- }
142
- // -------------------------------------------------------------------------
143
- // 访问控制
144
- // -------------------------------------------------------------------------
145
- /**
146
- * 检查是否允许访问
147
- */
148
- canAccessCache(userId) {
149
- if (this.allowedUserIds.size === 0) {
150
- return true; // 没有限制,允许所有用户
151
- }
152
- if (!userId) {
153
- return false; // 没有用户 ID,拒绝访问
154
- }
155
- return this.allowedUserIds.has(userId);
156
- }
157
- /**
158
- * 添加允许的用户 ID
159
- */
160
- addAllowedUserId(userId) {
161
- this.allowedUserIds.add(userId);
162
- }
163
- /**
164
- * 移除允许的用户 ID
165
- */
166
- removeAllowedUserId(userId) {
167
- this.allowedUserIds.delete(userId);
168
- }
169
- // -------------------------------------------------------------------------
170
- // 日志脱敏
171
- // -------------------------------------------------------------------------
172
- /**
173
- * 脱敏处理(用于日志输出)
174
- */
175
- sanitizeForLogging(data) {
176
- if (typeof data !== "object" || data === null) {
177
- return data;
178
- }
179
- const sanitized = Array.isArray(data) ? [] : {};
180
- for (const [key, value] of Object.entries(data)) {
181
- if (SENSITIVE_FIELDS.has(key.toLowerCase())) {
182
- // 敏感字段脱敏
183
- sanitized[key] = "***REDACTED***";
184
- }
185
- else if (typeof value === "object") {
186
- // 递归处理嵌套对象
187
- sanitized[key] = this.sanitizeForLogging(value);
188
- }
189
- else {
190
- sanitized[key] = value;
191
- }
192
- }
193
- return sanitized;
194
- }
195
- /**
196
- * 脱敏处理操作列表
197
- */
198
- sanitizeActions(actions) {
199
- return actions.map((action) => {
200
- const sanitized = { ...action };
201
- // 脱敏操作中的敏感文本
202
- if (sanitized.type === "type" && this.isSensitiveAction(action)) {
203
- sanitized.text = "***REDACTED***";
204
- }
205
- return sanitized;
206
- });
207
- }
208
- }
209
- // ============================================================================
210
- // 单例
211
- // ============================================================================
212
- let securityPolicyInstance = null;
213
- export function getSecurityPolicy(allowedUserIds) {
214
- if (!securityPolicyInstance) {
215
- securityPolicyInstance = new SecurityPolicy(allowedUserIds);
216
- }
217
- return securityPolicyInstance;
218
- }
219
- //# sourceMappingURL=security-policy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-policy.js","sourceRoot":"","sources":["../src/security-policy.ts"],"names":[],"mappings":"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"}