@apitap/core 1.0.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 (236) hide show
  1. package/LICENSE +60 -0
  2. package/README.md +362 -0
  3. package/SKILL.md +270 -0
  4. package/dist/auth/crypto.d.ts +31 -0
  5. package/dist/auth/crypto.js +66 -0
  6. package/dist/auth/crypto.js.map +1 -0
  7. package/dist/auth/handoff.d.ts +29 -0
  8. package/dist/auth/handoff.js +180 -0
  9. package/dist/auth/handoff.js.map +1 -0
  10. package/dist/auth/manager.d.ts +46 -0
  11. package/dist/auth/manager.js +127 -0
  12. package/dist/auth/manager.js.map +1 -0
  13. package/dist/auth/oauth-refresh.d.ts +16 -0
  14. package/dist/auth/oauth-refresh.js +91 -0
  15. package/dist/auth/oauth-refresh.js.map +1 -0
  16. package/dist/auth/refresh.d.ts +43 -0
  17. package/dist/auth/refresh.js +217 -0
  18. package/dist/auth/refresh.js.map +1 -0
  19. package/dist/capture/anti-bot.d.ts +15 -0
  20. package/dist/capture/anti-bot.js +43 -0
  21. package/dist/capture/anti-bot.js.map +1 -0
  22. package/dist/capture/blocklist.d.ts +6 -0
  23. package/dist/capture/blocklist.js +70 -0
  24. package/dist/capture/blocklist.js.map +1 -0
  25. package/dist/capture/body-diff.d.ts +8 -0
  26. package/dist/capture/body-diff.js +102 -0
  27. package/dist/capture/body-diff.js.map +1 -0
  28. package/dist/capture/body-variables.d.ts +13 -0
  29. package/dist/capture/body-variables.js +142 -0
  30. package/dist/capture/body-variables.js.map +1 -0
  31. package/dist/capture/domain.d.ts +8 -0
  32. package/dist/capture/domain.js +34 -0
  33. package/dist/capture/domain.js.map +1 -0
  34. package/dist/capture/entropy.d.ts +33 -0
  35. package/dist/capture/entropy.js +100 -0
  36. package/dist/capture/entropy.js.map +1 -0
  37. package/dist/capture/filter.d.ts +11 -0
  38. package/dist/capture/filter.js +49 -0
  39. package/dist/capture/filter.js.map +1 -0
  40. package/dist/capture/graphql.d.ts +21 -0
  41. package/dist/capture/graphql.js +99 -0
  42. package/dist/capture/graphql.js.map +1 -0
  43. package/dist/capture/idle.d.ts +23 -0
  44. package/dist/capture/idle.js +44 -0
  45. package/dist/capture/idle.js.map +1 -0
  46. package/dist/capture/monitor.d.ts +26 -0
  47. package/dist/capture/monitor.js +183 -0
  48. package/dist/capture/monitor.js.map +1 -0
  49. package/dist/capture/oauth-detector.d.ts +18 -0
  50. package/dist/capture/oauth-detector.js +96 -0
  51. package/dist/capture/oauth-detector.js.map +1 -0
  52. package/dist/capture/pagination.d.ts +9 -0
  53. package/dist/capture/pagination.js +40 -0
  54. package/dist/capture/pagination.js.map +1 -0
  55. package/dist/capture/parameterize.d.ts +17 -0
  56. package/dist/capture/parameterize.js +63 -0
  57. package/dist/capture/parameterize.js.map +1 -0
  58. package/dist/capture/scrubber.d.ts +5 -0
  59. package/dist/capture/scrubber.js +38 -0
  60. package/dist/capture/scrubber.js.map +1 -0
  61. package/dist/capture/session.d.ts +46 -0
  62. package/dist/capture/session.js +445 -0
  63. package/dist/capture/session.js.map +1 -0
  64. package/dist/capture/token-detector.d.ts +16 -0
  65. package/dist/capture/token-detector.js +62 -0
  66. package/dist/capture/token-detector.js.map +1 -0
  67. package/dist/capture/verifier.d.ts +17 -0
  68. package/dist/capture/verifier.js +147 -0
  69. package/dist/capture/verifier.js.map +1 -0
  70. package/dist/cli.d.ts +2 -0
  71. package/dist/cli.js +930 -0
  72. package/dist/cli.js.map +1 -0
  73. package/dist/discovery/auth.d.ts +17 -0
  74. package/dist/discovery/auth.js +81 -0
  75. package/dist/discovery/auth.js.map +1 -0
  76. package/dist/discovery/fetch.d.ts +17 -0
  77. package/dist/discovery/fetch.js +59 -0
  78. package/dist/discovery/fetch.js.map +1 -0
  79. package/dist/discovery/frameworks.d.ts +11 -0
  80. package/dist/discovery/frameworks.js +249 -0
  81. package/dist/discovery/frameworks.js.map +1 -0
  82. package/dist/discovery/index.d.ts +21 -0
  83. package/dist/discovery/index.js +219 -0
  84. package/dist/discovery/index.js.map +1 -0
  85. package/dist/discovery/openapi.d.ts +13 -0
  86. package/dist/discovery/openapi.js +175 -0
  87. package/dist/discovery/openapi.js.map +1 -0
  88. package/dist/discovery/probes.d.ts +9 -0
  89. package/dist/discovery/probes.js +70 -0
  90. package/dist/discovery/probes.js.map +1 -0
  91. package/dist/index.d.ts +25 -0
  92. package/dist/index.js +25 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/inspect/report.d.ts +52 -0
  95. package/dist/inspect/report.js +191 -0
  96. package/dist/inspect/report.js.map +1 -0
  97. package/dist/mcp.d.ts +8 -0
  98. package/dist/mcp.js +526 -0
  99. package/dist/mcp.js.map +1 -0
  100. package/dist/orchestration/browse.d.ts +38 -0
  101. package/dist/orchestration/browse.js +198 -0
  102. package/dist/orchestration/browse.js.map +1 -0
  103. package/dist/orchestration/cache.d.ts +15 -0
  104. package/dist/orchestration/cache.js +24 -0
  105. package/dist/orchestration/cache.js.map +1 -0
  106. package/dist/plugin.d.ts +17 -0
  107. package/dist/plugin.js +158 -0
  108. package/dist/plugin.js.map +1 -0
  109. package/dist/read/decoders/deepwiki.d.ts +2 -0
  110. package/dist/read/decoders/deepwiki.js +148 -0
  111. package/dist/read/decoders/deepwiki.js.map +1 -0
  112. package/dist/read/decoders/grokipedia.d.ts +2 -0
  113. package/dist/read/decoders/grokipedia.js +210 -0
  114. package/dist/read/decoders/grokipedia.js.map +1 -0
  115. package/dist/read/decoders/hackernews.d.ts +2 -0
  116. package/dist/read/decoders/hackernews.js +168 -0
  117. package/dist/read/decoders/hackernews.js.map +1 -0
  118. package/dist/read/decoders/index.d.ts +2 -0
  119. package/dist/read/decoders/index.js +12 -0
  120. package/dist/read/decoders/index.js.map +1 -0
  121. package/dist/read/decoders/reddit.d.ts +2 -0
  122. package/dist/read/decoders/reddit.js +142 -0
  123. package/dist/read/decoders/reddit.js.map +1 -0
  124. package/dist/read/decoders/twitter.d.ts +12 -0
  125. package/dist/read/decoders/twitter.js +187 -0
  126. package/dist/read/decoders/twitter.js.map +1 -0
  127. package/dist/read/decoders/wikipedia.d.ts +2 -0
  128. package/dist/read/decoders/wikipedia.js +66 -0
  129. package/dist/read/decoders/wikipedia.js.map +1 -0
  130. package/dist/read/decoders/youtube.d.ts +2 -0
  131. package/dist/read/decoders/youtube.js +69 -0
  132. package/dist/read/decoders/youtube.js.map +1 -0
  133. package/dist/read/extract.d.ts +25 -0
  134. package/dist/read/extract.js +320 -0
  135. package/dist/read/extract.js.map +1 -0
  136. package/dist/read/index.d.ts +14 -0
  137. package/dist/read/index.js +66 -0
  138. package/dist/read/index.js.map +1 -0
  139. package/dist/read/peek.d.ts +9 -0
  140. package/dist/read/peek.js +137 -0
  141. package/dist/read/peek.js.map +1 -0
  142. package/dist/read/types.d.ts +44 -0
  143. package/dist/read/types.js +3 -0
  144. package/dist/read/types.js.map +1 -0
  145. package/dist/replay/engine.d.ts +53 -0
  146. package/dist/replay/engine.js +441 -0
  147. package/dist/replay/engine.js.map +1 -0
  148. package/dist/replay/truncate.d.ts +16 -0
  149. package/dist/replay/truncate.js +92 -0
  150. package/dist/replay/truncate.js.map +1 -0
  151. package/dist/serve.d.ts +31 -0
  152. package/dist/serve.js +149 -0
  153. package/dist/serve.js.map +1 -0
  154. package/dist/skill/generator.d.ts +44 -0
  155. package/dist/skill/generator.js +419 -0
  156. package/dist/skill/generator.js.map +1 -0
  157. package/dist/skill/importer.d.ts +26 -0
  158. package/dist/skill/importer.js +80 -0
  159. package/dist/skill/importer.js.map +1 -0
  160. package/dist/skill/search.d.ts +19 -0
  161. package/dist/skill/search.js +51 -0
  162. package/dist/skill/search.js.map +1 -0
  163. package/dist/skill/signing.d.ts +16 -0
  164. package/dist/skill/signing.js +34 -0
  165. package/dist/skill/signing.js.map +1 -0
  166. package/dist/skill/ssrf.d.ts +27 -0
  167. package/dist/skill/ssrf.js +210 -0
  168. package/dist/skill/ssrf.js.map +1 -0
  169. package/dist/skill/store.d.ts +7 -0
  170. package/dist/skill/store.js +93 -0
  171. package/dist/skill/store.js.map +1 -0
  172. package/dist/stats/report.d.ts +26 -0
  173. package/dist/stats/report.js +157 -0
  174. package/dist/stats/report.js.map +1 -0
  175. package/dist/types.d.ts +214 -0
  176. package/dist/types.js +3 -0
  177. package/dist/types.js.map +1 -0
  178. package/package.json +58 -0
  179. package/src/auth/crypto.ts +92 -0
  180. package/src/auth/handoff.ts +229 -0
  181. package/src/auth/manager.ts +140 -0
  182. package/src/auth/oauth-refresh.ts +120 -0
  183. package/src/auth/refresh.ts +300 -0
  184. package/src/capture/anti-bot.ts +63 -0
  185. package/src/capture/blocklist.ts +75 -0
  186. package/src/capture/body-diff.ts +109 -0
  187. package/src/capture/body-variables.ts +156 -0
  188. package/src/capture/domain.ts +34 -0
  189. package/src/capture/entropy.ts +121 -0
  190. package/src/capture/filter.ts +56 -0
  191. package/src/capture/graphql.ts +124 -0
  192. package/src/capture/idle.ts +45 -0
  193. package/src/capture/monitor.ts +224 -0
  194. package/src/capture/oauth-detector.ts +106 -0
  195. package/src/capture/pagination.ts +49 -0
  196. package/src/capture/parameterize.ts +68 -0
  197. package/src/capture/scrubber.ts +49 -0
  198. package/src/capture/session.ts +502 -0
  199. package/src/capture/token-detector.ts +76 -0
  200. package/src/capture/verifier.ts +171 -0
  201. package/src/cli.ts +1031 -0
  202. package/src/discovery/auth.ts +99 -0
  203. package/src/discovery/fetch.ts +85 -0
  204. package/src/discovery/frameworks.ts +231 -0
  205. package/src/discovery/index.ts +256 -0
  206. package/src/discovery/openapi.ts +230 -0
  207. package/src/discovery/probes.ts +76 -0
  208. package/src/index.ts +26 -0
  209. package/src/inspect/report.ts +247 -0
  210. package/src/mcp.ts +618 -0
  211. package/src/orchestration/browse.ts +250 -0
  212. package/src/orchestration/cache.ts +37 -0
  213. package/src/plugin.ts +188 -0
  214. package/src/read/decoders/deepwiki.ts +180 -0
  215. package/src/read/decoders/grokipedia.ts +246 -0
  216. package/src/read/decoders/hackernews.ts +198 -0
  217. package/src/read/decoders/index.ts +15 -0
  218. package/src/read/decoders/reddit.ts +158 -0
  219. package/src/read/decoders/twitter.ts +211 -0
  220. package/src/read/decoders/wikipedia.ts +75 -0
  221. package/src/read/decoders/youtube.ts +75 -0
  222. package/src/read/extract.ts +396 -0
  223. package/src/read/index.ts +78 -0
  224. package/src/read/peek.ts +175 -0
  225. package/src/read/types.ts +37 -0
  226. package/src/replay/engine.ts +559 -0
  227. package/src/replay/truncate.ts +116 -0
  228. package/src/serve.ts +189 -0
  229. package/src/skill/generator.ts +473 -0
  230. package/src/skill/importer.ts +107 -0
  231. package/src/skill/search.ts +76 -0
  232. package/src/skill/signing.ts +36 -0
  233. package/src/skill/ssrf.ts +238 -0
  234. package/src/skill/store.ts +107 -0
  235. package/src/stats/report.ts +208 -0
  236. package/src/types.ts +233 -0
