@apitap/core 1.5.4 → 1.6.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.
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Resolve a JSON $ref pointer in an OpenAPI spec.
3
+ * Uses a visited set to detect cycles and a depth limit as safety net.
4
+ */
5
+ export function resolveRef(obj, spec, visited = new Set(), depth = 0) {
6
+ if (!obj || typeof obj !== 'object')
7
+ return obj;
8
+ // Handle allOf composition: merge properties from all entries
9
+ if (obj.allOf && Array.isArray(obj.allOf)) {
10
+ const merged = { type: 'object', properties: {} };
11
+ for (const entry of obj.allOf) {
12
+ const resolved = resolveRef(entry, spec, new Set(visited), depth + 1);
13
+ if (resolved?.properties) {
14
+ Object.assign(merged.properties, resolved.properties);
15
+ }
16
+ if (resolved?.required) {
17
+ merged.required = [...(merged.required || []), ...resolved.required];
18
+ }
19
+ if (resolved?.description && !merged.description) {
20
+ merged.description = resolved.description;
21
+ }
22
+ }
23
+ return merged;
24
+ }
25
+ // Handle oneOf/anyOf: use first option as representative
26
+ if (obj.oneOf && Array.isArray(obj.oneOf) && obj.oneOf.length > 0) {
27
+ return resolveRef(obj.oneOf[0], spec, new Set(visited), depth + 1);
28
+ }
29
+ if (obj.anyOf && Array.isArray(obj.anyOf) && obj.anyOf.length > 0) {
30
+ return resolveRef(obj.anyOf[0], spec, new Set(visited), depth + 1);
31
+ }
32
+ if (!obj.$ref)
33
+ return obj;
34
+ const ref = obj.$ref;
35
+ if (!ref.startsWith('#/'))
36
+ return null; // Only local document refs supported
37
+ if (visited.has(ref))
38
+ return null; // cycle detected
39
+ if (depth > 10)
40
+ return null; // depth safety net
41
+ visited.add(ref);
42
+ const refPath = ref.replace('#/', '').split('/');
43
+ let resolved = spec;
44
+ for (const segment of refPath) {
45
+ resolved = resolved?.[segment];
46
+ if (resolved === undefined)
47
+ return null;
48
+ }
49
+ // Recursively resolve if the resolved object also has $ref or allOf
50
+ return resolveRef(resolved, spec, visited, depth + 1);
51
+ }
52
+ export function extractDomainAndBasePath(spec, specUrl) {
53
+ const serverUrl = spec.servers?.[0]?.url;
54
+ if (serverUrl) {
55
+ try {
56
+ const parsed = new URL(serverUrl);
57
+ return { domain: parsed.hostname, basePath: parsed.pathname.replace(/\/$/, '') };
58
+ }
59
+ catch {
60
+ if (serverUrl.startsWith('/')) {
61
+ const providerName = spec.info?.['x-providerName'];
62
+ const domain = (providerName && /^[a-zA-Z0-9][a-zA-Z0-9._-]+$/.test(providerName))
63
+ ? providerName
64
+ : new URL(specUrl).hostname;
65
+ return { domain, basePath: serverUrl.replace(/\/$/, '') };
66
+ }
67
+ }
68
+ }
69
+ if (spec.host) {
70
+ try {
71
+ const parsed = new URL(`https://${spec.host}`);
72
+ return { domain: parsed.hostname, basePath: (spec.basePath || '').replace(/\/$/, '') };
73
+ }
74
+ catch {
75
+ return { domain: spec.host.split(':')[0], basePath: (spec.basePath || '').replace(/\/$/, '') };
76
+ }
77
+ }
78
+ try {
79
+ return { domain: new URL(specUrl).hostname, basePath: '' };
80
+ }
81
+ catch {
82
+ throw new Error(`Cannot determine API domain from spec (no servers, host, or valid specUrl)`);
83
+ }
84
+ }
85
+ export function computeConfidence(input) {
86
+ let score = 0.6;
87
+ if (input.hasExamples)
88
+ score += 0.1;
89
+ if (!input.requiresAuth)
90
+ score += 0.1;
91
+ if (input.method === 'GET')
92
+ score += 0.05;
93
+ return Math.min(score, 0.85);
94
+ }
95
+ export function detectAuth(spec) {
96
+ const schemes = spec.components?.securitySchemes || {};
97
+ const defs = spec.securityDefinitions || {};
98
+ const allSchemes = { ...schemes, ...defs };
99
+ const security = spec.security || [];
100
+ if (Object.keys(allSchemes).length === 0 && security.length === 0) {
101
+ return { requiresAuth: false };
102
+ }
103
+ let authType;
104
+ for (const scheme of Object.values(allSchemes)) {
105
+ if (scheme.type === 'http' && scheme.scheme === 'bearer') {
106
+ authType = 'bearer';
107
+ break;
108
+ }
109
+ if (scheme.type === 'http' && scheme.scheme === 'basic') {
110
+ authType = 'basic';
111
+ break;
112
+ }
113
+ if (scheme.type === 'apiKey') {
114
+ authType = 'apiKey';
115
+ break;
116
+ }
117
+ if (scheme.type === 'oauth2') {
118
+ authType = 'oauth2';
119
+ break;
120
+ }
121
+ if (scheme.type === 'openIdConnect') {
122
+ authType = 'openIdConnect';
123
+ break;
124
+ }
125
+ }
126
+ return { requiresAuth: true, authType };
127
+ }
128
+ export function generateEndpointId(method, path, operationId, seen) {
129
+ let base;
130
+ if (operationId) {
131
+ base = `${method.toLowerCase()}-${operationId.replace(/[^a-z0-9]/gi, '-').toLowerCase()}`;
132
+ }
133
+ else {
134
+ const segments = path.split('/').filter(s => s !== '' && !s.startsWith(':')).join('-').replace(/[^a-z0-9-]/gi, '').toLowerCase() || 'root';
135
+ base = `${method.toLowerCase()}-${segments}`;
136
+ }
137
+ base = base.replace(/-+/g, '-').replace(/^-|-$/g, '').slice(0, 80);
138
+ let id = base;
139
+ let counter = 2;
140
+ while (seen.has(id)) {
141
+ id = `${base}-${counter}`.slice(0, 80);
142
+ counter++;
143
+ }
144
+ seen.add(id);
145
+ return id;
146
+ }
147
+ const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'];
148
+ const MAX_ENDPOINTS = 500;
149
+ /**
150
+ * Detect whether a parsed JSON object is an OpenAPI/Swagger spec.
151
+ * Returns false for SkillFile objects (which have version+domain+baseUrl+endpoints).
152
+ */
153
+ export function isOpenAPISpec(obj) {
154
+ if (!obj || typeof obj !== 'object')
155
+ return false;
156
+ const o = obj;
157
+ // SkillFile check: if it looks like a SkillFile, it's not an OpenAPI spec
158
+ if (o.version && o.domain && o.baseUrl && Array.isArray(o.endpoints)) {
159
+ return false;
160
+ }
161
+ // OpenAPI 3.x or Swagger 2.0
162
+ if (typeof o.openapi === 'string' || typeof o.swagger === 'string') {
163
+ return true;
164
+ }
165
+ return false;
166
+ }
167
+ /**
168
+ * Extract response shape (type + top-level field names) from an OpenAPI response schema.
169
+ */
170
+ function extractResponseShape(responses, spec) {
171
+ if (!responses)
172
+ return { type: 'unknown' };
173
+ // Try 200, then 201, then first 2xx
174
+ const responseObj = responses['200'] || responses['201'] ||
175
+ Object.entries(responses).find(([k]) => k.startsWith('2'))?.[1];
176
+ if (!responseObj)
177
+ return { type: 'unknown' };
178
+ const resolved = resolveRef(responseObj, spec);
179
+ if (!resolved)
180
+ return { type: 'unknown' };
181
+ // OpenAPI 3.x: content -> application/json -> schema
182
+ let schema = resolved.content?.['application/json']?.schema;
183
+ // Swagger 2.0: schema directly on response
184
+ if (!schema && resolved.schema)
185
+ schema = resolved.schema;
186
+ if (!schema)
187
+ return { type: 'unknown' };
188
+ schema = resolveRef(schema, spec);
189
+ if (!schema)
190
+ return { type: 'unknown' };
191
+ const type = schema.type === 'array' ? 'array' : schema.type === 'object' ? 'object' : (schema.type || 'unknown');
192
+ const fields = [];
193
+ if (schema.properties) {
194
+ fields.push(...Object.keys(schema.properties));
195
+ }
196
+ else if (schema.type === 'array' && schema.items) {
197
+ const items = resolveRef(schema.items, spec);
198
+ if (items?.properties) {
199
+ fields.push(...Object.keys(items.properties));
200
+ }
201
+ }
202
+ return fields.length > 0 ? { type, fields } : { type };
203
+ }
204
+ /**
205
+ * Extract request body template for POST/PUT/PATCH from an OpenAPI operation.
206
+ */
207
+ function extractRequestBody(operation, spec) {
208
+ // OpenAPI 3.x: requestBody -> content -> application/json -> schema
209
+ let schema;
210
+ let contentType = 'application/json';
211
+ if (operation.requestBody) {
212
+ const body = resolveRef(operation.requestBody, spec);
213
+ if (!body)
214
+ return undefined;
215
+ const jsonContent = body.content?.['application/json'];
216
+ if (jsonContent?.schema) {
217
+ schema = resolveRef(jsonContent.schema, spec);
218
+ }
219
+ else {
220
+ // Try first content type
221
+ const firstKey = body.content ? Object.keys(body.content)[0] : undefined;
222
+ if (firstKey && body.content[firstKey]?.schema) {
223
+ contentType = firstKey;
224
+ schema = resolveRef(body.content[firstKey].schema, spec);
225
+ }
226
+ }
227
+ }
228
+ // Swagger 2.0: parameters with in=body
229
+ if (!schema && operation.parameters) {
230
+ const bodyParam = operation.parameters.find((p) => p.in === 'body');
231
+ if (bodyParam?.schema) {
232
+ schema = resolveRef(bodyParam.schema, spec);
233
+ }
234
+ }
235
+ if (!schema)
236
+ return undefined;
237
+ const template = {};
238
+ const variables = [];
239
+ if (schema.properties) {
240
+ for (const [key, prop] of Object.entries(schema.properties)) {
241
+ const resolvedProp = resolveRef(prop, spec) || prop;
242
+ if (resolvedProp.example !== undefined) {
243
+ template[key] = resolvedProp.example;
244
+ }
245
+ else if (resolvedProp.default !== undefined) {
246
+ template[key] = resolvedProp.default;
247
+ }
248
+ else {
249
+ template[key] = `{{${key}}}`;
250
+ variables.push(key);
251
+ }
252
+ }
253
+ }
254
+ return {
255
+ contentType,
256
+ template: Object.keys(template).length > 0 ? template : '{{body}}',
257
+ ...(variables.length > 0 ? { variables } : {}),
258
+ };
259
+ }
260
+ /**
261
+ * Convert an OpenAPI 3.x or Swagger 2.0 spec into an ImportResult.
262
+ */
263
+ export function convertOpenAPISpec(spec, specUrl) {
264
+ const { domain, basePath } = extractDomainAndBasePath(spec, specUrl);
265
+ const { requiresAuth, authType } = detectAuth(spec);
266
+ const specVersion = spec.swagger ? 'swagger2' : 'openapi3';
267
+ const endpoints = [];
268
+ const seenIds = new Set();
269
+ const paths = spec.paths || {};
270
+ for (const [pathKey, pathItem] of Object.entries(paths)) {
271
+ if (!pathItem || typeof pathItem !== 'object')
272
+ continue;
273
+ for (const method of HTTP_METHODS) {
274
+ const operation = pathItem[method];
275
+ if (!operation || typeof operation !== 'object')
276
+ continue;
277
+ // Collect all parameters (path-level + operation-level)
278
+ const allParams = [
279
+ ...(pathItem.parameters || []),
280
+ ...(operation.parameters || []),
281
+ ];
282
+ // Convert path: {param} -> :param, prepend basePath
283
+ const convertedPath = basePath + pathKey.replace(/\{([^}]+)\}/g, ':$1');
284
+ // Extract query params
285
+ const queryParams = {};
286
+ for (const param of allParams) {
287
+ const resolved = resolveRef(param, spec) || param;
288
+ if (resolved.in === 'query') {
289
+ const paramSchema = resolved.schema ? (resolveRef(resolved.schema, spec) || resolved.schema) : resolved;
290
+ const example = resolved.example ?? paramSchema?.example ?? paramSchema?.default ?? '';
291
+ queryParams[resolved.name] = {
292
+ type: paramSchema?.type || 'string',
293
+ example: example !== '' ? String(example) : '',
294
+ fromSpec: true,
295
+ ...(resolved.required ? { required: true } : {}),
296
+ ...(paramSchema?.enum ? { enum: paramSchema.enum } : {}),
297
+ };
298
+ }
299
+ }
300
+ // Extract path param examples for the example URL
301
+ const pathParamExamples = {};
302
+ let hasExamples = false;
303
+ for (const param of allParams) {
304
+ const resolved = resolveRef(param, spec) || param;
305
+ if (resolved.in === 'path') {
306
+ const paramSchema = resolved.schema ? (resolveRef(resolved.schema, spec) || resolved.schema) : resolved;
307
+ const example = resolved.example ?? paramSchema?.example ?? paramSchema?.default;
308
+ if (example !== undefined) {
309
+ pathParamExamples[resolved.name] = String(example);
310
+ hasExamples = true;
311
+ }
312
+ }
313
+ }
314
+ // Check if query params have examples too
315
+ if (!hasExamples) {
316
+ for (const qp of Object.values(queryParams)) {
317
+ if (qp.example !== '') {
318
+ hasExamples = true;
319
+ break;
320
+ }
321
+ }
322
+ }
323
+ // Build example URL
324
+ let examplePath = basePath + pathKey;
325
+ // Substitute path params with examples
326
+ for (const [name, value] of Object.entries(pathParamExamples)) {
327
+ examplePath = examplePath.replace(`{${name}}`, value);
328
+ }
329
+ // Replace remaining unsubstituted path params with placeholder
330
+ examplePath = examplePath.replace(/\{([^}]+)\}/g, ':$1');
331
+ // Add non-empty query params to URL
332
+ const queryEntries = Object.entries(queryParams).filter(([, v]) => v.example !== '');
333
+ const queryString = queryEntries.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v.example)}`).join('&');
334
+ const exampleUrl = `https://${domain}${examplePath}${queryString ? '?' + queryString : ''}`;
335
+ // Extract response shape
336
+ const responseShape = extractResponseShape(operation.responses, spec);
337
+ // Extract request body for write methods
338
+ const methodUpper = method.toUpperCase();
339
+ let requestBody;
340
+ if (['POST', 'PUT', 'PATCH'].includes(methodUpper)) {
341
+ requestBody = extractRequestBody(operation, spec);
342
+ }
343
+ // Description
344
+ const description = operation.summary || operation.description || undefined;
345
+ // Generate endpoint ID
346
+ const id = generateEndpointId(method, convertedPath, operation.operationId, seenIds);
347
+ // Compute confidence
348
+ const confidence = computeConfidence({
349
+ method: methodUpper,
350
+ hasExamples,
351
+ requiresAuth,
352
+ });
353
+ const endpoint = {
354
+ id,
355
+ method: methodUpper,
356
+ path: convertedPath,
357
+ queryParams,
358
+ headers: {},
359
+ responseShape,
360
+ examples: {
361
+ request: { url: exampleUrl, headers: {} },
362
+ responsePreview: null,
363
+ },
364
+ confidence,
365
+ endpointProvenance: 'openapi-import',
366
+ specSource: specUrl,
367
+ ...(description ? { description } : {}),
368
+ ...(requestBody ? { requestBody } : {}),
369
+ };
370
+ endpoints.push(endpoint);
371
+ }
372
+ }
373
+ // Sort by confidence descending, then truncate
374
+ endpoints.sort((a, b) => (b.confidence ?? 0) - (a.confidence ?? 0));
375
+ if (endpoints.length > MAX_ENDPOINTS) {
376
+ process.stderr.write(`[openapi-import] Warning: spec has ${endpoints.length} endpoints, truncating to ${MAX_ENDPOINTS}\n`);
377
+ endpoints.length = MAX_ENDPOINTS;
378
+ }
379
+ const meta = {
380
+ specUrl,
381
+ specVersion,
382
+ title: spec.info?.title || '',
383
+ description: spec.info?.description || '',
384
+ requiresAuth,
385
+ ...(authType ? { authType } : {}),
386
+ endpointCount: endpoints.length,
387
+ };
388
+ return { domain, endpoints, meta };
389
+ }
390
+ //# sourceMappingURL=openapi-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-converter.js","sourceRoot":"","sources":["../../src/skill/openapi-converter.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,11 @@ export declare function canonicalize(skill: SkillFile): string;
9
9
  * Sign a skill file. Returns a new object with signature and provenance: 'self'.
