@runapi.ai/mcp-core
Advanced tools
| export declare const CORE_PACKAGE_NAME = "@runapi.ai/mcp-core"; | ||
| export declare const CORE_PACKAGE_VERSION = "0.2.3"; | ||
| export declare const CORE_PACKAGE_VERSION = "0.3.0"; | ||
| export declare const DEFAULT_BASE_URL = "https://runapi.ai"; | ||
| export declare const RUNAPI_API_KEY_ENV = "RUNAPI_API_KEY"; | ||
| export declare const USER_AGENT = "@runapi.ai/mcp-core/0.2.3"; | ||
| export declare const USER_AGENT = "@runapi.ai/mcp-core/0.3.0"; |
| export const CORE_PACKAGE_NAME = "@runapi.ai/mcp-core"; | ||
| export const CORE_PACKAGE_VERSION = "0.2.3"; | ||
| export const CORE_PACKAGE_VERSION = "0.3.0"; | ||
| export const DEFAULT_BASE_URL = "https://runapi.ai"; | ||
@@ -4,0 +4,0 @@ export const RUNAPI_API_KEY_ENV = "RUNAPI_API_KEY"; |
+52
-7
@@ -5,3 +5,5 @@ import { findAction } from "./contract.js"; | ||
| ...rule, | ||
| when: rule.when ?? {}, | ||
| required: rule.required ?? [], | ||
| required_any: rule.required_any ?? [], | ||
| forbidden: rule.forbidden ?? [] | ||
@@ -14,6 +16,6 @@ })); | ||
| } | ||
| const controllingFields = new Set(Object.keys(rules[0].when)); | ||
| const controllingFields = new Set(controllingFieldNames(rules[0])); | ||
| for (const rule of rules.slice(1)) { | ||
| for (const field of controllingFields) { | ||
| if (!(field in rule.when)) { | ||
| if (!controllingFieldNames(rule).includes(field)) { | ||
| controllingFields.delete(field); | ||
@@ -29,3 +31,4 @@ } | ||
| for (const rule of rules) { | ||
| const matches = Object.entries(rule.when).every(([field, value]) => params[field] === value); | ||
| const conditions = rule.when ?? {}; | ||
| const matches = Object.entries(conditions).every(([field, condition]) => conditionMatches(params, field, condition)); | ||
| if (!matches) { | ||
@@ -35,6 +38,10 @@ continue; | ||
| const required = rule.required ?? []; | ||
| const requiredAny = rule.required_any ?? []; | ||
| const forbidden = rule.forbidden ?? []; | ||
| const narrowedEnums = rule.enum ?? {}; | ||
| const missing = required.filter((field) => !hasValue(params[field])); | ||
| const missingAny = requiredAny.length > 0 && requiredAny.every((field) => !hasValue(params[field])); | ||
| const presentForbidden = forbidden.filter((field) => hasValue(params[field])); | ||
| if (missing.length === 0 && presentForbidden.length === 0) { | ||
| const invalidEnums = Object.entries(narrowedEnums).filter(([field, allowed]) => (hasValue(params[field]) && !allowed.some((candidate) => String(candidate) === String(params[field])))); | ||
| if (missing.length === 0 && !missingAny && presentForbidden.length === 0 && invalidEnums.length === 0) { | ||
| continue; | ||
@@ -46,15 +53,53 @@ } | ||
| } | ||
| if (missingAny) { | ||
| parts.push(`requires one of ${requiredAny.join(", ")}`); | ||
| } | ||
| if (presentForbidden.length > 0) { | ||
| parts.push(`must not include ${presentForbidden.join(", ")}`); | ||
| } | ||
| return `${formatWhen(rule.when)} ${parts.join(" and ")}.`; | ||
| for (const [field, allowed] of invalidEnums) { | ||
| parts.push(`requires ${field} to be one of ${allowed.map(String).join(", ")}`); | ||
| } | ||
| const context = formatWhen(conditions); | ||
| return `${context ? `${context} ` : ""}${parts.join(" and ")}.`; | ||
| } | ||
| return undefined; | ||
| } | ||
| function controllingFieldNames(rule) { | ||
| return Object.entries(rule.when ?? {}) | ||
| .filter(([, condition]) => !isPresenceCondition(condition)) | ||
| .map(([field]) => field); | ||
| } | ||
| function conditionMatches(params, field, condition) { | ||
| if (isPresenceCondition(condition)) { | ||
| return hasValue(params[field]) === (condition.present === true); | ||
| } | ||
| return params[field] === condition; | ||
| } | ||
| function isPresenceCondition(condition) { | ||
| return typeof condition === "object" && condition !== null && "present" in condition; | ||
| } | ||
| // An empty array counts as absent, matching every other contract validator: a | ||
| // rule that forbids an array field should not fire on `[]`, which supplies | ||
| // nothing. | ||
| function hasValue(value) { | ||
| return value !== undefined && value !== null && !(typeof value === "string" && value.trim() === ""); | ||
| if (value === undefined || value === null) { | ||
| return false; | ||
| } | ||
| if (typeof value === "string") { | ||
| return value.trim() !== ""; | ||
| } | ||
| if (Array.isArray(value)) { | ||
| return value.length > 0; | ||
| } | ||
| return true; | ||
| } | ||
| function formatWhen(when) { | ||
| return Object.entries(when).map(([field, value]) => `${field}=${String(value)}`).join(", "); | ||
| return Object.entries(when).map(([field, condition]) => { | ||
| if (isPresenceCondition(condition)) { | ||
| return condition.present === true ? `${field} is present` : `${field} is absent`; | ||
| } | ||
| return `${field}=${String(condition)}`; | ||
| }).join(", "); | ||
| } | ||
| //# sourceMappingURL=input-rules.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"input-rules.js","sourceRoot":"","sources":["../src/input-rules.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"input-rules.js","sourceRoot":"","sources":["../src/input-rules.ts"],"names":[],"mappings":"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"} |
+3
-1
@@ -96,6 +96,8 @@ export type ContractField = { | ||
| export type InputRule = { | ||
| when: Record<string, unknown>; | ||
| when?: Record<string, unknown>; | ||
| required?: string[]; | ||
| required_any?: string[]; | ||
| forbidden?: string[]; | ||
| enum?: Record<string, unknown[]>; | ||
| description?: string; | ||
| }; |
+1
-1
| { | ||
| "name": "@runapi.ai/mcp-core", | ||
| "version": "0.2.3", | ||
| "version": "0.3.0", | ||
| "description": "Reusable core for building RunAPI MCP servers: client, contract/pricing/schema queries, input-rule engine, and a createModelServer factory.", | ||
@@ -5,0 +5,0 @@ "type": "module", |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
139161
3.05%1791
2.69%