capman 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,224 @@
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.generate = generate;
37
+ exports.loadConfig = loadConfig;
38
+ exports.writeManifest = writeManifest;
39
+ exports.readManifest = readManifest;
40
+ exports.validate = validate;
41
+ exports.generateStarterConfig = generateStarterConfig;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const schema_1 = require("./schema");
45
+ const logger_1 = require("./logger");
46
+ function generate(config) {
47
+ return {
48
+ version: require('../package.json').version,
49
+ app: config.app,
50
+ generatedAt: new Date().toISOString(),
51
+ capabilities: config.capabilities,
52
+ };
53
+ }
54
+ function loadConfig(configPath) {
55
+ const candidates = configPath
56
+ ? [configPath]
57
+ : ['capman.config.js', 'capman.config.json'];
58
+ // If a specific path was given but doesn't exist — clear error
59
+ if (configPath) {
60
+ const resolved = path.resolve(process.cwd(), configPath);
61
+ if (!fs.existsSync(resolved)) {
62
+ throw new Error(`Config file not found at: ${resolved}\n` +
63
+ `Check the path and try again.`);
64
+ }
65
+ }
66
+ for (const candidate of candidates) {
67
+ const resolved = path.resolve(process.cwd(), candidate);
68
+ if (fs.existsSync(resolved)) {
69
+ let raw;
70
+ // Catch syntax errors in config file
71
+ try {
72
+ const mod = require(resolved);
73
+ raw = mod.default ?? mod;
74
+ }
75
+ catch (err) {
76
+ throw new Error(`Failed to load config at ${resolved}:\n` +
77
+ ` ${err instanceof Error ? err.message : String(err)}\n\n` +
78
+ `Check your config file for syntax errors.`);
79
+ }
80
+ // Catch invalid config structure
81
+ const check = (0, schema_1.validateConfig)(raw);
82
+ if (!check.valid) {
83
+ throw new Error(`Invalid capman config at ${resolved}:\n` +
84
+ check.errors.map(e => ` • ${e}`).join('\n') + '\n\n' +
85
+ `Run: node bin/capman.js init to see a valid example config.`);
86
+ }
87
+ return raw;
88
+ }
89
+ }
90
+ // No config found at all
91
+ throw new Error(`No capman config file found.\n\n` +
92
+ `Expected one of:\n` +
93
+ candidates.map(c => ` • ${c}`).join('\n') + '\n\n' +
94
+ `Run: node bin/capman.js init to create one.`);
95
+ }
96
+ function writeManifest(manifest, outputPath = 'manifest.json') {
97
+ const resolved = path.resolve(process.cwd(), outputPath);
98
+ fs.writeFileSync(resolved, JSON.stringify(manifest, null, 2));
99
+ return resolved;
100
+ }
101
+ function readManifest(manifestPath = 'manifest.json') {
102
+ const resolved = path.resolve(process.cwd(), manifestPath);
103
+ if (!fs.existsSync(resolved)) {
104
+ throw new Error(`No manifest found at ${resolved}. Run: node bin/capman.js generate`);
105
+ }
106
+ const raw = JSON.parse(fs.readFileSync(resolved, 'utf-8'));
107
+ const check = (0, schema_1.validateManifest)(raw);
108
+ if (!check.valid) {
109
+ throw new Error(`Invalid manifest at ${resolved}:\n` +
110
+ check.errors.map(e => ` • ${e}`).join('\n'));
111
+ }
112
+ return raw;
113
+ }
114
+ function validate(manifest) {
115
+ const errors = [];
116
+ const warnings = [];
117
+ // Delegate error checking to Zod
118
+ const zodResult = (0, schema_1.validateManifest)(manifest);
119
+ errors.push(...zodResult.errors);
120
+ // Warnings that Zod doesn't cover
121
+ for (const cap of manifest.capabilities ?? []) {
122
+ if (!cap.examples?.length) {
123
+ const msg = `Capability "${cap.id}" has no examples — adding examples improves matching`;
124
+ warnings.push(msg);
125
+ logger_1.logger.warn(msg);
126
+ }
127
+ if (!cap.returns?.length) {
128
+ const msg = `Capability "${cap.id}" has no "returns" declaration`;
129
+ warnings.push(msg);
130
+ logger_1.logger.warn(msg);
131
+ }
132
+ }
133
+ if (errors.length > 0) {
134
+ logger_1.logger.error(`Manifest validation failed — ${errors.length} error(s)`);
135
+ errors.forEach(e => logger_1.logger.error(e));
136
+ }
137
+ return { valid: errors.length === 0, errors, warnings };
138
+ }
139
+ function generateStarterConfig() {
140
+ return `// capman.config.js
141
+ // Define what your app can do for AI agents.
142
+ // Replace the examples below with your own app's capabilities.
143
+
144
+ module.exports = {
145
+ app: 'your-app-name',
146
+ baseUrl: 'https://api.your-app.com',
147
+
148
+ capabilities: [
149
+ {
150
+ id: 'get_resource',
151
+ name: 'Get a resource',
152
+ description: 'Fetch a specific resource by name, ID, or filter from the app.',
153
+ examples: [
154
+ 'Show me the resource details',
155
+ 'Find resource by ID',
156
+ 'Look up resource by name',
157
+ ],
158
+ params: [
159
+ {
160
+ name: 'resource_id',
161
+ description: 'The ID or name of the resource to fetch',
162
+ required: true,
163
+ source: 'user_query',
164
+ },
165
+ ],
166
+ returns: ['resource', 'metadata'],
167
+ resolver: {
168
+ type: 'api',
169
+ endpoints: [{ method: 'GET', path: '/resources/{resource_id}' }],
170
+ },
171
+ privacy: { level: 'public', note: 'No auth required' },
172
+ },
173
+
174
+ {
175
+ id: 'navigate_to_screen',
176
+ name: 'Navigate to a screen',
177
+ description: 'Route the user to a specific page or section in the app.',
178
+ examples: [
179
+ 'Take me to the dashboard',
180
+ 'Open settings',
181
+ 'Go to my profile',
182
+ ],
183
+ params: [
184
+ {
185
+ name: 'destination',
186
+ description: 'The screen or page to navigate to',
187
+ required: true,
188
+ source: 'user_query',
189
+ },
190
+ ],
191
+ returns: ['deep_link'],
192
+ resolver: { type: 'nav', destination: '{destination}' },
193
+ privacy: { level: 'public' },
194
+ },
195
+
196
+ {
197
+ id: 'get_user_data',
198
+ name: 'Get user data',
199
+ description: 'Retrieve data belonging to the currently authenticated user.',
200
+ examples: [
201
+ 'Show my account details',
202
+ 'What is my current plan?',
203
+ 'Show my recent activity',
204
+ ],
205
+ params: [
206
+ {
207
+ name: 'user_id',
208
+ description: 'Current user ID',
209
+ required: true,
210
+ source: 'session',
211
+ },
212
+ ],
213
+ returns: ['user_data'],
214
+ resolver: {
215
+ type: 'api',
216
+ endpoints: [{ method: 'GET', path: '/users/{user_id}' }],
217
+ },
218
+ privacy: { level: 'user_owned', note: 'Requires auth — scoped to current user only' },
219
+ },
220
+ ],
221
+ }
222
+ `;
223
+ }
224
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export { setLogLevel } from './logger';
2
+ export type { LogLevel } from './logger';
3
+ export type { Capability, CapabilityParam, CapmanConfig, Manifest, MatchResult, ResolveResult, ValidationResult, Resolver, ApiResolver, NavResolver, HybridResolver, PrivacyScope, ResolverType, HttpMethod, } from './types';
4
+ export { generate, loadConfig, writeManifest, readManifest, validate, generateStarterConfig, } from './generator';
5
+ export { match, matchWithLLM, } from './matcher';
6
+ export type { LLMMatcherOptions } from './matcher';
7
+ export { resolve } from './resolver';
8
+ export type { ResolveOptions, AuthContext } from './resolver';
9
+ import type { Manifest, MatchResult, ResolveResult } from './types';
10
+ import type { LLMMatcherOptions } from './matcher';
11
+ import type { ResolveOptions } from './resolver';
12
+ export interface AskOptions extends ResolveOptions {
13
+ llm?: LLMMatcherOptions['llm'];
14
+ }
15
+ export interface AskResult {
16
+ match: MatchResult;
17
+ resolution: ResolveResult;
18
+ }
19
+ /**
20
+ * One-shot convenience: match + resolve in a single call.
21
+ *
22
+ * @example
23
+ * const result = await ask("show me the dashboard", manifest, {
24
+ * baseUrl: 'https://api.your-app.com',
25
+ * })
26
+ */
27
+ export declare function ask(query: string, manifest: Manifest, options?: AskOptions): Promise<AskResult>;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAExC,YAAY,EACV,UAAU,EACV,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,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;AAM7D,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,WAAW,UAAW,SAAQ,cAAc;IAChD,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,WAAW,CAAA;IAClB,UAAU,EAAE,aAAa,CAAA;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAsB,GAAG,CACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,SAAS,CAAC,CAmBpB"}
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolve = exports.matchWithLLM = exports.match = exports.generateStarterConfig = exports.validate = exports.readManifest = exports.writeManifest = exports.loadConfig = exports.generate = exports.setLogLevel = void 0;
4
+ exports.ask = ask;
5
+ var logger_1 = require("./logger");
6
+ Object.defineProperty(exports, "setLogLevel", { enumerable: true, get: function () { return logger_1.setLogLevel; } });
7
+ var generator_1 = require("./generator");
8
+ Object.defineProperty(exports, "generate", { enumerable: true, get: function () { return generator_1.generate; } });
9
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return generator_1.loadConfig; } });
10
+ Object.defineProperty(exports, "writeManifest", { enumerable: true, get: function () { return generator_1.writeManifest; } });
11
+ Object.defineProperty(exports, "readManifest", { enumerable: true, get: function () { return generator_1.readManifest; } });
12
+ Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return generator_1.validate; } });
13
+ Object.defineProperty(exports, "generateStarterConfig", { enumerable: true, get: function () { return generator_1.generateStarterConfig; } });
14
+ var matcher_1 = require("./matcher");
15
+ Object.defineProperty(exports, "match", { enumerable: true, get: function () { return matcher_1.match; } });
16
+ Object.defineProperty(exports, "matchWithLLM", { enumerable: true, get: function () { return matcher_1.matchWithLLM; } });
17
+ var resolver_1 = require("./resolver");
18
+ Object.defineProperty(exports, "resolve", { enumerable: true, get: function () { return resolver_1.resolve; } });
19
+ // ─── Convenience: ask() — match + resolve in one call ────────────────────────
20
+ const matcher_2 = require("./matcher");
21
+ const resolver_2 = require("./resolver");
22
+ /**
23
+ * One-shot convenience: match + resolve in a single call.
24
+ *
25
+ * @example
26
+ * const result = await ask("show me the dashboard", manifest, {
27
+ * baseUrl: 'https://api.your-app.com',
28
+ * })
29
+ */
30
+ async function ask(query, manifest, options = {}) {
31
+ const { llm, ...resolveOptions } = options;
32
+ // Tier 1 — try keyword matcher first (fast, no API call)
33
+ const keywordResult = (0, matcher_2.match)(query, manifest);
34
+ // If confident enough, use it directly
35
+ const THRESHOLD = 50;
36
+ const matchResult = (keywordResult.confidence >= THRESHOLD || !llm)
37
+ ? keywordResult
38
+ : await (0, matcher_2.matchWithLLM)(query, manifest, { llm });
39
+ const resolution = await (0, resolver_2.resolve)(matchResult, matchResult.extractedParams, resolveOptions);
40
+ return { match: matchResult, resolution };
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AA+DA,kBAuBC;AAtFD,mCAAsC;AAA7B,qGAAA,WAAW,OAAA;AAoBpB,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,gFAAgF;AAEhF,uCAA0E;AAC1E,yCAAgD;AAchD;;;;;;;GAOG;AACI,KAAK,UAAU,GAAG,CACvB,KAAa,EACb,QAAkB,EAClB,UAAsB,EAAE;IAExB,MAAM,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAA;IAE1C,yDAAyD;IACzD,MAAM,aAAa,GAAG,IAAA,eAAM,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAE7C,uCAAuC;IACvC,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,MAAM,WAAW,GAAG,CAAC,aAAa,CAAC,UAAU,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC;QACjE,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,MAAM,IAAA,sBAAa,EAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IAEjD,MAAM,UAAU,GAAG,MAAM,IAAA,kBAAQ,EAC/B,WAAW,EACX,WAAW,CAAC,eAA0C,EACtD,cAAc,CACf,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';
2
+ export declare class Logger {
3
+ private level;
4
+ constructor(level?: LogLevel);
5
+ setLevel(level: LogLevel): void;
6
+ error(msg: string, ...args: unknown[]): void;
7
+ warn(msg: string, ...args: unknown[]): void;
8
+ info(msg: string, ...args: unknown[]): void;
9
+ debug(msg: string, ...args: unknown[]): void;
10
+ }
11
+ export declare const logger: Logger;
12
+ /**
13
+ * Set the global log level for capman.
14
+ *
15
+ * @example
16
+ * import { setLogLevel } from 'capman'
17
+ * setLogLevel('debug') // see everything
18
+ * setLogLevel('info') // see key steps
19
+ * setLogLevel('silent') // no output (default)
20
+ */
21
+ export declare function setLogLevel(level: LogLevel): void;
22
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAYrE,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAQ;gBAET,KAAK,GAAE,QAAmB;IAItC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAIxB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAKrC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAKpC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAKpC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;CAItC;AAID,eAAO,MAAM,MAAM,QAAuB,CAAA;AAE1C;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,QAE1C"}
package/dist/logger.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ // ─── Log levels ───────────────────────────────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.logger = exports.Logger = void 0;
5
+ exports.setLogLevel = setLogLevel;
6
+ const LEVELS = {
7
+ silent: 0,
8
+ error: 1,
9
+ warn: 2,
10
+ info: 3,
11
+ debug: 4,
12
+ };
13
+ // ─── Logger ───────────────────────────────────────────────────────────────────
14
+ class Logger {
15
+ constructor(level = 'silent') {
16
+ this.level = LEVELS[level];
17
+ }
18
+ setLevel(level) {
19
+ this.level = LEVELS[level];
20
+ }
21
+ error(msg, ...args) {
22
+ if (this.level >= LEVELS.error)
23
+ console.error(`[capman:error] ${msg}`, ...args);
24
+ }
25
+ warn(msg, ...args) {
26
+ if (this.level >= LEVELS.warn)
27
+ console.warn(`[capman:warn] ${msg}`, ...args);
28
+ }
29
+ info(msg, ...args) {
30
+ if (this.level >= LEVELS.info)
31
+ console.log(`[capman:info] ${msg}`, ...args);
32
+ }
33
+ debug(msg, ...args) {
34
+ if (this.level >= LEVELS.debug)
35
+ console.log(`[capman:debug] ${msg}`, ...args);
36
+ }
37
+ }
38
+ exports.Logger = Logger;
39
+ // ─── Global logger instance ───────────────────────────────────────────────────
40
+ exports.logger = new Logger('silent');
41
+ /**
42
+ * Set the global log level for capman.
43
+ *
44
+ * @example
45
+ * import { setLogLevel } from 'capman'
46
+ * setLogLevel('debug') // see everything
47
+ * setLogLevel('info') // see key steps
48
+ * setLogLevel('silent') // no output (default)
49
+ */
50
+ function setLogLevel(level) {
51
+ exports.logger.setLevel(level);
52
+ }
53
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA,iFAAiF;;;AA2DjF,kCAEC;AAzDD,MAAM,MAAM,GAA6B;IACvC,MAAM,EAAE,CAAC;IACT,KAAK,EAAG,CAAC;IACT,IAAI,EAAI,CAAC;IACT,IAAI,EAAI,CAAC;IACT,KAAK,EAAG,CAAC;CACV,CAAA;AAED,iFAAiF;AAEjF,MAAa,MAAM;IAGjB,YAAY,QAAkB,QAAQ;QACpC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,QAAQ,CAAC,KAAe;QACtB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,GAAG,IAAe;QACnC,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;YAC5B,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,GAAG,IAAe;QAClC,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;YAC3B,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,GAAG,IAAe;QAClC,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;YAC3B,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,GAAG,IAAe;QACnC,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;YAC5B,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IACjD,CAAC;CACF;AA9BD,wBA8BC;AAED,iFAAiF;AAEpE,QAAA,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;AAE1C;;;;;;;;GAQG;AACH,SAAgB,WAAW,CAAC,KAAe;IACzC,cAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACxB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Manifest, MatchResult } from './types';
2
+ export declare function match(query: string, manifest: Manifest): MatchResult;
3
+ export interface LLMMatcherOptions {
4
+ llm: (prompt: string) => Promise<string>;
5
+ }
6
+ export declare function matchWithLLM(query: string, manifest: Manifest, options: LLMMatcherOptions): Promise<MatchResult>;
7
+ //# sourceMappingURL=matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AA+HhE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAiDpE;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACzC;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA8CtB"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.match = match;
4
+ exports.matchWithLLM = matchWithLLM;
5
+ const logger_1 = require("./logger");
6
+ const STOPWORDS = new Set([
7
+ 'show', 'me', 'the', 'get', 'find', 'fetch', 'give', 'please',
8
+ 'can', 'you', 'i', 'want', 'to', 'a', 'an', 'my', 'our', 'your',
9
+ 'what', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
10
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',
11
+ 'could', 'should', 'may', 'might', 'shall', 'and', 'or', 'but',
12
+ 'in', 'on', 'at', 'by', 'for', 'with', 'about', 'into', 'through',
13
+ 'of', 'from', 'up', 'out', 'that', 'this', 'these', 'those',
14
+ 'it', 'its', 'how', 'when', 'where', 'who', 'which', 'all',
15
+ 'just', 'some', 'any', 'there', 'their', 'them', 'they',
16
+ ]);
17
+ function filterStopwords(words) {
18
+ return words.filter(w => !STOPWORDS.has(w.toLowerCase()) && w.length > 1);
19
+ }
20
+ function scoreCapability(query, cap) {
21
+ const q = query.toLowerCase();
22
+ let score = 0;
23
+ const qWords = filterStopwords(q.split(/\W+/).filter(Boolean));
24
+ // Check examples — exact substring match is a strong signal
25
+ for (const example of cap.examples ?? []) {
26
+ const exWords = filterStopwords(example.toLowerCase().split(/\s+/));
27
+ if (exWords.length === 0)
28
+ continue;
29
+ const overlap = exWords.filter(w => qWords.includes(w)).length;
30
+ score += (overlap / exWords.length) * 60;
31
+ }
32
+ // Check description words
33
+ const descWords = filterStopwords(cap.description.toLowerCase().split(/\W+/).filter(Boolean));
34
+ if (descWords.length > 0) {
35
+ const descOverlap = descWords.filter(w => qWords.includes(w)).length;
36
+ score += (descOverlap / descWords.length) * 30;
37
+ }
38
+ // Check name words
39
+ const nameWords = filterStopwords(cap.name.toLowerCase().split(/\W+/).filter(Boolean));
40
+ if (nameWords.length > 0) {
41
+ const nameOverlap = nameWords.filter(w => qWords.includes(w)).length;
42
+ score += (nameOverlap / nameWords.length) * 10;
43
+ }
44
+ return Math.min(Math.round(score), 100);
45
+ }
46
+ function resolverToIntent(cap) {
47
+ const t = cap.resolver.type;
48
+ if (t === 'api')
49
+ return 'retrieval';
50
+ if (t === 'nav')
51
+ return 'navigation';
52
+ if (t === 'hybrid')
53
+ return 'hybrid';
54
+ return 'out_of_scope';
55
+ }
56
+ /**
57
+ * Extracts parameter values from a user query using keyword heuristics.
58
+ *
59
+ * Known limits:
60
+ * - Extracts single tokens only — "jane smith" would extract "jane"
61
+ * - Keyword matching is positional — "articles from authors I follow"
62
+ * may extract "authors" instead of nothing, since "from" is a keyword
63
+ * - For complex or ambiguous queries, use matchWithLLM() which handles
64
+ * param extraction more accurately via the LLM prompt
65
+ */
66
+ function extractParams(query, cap) {
67
+ const result = {};
68
+ const q = query.toLowerCase();
69
+ for (const param of cap.params) {
70
+ // Session params come from auth context, not query
71
+ if (param.source === 'session') {
72
+ result[param.name] = '[from_session]';
73
+ continue;
74
+ }
75
+ if (param.source !== 'user_query') {
76
+ result[param.name] = null;
77
+ continue;
78
+ }
79
+ // Try to extract value after known keywords
80
+ // e.g. "profile for johndoe" → johndoe
81
+ // "articles by jane" → jane
82
+ // "tag javascript" → javascript
83
+ const keywords = [
84
+ `for `, `by `, `about `, `named `, `called `,
85
+ `tag `, `user `, `author `, `slug `, `id `,
86
+ `to `, `from `, `with `,
87
+ ];
88
+ let extracted = null;
89
+ for (const kw of keywords) {
90
+ const idx = q.indexOf(kw);
91
+ if (idx !== -1) {
92
+ const after = query.slice(idx + kw.length).trim();
93
+ const token = after.split(/\s+/)[0];
94
+ if (token && token.length > 1) {
95
+ extracted = token.replace(/[^a-zA-Z0-9-_@.]/g, '');
96
+ break;
97
+ }
98
+ }
99
+ }
100
+ // Fallback — grab last meaningful word in the query
101
+ if (!extracted) {
102
+ const words = query.trim().split(/\s+/);
103
+ const meaningful = words.filter(w => !STOPWORDS.has(w.toLowerCase()));
104
+ extracted = meaningful[meaningful.length - 1] ?? null;
105
+ }
106
+ result[param.name] = extracted;
107
+ }
108
+ return result;
109
+ }
110
+ function match(query, manifest) {
111
+ if (!query?.trim()) {
112
+ logger_1.logger.warn('Empty query received');
113
+ return {
114
+ capability: null,
115
+ confidence: 0,
116
+ intent: 'out_of_scope',
117
+ extractedParams: {},
118
+ reasoning: 'Empty query',
119
+ };
120
+ }
121
+ logger_1.logger.info(`Matching query: "${query}"`);
122
+ logger_1.logger.debug(`Manifest has ${manifest.capabilities.length} capabilities`);
123
+ let best = null;
124
+ let bestScore = 0;
125
+ for (const cap of manifest.capabilities) {
126
+ const score = scoreCapability(query, cap);
127
+ logger_1.logger.debug(` scored "${cap.id}": ${score}%`);
128
+ if (score > bestScore) {
129
+ bestScore = score;
130
+ best = cap;
131
+ }
132
+ }
133
+ if (!best || bestScore < 50) {
134
+ logger_1.logger.info(`No match above threshold (best: ${bestScore}% for "${best?.id ?? 'none'}")`);
135
+ return {
136
+ capability: null,
137
+ confidence: bestScore,
138
+ intent: 'out_of_scope',
139
+ extractedParams: {},
140
+ reasoning: `No capability matched with sufficient confidence (best score: ${bestScore})`,
141
+ };
142
+ }
143
+ const params = extractParams(query, best);
144
+ logger_1.logger.info(`Matched "${best.id}" at ${bestScore}% confidence`);
145
+ logger_1.logger.debug(`Extracted params: ${JSON.stringify(params)}`);
146
+ return {
147
+ capability: best,
148
+ confidence: bestScore,
149
+ intent: resolverToIntent(best),
150
+ extractedParams: params,
151
+ reasoning: `Matched "${best.id}" via keyword scoring (score: ${bestScore})`,
152
+ };
153
+ }
154
+ async function matchWithLLM(query, manifest, options) {
155
+ const manifestSummary = manifest.capabilities.map(c => `- ${c.id} (${c.resolver.type}): ${c.description}${c.examples?.length ? `\n examples: ${c.examples.slice(0, 2).join(', ')}` : ''}`).join('\n');
156
+ const prompt = `You are an intent matcher for an AI agent system.
157
+
158
+ App: ${manifest.app}
159
+
160
+ Available capabilities:
161
+ ${manifestSummary}
162
+
163
+ User query: "${query}"
164
+
165
+ Respond ONLY in valid JSON (no markdown):
166
+ {
167
+ "matched_capability": "<capability_id or OUT_OF_SCOPE>",
168
+ "confidence": <0-100>,
169
+ "intent": "<navigation|retrieval|hybrid|out_of_scope>",
170
+ "reasoning": "<one sentence>",
171
+ "extracted_params": { "<param_name>": "<value or null>" }
172
+ }`;
173
+ try {
174
+ const raw = await options.llm(prompt);
175
+ const clean = raw.replace(/```json|```/g, '').trim();
176
+ const parsed = JSON.parse(clean);
177
+ const isOOS = parsed.matched_capability === 'OUT_OF_SCOPE';
178
+ const capability = isOOS
179
+ ? null
180
+ : manifest.capabilities.find(c => c.id === parsed.matched_capability) ?? null;
181
+ return {
182
+ capability,
183
+ confidence: parsed.confidence,
184
+ intent: isOOS ? 'out_of_scope' : parsed.intent,
185
+ extractedParams: parsed.extracted_params ?? {},
186
+ reasoning: parsed.reasoning,
187
+ };
188
+ }
189
+ catch (err) {
190
+ logger_1.logger.warn(`LLM match failed, falling back to keyword matcher: ${err}`);
191
+ return match(query, manifest);
192
+ }
193
+ }
194
+ //# sourceMappingURL=matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { MatchResult, ResolveResult } from './types';
2
+ export interface AuthContext {
3
+ /** Whether the current request is authenticated */
4
+ isAuthenticated: boolean;
5
+ /** Current user's role */
6
+ role?: 'user' | 'admin';
7
+ /** Current user's ID — injected into session params */
8
+ userId?: string;
9
+ }
10
+ export interface ResolveOptions {
11
+ baseUrl?: string;
12
+ fetch?: typeof globalThis.fetch;
13
+ dryRun?: boolean;
14
+ headers?: Record<string, string>;
15
+ /** Auth context — required for user_owned and admin capabilities */
16
+ auth?: AuthContext;
17
+ }
18
+ export declare function resolve(matchResult: MatchResult, params?: Record<string, unknown>, options?: ResolveOptions): Promise<ResolveResult>;
19
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAA4B,MAAM,SAAS,CAAA;AAKnF,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,eAAe,EAAE,OAAO,CAAA;IACxB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,oEAAoE;IACpE,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB;AA+BD,wBAAsB,OAAO,CAC3B,WAAW,EAAE,WAAW,EACxB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAwExB"}