page-action-cache 1.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.
- package/dist/actions-executor.d.ts +62 -0
- package/dist/actions-executor.d.ts.map +1 -0
- package/dist/actions-executor.js +339 -0
- package/dist/actions-executor.js.map +1 -0
- package/dist/cache-invalidator.d.ts +70 -0
- package/dist/cache-invalidator.d.ts.map +1 -0
- package/dist/cache-invalidator.js +212 -0
- package/dist/cache-invalidator.js.map +1 -0
- package/dist/cache-store.d.ts +80 -0
- package/dist/cache-store.d.ts.map +1 -0
- package/dist/cache-store.js +361 -0
- package/dist/cache-store.js.map +1 -0
- package/dist/cache-strategy.d.ts +65 -0
- package/dist/cache-strategy.d.ts.map +1 -0
- package/dist/cache-strategy.js +237 -0
- package/dist/cache-strategy.js.map +1 -0
- package/dist/hooks-entry.d.ts +18 -0
- package/dist/hooks-entry.d.ts.map +1 -0
- package/dist/hooks-entry.js +27 -0
- package/dist/hooks-entry.js.map +1 -0
- package/dist/hooks.d.ts +10 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +277 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/scenario-recognizer.d.ts +45 -0
- package/dist/scenario-recognizer.d.ts.map +1 -0
- package/dist/scenario-recognizer.js +213 -0
- package/dist/scenario-recognizer.js.map +1 -0
- package/dist/security-policy.d.ts +62 -0
- package/dist/security-policy.d.ts.map +1 -0
- package/dist/security-policy.js +219 -0
- package/dist/security-policy.js.map +1 -0
- package/dist/tools.d.ts +209 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +383 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +336 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/ux-enhancer.d.ts +60 -0
- package/dist/ux-enhancer.d.ts.map +1 -0
- package/dist/ux-enhancer.js +218 -0
- package/dist/ux-enhancer.js.map +1 -0
- package/dist/variable-resolver.d.ts +28 -0
- package/dist/variable-resolver.d.ts.map +1 -0
- package/dist/variable-resolver.js +201 -0
- package/dist/variable-resolver.js.map +1 -0
- package/docs/API.md +555 -0
- package/docs/IMPLEMENTATION.md +1792 -0
- package/docs/INTEGRATION.md +387 -0
- package/docs/README.md +183 -0
- package/index.ts +118 -0
- package/openclaw.plugin.json +208 -0
- package/package.json +76 -0
- package/skills/page-action-cache/SKILL.md +216 -0
- package/src/actions-executor.ts +441 -0
- package/src/cache-invalidator.ts +271 -0
- package/src/cache-store.ts +457 -0
- package/src/cache-strategy.ts +327 -0
- package/src/hooks-entry.ts +114 -0
- package/src/hooks.ts +332 -0
- package/src/index.ts +104 -0
- package/src/scenario-recognizer.ts +259 -0
- package/src/security-policy.ts +268 -0
- package/src/tools.ts +437 -0
- package/src/types.ts +482 -0
- package/src/ux-enhancer.ts +266 -0
- package/src/variable-resolver.ts +258 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Variable Resolver
|
|
3
|
+
* 变量解析器 - 从用户输入提取变量
|
|
4
|
+
*/
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// 登录变量解析器
|
|
7
|
+
// ============================================================================
|
|
8
|
+
/**
|
|
9
|
+
* 登录变量解析器
|
|
10
|
+
*/
|
|
11
|
+
class LoginVariableResolver {
|
|
12
|
+
resolve(userInput) {
|
|
13
|
+
const result = {};
|
|
14
|
+
// 解析 "用户名 xxx 密码 xxx"
|
|
15
|
+
const usernameMatch = /(?:用户名|账号|username|user|用户)[::\s]*([\u4e00-\u9fa5a-zA-Z0-9@._+-]+)/gi.exec(userInput);
|
|
16
|
+
if (usernameMatch) {
|
|
17
|
+
result.username = usernameMatch[1].trim();
|
|
18
|
+
}
|
|
19
|
+
const passwordMatch = /(?:密码|password|pwd|pass)[::\s]*(.+)/gi.exec(userInput);
|
|
20
|
+
if (passwordMatch) {
|
|
21
|
+
result.password = passwordMatch[1].trim();
|
|
22
|
+
}
|
|
23
|
+
// 尝试提取邮箱格式
|
|
24
|
+
const emailMatch = /[\w.-]+@[\w.-]+\.\w+/.exec(userInput);
|
|
25
|
+
if (emailMatch && !result.username) {
|
|
26
|
+
result.username = emailMatch[0];
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// 支付变量解析器
|
|
33
|
+
// ============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* 支付变量解析器
|
|
36
|
+
*/
|
|
37
|
+
class CheckoutVariableResolver {
|
|
38
|
+
resolve(userInput) {
|
|
39
|
+
const result = {};
|
|
40
|
+
// 解析支付方式
|
|
41
|
+
const paymentMatch = /(?:支付方式|payment method)[::\s]*(.+)/gi.exec(userInput);
|
|
42
|
+
if (paymentMatch) {
|
|
43
|
+
const custom = result.custom || {};
|
|
44
|
+
result.custom = { ...custom, paymentMethod: paymentMatch[1].trim() };
|
|
45
|
+
}
|
|
46
|
+
// 解析金额
|
|
47
|
+
const amountMatch = /(?:金额|amount)[::\s]*([\d.]+)/gi.exec(userInput);
|
|
48
|
+
if (amountMatch) {
|
|
49
|
+
const custom = result.custom || {};
|
|
50
|
+
result.custom = { ...custom, amount: amountMatch[1] };
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// 搜索变量解析器
|
|
57
|
+
// ============================================================================
|
|
58
|
+
/**
|
|
59
|
+
* 搜索变量解析器
|
|
60
|
+
*/
|
|
61
|
+
class SearchVariableResolver {
|
|
62
|
+
resolve(userInput) {
|
|
63
|
+
const result = {};
|
|
64
|
+
// 解析搜索关键词(提取"搜索"或"找"后面的内容)
|
|
65
|
+
const searchMatch = /(?:搜索|查找|找|search)[::\s]*(.+)/gi.exec(userInput);
|
|
66
|
+
if (searchMatch) {
|
|
67
|
+
const custom = result.custom || {};
|
|
68
|
+
result.custom = { ...custom, query: searchMatch[1].trim() };
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// 设置变量解析器
|
|
75
|
+
// ============================================================================
|
|
76
|
+
/**
|
|
77
|
+
* 设置变量解析器
|
|
78
|
+
*/
|
|
79
|
+
class SettingsVariableResolver {
|
|
80
|
+
resolve(userInput) {
|
|
81
|
+
const result = {};
|
|
82
|
+
// 解析键值对
|
|
83
|
+
const kvMatches = [...userInput.matchAll(/(\w+)[::]\s*([^\s]+)/g)];
|
|
84
|
+
for (const match of kvMatches) {
|
|
85
|
+
const custom = result.custom || {};
|
|
86
|
+
result.custom = {
|
|
87
|
+
...custom,
|
|
88
|
+
[match[1]]: match[2].trim(),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// 通用变量解析器
|
|
96
|
+
// ============================================================================
|
|
97
|
+
/**
|
|
98
|
+
* 通用变量解析器
|
|
99
|
+
*/
|
|
100
|
+
class GenericVariableResolver {
|
|
101
|
+
resolve(userInput) {
|
|
102
|
+
const result = {};
|
|
103
|
+
// 尝试提取常见变量
|
|
104
|
+
const patterns = [
|
|
105
|
+
{ key: "username", regex: /(?:user|username)[::]\s*(.+)/gi },
|
|
106
|
+
{ key: "email", regex: /(?:email|邮箱)[::]\s*(.+)/gi },
|
|
107
|
+
{ key: "phone", regex: /(?:phone|电话|手机)[::]\s*(.+)/gi },
|
|
108
|
+
{ key: "code", regex: /(?:code|验证码|码)[::]\s*(.+)/gi },
|
|
109
|
+
];
|
|
110
|
+
for (const pattern of patterns) {
|
|
111
|
+
const match = pattern.regex.exec(userInput);
|
|
112
|
+
if (match) {
|
|
113
|
+
result[pattern.key] = match[1].trim();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// 提取所有键值对
|
|
117
|
+
const kvMatches = [...userInput.matchAll(/(\w+)[::]\s*([^\s]+)/g)];
|
|
118
|
+
for (const match of kvMatches) {
|
|
119
|
+
if (!result[match[1]]) {
|
|
120
|
+
const custom = result.custom || {};
|
|
121
|
+
result.custom = { ...custom, [match[1]]: match[2].trim() };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ============================================================================
|
|
128
|
+
// Variable Resolver 类
|
|
129
|
+
// ============================================================================
|
|
130
|
+
/**
|
|
131
|
+
* 变量解析器
|
|
132
|
+
*/
|
|
133
|
+
export class VariableResolver {
|
|
134
|
+
/**
|
|
135
|
+
* 从用户输入提取变量
|
|
136
|
+
*/
|
|
137
|
+
resolveVariables(userInput, scenario) {
|
|
138
|
+
const resolver = this.getResolver(scenario);
|
|
139
|
+
return resolver.resolve(userInput);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 根据场景获取对应的解析器
|
|
143
|
+
*/
|
|
144
|
+
getResolver(scenario) {
|
|
145
|
+
switch (scenario) {
|
|
146
|
+
case "login":
|
|
147
|
+
case "login_with_vars":
|
|
148
|
+
return new LoginVariableResolver();
|
|
149
|
+
case "checkout":
|
|
150
|
+
case "payment":
|
|
151
|
+
return new CheckoutVariableResolver();
|
|
152
|
+
case "search":
|
|
153
|
+
return new SearchVariableResolver();
|
|
154
|
+
case "settings":
|
|
155
|
+
return new SettingsVariableResolver();
|
|
156
|
+
default:
|
|
157
|
+
return new GenericVariableResolver();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
// 辅助方法
|
|
162
|
+
// -------------------------------------------------------------------------
|
|
163
|
+
/**
|
|
164
|
+
* 验证变量
|
|
165
|
+
*/
|
|
166
|
+
validateVariables(variables, scenario) {
|
|
167
|
+
switch (scenario) {
|
|
168
|
+
case "login":
|
|
169
|
+
return !!(variables.username || variables.email);
|
|
170
|
+
case "checkout":
|
|
171
|
+
return true; // 支付场景可能有可选变量
|
|
172
|
+
default:
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 合并变量(后覆盖前)
|
|
178
|
+
*/
|
|
179
|
+
mergeVariables(base, override) {
|
|
180
|
+
const result = {
|
|
181
|
+
...base,
|
|
182
|
+
...override,
|
|
183
|
+
};
|
|
184
|
+
// 合并 custom 字段
|
|
185
|
+
const baseCustom = base.custom || {};
|
|
186
|
+
const overrideCustom = override.custom || {};
|
|
187
|
+
result.custom = { ...baseCustom, ...overrideCustom };
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// ============================================================================
|
|
192
|
+
// 单例
|
|
193
|
+
// ============================================================================
|
|
194
|
+
let variableResolverInstance = null;
|
|
195
|
+
export function getVariableResolver() {
|
|
196
|
+
if (!variableResolverInstance) {
|
|
197
|
+
variableResolverInstance = new VariableResolver();
|
|
198
|
+
}
|
|
199
|
+
return variableResolverInstance;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=variable-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-resolver.js","sourceRoot":"","sources":["../src/variable-resolver.ts"],"names":[],"mappings":"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"}
|