10
10
  */
11
11
  export declare function signSkillFile(skill: SkillFile, key: Buffer): SkillFile;
12
+ /**
13
+ * Sign a skill file with a specific provenance value.
14
+ * Use 'self' for captured files, 'imported-signed' for import-only files.
15
+ */
16
+ export declare function signSkillFileAs(skill: SkillFile, key: Buffer, provenance: 'self' | 'imported-signed'): SkillFile;
12
17
  /**
13
18
  * Verify a skill file's signature.
14
19
  * Returns true if the signature is valid for the given key.
@@ -39,6 +39,15 @@ export function signSkillFile(skill, key) {
39
39
  signature,
40
40
  };
41
41
  }
42
+ /**
43
+ * Sign a skill file with a specific provenance value.
44
+ * Use 'self' for captured files, 'imported-signed' for import-only files.
45
+ */
46
+ export function signSkillFileAs(skill, key, provenance) {
47
+ const payload = canonicalize(skill);
48
+ const signature = hmacSign(payload, key);
49
+ return { ...skill, provenance, signature };
50
+ }
42
51
  /**
43
52
  * Verify a skill file's signature.
44
53
  * Returns true if the signature is valid for the given key.
@@ -1 +1 @@
1
- {"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/skill/signing.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGzD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,GAAW;IACzD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO;QACL,GAAG,KAAK;QACR,UAAU,EAAE,MAAM;QAClB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAgB,EAAE,GAAW;IAC3D,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/skill/signing.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGzD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,GAAW;IACzD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO;QACL,GAAG,KAAK;QACR,UAAU,EAAE,MAAM;QAClB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAgB,EAChB,GAAW,EACX,UAAsC;IAEtC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAgB,EAAE,GAAW;IAC3D,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // src/skill/store.ts
2
- import { readFile, writeFile, mkdir, readdir, access } from 'node:fs/promises';
2
+ import { readFile, writeFile, mkdir, readdir, access, rename } from 'node:fs/promises';
3
3
  import { join, dirname } from 'node:path';
4
4
  import { homedir } from 'node:os';
5
5
  import { validateSkillFile } from './validate.js';
@@ -31,7 +31,10 @@ export async function writeSkillFile(skill, skillsDir = DEFAULT_SKILLS_DIR) {
31
31
  await mkdir(skillsDir, { recursive: true, mode: 0o700 });
32
32
  await ensureGitignore(skillsDir);
33
33
  const filePath = skillPath(skill.domain, skillsDir);
34
- await writeFile(filePath, JSON.stringify(skill, null, 2) + '\n', { mode: 0o600 });
34
+ const tmpPath = `${filePath}.${process.pid}.tmp`;
35
+ const content = JSON.stringify(skill, null, 2) + '\n';
36
+ await writeFile(tmpPath, content, { mode: 0o600 });
37
+ await rename(tmpPath, filePath);
35
38
  return filePath;
36
39
  }
37
40
  export async function readSkillFile(domain, skillsDir = DEFAULT_SKILLS_DIR, options) {
@@ -92,8 +95,10 @@ export async function listSkillFiles(skillsDir = DEFAULT_SKILLS_DIR) {
92
95
  try {
93
96
  files = await readdir(skillsDir);
94
97
  }
95
- catch {
96
- return [];
98
+ catch (err) {
99
+ if (err.code === 'ENOENT')
100
+ return [];
101
+ throw err;
97
102
  }
98
103
  const summaries = [];
99
104
  const DOMAIN_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skill/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skill/store.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -105,6 +105,9 @@ export interface SkillEndpoint {
105
105
  queryParams: Record<string, {
106
106
  type: string;
107
107
  example: string;
108
+ required?: boolean;
109
+ enum?: string[];
110
+ fromSpec?: boolean;
108
111
  }>;
109
112
  headers: Record<string, string>;
110
113
  responseShape: {
@@ -124,6 +127,11 @@ export interface SkillEndpoint {
124
127
  responseBytes?: number;
125
128
  isolatedAuth?: boolean;
126
129
  responseSchema?: SchemaNode;
130
+ normalizedPath?: string;
131
+ confidence?: number;
132
+ endpointProvenance?: 'captured' | 'openapi-import';
133
+ specSource?: string;
134
+ description?: string;
127
135
  }
128
136
  /** The full skill file written to disk */
