agent-protocols 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -19
- package/dist/delegation.d.ts +57 -36
- package/dist/delegation.d.ts.map +1 -1
- package/dist/delegation.js +208 -69
- package/dist/delegation.js.map +1 -1
- package/dist/discourse.d.ts +196 -74
- package/dist/discourse.d.ts.map +1 -1
- package/dist/discourse.js +568 -116
- package/dist/discourse.js.map +1 -1
- package/dist/http-client.d.ts +43 -18
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +86 -32
- package/dist/http-client.js.map +1 -1
- package/dist/identity.d.ts +100 -3
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +333 -7
- package/dist/identity.js.map +1 -1
- package/dist/local-connector/catalog.d.ts +1 -16
- package/dist/local-connector/catalog.d.ts.map +1 -1
- package/dist/local-connector/catalog.js +53 -71
- package/dist/local-connector/catalog.js.map +1 -1
- package/dist/local-connector/engine.d.ts +55 -32
- package/dist/local-connector/engine.d.ts.map +1 -1
- package/dist/local-connector/engine.js +636 -608
- package/dist/local-connector/engine.js.map +1 -1
- package/dist/local-connector/inputs.d.ts +28 -76
- package/dist/local-connector/inputs.d.ts.map +1 -1
- package/dist/local-connector/inputs.js +19 -1
- package/dist/local-connector/inputs.js.map +1 -1
- package/dist/local-connector/projection.d.ts +24 -9
- package/dist/local-connector/projection.d.ts.map +1 -1
- package/dist/local-connector/projection.js +78 -39
- package/dist/local-connector/projection.js.map +1 -1
- package/dist/local-connector/state.d.ts +10 -3
- package/dist/local-connector/state.d.ts.map +1 -1
- package/dist/local-connector/state.js +3 -0
- package/dist/local-connector/state.js.map +1 -1
- package/dist/local-connector/views.d.ts +36 -12
- package/dist/local-connector/views.d.ts.map +1 -1
- package/dist/local-connector/views.js +49 -31
- package/dist/local-connector/views.js.map +1 -1
- package/dist/profile.d.ts +23 -9
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +120 -3
- package/dist/profile.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/local-connector/views.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,0EAA0E;AAE1E,OAAO,
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/local-connector/views.ts"],"names":[],"mappings":"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"}
|
package/dist/profile.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AgentId, Envelope, Event } from "./identity.js";
|
|
2
|
-
import type
|
|
1
|
+
import { AgentId, Envelope, Event, ListResponse } from "./identity.js";
|
|
2
|
+
import { type PrincipalDescriptor } from "./delegation.js";
|
|
3
3
|
export declare const PROFILE_PROTOCOL = "agent-profile/1.0";
|
|
4
4
|
export declare const PROFILE_UPDATE = "profile.update";
|
|
5
5
|
export interface ServiceEndpoint {
|
|
@@ -7,7 +7,11 @@ export interface ServiceEndpoint {
|
|
|
7
7
|
url: string;
|
|
8
8
|
protocols?: string[];
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Defined link relationships. `rel` is an open vocabulary: clients accept other
|
|
12
|
+
* non-empty values and may render them as generic links.
|
|
13
|
+
*/
|
|
14
|
+
export type ProfileLinkRel = "homepage" | "documentation" | "source_code" | "social" | "browser" | (string & {});
|
|
11
15
|
export interface ProfileLink {
|
|
12
16
|
name: string;
|
|
13
17
|
url: string;
|
|
@@ -53,12 +57,10 @@ export interface AgentProfile {
|
|
|
53
57
|
export interface ProfileBatchReadRequest {
|
|
54
58
|
ids: AgentId[];
|
|
55
59
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
export
|
|
60
|
-
result: Envelope<ProfileUpdatePayload>[];
|
|
61
|
-
}
|
|
60
|
+
/** Agent Identity list of profile documents; never carries `next_cursor`. */
|
|
61
|
+
export type ProfileBatchReadResponse = ListResponse<AgentProfile>;
|
|
62
|
+
/** Agent Identity list of accepted updates, newest first by `nonce`. */
|
|
63
|
+
export type ProfileEventsResponse = ListResponse<Envelope<ProfileUpdatePayload>>;
|
|
62
64
|
export interface ProfileServiceEndpoints {
|
|
63
65
|
profiles: string;
|
|
64
66
|
profile_batch?: string;
|
|
@@ -71,7 +73,19 @@ export interface ProfileServiceDiscovery {
|
|
|
71
73
|
}
|
|
72
74
|
export declare function profileUpdateEvent(actor: AgentId, createdAt: number, nonce: number, payload: ProfileUpdatePayload): Event<ProfileUpdatePayload>;
|
|
73
75
|
export declare function validateProfileUpdate(envelope: Envelope<ProfileUpdatePayload>): void;
|
|
76
|
+
/**
|
|
77
|
+
* Section 4.1 rules for a closed `profile.update` payload: only defined
|
|
78
|
+
* fields, `id` equal to the signing `actor`, and the field rules for names,
|
|
79
|
+
* URLs, uniqueness, and delegation hints.
|
|
80
|
+
*/
|
|
81
|
+
export declare function validateProfilePayload(payload: unknown, actor: AgentId): asserts payload is ProfileUpdatePayload;
|
|
74
82
|
export declare function materializeProfile(envelope: Envelope<ProfileUpdatePayload>): AgentProfile;
|
|
83
|
+
/**
|
|
84
|
+
* Durable ordering check for a new update (Agent Profile Section 6): its nonce
|
|
85
|
+
* must exceed the nonce of the latest accepted update for the same Agent ID,
|
|
86
|
+
* independent of the replay cache. `latestNonce` is the stored latest nonce.
|
|
87
|
+
*/
|
|
88
|
+
export declare function validateProfileSuccession(envelope: Envelope<ProfileUpdatePayload>, latestNonce: number | undefined): void;
|
|
75
89
|
/**
|
|
76
90
|
* Selects the latest profile state from accepted update envelopes. Nonces are
|
|
77
91
|
* strictly monotonic per Agent ID, so the latest profile is defined as the
|
package/dist/profile.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,KAAK,
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|
package/dist/profile.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { protocolError } from "./errors.js";
|
|
2
|
-
import { createEvent, verifyEnvelope, } from "./identity.js";
|
|
2
|
+
import { createEvent, validateAgentId, validateEventFields, verifyEnvelope, } from "./identity.js";
|
|
3
|
+
import { validateDelegationId } from "./delegation.js";
|
|
3
4
|
export const PROFILE_PROTOCOL = "agent-profile/1.0";
|
|
4
5
|
export const PROFILE_UPDATE = "profile.update";
|
|
5
6
|
export function profileUpdateEvent(actor, createdAt, nonce, payload) {
|
|
@@ -7,16 +8,122 @@ export function profileUpdateEvent(actor, createdAt, nonce, payload) {
|
|
|
7
8
|
}
|
|
8
9
|
export function validateProfileUpdate(envelope) {
|
|
9
10
|
verifyEnvelope(envelope);
|
|
11
|
+
// Profile events carry only the six Agent Identity event fields.
|
|
12
|
+
validateEventFields(envelope.event);
|
|
10
13
|
if (envelope.event.protocol !== PROFILE_PROTOCOL) {
|
|
11
14
|
throw protocolError("invalid_event_protocol", `expected ${PROFILE_PROTOCOL}, got ${envelope.event.protocol}`);
|
|
12
15
|
}
|
|
13
16
|
if (envelope.event.type !== PROFILE_UPDATE) {
|
|
14
17
|
throw protocolError("invalid_event_type", `expected ${PROFILE_UPDATE}, got ${envelope.event.type}`);
|
|
15
18
|
}
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
validateProfilePayload(envelope.event.payload, envelope.event.actor);
|
|
20
|
+
}
|
|
21
|
+
const PAYLOAD_FIELDS = [
|
|
22
|
+
"id", "name", "description", "avatar_url", "provider", "capabilities",
|
|
23
|
+
"service_endpoints", "links", "delegations", "extra",
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Section 4.1 rules for a closed `profile.update` payload: only defined
|
|
27
|
+
* fields, `id` equal to the signing `actor`, and the field rules for names,
|
|
28
|
+
* URLs, uniqueness, and delegation hints.
|
|
29
|
+
*/
|
|
30
|
+
export function validateProfilePayload(payload, actor) {
|
|
31
|
+
if (!isRecord(payload))
|
|
32
|
+
invalid("payload must be an object");
|
|
33
|
+
if (!payload.id || payload.id !== actor) {
|
|
18
34
|
throw protocolError("invalid_actor", "profile update actor must match payload.id");
|
|
19
35
|
}
|
|
36
|
+
validateAgentId(payload.id);
|
|
37
|
+
for (const key of Object.keys(payload)) {
|
|
38
|
+
if (!PAYLOAD_FIELDS.includes(key))
|
|
39
|
+
invalid(`undefined profile field: ${key}`);
|
|
40
|
+
}
|
|
41
|
+
if (typeof payload.name !== "string" || payload.name === "")
|
|
42
|
+
invalid("name must be a non-empty string");
|
|
43
|
+
for (const field of ["description", "provider"]) {
|
|
44
|
+
if (payload[field] !== undefined && typeof payload[field] !== "string")
|
|
45
|
+
invalid(`${field} must be a string`);
|
|
46
|
+
}
|
|
47
|
+
if (payload.avatar_url !== undefined)
|
|
48
|
+
requireUrl(payload.avatar_url, ["https:"], "avatar_url");
|
|
49
|
+
if (payload.extra !== undefined && !isRecord(payload.extra))
|
|
50
|
+
invalid("extra must be an object");
|
|
51
|
+
uniqueStrings(payload.capabilities, "capabilities");
|
|
52
|
+
const endpoints = new Set();
|
|
53
|
+
for (const endpoint of list(payload.service_endpoints, "service_endpoints")) {
|
|
54
|
+
closed(endpoint, ["type", "url", "protocols"], "service endpoint");
|
|
55
|
+
if (typeof endpoint.type !== "string" || endpoint.type === "")
|
|
56
|
+
invalid("service endpoint type must not be empty");
|
|
57
|
+
requireUrl(endpoint.url, ["https:"], "service endpoint url");
|
|
58
|
+
uniqueStrings(endpoint.protocols, "service endpoint protocols");
|
|
59
|
+
const key = JSON.stringify([endpoint.type, endpoint.url]);
|
|
60
|
+
if (endpoints.has(key))
|
|
61
|
+
invalid("service endpoints must be unique by type and url");
|
|
62
|
+
endpoints.add(key);
|
|
63
|
+
}
|
|
64
|
+
const links = new Set();
|
|
65
|
+
for (const link of list(payload.links, "links")) {
|
|
66
|
+
closed(link, ["name", "url", "rel"], "link");
|
|
67
|
+
if (typeof link.name !== "string" || link.name === "" || typeof link.rel !== "string" || link.rel === "") {
|
|
68
|
+
invalid("link name and rel must not be empty");
|
|
69
|
+
}
|
|
70
|
+
requireUrl(link.url, ["http:", "https:"], "link url");
|
|
71
|
+
const key = JSON.stringify([link.url, link.rel]);
|
|
72
|
+
if (links.has(key))
|
|
73
|
+
invalid("links must be unique by url and rel");
|
|
74
|
+
links.add(key);
|
|
75
|
+
}
|
|
76
|
+
for (const hint of list(payload.delegations, "delegations")) {
|
|
77
|
+
closed(hint, ["id", "principal", "relationship", "scopes"], "delegation hint");
|
|
78
|
+
if (hint.id !== undefined)
|
|
79
|
+
validateDelegationId(hint.id);
|
|
80
|
+
if (!isRecord(hint.principal))
|
|
81
|
+
invalid("delegation hint requires a principal");
|
|
82
|
+
requireUrl(hint.principal.id, ["https:"], "delegation principal id");
|
|
83
|
+
if (hint.relationship !== undefined && typeof hint.relationship !== "string")
|
|
84
|
+
invalid("relationship must be a string");
|
|
85
|
+
uniqueStrings(hint.scopes, "delegation hint scopes");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function invalid(message) {
|
|
89
|
+
throw protocolError("invalid_event", message);
|
|
90
|
+
}
|
|
91
|
+
function isRecord(value) {
|
|
92
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
93
|
+
}
|
|
94
|
+
function list(value, field) {
|
|
95
|
+
if (value === undefined)
|
|
96
|
+
return [];
|
|
97
|
+
if (!Array.isArray(value) || !value.every(isRecord))
|
|
98
|
+
invalid(`${field} must be an array of objects`);
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
function closed(value, fields, name) {
|
|
102
|
+
for (const key of Object.keys(value)) {
|
|
103
|
+
if (!fields.includes(key))
|
|
104
|
+
invalid(`undefined ${name} field: ${key}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function requireUrl(value, protocols, field) {
|
|
108
|
+
let url;
|
|
109
|
+
try {
|
|
110
|
+
url = typeof value === "string" ? new URL(value) : undefined;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
url = undefined;
|
|
114
|
+
}
|
|
115
|
+
if (!url || !protocols.includes(url.protocol) || url.hostname === "") {
|
|
116
|
+
invalid(`${field} must be an ${protocols.map((p) => p.slice(0, -1)).join(" or ")} URL`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function uniqueStrings(value, field) {
|
|
120
|
+
if (value === undefined)
|
|
121
|
+
return;
|
|
122
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string" || item === "")) {
|
|
123
|
+
invalid(`${field} entries must be non-empty strings`);
|
|
124
|
+
}
|
|
125
|
+
if (new Set(value).size !== value.length)
|
|
126
|
+
invalid(`${field} entries must be unique`);
|
|
20
127
|
}
|
|
21
128
|
export function materializeProfile(envelope) {
|
|
22
129
|
validateProfileUpdate(envelope);
|
|
@@ -36,6 +143,16 @@ export function materializeProfile(envelope) {
|
|
|
36
143
|
event_id: envelope.hash,
|
|
37
144
|
};
|
|
38
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Durable ordering check for a new update (Agent Profile Section 6): its nonce
|
|
148
|
+
* must exceed the nonce of the latest accepted update for the same Agent ID,
|
|
149
|
+
* independent of the replay cache. `latestNonce` is the stored latest nonce.
|
|
150
|
+
*/
|
|
151
|
+
export function validateProfileSuccession(envelope, latestNonce) {
|
|
152
|
+
if (latestNonce !== undefined && envelope.event.nonce <= latestNonce) {
|
|
153
|
+
throw protocolError("nonce_not_greater", `nonce must be greater than the latest accepted profile nonce ${latestNonce}`, { max_nonce: latestNonce });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
39
156
|
/**
|
|
40
157
|
* Selects the latest profile state from accepted update envelopes. Nonces are
|
|
41
158
|
* strictly monotonic per Agent ID, so the latest profile is defined as the
|
package/dist/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|