@juspay/neurolink
Version:
The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types — generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002
79 lines (78 loc) • 3.48 kB
TypeScript
/**
* SkillsManager — orchestrates the skill store, cached index, index-first
* search (hydrating instructions only for matches), prompt-index rendering,
* and the mutation gate.
*
* Read paths fail open (errors surface as empty results + a warn log);
* write paths fail closed (errors reject the mutation).
*/
import type { SkillDefinition, SkillIndexItem, SkillMutationAction, SkillMutationResult, SkillSearchQuery, SkillsConfig } from "../types/index.js";
import { SkillSessionTracker } from "./skillSessionTracker.js";
export declare class SkillsManager {
private readonly config;
private readonly store;
private cachedIndex;
private cachedIndexAt;
/** Serializes writes within this process — see requestMutation(). */
private mutationQueue;
/** Per-session activation state (pinned skills). */
readonly sessions: SkillSessionTracker;
constructor(config: SkillsConfig);
/**
* Cached index read, sorted by name. TTL 0 disables caching. Sorting
* here (not per render) keeps every downstream listing byte-stable
* regardless of store enumeration order.
*/
getIndex(forceRefresh?: boolean): Promise<SkillIndexItem[]>;
private invalidateIndex;
/**
* Index-first search: filter the cached index, hydrate only the matched
* entries (max `limit`) with instructions. Cost: one cached index read +
* N_matched store gets.
*/
search(query: SkillSearchQuery): Promise<SkillDefinition[]>;
/** Index entries only — no instructions. For discovery/listing. */
list(scopeId?: string): Promise<SkillIndexItem[]>;
/** Fetch one skill by id, falling back to name lookup. */
get(idOrName: string): Promise<SkillDefinition | null>;
/**
* Render the system-prompt skills index for one call, or null when
* nothing is visible. Never includes instructions.
*/
buildPromptIndex(options?: {
scopeId?: string;
tags?: string[];
}): Promise<string | null>;
/**
* Render the `<available_skills>` block for the use_skill tool
* description ("tool" discovery mode), or null when nothing is visible.
* Bounded by listingBudgetChars; entries are never dropped.
*/
buildToolListing(options?: {
scopeId?: string;
tags?: string[];
}): Promise<string | null>;
/** Visible (active, scope- and tag-filtered) index entries for one call. */
private visibleItems;
/**
* Read an auxiliary resource file bundled with a skill. Paths are
* relative to the skill; traversal segments are rejected. Null when the
* skill, the resource, or store resource support is absent.
*/
getResource(idOrName: string, resourcePath: string): Promise<string | null>;
/**
* Whether skill create/update/delete is enabled on this instance. Gates the
* LLM-facing `skill_*` tools (registration) and the server REST mutation
* routes. Direct programmatic `requestMutation` calls are intentionally not
* gated, so a host can still seed skills at startup.
*/
get mutationsAllowed(): boolean;
/**
* Gate a proposed mutation through the host's onMutationRequest hook,
* then apply it when approved. No hook configured means direct apply
* (the tools themselves are already gated by allowMutations).
*/
requestMutation(action: SkillMutationAction): Promise<SkillMutationResult>;
private applyMutation;
private assertNameAvailable;
}