129
137
  export interface SkillFile {
@@ -141,8 +149,15 @@ export interface SkillFile {
141
149
  totalNetworkBytes: number;
142
150
  totalRequests: number;
143
151
  };
152
+ importHistory?: Array<{
153
+ specUrl: string;
154
+ specVersion: 'openapi3' | 'swagger2';
155
+ importedAt: string;
156
+ endpointsAdded: number;
157
+ endpointsEnriched: number;
158
+ }>;
144
159
  };
145
- provenance: 'self' | 'imported' | 'unsigned';
160
+ provenance: 'self' | 'imported' | 'imported-signed' | 'unsigned';
146
161
  signature?: string;
147
162
  auth?: SkillAuth;
148
163
  }
@@ -190,7 +205,7 @@ export interface SkillSummary {
190
205
  skillFile: string;
191
206
  endpointCount: number;
192
207
  capturedAt: string;
193
- provenance: 'self' | 'imported' | 'unsigned';
208
+ provenance: 'self' | 'imported' | 'imported-signed' | 'unsigned';
194
209
  }
195
210
  /** Detected web framework with predicted API patterns */
196
211
  export interface DetectedFramework {
@@ -226,3 +241,29 @@ export interface DiscoveryResult {
226
241
  authSignals?: string[];
227
242
  loginUrl?: string;
228
243
  }
244
+ /** Metadata about an OpenAPI spec import */
245
+ export interface ImportMeta {
246
+ specUrl: string;
247
+ specVersion: 'openapi3' | 'swagger2';
248
+ title: string;
249
+ description: string;
250
+ requiresAuth: boolean;
251
+ authType?: 'apiKey' | 'oauth2' | 'bearer' | 'basic' | 'openIdConnect';
252
+ endpointCount: number;
253
+ }
254
+ /** Result of converting an OpenAPI spec */
255
+ export interface ImportResult {
256
+ domain: string;
257
+ endpoints: SkillEndpoint[];
258
+ meta: ImportMeta;
259
+ }
260
+ /** Result of merging imported endpoints into an existing skill file */
261
+ export interface MergeResult {
262
+ skillFile: SkillFile;
263
+ diff: {
264
+ preserved: number;
265
+ added: number;
266
+ enriched: number;
267
+ skipped: number;
268
+ };
269
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apitap/core",
3
- "version": "1.5.4",
3
+ "version": "1.6.1",
4
4
  "description": "Intercept web API traffic during browsing. Generate portable skill files so AI agents can call APIs directly instead of scraping.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -50,10 +50,12 @@
50
50
  ],
51
51
  "dependencies": {
52
52
  "@modelcontextprotocol/sdk": "^1.26.0",
53
+ "js-yaml": "^4.1.1",
53
54
  "playwright": "^1.58.1",
54
55
  "zod": "^4.3.6"
55
56
  },
56
57
  "devDependencies": {
58
+ "@types/js-yaml": "^4.0.9",
57
59
  "@types/node": "^25.2.0",
58
60
  "tsx": "^4.21.0",
59
61
  "typescript": "^5.9.3"