capman 0.5.4 → 0.6.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.
- package/CHANGELOG.md +46 -0
- package/CODEBASE.md +111 -66
- package/README.md +45 -4
- package/bin/lib/cmd-generate.js +200 -40
- package/bin/lib/cmd-help.js +3 -0
- package/dist/cjs/cache.d.ts.map +1 -1
- package/dist/cjs/cache.js +22 -5
- package/dist/cjs/cache.js.map +1 -1
- package/dist/cjs/engine.d.ts +53 -1
- package/dist/cjs/engine.d.ts.map +1 -1
- package/dist/cjs/engine.js +252 -17
- package/dist/cjs/engine.js.map +1 -1
- package/dist/cjs/generator.d.ts.map +1 -1
- package/dist/cjs/generator.js +7 -1
- package/dist/cjs/generator.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/learning.d.ts.map +1 -1
- package/dist/cjs/learning.js +51 -30
- package/dist/cjs/learning.js.map +1 -1
- package/dist/cjs/matcher.d.ts +69 -9
- package/dist/cjs/matcher.d.ts.map +1 -1
- package/dist/cjs/matcher.js +328 -43
- package/dist/cjs/matcher.js.map +1 -1
- package/dist/cjs/parser.d.ts.map +1 -1
- package/dist/cjs/parser.js +15 -8
- package/dist/cjs/parser.js.map +1 -1
- package/dist/cjs/resolver.d.ts +1 -0
- package/dist/cjs/resolver.d.ts.map +1 -1
- package/dist/cjs/resolver.js +16 -5
- package/dist/cjs/resolver.js.map +1 -1
- package/dist/cjs/schema.d.ts +64 -46
- package/dist/cjs/schema.d.ts.map +1 -1
- package/dist/cjs/schema.js +2 -1
- package/dist/cjs/schema.js.map +1 -1
- package/dist/cjs/types.d.ts +8 -2
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/cache.js +22 -5
- package/dist/esm/engine.d.ts +53 -1
- package/dist/esm/engine.js +255 -20
- package/dist/esm/generator.js +7 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/learning.js +52 -31
- package/dist/esm/matcher.d.ts +69 -9
- package/dist/esm/matcher.js +321 -42
- package/dist/esm/parser.js +15 -8
- package/dist/esm/resolver.d.ts +1 -0
- package/dist/esm/resolver.js +16 -6
- package/dist/esm/schema.d.ts +64 -46
- package/dist/esm/schema.js +2 -1
- package/dist/esm/types.d.ts +8 -2
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
package/bin/lib/cmd-generate.js
CHANGED
|
@@ -66,77 +66,196 @@ Rules:
|
|
|
66
66
|
- Respond ONLY with the raw JSON object — no markdown, no explanation`
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
// ─── Example enrichment ───────────────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
function buildEnrichPrompt(capabilities) {
|
|
72
|
+
const caps = capabilities
|
|
73
|
+
.filter(c => (c.examples?.length ?? 0) < 20)
|
|
74
|
+
.map(c => ({
|
|
75
|
+
id: c.id,
|
|
76
|
+
name: c.name,
|
|
77
|
+
desc: c.description,
|
|
78
|
+
existing: c.examples ?? [],
|
|
79
|
+
}))
|
|
80
|
+
|
|
81
|
+
if (caps.length === 0) return null
|
|
82
|
+
|
|
83
|
+
return `You are helping improve an AI agent capability manifest.
|
|
84
|
+
For each capability below, generate 20 natural language phrasings a user might say to invoke it.
|
|
85
|
+
Phrasings must be DIFFERENT from the existing examples listed.
|
|
86
|
+
Return ONLY a JSON object mapping capability id to an array of new phrasings. No explanation.
|
|
87
|
+
|
|
88
|
+
Capabilities:
|
|
89
|
+
${JSON.stringify(caps, null, 2)}
|
|
90
|
+
|
|
91
|
+
Respond with ONLY this structure:
|
|
92
|
+
{
|
|
93
|
+
"<capability_id>": ["phrasing 1", "phrasing 2", ...],
|
|
94
|
+
...
|
|
95
|
+
}`
|
|
96
|
+
}
|
|
97
|
+
|
|
69
98
|
// ─── LLM caller ───────────────────────────────────────────────────────────────
|
|
70
99
|
|
|
71
|
-
async function callLLM(provider, apiKey, prompt) {
|
|
100
|
+
async function callLLM(provider, apiKey, prompt, maxTokens) {
|
|
72
101
|
if (provider === 'anthropic') {
|
|
73
|
-
const res
|
|
102
|
+
const res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
74
103
|
method: 'POST',
|
|
75
104
|
headers: {
|
|
76
|
-
'Content-Type':
|
|
77
|
-
'x-api-key':
|
|
105
|
+
'Content-Type': 'application/json',
|
|
106
|
+
'x-api-key': apiKey,
|
|
78
107
|
'anthropic-version': '2023-06-01',
|
|
79
108
|
},
|
|
80
109
|
body: JSON.stringify({
|
|
81
|
-
model:
|
|
82
|
-
max_tokens: 4000,
|
|
83
|
-
messages:
|
|
110
|
+
model: 'claude-sonnet-4-20250514',
|
|
111
|
+
max_tokens: maxTokens ?? 4000,
|
|
112
|
+
messages: [{ role: 'user', content: prompt }],
|
|
113
|
+
}),
|
|
114
|
+
})
|
|
115
|
+
const text = await res.text()
|
|
116
|
+
if (!res.ok) {
|
|
117
|
+
let msg = res.statusText
|
|
118
|
+
try { msg = JSON.parse(text).error?.message ?? msg } catch {}
|
|
119
|
+
throw new Error(`Anthropic API error: ${msg}`)
|
|
120
|
+
}
|
|
121
|
+
return JSON.parse(text).content[0].text
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (provider === 'groq') {
|
|
125
|
+
const res = await fetch('https://api.groq.com/openai/v1/chat/completions', {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: {
|
|
128
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
129
|
+
'Content-Type': 'application/json',
|
|
130
|
+
},
|
|
131
|
+
body: JSON.stringify({
|
|
132
|
+
model: 'llama-3.3-70b-versatile',
|
|
133
|
+
max_tokens: maxTokens ?? 4096,
|
|
134
|
+
messages: [{ role: 'user', content: prompt }],
|
|
84
135
|
}),
|
|
85
136
|
})
|
|
86
|
-
const
|
|
87
|
-
if (!res.ok)
|
|
88
|
-
|
|
137
|
+
const text = await res.text()
|
|
138
|
+
if (!res.ok) {
|
|
139
|
+
let msg = res.statusText
|
|
140
|
+
try { msg = JSON.parse(text).error?.message ?? msg } catch {}
|
|
141
|
+
throw new Error(`Groq API error: ${msg}`)
|
|
142
|
+
}
|
|
143
|
+
return JSON.parse(text).choices[0].message.content
|
|
89
144
|
}
|
|
90
145
|
|
|
91
146
|
if (provider === 'openai') {
|
|
92
|
-
const res
|
|
147
|
+
const res = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
93
148
|
method: 'POST',
|
|
94
149
|
headers: {
|
|
95
|
-
'Content-Type':
|
|
150
|
+
'Content-Type': 'application/json',
|
|
96
151
|
'Authorization': `Bearer ${apiKey}`,
|
|
97
152
|
},
|
|
98
153
|
body: JSON.stringify({
|
|
99
|
-
model:
|
|
100
|
-
max_tokens: 4000,
|
|
101
|
-
messages:
|
|
154
|
+
model: 'gpt-4o-mini',
|
|
155
|
+
max_tokens: maxTokens ?? 4000,
|
|
156
|
+
messages: [{ role: 'user', content: prompt }],
|
|
102
157
|
}),
|
|
103
158
|
})
|
|
104
|
-
const
|
|
105
|
-
if (!res.ok)
|
|
106
|
-
|
|
159
|
+
const text = await res.text()
|
|
160
|
+
if (!res.ok) {
|
|
161
|
+
let msg = res.statusText
|
|
162
|
+
try { msg = JSON.parse(text).error?.message ?? msg } catch {}
|
|
163
|
+
throw new Error(`OpenAI API error: ${msg}`)
|
|
164
|
+
}
|
|
165
|
+
return JSON.parse(text).choices[0].message.content
|
|
107
166
|
}
|
|
108
167
|
|
|
109
168
|
if (provider === 'openrouter') {
|
|
110
|
-
const res
|
|
169
|
+
const res = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
111
170
|
method: 'POST',
|
|
112
171
|
headers: {
|
|
113
|
-
'Content-Type':
|
|
172
|
+
'Content-Type': 'application/json',
|
|
114
173
|
'Authorization': `Bearer ${apiKey}`,
|
|
115
|
-
'HTTP-Referer':
|
|
174
|
+
'HTTP-Referer': 'https://github.com/Hobbydefiningdoctory/capman',
|
|
116
175
|
},
|
|
117
176
|
body: JSON.stringify({
|
|
118
|
-
model:
|
|
119
|
-
max_tokens: 4000,
|
|
120
|
-
messages:
|
|
121
|
-
provider:
|
|
177
|
+
model: 'openai/gpt-oss-120b:free',
|
|
178
|
+
max_tokens: maxTokens ?? 4000,
|
|
179
|
+
messages: [{ role: 'user', content: prompt }],
|
|
180
|
+
provider: { order: ['open-inference'], allow_fallbacks: true },
|
|
122
181
|
}),
|
|
123
182
|
})
|
|
124
|
-
const
|
|
125
|
-
if (!res.ok)
|
|
126
|
-
|
|
183
|
+
const text = await res.text()
|
|
184
|
+
if (!res.ok) {
|
|
185
|
+
let msg = res.statusText
|
|
186
|
+
try { msg = JSON.parse(text).error?.message ?? msg } catch {}
|
|
187
|
+
throw new Error(`OpenRouter API error: ${msg}`)
|
|
188
|
+
}
|
|
189
|
+
return JSON.parse(text).choices[0].message.content
|
|
127
190
|
}
|
|
128
191
|
|
|
129
192
|
throw new Error(`Unknown provider: ${provider}`)
|
|
130
193
|
}
|
|
131
194
|
|
|
195
|
+
async function enrichExamples(config, apiKey, provider) {
|
|
196
|
+
const prompt = buildEnrichPrompt(config.capabilities)
|
|
197
|
+
if (!prompt) {
|
|
198
|
+
log.info('All capabilities already have ≥ 20 examples — nothing to enrich')
|
|
199
|
+
return config
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
log.info(`Enriching examples for ${config.capabilities.filter(c => (c.examples?.length ?? 0) < 20).length} capabilities...`)
|
|
203
|
+
|
|
204
|
+
let raw
|
|
205
|
+
try {
|
|
206
|
+
raw = await callLLM(provider, apiKey, prompt, 4096)
|
|
207
|
+
} catch (e) {
|
|
208
|
+
log.warn(`LLM call failed during enrichment: ${e.message}`)
|
|
209
|
+
return config
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
let parsed
|
|
213
|
+
try {
|
|
214
|
+
// Strip any markdown code fences, then try direct parse.
|
|
215
|
+
// If that fails, extract the first top-level {...} block (handles preamble/postamble).
|
|
216
|
+
const stripped = raw.replace(/```[\w]*\n?/g, '').trim()
|
|
217
|
+
let jsonStr = stripped
|
|
218
|
+
if (!jsonStr.startsWith('{')) {
|
|
219
|
+
const start = stripped.indexOf('{')
|
|
220
|
+
const end = stripped.lastIndexOf('}')
|
|
221
|
+
if (start !== -1 && end !== -1 && end > start) jsonStr = stripped.slice(start, end + 1)
|
|
222
|
+
}
|
|
223
|
+
parsed = JSON.parse(jsonStr)
|
|
224
|
+
} catch {
|
|
225
|
+
log.warn('Could not parse LLM enrichment response — skipping enrichment')
|
|
226
|
+
return config
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
let totalAdded = 0
|
|
230
|
+
const enrichedCapabilities = config.capabilities.map(cap => {
|
|
231
|
+
const newPhrasings = parsed[cap.id]
|
|
232
|
+
if (!Array.isArray(newPhrasings) || newPhrasings.length === 0) return cap
|
|
233
|
+
|
|
234
|
+
const existing = new Set((cap.examples ?? []).map(e => e.toLowerCase().trim()))
|
|
235
|
+
const unique = newPhrasings
|
|
236
|
+
.filter(p => typeof p === 'string' && p.trim().length > 0)
|
|
237
|
+
.filter(p => !existing.has(p.toLowerCase().trim()))
|
|
238
|
+
.slice(0, 20)
|
|
239
|
+
|
|
240
|
+
if (unique.length === 0) return cap
|
|
241
|
+
|
|
242
|
+
totalAdded += unique.length
|
|
243
|
+
return { ...cap, examples: [...(cap.examples ?? []), ...unique] }
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
log.success(`Added ${totalAdded} new phrasings across ${config.capabilities.length} capabilities`)
|
|
247
|
+
return { ...config, capabilities: enrichedCapabilities }
|
|
248
|
+
}
|
|
249
|
+
|
|
132
250
|
// ─── Command ──────────────────────────────────────────────────────────────────
|
|
133
251
|
|
|
134
252
|
module.exports = async function cmdGenerate() {
|
|
135
253
|
header()
|
|
136
254
|
const { generate, loadConfig, writeManifest, validate, parseOpenAPI } = requireSrc()
|
|
137
255
|
|
|
138
|
-
const fromFlag
|
|
139
|
-
const aiFlag
|
|
256
|
+
const fromFlag = getFlag('--from')
|
|
257
|
+
const aiFlag = flags.includes('--ai')
|
|
258
|
+
const enrichFlag = flags.includes('--enrich-examples')
|
|
140
259
|
const cwd = process.cwd()
|
|
141
260
|
const outPath = safeOutputPath(getFlag('--out') ?? 'manifest.json', cwd)
|
|
142
261
|
const configOut = safeOutputPath(getFlag('--config-out') ?? 'capman.config.js', cwd)
|
|
@@ -153,7 +272,7 @@ const fromFlag = getFlag('--from')
|
|
|
153
272
|
process.exit(1)
|
|
154
273
|
}
|
|
155
274
|
|
|
156
|
-
|
|
275
|
+
let { config, stats } = result
|
|
157
276
|
|
|
158
277
|
log.success(`Parsed ${stats.total} capabilities from spec`)
|
|
159
278
|
if (stats.skipped > 0) log.info(`Skipped ${stats.skipped} operations (insufficient info)`)
|
|
@@ -165,7 +284,19 @@ const fromFlag = getFlag('--from')
|
|
|
165
284
|
module.exports = ${JSON.stringify(config, null, 2)}
|
|
166
285
|
`
|
|
167
286
|
fs.writeFileSync(configOut, configContent)
|
|
168
|
-
|
|
287
|
+
// Enrich examples if requested
|
|
288
|
+
if (enrichFlag) {
|
|
289
|
+
const apiKey = process.env.ANTHROPIC_API_KEY?.trim() || process.env.GROQ_API_KEY?.trim() || process.env.OPENAI_API_KEY?.trim() || process.env.OPENROUTER_API_KEY?.trim() || null
|
|
290
|
+
const provider = process.env.ANTHROPIC_API_KEY?.trim() ? 'anthropic' : process.env.GROQ_API_KEY?.trim() ? 'groq' : process.env.OPENAI_API_KEY?.trim() ? 'openai' : process.env.OPENROUTER_API_KEY?.trim() ? 'openrouter' : null
|
|
291
|
+
if (!apiKey || !provider) {
|
|
292
|
+
log.warn('--enrich-examples requires an LLM API key — skipping enrichment')
|
|
293
|
+
} else {
|
|
294
|
+
config = await enrichExamples(config, apiKey, provider)
|
|
295
|
+
fs.writeFileSync(configOut, `// Auto-generated by capman from OpenAPI spec\n// Review and adjust before committing\n\nmodule.exports = ${JSON.stringify(config, null, 2)}\n`)
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
log.success(`Config written to ${configOut}`)
|
|
169
300
|
|
|
170
301
|
try {
|
|
171
302
|
const manifest = generate(config)
|
|
@@ -180,7 +311,8 @@ const fromFlag = getFlag('--from')
|
|
|
180
311
|
console.log(` ${c.gray}Next steps:${c.reset}`)
|
|
181
312
|
console.log(` 1. Review ${c.teal}${configOut}${c.reset} — adjust descriptions and examples`)
|
|
182
313
|
console.log(` 2. Run ${c.teal}npx capman validate${c.reset} to check your manifest`)
|
|
183
|
-
console.log(` 3. Run ${c.teal}npx capman
|
|
314
|
+
console.log(` 3. Run ${c.teal}npx capman generate --enrich-examples${c.reset} to add phrasings ${c.gray}(better matching)${c.reset}`)
|
|
315
|
+
console.log(` 4. Run ${c.teal}npx capman demo${c.reset} to see it in action`)
|
|
184
316
|
console.log()
|
|
185
317
|
return
|
|
186
318
|
}
|
|
@@ -206,15 +338,21 @@ const fromFlag = getFlag('--from')
|
|
|
206
338
|
process.exit(1)
|
|
207
339
|
}
|
|
208
340
|
|
|
209
|
-
const apiKey =
|
|
341
|
+
const apiKey =
|
|
342
|
+
process.env.ANTHROPIC_API_KEY?.trim() ||
|
|
343
|
+
process.env.GROQ_API_KEY?.trim() ||
|
|
344
|
+
process.env.OPENAI_API_KEY?.trim() ||
|
|
345
|
+
process.env.OPENROUTER_API_KEY?.trim() ||
|
|
346
|
+
null
|
|
210
347
|
const provider =
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
348
|
+
process.env.ANTHROPIC_API_KEY?.trim() ? 'anthropic' :
|
|
349
|
+
process.env.GROQ_API_KEY?.trim() ? 'groq' :
|
|
350
|
+
process.env.OPENAI_API_KEY?.trim() ? 'openai' :
|
|
351
|
+
process.env.OPENROUTER_API_KEY?.trim() ? 'openrouter' : null
|
|
214
352
|
|
|
215
353
|
if (!apiKey || !provider) {
|
|
216
354
|
log.error('No LLM API key found.')
|
|
217
|
-
console.log(` Set one of: ${c.teal}ANTHROPIC_API_KEY${c.reset}, ${c.teal}OPENAI_API_KEY${c.reset}, or ${c.teal}OPENROUTER_API_KEY${c.reset}`)
|
|
355
|
+
console.log(` Set one of: ${c.teal}ANTHROPIC_API_KEY${c.reset},${c.teal}GROQ_API_KEY${c.reset}, ${c.teal}OPENAI_API_KEY${c.reset}, or ${c.teal}OPENROUTER_API_KEY${c.reset}`)
|
|
218
356
|
process.exit(1)
|
|
219
357
|
}
|
|
220
358
|
|
|
@@ -239,6 +377,11 @@ const fromFlag = getFlag('--from')
|
|
|
239
377
|
process.exit(1)
|
|
240
378
|
}
|
|
241
379
|
|
|
380
|
+
// Enrich examples if requested
|
|
381
|
+
if (enrichFlag) {
|
|
382
|
+
config = await enrichExamples(config, apiKey, provider)
|
|
383
|
+
}
|
|
384
|
+
|
|
242
385
|
const configContent = `// Auto-generated by capman AI\n// Review before committing\n\nmodule.exports = ${JSON.stringify(config, null, 2)}\n`
|
|
243
386
|
fs.writeFileSync(configOut, configContent)
|
|
244
387
|
log.success(`Config written to ${configOut}`)
|
|
@@ -254,8 +397,9 @@ const fromFlag = getFlag('--from')
|
|
|
254
397
|
|
|
255
398
|
console.log()
|
|
256
399
|
console.log(` ${c.gray}Review ${configOut} — the AI may have missed things.${c.reset}`)
|
|
257
|
-
console.log(` ${c.teal}npx capman validate${c.reset}
|
|
258
|
-
console.log(` ${c.teal}npx capman inspect${c.reset}
|
|
400
|
+
console.log(` ${c.teal}npx capman validate${c.reset} ${c.gray}→ check for errors${c.reset}`)
|
|
401
|
+
console.log(` ${c.teal}npx capman inspect${c.reset} ${c.gray}→ see all capabilities${c.reset}`)
|
|
402
|
+
console.log(` ${c.teal}npx capman generate --enrich-examples${c.reset} ${c.gray}→ add 20 phrasings per capability (better matching)${c.reset}`)
|
|
259
403
|
console.log()
|
|
260
404
|
return
|
|
261
405
|
}
|
|
@@ -290,6 +434,22 @@ const fromFlag = getFlag('--from')
|
|
|
290
434
|
validation.warnings.forEach(w => log.warn(w))
|
|
291
435
|
}
|
|
292
436
|
|
|
437
|
+
// Enrich examples if requested
|
|
438
|
+
if (enrichFlag) {
|
|
439
|
+
const apiKey = process.env.ANTHROPIC_API_KEY?.trim() || process.env.GROQ_API_KEY?.trim() || process.env.OPENAI_API_KEY?.trim() || process.env.OPENROUTER_API_KEY?.trim() || null
|
|
440
|
+
const provider = process.env.ANTHROPIC_API_KEY?.trim() ? 'anthropic' : process.env.GROQ_API_KEY?.trim() ? 'groq' : process.env.OPENAI_API_KEY?.trim() ? 'openai' : process.env.OPENROUTER_API_KEY?.trim() ? 'openrouter' : null
|
|
441
|
+
if (!apiKey || !provider) {
|
|
442
|
+
log.warn('--enrich-examples requires an LLM API key — skipping enrichment')
|
|
443
|
+
} else {
|
|
444
|
+
const enriched = await enrichExamples(config, apiKey, provider)
|
|
445
|
+
if (enriched !== config) {
|
|
446
|
+
const configPath2 = getFlag('--config-out') ?? 'capman.config.js'
|
|
447
|
+
fs.writeFileSync(safeOutputPath(configPath2, cwd), `// Enriched by capman --enrich-examples\n\nmodule.exports = ${JSON.stringify(enriched, null, 2)}\n`)
|
|
448
|
+
manifest = generate(enriched)
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
293
453
|
writeManifest(manifest, outPath)
|
|
294
454
|
log.success(`Manifest written to ${outPath}`)
|
|
295
455
|
log.info(`${manifest.capabilities.length} capabilities registered`)
|
package/bin/lib/cmd-help.js
CHANGED
|
@@ -12,6 +12,7 @@ module.exports = function cmdHelp() {
|
|
|
12
12
|
console.log(` ${c.teal}generate --from <path|url>${c.reset} Generate from OpenAPI/Swagger spec`)
|
|
13
13
|
console.log(` ${c.teal}generate --ai${c.reset} Generate manifest using AI`)
|
|
14
14
|
console.log(` ${c.teal}validate${c.reset} Validate an existing manifest.json`)
|
|
15
|
+
console.log(` ${c.teal}generate --enrich-examples${c.reset} Add 20 phrasings per capability via LLM`)
|
|
15
16
|
console.log(` ${c.teal}inspect${c.reset} Print all capabilities in manifest`)
|
|
16
17
|
console.log(` ${c.teal}demo${c.reset} Run a live demo with sample queries`)
|
|
17
18
|
console.log(` ${c.teal}run "query"${c.reset} Run a query against your manifest`)
|
|
@@ -22,5 +23,7 @@ module.exports = function cmdHelp() {
|
|
|
22
23
|
console.log(` ${c.gray}--config Path to config file (default: capman.config.js)${c.reset}`)
|
|
23
24
|
console.log(` ${c.gray}--out Output path (default: manifest.json)${c.reset}`)
|
|
24
25
|
console.log(` ${c.gray}--manifest Manifest to read (default: manifest.json)${c.reset}`)
|
|
26
|
+
console.log(` ${c.gray} Requires API key. Run after --ai or --from.${c.reset}`)
|
|
27
|
+
console.log(` ${c.gray} Skips caps with ≥ 20 examples already.${c.reset}`)
|
|
25
28
|
console.log()
|
|
26
29
|
}
|
package/dist/cjs/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAK1C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAID,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACxB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAK1C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAID,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACxB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;;;;GAKG;AAEH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAC7C,MAAM,CAQR;AAOD,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,KAAK,CAAgC;IAEvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiB5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAC9B;AAMD,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,SAAS,CAA+C;gBAEpD,QAAQ,SAAuB;IAcvC,OAAO,CAAC,IAAI;YAUE,OAAO;IA+BzB,OAAO,CAAC,IAAI;YAKE,OAAO;IAYf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqB5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAI9B;AAID,qBAAa,UAAW,YAAW,UAAU;IAC3C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,IAAI,CAAW;gBAEX,QAAQ,SAAuB;IAKrC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAY5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;0EACsE;IAChE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAG9B"}
|
package/dist/cjs/cache.js
CHANGED
|
@@ -41,7 +41,12 @@ const path = __importStar(require("path"));
|
|
|
41
41
|
const logger_1 = require("./logger");
|
|
42
42
|
// ─── Normalize query for cache key ────────────────────────────────────────────
|
|
43
43
|
function normalizeQuery(query) {
|
|
44
|
-
return query
|
|
44
|
+
return query
|
|
45
|
+
.toLowerCase()
|
|
46
|
+
.trim()
|
|
47
|
+
.replace(/[^\w\s]/g, '') // strip punctuation — "show orders!" and "show orders" same key
|
|
48
|
+
.replace(/\s+/g, ' ')
|
|
49
|
+
.trim();
|
|
45
50
|
}
|
|
46
51
|
/**
|
|
47
52
|
* Build a smarter cache key based on matched capability + extracted params.
|
|
@@ -119,7 +124,10 @@ class FileCache {
|
|
|
119
124
|
}
|
|
120
125
|
load() {
|
|
121
126
|
if (!this.loadPromise) {
|
|
122
|
-
this.loadPromise = this._doLoad()
|
|
127
|
+
this.loadPromise = this._doLoad().catch(err => {
|
|
128
|
+
this.loadPromise = null; // allow retry on next call
|
|
129
|
+
throw err;
|
|
130
|
+
});
|
|
123
131
|
}
|
|
124
132
|
return this.loadPromise;
|
|
125
133
|
}
|
|
@@ -133,7 +141,12 @@ class FileCache {
|
|
|
133
141
|
// e.g. "Show me articles" and "show me articles" collapse to the same key.
|
|
134
142
|
const normalized = new Map();
|
|
135
143
|
for (const [k, v] of Object.entries(parsed)) {
|
|
136
|
-
|
|
144
|
+
// Structured keys (cap:/query: prefix from buildCacheKey) are already
|
|
145
|
+
// canonical — normalizeQuery strips their colons and equals signs.
|
|
146
|
+
const storeKey = (k.startsWith('cap:') || k.startsWith('query:'))
|
|
147
|
+
? k
|
|
148
|
+
: normalizeQuery(k);
|
|
149
|
+
normalized.set(storeKey, v);
|
|
137
150
|
}
|
|
138
151
|
this.store = normalized;
|
|
139
152
|
logger_1.logger.debug(`File cache loaded: ${this.store.size} entries`);
|
|
@@ -142,8 +155,12 @@ class FileCache {
|
|
|
142
155
|
logger_1.logger.warn(`File cache at ${this.filePath} contained unexpected format — starting fresh`);
|
|
143
156
|
}
|
|
144
157
|
}
|
|
145
|
-
catch {
|
|
146
|
-
|
|
158
|
+
catch (err) {
|
|
159
|
+
const code = err.code;
|
|
160
|
+
if (code !== 'ENOENT') {
|
|
161
|
+
logger_1.logger.warn(`Failed to load file cache from ${this.filePath} (${code ?? 'unknown error'}) — starting fresh`);
|
|
162
|
+
}
|
|
163
|
+
// ENOENT = file doesn't exist yet — expected on first run, no warning needed
|
|
147
164
|
}
|
|
148
165
|
}
|
|
149
166
|
save() {
|
package/dist/cjs/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/engine.d.ts
CHANGED
|
@@ -47,6 +47,10 @@ export interface EngineOptions {
|
|
|
47
47
|
headers?: Record<string, string>;
|
|
48
48
|
/** Confidence threshold for keyword matcher (default: 50) */
|
|
49
49
|
threshold?: number;
|
|
50
|
+
/** BM25 TF saturation parameter (default: 1.5) */
|
|
51
|
+
bm25K1?: number;
|
|
52
|
+
/** BM25 length normalization parameter (default: 0.75) */
|
|
53
|
+
bm25B?: number;
|
|
50
54
|
/**
|
|
51
55
|
* Optional TTL for cache entries in milliseconds.
|
|
52
56
|
* Entries older than this are treated as misses and evicted on read.
|
|
@@ -97,14 +101,35 @@ export interface EngineOptions {
|
|
|
97
101
|
* @default 0.4
|
|
98
102
|
*/
|
|
99
103
|
fuzzyThreshold?: number;
|
|
104
|
+
/**
|
|
105
|
+
* When true, a 'marginal' verdict in balanced/accurate mode triggers a
|
|
106
|
+
* targeted LLM disambiguation between the top-2 candidates.
|
|
107
|
+
* Uses ~200 tokens vs ~4000 for full manifest — 93% cost reduction.
|
|
108
|
+
* Has no effect in cheap mode or when no llm is provided.
|
|
109
|
+
* @default false
|
|
110
|
+
*/
|
|
111
|
+
marginAwareLLM?: boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Override the adaptive margin threshold (0-100 points).
|
|
114
|
+
* When undefined, calibrated automatically from manifest score distribution.
|
|
115
|
+
*/
|
|
116
|
+
adaptiveMarginOverride?: number;
|
|
100
117
|
}
|
|
101
118
|
export interface EngineResult {
|
|
102
119
|
match: MatchResult;
|
|
103
120
|
resolution: ResolveResult;
|
|
104
121
|
resolvedVia: 'cache' | 'keyword' | 'llm';
|
|
105
122
|
durationMs: number;
|
|
106
|
-
/** Full execution trace — always present */
|
|
107
123
|
trace: ExecutionTrace;
|
|
124
|
+
verdict: 'clear' | 'marginal' | 'uncertain';
|
|
125
|
+
margin: number;
|
|
126
|
+
/**
|
|
127
|
+
* Required params that could not be extracted from the query.
|
|
128
|
+
* Only populated when extraction failed AND LLM was not used.
|
|
129
|
+
* When present, the agent should prompt the user for these values.
|
|
130
|
+
* Undefined when all required params were successfully extracted.
|
|
131
|
+
*/
|
|
132
|
+
missingParams?: string[];
|
|
108
133
|
}
|
|
109
134
|
export declare class CapmanEngine {
|
|
110
135
|
/** Maximum allowed query length in characters. Queries exceeding this throw RangeError. */
|
|
@@ -121,6 +146,12 @@ export declare class CapmanEngine {
|
|
|
121
146
|
private cacheTtlMs;
|
|
122
147
|
private fuzzyMatch;
|
|
123
148
|
private fuzzyThreshold;
|
|
149
|
+
private bm25Index;
|
|
150
|
+
private bm25Ceiling;
|
|
151
|
+
private bm25K1;
|
|
152
|
+
private bm25B;
|
|
153
|
+
private marginAwareLLM;
|
|
154
|
+
private adaptiveMargin;
|
|
124
155
|
private maxLLMCallsPerMinute;
|
|
125
156
|
private llmCooldownMs;
|
|
126
157
|
private llmCircuitBreakerThreshold;
|
|
@@ -223,5 +254,26 @@ export declare class CapmanEngine {
|
|
|
223
254
|
private applyLearningBoost;
|
|
224
255
|
private resolveOptions;
|
|
225
256
|
private recordLearning;
|
|
257
|
+
private calibrateBM25Ceiling;
|
|
258
|
+
/**
|
|
259
|
+
* Calibrates the adaptive margin threshold from the manifest's own score
|
|
260
|
+
* distribution. Runs each capability's first example against all other
|
|
261
|
+
* capabilities to find the typical inter-capability score spread.
|
|
262
|
+
* Dense overlapping vocabulary → lower margin (harder to separate).
|
|
263
|
+
* Sparse vocabulary → higher margin (easier to separate).
|
|
264
|
+
*
|
|
265
|
+
* Complexity: O(capabilities²) — runs at constructor time and on loadManifest().
|
|
266
|
+
* For manifests with ≤100 capabilities this is negligible (<10ms).
|
|
267
|
+
* For very large manifests (500+ capabilities), consider passing
|
|
268
|
+
* `adaptiveMarginOverride` to skip calibration.
|
|
269
|
+
*/
|
|
270
|
+
private calibrateAdaptiveMargin;
|
|
271
|
+
private computeVerdict;
|
|
272
|
+
/**
|
|
273
|
+
* Targeted disambiguation between top-2 candidates.
|
|
274
|
+
* Sends ~200 tokens instead of full manifest (~4000 tokens) — 93% cost reduction.
|
|
275
|
+
* Returns updated matchResult with LLM-preferred winner, or original on failure.
|
|
276
|
+
*/
|
|
277
|
+
private disambiguateLLM;
|
|
226
278
|
}
|
|
227
279
|
//# sourceMappingURL=engine.d.ts.map
|
package/dist/cjs/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAa,aAAa,EAA4F,MAAM,SAAS,CAAA;AACvM,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AAK7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAMxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,QAAQ,EAAE,QAAQ,CAAA;IAClB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,kDAAkD;IAClD,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC9B,0FAA0F;IAC1F,KAAK,CAAC,EAAE,UAAU,GAAG,KAAK,CAAA;IAC1B,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,aAAa,GAAG,KAAK,CAAA;IAChC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mDAAmD;IACnD,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAA;IAEnC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAEjC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
|