@projectpac/source-skills
v0.6.0
Published
Part of PAC: @projectpac/source-skills.
Readme
@projectpac/source-skills
The principal's skills: procedures they own, offered to a peer the same way anything else they hold is.
A skill is a markdown document with a little front matter. The body is the instructions a model is given; the front matter is what a peer is allowed to know. The two are stored apart, and that split is the point -- describing a skill must not mean reading it, exactly as describing a plugin must not mean running it.
- It is a source, not a flow's private library. A skill used to live
inside the flow that called one, with its own store and its own board, which
meant no other flow could plan against one and the flow that owned it had to
know what a skill was in order to stake it. Here
inventory()says what this node offers andstake()puts it where a box can be pointed at it, so a flow names a skill and never learns that it is one. - It holds the instructions and nothing else. The model a skill runs on
and the key that pays for it used to live here too, named by the front
matter. They are
@projectpac/source-llm's now -- because a credential pinned to a skill means only the skill's owner can ever pay to run one, and who supplies the model is a term of the computation rather than one party's private arrangement. A design names an access beside the skill, from either side. provideris a hostname.openrouter.ai, notopenrouter-- the same word a box session's declared egress speaks, so one name carries from the document, through the descriptor a peer reads, to the cage the program runs in.- A document without a provider is refused at the door, through the same
parser that will serve it: it describes a disclosure nobody could consent
to. A key this parser does not read is ignored rather than refused, so a
document still carrying
model:from when a skill named its own comes through as a skill that names none -- which is the right answer, not leniency.
The document
---
description: Plans multi-day trip itineraries tuned to the traveler's tastes.
provider: openrouter.ai
needs: trips
---
# Trip planner
You plan trips the way a well-travelled friend does...Deliberately not YAML: the grammar is key: value lines, so a document cannot
carry a tag, an anchor, or a nested document. needs is the one list, and it
is comma-separated for the same reason. It names the caller's files, not
this node's.
The two routes
POST /skills takes {name, document} and writes the body into this plugin's
own folder with mode 0600. It is the one moment a body passes through this
code. GET /skills answers the declarations, with servable false for one
whose body has gone -- declared but no longer held.
Whether anybody can pay to run a skill is a separate question and no longer asked here: a node holding a skill and no access to its provider still offers the skill, and the refusal comes when a call is made, by name.
