@keak/webmcp-core 0.1.0

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/dist/config.d.ts +103 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +54 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/exporter/manifest.d.ts +6 -0
  8. package/dist/exporter/manifest.d.ts.map +1 -0
  9. package/dist/exporter/manifest.js +36 -0
  10. package/dist/exporter/manifest.js.map +1 -0
  11. package/dist/exporter/snippet.d.ts +7 -0
  12. package/dist/exporter/snippet.d.ts.map +1 -0
  13. package/dist/exporter/snippet.js +197 -0
  14. package/dist/exporter/snippet.js.map +1 -0
  15. package/dist/exporter/userscript.d.ts +6 -0
  16. package/dist/exporter/userscript.d.ts.map +1 -0
  17. package/dist/exporter/userscript.js +53 -0
  18. package/dist/exporter/userscript.js.map +1 -0
  19. package/dist/exporter/yaml.d.ts +6 -0
  20. package/dist/exporter/yaml.d.ts.map +1 -0
  21. package/dist/exporter/yaml.js +90 -0
  22. package/dist/exporter/yaml.js.map +1 -0
  23. package/dist/extractor/api-extractor.d.ts +3 -0
  24. package/dist/extractor/api-extractor.d.ts.map +1 -0
  25. package/dist/extractor/api-extractor.js +274 -0
  26. package/dist/extractor/api-extractor.js.map +1 -0
  27. package/dist/extractor/click-extractor.d.ts +3 -0
  28. package/dist/extractor/click-extractor.d.ts.map +1 -0
  29. package/dist/extractor/click-extractor.js +52 -0
  30. package/dist/extractor/click-extractor.js.map +1 -0
  31. package/dist/extractor/form-extractor.d.ts +3 -0
  32. package/dist/extractor/form-extractor.d.ts.map +1 -0
  33. package/dist/extractor/form-extractor.js +27 -0
  34. package/dist/extractor/form-extractor.js.map +1 -0
  35. package/dist/extractor/route-extractor.d.ts +3 -0
  36. package/dist/extractor/route-extractor.d.ts.map +1 -0
  37. package/dist/extractor/route-extractor.js +84 -0
  38. package/dist/extractor/route-extractor.js.map +1 -0
  39. package/dist/extractor/schema-inferrer.d.ts +4 -0
  40. package/dist/extractor/schema-inferrer.d.ts.map +1 -0
  41. package/dist/extractor/schema-inferrer.js +128 -0
  42. package/dist/extractor/schema-inferrer.js.map +1 -0
  43. package/dist/index.d.ts +88 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +170 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/linter/linter.d.ts +10 -0
  48. package/dist/linter/linter.d.ts.map +1 -0
  49. package/dist/linter/linter.js +39 -0
  50. package/dist/linter/linter.js.map +1 -0
  51. package/dist/linter/rules.d.ts +4 -0
  52. package/dist/linter/rules.d.ts.map +1 -0
  53. package/dist/linter/rules.js +111 -0
  54. package/dist/linter/rules.js.map +1 -0
  55. package/dist/scanner/browser.d.ts +14 -0
  56. package/dist/scanner/browser.d.ts.map +1 -0
  57. package/dist/scanner/browser.js +42 -0
  58. package/dist/scanner/browser.js.map +1 -0
  59. package/dist/scanner/crawler.d.ts +12 -0
  60. package/dist/scanner/crawler.d.ts.map +1 -0
  61. package/dist/scanner/crawler.js +80 -0
  62. package/dist/scanner/crawler.js.map +1 -0
  63. package/dist/scanner/dom-capture.d.ts +4 -0
  64. package/dist/scanner/dom-capture.d.ts.map +1 -0
  65. package/dist/scanner/dom-capture.js +148 -0
  66. package/dist/scanner/dom-capture.js.map +1 -0
  67. package/dist/scanner/network-capture.d.ts +8 -0
  68. package/dist/scanner/network-capture.d.ts.map +1 -0
  69. package/dist/scanner/network-capture.js +112 -0
  70. package/dist/scanner/network-capture.js.map +1 -0
  71. package/dist/scanner/screenshot.d.ts +3 -0
  72. package/dist/scanner/screenshot.d.ts.map +1 -0
  73. package/dist/scanner/screenshot.js +10 -0
  74. package/dist/scanner/screenshot.js.map +1 -0
  75. package/dist/synthesizer/clusterer.d.ts +7 -0
  76. package/dist/synthesizer/clusterer.d.ts.map +1 -0
  77. package/dist/synthesizer/clusterer.js +310 -0
  78. package/dist/synthesizer/clusterer.js.map +1 -0
  79. package/dist/synthesizer/describer.d.ts +3 -0
  80. package/dist/synthesizer/describer.d.ts.map +1 -0
  81. package/dist/synthesizer/describer.js +92 -0
  82. package/dist/synthesizer/describer.js.map +1 -0
  83. package/dist/synthesizer/llm-client.d.ts +7 -0
  84. package/dist/synthesizer/llm-client.d.ts.map +1 -0
  85. package/dist/synthesizer/llm-client.js +7 -0
  86. package/dist/synthesizer/llm-client.js.map +1 -0
  87. package/dist/synthesizer/namer.d.ts +3 -0
  88. package/dist/synthesizer/namer.d.ts.map +1 -0
  89. package/dist/synthesizer/namer.js +154 -0
  90. package/dist/synthesizer/namer.js.map +1 -0
  91. package/dist/synthesizer/safety-classifier.d.ts +3 -0
  92. package/dist/synthesizer/safety-classifier.d.ts.map +1 -0
  93. package/dist/synthesizer/safety-classifier.js +68 -0
  94. package/dist/synthesizer/safety-classifier.js.map +1 -0
  95. package/dist/synthesizer/schema-builder.d.ts +3 -0
  96. package/dist/synthesizer/schema-builder.d.ts.map +1 -0
  97. package/dist/synthesizer/schema-builder.js +99 -0
  98. package/dist/synthesizer/schema-builder.js.map +1 -0
  99. package/dist/types.d.ts +271 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +3 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/utils/redact.d.ts +3 -0
  104. package/dist/utils/redact.d.ts.map +1 -0
  105. package/dist/utils/redact.js +42 -0
  106. package/dist/utils/redact.js.map +1 -0
  107. package/dist/utils/validation.d.ts +876 -0
  108. package/dist/utils/validation.d.ts.map +1 -0
  109. package/dist/utils/validation.js +108 -0
  110. package/dist/utils/validation.js.map +1 -0
  111. package/package.json +69 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clusterActions = clusterActions;
