capman 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -97
- package/bin/capman.js +420 -91
- package/dist/cjs/index.d.ts +12 -16
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +12 -7
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/parser.d.ts +11 -0
- package/dist/cjs/parser.d.ts.map +1 -0
- package/dist/cjs/parser.js +304 -0
- package/dist/cjs/parser.js.map +1 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/index.js +6 -4
- package/dist/esm/parser.js +267 -0
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,YAAY,EACV,UAAU,EACV,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,KAAK,EACL,YAAY,GACb,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAG3D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC3F,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGrD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACnE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAK3C,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAA;AAEzD,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC9B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,WAAW,CAAA;IAClB,UAAU,EAAE,aAAa,CAAA;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,GAAG,CACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,SAAS,CAAC,CAgBpB"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MemoryLearningStore = exports.FileLearningStore = exports.ComboCache = exports.FileCache = exports.MemoryCache = exports.CapmanEngine = exports.resolve = exports.matchWithLLM = exports.match = exports.generateStarterConfig = exports.validate = exports.readManifest = exports.writeManifest = exports.loadConfig = exports.generate = exports.setLogLevel = void 0;
|
|
3
|
+
exports.parseOpenAPI = exports.MemoryLearningStore = exports.FileLearningStore = exports.normalizeQuery = exports.buildCacheKey = exports.ComboCache = exports.FileCache = exports.MemoryCache = exports.CapmanEngine = exports.resolve = exports.matchWithLLM = exports.match = exports.generateStarterConfig = exports.validate = exports.readManifest = exports.writeManifest = exports.loadConfig = exports.generate = exports.setLogLevel = void 0;
|
|
4
4
|
exports.ask = ask;
|
|
5
5
|
var logger_1 = require("./logger");
|
|
6
6
|
Object.defineProperty(exports, "setLogLevel", { enumerable: true, get: function () { return logger_1.setLogLevel; } });
|
|
7
|
-
const engine_1 = require("./engine");
|
|
8
7
|
var generator_1 = require("./generator");
|
|
9
8
|
Object.defineProperty(exports, "generate", { enumerable: true, get: function () { return generator_1.generate; } });
|
|
10
9
|
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return generator_1.loadConfig; } });
|
|
@@ -18,31 +17,37 @@ Object.defineProperty(exports, "matchWithLLM", { enumerable: true, get: function
|
|
|
18
17
|
var resolver_1 = require("./resolver");
|
|
19
18
|
Object.defineProperty(exports, "resolve", { enumerable: true, get: function () { return resolver_1.resolve; } });
|
|
20
19
|
// ─── Engine (recommended API) ─────────────────────────────────────────────────
|
|
21
|
-
var
|
|
22
|
-
Object.defineProperty(exports, "CapmanEngine", { enumerable: true, get: function () { return
|
|
20
|
+
var engine_1 = require("./engine");
|
|
21
|
+
Object.defineProperty(exports, "CapmanEngine", { enumerable: true, get: function () { return engine_1.CapmanEngine; } });
|
|
23
22
|
// ─── Cache ────────────────────────────────────────────────────────────────────
|
|
24
23
|
var cache_1 = require("./cache");
|
|
25
24
|
Object.defineProperty(exports, "MemoryCache", { enumerable: true, get: function () { return cache_1.MemoryCache; } });
|
|
26
25
|
Object.defineProperty(exports, "FileCache", { enumerable: true, get: function () { return cache_1.FileCache; } });
|
|
27
26
|
Object.defineProperty(exports, "ComboCache", { enumerable: true, get: function () { return cache_1.ComboCache; } });
|
|
27
|
+
Object.defineProperty(exports, "buildCacheKey", { enumerable: true, get: function () { return cache_1.buildCacheKey; } });
|
|
28
|
+
Object.defineProperty(exports, "normalizeQuery", { enumerable: true, get: function () { return cache_1.normalizeQuery; } });
|
|
28
29
|
// ─── Learning ─────────────────────────────────────────────────────────────────
|
|
29
30
|
var learning_1 = require("./learning");
|
|
30
31
|
Object.defineProperty(exports, "FileLearningStore", { enumerable: true, get: function () { return learning_1.FileLearningStore; } });
|
|
31
32
|
Object.defineProperty(exports, "MemoryLearningStore", { enumerable: true, get: function () { return learning_1.MemoryLearningStore; } });
|
|
33
|
+
var parser_1 = require("./parser");
|
|
34
|
+
Object.defineProperty(exports, "parseOpenAPI", { enumerable: true, get: function () { return parser_1.parseOpenAPI; } });
|
|
35
|
+
// ─── Convenience: ask() ───────────────────────────────────────────────────────
|
|
36
|
+
const engine_2 = require("./engine");
|
|
32
37
|
/**
|
|
33
38
|
* One-shot convenience: match + resolve in a single call.
|
|
34
39
|
* Delegates to CapmanEngine internally.
|
|
35
40
|
*
|
|
41
|
+
* @deprecated For full features including trace and caching, use CapmanEngine directly.
|
|
42
|
+
*
|
|
36
43
|
* @example
|
|
37
44
|
* const result = await ask("show me the dashboard", manifest, {
|
|
38
45
|
* baseUrl: 'https://api.your-app.com',
|
|
39
46
|
* })
|
|
40
|
-
*
|
|
41
|
-
* @deprecated For full features including trace and caching, use CapmanEngine directly.
|
|
42
47
|
*/
|
|
43
48
|
async function ask(query, manifest, options = {}) {
|
|
44
49
|
const { llm, mode, ...resolveOptions } = options;
|
|
45
|
-
const engine = new
|
|
50
|
+
const engine = new engine_2.CapmanEngine({
|
|
46
51
|
manifest,
|
|
47
52
|
llm,
|
|
48
53
|
mode,
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AA8FA,kBAoBC;AAlHD,mCAAsC;AAA7B,qGAAA,WAAW,OAAA;AAwBpB,yCAOoB;AANlB,qGAAA,QAAQ,OAAA;AACR,uGAAA,UAAU,OAAA;AACV,0GAAA,aAAa,OAAA;AACb,yGAAA,YAAY,OAAA;AACZ,qGAAA,QAAQ,OAAA;AACR,kHAAA,qBAAqB,OAAA;AAGvB,qCAGkB;AAFhB,gGAAA,KAAK,OAAA;AACL,uGAAA,YAAY,OAAA;AAId,uCAAoC;AAA3B,mGAAA,OAAO,OAAA;AAGhB,iFAAiF;AACjF,mCAAuC;AAA9B,sGAAA,YAAY,OAAA;AAGrB,iFAAiF;AACjF,iCAA2F;AAAlF,oGAAA,WAAW,OAAA;AAAE,kGAAA,SAAS,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,sGAAA,aAAa,OAAA;AAAE,uGAAA,cAAc,OAAA;AAG1E,iFAAiF;AACjF,uCAAmE;AAA1D,6GAAA,iBAAiB,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAG/C,mCAAuC;AAA9B,sGAAA,YAAY,OAAA;AAGrB,iFAAiF;AAEjF,qCAAuC;AAwBvC;;;;;;;;;;GAUG;AACI,KAAK,UAAU,GAAG,CACvB,KAAa,EACb,QAAkB,EAClB,UAAsB,EAAE;IAExB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAA;IAEhD,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC;QAC9B,QAAQ;QACR,GAAG;QACH,IAAI;QACJ,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,IAAI,EAAE,cAAc,CAAC,IAAI;QACzB,OAAO,EAAE,cAAc,CAAC,OAAO;KAChC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;IACtD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAA;AAC/D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CapmanConfig } from './types';
|
|
2
|
+
export interface ParseResult {
|
|
3
|
+
config: CapmanConfig;
|
|
4
|
+
stats: {
|
|
5
|
+
total: number;
|
|
6
|
+
skipped: number;
|
|
7
|
+
warnings: string[];
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function parseOpenAPI(specPathOrUrl: string): Promise<ParseResult>;
|
|
11
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAA2C,MAAM,SAAS,CAAA;AAmEpF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAK,YAAY,CAAA;IACvB,KAAK,EAAE;QACL,KAAK,EAAK,MAAM,CAAA;QAChB,OAAO,EAAG,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;KACnB,CAAA;CACF;AAED,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,CAGtB"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseOpenAPI = parseOpenAPI;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("./logger");
|
|
40
|
+
async function parseOpenAPI(specPathOrUrl) {
|
|
41
|
+
const spec = await loadSpec(specPathOrUrl);
|
|
42
|
+
return convertSpec(spec);
|
|
43
|
+
}
|
|
44
|
+
// ─── Load spec from file or URL ───────────────────────────────────────────────
|
|
45
|
+
async function loadSpec(source) {
|
|
46
|
+
// URL
|
|
47
|
+
if (source.startsWith('http://') || source.startsWith('https://')) {
|
|
48
|
+
logger_1.logger.info(`Fetching OpenAPI spec from: ${source}`);
|
|
49
|
+
const res = await fetch(source);
|
|
50
|
+
if (!res.ok)
|
|
51
|
+
throw new Error(`Failed to fetch spec: ${res.status} ${res.statusText}`);
|
|
52
|
+
const text = await res.text();
|
|
53
|
+
return parseSpecText(text, source);
|
|
54
|
+
}
|
|
55
|
+
// Local file
|
|
56
|
+
const resolved = path.resolve(process.cwd(), source);
|
|
57
|
+
if (!fs.existsSync(resolved)) {
|
|
58
|
+
throw new Error(`Spec file not found: ${resolved}`);
|
|
59
|
+
}
|
|
60
|
+
logger_1.logger.info(`Reading OpenAPI spec from: ${resolved}`);
|
|
61
|
+
const text = fs.readFileSync(resolved, 'utf-8');
|
|
62
|
+
return parseSpecText(text, source);
|
|
63
|
+
}
|
|
64
|
+
function parseSpecText(text, source) {
|
|
65
|
+
// Try JSON first
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(text);
|
|
68
|
+
}
|
|
69
|
+
catch { }
|
|
70
|
+
// Try YAML — only if yaml package available
|
|
71
|
+
try {
|
|
72
|
+
const yaml = require('js-yaml');
|
|
73
|
+
return yaml.load(text);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// js-yaml not installed — try basic YAML detection
|
|
77
|
+
if (source.endsWith('.yaml') || source.endsWith('.yml')) {
|
|
78
|
+
throw new Error('YAML spec detected but js-yaml is not installed.\n' +
|
|
79
|
+
'Install it: npm install js-yaml\n' +
|
|
80
|
+
'Or convert your spec to JSON first.');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
throw new Error('Could not parse spec — must be valid JSON or YAML');
|
|
84
|
+
}
|
|
85
|
+
// ─── Convert OpenAPI spec to CapmanConfig ─────────────────────────────────────
|
|
86
|
+
function convertSpec(spec) {
|
|
87
|
+
const warnings = [];
|
|
88
|
+
const capabilities = [];
|
|
89
|
+
let skipped = 0;
|
|
90
|
+
// Determine base URL
|
|
91
|
+
const baseUrl = extractBaseUrl(spec);
|
|
92
|
+
// Detect global security schemes
|
|
93
|
+
const securitySchemes = spec.components?.securitySchemes
|
|
94
|
+
?? spec.securityDefinitions
|
|
95
|
+
?? {};
|
|
96
|
+
const hasGlobalAuth = Object.keys(securitySchemes).some(k => {
|
|
97
|
+
const s = securitySchemes[k];
|
|
98
|
+
return s.type === 'http' || s.type === 'apiKey' || s.type === 'oauth2';
|
|
99
|
+
});
|
|
100
|
+
// Convert each path + method
|
|
101
|
+
for (const [urlPath, pathItem] of Object.entries(spec.paths ?? {})) {
|
|
102
|
+
const methods = [];
|
|
103
|
+
if (pathItem.get)
|
|
104
|
+
methods.push(['GET', pathItem.get]);
|
|
105
|
+
if (pathItem.post)
|
|
106
|
+
methods.push(['POST', pathItem.post]);
|
|
107
|
+
if (pathItem.put)
|
|
108
|
+
methods.push(['PUT', pathItem.put]);
|
|
109
|
+
if (pathItem.patch)
|
|
110
|
+
methods.push(['PATCH', pathItem.patch]);
|
|
111
|
+
if (pathItem.delete)
|
|
112
|
+
methods.push(['DELETE', pathItem.delete]);
|
|
113
|
+
for (const [method, op] of methods) {
|
|
114
|
+
const result = convertOperation(urlPath, method, op, hasGlobalAuth, securitySchemes);
|
|
115
|
+
if (!result) {
|
|
116
|
+
skipped++;
|
|
117
|
+
warnings.push(`Skipped ${method} ${urlPath} — no useful info to generate capability`);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// Check for duplicate IDs
|
|
121
|
+
const existing = capabilities.find(c => c.id === result.id);
|
|
122
|
+
if (existing) {
|
|
123
|
+
result.id = `${result.id}_${method.toLowerCase()}`;
|
|
124
|
+
warnings.push(`Duplicate ID resolved: ${result.id}`);
|
|
125
|
+
}
|
|
126
|
+
capabilities.push(result);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const config = {
|
|
130
|
+
app: sanitizeAppName(spec.info.title),
|
|
131
|
+
baseUrl,
|
|
132
|
+
capabilities,
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
config,
|
|
136
|
+
stats: {
|
|
137
|
+
total: capabilities.length,
|
|
138
|
+
skipped,
|
|
139
|
+
warnings,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// ─── Convert single operation ─────────────────────────────────────────────────
|
|
144
|
+
function convertOperation(urlPath, method, op, hasGlobalAuth, securitySchemes) {
|
|
145
|
+
// Build capability ID
|
|
146
|
+
const id = op.operationId
|
|
147
|
+
? toSnakeCase(op.operationId)
|
|
148
|
+
: pathToId(method, urlPath);
|
|
149
|
+
// Name and description
|
|
150
|
+
const name = op.summary ?? toHumanName(id);
|
|
151
|
+
const description = op.description ?? op.summary ?? `${method} ${urlPath}`;
|
|
152
|
+
if (description.length < 5)
|
|
153
|
+
return null;
|
|
154
|
+
// Extract params
|
|
155
|
+
const params = extractParams(op);
|
|
156
|
+
// Determine privacy scope
|
|
157
|
+
const privacyLevel = inferPrivacy(op, hasGlobalAuth, securitySchemes);
|
|
158
|
+
// Build examples from path pattern
|
|
159
|
+
const examples = generateExamples(name, description, params);
|
|
160
|
+
// Build returns from response descriptions
|
|
161
|
+
const returns = inferReturns(op, urlPath);
|
|
162
|
+
return {
|
|
163
|
+
id,
|
|
164
|
+
name,
|
|
165
|
+
description,
|
|
166
|
+
examples,
|
|
167
|
+
params,
|
|
168
|
+
returns,
|
|
169
|
+
resolver: {
|
|
170
|
+
type: 'api',
|
|
171
|
+
endpoints: [{ method, path: urlPath }],
|
|
172
|
+
},
|
|
173
|
+
privacy: { level: privacyLevel },
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// ─── Extract params from operation ───────────────────────────────────────────
|
|
177
|
+
function extractParams(op) {
|
|
178
|
+
const params = [];
|
|
179
|
+
// Path and query params
|
|
180
|
+
for (const p of op.parameters ?? []) {
|
|
181
|
+
if (p.in === 'header' || p.in === 'cookie')
|
|
182
|
+
continue;
|
|
183
|
+
const source = p.in === 'path' ? 'user_query' :
|
|
184
|
+
p.in === 'query' ? 'user_query' :
|
|
185
|
+
'context';
|
|
186
|
+
params.push({
|
|
187
|
+
name: toSnakeCase(p.name),
|
|
188
|
+
description: p.description ?? toHumanName(p.name),
|
|
189
|
+
required: p.required ?? p.in === 'path',
|
|
190
|
+
source,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// Request body fields (POST/PUT/PATCH)
|
|
194
|
+
const bodyContent = op.requestBody?.content;
|
|
195
|
+
if (bodyContent) {
|
|
196
|
+
const schema = (bodyContent['application/json']?.schema ??
|
|
197
|
+
bodyContent['*/*']?.schema);
|
|
198
|
+
if (schema?.properties) {
|
|
199
|
+
const required = schema.required ?? [];
|
|
200
|
+
for (const [fieldName, field] of Object.entries(schema.properties)) {
|
|
201
|
+
// Skip if already added as a path param
|
|
202
|
+
if (params.find(p => p.name === toSnakeCase(fieldName)))
|
|
203
|
+
continue;
|
|
204
|
+
params.push({
|
|
205
|
+
name: toSnakeCase(fieldName),
|
|
206
|
+
description: field.description ?? toHumanName(fieldName),
|
|
207
|
+
required: required.includes(fieldName),
|
|
208
|
+
source: 'user_query',
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return params;
|
|
214
|
+
}
|
|
215
|
+
// ─── Infer privacy scope ──────────────────────────────────────────────────────
|
|
216
|
+
function inferPrivacy(op, hasGlobalAuth, securitySchemes) {
|
|
217
|
+
// Explicitly no security on this operation
|
|
218
|
+
if (op.security !== undefined && op.security.length === 0)
|
|
219
|
+
return 'public';
|
|
220
|
+
// Check operation tags for admin hints
|
|
221
|
+
const tags = (op.tags ?? []).map(t => t.toLowerCase());
|
|
222
|
+
if (tags.some(t => t.includes('admin') || t.includes('internal')))
|
|
223
|
+
return 'admin';
|
|
224
|
+
// Check operation ID / summary for admin hints
|
|
225
|
+
const hint = `${op.operationId ?? ''} ${op.summary ?? ''}`.toLowerCase();
|
|
226
|
+
if (hint.includes('admin') || hint.includes('manage') || hint.includes('internal')) {
|
|
227
|
+
return 'admin';
|
|
228
|
+
}
|
|
229
|
+
// If global auth exists or operation has security, it's user_owned
|
|
230
|
+
if (hasGlobalAuth || (op.security && op.security.length > 0)) {
|
|
231
|
+
return 'user_owned';
|
|
232
|
+
}
|
|
233
|
+
return 'public';
|
|
234
|
+
}
|
|
235
|
+
// ─── Generate examples ────────────────────────────────────────────────────────
|
|
236
|
+
function generateExamples(name, description, params) {
|
|
237
|
+
const examples = [];
|
|
238
|
+
// Primary example from name
|
|
239
|
+
examples.push(name);
|
|
240
|
+
// Variation from description (first sentence, truncated)
|
|
241
|
+
const firstSentence = description.split(/[.!?]/)[0].trim();
|
|
242
|
+
if (firstSentence && firstSentence !== name && firstSentence.length < 80) {
|
|
243
|
+
examples.push(firstSentence);
|
|
244
|
+
}
|
|
245
|
+
// Param-based example
|
|
246
|
+
const required = params.filter(p => p.required && p.source === 'user_query');
|
|
247
|
+
if (required.length > 0) {
|
|
248
|
+
const paramNames = required.map(p => p.name.replace(/_/g, ' ')).join(' and ');
|
|
249
|
+
examples.push(`${name} by ${paramNames}`);
|
|
250
|
+
}
|
|
251
|
+
return examples.slice(0, 3);
|
|
252
|
+
}
|
|
253
|
+
// ─── Infer returns ────────────────────────────────────────────────────────────
|
|
254
|
+
function inferReturns(op, urlPath) {
|
|
255
|
+
const segments = urlPath.split('/').filter(Boolean);
|
|
256
|
+
const resource = segments
|
|
257
|
+
.filter(s => !s.startsWith('{'))
|
|
258
|
+
.pop() ?? 'data';
|
|
259
|
+
return [resource.replace(/-/g, '_')];
|
|
260
|
+
}
|
|
261
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
262
|
+
function extractBaseUrl(spec) {
|
|
263
|
+
// OpenAPI 3.x
|
|
264
|
+
if (spec.servers?.length) {
|
|
265
|
+
return spec.servers[0].url.replace(/\/$/, '');
|
|
266
|
+
}
|
|
267
|
+
// Swagger 2.x
|
|
268
|
+
if (spec.host) {
|
|
269
|
+
const scheme = 'https';
|
|
270
|
+
const base = spec.basePath ?? '';
|
|
271
|
+
return `${scheme}://${spec.host}${base}`.replace(/\/$/, '');
|
|
272
|
+
}
|
|
273
|
+
return 'https://api.your-app.com';
|
|
274
|
+
}
|
|
275
|
+
function sanitizeAppName(title) {
|
|
276
|
+
return title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
277
|
+
}
|
|
278
|
+
function toSnakeCase(str) {
|
|
279
|
+
return str
|
|
280
|
+
.replace(/([A-Z])/g, '_$1')
|
|
281
|
+
.replace(/[-\s]+/g, '_')
|
|
282
|
+
.toLowerCase()
|
|
283
|
+
.replace(/^_/, '')
|
|
284
|
+
.replace(/__+/g, '_');
|
|
285
|
+
}
|
|
286
|
+
function toHumanName(id) {
|
|
287
|
+
return id
|
|
288
|
+
.replace(/_/g, ' ')
|
|
289
|
+
.replace(/\b\w/g, c => c.toUpperCase());
|
|
290
|
+
}
|
|
291
|
+
function pathToId(method, urlPath) {
|
|
292
|
+
const segments = urlPath
|
|
293
|
+
.split('/')
|
|
294
|
+
.filter(Boolean)
|
|
295
|
+
.map(s => s.startsWith('{') ? s.slice(1, -1) : s)
|
|
296
|
+
.join('_');
|
|
297
|
+
const prefix = method === 'GET' ? 'get' :
|
|
298
|
+
method === 'POST' ? 'create' :
|
|
299
|
+
method === 'PUT' ? 'update' :
|
|
300
|
+
method === 'PATCH' ? 'update' :
|
|
301
|
+
method === 'DELETE' ? 'delete' : 'call';
|
|
302
|
+
return toSnakeCase(`${prefix}_${segments}`);
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.4.
|
|
1
|
+
export declare const VERSION = "0.4.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cjs/version.js
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
export { setLogLevel } from './logger';
|
|
2
|
-
import { CapmanEngine } from './engine';
|
|
3
2
|
export { generate, loadConfig, writeManifest, readManifest, validate, generateStarterConfig, } from './generator';
|
|
4
3
|
export { match, matchWithLLM, } from './matcher';
|
|
5
4
|
export { resolve } from './resolver';
|
|
6
5
|
// ─── Engine (recommended API) ─────────────────────────────────────────────────
|
|
7
6
|
export { CapmanEngine } from './engine';
|
|
8
7
|
// ─── Cache ────────────────────────────────────────────────────────────────────
|
|
9
|
-
export { MemoryCache, FileCache, ComboCache } from './cache';
|
|
8
|
+
export { MemoryCache, FileCache, ComboCache, buildCacheKey, normalizeQuery } from './cache';
|
|
10
9
|
// ─── Learning ─────────────────────────────────────────────────────────────────
|
|
11
10
|
export { FileLearningStore, MemoryLearningStore } from './learning';
|
|
11
|
+
export { parseOpenAPI } from './parser';
|
|
12
|
+
// ─── Convenience: ask() ───────────────────────────────────────────────────────
|
|
13
|
+
import { CapmanEngine } from './engine';
|
|
12
14
|
/**
|
|
13
15
|
* One-shot convenience: match + resolve in a single call.
|
|
14
16
|
* Delegates to CapmanEngine internally.
|
|
15
17
|
*
|
|
18
|
+
* @deprecated For full features including trace and caching, use CapmanEngine directly.
|
|
19
|
+
*
|
|
16
20
|
* @example
|
|
17
21
|
* const result = await ask("show me the dashboard", manifest, {
|
|
18
22
|
* baseUrl: 'https://api.your-app.com',
|
|
19
23
|
* })
|
|
20
|
-
*
|
|
21
|
-
* @deprecated For full features including trace and caching, use CapmanEngine directly.
|
|
22
24
|
*/
|
|
23
25
|
export async function ask(query, manifest, options = {}) {
|
|
24
26
|
const { llm, mode, ...resolveOptions } = options;
|