[{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/edge":true},"title":"kernel","$defs":{"about":{"component":true,"type":"object","edge":"about","reversed":"subject of","properties":{},"description":"edge tag: this entity is about that one"},"archived":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it was archived"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who archived it — kept as history when that entity is deleted"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write was made through — the session or client it came in on"}},"description":"Hidden from ordinary listings, without stopping execution or deleting history."},"comment":{"component":true,"type":"object","kind":true,"properties":{"target":{"type":"string","ref":"entity","death":"cascade"},"reply_to":{"type":"string","ref":"comment","death":"detach","description":"the comment this answers, on the same target; absent starts a branch"}},"description":"a comment on a thread: target is the entity it hangs on, reply_to the comment it answers; doc holds the text"},"cites":{"component":true,"type":"object","edge":true,"reversed":"cited by","properties":{"hash":{"type":"string","description":"the cited entity's content hash when this citation was verified"}},"description":"this entity cites that one; its hash says whether the cited content still holds"},"completed":{"component":true,"type":"object","index":[["at"]],"properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it was finished"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who finished it — kept as history when that entity is deleted"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write came in through — the session or client that made it"}},"description":"The work this entity records was finished: a task done. Who finished it is kept across later writes of the mark. Removing the mark reopens the work."},"created":{"component":true,"type":"object","journal":false,"properties":{"by":{"type":"string","ref":"entity","death":"keep","stamped":true},"at":{"type":"string","format":"date-time","stamped":true,"index":true},"via":{"type":"string","ref":"entity","death":"keep","stamped":true}},"description":"who made it, when, and through what"},"delegates":{"component":true,"type":"object","edge":"delegates","reversed":"delegated by","properties":{},"description":"edge tag: this entity handed work off to that one"},"entity":{"component":true,"type":"object","wire":false,"properties":{"archetype":{"type":"string","ref":"archetype","death":"keep","stamped":true,"description":"the archetype entity describing this one's set of components, not a type name"}},"description":"every entity has one: the identity row, carrying the archetype its set of components adds up to and whatever else a plugin keeps beside every entity"},"failed":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it failed"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who gave up on it — kept as history when that entity is deleted"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write came in through — the session or client that made it"},"reason":{"type":"string","description":"why it failed, in the words of whatever refused"}},"description":"The work this entity records was tried and given up on, and is not tried again on its own: a checkout that could not be made. Removing the mark says it is being tried again."},"favorite":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true}},"description":"somebody marked it a favorite"},"image":{"component":true,"type":"object","properties":{"w":{"type":"number"},"h":{"type":"number"}},"description":"this entity is an image, with its pixel dimensions"},"opened":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true},"by":{"type":"string","ref":"entity","death":"keep","stamped":true},"via":{"type":"string","ref":"entity","death":"keep","stamped":true}},"description":"somebody looked at it"},"quarantined":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true},"by":{"type":"string","ref":"entity","death":"keep","stamped":true},"via":{"type":"string","ref":"entity","death":"keep","stamped":true}},"description":"set aside as harmful to act on: readable, never handed out as guidance"},"reads":{"component":true,"type":"object","edge":"reads","reversed":"read by","properties":{},"description":"edge tag: this entity reads that one"},"supersedes":{"component":true,"type":"object","edge":"supersedes","reversed":"superseded by","properties":{},"description":"edge tag: this entity replaces that one"},"supervises":{"component":true,"type":"object","edge":"supervises","reversed":"supervised by","properties":{},"description":"edge tag: this entity oversees that one"},"updated":{"component":true,"type":"object","journal":false,"properties":{"by":{"type":"string","ref":"entity","death":"keep","stamped":true},"at":{"type":"string","format":"date-time","stamped":true},"via":{"type":"string","ref":"entity","death":"keep","stamped":true}},"description":"who last changed it, when, and through what"},"verified":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true},"by":{"type":"string","ref":"entity","death":"keep","stamped":true},"via":{"type":"string","ref":"entity","death":"keep","stamped":true}},"description":"somebody checked this entity against what it claims and found it holds; only the act of checking writes it, never an edit to the entity"},"wants":{"component":true,"type":"object","edge":"wants","reversed":"wanted by","properties":{},"description":"edge tag: this entity wants that one"},"worked":{"component":true,"type":"object","edge":"worked","reversed":"worked on by","properties":{},"description":"edge tag: this entity worked on that one"},"pending":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it began awaiting confirmation"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who requested confirmation"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write was made through — the session or client it came in on"}},"description":"Awaiting its first successful answer or confirmation."},"interrupted":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it was found broken"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who found it broken — kept as history when that entity is deleted"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write came in through — the session or client that made it"},"code":{"type":"string","description":"why the work was interrupted: transport, restart, superseded or a signal"}},"description":"A request or call was cut off before it finished. Removing the mark allows a deliberate retry; its code records why it was interrupted."}},"package":"@yaks/kernel","description":"Shared identity, marks and relationship components for graphs of work, with vocabulary documents, a completion plugin, citation helpers and a comment tool."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/names":true,"https://yak.sh/vocab/kernel":true},"title":"persona","$defs":{"person":{"component":true,"type":"object","kind":true,"before":["alias","doc","email"],"prefix":"U","by_name":true,"properties":{},"description":"a human being, as this graph knows them"}},"package":"@yaks/persona","description":"Who is acting and what they are responsible for — the people a graph knows, the personas an agent runs with, the roles those personas are assigned to, and a persona rendered as one markdown document."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/edge":true},"title":"edge","$defs":{"edge":{"component":true,"type":"object","kind":true,"description":"a link between two entities; the kind of link is named by a second component stored beside this one","properties":{"from":{"type":"string","ref":"entity","death":"cascade","description":"the entity the link leads away from"},"to":{"type":"string","ref":"entity","death":"cascade","description":"the entity the link arrives at"},"ord":{"type":"number","description":"the link's position among the other links of its relation, for relations where order matters"}}}},"package":"@yaks/edge","description":"Creates directed links as graph entities with content-derived eids, validates writes, and follows links through storage reads and SQL queries."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/key":true},"title":"key","$defs":{"key":{"component":true,"type":"object","kind":true,"description":"a value that identifies an entity; a second component beside it tags which kind of value it is","properties":{"of":{"type":"string","ref":"entity","death":"release","description":"the entity the value identifies; the row is removed when that entity is deleted, which frees the value"},"value":{"type":"string","description":"the value itself; unique within its kind, because the key's own id is derived from the kind and the value"}}}},"package":"@yaks/key","description":"Represents an entity's identifying values as separate graph entities, with ids derived from each value and its kind to enforce uniqueness."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/key":true},"title":"alias","$defs":{"alias":{"component":true,"type":"object","key":true,"description":"the kind of key whose value is a name: a stable name for an entity, unique in the store and accepted wherever an eid is. Write it as alias{name} on the entity itself — `{entity: {eid: '$r'}, alias: {name: 'recipe:lemon-cakes'}, doc: {…}}` — and the key entity is created for you; write the same name again and it resolves to the same entity","properties":{}}},"package":"@yaks/alias","description":"Assigns persistent, unique names to graph entities and resolves those names wherever an entity id is accepted."},{"title":"wake","$defs":{"wake":{"component":true,"type":"object","kind":true,"prefix":"W","description":"a scheduled time to come back to something","$comment":"A wake carries no patch to apply when it fires: a rule's produce already writes the entity it matched. Patching a wake's target declaratively would need a rule that names that target.","properties":{"at":{"type":"string","format":"date-time","index":true,"description":"when it is next due; absent once a one-shot has fired, or once a recurrence has ended"},"target":{"type":"string","ref":"entity","death":"cascade","description":"what the wake is about; when absent, the entity carrying it"},"note":{"type":"string","description":"a line for whoever is woken: why the wake was set"},"every":{"type":"string","description":"how it recurs: a duration (30m, 2h, 1d), five cron fields (0 9 * * 1-5), or @hourly/@daily/@weekly/@monthly; a cron line may end with an IANA time zone (0 9 * * 1-5 America/New_York), otherwise UTC"},"while":{"type":"array","description":"how it recurs while something holds: {match, every} in order, a query over the whole store and the cadence it asks for; at each firing the first whose query finds anything sets the next instant, else every does, and with neither the wake sleeps until a write makes one hold","items":{"type":"object","properties":{"match":{"type":"string","format":"query","description":"holds while this query finds anything"},"every":{"type":"string","description":"the cadence while it holds, written as wake.every is"}},"required":["match","every"]}}}},"fired":{"component":true,"type":"object","description":"when a wake last fired","properties":{"at":{"type":"string","format":"date-time","description":"the instant it fired"}}}},"package":"@yaks/wake","description":"Stores one-shot and recurring schedules as graph components, marking due wakes as fired and advancing their next scheduled times."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/blob":true},"title":"doc","$defs":{"doc":{"component":true,"type":"object","kind":true,"description":"the text a person reads: a title and a body","properties":{"title":{"type":"string","search":true,"description":"the one line an entity is known by"},"body":{"type":"string","store":"blob","search":true,"description":"the prose, as markdown — content-addressed when @yaks/blob is composed in, plain text otherwise"}}}},"package":"@yaks/doc","description":"A shared doc component for an entity's title and Markdown body, with portable views for displaying both."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/member":true},"title":"draft","$defs":{"draft":{"component":true,"type":"object","embed":false,"description":"what a person has typed in one place and not yet sent, on an entity whose eid is derived from the person and the place (draftEid), so every interface they use finds the same one; sending it or discarding it empties its text","properties":{"by":{"type":"string","ref":"entity","death":"keep","description":"the person typing it"},"place":{"type":"string","description":"where it is typed, as its interface names it: `<eid>.comment`, `edit:<eid>:doc.title`, `search`"},"text":{"type":"string","description":"what is typed; empty once it is sent or discarded"},"rev":{"type":"integer","stamped":true,"description":"how many writes of its text the store has taken, so an interface tells the newer text from the older"}},"personal":"by"},"typed":{"component":true,"type":"object","durable":"0s","description":"an event beside a draft's text: the text it was typed over, so the store keeps what another interface wrote meanwhile","properties":{"over":{"type":"string","description":"the text the writer last heard from the store"}}}},"package":"@yaks/draft","description":"What a person has typed and not yet sent, kept in the graph per person and place, synced to every interface they use, and merged when two type at once."},{"title":"member","$defs":{"member":{"component":true,"type":"object","kind":true,"description":"one person's membership in a space","properties":{"space":{"type":"string","ref":"entity","death":"cascade","description":"the space they belong to"},"person":{"type":"string","ref":"entity","death":"cascade","description":"the person the membership is for"},"role":{"type":"string","enum":["owner","member"],"default":"member","description":"owner runs the space and holds owner permission on every app in it; member belongs and holds only what a grant gives them"}}},"grant":{"component":true,"type":"object","kind":true,"description":"what one principal is permitted to do with one app","properties":{"app":{"type":"string","ref":"entity","death":"cascade","description":"the app the grant is on"},"person":{"type":"string","ref":"entity","death":"cascade","description":"the person it is for — absent on a share link, which names a token instead"},"token":{"type":"string","description":"an unguessable secret standing in for a person: whoever opens the link acts as this grant"},"access":{"type":"string","enum":["owner","editor","viewer"],"default":"viewer","description":"owner shares and deletes, editor writes, viewer reads"}}},"access":{"component":true,"type":"object","description":"what an app allows everyone who has no grant on it","properties":{"mode":{"type":"string","enum":["public","open","private"],"default":"public","description":"public: anyone reads. open: anyone reads and writes. private: only those with a permission see it."}}},"_pace":{"component":true,"type":"object","wire":false,"sync":"none","description":"The last accepted write of each paced component through each instrument on this entity; maintained by the write guard in the value's transaction.","properties":{"writes":{"type":"array","stamped":true,"description":"Independent component and via clocks, read whole; a null via pools writers carrying no instrument.","items":{"type":"object","required":["comp","via","at"],"properties":{"comp":{"type":"string"},"via":{"type":["string","null"]},"at":{"type":"number"}}}}}}},"package":"@yaks/member","description":"Access control for a graph: space membership, per-app permission grants, and access modes, with the checks that enforce them on reads and writes."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/edge":true,"https://yak.sh/vocab/blob":true,"https://yak.sh/vocab/kernel":true},"title":"task","$defs":{"cancelled":{"component":true,"type":"object","description":"the mark on a task that was called off","properties":{"at":{"type":"string","format":"date-time","description":"when it was called off","stamped":true},"by":{"type":"string","ref":"entity","death":"keep","description":"who called it off — kept as history when that entity is deleted","stamped":true},"reason":{"type":"string","description":"why it was called off"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write came in through — the session or client that made it"}}},"contains":{"component":true,"type":"object","edge":"contains","reversed":"contained by","description":"that task is part of this one","properties":{}},"requires":{"component":true,"type":"object","edge":"requires","reversed":"required by","description":"this task waits for that one","properties":{}},"task":{"component":true,"type":"object","kind":true,"before":["claim","doc"],"prefix":"T","governed":true,"description":"a thing to do","status":{"cancelled":"cancelled","completed":"done","default":"open"},"properties":{}}},"package":"@yaks/task","description":"Task components for a graph: a status computed from marks instead of stored, dependency counts, and completion attribution."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/names":true,"https://yak.sh/vocab/kernel":true},"title":"project","$defs":{"filed":{"component":true,"type":"object","description":"optional portfolio filing, separate from being a task; a project filed under another project is its sub-project","properties":{"priority":{"type":"number","format":"priority","description":"queue order — lower is more urgent"},"project":{"type":"string","ref":"project","death":"detach","description":"what it is filed under, which for a project is its parent; deleting the project frees what was filed under it rather than taking it along"},"assignee":{"type":"string","ref":"entity","death":"detach","description":"whose queue this task is filed in"},"domain":{"type":"string","well":"domains","description":"the work area this task is filed in"}}},"project":{"component":true,"type":"object","kind":true,"before":["board","email","role"],"prefix":"P","by_name":true,"description":"something tasks are grouped under; filed under another project, it is that project's sub-project","properties":{"color":{"type":"string"}}}},"package":"@yaks/project","description":"A portfolio: the projects work is filed under, the boards that are saved filters over it, the ventures being built, and where a project lands its source."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/edge":true},"title":"goal","$defs":{"satisfies":{"component":true,"type":"object","edge":"satisfies","reversed":"satisfied by","properties":{},"description":"the relation on a link: doing this served that purpose"}},"package":"@yaks/goal","description":"A standing purpose that work satisfies, and the link recording which work satisfied it."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/edge":true},"title":"dreaming","$defs":{"recalled":{"component":true,"type":"object","edge":"recalled","reversed":"recalled by","properties":{"source":{"type":"string","ref":"entry","death":"keep"},"at":{"type":"string","format":"date-time"}},"description":"an edge relation: this entry recalled that entity, at this time"}},"package":"@yaks/dreaming","description":"Standing intentions filed under a project, which @yaks/builders builds on a schedule, a record of how often each memory has been recalled, and the `.order=hot` ranking that record decays along."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true},"title":"notify","$defs":{"subscription":{"component":true,"type":"object","kind":true,"unique":[["actor","target"]],"properties":{"actor":{"type":"string","ref":"entity","death":"cascade"},"target":{"type":"string","ref":"entity","death":"cascade"},"mode":{"type":"string","enum":["watch","mute"],"description":"watch: notify this actor. mute: do not"}},"description":"one actor’s attention to one entity; mode watches or mutes it, and archived/opened marks on this row record putting away or reading its thread"}},"package":"@yaks/notify","description":"How somebody is notified: a knock aimed at an entity, what they watch or mute, and an open conversation."},{"title":"mail","$defs":{"mail":{"component":true,"type":"object","kind":true,"before":["doc"],"prefix":"E","description":"one letter's envelope, sent or received","properties":{"from":{"type":"string","description":"the address it came from","examples":["ann@example.com"]},"to":{"type":"string","description":"the address it is written to — absent when `deliver.to` names the recipient as an entity instead","examples":["bob@example.com"]},"at":{"type":"string","format":"date-time","description":"when it was written, or when it arrived"},"target":{"type":"string","ref":"entity","death":"keep","description":"the entity this letter is about — any entity at all, so correspondence hangs off the thing it concerns"},"reply_to":{"type":"string","ref":"mail","death":"keep","description":"the letter this one answers"},"message_id":{"type":"string","description":"the Message-ID other mail systems know this letter by — read from a letter that arrived, or returned by the sender for one that left — and what a reply threads on"},"verified":{"type":"boolean","description":"whether the sending domain signed for this letter (DKIM) — false is recorded, never dropped: a letter nobody signed for is still a letter, and the reader is the one who decides what to trust"},"in_reply_to":{"type":"string","description":"the Message-ID this letter answers, exactly as the header wrote it — what arrives before `reply_to` can name an entity, and all a reply to a letter nobody kept ever has"},"reply_address":{"type":"string","description":"where an answer to a letter that arrived goes, from its `Reply-To:` header — absent when the header was, and then an answer goes to `from`","examples":["ana@example.com"]}}},"email":{"component":true,"type":"object","kind":true,"prefix":"A","description":"an address, as an entity — what a person is reachable at","properties":{"address":{"type":"string","description":"the address itself, canonical (see canon)"}}},"deliver":{"component":true,"type":"object","description":"who a letter is for, as an entity in your graph","properties":{"to":{"type":"string","ref":"entity","death":"keep","description":"the recipient — their address is looked up when the letter goes out"},"waiting":{"type":"string","stamped":true,"description":"why an outbound letter cannot reach a sender yet; cleared before it is handed over"},"tried":{"type":"string","format":"date-time","stamped":true,"description":"when the letter was handed to the sender — one with this and no outcome may have left, so it is never handed over again"}}},"delivered":{"component":true,"type":"object","description":"the letter left: half of the outcome pair","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it went"}}},"bounced":{"component":true,"type":"object","description":"the letter did not leave: the other half","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when the attempt failed"},"reason":{"type":"string","stamped":true,"description":"what went wrong, as the sender reported it"}}},"notified":{"component":true,"type":"object","description":"a recipient was told about something","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when they were told"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who told them"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what carried it"}}},"mail_show":{"tool":true,"noun":"mail","verb":"show","title":"Read a mail message","description":"Return one mail message in full: its headers, its body, and one-line summaries of the rest of its thread, with this message marked. The text is returned in content.body alongside the opened mark. Reading marks the caller's subscription to the thread opened, which is why this tool writes where graph_show only reads.","input":{"letter":{"type":"string","ref":"mail","description":"the message to read; pass its id or registered name"}},"required":["letter"],"idempotent":true,"positional":["letter"]},"mail_reply":{"tool":true,"noun":"mail","verb":"reply","title":"Reply to a mail message","description":"Write a reply threaded on one message and request that it be sent. It is addressed to the other side of the original (the sender of a received message, or the recipient of one you sent) from the address the original used, with the subject prefixed `Re:`. Replying to a received message archives the caller's subscription to its thread: a thread you have answered is not waiting on you. The configured sender delivers it; a graph with no sender configured records the reply and never sends it. Returns the applied bundles: JSON objects with entity ids and the components (named groups of fields) written or removed. Confirm the recipient and message before requesting delivery; a sent email cannot be recalled.","input":{"letter":{"type":"string","ref":"mail","description":"the message being replied to; pass its id or registered name"},"body":{"type":"string","description":"the text of the reply","short":"b"}},"required":["letter","body"],"openWorld":true,"positional":["letter","body"]},"mail_send":{"tool":true,"noun":"mail","verb":"send","title":"Send a mail message","description":"Create a mail message and request that it be sent. It sends from an address this graph holds, through the graph’s own sender, and never from a person’s own mail account: asked to email someone with nothing here named, use whatever mail tool the person has connected. `to` is an email address or the id of an entity in this graph; an address nobody in the graph has becomes a new `email` entity, so the address book grows as mail is sent. `from` defaults to the email address of the entity it is `about`, such as a project’s own, so the answer comes back to that entity; otherwise to the caller’s own email address. Without a configured sender, the message is recorded but not sent. A configured sender delivers it asynchronously and writes `delivered` or `bounced` onto the message. Returns the applied bundles: JSON objects with entity ids and the components (named groups of fields) written or removed. Confirm the recipient and message before requesting delivery; a sent email cannot be recalled. The initial result is not a delivery receipt; read the message again to check its outcome.","input":{"to":{"type":"string","description":"an email address, or the id of the entity it is for"},"subject":{"type":"string","description":"the subject line"},"body":{"type":"string","description":"the text of the message","short":"b"},"from":{"type":"string","description":"the address it is sent from (default: the address of what it is about, else the caller’s own)"},"about":{"type":"string","ref":"entity","description":"the entity this message is about, so the correspondence is attached to it; pass its id or registered name"}},"required":["to","subject","body"],"openWorld":true,"positional":["to","subject"]},"mail_check":{"tool":true,"noun":"mail","verb":"check","title":"Check the mail","description":"Check that every received mail message has a sender. Also reports incomplete configuration for a sender this server has configured. A message with a Message-ID but no `from` can never be answered, since a reply has no address to go to. Takes no arguments. Returns a report in content.body, with warning or failure findings when present; it does not repair the records or configuration.","input":{},"readOnly":true},"mail_post":{"effect":true,"created":["mail","deliver"],"sweep":".mail&.deliver&!delivered&!bounced&!deliver.tried","tries":6,"description":"hand an outbound letter to the sender and record its outcome. A send the sender knows never left is tried again. The sweep replays the letters still owed, so one written while no sender could run is sent by the first process that can"}},"package":"@yaks/mail","description":"Represents letters and their delivery outcomes as graph components, sends them through a sender the caller supplies, and converts arrivals to bundles."},{"title":"invocation","$defs":{"call":{"component":true,"type":"object","description":"A recorded tool invocation.","properties":{"to":{"type":"string","ref":"tool","death":"keep","description":"the tool entity called"},"id":{"type":"string","description":"the provider's id for it, echoed in the result"},"args":{"type":"object","description":"its arguments: the object the tool's input schema describes"},"source":{"type":"string","ref":"entity","death":"keep","description":"optional: the request or other entity this call came from"},"actor":{"type":"object","stamped":true,"description":"The by/via identity pair of whoever last changed the executable request. Server-owned; an empty pair means automation. When absent, the creation author still owns the request."}}},"result":{"component":true,"embed":false,"type":"object","description":"What a tool returned, and how long the call took.","properties":{"ms":{"type":"number","description":"how long the tool took, in milliseconds"},"call":{"type":"string","ref":"call","death":"keep","description":"the call it is the result of"}}},"content":{"component":true,"type":"object","description":"Text content.","properties":{"body":{"type":"string","store":"blob"}}},"output":{"component":true,"type":"object","description":"What produced the text beside it: the request, for a model’s own output, or the call whose failure is being reported. Only output carries it — text a person or a system wrote has none.","properties":{"source":{"type":"string","ref":"entity","death":"keep","description":"the entry that produced it"},"id":{"type":"string","description":"the provider's id for this piece of output, as `call.id` is its id for the call — what a later revision of the same item is matched on"},"value":{"type":"object","description":"the same output as data, for a reader that parses rather than reads: a tool that declares an outputSchema answers its structured content here, beside the text a person reads"}}},"refusal":{"component":true,"type":"object","description":"A deliberate no: the tool or provider refused the request. Never tracked; its prose is on the content component beside it.","properties":{"code":{"type":"string","description":"the tool or provider's reason for refusing"}}},"execution":{"component":true,"type":"object","description":"Who holds a recorded tool invocation; its state is computed from the interruption mark and explicitly named answers.","properties":{"state":{"type":"string","enum":["running","done","failed","interrupted"],"description":"The lifecycle derived from its interruption mark, holder and recorded answers.","computed":true},"by":{"type":"string","ref":"entity","death":"keep","description":"the server or process running it"}}},"tool":{"component":true,"type":"object","kind":true,"description":"A registered tool that callers can invoke.","properties":{"name":{"type":"string","identity":true,"description":"what callers call it; the entity id is derived from it"},"description":{"type":"string"},"revision":{"type":"string","description":"implementation revision used by builders to detect changed code"}}},"call_ready":{"effect":true,"match":"$call .call, !execution, !results, !wake; +result.call=$call","description":"a call nobody has claimed and nobody scheduled: run the tool it names and attach the result. A call written already claimed (the caller runs it) owes nothing"},"call_woken":{"effect":true,"match":"$call .call, .wake, .fired, !results; +result.call=$call","description":"a scheduled call whose wake has fired and that nobody has run yet: run it now. Never matches in a graph that does not load the wake components, where `call_ready` alone applies and every call is due when it is written"},"finding":{"component":true,"type":"object","description":"What a check measured: fail for a violated contract, warn for a leak or a verdict it could not establish.","properties":{"level":{"type":"string","enum":["fail","warn"]}}}},"package":"@yaks/tools","description":"Executes recorded graph tool calls and keeps their answers, duration, and execution state; parses app-declared commands and provides their HTTP route and answer rendering."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/blob":true},"title":"hook","$defs":{"hook":{"component":true,"type":"object","kind":true,"before":["doc"],"prefix":"H","properties":{"source":{"type":"string","stamped":true,"description":"who sent it"},"event":{"type":"string","stamped":true,"description":"the event name the sender gave it"},"payload":{"type":"string","store":"blob","stamped":true,"description":"the body exactly as delivered"},"method":{"type":"string","stamped":true,"description":"the HTTP method it arrived by"},"path":{"type":"string","stamped":true,"description":"the path it arrived on"},"headers":{"type":"string","store":"blob","stamped":true,"description":"the headers, as sent"},"verified":{"type":"boolean","stamped":true,"description":"whether the sender's signature verified — the same property name @yaks/mail uses in `mail.verified`"}},"description":"an event another system delivered, kept as it arrived — the payload is the body that was sent, not a parsed version of it"}},"package":"@yaks/hook","description":"An event another system delivered, kept as it arrived: the payload, the route it came in on, and whether it was signed."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/blob":true,"https://yak.sh/vocab/kernel":true},"title":"session","$defs":{"ask":{"component":true,"type":"object","description":"the model was asked here, from the prefix ending at `through`; what the provider keeps about it is stored in that provider's own component beside this one","properties":{"to":{"type":"string","ref":"model","death":"keep","description":"the model entity asked"},"through":{"type":"string","ref":"entry","death":"keep","description":"the last entry of the prefix it was asked with"}}},"attempt":{"component":true,"description":"A provider request held while in flight; its state is computed from the holder and interruption mark. An unfinished dispatched request is ambiguous on restart.","properties":{"state":{"type":"string","enum":["inflight","completed","interrupted"],"index":true,"description":"The lifecycle derived from its interruption mark, holder and recorded answers.","computed":true},"by":{"type":"string","ref":"entity","death":"keep","description":"the process or server holding the provider request"}}},"cancel":{"component":true,"type":"object","properties":{"target":{"type":"string","ref":"entity","death":"keep"}},"description":"an entry that withdraws an earlier one"},"dispatch":{"component":true,"type":"object","description":"a child's place under the concurrency bound; settling removes it","properties":{"state":{"type":"string","description":"Legacy compatibility during the dispatch marks expansion; removed after the deferred cutover."},"args":{"type":"string"},"order":{"type":"number"}},"status":{"waiting":"waiting","admitted":"active","default":"queued"}},"entry":{"component":true,"type":"object","kind":true,"lazy":true,"unique":[["session","seq"]],"description":"one entry of a transcript; the component stored beside it is its kind","search":["content.body"],"properties":{"session":{"type":"string","ref":"session","death":"cascade","description":"the transcript it belongs to"},"seq":{"type":"number","description":"Positive integer position; omit on append to allocate atomically. Explicit fractional or occupied positions are refused."}}},"imported":{"component":true,"type":"object","properties":{"source":{"type":"string","stamped":true},"line":{"type":"number","stamped":true}},"description":"an entry imported from somewhere else — which source, and which line of it"},"notice":{"component":true,"type":"object","description":"passive transcript context, included in the next ask without requesting one","properties":{"child":{"type":"string","ref":"session","death":"keep"},"task":{"type":"string","description":"the task that prompted this notice"}}},"session":{"component":true,"type":"object","kind":true,"before":["process"],"prefix":"S","description":"a transcript something reacts to. Its chosen persona is kept here; what it is doing is read off its entries (`status`), where it runs is @yaks/process `process`, and what it was asked for is the `using` on its first entry","properties":{"id":{"type":"string","description":"the runner’s own id for it"},"actor":{"type":"string","ref":"entity","death":"detach","description":"who it speaks as — the identity that survives a /clear, where `created.via` is the run"},"source":{"type":"string","ref":"entity","death":"keep","description":"the request that opened this transcript, when it has one"},"persona":{"type":"string","ref":"persona","death":"keep","description":"the instructions chosen when this session began"},"log":{"type":"string","ref":"log","death":"detach","stamped":true,"description":"the log it was first read from, whose entries are named by session and line alone; an entry of any other log also names the file"},"operator":{"type":"boolean","description":"true for a transcript opened and driven by a person; false for an agent or automated opening, even if a person later replies"},"ended":{"type":"boolean","description":"the caller observed the outside harness end this session; equivalent to a stop entry and cleared if that harness resumes it"},"standing":{"type":"string","stamped":true,"description":"a long-running session: recorded here rather than ended when its work is done"},"status":{"type":"string","enum":["empty","pending","running","settled","stopped","failed","queued"],"computed":true,"reads":["entry.session","session.ended","dispatch","admitted","waiting"],"description":"what the newest entry implies: pending is waiting on the model, running is waiting on an answer, settled has nothing to do"},"cost":{"type":"number","computed":true,"reads":["entry.session","cost.dollars"],"description":"the dollars its entries' `cost` records, summed; absent where none records any"}}},"stop":{"component":true,"type":"object","description":"on an entry, a marker ending the transcript; on a managed session, a request to stop its process","properties":{}},"using":{"component":true,"type":"object","description":"provider, model and effort: on an input it sets or switches them, on an ask it records what was served","properties":{"provider":{"type":"string","ref":"provider","death":"keep","description":"the provider asked — kept as history when that entity is deleted, so a past ask still records what answered it"},"model":{"type":"string","ref":"model","death":"keep","description":"the model asked — kept as history when that entity is deleted, so a past ask still records what answered it"},"effort":{"type":"string"},"input":{"type":"object","description":"explicit model-native inputs, such as lyrics or duration; validated by the provider, never inferred from the prompt"},"instructions":{"type":"string","description":"system instructions in force for this transcript"},"window":{"type":"integer","description":"how many of the transcript's newest entries a turn sends the model, reaching back to the input that began the turn they cut into; the whole transcript where absent"},"tools":{"type":"array","items":{"type":"string"},"description":"the tools a turn is offered, by name: exactly these, from every tool the runner can run; the runner's own set where absent"}}},"session_run":{"effect":true,"created":["using","attention","cancel","stop","completed","cancelled","admitted"],"changed":["dispatch.state","inference.receipt"],"removed":["edge"],"target":".entry|.session|.task|.requires|.contains","sweep":".session.status=pending,running,queued (.entries.using|.entries.ask)|.dispatch.status=active,queued,waiting","tries":8,"description":"run a transcript until it has nothing more to do: a `using` on an entry asks for a turn, a cancel withdraws the request in flight, a stop ends it (and gives up a child's place), a child is admitted, or a task a transcript holds completes, is cancelled or loses a dependency (a `requires` or `contains` link going, read by the ends it had). A model request the provider failed but may yet answer is asked again after the pool's backoff, eight tries in a row at most"}},"package":"@yaks/session","description":"Represents sessions as graph transcripts, derives status from their entries, manages claims, and runs a transcript wherever its effects are worked."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/names":true,"https://yak.sh/vocab/edge":true},"title":"model","$defs":{"submitted":{"component":true,"type":"object","wire":false,"journal":false,"description":"the original model ask was submitted for a paid generation; an uncertain acknowledgement still counts as submitted","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"recorded before the paid request, guarded against any prior submission"}}},"model":{"component":true,"type":"object","kind":true,"prefix":"O","by_name":true,"description":"a model, whoever serves it","properties":{"name":{"type":"string","identity":true,"description":"the model's own name; the entity id is derived from it"},"vendor":{"type":"string"},"grade":{"type":"string","enum":["frontier","mid","small"]},"label":{"type":"string"},"modalities":{"type":"array","items":{"type":"string","enum":["text","image","audio"]},"uniqueItems":true,"description":"the outputs requested when this model is asked"},"efforts":{"type":"string"},"effort":{"type":"string","description":"the reasoning effort requested, unless a session overrides it"},"context":{"type":"integer","minimum":1,"description":"the model's context window, in tokens: the most one request holds, its input and reply together; read from its provider's catalog, or set by hand. A transcript is compacted at a share of it"},"offered":{"type":"boolean"},"enforced":{"type":"integer","minimum":1,"stamped":true,"description":"the token ceiling explicitly enforced by a provider refusal, separate from the configured context window; compaction uses the smaller of them"}}},"usage":{"component":true,"type":"object","description":"provider-reported token counts for one completed model request, stored on the entry for that request; not cumulative, and not an estimate of current context size","properties":{"input_tokens":{"type":"integer","description":"input context tokens, including cached tokens"},"output_tokens":{"type":"integer","description":"generated tokens, including reasoning tokens"},"total_tokens":{"type":"integer","description":"total input and output tokens reported by the provider"},"cached_tokens":{"type":"integer","description":"input tokens read from the provider cache; not a guarantee of future cache availability"},"reasoning_tokens":{"type":"integer","description":"reasoning tokens within output tokens"}}},"cost":{"component":true,"type":"object","description":"what one model request or tool call cost, in dollars, on the entity that spent it: a request's entry beside its `usage`, or a call","properties":{"dollars":{"type":"number"},"reported":{"type":"boolean","description":"true when the provider reported the dollars; false when they were weighed from the model's `price`"}}},"questions":{"component":true,"type":"object","description":"typed questions about the transcript, asked with the next request and answered by one `answer` entry each rather than in prose","properties":{"asked":{"type":"object","description":"each question by its name, in Jev's terms: {type: noul, choice or score, instructions, criteria}"}}},"answer":{"component":true,"type":"object","description":"a model's answer to one typed question, in the terms it was asked in","properties":{"question":{"type":"string","description":"the name of the question it answers"},"noul":{"type":"number","description":"for a noul, the probability that it holds"},"choice":{"type":"string","description":"for a choice, the option chosen"},"score":{"type":"number","description":"for a score, where along its criteria the answer falls"},"confidence":{"type":"number","description":"how sure the model is of a choice or a score, from 0 to 1"},"probabilities":{"type":"object","description":"each option's probability, by the option's name or place"}}},"inference":{"component":true,"type":"object","wire":false,"sync":"none","journal":false,"description":"the pinned executor and private frozen request and completed receipt references for the original model ask","properties":{"executor":{"type":"string","description":"the independently deployed executor release that accepted this ask"},"request":{"type":"string","description":"private frozen request object reference"},"receipt":{"type":"string","description":"private completed receipt object reference; absent while pending"}}}},"package":"@yaks/model","description":"Defines provider-neutral model request and reply types, vocabulary for providers and models, and helpers for billing and recovering generated media. Implements no transport."},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"artifact","$defs":{"artifact":{"component":true,"type":"object","description":"Bytes stored in the configured blob store: their SHA-256 address, media type and size.","properties":{"size":{"type":"number"},"address":{"type":"string"},"media_type":{"type":"string"}}},"representation":{"component":true,"wire":false,"type":"object","description":"Immutable HTTP headers for one use of content-addressed bytes.","required":["scope","address","media_type"],"properties":{"scope":{"type":"string","stamped":true},"address":{"type":"string","stamped":true},"media_type":{"type":"string","stamped":true},"name":{"type":"string","stamped":true}}}},"package":"@yaks/blob","description":"Stores text and binary content under SHA-256 addresses, with transparent graph text reads and writes, verified artifacts and HTTP responses."},{"title":"openai","$defs":{"openai":{"component":true,"type":"object","description":"what the Responses API keeps about an ask: the reply's id, which anchors a later request when the provider stored it","properties":{"response_id":{"type":"string"},"cache_expires_at":{"type":"string","format":"date-time","description":"the recorded expiry of this request’s cached prefix; provider-reported where present, otherwise request start plus documented provider retention. Missing means unknown, not warm"}}}},"package":"@yaks/openai","description":"Implements the model interface over OpenAI's streaming Responses API using fetch, with API-key or Codex sign-in authentication."},{"title":"openrouter","$defs":{"openrouter":{"component":true,"description":"OpenRouter response metadata; not a server-side continuation handle.","properties":{"response_id":{"type":"string"},"cache_expires_at":{"type":"string","format":"date-time","description":"the recorded expiry of this request’s cached prefix; provider-reported where present, otherwise request start plus documented provider retention. Missing means unknown, not warm"}}}},"package":"@yaks/openrouter","description":"Implements the model interface over OpenRouter's streaming Responses API, reusing the portable transport from @yaks/openai without its credentials or native tools."},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"builders","$defs":{"builder":{"component":true,"type":"object","kind":true,"properties":{"query":{"type":"string","description":"query whose outer bindings each name a build"},"to":{"type":"string","ref":"tool","death":"keep","description":"registered tool called for each changed binding"},"floor":{"type":"string","format":"date-time","description":"earliest a scheduled reconciliation may run"},"immediate":{"type":"boolean","description":"reconcile when selected graph inputs change"},"wiring":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"string","minLength":1}},"description":"output slot -> component.property -> sibling output slot; fills writable references before admission, overriding tool values"},"definition":{"type":"string","stamped":true,"description":"fingerprint of the current template, effective using, wiring, tool and its revision; definition edits never invalidate outputs"}},"description":"a query-to-tool transformation; content.body is its optional $var template and using chooses a model"},"staged":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it was staged"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who staged it"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write was made through"}},"description":"A builder being tried on a few bindings: only `builder build` builds it. Removing the mark builds the rest once, and a binding already built under the same key is not asked again."},"builder_dep":{"component":true,"type":"object","wire":false,"identity":["builder","source"],"properties":{"builder":{"type":"string","ref":"builder","death":"cascade"},"source":{"type":"string","index":true,"description":"component:name or entity:eid read by an immediate builder"},"version":{"type":"string","stamped":true,"description":"compare-and-set token for one dependency replacement"}}},"build":{"component":true,"type":"object","properties":{"builder":{"type":"string","ref":"builder","death":"keep"},"match":{"type":"string","description":"JSON outer entity-ID tuple; with the builder and variant, what the build's `build_of` key says"},"variant":{"type":"string"},"for":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"the entity it was built for: the first its outer binding holds, so a query reaches what was built for X (`.built.build.build.for=X`), which `match` as JSON cannot"},"key":{"type":"string","stamped":true,"description":"opaque attempt key shared with its outputs; inputs select work, and an explicit reroll gets a fresh key"},"call":{"type":"string","ref":"call","death":"keep","stamped":true,"description":"latest call for this key"},"stale":{"type":"boolean","stamped":true,"description":"outer binding no longer matches"},"cost":{"type":"number","computed":true,"reads":["call.source","session.source","entry.session","cost.dollars"],"description":"the dollars its calls spent, summed: each call's own `cost` and the entries of each session a call opened; absent where none records any"},"inputs":{"type":"string","stamped":true,"description":"fingerprint of the selected binding tree, independent of the builder definition"},"definition":{"type":"string","stamped":true,"description":"definition fingerprint used by the latest attempt; retained across definition edits"},"outdated":{"type":"boolean","computed":true,"reads":["build.builder","build.definition","builder.definition"],"description":"the latest attempt used a different definition from the builder now; not a vanished binding and not a reason to build automatically"}},"description":"one stable instance of a builder for an outer query binding"},"build_of":{"component":true,"type":"object","key":true,"description":"the key a build is found by: `<builder>/<variant>/<match>`, so a rebuild lands on the build already there"},"output_of":{"component":true,"type":"object","key":true,"description":"the key of one take: <build>/<slot>/<call>, so replaying one answer keeps its entity and another answer adds a take"},"built":{"component":true,"type":"object","kind":true,"before":["doc"],"properties":{"build":{"type":"string","ref":"build","death":"keep"},"slot":{"type":"string"},"key":{"type":"string","stamped":true},"call":{"type":"string","ref":"call","death":"keep","stamped":true},"artifact":{"type":"string","ref":"artifact","death":"keep","stamped":true},"current":{"type":"boolean","computed":true,"reads":["built.build","built.key","built.inputs","chosen","build.key","build.inputs","build.stale"],"description":"chosen take whose binding still matches its inputs; readers keep playing it while a reroll with unchanged inputs is pending"},"definition":{"type":"string","stamped":true,"description":"definition fingerprint used to produce this output"},"inputs":{"type":"string","stamped":true,"description":"binding fingerprint that produced this take"}},"description":"one retained take in one named output slot; chosen marks the one in use"},"builder_model":{"tool":true,"revision":"3","noun":"builder","verb":"model","title":"Model builder adapter","description":"Open a model session for one frozen builder binding","surfaces":[],"input":{"binding":{"type":"object"},"key":{"type":"string"},"template":{"type":"string"},"using":{"type":"object"},"inputs":{"type":"string","description":"the frozen binding input fingerprint"},"definition":{"type":"string","description":"the frozen builder definition fingerprint"},"wiring":{"type":"object","description":"the frozen output recipe"}},"required":["binding","key"]},"builder_build":{"tool":true,"noun":"builder","verb":"build","title":"Build now","description":"Build bindings with new or changed inputs, independent of floor and staged. Current outputs are untouched unless --rebuild redoes every selected binding, or --outdated redoes bindings under an older definition. Both combine with --only and --limit. Alternate provider, model, template or native input creates a shadow variant.","input":{"builder":{"type":"string","ref":"builder","description":"id of the builder to build"},"provider":{"type":"string","ref":"provider","description":"the provider to ask instead of the configured one","short":"p"},"model":{"type":"string","ref":"model","description":"the model to build with instead of the configured one","short":"m"},"template":{"type":"string","description":"alternate content.body template for a shadow variant"},"input":{"type":"object","description":"native request fields merged into using.input for a shadow variant; --input @input.json reads an object"},"only":{"type":"array","items":{"type":"string","ref":"entity"},"description":"build only the bindings whose outer entities these name, and leave the other builds as they are"},"limit":{"type":"integer","minimum":1,"description":"build only the first n bindings, and leave the other builds as they are"},"rebuild":{"type":"boolean","description":"redo every selected binding, even with unchanged inputs and definition"},"outdated":{"type":"boolean","description":"redo selected bindings only when their definition is older; otherwise build only missing or changed inputs"}},"required":["builder"],"idempotent":false,"positional":["builder","only..."]},"builder_open":{"effect":true,"created":["builder"],"changed":["builder.floor"],"removed":["staged"],"sweep":".builder","description":"build a builder whose floor has passed, unless its key is built; removing its staged mark builds it too"},"builder_edit":{"effect":true,"changed":["builder.query","builder.to","builder.immediate","builder.wiring","content.body","using"],"description":"reconcile a builder after its definition changes"},"builder_ring":{"effect":true,"created":["fired"],"changed":["fired.at"],"description":"a wake fired on a builder: check whether it is due"},"builder_answer":{"effect":true,"created":["output"],"description":"validate a tool answer and write its named outputs"},"builder_model_answer":{"effect":true,"created":["attempt","refusal","interrupted","failed","completed"],"changed":["attempt.by"],"description":"adapt a model session's reply to a builder tool output once its ask completes"},"builder_supply":{"tool":true,"noun":"builder","verb":"supply","title":"Supply an existing artifact","description":"Answer one binding's slot with an existing artifact, spending nothing. The binding is current until its own inputs change. A staged builder accepts supply; an archived builder does not.","input":{"builder":{"type":"string","ref":"builder"},"for":{"type":"string","ref":"entity","description":"the first entity in exactly one outer binding"},"slot":{"type":"string","minLength":1},"artifact":{"type":"string","ref":"artifact"},"args":{"type":"object","description":"provenance kept beside the frozen binding on the supplied call"}},"required":["builder","for","slot","artifact"],"idempotent":true,"positional":["builder","for","slot","artifact"]},"chosen":{"component":true,"type":"object","properties":{"at":{"type":"string","format":"date-time","stamped":true,"description":"when it was chosen"},"by":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"who chose it"},"via":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"what the write was made through"}},"description":"the take in use for its build and slot; server-owned, changed through builder_choose, with at most one choice per slot","wire":false},"builder_choose":{"tool":true,"noun":"builder","verb":"choose","title":"Choose an output take","description":"Make one retained output the take in use for its build and slot, without a call or spending. Other slots stay chosen as they are.","input":{"output":{"type":"string","ref":"built","description":"output take to use"}},"required":["output"],"idempotent":true,"positional":["output"]}},"package":"@yaks/builders","description":"Build query-selected graph inputs into stable, named output entities."},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"effect","$defs":{"effect":{"component":true,"index":[["handler","state"]],"type":"object","journal":false,"description":"one run a commit owes, written in the commit's own transaction and claimed by whichever process runs it","properties":{"handler":{"type":"string","stamped":true,"description":"the declared effect it runs, by name"},"target":{"type":"string","ref":"entity","death":"keep","stamped":true,"description":"the entity the committed change was about"},"comp":{"type":"string","stamped":true,"description":"the component that changed"},"touched":{"type":"array","items":{"type":"string"},"stamped":true,"description":"components moved on the target by the same commit"},"before":{"type":"object","additionalProperties":true,"stamped":true,"description":"on a `removed` run, the component it is about as it was before the commit, by name, since the run cannot read it afterwards"},"kind":{"type":"string","enum":["created","changed","removed","matched","started"],"stamped":true,"description":"what happened to it, `matched` where a query matched it, or `started` where the target is a process that started working the effects"},"state":{"type":"string","enum":["pending","done","failed"],"stamped":true,"description":"how far the run got — pending until a worker settles it","index":true},"attempts":{"type":"number","stamped":true,"description":"how many times the handler has been started"},"at":{"type":"string","format":"date-time","stamped":true,"description":"when the run was recorded"},"generation":{"type":"number","stamped":true,"description":"how deep in effect-written batches the commit that owed it was: 0 for a client's write, 1 for an effect's own, so what this run writes is one more"},"error":{"type":"string","stamped":true,"description":"what the last attempt threw — kept beside a run left failed, so the record shows why"},"next":{"type":"string","format":"date-time","stamped":true,"description":"when the next attempt falls due; set means a failure that reported and is waiting out its backoff, absent means a run nobody has started or one in progress"},"lease_owner":{"type":"string","stamped":true,"description":"the process that claimed this run"},"lease_token":{"type":"string","stamped":true,"description":"that claim's token, fresh on every claim"},"lease_expiry":{"type":"string","format":"date-time","stamped":true,"description":"when the claim expires and another process may take it"}}},"lease":{"component":true,"type":"object","kind":true,"description":"a duty held by one process at a time — its eid is derived from `name`, so two processes reaching for the same duty address one row and the winner is settled by the graph's own precondition","properties":{"name":{"type":"string","description":"the duty being held — a sweep, a clock, a start-up pass; the eid is derived from it, so the same duty is the same row in every graph"},"holder":{"type":"string","ref":"entity","death":"detach","description":"the process running it — absent means nobody is, and the next process to ask gets it"},"until":{"type":"string","format":"date-time","description":"when the hold expires; a holder still working pushes this out on a timer, and one that was killed leaves a row that expires without anything having to clean up after it"}}},"provisional":{"component":true,"type":"object","description":"an entity whose asynchronous step has not finished yet: it sits where it always does, and the effect that finishes the step removes this mark. A reader who sees it knows the entity is not settled; the writer who started the step waits for it and never sees the mark","properties":{"note":{"type":"string","description":"a line for the person reading it: why the entity is provisional, such as \"saving the key\""}}}},"package":"@yaks/effects","description":"Runs application code after graph changes commit, with isolated failures, an optional pool for persisted runs, and leases for work held by one process."},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"rtc","$defs":{"rtc_lapse":{"effect":true,"created":["fired"],"active":".sfu","description":"Close the tracks of a Realtime session whose lease fired, then drop its row."},"rtc":{"component":true,"type":"object","sync":"peers","durable":"connection","pace":"200ms","description":"What this entity is saying out loud this moment: the Realtime session it publishes from, the tracks a listener asks for, and whether it is muted or talking. Relayed and kept by nobody, so it goes with the tab that wrote it, and a listener stops hearing it then.","properties":{"session":{"type":"string","description":"the Realtime session the tracks are published from"},"tracks":{"type":"array","items":{"type":"string"},"description":"the names of the tracks it publishes, each asked for as a remote track of the session"},"muted":{"type":"boolean","description":"its microphone is off"},"talking":{"type":"boolean","description":"its microphone hears a voice this moment"}}},"sfu":{"component":true,"type":"object","wire":false,"description":"A Realtime session this app's door opened, while its lease holds: the wake beside it is when the lease ends, and the session's tracks close when it does.","properties":{"session":{"type":"string","unique":true,"description":"the session's id at Cloudflare Realtime"},"key":{"type":"string","description":"the SHA-256 of the key the door handed whoever opened it, which every change to the session carries"}}}},"package":"@yaks/rtc","description":"Voice between pages over Cloudflare Realtime: a page joins a session, publishes its microphone and hears the tracks it asks for, and a host answers the door that keeps the secret, the sessions and the meter."},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/edge":true},"title":"relations","$defs":{"referenced":{"component":true,"type":"object","edge":true,"properties":{}}},"package":"yak/app"},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"exception","$defs":{"exception":{"component":true,"type":"object","description":"What was thrown, retained in an answer or transcript entry. The catcher reports the original failure to the tracker separately.","properties":{"type":{"type":"string","stamped":true,"description":"The thrown value’s class."},"value":{"type":"string","stamped":true,"description":"The thrown value’s message."}},"kind":true,"before":["doc"]}},"package":"yak/app"},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"kernel","$defs":{"error":{"component":true,"type":"object","kind":true,"before":["doc"],"properties":{"at":{"type":"string","format":"date-time","stamped":true},"message":{"type":"string","stamped":true},"code":{"type":"string"}}},"blob":{"component":true,"type":"object","properties":{"bytes":{"type":"number"}}},"attachment":{"component":true,"type":"object","kind":true,"before":["doc"],"properties":{"blob":{"type":"string","ref":"entity","death":"cascade"},"mime":{"type":"string"},"name":{"type":"string"},"artifact":{"type":"string","ref":"entity","death":"keep"},"call":{"type":"string"},"revised_prompt":{"type":"string"}}},"delete_upload":{"effect":true,"removed":["blob"],"description":"delete a deleted upload’s bytes once nothing names them"}},"package":"yak/app"},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"apps","$defs":{"product":{"component":true,"type":"object","kind":true,"before":["doc"],"properties":{"price_cents":{"type":"number"},"sizes":{"type":"string"},"stock":{"type":"number"},"image":{"type":"string","format":"uri"}}},"order":{"component":true,"type":"object","kind":true,"before":["doc"],"properties":{"session":{"type":"string","stamped":true},"intent":{"type":"string","stamped":true},"account":{"type":"string","stamped":true},"items":{"type":"string","stamped":true},"total_cents":{"type":"number","stamped":true},"fee_cents":{"type":"number","stamped":true},"email":{"type":"string","stamped":true},"status":{"type":"string","enum":["paid","partially_refunded","refunded","disputed","lost"],"stamped":true}}},"web":{"component":true,"type":"object","properties":{"url":{"type":"string","format":"uri"},"frozen_at":{"type":"string","format":"date-time","stamped":true}}}},"package":"yak/app"},{"$vocabulary":{"https://yak.sh/vocab/core":true},"title":"archetype","$defs":{"archetype":{"component":true,"type":"object","kind":true,"description":"Immutable component-table set; its eid is derivedEid('archetype|' + bytewise-sorted table names joined with ',').","properties":{"tables":{"type":"string","format":"json","description":"The canonical table-name list, encoded as a JSON array."}},"wire":false},"retired":{"component":true,"type":"object","description":"This archetype names a table that is no longer in the database file. Kept forever, never deleted.","wire":false}},"package":"yak/app"},{"reserved":false,"$defs":{"builder_install":{"effect":true,"start":true}},"package":"yak/app"},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/id":true,"https://yak.sh/vocab/names":true,"https://yak.sh/vocab/edge":true},"title":"model","$defs":{"provider":{"component":true,"type":"object","kind":true,"prefix":"Y","by_name":true,"description":"a service that runs models","properties":{"name":{"type":"string","identity":true,"description":"what the provider is called; the entity id is derived from it"},"transport":{"type":"string","enum":["process","http"]},"credential":{"type":"string"},"base":{"type":"string","format":"uri","description":"where a provider reached over HTTP answers: its root URL, without a path"},"api":{"type":"string","description":"the HTTP API it speaks, which names the code that reaches it: `ollama`, or `openai` for an OpenAI-compatible one"},"fallback":{"type":"boolean"},"context":{"type":"integer","minimum":1,"description":"the context window, in tokens, assumed for a model it serves whose own row names none"},"offered":{"type":"boolean"},"cache_retention":{"type":"integer","minimum":1,"description":"documented cached-prefix retention in seconds for this provider’s configured endpoint and models; used from request start only when the answer has no explicit expiry. Missing means unknown"}},"wire":false},"serves":{"component":true,"type":"object","edge":"serves","reversed":"served by","description":"an edge relation: this provider serves that model","properties":{"name":{"type":"string","description":"what the provider calls the model, sent as the model of every request it serves"}},"wire":false},"price":{"component":true,"type":"object","description":"what a model costs, in dollars per million tokens, on the model's own row; a request its provider reports no dollars for is weighed at it","properties":{"input":{"type":"number","description":"dollars per million input tokens"},"output":{"type":"number","description":"dollars per million output tokens, reasoning included"},"cached":{"type":"number","description":"dollars per million input tokens read from the provider cache; the input price where absent"}},"wire":false}},"package":"yak/models"},{"reserved":false,"$defs":{"models_install":{"effect":true,"start":true}},"package":"yak/models"},{"$defs":{"register_writes":{"effect":true,"created":["created","updated"],"changed":["updated"],"target":"(.created.via !created.by|.updated.via !updated.by)","description":"register this browser’s guest work for durable attribution"}},"package":"yak/attribution"},{"$vocabulary":{"https://yak.sh/vocab/core":true,"https://yak.sh/vocab/edge":true},"title":"vocab","$defs":{"_package":{"component":true,"type":"object","kind":true,"wire":false,"before":["doc"],"description":"a package whose vocabulary declares components or extends them. Its doc.title is its name, its doc.body its description","properties":{"name":{"type":"string","identity":true,"description":"the name it is published under"}}},"_comp":{"component":true,"type":"object","kind":true,"wire":false,"before":["doc"],"description":"a component a vocabulary declares: one aspect an entity carries. Its doc.title is its name, its doc.body its description","properties":{"name":{"type":"string","identity":true,"description":"the name a bundle writes it under"},"package":{"type":"string","ref":"_package","death":"cascade","description":"the package whose vocabulary declares it"},"kind":{"type":"boolean","description":"true = it names a display kind"},"wire":{"type":"boolean","description":"false = clients read it and never write it"},"embed":{"type":"boolean","description":"false = an entity wearing it is never embedded: no vector is made of it"},"computed":{"type":"boolean","description":"true = no table holds it: its entities are another package's rows, read and never written"},"sync":{"type":"string","enum":["none","server","peers"],"description":"who is told about a write to it"},"durable":{"type":"string","description":"how long one of its values lives: forever, connection, or a duration"},"pace":{"type":"string","description":"how often a writer's value is taken, as a duration"},"search":{"type":"array","items":{"type":"string"},"description":"the text its entities are found by, as comp.prop names of another component"},"identity":{"type":"array","items":{"type":"string"},"description":"the properties, in order, its entities' ids are derived from"},"unique":{"type":"array","description":"the property lists no two of its rows share"},"index":{"type":"array","description":"the property lists kept indexed"},"constraints":{"type":"array","description":"numeric bounds over a whole row"},"examples":{"type":"array","description":"sample values"},"keywords":{"type":"object","description":"every other keyword its entry says, as written: another package's (prefix, by_name, edge) and JSON Schema's own"}}},"_prop":{"component":true,"type":"object","kind":true,"wire":false,"before":["doc"],"identity":["comp","name"],"description":"a property of a component. Its doc.title is comp.prop, its doc.body its description","properties":{"comp":{"type":"string","ref":"_comp","death":"cascade","description":"the component it belongs to"},"name":{"type":"string","description":"its name within the component"},"ord":{"type":"integer","description":"its position among the properties its entry declares, from 0"},"package":{"type":"string","ref":"_package","death":"cascade","description":"the package whose vocabulary declares it: the component's own, or one that extends it"},"type":{"type":["string","array"],"description":"the JSON type it holds, or a union of them: string, number, integer, boolean, object, array"},"format":{"type":"string","description":"what a string or number means: date-time, uri, query, json, priority"},"enum":{"type":"array","items":{"type":"string"},"description":"the closed set of values it holds"},"const":{"type":["string","number","boolean","object","array"],"description":"the one value it may hold"},"default":{"type":["string","number","boolean","object","array"],"description":"what a row holds when its writer supplied nothing; {\"now\": true} is the clock"},"examples":{"type":"array","description":"sample values"},"ref":{"type":"string","description":"the component a reference names; entity is any"},"death":{"type":"string","enum":["cascade","detach","release","keep"],"description":"what deleting the referenced entity does to this one"},"required":{"type":"boolean","description":"true = every row holds it"},"stamped":{"type":"boolean","description":"true = the server owns it: clients read it, never write it"},"computed":{"type":"boolean","description":"true = derived, never stored"},"reads":{"type":"array","items":{"type":"string"},"description":"on a computed property, the components on other entities it reads"},"search":{"type":"boolean","description":"true = full-text indexed"},"unique":{"type":"boolean","description":"true = no two rows share it"},"index":{"type":"boolean","description":"true = kept indexed"},"identity":{"type":"boolean","description":"true = its entity's id is derived from it"},"validate":{"type":"boolean","description":"true = a write is checked against its whole JSON Schema"},"aliases":{"type":"object","description":"input forms that resolve to an enum member"},"properties":{"type":"object","description":"the declared structure of an object value, as written"},"items":{"type":["object","boolean"],"description":"the declared structure of an array's elements, as written"},"keywords":{"type":"object","description":"every other keyword it says, as written: another package's (store) and JSON Schema's own (minLength, maximum)"}}},"_before":{"component":true,"type":"object","edge":true,"wire":false,"description":"the edge from a kind to a kind it sorts before; edge.ord keeps the order its entry lists them in"},"_extends":{"component":true,"type":"object","kind":true,"wire":false,"before":["doc"],"identity":["comp","package"],"description":"a package's extension of a component another package declares. The properties it adds are _prop rows; its doc.title is comp+package, its doc.body its description","properties":{"comp":{"type":"string","ref":"_comp","death":"cascade","description":"the component it extends"},"package":{"type":"string","ref":"_package","death":"cascade","description":"the package whose vocabulary extends it"},"status":{"type":"object","description":"the rungs it adds to the component's status ladder, in order: each component to the status it gives"}}},"_vocab":{"component":true,"type":"object","wire":false,"description":"the vocabulary the other rows describe, as a whole: one entity per graph, whose hash says what they were last brought into line with, so a graph already describing it is known to without reading them","properties":{"hash":{"type":"string","description":"the SHA-256 of every row as the vocabulary described them"}}}}},{"$defs":{"_lens":{"component":true,"type":"object","wire":false,"identity":["package","step"],"description":"One immutable forward step in a package's vocabulary, named by a UTC YYYYMMDDHHMMSS timestamp.","properties":{"package":{"type":"string","ref":"_package","death":"cascade","description":"The package whose vocabulary changes."},"step":{"type":"integer","minimum":0,"description":"The UTC YYYYMMDDHHMMSS timestamp; landed pilot steps retain their original zero-based names."},"ops":{"type":"array","description":"The operations in this step, in order."}}}}},{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Mossvale","description":"A voxel world to adventure in together. What a player is and has done, where they last stood and where they have explored, is kept in this app's store (player, look, position, explored, fire, slain, item, gathered, crafted, used, upgraded, equip, learned, respec, journal), and so is what they said (chat) and the villagers who answer them and what they hand over (villager, deal, agreed, handed); what moves (where each player and creature is, how they move, how they fare in a fight, what they wear) is relayed between the players in a level; only hero positions are saved. Levels' geography and quests are authored data; creature, item, ability, building and region theme designs are store rows seeded from files and watched by every page.","$defs":{"player":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A hero belonging to the person who made it, as the row's created stamp says. Their appearance lives in look rows; everything else they earn lives in rows of its own.","properties":{}},"slain":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A player's share in a creature's fall. The first row after the creature was last up is the fall itself; the others are the players who helped.","properties":{"creature":{"type":"string"},"by":{"type":"string","index":true,"description":"The player."},"at":{"type":"number","description":"When it fell, in ms."},"xp":{"type":"number"},"lvl":{"type":"integer","description":"Its level in this land."},"beast":{"type":"string","ref":"beast_design","death":"keep","description":"The kind of creature it was."}}},"item":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"Something a player picked up or was given.","properties":{"kind":{"type":"string"},"n":{"type":"integer","description":"How many, for coins."},"owner":{"type":"string","index":true,"description":"The player."},"at":{"type":"number"},"rarity":{"type":"string","enum":["common","uncommon","rare","epic","legendary"],"description":"How fine a piece of gear is (rarity.ts); a row with none is common. What the piece rolled comes from its eid."},"lvl":{"type":"integer","minimum":1,"maximum":60,"description":"A piece of gear's item level, within its material tier. Older pieces with none use the tier's first level."}}},"used":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"An item spent: a tonic drunk, jelly handed over for a quest.","properties":{"item":{"type":"string"},"by":{"type":"string","index":true},"at":{"type":"number"}}},"journal":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A step in a player's quest: taken, then done; pinned or unpinned in between, the latest counting.","properties":{"player":{"type":"string","index":true},"quest":{"type":"string","description":"The quest, by the app's list of quests."},"step":{"type":"string","enum":["taken","done","pinned","unpinned"]},"at":{"type":"number"},"xp":{"type":"number","description":"The award on completion."}}},"drop":{"component":true,"type":"object","kind":true,"before":["doc"],"sync":"none","durable":"connection","description":"Loot lying on the ground for this player alone, until they walk over it; where it lies is its position. Never leaves the page: picking it up writes an item.","properties":{"kind":{"type":"string"},"n":{"type":"integer"},"at":{"type":"number"},"rarity":{"type":"string","enum":["common","uncommon","rare","epic","legendary"],"description":"How fine a piece of gear is, kept on the item it becomes."}}},"position":{"component":true,"type":"object","kind":true,"before":["doc"],"sync":"peers","durable":"forever","pace":"100ms","description":"Where something is this moment: its region and world coordinates, in metres. Relayed to nearby pages. The server saves each hero’s latest position every thirty seconds; wildlife has no player component and is never saved. A disconnected hero returns to the saved spot, facing the default direction.","properties":{"level":{"type":"string","description":"Which region contains these world coordinates.","index":true},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"at":{"type":"number","description":"When the page moving it said so, in ms. A page says where its hero is at least once a second while it plays, so one that has not for a while sleeps."}},"save":".player (!position.at | .position.at<=\"30s ago\")"},"motion":{"component":true,"type":"object","kind":true,"before":["doc"],"sync":"peers","durable":"connection","pace":"100ms","description":"How something is moving this moment: which way it faces, its gait, and its velocity, so peers can draw movement between relayed positions.","properties":{"yaw":{"type":"number","description":"Which way it faces, in radians."},"gait":{"type":"string","enum":["idle","walk","run","jump","roll","down"],"description":"How it is moving; a player dodging rolls, and one who fainted is down."},"vy":{"type":"number","description":"How fast it is rising, in metres a second."},"vx":{"type":"number","description":"How fast it is moving east, in metres a second."},"vz":{"type":"number","description":"How fast it is moving north, in metres a second."}}},"vitals":{"component":true,"type":"object","kind":true,"before":["doc"],"sync":"peers","durable":"connection","description":"How a player fares, for the plate over their head: their health, the most they can have, and their level of experience.","properties":{"hp":{"type":"number"},"max":{"type":"number"},"lvl":{"type":"number"}}},"fight":{"component":true,"type":"object","kind":true,"before":["doc"],"sync":"peers","durable":"connection","description":"A player's fight: the creature they fight, what they have dealt each creature they are hurting, how many blows they have swung, and recent combat events for nearby pages. A creature's health is its most less what every fight says was dealt it in this life, and one held by anyone's blow neither moves nor bites.","properties":{"foe":{"type":"string","description":"The creature they fight."},"swing":{"type":"number","description":"Counts their blows, so a page sees each one."},"dealt":{"type":"array","items":{"type":"object","properties":{"foe":{"type":"string"},"life":{"type":"number"},"dmg":{"type":"number"},"held":{"type":"number"}}},"description":"What they have dealt each creature they are hurting, one for each: the creature, which life of it (when it last fell, in ms), the damage dealt it in that life, and until when their blows hold it still, in ms (rules.ts `Dealt`)."},"serial":{"type":"number","description":"The last combat event's sequence number."},"events":{"type":"array","description":"Recent combat visuals, each numbered so nearby pages play it once.","items":{"type":"object","properties":{"n":{"type":"number"},"at":{"type":"number"},"event":{"type":"object","properties":{"type":{"enum":["ability","shot","burst","hit","held"]},"id":{"type":"string"},"by":{"type":"string"},"at":{"type":"array","items":{"type":"number"}},"yaw":{"type":"number"},"kind":{"enum":["arrow","bolt"]},"from":{"type":"array","items":{"type":"number"}},"to":{"type":"array","items":{"type":"number"}},"ms":{"type":"number"},"r":{"type":"number"},"eid":{"type":"string"},"beast":{"type":"string"},"dmg":{"type":"number"},"great":{"type":"boolean"}}}}}},"statuses":{"type":"array","description":"Lasting effects cast on heroes or creatures, with absolute expiry and the next tick due. Every nearby page sees these same carriers.","items":{"type":"object","properties":{"id":{"type":"string"},"target":{"type":"string"},"life":{"type":"number"},"name":{"type":"string"},"kind":{"type":"string"},"until":{"type":"number"},"next":{"type":"number"},"amount":{"type":"number"},"stat":{"type":"string"},"share":{"type":"number"}}}},"level":{"type":"string","description":"The land containing the caster; every page in that land watches lasting effects and ground areas."},"areas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string"},"level":{"type":"string"},"name":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"radius":{"type":"number"},"start":{"type":"number"},"until":{"type":"number"},"next":{"type":"number"},"blow":{"type":"number"},"max":{"type":"number"},"element":{"type":"string"},"effects":{"type":"array","items":{"type":"object"}}}},"description":"Ground areas left by this hero, with their fixed positions, lifetime, next pulse and authored effects."},"ticks":{"type":"object","additionalProperties":{"type":"number"},"description":"The last friendly-area pulse this hero received, by area id, preventing repeat healing between frames."}}},"hunt":{"component":true,"type":"object","kind":true,"before":["doc"],"sync":"peers","durable":"connection","description":"A creature on the hunt, as the page moving it says: the player it is after, and when its bite lands. It winds up until then. The bitten player's page decides the bite when it lands: rolled through, stepped clear of, or taken.","properties":{"player":{"type":"string"},"bite":{"type":"number","description":"When its bite lands, in ms."}}},"chat":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"person","pace":"1s","description":"A line said aloud: the level it was said in, where everyone reads it in the chat, and the hero who said it, over whose head it shows to whoever is near. Its words are the row's doc body; who wrote it and when is its created stamp. The store takes a line only from a person signed in, and at most one a second from each (floor, pace); a page shows it only as a hero they made (chat.ts). A line said beside a villager is also a line of their transcript (entry, content, using), which asks them to answer.","properties":{"level":{"type":"string","index":true,"description":"Which level, by the app's list of levels."},"player":{"type":"string","description":"The hero who said it."}}},"villager":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"One of the people of the vale, with a transcript for human dialogue. Their daily movement is derived in the page from their routine; merely playing nearby asks no model and starts no clock.","properties":{"id":{"type":"string","description":"Who, by the app's list of quest-givers."},"level":{"type":"string","index":true,"description":"The level they live in."},"home":{"type":"string","description":"The named place in their level near which their home stands."},"workplace":{"type":"string","description":"The kind of building where they work, when one stands near their home."},"role":{"type":"string","description":"Their profession or title, when their name states it."}}},"equip":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A player putting something on: the item in their bag they wear in a slot, or none, to take the slot off. The newest row for each slot is what is in it, and a thing no longer in the bag is off (gear.ts).","properties":{"player":{"type":"string","index":true},"slot":{"type":"string","enum":["main","off","head","body","feet","trinket"]},"item":{"type":"string","description":"The item row worn, or empty."},"at":{"type":"number"}}},"gear":{"component":true,"type":"object","kind":true,"before":["doc"],"sync":"peers","durable":"connection","description":"What a player wears, for the others to draw: the kind of item in each slot, empty where nothing is.","properties":{"main":{"type":"string"},"off":{"type":"string"},"head":{"type":"string"},"body":{"type":"string"},"feet":{"type":"string"},"trinket":{"type":"string"}}},"gathered":{"component":true,"type":"object","kind":true,"before":["doc"],"unique":[["node","life"]],"description":"Where an item came from when a hero gathered it: the node they worked (gather.ts), which kind of node, and when. It rides on the item it gave, so the bag is still items held less items spent. The first row after a node was last whole spends it for everyone until it grows back, the way a slain row fells a creature; a hero's trades are counted from the rows on their items.","properties":{"node":{"type":"string","description":"The node, by the eid its level names it with."},"kind":{"type":"string","description":"Which kind of node, by the app's list of them."},"at":{"type":"number","description":"When it was gathered, in ms."},"rarity":{"type":"string","enum":["common","uncommon","rare","epic","legendary"],"description":"The node's rarity when this item was gathered."},"xp":{"type":"number","description":"What this gathering was worth to the hero's trade."},"life":{"type":"number","description":"When this node's previous life was spent, or zero for its first life. One gathering can spend each life."},"directive":{"type":"string","index":true,"description":"The companion objective this gathering advances, when a companion did it."}}},"deal":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","pace":"2s","description":"What a villager promised a hero out of what they hold, and for what: nothing, which is a gift, or things to bring and creatures to fell; or a job pinned on their village's notice board, either made without naming a hero or pinned when the addressed hero declines, which the first hero to agree to it takes. The villager's model writes it (give, offer, post), as the person talking to them, and only a row that came through the villager's own turn counts (created.via, which the store stamps); the hero agrees to it and hands it in once what it asks is done, and only then does anything change hands. Whether it counts is the rules' (stock.ts): a villager promises only what they hold, a gift only a little and never their own things, a deal asks only what their land has and never gives much more than that is worth, and a board holds a few jobs, each villager's one at a time and rarely. What they hold is counted from these rows and the heroes' replies, in the order the store took them.","properties":{"villager":{"type":"string","index":true,"description":"The villager's row: the transcript whose turn made the deal."},"player":{"type":"string","index":true,"description":"The hero it is made with; none for a job on the notice board, whose hero is the first to agree to it."},"give":{"type":"string","description":"What the villager gives, in words: 12 coin, 1 tonic."},"take":{"type":"string","description":"What it is for, in words: things to bring and creatures to fell (3 tusk, 1 beast:thornback), each a step of its own. Empty for a gift."}}},"handed":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","description":"A deal handed in, written by the page of the hero it was made with: what the villager promised passes to the hero as items, and what the deal asked of the hero's bag passes to the villager. It counts once per deal, and only from the person who made the hero.","properties":{"deal":{"type":"string","index":true,"description":"The deal."},"villager":{"type":"string","index":true,"description":"The villager's row."},"player":{"type":"string","description":"The hero."}}},"crafted":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"How an item was made: the recipe a hero followed at a village's station (craft.ts), and when. It rides on the item it made, and what the recipe took is spent by used rows in the same write, so the bag is still items held less items spent; a hero's crafting trades are counted from these rows on their items.","properties":{"recipe":{"type":"string","description":"The recipe, by the kind of item it makes."},"at":{"type":"number","description":"When it was made, in ms."}}},"learned":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A player spending a point on a skill (skills.ts). What they know is every row since their last respec, in the order written, each counting only if they could learn it then.","properties":{"player":{"type":"string","index":true},"skill":{"type":"string","description":"The skill, by the board's id for it."},"at":{"type":"number"}}},"respec":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A player forgetting every skill they learned before it, by a village's fire, to spend the points again.","properties":{"player":{"type":"string","index":true},"at":{"type":"number"}}},"agreed":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","description":"A hero agreeing to a deal, written by their page: it stands a day from then rather than lapsing, a newer offer no longer takes its place, and the creatures it asks count from when it was agreed. For a job on the notice board, the first hero to agree takes it, and it is gone from the board. It counts only from the person who made the hero.","properties":{"deal":{"type":"string","index":true,"description":"The deal."},"villager":{"type":"string","index":true,"description":"The villager's row."},"player":{"type":"string","description":"The hero."}}},"upgraded":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A piece of gear upgraded a step at the station that makes one like it (upgrade.ts), and what it took is spent by used rows in the same write. How far a piece is upgraded is how many rows name it, to +5; new steps keep their rolled gain, while older rows with none gain a tenth.","properties":{"item":{"type":"string","index":true,"description":"The item row upgraded."},"by":{"type":"string","index":true},"at":{"type":"number"},"gain":{"type":"number","minimum":0.08,"maximum":0.12,"description":"The share this upgrade adds to a piece's numbers."}}},"look":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"A hero's name and colours. The newest row for a player is how they look now; the first row is written when the hero is made.","properties":{"player":{"type":"string","ref":"player","death":"cascade","index":true},"name":{"type":"string","description":"The name over their head."},"tint":{"type":"string","description":"Their tunic's colour, as #rrggbb."},"hair":{"type":"string","description":"Their hair's colour, as #rrggbb."},"skin":{"type":"string","description":"Their skin's colour, as #rrggbb."},"at":{"type":"number"}}},"place":{"component":true,"type":"object","kind":true,"before":["doc"],"description":"The region and chunk a stored world row belongs to. Falls and gatherings wear it; a page watches only the tiles of chunks near its hero, by chunk. Chunk is the numeric key of ci and ck (area.ts).","properties":{"level":{"type":"string"},"chunk":{"type":"number","index":true},"ci":{"type":"integer"},"ck":{"type":"integer"}}},"declined":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","description":"A hero declining a villager's addressed offer of work. The offer becomes a job on the village notice board for the first hero to take, until the board job lapses. Only a reply by the person who made the offered hero counts.","properties":{"deal":{"type":"string","index":true,"description":"The offered deal."},"villager":{"type":"string","index":true,"description":"The villager's row."},"player":{"type":"string","description":"The hero who declined."}}},"fire":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","identity":["player","village"],"description":"A village fire a hero has reached. The row belongs to the hero who reached it; its identity means a later visit agrees on the same discovery. A guest keeps discoveries in their tab alone (fires.ts).","properties":{"player":{"type":"string","index":true},"village":{"type":"string"}},"required":["player","village"]},"going":{"component":true,"type":"object","kind":false,"before":["doc"],"description":"A villager's choice of where to go for a while. Only a row from that villager's own model turn counts (created.via); the page follows it along with their daily rhythm and periodic decisions (villagers.ts).","properties":{"villager":{"type":"string","index":true},"go":{"type":"string","enum":["home","work","inn","about","visit"]}},"required":["villager","go"]},"directive":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","description":"A signed-in person's request to the companion of a hero they made. Only a request whose created.by matches the hero's created.by directs that companion. Newer requests replace older ones; gathered rows name the request they advance.","properties":{"player":{"type":"string","index":true},"goal":{"type":"string","enum":["wood"]},"count":{"type":"integer","minimum":1,"maximum":10}},"required":["player","goal","count"]},"companion":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"editor","description":"The companion's last scheduled step, kept on its objective so every page sees the same position and status.","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"at":{"type":"number"},"call":{"type":"string"},"phase":{"type":"string"},"target":{"type":"string"},"since":{"type":"number"},"status":{"type":"string"},"speed":{"type":"number"}}},"sfx":{"component":true,"type":"object","kind":true,"before":["doc"],"unique":[],"floor":"editor","description":"The description of one sound Vale needs. The shared sound builder reads this row and cites it in the generated recording.","properties":{"name":{"type":"string","index":true},"loop":{"type":"boolean"}}},"damageable":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"owner","description":"Whether damage can reach this hero. Off restores full health and prevents damage; on returns to ordinary combat. Only the app owner may change it.","properties":{"on":{"type":"boolean"}}},"teleport_request":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"owner","description":"An owner-authorized move of one hero to a safe spot in the world. The hero's active page moves them, or their next page moves them when they return, then marks this request completed.","properties":{"player":{"type":"string","index":true,"ref":"player","death":"keep"},"level":{"type":"string"},"x":{"type":"number"},"z":{"type":"number"}},"required":["player","level","x","z"],"permit":{"completed":"player"}},"explored":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","identity":["player","x","z"],"description":"One twenty-metre world cell visited by a hero. Each hero uncovers their own map. The identity lets visits from several tabs agree on one discovery.","properties":{"player":{"type":"string","ref":"player","death":"cascade","index":true},"x":{"type":"integer"},"z":{"type":"integer"}},"required":["player","x","z"]},"party_step":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"person","description":"One signed-in hero joining or leaving a party. The newest row written by that hero's owner decides membership; an empty group leaves. A step is a new row so its created.by stamp proves who chose it.","properties":{"player":{"type":"string","ref":"player","death":"cascade","index":true},"group":{"type":"string","index":true},"at":{"type":"number"}},"required":["player","group","at"]},"party_invite":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"person","description":"One hero's invitation to another to join their party. The invited hero alone answers it with a party_reply row.","properties":{"from":{"type":"string","ref":"player","death":"cascade"},"to":{"type":"string","ref":"player","death":"cascade","index":true},"group":{"type":"string"},"at":{"type":"string","format":"date-time"}},"required":["from","to","group","at"]},"party_reply":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"person","description":"An invited hero accepting or declining an invitation. A reply keeps it out of their inbox after they leave the party.","properties":{"invite":{"type":"string","ref":"party_invite","death":"cascade"},"to":{"type":"string","ref":"player","death":"cascade","index":true},"accept":{"type":"boolean"}},"required":["invite","to","accept"]},"character":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"A villager's personal history and lasting temperament. This lives on the same entity as their transcript, and colours what they say and choose. Seeded once into the app store, then editable there without a code deploy.","properties":{"story":{"type":"string","description":"A short event or relationship that shaped this person."},"traits":{"type":"array","items":{"type":"string"},"description":"A few distinctive traits that guide their speech and choices."}},"required":["story","traits"]},"beast_design":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"A kind of creature, and what players call it. Its other aspects are components of their own beside it: combat (how it fights), loot (what it leaves) and sounds (how it sounds); a den row says where it lives, and a figure row how it looks and moves. An alias key such as beast:boar names it in quests, seeds and commands, and everything stored refers to it by its eid. Its created stamp records who invented it.","properties":{"name":{"type":"string","minLength":1}},"required":["name"]},"item_design":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","unique":[["kind"]],"description":"One kind of thing a hero can carry, wear, gather or receive. Its created stamp records who designed it.","properties":{"kind":{"type":"string","minLength":1,"index":true},"name":{"type":"string","minLength":1},"heals":{"type":"number","minimum":0},"slot":{"type":"string","enum":["main","off","head","body","feet","trinket"]},"tier":{"type":"number","minimum":1},"family":{"type":"string"},"weight":{"type":"string"},"dmg":{"type":"number"},"armour":{"type":"number"},"hp":{"type":"number"},"speed":{"type":"number"},"haste":{"type":"number"},"force":{"type":"number"},"luck":{"type":"number"},"plain":{"type":"boolean"},"recipe":{"type":"string"},"look":{"type":"array","items":{"type":"array","prefixItems":[{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},{"type":"integer","minimum":0},{"type":"number","minimum":0}],"minItems":3,"maxItems":4}},"aura":{"type":"object","properties":{"at":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"color":{"type":"integer","minimum":0},"size":{"type":"number","minimum":0}},"required":["at","color","size"]},"view":{"type":"string","enum":["corner","front","side","top","lying","chop"]}},"required":["kind","name","look"]},"building_design":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","unique":[["kind"]],"description":"One building plan: rooms, furniture and exterior details. The generic kit raises it in any land's materials.","properties":{"kind":{"type":"string","minLength":1,"index":true},"size":{"type":"array","prefixItems":[{"type":"number","exclusiveMinimum":0},{"type":"number","exclusiveMinimum":0}],"minItems":2,"maxItems":2},"works":{"type":"string"},"chimney":{"type":"object"},"storeys":{"type":"array","minItems":1,"items":{"type":"object"}},"details":{"type":"array","items":{"type":"object"}}},"required":["kind","size","storeys"]},"theme_design":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","unique":[["land"]],"description":"A land's ground cover and visual theme. Its geography stays in the authored land row.","properties":{"land":{"type":"string","minLength":1,"index":true},"wild":{"type":"string","minLength":1},"look":{"type":"object","properties":{"ground":{"type":"object","additionalProperties":{"type":"integer","minimum":0,"maximum":16777215}},"water":{"type":"array","items":{"type":"integer","minimum":0,"maximum":16777215},"minItems":3,"maxItems":3},"sky":{"type":"integer","minimum":0,"maximum":16777215},"tint":{"type":"number","minimum":0,"maximum":1},"haze":{"type":"number","exclusiveMinimum":0},"air":{"type":"string"}}},"frontier":{"type":"integer","minimum":0}},"required":["land","wild"]},"ability_design":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","unique":[["kind"]],"description":"An ability's combat rules, description and equipment grant.","properties":{"kind":{"type":"string","minLength":1,"index":true,"validate":true},"name":{"type":"string","minLength":1,"validate":true},"icon":{"type":"string","minLength":1,"validate":true},"description":{"type":"string","minLength":1,"validate":true},"weapon":{"type":"string","minLength":1,"validate":true},"slot":{"type":"integer","minimum":1,"maximum":2,"validate":true},"offhand":{"type":"string","minLength":1,"validate":true},"shape":{"type":"string","enum":["one","arc","ring","burst","self"],"validate":true},"pose":{"type":"string","enum":["swing","spin","guard","cast","cross"],"validate":true},"element":{"type":"string","enum":["fire","earth","shadow","light","life"],"validate":true},"far":{"type":"number","minimum":0,"maximum":12,"validate":true},"arc":{"type":"number","minimum":0,"maximum":3.141592653589793,"validate":true},"shots":{"type":"integer","minimum":1,"maximum":12,"validate":true},"time":{"type":"number","minimum":300,"maximum":5000,"validate":true},"cool":{"type":"number","minimum":500,"maximum":60000,"validate":true},"tint":{"type":"integer","minimum":0,"maximum":16777215,"validate":true},"effects":{"type":"array","validate":true,"minItems":1,"maxItems":14,"items":{"oneOf":[{"type":"object","properties":{"kind":{"const":"damage"},"scale":{"type":"number","minimum":0.01,"maximum":10},"hits":{"type":"integer","minimum":1,"maximum":10},"sure":{"type":"boolean"}},"required":["kind","scale"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"bleed"},"scale":{"type":"number","minimum":0.01,"maximum":10}},"required":["kind","scale"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"stun"},"ms":{"type":"number","minimum":1,"maximum":10000}},"required":["kind","ms"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"dash"},"metres":{"type":"number","minimum":0.01,"maximum":12},"behind":{"type":"boolean"}},"required":["kind","metres"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"guard"},"ms":{"type":"number","minimum":1,"maximum":10000}},"required":["kind","ms"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"ward"},"share":{"type":"number","maximum":1,"minimum":0.01}},"required":["kind","share"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"heal"},"share":{"type":"number","maximum":1,"minimum":0.01}},"required":["kind","share"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"renew"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"refund"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"dot"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"scale":{"type":"number","minimum":0.01,"maximum":10}},"required":["kind","ms","scale"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"hot"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"share":{"type":"number","minimum":0.01,"maximum":0.8}},"required":["kind","ms","share"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"buff"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"share":{"type":"number","minimum":0.01,"maximum":0.8},"stat":{"enum":["damage","armor","speed"]}},"required":["kind","ms","share","stat"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"debuff"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"share":{"type":"number","minimum":0.01,"maximum":0.8},"stat":{"enum":["damage","armor","speed"]}},"required":["kind","ms","share","stat"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"area"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"radius":{"type":"number","minimum":0.5,"maximum":12},"effects":{"type":"array","minItems":1,"maxItems":4,"items":{"oneOf":[{"type":"object","properties":{"kind":{"const":"damage"},"scale":{"type":"number","minimum":0.01,"maximum":1},"hits":{"type":"integer","minimum":1,"maximum":10},"sure":{"type":"boolean"}},"required":["kind","scale"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"heal"},"share":{"type":"number","maximum":0.3,"minimum":0.01}},"required":["kind","share"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"dot"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"scale":{"type":"number","minimum":0.01,"maximum":1}},"required":["kind","ms","scale"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"hot"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"share":{"type":"number","minimum":0.01,"maximum":0.3}},"required":["kind","ms","share"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"buff"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"share":{"type":"number","minimum":0.01,"maximum":0.3},"stat":{"enum":["damage","armor","speed"]}},"required":["kind","ms","share","stat"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"debuff"},"ms":{"type":"integer","minimum":1000,"maximum":30000},"share":{"type":"number","minimum":0.01,"maximum":0.3},"stat":{"enum":["damage","armor","speed"]}},"required":["kind","ms","share","stat"],"additionalProperties":false}]}}},"required":["kind","ms","radius","effects"],"additionalProperties":false}]},"allOf":[{"contains":{"properties":{"kind":{"const":"damage"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"bleed"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"stun"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"dash"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"guard"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"ward"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"heal"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"renew"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"refund"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"dot"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"hot"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"buff"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"debuff"}}},"minContains":0,"maxContains":1},{"contains":{"properties":{"kind":{"const":"area"}}},"minContains":0,"maxContains":1}]}},"required":["kind","name","icon","description","shape","pose","effects","cool"],"constraints":[{"name":"cost","value":{"sum":[{"each":"effects","where":{"kind":"damage"},"product":[{"field":"scale"},{"field":"hits","default":1}]},{"each":"effects","where":{"kind":"damage","sure":true},"product":[0.35]},{"each":"effects","where":{"kind":"bleed"},"product":[0.5,{"field":"scale"}]},{"each":"effects","where":{"kind":"stun"},"product":[0.00035,{"field":"ms"}]},{"each":"effects","where":{"kind":"dash"},"product":[0.12,{"field":"metres"}]},{"each":"effects","where":{"kind":"dash","behind":true},"product":[0.35]},{"each":"effects","where":{"kind":"guard"},"product":[0.00025,{"field":"ms"}]},{"each":"effects","where":{"kind":"ward"},"product":[3,{"field":"share"}]},{"each":"effects","where":{"kind":"heal"},"product":[3,{"field":"share"}]},{"each":"effects","where":{"kind":"renew"},"product":[0.35]},{"each":"effects","where":{"kind":"refund"},"product":[0.35]},{"each":"effects","where":{"kind":"dot"},"product":[0.7,{"field":"scale"}]},{"each":"effects","where":{"kind":"hot"},"product":[3,{"field":"share"}]},{"each":"effects","where":{"kind":"buff"},"product":[3,{"field":"share"}]},{"each":"effects","where":{"kind":"debuff"},"product":[3,{"field":"share"}]},{"each":"effects","where":{"kind":"area"},"product":[0.0001,{"field":"ms"}]},{"each":"effects","where":{"kind":"area"},"product":[0.2,{"field":"radius"}]},{"where":{"shape":"arc"},"product":[0.2]},{"where":{"shape":"arc"},"product":[0.2,{"field":"arc","default":1.2}]},{"where":{"shape":"arc"},"product":[0.2,{"field":"far","default":0}]},{"where":{"shape":"ring"},"product":[0.35]},{"where":{"shape":"ring"},"product":[0.2,{"field":"far","default":0}]},{"where":{"shape":"burst"},"product":[0.25]},{"where":{"shape":"burst"},"product":[0.15,{"field":"far","default":0}]},{"where":{"shape":"one"},"product":[0.1,{"field":"far","default":0}]},{"product":[0.04,{"field":"shots","default":1}]},{"product":[-0.04]},{"product":[3000,{"field":"cool","inverse":true}]},{"product":[300,{"field":"time","default":600,"inverse":true}]}]},"maximum":4,"message":"Ability exceeds its power budget"}]},"visited_region":{"component":true,"type":"object","kind":false,"before":["doc"],"floor":"person","identity":["player","region"],"description":"One world region visited by a hero. Each hero uncovers their own map. The identity lets visits from several tabs agree on one discovery.","properties":{"player":{"type":"string","ref":"player","death":"cascade","index":true},"region":{"type":"string"}},"required":["player","region"]},"combat":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"How a creature fights, and what felling it is worth, at its own level. A land rescales lvl, hp, dmg and xp together for the creatures it grows (danger.ts). A creature without one can't be fought.","properties":{"lvl":{"type":"number","minimum":1,"validate":true,"maximum":20},"hp":{"type":"number","exclusiveMinimum":0,"validate":true,"maximum":5000},"dmg":{"type":"number","minimum":0,"validate":true,"maximum":80},"speed":{"type":"number","minimum":0,"description":"Metres a second when it means it.","validate":true,"maximum":6},"reach":{"type":"number","exclusiveMinimum":0,"description":"How close it must be to bite.","validate":true,"maximum":4},"aggro":{"type":"number","minimum":0,"description":"How near a hero wakes it; 0 is never, until struck.","validate":true,"maximum":12},"xp":{"type":"number","minimum":0,"validate":true,"maximum":2200},"boss":{"type":"boolean","description":"One of a kind, with its name on its plate."}},"required":["lvl","hp","dmg","speed","reach","aggro","xp"],"constraints":[{"name":"hp_per_level","value":{"sum":[{"product":[{"field":"hp"},{"field":"lvl","inverse":true}]}]},"maximum":250,"message":"hp must not exceed 250 times lvl"},{"name":"dmg_per_level","value":{"sum":[{"product":[{"field":"dmg"},{"field":"lvl","inverse":true}]}]},"maximum":4,"message":"dmg must not exceed 4 times lvl"},{"name":"xp_per_level","value":{"sum":[{"product":[{"field":"xp"},{"field":"lvl","inverse":true}]}]},"maximum":110,"message":"xp must not exceed 110 times lvl"}]},"loot":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"What a creature may leave when it falls: item kinds (items.ts), each with the chance of one dropping.","properties":{"drops":{"type":"array","items":{"type":"array","prefixItems":[{"type":"string"},{"type":"number","minimum":0,"maximum":1}],"minItems":2,"maxItems":2}}},"required":["drops"]},"sounds":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"The sound rows a creature cries and steps with; several creatures may share one. Until a row has a recording, and for a sound it names no row for, the procedural voice of its body plays.","properties":{"cry":{"type":"string","ref":"sfx","death":"detach"},"step":{"type":"string","ref":"sfx","death":"detach"}}},"den":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"Where a creature lives, as an auto-spawner: around each place of kind near in a land that suits it (homes.ts), count of beast, between beyond and within metres of the place and apart metres from each other, each wandering roam metres from its home and up again respawn seconds after it falls. With odds, only around that share of the places, each picked by its own name and land. A den's creatures are derived on every page and never stored; a creature with no den lives nowhere until it is spawned.","properties":{"beast":{"type":"string","ref":"beast_design","death":"cascade"},"near":{"type":"string","description":"A kind of place (features.ts)."},"count":{"type":"integer","minimum":0},"within":{"type":"number","exclusiveMinimum":0},"beyond":{"type":"number","minimum":0},"apart":{"type":"number","minimum":0},"roam":{"type":"number","minimum":0},"odds":{"type":"number","minimum":0,"maximum":1},"respawn":{"type":"number","minimum":0,"description":"Seconds from a fall until it is up again."}},"required":["beast","near","count","within","apart","roam","respawn"]},"spawned":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"owner","description":"One creature an owner put at a spot with /spawn; the row's eid is the creature's. It wanders roam metres from x, z as a den's creature wanders from its home, fights at lvl, its spawner's level when it was spawned, and stays down once a slain row names it. Its place says the land and chunk it stands in (spawn.ts). With no beast, doc.body asks the creature builder; its current main kind output supplies the species through build.for. Until that kind has a figure, the spot shimmers.","properties":{"beast":{"type":"string","ref":"beast_design","death":"cascade","description":"The creature it is."},"lvl":{"type":"integer","minimum":1,"description":"The level it fights at."},"x":{"type":"number","description":"World metres east of Mossvale's origin."},"z":{"type":"number","description":"World metres south of Mossvale's origin."},"roam":{"type":"number","minimum":0,"description":"How far it wanders from x, z, in metres."}},"required":["lvl","x","z","roam"]},"figure":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"A creature's look and how it moves: a jointed tree of soft boxes at its true size, in metres, standing on the ground under its root and facing +z. One animator walks, strikes and fells any figure from its parts' roles and its gait, bite and fall (figure.ts).","properties":{"of":{"type":"string","ref":"beast_design","death":"cascade","index":true,"description":"The creature it draws.","validate":true},"parts":{"type":"array","description":"Its parts, each after the part it hangs from.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":48},"parent":{"type":"string","description":"The part it hangs from, by name; none hangs from the figure.","minLength":1,"maxLength":48},"pivot":{"type":"array","description":"Where it turns, in its parent's space.","items":{"type":"number","minimum":-12,"maximum":12},"minItems":3,"maxItems":3},"turn":{"type":"array","description":"How it is turned at rest, in radians about y, then x, then z.","items":{"type":"number","minimum":-12,"maximum":12},"minItems":3,"maxItems":3},"cell":{"type":"number","exclusiveMinimum":0,"description":"The edge of the voxels its colour is speckled in; 0.1 unless it says.","minimum":0.03,"maximum":2},"boxes":{"type":"array","description":"Soft boxes in its space: low corner, size, colour, and how round their edges are.","items":{"type":"array","prefixItems":[{"type":"array","items":{"type":"number","minimum":-8,"maximum":8},"minItems":3,"maxItems":3},{"type":"array","items":{"type":"number","exclusiveMinimum":0,"maximum":8},"minItems":3,"maxItems":3},{"type":"integer","minimum":0,"maximum":16777215},{"type":"number","minimum":0,"maximum":1}],"minItems":3,"maxItems":4},"minItems":1,"maxItems":24},"move":{"type":"object","description":"Its role as the figure moves: leg{phase}, arm{phase}, wing{beat}, tail, head, jaw, spin or link{n}.","minProperties":1,"maxProperties":1,"properties":{"leg":{"type":"object","properties":{"phase":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false,"required":["phase"]},"arm":{"type":"object","properties":{"phase":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false,"required":["phase"]},"wing":{"type":"object","properties":{"beat":{"type":"number","minimum":0,"maximum":12}},"additionalProperties":false,"required":["beat"]},"tail":{"type":"object","additionalProperties":false},"head":{"type":"object","additionalProperties":false},"jaw":{"type":"object","additionalProperties":false},"spin":{"type":"object","additionalProperties":false},"link":{"type":"object","properties":{"n":{"type":"integer","minimum":1,"maximum":32}},"additionalProperties":false,"required":["n"]}},"additionalProperties":false}},"required":["name","pivot","boxes"],"additionalProperties":false},"validate":true,"minItems":1,"maxItems":32,"tree":{"key":"name","parent":"parent"}},"height":{"type":"number","exclusiveMinimum":0,"description":"Where its name plate sits, in metres above the ground.","validate":true,"maximum":12},"size":{"type":"number","exclusiveMinimum":0,"description":"How big the game takes it to be: how far a blow must reach it, and how heavy its footfalls.","validate":true,"maximum":8},"dust":{"type":"integer","minimum":0,"maximum":16777215,"description":"The colour of the dust a blow knocks off it.","validate":true},"gait":{"type":"string","enum":["walk","hop","hover","slide","drift"],"validate":true},"bite":{"type":"string","enum":["lunge","peck","smash","thrust","dive","leap","flare"],"validate":true},"fall":{"type":"string","enum":["topple","flip","back","flatten"],"validate":true},"speckle":{"type":"number","minimum":0,"description":"How grainy its stuff looks; 0.1 unless it says.","validate":true,"maximum":1},"glow":{"type":"integer","minimum":0,"maximum":16777215,"description":"The colour it shines by its own light, if it does.","validate":true}},"required":["of","parts","height","size","dust","gait","bite","fall"]},"music_design":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"A land's musical palette and recurring melody in words.","properties":{"instruments":{"type":"string","minLength":1},"motif":{"type":"string","minLength":1},"voice":{"type":"string","enum":["none","solo","choir"]}},"required":["instruments","motif","voice"]},"song":{"component":true,"type":"object","kind":true,"before":["doc"],"floor":"editor","description":"One soundtrack song, shaped by its land and its own theme.","properties":{"land":{"type":"string","ref":"theme_design","death":"cascade"},"theme":{"type":"string","minLength":1}},"required":["land","theme"]},"saved_position":{"lens":true,"step":20261003184100,"ops":[{"view":{"from":"seen","declaration":{"component":true,"type":"object","kind":false,"floor":"person","description":"Where a hero was last in the world, and when: the level, the spot and which way they faced, where they come back to on any device, and what keeps the villagers of that level awake. A page writes it on a hero its person made as they arrive in a level, every half minute while they move about there, every two minutes while they stand, and as the page is hidden (seen.ts); the store takes it only from a person signed in (floor), so nobody signed out keeps the villagers awake. A hero made signed out is remembered by its tab alone.","properties":{"level":{"type":"string","index":true,"description":"Which level, by the app's list of levels."},"x":{"type":"number","description":"Where in the world, in metres."},"z":{"type":"number"},"yaw":{"type":"number","description":"Which way they faced, in radians."},"at":{"type":"string","format":"date-time"},"teleport":{"type":"string","description":"The latest admin teleport request this hero answered."}}},"match":".player .position","props":{"level":{"path":"position.level"},"x":{"path":"position.x"},"z":{"path":"position.z"},"at":{"path":"position.at","convert":"milliseconds"},"yaw":{"retired":0},"teleport":{"ack":{"component":"teleport_request","ref":"player","mark":"completed","order":"created.at"}}}}}]}},"models":"open","rtc":"open","packages":["@yaks/cli","@yaks/client","@yaks/draft","@yaks/game","@yaks/graph","@yaks/markdown","@yaks/query","@yaks/render","@yaks/rtc","@yaks/stage","@yaks/tools","@yaks/ui","@yaks/ux","@yaks/vocab","@yaks/voxel"]}]