/** * Capability registry — Phase 1.a/1.b of the AgenticROS strategy. * * A capability is a named, declarable verb an LLM can plan against * (`follow_person`, `find_object`, `take_snapshot`, `drive_base`). * It's deliberately shaped to match inter-agent protocol agent cards * (ACP / A2A) so a skill's capability today is readable as an agent * capability when Phase 4 lands — no rewrite required. * * Two kinds of capabilities: * - **Intrinsic** — built into every AgenticROS deployment (drive_base, * take_snapshot, measure_depth, list_topics, publish, subscribe). Lives * in this file as `BUILTIN_CAPABILITIES`. * - **Skill-declared** — comes from a skill package's `package.json` * under `agenticrosSkill.capabilities[]` (or a sibling * `capabilities.json`). Read at adapter startup. * * See: docs/strategy-ai-agents-plus-ros.md §4 (Phase 1). */ import type { AgenticROSConfig } from "./config.js"; /** Where a capability came from. */ export type CapabilitySource = { kind: "builtin"; } | { kind: "skill"; skillId: string; package: string; path?: string; }; /** Implementation hint — in-process Node.js skill vs external ROS node. */ export type CapabilityImplementation = { kind: "in_process"; } | { kind: "external_ros_node"; package?: string; launch?: string; action?: string; service?: string; topic?: string; msg_type?: string; }; /** Typed input/output schema — minimal, JSON-Schema-ish. */ export interface CapabilityField { type: string; description?: string; optional?: boolean; default?: unknown; } /** * One capability the agent can plan against. * * Required: `id`, `verb`, `description`. * Everything else is optional so a skill can adopt the manifest * incrementally. */ export interface Capability { /** Unique identifier within a robot (e.g. `follow_person`, `find_object`). */ id: string; /** High-level verb (`follow`, `find`, `navigate`, `manipulate`, `map`, `detect`). */ verb: string; /** One-line, human-readable description. */ description: string; /** Optional structured inputs the agent can fill. */ inputs?: Record; /** Optional structured outputs the skill emits. */ outputs?: Record; /** Free-form preconditions ("depthTopic available", "person detected"). */ preconditions?: string[]; /** Can be canceled mid-execution? Default true for intrinsic, varies for skills. */ interruptible?: boolean; /** Owns the robot base (cmd_vel); other base-owning skills should yield. */ blocks_base?: boolean; /** * Hardware features this verb needs (ALL-OF). Empty / omitted → no * hardware gate. Names come from the frozen profile vocabulary * (`base`, `camera`, `depth`, …). */ requires?: string[]; /** * Features this verb can use but does not require. Unused for gating; * surfaced in docs and the marketplace. */ optional?: string[]; /** How the capability is implemented. Defaults to `in_process` when unset. */ implementation?: CapabilityImplementation; /** Set by the registry, not the skill author. */ source?: CapabilitySource; } /** * Built-in robot verbs — wrap the raw MCP tools in agent-meaningful * capability names. The intrinsic set is intentionally small and stable * so the agent's planning surface stays understandable as skill catalogs * grow. */ export declare const BUILTIN_CAPABILITIES: readonly Capability[]; /** * Read every capability declared by every skill referenced in `config`. * Sources both `skillPaths` (directories with a package.json) and * `skillPackages` (resolvable npm names). * * Failures are silent — a missing skill is logged elsewhere by the * skill loader; this function focuses on returning the capabilities * it can read. */ export declare function readSkillCapabilities(config: AgenticROSConfig): Capability[]; /** * Return the full capability list: built-in robot verbs first, then * skill-declared capabilities. This is the shape returned by * `ros2_list_capabilities` across every adapter. */ export declare function listAllCapabilities(config: AgenticROSConfig): Capability[]; /** * Capabilities advertised for one robot: gateway registry, then optional * per-robot verb allowlist, then hardware-profile `requires` filter. * `robotId` omitted → active robot. No profile → no hardware filter. */ export declare function listCapabilitiesForRobot(config: AgenticROSConfig, robotId?: string): Capability[]; /** * Why a verb is not advertised on this robot, or undefined when it is * simply unknown. Used by the mission runner for a clearer error than * "not found in registry". */ export declare function capabilityUnavailableMessage(config: AgenticROSConfig, robotId: string | undefined, capId: string): string | undefined; //# sourceMappingURL=capabilities.d.ts.map