4
+ const uuid_1 = require("uuid");
5
+ const namer_js_1 = require("./namer.js");
6
+ const describer_js_1 = require("./describer.js");
7
+ const schema_builder_js_1 = require("./schema-builder.js");
8
+ const safety_classifier_js_1 = require("./safety-classifier.js");
9
+ function clusterActions(actions, options = {}) {
10
+ const { minConfidence = 0.5 } = options;
11
+ const groups = groupActions(actions);
12
+ const tools = [];
13
+ for (const group of groups) {
14
+ const confidence = computeConfidence(group);
15
+ if (confidence < minConfidence)
16
+ continue;
17
+ const domain = extractDomain(group);
18
+ const tool = buildToolSpec(group, domain, confidence);
19
+ tools.push(tool);
20
+ }
21
+ return deduplicateTools(tools);
22
+ }
23
+ function groupActions(actions) {
24
+ const groups = [];
25
+ const used = new Set();
26
+ const forms = actions.filter((a) => a.kind === "form_submit");
27
+ for (const form of forms) {
28
+ const group = [form];
29
+ used.add(form.id);
30
+ const relatedApis = actions.filter((a) => a.kind === "api_call" &&
31
+ !used.has(a.id) &&
32
+ isSamePage(a.pageUrl, form.pageUrl));
33
+ if (form.action) {
34
+ const matchingApi = relatedApis.find((a) => urlPathMatches(a.request.url, form.action));
35
+ if (matchingApi) {
36
+ group.push(matchingApi);
37
+ used.add(matchingApi.id);
38
+ }
39
+ }
40
+ groups.push(group);
41
+ }
42
+ const remainingApis = actions.filter((a) => a.kind === "api_call" && !used.has(a.id));
43
+ for (const api of remainingApis) {
44
+ groups.push([api]);
45
+ used.add(api.id);
46
+ }
47
+ for (const action of actions) {
48
+ if (!used.has(action.id)) {
49
+ groups.push([action]);
50
+ }
51
+ }
52
+ return groups;
53
+ }
54
+ function buildToolSpec(actions, domain, confidence) {
55
+ const primary = actions[0];
56
+ const name = (0, namer_js_1.generateToolName)(actions, domain);
57
+ const description = (0, describer_js_1.generateDescription)(actions);
58
+ const inputSchema = (0, schema_builder_js_1.buildInputSchema)(actions);
59
+ const safety = (0, safety_classifier_js_1.classifySafety)(actions);
60
+ const pageUrl = getActionPageUrl(primary);
61
+ return {
62
+ id: (0, uuid_1.v4)(),
63
+ name,
64
+ description,
65
+ inputSchema,
66
+ safety,
67
+ availability: {
68
+ urlPatterns: [buildUrlPattern(pageUrl)],
69
+ requiresAuth: false,
70
+ },
71
+ implementation: buildImplementation(actions),
72
+ provenance: {
73
+ actions: actions.map((a) => a.id),
74
+ createdFrom: "autogen-v1",
75
+ confidence,
76
+ pageUrl,
77
+ },
78
+ };
79
+ }
80
+ function buildImplementation(actions) {
81
+ const primary = actions[0];
82
+ if (primary.kind === "form_submit") {
83
+ return {
84
+ kind: "form_declarative",
85
+ form: {
86
+ toolname: "",
87
+ tooldescription: "",
88
+ toolautosubmit: false,
89
+ formSelector: primary.formSelector,
90
+ },
91
+ handlerTemplate: buildHandlerTemplate(actions),
92
+ };
93
+ }
94
+ return {
95
+ kind: "js_handler",
96
+ handlerTemplate: buildHandlerTemplate(actions),
97
+ };
98
+ }
99
+ function buildHandlerTemplate(actions) {
100
+ const steps = [];
101
+ const primary = actions[0];
102
+ const primaryUrl = getActionPageUrl(primary);
103
+ if (primaryUrl) {
104
+ steps.push({
105
+ step: "ensure_page",
106
+ urlPattern: primaryUrl,
107
+ });
108
+ }
109
+ switch (primary.kind) {
110
+ case "form_submit": {
111
+ const mapping = {};
112
+ for (const field of primary.fields) {
113
+ mapping[field.name] = `params.${field.name}`;
114
+ }
115
+ steps.push({
116
+ step: "fill_form",
117
+ formSelector: primary.formSelector,
118
+ mapping,
119
+ });
120
+ steps.push({
121
+ step: "click",
122
+ selector: primary.submitSelector,
123
+ });
124
+ steps.push({
125
+ step: "wait_network",
126
+ match: {
127
+ urlIncludes: primary.action || undefined,
128
+ },
129
+ });
130
+ break;
131
+ }
132
+ case "api_call": {
133
+ steps.push({
134
+ step: "wait_network",
135
+ match: {
136
+ urlIncludes: extractPathname(primary.request.url),
137
+ operationName: primary.request.operationName,
138
+ },
139
+ });
140
+ break;
141
+ }
142
+ case "click_flow": {
143
+ steps.push({
144
+ step: "click",
145
+ selector: primary.startSelector,
146
+ });
147
+ if (primary.intermediateSteps) {
148
+ for (const selector of primary.intermediateSteps) {
149
+ steps.push({
150
+ step: "click",
151
+ selector,
152
+ });
153
+ }
154
+ }
155
+ break;
156
+ }
157
+ case "route_change": {
158
+ steps.push({
159
+ step: "ensure_page",
160
+ urlPattern: primary.to,
161
+ });
162
+ break;
163
+ }
164
+ }
165
+ steps.push({
166
+ step: "return",
167
+ format: "json",
168
+ });
169
+ return { steps };
170
+ }
171
+ function computeConfidence(actions) {
172
+ let score = 0.5;
173
+ const primary = actions[0];
174
+ if (!primary)
175
+ return 0;
176
+ if (primary.kind === "form_submit") {
177
+ if (primary.labels.length > 0)
178
+ score += 0.1;
179
+ if (primary.fields.length > 0)
180
+ score += 0.1;
181
+ if (primary.fields.length >= 2)
182
+ score += 0.1;
183
+ if (primary.submitSelector)
184
+ score += 0.05;
185
+ }
186
+ if (primary.kind === "api_call") {
187
+ if (primary.request.status && primary.request.status < 400)
188
+ score += 0.1;
189
+ if (primary.request.responseBodySample)
190
+ score += 0.1;
191
+ if (primary.request.operationName)
192
+ score += 0.1;
193
+ if (!primary.request.responseBodySample)
194
+ score -= 0.15;
195
+ if (primary.request.method === "GET") {
196
+ try {
197
+ const params = new URL(primary.request.url).searchParams;
198
+ if ([...params].length === 0)
199
+ score -= 0.1;
200
+ }
201
+ catch {
202
+ /* URL parse failure is non-fatal */
203
+ }
204
+ }
205
+ try {
206
+ const path = new URL(primary.request.url).pathname.toLowerCase();
207
+ if (/\/(embed|widget|player|iframe)\b/.test(path))
208
+ score -= 0.2;
209
+ }
210
+ catch {
211
+ /* URL parse failure is non-fatal */
212
+ }
213
+ }
214
+ if (primary.kind === "click_flow") {
215
+ if (primary.labels.length > 0 && primary.labels[0].length > 2)
216
+ score += 0.15;
217
+ if (primary.labels.length > 1)
218
+ score += 0.05;
219
+ }
220
+ if (primary.kind === "route_change") {
221
+ if (primary.labels.length > 0)
222
+ score += 0.1;
223
+ try {
224
+ const segments = new URL(primary.to).pathname.split("/").filter(Boolean);
225
+ if (segments.length <= 2)
226
+ score += 0.1;
227
+ }
228
+ catch {
229
+ /* URL parse failure is non-fatal */
230
+ }
231
+ }
232
+ if (actions.length > 1)
233
+ score += 0.1;
234
+ return Math.min(Math.max(score, 0), 1.0);
235
+ }
236
+ function getActionPageUrl(action) {
237
+ switch (action.kind) {
238
+ case "form_submit":
239
+ case "click_flow":
240
+ case "api_call":
241
+ return action.pageUrl;
242
+ case "route_change":
243
+ return action.from;
244
+ }
245
+ }
246
+ function extractDomain(actions) {
247
+ for (const action of actions) {
248
+ const url = getActionPageUrl(action) || ("request" in action ? action.request.url : "");
249
+ try {
250
+ return new URL(url).hostname;
251
+ }
252
+ catch {
253
+ continue;
254
+ }
255
+ }
256
+ return "unknown";
257
+ }
258
+ function isSamePage(url1, url2) {
259
+ try {
260
+ return new URL(url1).pathname === new URL(url2).pathname;
261
+ }
262
+ catch {
263
+ return false;
264
+ }
265
+ }
266
+ function urlPathMatches(url, formAction) {
267
+ try {
268
+ const urlPath = new URL(url).pathname;
269
+ const actionPath = formAction.startsWith("http")
270
+ ? new URL(formAction).pathname
271
+ : formAction;
272
+ return urlPath === actionPath;
273
+ }
274
+ catch {
275
+ return false;
276
+ }
277
+ }
278
+ function buildUrlPattern(pageUrl) {
279
+ try {
280
+ const parsed = new URL(pageUrl);
281
+ return `${parsed.origin}${parsed.pathname}*`;
282
+ }
283
+ catch {
284
+ return "*";
285
+ }
286
+ }
287
+ function extractPathname(url) {
288
+ try {
289
+ return new URL(url).pathname;
290
+ }
291
+ catch {
292
+ return url;
293
+ }
294
+ }
295
+ function deduplicateTools(tools) {
296
+ const seen = new Map();
297
+ for (const tool of tools) {
298
+ const existing = seen.get(tool.name);
299
+ if (existing) {
300
+ if (tool.provenance.confidence > existing.provenance.confidence) {
301
+ seen.set(tool.name, tool);
302
+ }
303
+ }
304
+ else {
305
+ seen.set(tool.name, tool);
306
+ }
307
+ }
308
+ return Array.from(seen.values());
309
+ }
310
+ //# sourceMappingURL=clusterer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clusterer.js","sourceRoot":"","sources":["../../src/synthesizer/clusterer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Action } from "../types.js";
2
+ export declare function generateDescription(actions: Action[]): string;
3
+ //# sourceMappingURL=describer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describer.d.ts","sourceRoot":"","sources":["../../src/synthesizer/describer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAmC,MAAM,aAAa,CAAC;AAE3E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAgC7D"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateDescription = generateDescription;
4
+ function generateDescription(actions) {
5
+ if (actions.length === 0)
6
+ return "Unknown tool.";
7
+ const primary = actions[0];
8
+ const parts = [];
9
+ switch (primary.kind) {
10
+ case "form_submit":
11
+ parts.push(describeFormAction(primary));
12
+ break;
13
+ case "api_call":
14
+ parts.push(describeApiAction(primary));
15
+ break;
16
+ case "click_flow":
17
+ parts.push(describeClickAction(primary));
18
+ break;
19
+ case "route_change":
20
+ parts.push(`Navigate from ${primary.from} to ${primary.to}.`);
21
+ break;
22
+ }
23
+ if (primary.kind === "form_submit" && primary.fields.length > 0) {
24
+ const fieldNames = primary.fields
25
+ .filter((f) => f.required)
26
+ .map((f) => f.label || f.name);
27
+ if (fieldNames.length > 0) {
28
+ parts.push(`Required fields: ${fieldNames.join(", ")}.`);
29
+ }
30
+ }
31
+ return parts.join(" ");
32
+ }
33
+ const FORM_DESCRIPTIONS = [
34
+ [/search|find/i, "Search by filling out the form"],
35
+ [/login|sign.?in/i, "Log in via the form"],
36
+ [/register|sign.?up/i, "Register a new account"],
37
+ [/contact|message/i, "Send a message via the contact form"],
38
+ [/book|reserv/i, "Make a booking via the form"],
39
+ [/subscribe/i, "Subscribe via the form"],
40
+ ];
41
+ function describeFormAction(action) {
42
+ const labels = action.labels.join(" ").toLowerCase();
43
+ const match = FORM_DESCRIPTIONS.find(([re]) => re.test(labels));
44
+ if (match)
45
+ return `${match[1]} on ${shortenUrl(action.pageUrl)}.`;
46
+ const fieldCount = action.fields.length;
47
+ return `Submit a form with ${fieldCount} field${fieldCount !== 1 ? "s" : ""} on ${shortenUrl(action.pageUrl)}.`;
48
+ }
49
+ function describeApiAction(action) {
50
+ const method = action.request.method;
51
+ const path = extractPath(action.request.url);
52
+ if (action.request.operationName) {
53
+ const op = action.request.operationType === "mutation" ? "Execute" : "Run";
54
+ return `${op} the ${action.request.operationName} GraphQL ${action.request.operationType || "operation"}.`;
55
+ }
56
+ switch (method) {
57
+ case "GET":
58
+ return `Fetch data from ${path}.`;
59
+ case "POST":
60
+ if (/search|query|find/i.test(path)) {
61
+ return `Search via POST ${path}.`;
62
+ }
63
+ return `Create a resource via POST ${path}.`;
64
+ case "PUT":
65
+ case "PATCH":
66
+ return `Update a resource via ${method} ${path}.`;
67
+ case "DELETE":
68
+ return `Delete a resource via DELETE ${path}.`;
69
+ }
70
+ }
71
+ function describeClickAction(action) {
72
+ const label = action.labels[0] || "a button";
73
+ return `Click ${label} on ${shortenUrl(action.pageUrl)}.`;
74
+ }
75
+ function extractPath(url) {
76
+ try {
77
+ return new URL(url).pathname;
78
+ }
79
+ catch {
80
+ return url;
81
+ }
82
+ }
83
+ function shortenUrl(url) {
84
+ try {
85
+ const parsed = new URL(url);
86
+ return parsed.hostname + parsed.pathname;
87
+ }
88
+ catch {
89
+ return url;
90
+ }
91
+ }
92
+ //# sourceMappingURL=describer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describer.js","sourceRoot":"","sources":["../../src/synthesizer/describer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Action, ToolSpec } from "../types.js";
2
+ export interface LlmClientOptions {
3
+ apiKey?: string;
4
+ model?: string;
5
+ }
6
+ export declare function enhanceWithLlm(tools: ToolSpec[], _actions: Action[], _options?: LlmClientOptions): Promise<ToolSpec[]>;
7
+ //# sourceMappingURL=llm-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../src/synthesizer/llm-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAErB"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enhanceWithLlm = enhanceWithLlm;
4
+ async function enhanceWithLlm(tools, _actions, _options) {
5
+ return tools;
6
+ }
7
+ //# sourceMappingURL=llm-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/synthesizer/llm-client.ts"],"names":[],"mappings":";;AAOA,wCAMC;AANM,KAAK,UAAU,cAAc,CAClC,KAAiB,EACjB,QAAkB,EAClB,QAA2B;IAE3B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Action } from "../types.js";
2
+ export declare function generateToolName(actions: Action[], domain: string): string;
3
+ //# sourceMappingURL=namer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namer.d.ts","sourceRoot":"","sources":["../../src/synthesizer/namer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAmC,MAAM,aAAa,CAAC;AAE3E,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,GACb,MAAM,CAUR"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateToolName = generateToolName;
4
+ function generateToolName(actions, domain) {
5
+ const prefix = sanitizeDomain(domain);
6
+ const primary = actions[0];
7
+ if (!primary)
8
+ return `${prefix}_unknown_tool`;
9
+ const verb = inferVerb(primary);
10
+ const noun = inferNoun(primary);
11
+ return `${prefix}_${verb}_${noun}`;
12
+ }
13
+ function sanitizeDomain(domain) {
14
+ return domain
15
+ .replace(/^www\./, "")
16
+ .split(".")[0]
17
+ .replace(/[^a-z0-9]/gi, "")
18
+ .toLowerCase()
19
+ .slice(0, 20);
20
+ }
21
+ function inferVerb(action) {
22
+ switch (action.kind) {
23
+ case "form_submit":
24
+ return inferVerbFromForm(action);
25
+ case "api_call":
26
+ return inferVerbFromApi(action);
27
+ case "click_flow":
28
+ return "click";
29
+ case "route_change":
30
+ return "navigate";
31
+ }
32
+ }
33
+ const FORM_VERB_MAP = [
34
+ [/search|find|look/i, "search"],
35
+ [/login|sign.?in|auth/i, "login"],
36
+ [/register|sign.?up|create.?account/i, "register"],
37
+ [/subscribe|newsletter/i, "subscribe"],
38
+ [/contact|message|feedback/i, "send"],
39
+ [/book|reserve/i, "book"],
40
+ [/checkout|pay|purchase/i, "checkout"],
41
+ [/update|edit|modify/i, "update"],
42
+ [/delete|remove/i, "delete"],
43
+ [/filter|sort/i, "filter"],
44
+ ];
45
+ function inferVerbFromForm(action) {
46
+ const labels = action.labels.join(" ").toLowerCase();
47
+ const formAction = (action.action || "").toLowerCase();
48
+ const match = FORM_VERB_MAP.find(([re]) => re.test(labels));
49
+ if (match)
50
+ return match[1];
51
+ if (action.method === "GET" || formAction.includes("search"))
52
+ return "search";
53
+ return "submit";
54
+ }
55
+ function inferVerbFromApi(action) {
56
+ const method = action.request.method;
57
+ const path = extractPath(action.request.url).toLowerCase();
58
+ switch (method) {
59
+ case "GET":
60
+ if (/search|find|query/i.test(path))
61
+ return "search";
62
+ return "get";
63
+ case "POST":
64
+ if (/search|find|query/i.test(path))
65
+ return "search";
66
+ if (/login|auth|sign/i.test(path))
67
+ return "login";
68
+ return "create";
69
+ case "PUT":
70
+ case "PATCH":
71
+ return "update";
72
+ case "DELETE":
73
+ return "delete";
74
+ }
75
+ }
76
+ function inferNoun(action) {
77
+ switch (action.kind) {
78
+ case "form_submit":
79
+ return inferNounFromForm(action);
80
+ case "api_call":
81
+ return inferNounFromApi(action);
82
+ case "click_flow":
83
+ return inferNounFromLabels(action.labels);
84
+ case "route_change":
85
+ return inferNounFromUrl(action.to);
86
+ }
87
+ }
88
+ const FORM_NOUN_FIELD_MAP = [
89
+ [/destination|depart|arriv|flight/i, "flights"],
90
+ [/hotel|room|checkin|checkout/i, "hotels"],
91
+ [/email|password|username/i, "account"],
92
+ ];
93
+ function inferNounFromForm(action) {
94
+ const labels = action.labels.join(" ").toLowerCase();
95
+ const patterns = [
96
+ /(?:search|find|book|reserve|create|update|delete|filter)\s+(\w+)/i,
97
+ /(\w+)\s+(?:form|search|booking|reservation)/i,
98
+ ];
99
+ for (const pattern of patterns) {
100
+ const match = labels.match(pattern);
101
+ if (match?.[1]) {
102
+ return sanitizeNoun(match[1]);
103
+ }
104
+ }
105
+ const fieldNames = action.fields.map((f) => f.name.toLowerCase());
106
+ const fieldMatch = FORM_NOUN_FIELD_MAP.find(([re]) => fieldNames.some((n) => re.test(n)));
107
+ if (fieldMatch)
108
+ return fieldMatch[1];
109
+ return "form";
110
+ }
111
+ function inferNounFromApi(action) {
112
+ const path = extractPath(action.request.url);
113
+ const segments = path
114
+ .split("/")
115
+ .filter((s) => s && !s.match(/^(api|v\d|rest|graphql)$/i));
116
+ const lastSegment = segments[segments.length - 1];
117
+ if (lastSegment) {
118
+ const cleaned = lastSegment.replace(/^[0-9a-f-]+$/i, "");
119
+ if (cleaned)
120
+ return sanitizeNoun(cleaned);
121
+ const secondLast = segments[segments.length - 2];
122
+ if (secondLast)
123
+ return sanitizeNoun(secondLast);
124
+ }
125
+ if (action.request.operationName) {
126
+ return sanitizeNoun(action.request.operationName);
127
+ }
128
+ return "data";
129
+ }
130
+ function inferNounFromLabels(labels) {
131
+ const text = labels.join(" ").toLowerCase();
132
+ const words = text.split(/\s+/).filter((w) => w.length > 2);
133
+ return words[words.length - 1] || "element";
134
+ }
135
+ function inferNounFromUrl(url) {
136
+ const path = extractPath(url);
137
+ const segments = path.split("/").filter(Boolean);
138
+ return segments[segments.length - 1] || "page";
139
+ }
140
+ function extractPath(url) {
141
+ try {
142
+ return new URL(url).pathname;
143
+ }
144
+ catch {
145
+ return url;
146
+ }
147
+ }
148
+ function sanitizeNoun(noun) {
149
+ return noun
150
+ .replace(/[^a-z0-9]/gi, "")
151
+ .toLowerCase()
152
+ .slice(0, 30);
153
+ }
154
+ //# sourceMappingURL=namer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namer.js","sourceRoot":"","sources":["../../src/synthesizer/namer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Action, Safety } from "../types.js";
2
+ export declare function classifySafety(actions: Action[]): Safety;
3
+ //# sourceMappingURL=safety-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-classifier.d.ts","sourceRoot":"","sources":["../../src/synthesizer/safety-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAe,MAAM,aAAa,CAAC;AAE/D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAYxD"}