package/dist/serve.js ADDED
@@ -0,0 +1,149 @@
1
+ // src/serve.ts
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { z } from 'zod';
4
+ import { readSkillFile } from './skill/store.js';
5
+ import { replayEndpoint } from './replay/engine.js';
6
+ import { AuthManager, getMachineId } from './auth/manager.js';
7
+ import { homedir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ const APITAP_DIR = process.env.APITAP_DIR || join(homedir(), '.apitap');
10
+ /**
11
+ * Build MCP tool definitions from a skill file's endpoints.
12
+ * Each endpoint becomes one tool named `domain_endpointId`.
13
+ */
14
+ export function buildServeTools(skill) {
15
+ return skill.endpoints.map(ep => {
16
+ const properties = {};
17
+ const required = [];
18
+ // Path params → required
19
+ const pathParams = ep.path.match(/:([a-zA-Z_]+)/g);
20
+ if (pathParams) {
21
+ for (const raw of pathParams) {
22
+ const name = raw.slice(1);
23
+ properties[name] = { type: 'string', description: `Path parameter` };
24
+ required.push(name);
25
+ }
26
+ }
27
+ // Query params → optional with examples
28
+ for (const [key, val] of Object.entries(ep.queryParams)) {
29
+ properties[key] = {
30
+ type: 'string',
31
+ description: `Query param (example: ${val.example})`,
32
+ };
33
+ }
34
+ // Body variables → optional
35
+ if (ep.requestBody?.variables) {
36
+ for (const varPath of ep.requestBody.variables) {
37
+ properties[varPath] = {
38
+ type: 'string',
39
+ description: `Body variable`,
40
+ };
41
+ }
42
+ }
43
+ return {
44
+ name: `${skill.domain}_${ep.id}`,
45
+ description: `${ep.method} ${ep.path} on ${skill.domain}`,
46
+ endpointId: ep.id,
47
+ inputSchema: {
48
+ type: 'object',
49
+ properties,
50
+ required,
51
+ },
52
+ };
53
+ });
54
+ }
55
+ /**
56
+ * Create an MCP server that exposes a skill file's endpoints as tools.
57
+ * Each endpoint becomes a callable tool that delegates to the replay engine.
58
+ */
59
+ export async function createServeServer(domain, options = {}) {
60
+ const skill = await readSkillFile(domain, options.skillsDir);
61
+ if (!skill) {
62
+ throw new Error(`No skill file found for "${domain}". Run: apitap capture ${domain}`);
63
+ }
64
+ if (skill.endpoints.length === 0) {
65
+ throw new Error(`Skill file for "${domain}" has no endpoints.`);
66
+ }
67
+ const tools = buildServeTools(skill);
68
+ // Load auth manager unless --no-auth
69
+ let authManager;
70
+ if (!options.noAuth) {
71
+ const machineId = await getMachineId();
72
+ authManager = new AuthManager(APITAP_DIR, machineId);
73
+ }
74
+ const server = new McpServer({
75
+ name: `apitap-serve-${domain}`,
76
+ version: '1.0.0',
77
+ });
78
+ // Register one tool per endpoint
79
+ for (const tool of tools) {
80
+ // Build zod schema from tool.inputSchema
81
+ const shape = {};
82
+ for (const [key, prop] of Object.entries(tool.inputSchema.properties)) {
83
+ const field = z.string().describe(prop.description);
84
+ shape[key] = tool.inputSchema.required.includes(key) ? field : field.optional();
85
+ }
86
+ const endpointId = tool.endpointId;
87
+ server.registerTool(tool.name, {
88
+ description: tool.description,
89
+ inputSchema: z.object(shape),
90
+ annotations: {
91
+ readOnlyHint: true,
92
+ openWorldHint: true,
93
+ },
94
+ }, async (args) => {
95
+ const endpoint = skill.endpoints.find(e => e.id === endpointId);
96
+ const savedHeaders = endpoint.headers;
97
+ try {
98
+ // Inject stored auth without mutating the shared skill object
99
+ if (authManager) {
100
+ const hasStoredPlaceholder = Object.values(savedHeaders).some(v => v === '[stored]');
101
+ if (hasStoredPlaceholder) {
102
+ try {
103
+ const storedAuth = await authManager.retrieve(domain);
104
+ if (storedAuth) {
105
+ endpoint.headers = { ...savedHeaders, [storedAuth.header]: storedAuth.value };
106
+ }
107
+ }
108
+ catch {
109
+ // Auth retrieval failed — proceed without
110
+ }
111
+ }
112
+ }
113
+ // Convert args to string params
114
+ const params = {};
115
+ for (const [k, v] of Object.entries(args)) {
116
+ if (v !== undefined)
117
+ params[k] = String(v);
118
+ }
119
+ const result = await replayEndpoint(skill, endpointId, {
120
+ params,
121
+ authManager,
122
+ domain,
123
+ _skipSsrfCheck: options._skipSsrfCheck,
124
+ });
125
+ return {
126
+ content: [{
127
+ type: 'text',
128
+ text: JSON.stringify({ status: result.status, data: result.data }),
129
+ }],
130
+ };
131
+ }
132
+ catch (err) {
133
+ return {
134
+ content: [{
135
+ type: 'text',
136
+ text: `Replay failed: ${err.message}`,
137
+ }],
138
+ isError: true,
139
+ };
140
+ }
141
+ finally {
142
+ // Restore original headers so [stored] placeholders remain for next call
143
+ endpoint.headers = savedHeaders;
144
+ }
145
+ });
146
+ }
147
+ return server;
148
+ }
149
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { CapturedExchange, SkillEndpoint, SkillFile, StoredAuth, OAuthConfig } from '../types.js';
2
+ export interface GeneratorOptions {
3
+ enablePreview?: boolean;
4
+ scrub?: boolean;
5
+ }
6
+ export declare class SkillGenerator {
7
+ private endpoints;
8
+ private exchangeBodies;
9
+ private captureCount;
10
+ private filteredCount;
11
+ private baseUrl;
12
+ private extractedAuthList;
13
+ private options;
14
+ private captchaRisk;
15
+ private oauthConfig;
16
+ private oauthClientSecret;
17
+ private totalNetworkBytes;
18
+ /** Number of unique endpoints captured so far */
19
+ get endpointCount(): number;
20
+ constructor(options?: GeneratorOptions);
21
+ /** Add a captured exchange. Returns the new endpoint if first seen, null if duplicate. */
22
+ addExchange(exchange: CapturedExchange): SkillEndpoint | null;
23
+ /** Record a filtered-out request (for metadata tracking). */
24
+ recordFiltered(): void;
25
+ /** Get auth credentials extracted during capture. */
26
+ getExtractedAuth(): StoredAuth[];
27
+ /** Mark this domain as having captcha risk (detected during capture). */
28
+ setCaptchaRisk(detected: boolean): void;
29
+ /** Get detected OAuth configuration (non-secret, for skill file). */
30
+ getOAuthConfig(): OAuthConfig | null;
31
+ /** Get the client secret captured from OAuth traffic (for encrypted storage). */
32
+ getOAuthClientSecret(): string | undefined;
33
+ /** Check if any endpoint has refreshable tokens. */
34
+ private hasRefreshableTokens;
35
+ /** Get total network bytes seen during capture (all responses, before filtering). */
36
+ getTotalNetworkBytes(): number;
37
+ /** Add network bytes from a response that was filtered out (not added as exchange). */
38
+ addNetworkBytes(bytes: number): void;
39
+ /** Generate the complete skill file for a domain. */
40
+ toSkillFile(domain: string, options?: {
41
+ domBytes?: number;
42
+ totalRequests?: number;
43
+ }): SkillFile;
44
+ }
@@ -0,0 +1,419 @@
1
+ import { scrubPII } from '../capture/scrubber.js';
2
+ import { parameterizePath, cleanFrameworkPath } from '../capture/parameterize.js';
3
+ import { detectPagination } from '../capture/pagination.js';
4
+ import { detectBodyVariables } from '../capture/body-variables.js';
5
+ import { isGraphQLEndpoint, parseGraphQLBody, extractOperationName, detectGraphQLVariables } from '../capture/graphql.js';
6
+ import { detectRefreshableTokens } from '../capture/token-detector.js';
7
+ import { isLikelyToken } from '../capture/entropy.js';
8
+ import { isOAuthTokenRequest } from '../capture/oauth-detector.js';
9
+ import { diffBodies } from '../capture/body-diff.js';
10
+ const KEEP_HEADERS = new Set([
11
+ 'authorization',
12
+ 'content-type',
13
+ 'accept',
14
+ 'x-api-key',
15
+ 'x-csrf-token',
16
+ 'x-requested-with',
17
+ ]);
18
+ const AUTH_HEADERS = new Set([
19
+ 'authorization',
20
+ 'x-api-key',
21
+ ]);
22
+ function filterHeaders(headers) {
23
+ const filtered = {};
24
+ for (const [key, value] of Object.entries(headers)) {
25
+ const lower = key.toLowerCase();
26
+ if (KEEP_HEADERS.has(lower) || (lower.startsWith('x-') && !lower.startsWith('x-forwarded'))) {
27
+ filtered[key] = value;
28
+ }
29
+ }
30
+ return filtered;
31
+ }
32
+ function stripAuth(headers, entropyDetected) {
33
+ const stripped = {};
34
+ for (const [key, value] of Object.entries(headers)) {
35
+ const lower = key.toLowerCase();
36
+ if (AUTH_HEADERS.has(lower) || entropyDetected?.has(lower)) {
37
+ stripped[key] = '[stored]';
38
+ }
39
+ else {
40
+ stripped[key] = value;
41
+ }
42
+ }
43
+ return stripped;
44
+ }
45
+ /**
46
+ * Extract auth credentials from headers.
47
+ * Uses name-based matching for known auth headers, plus entropy-based
48
+ * detection for non-standard headers carrying high-entropy tokens.
49
+ *
50
+ * @returns [auth list, set of entropy-detected header names (lowercased)]
51
+ */
52
+ function extractAuth(headers) {
53
+ const auth = [];
54
+ const entropyDetected = new Set();
55
+ for (const [key, value] of Object.entries(headers)) {
56
+ const lower = key.toLowerCase();
57
+ if (lower === 'authorization' && value) {
58
+ auth.push({
59
+ type: value.toLowerCase().startsWith('bearer') ? 'bearer' : 'custom',
60
+ header: lower,
61
+ value,
62
+ });
63
+ }
64
+ else if (lower === 'x-api-key' && value) {
65
+ auth.push({ type: 'api-key', header: lower, value });
66
+ }
67
+ else if (!AUTH_HEADERS.has(lower) && value) {
68
+ // Entropy-based detection for non-standard headers
69
+ const classification = isLikelyToken(lower, value);
70
+ if (classification.isToken) {
71
+ auth.push({ type: 'custom', header: lower, value });
72
+ entropyDetected.add(lower);
73
+ }
74
+ }
75
+ }
76
+ return [auth, entropyDetected];
77
+ }
78
+ function generateEndpointId(method, parameterizedPath) {
79
+ // Clean framework noise for the ID (but not for the stored path)
80
+ let cleaned = cleanFrameworkPath(parameterizedPath);
81
+ // Split into segments, remove :param placeholders (they add no info to the ID)
82
+ const segments = cleaned.split('/').filter(s => s !== '' && !s.startsWith(':'));
83
+ const slug = segments.join('-').replace(/[^a-z0-9-]/gi, '').toLowerCase() || 'root';
84
+ return `${method.toLowerCase()}-${slug}`;
85
+ }
86
+ function detectResponseShape(body) {
87
+ try {
88
+ const parsed = JSON.parse(body);
89
+ if (Array.isArray(parsed)) {
90
+ const first = parsed[0];
91
+ return {
92
+ type: 'array',
93
+ fields: first && typeof first === 'object' && first !== null
94
+ ? Object.keys(first)
95
+ : undefined,
96
+ };
97
+ }
98
+ if (typeof parsed === 'object' && parsed !== null) {
99
+ return { type: 'object', fields: Object.keys(parsed) };
100
+ }
101
+ return { type: typeof parsed };
102
+ }
103
+ catch {
104
+ return { type: 'unknown' };
105
+ }
106
+ }
107
+ function truncatePreview(body, maxItems = 2) {
108
+ try {
109
+ const parsed = JSON.parse(body);
110
+ if (Array.isArray(parsed)) {
111
+ return parsed.slice(0, maxItems);
112
+ }
113
+ return parsed;
114
+ }
115
+ catch {
116
+ return body.slice(0, 500);
117
+ }
118
+ }
119
+ function extractQueryParams(url) {
120
+ const params = {};
121
+ for (const [key, value] of url.searchParams) {
122
+ params[key] = { type: 'string', example: value };
123
+ }
124
+ return params;
125
+ }
126
+ function scrubQueryParams(params) {
127
+ const scrubbed = {};
128
+ for (const [key, val] of Object.entries(params)) {
129
+ scrubbed[key] = { type: val.type, example: scrubPII(val.example) };
130
+ }
131
+ return scrubbed;
132
+ }
133
+ function scrubBody(body, doScrub) {
134
+ if (!doScrub)
135
+ return body;
136
+ if (typeof body === 'string') {
137
+ return scrubPII(body);
138
+ }
139
+ if (body && typeof body === 'object') {
140
+ const scrubbed = {};
141
+ for (const [key, value] of Object.entries(body)) {
142
+ if (typeof value === 'string') {
143
+ scrubbed[key] = scrubPII(value);
144
+ }
145
+ else if (value && typeof value === 'object') {
146
+ scrubbed[key] = scrubBody(value, doScrub);
147
+ }
148
+ else {
149
+ scrubbed[key] = value;
150
+ }
151
+ }
152
+ return scrubbed;
153
+ }
154
+ return body;
155
+ }
156
+ export class SkillGenerator {
157
+ endpoints = new Map();
158
+ exchangeBodies = new Map(); // v1.0: store bodies for cross-request diffing
159
+ captureCount = 0;
160
+ filteredCount = 0;
161
+ baseUrl = null;
162
+ extractedAuthList = [];
163
+ options;
164
+ captchaRisk = false;
165
+ oauthConfig = null;
166
+ oauthClientSecret;
167
+ totalNetworkBytes = 0; // v1.0: accumulate all response sizes
168
+ /** Number of unique endpoints captured so far */
169
+ get endpointCount() {
170
+ return this.endpoints.size;
171
+ }
172
+ constructor(options = {}) {
173
+ this.options = {
174
+ enablePreview: options.enablePreview ?? false,
175
+ scrub: options.scrub ?? true,
176
+ };
177
+ }
178
+ /** Add a captured exchange. Returns the new endpoint if first seen, null if duplicate. */
179
+ addExchange(exchange) {
180
+ this.captureCount++;
181
+ const url = new URL(exchange.request.url);
182
+ const method = exchange.request.method;
183
+ const contentType = exchange.request.headers['content-type'] ?? '';
184
+ // Track baseUrl from the first captured exchange
185
+ if (!this.baseUrl) {
186
+ this.baseUrl = url.origin;
187
+ }
188
+ // Check for GraphQL
189
+ const isGraphQL = isGraphQLEndpoint(url.pathname, contentType, exchange.request.postData ?? null);
190
+ let graphqlInfo = null;
191
+ if (isGraphQL && exchange.request.postData) {
192
+ const parsed = parseGraphQLBody(exchange.request.postData);
193
+ if (parsed) {
194
+ const opName = extractOperationName(parsed.query, parsed.operationName);
195
+ graphqlInfo = {
196
+ operationName: opName,
197
+ query: parsed.query,
198
+ variables: parsed.variables,
199
+ };
200
+ }
201
+ }
202
+ // Parameterize path for dedup and storage
203
+ const paramPath = parameterizePath(url.pathname);
204
+ // Use framework-cleaned path for dedup key so _next/data routes with different build hashes collapse
205
+ const dedupPath = cleanFrameworkPath(paramPath);
206
+ // For GraphQL, dedup by operation name instead of path
207
+ const key = graphqlInfo
208
+ ? `${method} graphql:${graphqlInfo.operationName}`
209
+ : `${method} ${dedupPath}`;
210
+ // Track response bytes for all exchanges (for browser cost measurement)
211
+ this.totalNetworkBytes += exchange.response.body.length;
212
+ if (this.endpoints.has(key)) {
213
+ // Store duplicate body for cross-request diffing (Strategy 1)
214
+ if (exchange.request.postData) {
215
+ const bodies = this.exchangeBodies.get(key);
216
+ if (bodies)
217
+ bodies.push(exchange.request.postData);
218
+ }
219
+ return null;
220
+ }
221
+ // Detect OAuth token requests from captured traffic
222
+ const oauthInfo = isOAuthTokenRequest(exchange.request);
223
+ if (oauthInfo && !this.oauthConfig) {
224
+ this.oauthConfig = {
225
+ tokenEndpoint: oauthInfo.tokenEndpoint,
226
+ clientId: oauthInfo.clientId,
227
+ grantType: oauthInfo.grantType,
228
+ ...(oauthInfo.scope ? { scope: oauthInfo.scope } : {}),
229
+ };
230
+ this.oauthClientSecret = oauthInfo.clientSecret;
231
+ }
232
+ // Extract auth before filtering headers (includes entropy-based detection)
233
+ const [auth, entropyDetected] = extractAuth(exchange.request.headers);
234
+ this.extractedAuthList.push(...auth);
235
+ // Filter headers, then strip auth values (including entropy-detected tokens)
236
+ const filtered = filterHeaders(exchange.request.headers);
237
+ const safeHeaders = stripAuth(filtered, entropyDetected);
238
+ // Build query params, optionally scrub PII
239
+ let queryParams = extractQueryParams(url);
240
+ if (this.options.scrub) {
241
+ queryParams = scrubQueryParams(queryParams);
242
+ }
243
+ // Build example URL, optionally scrub PII
244
+ let exampleUrl = exchange.request.url;
245
+ if (this.options.scrub) {
246
+ exampleUrl = scrubPII(exampleUrl);
247
+ }
248
+ // Response preview: null by default, populated with --preview
249
+ let responsePreview = null;
250
+ if (this.options.enablePreview) {
251
+ const preview = truncatePreview(exchange.response.body);
252
+ responsePreview = this.options.scrub && typeof preview === 'string'
253
+ ? scrubPII(preview)
254
+ : preview;
255
+ }
256
+ // Detect pagination patterns
257
+ const pagination = detectPagination(queryParams) ?? undefined;
258
+ // Process request body for POST/PUT/PATCH
259
+ let requestBody;
260
+ if (['POST', 'PUT', 'PATCH'].includes(method) && exchange.request.postData) {
261
+ const bodyContentType = exchange.request.headers['content-type'] ?? 'application/octet-stream';
262
+ const rawBody = exchange.request.postData;
263
+ if (bodyContentType.includes('json')) {
264
+ try {
265
+ const parsed = JSON.parse(rawBody);
266
+ const scrubbedTemplate = scrubBody(parsed, this.options.scrub);
267
+ // For GraphQL, detect variables in the variables object specifically
268
+ let variables;
269
+ if (graphqlInfo && graphqlInfo.variables) {
270
+ variables = detectGraphQLVariables(graphqlInfo.variables, 'variables');
271
+ }
272
+ else {
273
+ variables = detectBodyVariables(parsed);
274
+ }
275
+ // Detect refreshable tokens (CSRF, nonces) for v0.8 auth refresh
276
+ const refreshable = detectRefreshableTokens(parsed);
277
+ requestBody = {
278
+ contentType: 'application/json',
279
+ template: scrubbedTemplate,
280
+ ...(variables.length > 0 ? { variables } : {}),
281
+ ...(refreshable.length > 0 ? { refreshableTokens: refreshable } : {}),
282
+ };
283
+ }
284
+ catch {
285
+ // Invalid JSON - store as string
286
+ requestBody = {
287
+ contentType: bodyContentType,
288
+ template: this.options.scrub ? scrubPII(rawBody) : rawBody,
289
+ };
290
+ }
291
+ }
292
+ else {
293
+ // Non-JSON body - store as string
294
+ requestBody = {
295
+ contentType: bodyContentType,
296
+ template: this.options.scrub ? scrubPII(rawBody) : rawBody,
297
+ };
298
+ }
299
+ }
300
+ // Generate endpoint ID - use GraphQL operation name if applicable
301
+ const endpointId = graphqlInfo
302
+ ? `${method.toLowerCase()}-graphql-${graphqlInfo.operationName}`
303
+ : generateEndpointId(method, paramPath);
304
+ const endpoint = {
305
+ id: endpointId,
306
+ method: exchange.request.method,
307
+ path: paramPath,
308
+ queryParams,
309
+ headers: safeHeaders,
310
+ responseShape: detectResponseShape(exchange.response.body),
311
+ examples: {
312
+ request: {
313
+ url: exampleUrl,
314
+ headers: stripAuth(filterHeaders(exchange.request.headers)),
315
+ },
316
+ responsePreview,
317
+ },
318
+ ...(pagination ? { pagination } : {}),
319
+ ...(requestBody ? { requestBody } : {}),
320
+ };
321
+ // Also strip entropy-detected tokens from example headers
322
+ if (entropyDetected.size > 0) {
323
+ endpoint.examples.request.headers = stripAuth(filterHeaders(exchange.request.headers), entropyDetected);
324
+ }
325
+ // Store response bytes on endpoint
326
+ endpoint.responseBytes = exchange.response.body.length;
327
+ this.endpoints.set(key, endpoint);
328
+ // Store first body for cross-request diffing
329
+ if (exchange.request.postData) {
330
+ this.exchangeBodies.set(key, [exchange.request.postData]);
331
+ }
332
+ return endpoint;
333
+ }
334
+ /** Record a filtered-out request (for metadata tracking). */
335
+ recordFiltered() {
336
+ this.filteredCount++;
337
+ }
338
+ /** Get auth credentials extracted during capture. */
339
+ getExtractedAuth() {
340
+ return this.extractedAuthList;
341
+ }
342
+ /** Mark this domain as having captcha risk (detected during capture). */
343
+ setCaptchaRisk(detected) {
344
+ this.captchaRisk = detected;
345
+ }
346
+ /** Get detected OAuth configuration (non-secret, for skill file). */
347
+ getOAuthConfig() {
348
+ return this.oauthConfig;
349
+ }
350
+ /** Get the client secret captured from OAuth traffic (for encrypted storage). */
351
+ getOAuthClientSecret() {
352
+ return this.oauthClientSecret;
353
+ }
354
+ /** Check if any endpoint has refreshable tokens. */
355
+ hasRefreshableTokens() {
356
+ for (const endpoint of this.endpoints.values()) {
357
+ if (endpoint.requestBody?.refreshableTokens?.length) {
358
+ return true;
359
+ }
360
+ }
361
+ return false;
362
+ }
363
+ /** Get total network bytes seen during capture (all responses, before filtering). */
364
+ getTotalNetworkBytes() {
365
+ return this.totalNetworkBytes;
366
+ }
367
+ /** Add network bytes from a response that was filtered out (not added as exchange). */
368
+ addNetworkBytes(bytes) {
369
+ this.totalNetworkBytes += bytes;
370
+ }
371
+ /** Generate the complete skill file for a domain. */
372
+ toSkillFile(domain, options) {
373
+ // Apply cross-request diffing (Strategy 1) to endpoints with multiple bodies
374
+ for (const [key, bodies] of this.exchangeBodies) {
375
+ if (bodies.length < 2)
376
+ continue;
377
+ const endpoint = this.endpoints.get(key);
378
+ if (!endpoint?.requestBody)
379
+ continue;
380
+ const diffedVars = diffBodies(bodies);
381
+ if (diffedVars.length > 0) {
382
+ const existing = new Set(endpoint.requestBody.variables ?? []);
383
+ for (const v of diffedVars)
384
+ existing.add(v);
385
+ endpoint.requestBody.variables = [...existing];
386
+ }
387
+ }
388
+ const skill = {
389
+ version: '1.2',
390
+ domain,
391
+ capturedAt: new Date().toISOString(),
392
+ baseUrl: this.baseUrl ?? `https://${domain}`,
393
+ endpoints: Array.from(this.endpoints.values()),
394
+ metadata: {
395
+ captureCount: this.captureCount,
396
+ filteredCount: this.filteredCount,
397
+ toolVersion: '1.0.0',
398
+ ...(options?.domBytes != null ? {
399
+ browserCost: {
400
+ domBytes: options.domBytes,
401
+ totalNetworkBytes: this.totalNetworkBytes,
402
+ totalRequests: options.totalRequests ?? this.captureCount + this.filteredCount,
403
+ },
404
+ } : {}),
405
+ },
406
+ provenance: 'unsigned',
407
+ };
408
+ // Add auth config if captcha risk detected, refreshable tokens present, or OAuth detected
409
+ if (this.captchaRisk || this.hasRefreshableTokens() || this.oauthConfig) {
410
+ skill.auth = {
411
+ browserMode: this.captchaRisk ? 'visible' : 'headless',
412
+ captchaRisk: this.captchaRisk,
413
+ ...(this.oauthConfig ? { oauthConfig: this.oauthConfig } : {}),
414
+ };
415
+ }
416
+ return skill;
417
+ }
418
+ }
419
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/skill/generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC1H,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAkB,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,eAAe;IACf,cAAc;IACd,QAAQ;IACR,WAAW;IACX,cAAc;IACd,kBAAkB;CACnB,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,eAAe;IACf,WAAW;CACZ,CAAC,CAAC;AAOH,SAAS,aAAa,CAAC,OAA+B;IACpD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAC5F,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,OAA+B,EAAE,eAA6B;IAC/E,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,OAA+B;IAClD,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,KAAK,eAAe,IAAI,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACpE,MAAM,EAAE,KAAK;gBACb,KAAK;aACN,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;YAC7C,mDAAmD;YACnD,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,iBAAyB;IACnE,iEAAiE;IACjE,IAAI,OAAO,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAEpD,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC;IACpF,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;oBAC1D,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;oBACpB,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,MAAM,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAQ,GAAG,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAQ;IAClC,MAAM,MAAM,GAAsD,EAAE,CAAC;IACrE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAyD;IAEzD,MAAM,QAAQ,GAAsD,EAAE,CAAC;IACvE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,IAAa,EAAE,OAAgB;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC3E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9C,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,cAAc;IACjB,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC7C,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAC,CAAC,+CAA+C;IAC7F,YAAY,GAAG,CAAC,CAAC;IACjB,aAAa,GAAG,CAAC,CAAC;IAClB,OAAO,GAAkB,IAAI,CAAC;IAC9B,iBAAiB,GAAiB,EAAE,CAAC;IACrC,OAAO,CAA6B;IACpC,WAAW,GAAG,KAAK,CAAC;IACpB,WAAW,GAAuB,IAAI,CAAC;IACvC,iBAAiB,CAAqB;IACtC,iBAAiB,GAAG,CAAC,CAAC,CAAC,sCAAsC;IAErE,iDAAiD;IACjD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,YAAY,UAA4B,EAAE;QACxC,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,KAAK;YAC7C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;SAC7B,CAAC;IACJ,CAAC;IAED,0FAA0F;IAC1F,WAAW,CAAC,QAA0B;QACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEnE,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,CAAC;QAED,oBAAoB;QACpB,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAClG,IAAI,WAAW,GAA+F,IAAI,CAAC;QAEnH,IAAI,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBACxE,WAAW,GAAG;oBACZ,aAAa,EAAE,MAAM;oBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;iBAC5B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,qGAAqG;QACrG,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEhD,uDAAuD;QACvD,MAAM,GAAG,GAAG,WAAW;YACrB,CAAC,CAAC,GAAG,MAAM,YAAY,WAAW,CAAC,aAAa,EAAE;YAClD,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;QAE7B,wEAAwE;QACxE,IAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAExD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,8DAA8D;YAC9D,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5C,IAAI,MAAM;oBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oDAAoD;QACpD,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG;gBACjB,aAAa,EAAE,SAAS,CAAC,aAAa;gBACtC,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC;YACF,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC;QAClD,CAAC;QAED,2EAA2E;QAC3E,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAErC,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAEzD,2CAA2C;QAC3C,IAAI,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QAED,0CAA0C;QAC1C,IAAI,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QAED,8DAA8D;QAC9D,IAAI,eAAe,GAAY,IAAI,CAAC;QACpC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxD,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,OAAO,KAAK,QAAQ;gBACjE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACnB,CAAC,CAAC,OAAO,CAAC;QACd,CAAC;QAED,6BAA6B;QAC7B,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;QAE9D,0CAA0C;QAC1C,IAAI,WAAoC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3E,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;YAC/F,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;YAE1C,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACnC,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAA4B,CAAC;oBAE1F,qEAAqE;oBACrE,IAAI,SAAmB,CAAC;oBACxB,IAAI,WAAW,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;wBACzC,SAAS,GAAG,sBAAsB,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;oBACzE,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;oBAC1C,CAAC;oBAED,iEAAiE;oBACjE,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;oBAEpD,WAAW,GAAG;wBACZ,WAAW,EAAE,kBAAkB;wBAC/B,QAAQ,EAAE,gBAAgB;wBAC1B,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC9C,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACtE,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,iCAAiC;oBACjC,WAAW,GAAG;wBACZ,WAAW,EAAE,eAAe;wBAC5B,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;qBAC3D,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,kCAAkC;gBAClC,WAAW,GAAG;oBACZ,WAAW,EAAE,eAAe;oBAC5B,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;iBAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAG,WAAW;YAC5B,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,YAAY,WAAW,CAAC,aAAa,EAAE;YAChE,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAkB;YAC9B,EAAE,EAAE,UAAU;YACd,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;YAC/B,IAAI,EAAE,SAAS;YACf,WAAW;YACX,OAAO,EAAE,WAAW;YACpB,aAAa,EAAE,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1D,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP,GAAG,EAAE,UAAU;oBACf,OAAO,EAAE,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC5D;gBACD,eAAe;aAChB;YACD,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC;QAEF,0DAA0D;QAC1D,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAC3C,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EACvC,eAAe,CAChB,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAEvD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAElC,6CAA6C;QAC7C,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,6DAA6D;IAC7D,cAAc;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,qDAAqD;IACrD,gBAAgB;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,yEAAyE;IACzE,cAAc,CAAC,QAAiB;QAC9B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,qEAAqE;IACrE,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,iFAAiF;IACjF,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,oDAAoD;IAC5C,oBAAoB;QAC1B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,IAAI,QAAQ,CAAC,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;gBACpD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qFAAqF;IACrF,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,uFAAuF;IACvF,eAAe,CAAC,KAAa;QAC3B,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC;IAClC,CAAC;IAED,qDAAqD;IACrD,WAAW,CAAC,MAAc,EAAE,OAAuD;QACjF,6EAA6E;QAC7E,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,EAAE,WAAW;gBAAE,SAAS;YAErC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAC/D,KAAK,MAAM,CAAC,IAAI,UAAU;oBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5C,QAAQ,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAc;YACvB,OAAO,EAAE,KAAK;YACd,MAAM;YACN,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW,MAAM,EAAE;YAC5C,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9C,QAAQ,EAAE;gBACR,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,OAAO;gBACpB,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC;oBAC9B,WAAW,EAAE;wBACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;wBACzC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa;qBAC/E;iBACF,CAAC,CAAC,CAAC,EAAE,CAAC;aACR;YACD,UAAU,EAAE,UAAmB;SAChC,CAAC;QAEF,0FAA0F;QAC1F,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxE,KAAK,CAAC,IAAI,GAAG;gBACX,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;gBACtD,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { SkillFile } from '../types.js';
2
+ export interface ImportValidation {
3
+ valid: boolean;
4
+ reason?: string;
5
+ signatureStatus: 'valid' | 'invalid' | 'unsigned';
6
+ summary?: {
7
+ domain: string;
8
+ endpointCount: number;
9
+ baseUrl: string;
10
+ };
11
+ }
12
+ export interface ImportResult {
13
+ success: boolean;
14
+ reason?: string;
15
+ skillFile?: string;
16
+ }
17
+ /**
18
+ * Validate a skill file for import.
19
+ * Checks structure, SSRF safety, and signature integrity.
20
+ */
21
+ export declare function validateImport(skill: SkillFile, localKey?: Buffer): ImportValidation;
22
+ /**
23
+ * Import a skill file from disk.
24
+ * Validates, strips foreign signatures, sets provenance to 'imported'.
25
+ */
26
+ export declare function importSkillFile(filePath: string, skillsDir?: string, localKey?: Buffer): Promise<ImportResult>;