openvibers/openvibe.run Commits
OpenVibe Link: the new name in pages, docs and messages (#209)
Changes
@@@ -7,7 +7,7 @@* Run is the job service of the network (plan T14, ADR-034): it owns the API, the project scope and the* placement, on its own PostgreSQL (ADR-035). Bot owns the node link and the per-second metering of the jobs it* carries (plan T14 L1). The one exception is an external managed-browser provider (plan T14 R4a): it is not a-- * paired Node and writes no usage of its own, so Run meters those jobs itself and posts their readings with a++ * paired Link and writes no usage of its own, so Run meters those jobs itself and posts their readings with a* Billing token of its own (billing.usage.record, audience openvibe.billing), used for nothing else. The* provider's API key lives in Run's environment only: never in an offer, a job or a log.*/@@@ -4,7 +4,7 @@* The managed-browser provider adapter — Run → an external managed-browser provider's job API (plan T14 R4a,* ADR-034; Run's own outbound capability browser_provider.job.dispatch, contracts/manifests/capabilities). A* class `browser` job placed on a kind=provider offer named `browser-provider` goes here instead of Bot: the-- * provider is not a paired Node, so there is no Bot in between and Run meters the job itself.++ * provider is not a paired Link, so there is no Bot in between and Run meters the job itself.** send({ job }) POST {url}/jobs browser-provider.job-create-request@1 → job-create-result@1* state(jobId) GET {url}/jobs/{id} → browser-provider.job-state@1 | null@@@ -9,7 +9,7 @@* choose(row) → { node_id, provider, region, offer_id, trust, reasons } | null** The candidate offers come from OpenVibe.Network's public resource registry-- * (GET {OV_NETWORK_URL}/api/v1/offers?kind=node), where a paired Node's runtime classes are published as++ * (GET {OV_NETWORK_URL}/api/v1/offers?kind=node), where a paired Link's runtime classes are published as* platform.resource-offer@1 with the reserved `worker:<class>` capability (ADR-036 §3: "device node_id →* resource-offer.node_id"), so an offer's node_id is the device Bot dispatches to. The public projection* leaves `capacity` out (Network redacts it), so the `worker:<class>` free-slot check inside plan() cannot@@@ -3,7 +3,7 @@/*** Bench priors for Run's placement (agent plan A1): Bench's quality per model on the kind of step, cached for an* hour. A job's runtime class maps to a Bench kind when one exists (code → codes.patch), and an offer names its model-- * in detail.model; an offer with no model (a paired Node) simply has no prior and place() uses its 0.7 default.++ * in detail.model; an offer with no model (a paired Link) simply has no prior and place() uses its 0.7 default.** The board is public; a Bench that does not answer leaves the map empty rather than delaying the tick for long.*/@@@ -2,7 +2,7 @@/*** Run's own metering (plan T14 R4a, decision B): the usage of a job an external managed-browser provider ran.-- * Bot meters every job it carries and Run never posts those; a provider is not a paired Node and writes no usage,++ * Bot meters every job it carries and Run never posts those; a provider is not a paired Link and writes no usage,* so for its jobs — and only for them — Run queues the readings and posts them to OpenVibe.Billing's* billing.usage.record (POST <RUN_BILLING_URL>/api/v1/usage, one reading per request), the pattern of OpenVibe.Bot's* server/jobs/metering.js.@@@ -26,7 +26,7 @@ function sections(base) {{ title: 'Privacy', url: `${base}/privacy`, html: true },{ title: 'DMCA', url: `${base}/dmca`, html: true },{ title: 'OpenVibe.Run on GitHub', url: REPO, note: 'the source and the README: the job API, its states and its capabilities' },-- { title: 'OpenVibe Node', url: NODE_REPO, note: 'pair your own machine to run jobs' },++ { title: 'OpenVibe Link', url: NODE_REPO, note: 'pair your own machine to run jobs' },],};}@@@ -51,7 +51,7 @@ const FAQ_CSS = '<style>.run-faq{border:1px solid var(--border,#1f2d47);border-rconst code = (s) => `<code>${s.replace(/&/g, '&').replace(/</g, '<')}</code>`;// The samples run as written: the first declares the artifact the other two submit, on the person's own paired machine--// (the OpenVibe Node runs only what its owner declared: OpenVibe.Node docs/worker.md).++// (the OpenVibe Link runs only what its owner declared: the Link repo's docs/worker.md).const MACHINE_EXAMPLE = `# On your paired machine (installed with --worker): a function is a command you declare.# Its args arrive as one line of JSON on stdin, its stdout streams back, and fd 3 is its result.sudo mkdir -p /opt/fn/hello && sudo tee /opt/fn/hello/run > /dev/null <<'EOF'@@@ -177,7 +177,7 @@ function body() {lede: 'Pair a computer once and the jobs you start run there, on your hardware, with their output streamed back to you. '+ 'Or send a job to one API with your project\'s token: Run picks a node that offers the runtime it asks for and meters it per second.',actions: [{ label: 'Pair your machine', href: 'https://openvibe.bot/machines', primary: true }, { label: 'Try it from OpenVibe.Codes', href: 'https://openvibe.codes/run' }, { label: 'The API', href: '#api' }],-- note: 'Alpha. A job runs on nodes paired with OpenVibe (the OpenVibe Node); with none online for its class it waits, then expires.',++ note: 'Alpha. A job runs on nodes paired with OpenVibe (the OpenVibe Link); with none online for its class it waits, then expires.',}) + showcase.steps({id: 'machine',title: 'Your machine, your jobs',@@@ -202,7 +202,7 @@ function body() {lede: 'A job names the class of machine it needs. What each one is today:',columns: ['What runs', 'Today'],rows: [-- { label: 'function', values: ['A registered artifact on a paired OpenVibe Node', 'Works'] },++ { label: 'function', values: ['A registered artifact on a paired OpenVibe Link', 'Works'] },{ label: 'code', values: ['An OpenVibe.Codes task on your own machine', 'Works'] },{ label: 'browser', values: ['A page in a managed browser', 'Built, not switched on yet'] },{ label: 'linux, desktop, gpu', values: ['Reserved names for the machines they say', 'Not yet'] },@@@ -234,8 +234,8 @@ function body() {}) + (FAQ.length ? `<section class="sc-sec" id="questions" aria-labelledby="run-faq-h"><h2 id="run-faq-h">Questions</h2>${FAQ.map((f) => `<details class="run-faq"><summary>${esc(f.q)}</summary><p>${esc(f.a)}</p></details>`).join('')}</section>` : '')+ showcase.cta({title: 'Open source',-- text: 'Run is AGPL-3.0, and so is the OpenVibe Node that turns a computer into a worker.',-- actions: [{ label: 'OpenVibers/OpenVibe.Run', href: 'https://github.com/OpenVibers/OpenVibe.Run' }, { label: 'The OpenVibe Node', href: 'https://github.com/OpenVibers/OpenVibe.Node' }],++ text: 'Run is AGPL-3.0, and so is the OpenVibe Link that turns a computer into a worker.',++ actions: [{ label: 'OpenVibers/OpenVibe.Run', href: 'https://github.com/OpenVibers/OpenVibe.Run' }, { label: 'The OpenVibe Link', href: 'https://github.com/OpenVibers/OpenVibe.Node' }],});}@@@ -23,7 +23,7 @@ const DEVICE = 'dev_01J8Z4M2Q0R7T9YV3K6N8P1W2X'; // the device Bot dispatchesconst OTHER_DEVICE = 'dev_01J8Z4M2Q0R7T9YV3K6N8P1W2XQ';const PROJECT = () => ids.newId('project');--/** A contract-valid platform.resource-offer@1 for a paired Node advertising worker:<class>. */++/** A contract-valid platform.resource-offer@1 for a paired Link advertising worker:<class>. */function offer(over = {}) {return {offer_id: 'off_node_01',
@@ -7,7 +7,7 @@
@@ -7,7 +7,7 @@
* Run is the job service of the network (plan T14, ADR-034): it owns the API, the project scope and the
* Run is the job service of the network (plan T14, ADR-034): it owns the API, the project scope and the
* placement, on its own PostgreSQL (ADR-035). Bot owns the node link and the per-second metering of the jobs it
* placement, on its own PostgreSQL (ADR-035). Bot owns the node link and the per-second metering of the jobs it
* carries (plan T14 L1). The one exception is an external managed-browser provider (plan T14 R4a): it is not a
* carries (plan T14 L1). The one exception is an external managed-browser provider (plan T14 R4a): it is not a
- * paired Node and writes no usage of its own, so Run meters those jobs itself and posts their readings with a
+ * paired Link and writes no usage of its own, so Run meters those jobs itself and posts their readings with a
* Billing token of its own (billing.usage.record, audience openvibe.billing), used for nothing else. The
* Billing token of its own (billing.usage.record, audience openvibe.billing), used for nothing else. The
* provider's API key lives in Run's environment only: never in an offer, a job or a log.
* provider's API key lives in Run's environment only: never in an offer, a job or a log.
*/
*/
@@ -4,7 +4,7 @@
@@ -4,7 +4,7 @@
* The managed-browser provider adapter — Run → an external managed-browser provider's job API (plan T14 R4a,
* The managed-browser provider adapter — Run → an external managed-browser provider's job API (plan T14 R4a,
* ADR-034; Run's own outbound capability browser_provider.job.dispatch, contracts/manifests/capabilities). A
* ADR-034; Run's own outbound capability browser_provider.job.dispatch, contracts/manifests/capabilities). A
* class `browser` job placed on a kind=provider offer named `browser-provider` goes here instead of Bot: the
* class `browser` job placed on a kind=provider offer named `browser-provider` goes here instead of Bot: the
- * provider is not a paired Node, so there is no Bot in between and Run meters the job itself.
+ * provider is not a paired Link, so there is no Bot in between and Run meters the job itself.
*
*
* send({ job }) POST {url}/jobs browser-provider.job-create-request@1 → job-create-result@1
* send({ job }) POST {url}/jobs browser-provider.job-create-request@1 → job-create-result@1
* state(jobId) GET {url}/jobs/{id} → browser-provider.job-state@1 | null
* state(jobId) GET {url}/jobs/{id} → browser-provider.job-state@1 | null
@@ -9,7 +9,7 @@
@@ -9,7 +9,7 @@
* choose(row) → { node_id, provider, region, offer_id, trust, reasons } | null
* choose(row) → { node_id, provider, region, offer_id, trust, reasons } | null
*
*
* The candidate offers come from OpenVibe.Network's public resource registry
* The candidate offers come from OpenVibe.Network's public resource registry
- * (GET {OV_NETWORK_URL}/api/v1/offers?kind=node), where a paired Node's runtime classes are published as
+ * (GET {OV_NETWORK_URL}/api/v1/offers?kind=node), where a paired Link's runtime classes are published as
* platform.resource-offer@1 with the reserved `worker:<class>` capability (ADR-036 §3: "device node_id →
* platform.resource-offer@1 with the reserved `worker:<class>` capability (ADR-036 §3: "device node_id →
* resource-offer.node_id"), so an offer's node_id is the device Bot dispatches to. The public projection
* resource-offer.node_id"), so an offer's node_id is the device Bot dispatches to. The public projection
* leaves `capacity` out (Network redacts it), so the `worker:<class>` free-slot check inside plan() cannot
* leaves `capacity` out (Network redacts it), so the `worker:<class>` free-slot check inside plan() cannot
@@ -3,7 +3,7 @@
@@ -3,7 +3,7 @@
/**
/**
* Bench priors for Run's placement (agent plan A1): Bench's quality per model on the kind of step, cached for an
* Bench priors for Run's placement (agent plan A1): Bench's quality per model on the kind of step, cached for an
* hour. A job's runtime class maps to a Bench kind when one exists (code → codes.patch), and an offer names its model
* hour. A job's runtime class maps to a Bench kind when one exists (code → codes.patch), and an offer names its model
- * in detail.model; an offer with no model (a paired Node) simply has no prior and place() uses its 0.7 default.
+ * in detail.model; an offer with no model (a paired Link) simply has no prior and place() uses its 0.7 default.
*
*
* The board is public; a Bench that does not answer leaves the map empty rather than delaying the tick for long.
* The board is public; a Bench that does not answer leaves the map empty rather than delaying the tick for long.
*/
*/
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
/**
/**
* Run's own metering (plan T14 R4a, decision B): the usage of a job an external managed-browser provider ran.
* Run's own metering (plan T14 R4a, decision B): the usage of a job an external managed-browser provider ran.
- * Bot meters every job it carries and Run never posts those; a provider is not a paired Node and writes no usage,
+ * Bot meters every job it carries and Run never posts those; a provider is not a paired Link and writes no usage,
* so for its jobs — and only for them — Run queues the readings and posts them to OpenVibe.Billing's
* so for its jobs — and only for them — Run queues the readings and posts them to OpenVibe.Billing's
* billing.usage.record (POST <RUN_BILLING_URL>/api/v1/usage, one reading per request), the pattern of OpenVibe.Bot's
* billing.usage.record (POST <RUN_BILLING_URL>/api/v1/usage, one reading per request), the pattern of OpenVibe.Bot's
* server/jobs/metering.js.
* server/jobs/metering.js.
@@ -26,7 +26,7 @@ function sections(base) {
@@ -26,7 +26,7 @@ function sections(base) {
{ title: 'Privacy', url: `${base}/privacy`, html: true },
{ title: 'Privacy', url: `${base}/privacy`, html: true },
{ title: 'DMCA', url: `${base}/dmca`, html: true },
{ title: 'DMCA', url: `${base}/dmca`, html: true },
{ title: 'OpenVibe.Run on GitHub', url: REPO, note: 'the source and the README: the job API, its states and its capabilities' },
{ title: 'OpenVibe.Run on GitHub', url: REPO, note: 'the source and the README: the job API, its states and its capabilities' },
- { title: 'OpenVibe Node', url: NODE_REPO, note: 'pair your own machine to run jobs' },
+ { title: 'OpenVibe Link', url: NODE_REPO, note: 'pair your own machine to run jobs' },
],
],
};
};
}
}
@@ -51,7 +51,7 @@ const FAQ_CSS = '<style>.run-faq{border:1px solid var(--border,#1f2d47);border-r
@@ -51,7 +51,7 @@ const FAQ_CSS = '<style>.run-faq{border:1px solid var(--border,#1f2d47);border-r
const code = (s) => `<code>${s.replace(/&/g, '&').replace(/</g, '<')}</code>`;
const code = (s) => `<code>${s.replace(/&/g, '&').replace(/</g, '<')}</code>`;
// The samples run as written: the first declares the artifact the other two submit, on the person's own paired machine
// The samples run as written: the first declares the artifact the other two submit, on the person's own paired machine
-// (the OpenVibe Node runs only what its owner declared: OpenVibe.Node docs/worker.md).
+// (the OpenVibe Link runs only what its owner declared: the Link repo's docs/worker.md).
const MACHINE_EXAMPLE = `# On your paired machine (installed with --worker): a function is a command you declare.
const MACHINE_EXAMPLE = `# On your paired machine (installed with --worker): a function is a command you declare.
# Its args arrive as one line of JSON on stdin, its stdout streams back, and fd 3 is its result.
# Its args arrive as one line of JSON on stdin, its stdout streams back, and fd 3 is its result.
sudo mkdir -p /opt/fn/hello && sudo tee /opt/fn/hello/run > /dev/null <<'EOF'
sudo mkdir -p /opt/fn/hello && sudo tee /opt/fn/hello/run > /dev/null <<'EOF'
@@ -177,7 +177,7 @@ function body() {
@@ -177,7 +177,7 @@ function body() {
lede: 'Pair a computer once and the jobs you start run there, on your hardware, with their output streamed back to you. '
lede: 'Pair a computer once and the jobs you start run there, on your hardware, with their output streamed back to you. '
+ 'Or send a job to one API with your project\'s token: Run picks a node that offers the runtime it asks for and meters it per second.',
+ 'Or send a job to one API with your project\'s token: Run picks a node that offers the runtime it asks for and meters it per second.',
actions: [{ label: 'Pair your machine', href: 'https://openvibe.bot/machines', primary: true }, { label: 'Try it from OpenVibe.Codes', href: 'https://openvibe.codes/run' }, { label: 'The API', href: '#api' }],
actions: [{ label: 'Pair your machine', href: 'https://openvibe.bot/machines', primary: true }, { label: 'Try it from OpenVibe.Codes', href: 'https://openvibe.codes/run' }, { label: 'The API', href: '#api' }],
- note: 'Alpha. A job runs on nodes paired with OpenVibe (the OpenVibe Node); with none online for its class it waits, then expires.',
+ note: 'Alpha. A job runs on nodes paired with OpenVibe (the OpenVibe Link); with none online for its class it waits, then expires.',
}) + showcase.steps({
}) + showcase.steps({
id: 'machine',
id: 'machine',
title: 'Your machine, your jobs',
title: 'Your machine, your jobs',
@@ -202,7 +202,7 @@ function body() {
@@ -202,7 +202,7 @@ function body() {
lede: 'A job names the class of machine it needs. What each one is today:',
lede: 'A job names the class of machine it needs. What each one is today:',
columns: ['What runs', 'Today'],
columns: ['What runs', 'Today'],
rows: [
rows: [
- { label: 'function', values: ['A registered artifact on a paired OpenVibe Node', 'Works'] },
+ { label: 'function', values: ['A registered artifact on a paired OpenVibe Link', 'Works'] },
{ label: 'code', values: ['An OpenVibe.Codes task on your own machine', 'Works'] },
{ label: 'code', values: ['An OpenVibe.Codes task on your own machine', 'Works'] },
{ label: 'browser', values: ['A page in a managed browser', 'Built, not switched on yet'] },
{ label: 'browser', values: ['A page in a managed browser', 'Built, not switched on yet'] },
{ label: 'linux, desktop, gpu', values: ['Reserved names for the machines they say', 'Not yet'] },
{ label: 'linux, desktop, gpu', values: ['Reserved names for the machines they say', 'Not yet'] },
@@ -234,8 +234,8 @@ function body() {
@@ -234,8 +234,8 @@ function body() {
}) + (FAQ.length ? `<section class="sc-sec" id="questions" aria-labelledby="run-faq-h"><h2 id="run-faq-h">Questions</h2>${FAQ.map((f) => `<details class="run-faq"><summary>${esc(f.q)}</summary><p>${esc(f.a)}</p></details>`).join('')}</section>` : '')
}) + (FAQ.length ? `<section class="sc-sec" id="questions" aria-labelledby="run-faq-h"><h2 id="run-faq-h">Questions</h2>${FAQ.map((f) => `<details class="run-faq"><summary>${esc(f.q)}</summary><p>${esc(f.a)}</p></details>`).join('')}</section>` : '')
+ showcase.cta({
+ showcase.cta({
title: 'Open source',
title: 'Open source',
- text: 'Run is AGPL-3.0, and so is the OpenVibe Node that turns a computer into a worker.',
- actions: [{ label: 'OpenVibers/OpenVibe.Run', href: 'https://github.com/OpenVibers/OpenVibe.Run' }, { label: 'The OpenVibe Node', href: 'https://github.com/OpenVibers/OpenVibe.Node' }],
+ text: 'Run is AGPL-3.0, and so is the OpenVibe Link that turns a computer into a worker.',
+ actions: [{ label: 'OpenVibers/OpenVibe.Run', href: 'https://github.com/OpenVibers/OpenVibe.Run' }, { label: 'The OpenVibe Link', href: 'https://github.com/OpenVibers/OpenVibe.Node' }],
});
});
}
}
@@ -23,7 +23,7 @@ const DEVICE = 'dev_01J8Z4M2Q0R7T9YV3K6N8P1W2X'; // the device Bot dispatches
@@ -23,7 +23,7 @@ const DEVICE = 'dev_01J8Z4M2Q0R7T9YV3K6N8P1W2X'; // the device Bot dispatches
const OTHER_DEVICE = 'dev_01J8Z4M2Q0R7T9YV3K6N8P1W2XQ';
const OTHER_DEVICE = 'dev_01J8Z4M2Q0R7T9YV3K6N8P1W2XQ';
const PROJECT = () => ids.newId('project');
const PROJECT = () => ids.newId('project');
-/** A contract-valid platform.resource-offer@1 for a paired Node advertising worker:<class>. */
+/** A contract-valid platform.resource-offer@1 for a paired Link advertising worker:<class>. */
function offer(over = {}) {
function offer(over = {}) {
return {
return {
offer_id: 'off_node_01',
offer_id: 'off_node_01',