mirror of
https://github.com/profullstack/logicsrc.git
synced 2026-10-01 20:33:50 +00:00
Publish OpenAgent profile specification and discovery (#188)
This commit is contained in:
parent
fd25e8e4ba
commit
f389edb6f8
8 changed files with 218 additions and 1 deletions
|
|
@ -9,6 +9,7 @@ import sitemap from "../src/app/sitemap";
|
|||
vi.mock("../src/lib/supabase", () => ({ publicClient: () => { throw new Error("offline"); } }));
|
||||
|
||||
describe.each([
|
||||
{ slug: "openagent", name: "OpenAgent", family: "people" },
|
||||
{ slug: "openabtest", name: "OpenABTest", family: "process" },
|
||||
{ slug: "openfleet", name: "OpenFleet", family: "process" },
|
||||
{ slug: "openrental", name: "OpenRental", family: "catalogs" },
|
||||
|
|
|
|||
13
apps/logicsrc-web/public/examples/openagent.json
Normal file
13
apps/logicsrc-web/public/examples/openagent.json
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"type": "logicsrc.agent",
|
||||
"version": "0.1",
|
||||
"name": "Research agent",
|
||||
"did": "research.coinpay",
|
||||
"owner_did": "operator.coinpay",
|
||||
"description": "Find primary sources and prepare a cited research brief.",
|
||||
"skills": ["research", "source-verification"],
|
||||
"supported_task_types": ["research-brief"],
|
||||
"permissions_requested": ["web:read"],
|
||||
"polling_mode": true,
|
||||
"public": true
|
||||
}
|
||||
66
apps/logicsrc-web/src/app/openagent/page.tsx
Normal file
66
apps/logicsrc-web/src/app/openagent/page.tsx
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
import Link from "next/link";
|
||||
import type { Metadata } from "next";
|
||||
import { SiteShell } from "@/components/site-shell";
|
||||
import profile from "../../../public/examples/openagent.json";
|
||||
import { mono, pre, table, td } from "../openontology/ui";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "OpenAgent · LogicSRC",
|
||||
description: "A portable agent profile: identity, owner, skills and requested permissions in one JSON file, with bindings to OpenProfile, OpenFleet and OpenRental.",
|
||||
alternates: { canonical: "/openagent" }
|
||||
};
|
||||
|
||||
const LINKS = [
|
||||
["OpenProfile.md", "/openprofile", "The identity, accounts and topics people read. Link the JSON descriptor from the same profile page."],
|
||||
["OpenFleet", "/openfleet", "The running sessions and their human sysop. A launcher maps one agent profile to many fleet members."],
|
||||
["OpenRental", "/docs/openrental", "Agent listings and explicit rental offers. An openagent member points at this profile and matches its did."],
|
||||
["OpenAccess", "/openaccess", "The delegated grant. Requested permissions in a profile do not grant access."],
|
||||
["OpenCreds", "/opencreds", "The vault for credentials. The public profile contains no secrets."]
|
||||
];
|
||||
|
||||
export default function OpenAgentPage() {
|
||||
return (
|
||||
<SiteShell active="OpenAgent">
|
||||
<section className="band">
|
||||
<div className="section-head">
|
||||
<p className="eyebrow">People and agents · specification 0.1</p>
|
||||
<h2>OpenAgent</h2>
|
||||
<p>One file says who an agent is, who owns it, what it can do and which permissions it requests.</p>
|
||||
</div>
|
||||
<p>A directory, a job board and a launcher can read the same JSON profile. The agent keeps its identity when its hosting or engine changes, and each running session can be tracked separately through OpenFleet.</p>
|
||||
<p>The format is the existing <code style={mono}>logicsrc.agent</code> contract. Its schema and offline validator already ship in LogicSRC; this publication adds discovery conventions and explains how the profile fits the other specifications.</p>
|
||||
<p><Link className="button-primary" href="/docs/openagent">Read the specification</Link>{" "}<a href="/examples/openagent.json">Download the example</a></p>
|
||||
</section>
|
||||
|
||||
<section className="band">
|
||||
<div className="section-head">
|
||||
<h2>The profile</h2>
|
||||
<p>An illustrative research agent. Identity and ownership are claims for the consuming application to verify.</p>
|
||||
</div>
|
||||
<pre style={pre}>{JSON.stringify(profile, null, 2)}</pre>
|
||||
<p>Seven required fields: <code style={mono}>type</code>, <code style={mono}>version</code>, <code style={mono}>name</code>, <code style={mono}>did</code>, <code style={mono}>owner_did</code>, <code style={mono}>skills</code> and <code style={mono}>permissions_requested</code>. Skills must be nonempty. A permission request can be empty, and never authorizes execution by itself.</p>
|
||||
</section>
|
||||
|
||||
<section className="band">
|
||||
<div className="section-head">
|
||||
<h2>Serve it, link it, validate it</h2>
|
||||
</div>
|
||||
<p>Serve one JSON profile over HTTPS. A domain for one agent can use <code style={mono}>/.well-known/openagent.json</code>; a host with several agents gives each its own URL. Link the descriptor from its profile page:</p>
|
||||
<pre style={pre}>{'<link rel="openagent" type="application/json" href="https://example.com/agents/research.json">'}</pre>
|
||||
<p>Try the existing validator on the downloadable example:</p>
|
||||
<pre style={pre}>{"curl -fsS https://logicsrc.com/examples/openagent.json -o agent.json\nnpx --yes --package @logicsrc/validators logicsrc-validate agent agent.json"}</pre>
|
||||
<p>Validation checks the shape. Ownership, grants, availability and settlement are checked by the application using the profile. The specification documents the current identity syntax and the SDK runtime-summary distinction.</p>
|
||||
</section>
|
||||
|
||||
<section className="band">
|
||||
<div className="section-head"><h2>How the pieces fit</h2></div>
|
||||
<table style={table}>
|
||||
<tbody>{LINKS.map(([name, href, description]) => (
|
||||
<tr key={name}><td style={td}><Link href={href}>{name}</Link></td><td style={td}>{description}</td></tr>
|
||||
))}</tbody>
|
||||
</table>
|
||||
<p><Link href="/openswarm">OpenSwarm</Link> describes peer-to-peer file distribution. An agent profile and a file swarm keep their own identities when they appear together in a rental listing.</p>
|
||||
</section>
|
||||
</SiteShell>
|
||||
);
|
||||
}
|
||||
|
|
@ -251,6 +251,7 @@ export default function OpenFleetPage(): ReactNode {
|
|||
<h2>Where everything lives</h2>
|
||||
</div>
|
||||
<ul style={{ color: "#41505d", lineHeight: 1.9, paddingLeft: "1.1rem" }}>
|
||||
<li><Link href="/openagent">OpenAgent</Link>: the durable agent profile; one identity can have many running fleet members</li>
|
||||
<li>
|
||||
<Link href="/docs/openfleet">Specification</Link>: the terms, the record, the
|
||||
environment, claiming and deriving, the ledger's eight events, five verbs, fifteen
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ export const FAMILIES: Family[] = [
|
|||
"One Markdown file for a person or an agent, served from their own domain and linked from every platform that has a page for them. The profile carries the identity, the accounts and the topics; the sections carry what a platform needs to match on, so a job board, a booking site or a dating app reads the file instead of asking forty questions again.",
|
||||
specs: [
|
||||
s("openprofile", "OpenProfile.md", "One Markdown file for who you are and where you are, people and agents alike", { status: "0.2" }),
|
||||
s("openagent", "OpenAgent", "A portable agent profile: identity, owner, skills and requested permissions", { status: "0.1" }),
|
||||
s("openwall", "OpenWall", "Consent-based broadcasts and direct messages across contact networks, with an AT Protocol mapping", { landing: undefined, status: "draft" }),
|
||||
s("openresume", "OpenResume.md", "What you have done, in the same spirit, linked from the profile", { landing: undefined }),
|
||||
s("openjob", "OpenJob", "What the work is, so a candidate's agent and a job board agree", { landing: undefined }),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue