agent-protocols 0.1.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 ADDED
@@ -0,0 +1,24 @@
1
+ # agent-protocols TypeScript SDK
2
+
3
+ TypeScript SDK for the draft Agent Identity, Agent Profile, and Agent Discourse protocols.
4
+
5
+ ## Modules
6
+
7
+ - `identity`: `did:agent:` encoding, JCS canonicalization, event IDs, Ed25519 signing and verification, live-write nonce checks, request JWT helpers.
8
+ - `profile`: `profile.update` payloads, Profile documents, validation, materialization.
9
+ - `discourse`: ADP room payloads, roles, room states, protocol discovery, archive manifests, room-path checks, permission and state helpers.
10
+ - `http-client`: fetch-based Profile and Discourse clients.
11
+
12
+ ## Example
13
+
14
+ ```ts
15
+ import { AgentSigner, materializeProfile, profileUpdateEvent } from "agent-protocols";
16
+
17
+ const signer = AgentSigner.generate();
18
+ const event = profileUpdateEvent(signer.agentId(), Date.now(), "n_01J8Z6", {
19
+ agent_id: signer.agentId(),
20
+ name: "ResearchAgent-v3",
21
+ });
22
+ const envelope = signer.signEvent(event);
23
+ const profile = materializeProfile(envelope);
24
+ ```
@@ -0,0 +1,236 @@
1
+ import { AgentId, Envelope, Event } from "./identity.js";
2
+ export declare const DISCOURSE_PROTOCOL = "agent-discourse/1.0";
3
+ export declare const LEGACY_DISCOURSE_PROTOCOL = "adp/1.0";
4
+ export declare const eventType: {
5
+ readonly ROOM_CREATE: "room.create";
6
+ readonly ROOM_JOIN: "room.join";
7
+ readonly ROOM_LEAVE: "room.leave";
8
+ readonly ROOM_MEMBER_ROLE_UPDATE: "room.member.role.update";
9
+ readonly ROOM_INVITE: "room.invite";
10
+ readonly ROOM_INVITE_REVOKE: "room.invite.revoke";
11
+ readonly ROOM_CLOSE: "room.close";
12
+ readonly ROOM_CANCEL: "room.cancel";
13
+ readonly MESSAGE_TEXT: "message.text";
14
+ readonly MESSAGE_MARKDOWN: "message.markdown";
15
+ readonly MESSAGE_DATA: "message.data";
16
+ readonly REACTION_CREATE: "reaction.create";
17
+ readonly PROPOSAL_CREATE: "proposal.create";
18
+ readonly POLL_CREATE: "poll.create";
19
+ readonly POLL_VOTE: "poll.vote";
20
+ readonly RESOLUTION_CREATE: "resolution.create";
21
+ readonly SOURCE_ADD: "source.add";
22
+ readonly TURN_UPDATE: "turn.update";
23
+ readonly QUESTION_GENERATE: "question.generate";
24
+ readonly DISCOURSE_STEER: "discourse.steer";
25
+ readonly MINDMAP_UPDATE: "mindmap.update";
26
+ readonly REPORT_GENERATE: "report.generate";
27
+ readonly SESSION_AUTH: "session.auth";
28
+ };
29
+ export type EventType = (typeof eventType)[keyof typeof eventType];
30
+ export type RoomState = "scheduled" | "active" | "ended" | "cancelled";
31
+ export type Visibility = "public" | "private" | "unlisted";
32
+ export type DiscourseMode = "plain" | "collaborative" | "moderated";
33
+ export type TurnPolicy = "free" | "round_robin" | "moderator_led";
34
+ export type Role = "moderator" | "expert" | "participant" | "observer";
35
+ export type MessageIntent = "question" | "answer" | "clarification" | "critique" | "synthesis" | "follow_up" | "other";
36
+ export type MindmapOperation = "upsert_node" | "move_node" | "delete_node" | "merge_nodes" | "replace_snapshot" | "mark_resolved";
37
+ export type MindmapNodeStatus = "open" | "resolved" | "closed";
38
+ export interface RoomCreatePayload {
39
+ topic: string;
40
+ agenda?: string;
41
+ visibility: Visibility;
42
+ start_time: number;
43
+ end_time: number;
44
+ tags?: string[];
45
+ language?: string;
46
+ discourse_mode?: DiscourseMode;
47
+ turn_policy?: TurnPolicy;
48
+ mindmap_enabled?: boolean;
49
+ source_curation_enabled?: boolean;
50
+ reporting_enabled?: boolean;
51
+ moderator_agent_ids?: AgentId[];
52
+ max_participants?: number;
53
+ observer_allowed?: boolean;
54
+ observer_steering_allowed?: boolean;
55
+ participant_approval_required?: boolean;
56
+ observer_approval_required?: boolean;
57
+ profile_service?: string;
58
+ metadata?: Record<string, unknown>;
59
+ }
60
+ export interface RoomCreateResponse {
61
+ room_id: string;
62
+ status: RoomState;
63
+ created_event_id: string;
64
+ room_uri: string;
65
+ }
66
+ export interface RoomJoinPayload {
67
+ role: Role;
68
+ perspective?: string;
69
+ invite?: unknown;
70
+ webhook_url?: string;
71
+ }
72
+ export interface RoomLeavePayload {
73
+ reason?: string;
74
+ }
75
+ export interface RoleUpdatePayload {
76
+ member: AgentId;
77
+ role: Role;
78
+ reason?: string;
79
+ }
80
+ export interface RoomInvitePayload {
81
+ invitee?: AgentId;
82
+ role: Role;
83
+ expires_at: number;
84
+ max_uses?: number;
85
+ approval_required?: boolean;
86
+ }
87
+ export interface InviteRevokePayload {
88
+ invite_event_id: string;
89
+ reason?: string;
90
+ }
91
+ export interface MessagePayloadBase {
92
+ references?: string[];
93
+ intent?: MessageIntent;
94
+ turn_id?: string;
95
+ source_event_ids?: string[];
96
+ }
97
+ export interface MessageTextPayload extends MessagePayloadBase {
98
+ text: string;
99
+ }
100
+ export interface MessageMarkdownPayload extends MessagePayloadBase {
101
+ markdown: string;
102
+ }
103
+ export interface MessageDataPayload extends MessagePayloadBase {
104
+ content_type: string;
105
+ body: unknown;
106
+ }
107
+ export interface ReactionCreatePayload {
108
+ target_event_id: string;
109
+ reaction: string;
110
+ score?: number;
111
+ }
112
+ export interface SourceAddPayload {
113
+ source_type: string;
114
+ uri: string;
115
+ title?: string;
116
+ retrieved_at?: number;
117
+ content_digest?: string;
118
+ excerpt?: string;
119
+ metadata?: Record<string, unknown>;
120
+ }
121
+ export interface TurnUpdatePayload {
122
+ turn_id: string;
123
+ speaker: AgentId;
124
+ intent?: MessageIntent;
125
+ topic?: string;
126
+ expires_at?: number;
127
+ reason?: string;
128
+ }
129
+ export interface QuestionGeneratePayload {
130
+ question: string;
131
+ target_perspectives?: string[];
132
+ basis?: string;
133
+ source_event_ids?: string[];
134
+ references?: string[];
135
+ priority?: number;
136
+ }
137
+ export interface DiscourseSteerPayload {
138
+ instruction: string;
139
+ target: string;
140
+ priority?: number;
141
+ references?: string[];
142
+ }
143
+ export interface MindmapNode {
144
+ id: string;
145
+ parent_id?: string;
146
+ title: string;
147
+ summary?: string;
148
+ status?: MindmapNodeStatus;
149
+ source_event_ids?: string[];
150
+ discussion_event_ids?: string[];
151
+ children?: MindmapNode[];
152
+ metadata?: Record<string, unknown>;
153
+ }
154
+ export interface MindmapUpdatePayload {
155
+ operation: MindmapOperation;
156
+ node?: MindmapNode;
157
+ metadata?: Record<string, unknown>;
158
+ [key: string]: unknown;
159
+ }
160
+ export interface ReportGeneratePayload {
161
+ artifact_id: string;
162
+ format: string;
163
+ title: string;
164
+ uri: string;
165
+ content_digest?: string;
166
+ source_event_ids?: string[];
167
+ discussion_event_ids?: string[];
168
+ mindmap_event_id?: string;
169
+ }
170
+ export interface ServerRecord<P = unknown> {
171
+ room_id: string;
172
+ seq: number;
173
+ received_at: number;
174
+ envelope: Envelope<P>;
175
+ }
176
+ export interface ProfileResolverMetadata {
177
+ mode: string;
178
+ service?: string;
179
+ protocol?: string;
180
+ }
181
+ export interface DiscourseProtocolDiscovery {
182
+ protocol: string;
183
+ host: string;
184
+ features?: string[];
185
+ profile?: ProfileResolverMetadata;
186
+ endpoints?: Record<string, string>;
187
+ }
188
+ export interface ArtifactManifest {
189
+ artifact_id: string;
190
+ type: string;
191
+ format: string;
192
+ uri: string;
193
+ content_digest?: string;
194
+ }
195
+ export interface ArchiveManifest {
196
+ protocol: string;
197
+ type: "room.archive";
198
+ host: string;
199
+ room_id: string;
200
+ room_uri: string;
201
+ generated_at: number;
202
+ event_count: number;
203
+ first_seq: number;
204
+ last_seq: number;
205
+ events_sha256: string;
206
+ archive_root: string;
207
+ mindmap_snapshot?: {
208
+ event_id: string;
209
+ digest: string;
210
+ };
211
+ artifacts?: ArtifactManifest[];
212
+ discourse_trace_quality_score?: number;
213
+ formats?: Record<string, string>;
214
+ }
215
+ export interface PermissionContext {
216
+ role?: Role;
217
+ isCreator?: boolean;
218
+ moderatorAuthorized?: boolean;
219
+ expertPolicyAllowed?: boolean;
220
+ participantPolicyAllowed?: boolean;
221
+ observerSteeringAllowed?: boolean;
222
+ observerPollVoteAllowed?: boolean;
223
+ }
224
+ export interface StateWriteOptions {
225
+ postEndReactionAllowed?: boolean;
226
+ }
227
+ export declare function roomCreateEvent(actor: AgentId, createdAt: number, nonce: string, payload: RoomCreatePayload): Event<RoomCreatePayload>;
228
+ export declare function discourseEvent<P>(type: string, actor: AgentId, createdAt: number, nonce: string, roomId: string, payload: P): Event<P>;
229
+ export declare function validateDiscourseEnvelope(envelope: Envelope<unknown>, acceptLegacyProtocol?: boolean): void;
230
+ export declare function validateRoomPath(envelope: Envelope<unknown>, pathRoomId: string): void;
231
+ export declare function eventRequiresRoomId(type: string): boolean;
232
+ export declare function canSubmitEvent(type: string, context: PermissionContext): boolean;
233
+ export declare function canWriteInState(type: string, state: RoomState, options?: StateWriteOptions): boolean;
234
+ export declare function canAcceptRoomWrite(type: string, state: RoomState, permission: PermissionContext, options?: StateWriteOptions): boolean;
235
+ export declare function validateRoomWrite(type: string, state: RoomState, permission: PermissionContext, options?: StateWriteOptions): void;
236
+ //# sourceMappingURL=discourse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discourse.d.ts","sourceRoot":"","sources":["../src/discourse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ import { protocolError } from "./errors.js";
2
+ import { createEvent, verifyEnvelope, withRoomId, } from "./identity.js";
3
+ export const DISCOURSE_PROTOCOL = "agent-discourse/1.0";
4
+ export const LEGACY_DISCOURSE_PROTOCOL = "adp/1.0";
5
+ export const eventType = {
6
+ ROOM_CREATE: "room.create",
7
+ ROOM_JOIN: "room.join",
8
+ ROOM_LEAVE: "room.leave",
9
+ ROOM_MEMBER_ROLE_UPDATE: "room.member.role.update",
10
+ ROOM_INVITE: "room.invite",
11
+ ROOM_INVITE_REVOKE: "room.invite.revoke",
12
+ ROOM_CLOSE: "room.close",
13
+ ROOM_CANCEL: "room.cancel",
14
+ MESSAGE_TEXT: "message.text",
15
+ MESSAGE_MARKDOWN: "message.markdown",
16
+ MESSAGE_DATA: "message.data",
17
+ REACTION_CREATE: "reaction.create",
18
+ PROPOSAL_CREATE: "proposal.create",
19
+ POLL_CREATE: "poll.create",
20
+ POLL_VOTE: "poll.vote",
21
+ RESOLUTION_CREATE: "resolution.create",
22
+ SOURCE_ADD: "source.add",
23
+ TURN_UPDATE: "turn.update",
24
+ QUESTION_GENERATE: "question.generate",
25
+ DISCOURSE_STEER: "discourse.steer",
26
+ MINDMAP_UPDATE: "mindmap.update",
27
+ REPORT_GENERATE: "report.generate",
28
+ SESSION_AUTH: "session.auth",
29
+ };
30
+ export function roomCreateEvent(actor, createdAt, nonce, payload) {
31
+ return createEvent(DISCOURSE_PROTOCOL, eventType.ROOM_CREATE, actor, createdAt, nonce, payload);
32
+ }
33
+ export function discourseEvent(type, actor, createdAt, nonce, roomId, payload) {
34
+ return withRoomId(createEvent(DISCOURSE_PROTOCOL, type, actor, createdAt, nonce, payload), roomId);
35
+ }
36
+ export function validateDiscourseEnvelope(envelope, acceptLegacyProtocol = false) {
37
+ verifyEnvelope(envelope);
38
+ const protocol = envelope.event.protocol;
39
+ const ok = protocol === DISCOURSE_PROTOCOL ||
40
+ (acceptLegacyProtocol && protocol === LEGACY_DISCOURSE_PROTOCOL);
41
+ if (!ok) {
42
+ throw protocolError("invalid_event_protocol", `expected ${DISCOURSE_PROTOCOL}, got ${protocol}`);
43
+ }
44
+ if (eventRequiresRoomId(envelope.event.type) &&
45
+ envelope.event.room_id === undefined) {
46
+ throw protocolError("missing_room_id", "event requires a room_id");
47
+ }
48
+ }
49
+ export function validateRoomPath(envelope, pathRoomId) {
50
+ const actual = envelope.event.room_id;
51
+ if (actual === undefined)
52
+ throw protocolError("missing_room_id", "event requires a room_id");
53
+ if (actual !== pathRoomId)
54
+ throw protocolError("room_id_mismatch", `expected ${pathRoomId}, got ${actual}`);
55
+ }
56
+ export function eventRequiresRoomId(type) {
57
+ return type !== eventType.ROOM_CREATE;
58
+ }
59
+ export function canSubmitEvent(type, context) {
60
+ if (type === eventType.ROOM_CREATE || type === eventType.ROOM_JOIN)
61
+ return true;
62
+ if (context.isCreator)
63
+ return isKnownEventType(type);
64
+ switch (context.role) {
65
+ case "moderator":
66
+ return moderatorCanSubmit(type, context.moderatorAuthorized ?? false);
67
+ case "expert":
68
+ return speakerCanSubmit(type, context.expertPolicyAllowed ?? false);
69
+ case "participant":
70
+ return speakerCanSubmit(type, context.participantPolicyAllowed ?? false);
71
+ case "observer":
72
+ return observerCanSubmit(type, context);
73
+ default:
74
+ return false;
75
+ }
76
+ }
77
+ export function canWriteInState(type, state, options = {}) {
78
+ switch (state) {
79
+ case "scheduled":
80
+ return eventTypeIn(type, [
81
+ eventType.ROOM_JOIN,
82
+ eventType.ROOM_INVITE,
83
+ eventType.ROOM_INVITE_REVOKE,
84
+ eventType.ROOM_CANCEL,
85
+ ]);
86
+ case "active":
87
+ return type !== eventType.ROOM_CREATE && type !== eventType.ROOM_CANCEL;
88
+ case "ended":
89
+ return (Boolean(options.postEndReactionAllowed) &&
90
+ type === eventType.REACTION_CREATE);
91
+ case "cancelled":
92
+ return false;
93
+ }
94
+ }
95
+ export function canAcceptRoomWrite(type, state, permission, options = {}) {
96
+ return (canSubmitEvent(type, permission) && canWriteInState(type, state, options));
97
+ }
98
+ export function validateRoomWrite(type, state, permission, options = {}) {
99
+ if (!canAcceptRoomWrite(type, state, permission, options)) {
100
+ throw protocolError("permission_denied", "actor lacks permission or state is not writable");
101
+ }
102
+ }
103
+ function moderatorCanSubmit(type, moderatorAuthorized) {
104
+ return (eventTypeIn(type, [
105
+ eventType.ROOM_INVITE,
106
+ eventType.ROOM_INVITE_REVOKE,
107
+ eventType.ROOM_CLOSE,
108
+ eventType.MESSAGE_TEXT,
109
+ eventType.MESSAGE_MARKDOWN,
110
+ eventType.MESSAGE_DATA,
111
+ eventType.SOURCE_ADD,
112
+ eventType.TURN_UPDATE,
113
+ eventType.QUESTION_GENERATE,
114
+ eventType.DISCOURSE_STEER,
115
+ eventType.MINDMAP_UPDATE,
116
+ eventType.REPORT_GENERATE,
117
+ eventType.PROPOSAL_CREATE,
118
+ eventType.POLL_CREATE,
119
+ eventType.POLL_VOTE,
120
+ eventType.RESOLUTION_CREATE,
121
+ eventType.REACTION_CREATE,
122
+ eventType.ROOM_LEAVE,
123
+ ]) ||
124
+ (moderatorAuthorized &&
125
+ eventTypeIn(type, [
126
+ eventType.ROOM_MEMBER_ROLE_UPDATE,
127
+ eventType.ROOM_CANCEL,
128
+ ])));
129
+ }
130
+ function speakerCanSubmit(type, policyAllowed) {
131
+ return (eventTypeIn(type, [
132
+ eventType.MESSAGE_TEXT,
133
+ eventType.MESSAGE_MARKDOWN,
134
+ eventType.MESSAGE_DATA,
135
+ eventType.SOURCE_ADD,
136
+ eventType.DISCOURSE_STEER,
137
+ eventType.PROPOSAL_CREATE,
138
+ eventType.POLL_CREATE,
139
+ eventType.POLL_VOTE,
140
+ eventType.REACTION_CREATE,
141
+ eventType.ROOM_LEAVE,
142
+ ]) ||
143
+ (policyAllowed &&
144
+ eventTypeIn(type, [
145
+ eventType.QUESTION_GENERATE,
146
+ eventType.MINDMAP_UPDATE,
147
+ eventType.REPORT_GENERATE,
148
+ eventType.RESOLUTION_CREATE,
149
+ ])));
150
+ }
151
+ function observerCanSubmit(type, context) {
152
+ return (eventTypeIn(type, [eventType.REACTION_CREATE, eventType.ROOM_LEAVE]) ||
153
+ (Boolean(context.observerSteeringAllowed) &&
154
+ type === eventType.DISCOURSE_STEER) ||
155
+ (Boolean(context.observerPollVoteAllowed) && type === eventType.POLL_VOTE));
156
+ }
157
+ function isKnownEventType(type) {
158
+ return eventTypeIn(type, Object.values(eventType));
159
+ }
160
+ function eventTypeIn(type, values) {
161
+ return values.includes(type);
162
+ }
163
+ //# sourceMappingURL=discourse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discourse.js","sourceRoot":"","sources":["../src/discourse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class AgentProtocolError extends Error {
2
+ readonly code: string;
3
+ constructor(code: string, message: string);
4
+ }
5
+ export declare function protocolError(code: string, message: string): AgentProtocolError;
6
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,kBAAkB,CAEpB"}
package/dist/errors.js ADDED
@@ -0,0 +1,12 @@
1
+ export class AgentProtocolError extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = "AgentProtocolError";
7
+ }
8
+ }
9
+ export function protocolError(code, message) {
10
+ return new AgentProtocolError(code, message);
11
+ }
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IADlB,YACkB,IAAY,EAC5B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QAI5B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,OAAe;IAEf,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { DiscourseProtocolDiscovery, RoomCreatePayload, RoomCreateResponse, RoomJoinPayload, RoomLeavePayload, ServerRecord } from "./discourse.js";
2
+ import { AgentId, Envelope } from "./identity.js";
3
+ import { AgentProfile, ProfileReadResponse, ProfileUpdatePayload } from "./profile.js";
4
+ export type FetchLike = typeof fetch;
5
+ export declare class ProfileClient {
6
+ private readonly baseUrl;
7
+ private readonly fetchImpl;
8
+ constructor(baseUrl: string, fetchImpl?: FetchLike);
9
+ getProfile(agentId: AgentId): Promise<ProfileReadResponse>;
10
+ submitProfileUpdate(envelope: Envelope<ProfileUpdatePayload>): Promise<AgentProfile>;
11
+ private getJson;
12
+ private postJson;
13
+ private url;
14
+ }
15
+ export declare class DiscourseClient {
16
+ private readonly baseUrl;
17
+ private readonly fetchImpl;
18
+ constructor(baseUrl: string, fetchImpl?: FetchLike);
19
+ protocol(): Promise<DiscourseProtocolDiscovery>;
20
+ createRoom(envelope: Envelope<RoomCreatePayload>): Promise<RoomCreateResponse>;
21
+ joinRoom(roomId: string, envelope: Envelope<RoomJoinPayload>): Promise<unknown>;
22
+ leaveRoom(roomId: string, envelope: Envelope<RoomLeavePayload>): Promise<unknown>;
23
+ submitEvent<P>(roomId: string, envelope: Envelope<P>): Promise<ServerRecord>;
24
+ events(roomId: string): Promise<ServerRecord[]>;
25
+ archive(roomId: string): Promise<unknown>;
26
+ private getJson;
27
+ private postJson;
28
+ private url;
29
+ }
30
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;AAErC,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,SAAiB;IAGzC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI1D,mBAAmB,CACvB,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GACvC,OAAO,CAAC,YAAY,CAAC;YAIV,OAAO;YAKP,QAAQ;IAStB,OAAO,CAAC,GAAG;CAGZ;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,SAAiB;IAGzC,QAAQ,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAI/C,UAAU,CACd,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GACpC,OAAO,CAAC,kBAAkB,CAAC;IAIxB,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,GAClC,OAAO,CAAC,OAAO,CAAC;IAIb,SAAS,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;IAIb,WAAW,CAAC,CAAC,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,YAAY,CAAC;IAIlB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI/C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAIjC,OAAO;YAKP,QAAQ;IAStB,OAAO,CAAC,GAAG;CAGZ"}
@@ -0,0 +1,81 @@
1
+ export class ProfileClient {
2
+ baseUrl;
3
+ fetchImpl;
4
+ constructor(baseUrl, fetchImpl = fetch) {
5
+ this.baseUrl = baseUrl;
6
+ this.fetchImpl = fetchImpl;
7
+ }
8
+ async getProfile(agentId) {
9
+ return this.getJson(`/v1/profiles/${agentId}`);
10
+ }
11
+ async submitProfileUpdate(envelope) {
12
+ return this.postJson("/v1/profiles", envelope);
13
+ }
14
+ async getJson(path) {
15
+ const response = await this.fetchImpl(this.url(path));
16
+ return readJson(response);
17
+ }
18
+ async postJson(path, body) {
19
+ const response = await this.fetchImpl(this.url(path), {
20
+ method: "POST",
21
+ headers: { "content-type": "application/json" },
22
+ body: JSON.stringify(body),
23
+ });
24
+ return readJson(response);
25
+ }
26
+ url(path) {
27
+ return `${this.baseUrl.replace(/\/$/, "")}/${path.replace(/^\//, "")}`;
28
+ }
29
+ }
30
+ export class DiscourseClient {
31
+ baseUrl;
32
+ fetchImpl;
33
+ constructor(baseUrl, fetchImpl = fetch) {
34
+ this.baseUrl = baseUrl;
35
+ this.fetchImpl = fetchImpl;
36
+ }
37
+ async protocol() {
38
+ return this.getJson("/v1/protocol");
39
+ }
40
+ async createRoom(envelope) {
41
+ return this.postJson("/v1/rooms", envelope);
42
+ }
43
+ async joinRoom(roomId, envelope) {
44
+ return this.postJson(`/v1/rooms/${roomId}/join`, envelope);
45
+ }
46
+ async leaveRoom(roomId, envelope) {
47
+ return this.postJson(`/v1/rooms/${roomId}/leave`, envelope);
48
+ }
49
+ async submitEvent(roomId, envelope) {
50
+ return this.postJson(`/v1/rooms/${roomId}/events`, envelope);
51
+ }
52
+ async events(roomId) {
53
+ return this.getJson(`/v1/rooms/${roomId}/events`);
54
+ }
55
+ async archive(roomId) {
56
+ return this.getJson(`/v1/rooms/${roomId}/archive`);
57
+ }
58
+ async getJson(path) {
59
+ const response = await this.fetchImpl(this.url(path));
60
+ return readJson(response);
61
+ }
62
+ async postJson(path, body) {
63
+ const response = await this.fetchImpl(this.url(path), {
64
+ method: "POST",
65
+ headers: { "content-type": "application/json" },
66
+ body: JSON.stringify(body),
67
+ });
68
+ return readJson(response);
69
+ }
70
+ url(path) {
71
+ return `${this.baseUrl.replace(/\/$/, "")}/${path.replace(/^\//, "")}`;
72
+ }
73
+ }
74
+ async function readJson(response) {
75
+ if (!response.ok) {
76
+ const text = await response.text();
77
+ throw new Error(`HTTP ${response.status}: ${text}`);
78
+ }
79
+ return response.json();
80
+ }
81
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ export declare const AGENT_ID_PREFIX = "did:agent:";
2
+ export declare const EVENT_ID_PREFIX = "evt_";
3
+ export declare const DEFAULT_LIVE_WRITE_WINDOW_MS = 300000;
4
+ export declare const DEFAULT_REQUEST_JWT_TTL_SECS = 300;
5
+ export type AgentId = string;
6
+ export interface Event<P = unknown> {
7
+ protocol: string;
8
+ type: string;
9
+ actor: AgentId;
10
+ created_at: number;
11
+ nonce: string;
12
+ room_id?: string;
13
+ payload: P;
14
+ [key: string]: unknown;
15
+ }
16
+ export interface Envelope<P = unknown> {
17
+ event_id: string;
18
+ event: Event<P>;
19
+ signature: string;
20
+ }
21
+ export type NonceScopeKind = "actor_protocol" | "actor_room";
22
+ export interface NonceScope {
23
+ actor: AgentId;
24
+ protocol: string;
25
+ room_id?: string;
26
+ nonce: string;
27
+ }
28
+ export interface NonceStore {
29
+ checkAndInsert(scope: NonceScope): void;
30
+ }
31
+ export interface LiveWriteOptions {
32
+ nowMs?: number;
33
+ windowMs?: number;
34
+ nonceScope?: NonceScopeKind;
35
+ }
36
+ export interface RequestJwtHeader {
37
+ alg: "EdDSA";
38
+ typ: "JWT";
39
+ kid: AgentId;
40
+ }
41
+ export interface RequestBinding {
42
+ audience: string;
43
+ method: string;
44
+ host: string;
45
+ path: string;
46
+ }
47
+ export interface RequestJwtClaims {
48
+ iss: AgentId;
49
+ sub: AgentId;
50
+ aud: string;
51
+ iat: number;
52
+ exp: number;
53
+ jti: string;
54
+ method: string;
55
+ host: string;
56
+ path: string;
57
+ }
58
+ export interface RequestAuthContext extends RequestBinding {
59
+ nowSecs?: number;
60
+ maxTtlSecs?: number;
61
+ }
62
+ export declare class AgentSigner {
63
+ private readonly keyPair;
64
+ private constructor();
65
+ static generate(): AgentSigner;
66
+ static fromSeed(seed: Uint8Array): AgentSigner;
67
+ agentId(): AgentId;
68
+ publicKey(): Uint8Array;
69
+ signEvent<P>(event: Event<P>): Envelope<P>;
70
+ signRequestJwt(claims: RequestJwtClaims): string;
71
+ }
72
+ export declare class MemoryNonceStore implements NonceStore {
73
+ private readonly seen;
74
+ checkAndInsert(scope: NonceScope): void;
75
+ }
76
+ export declare function createEvent<P>(protocol: string, type: string, actor: AgentId, createdAt: number, nonce: string, payload: P): Event<P>;
77
+ export declare function withRoomId<P>(event: Event<P>, roomId: string): Event<P>;
78
+ export declare function agentIdFromPublicKey(publicKey: Uint8Array): AgentId;
79
+ export declare function publicKeyBytes(agentId: AgentId): Uint8Array;
80
+ export declare function validateAgentId(agentId: AgentId): AgentId;
81
+ export declare function canonicalEventBytes(event: Event<unknown>): Uint8Array;
82
+ export declare function eventId(event: Event<unknown>): string;
83
+ export declare function signEvent(secretKey: Uint8Array, event: Event<unknown>): string;
84
+ export declare function verifyEventId(envelope: Envelope<unknown>): void;
85
+ export declare function verifySignature(envelope: Envelope<unknown>): void;
86
+ export declare function verifyEnvelope(envelope: Envelope<unknown>): void;
87
+ export declare function verifyTimestamp(createdAt: number, nowMs: number, windowMs: number): void;
88
+ export declare function nonceScopeForEvent(event: Event<unknown>, kind?: NonceScopeKind): NonceScope;
89
+ export declare function verifyLiveEnvelope(envelope: Envelope<unknown>, nonceStore: NonceStore, options?: LiveWriteOptions): void;
90
+ export declare function createRequestBinding(audience: string, method: string, host: string, path: string): RequestBinding;
91
+ export declare function createRequestJwtClaims(agentId: AgentId, binding: RequestBinding, issuedAt: number, ttlSecs: number, jti: string): RequestJwtClaims;
92
+ export declare function verifyRequestJwt(token: string, context: RequestAuthContext): RequestJwtClaims;
93
+ export declare function verifyRequestJwtLive(token: string, context: RequestAuthContext, nonceStore: NonceStore): RequestJwtClaims;
94
+ export declare function unixTimeMillis(): number;
95
+ export declare function unixTimeSecs(): number;
96
+ export declare function randomNonce(prefix?: string): string;
97
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,4BAA4B,SAAU,CAAC;AACpD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAGhD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG,OAAO;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAW;IACF,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA5C,OAAO;IAEP,MAAM,CAAC,QAAQ,IAAI,WAAW;IAI9B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW;IAU9C,OAAO,IAAI,OAAO;IAIlB,SAAS,IAAI,UAAU;IAIvB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAQ1C,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;CAuBjD;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAE1C,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAexC;AAED,wBAAgB,WAAW,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GACT,KAAK,CAAC,CAAC,CAAC,CAUV;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAKvE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAQnE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAkB3D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAGzD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,UAAU,CASrE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAKrD;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GACpB,MAAM,CAUR;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAQ/D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAgBjE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAGhE;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,IAAI,CAON;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EACrB,IAAI,GAAE,cAAiC,GACtC,UAAU,CAOZ;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,gBAAqB,GAC7B,IAAI,CAUN;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,cAAc,CAOhB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,gBAAgB,CAYlB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,kBAAkB,GAC1B,gBAAgB,CA+DlB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,UAAU,GACrB,gBAAgB,CAQlB;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,WAAW,CAAC,MAAM,SAAO,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,257 @@
1
+ import canonicalize from "canonicalize";
2
+ import bs58 from "bs58";
3
+ import { createHash, randomBytes } from "node:crypto";
4
+ import nacl from "tweetnacl";
5
+ import { protocolError } from "./errors.js";
6
+ export const AGENT_ID_PREFIX = "did:agent:";
7
+ export const EVENT_ID_PREFIX = "evt_";
8
+ export const DEFAULT_LIVE_WRITE_WINDOW_MS = 300_000;
9
+ export const DEFAULT_REQUEST_JWT_TTL_SECS = 300;
10
+ const REQUEST_AUTH_REPLAY_SCOPE = "agent-identity/request-auth";
11
+ export class AgentSigner {
12
+ keyPair;
13
+ constructor(keyPair) {
14
+ this.keyPair = keyPair;
15
+ }
16
+ static generate() {
17
+ return new AgentSigner(nacl.sign.keyPair());
18
+ }
19
+ static fromSeed(seed) {
20
+ if (seed.byteLength !== 32) {
21
+ throw protocolError("invalid_private_key", `seed must be 32 bytes, got ${seed.byteLength}`);
22
+ }
23
+ return new AgentSigner(nacl.sign.keyPair.fromSeed(seed));
24
+ }
25
+ agentId() {
26
+ return agentIdFromPublicKey(this.keyPair.publicKey);
27
+ }
28
+ publicKey() {
29
+ return new Uint8Array(this.keyPair.publicKey);
30
+ }
31
+ signEvent(event) {
32
+ return {
33
+ event_id: eventId(event),
34
+ event,
35
+ signature: signEvent(this.keyPair.secretKey, event),
36
+ };
37
+ }
38
+ signRequestJwt(claims) {
39
+ const agentId = this.agentId();
40
+ if (claims.iss !== agentId || claims.sub !== agentId) {
41
+ throw protocolError("invalid_jwt_claim", "iss and sub must match the signing agent id");
42
+ }
43
+ const header = { alg: "EdDSA", typ: "JWT", kid: agentId };
44
+ const encodedHeader = base64UrlEncode(new TextEncoder().encode(JSON.stringify(header)));
45
+ const encodedPayload = base64UrlEncode(new TextEncoder().encode(JSON.stringify(claims)));
46
+ const signingInput = `${encodedHeader}.${encodedPayload}`;
47
+ const signature = nacl.sign.detached(new TextEncoder().encode(signingInput), this.keyPair.secretKey);
48
+ return `${signingInput}.${base64UrlEncode(signature)}`;
49
+ }
50
+ }
51
+ export class MemoryNonceStore {
52
+ seen = new Set();
53
+ checkAndInsert(scope) {
54
+ const key = JSON.stringify([
55
+ scope.actor,
56
+ scope.protocol,
57
+ scope.room_id ?? null,
58
+ scope.nonce,
59
+ ]);
60
+ if (this.seen.has(key)) {
61
+ throw protocolError("nonce_reused", "nonce was already used in this replay scope");
62
+ }
63
+ this.seen.add(key);
64
+ }
65
+ }
66
+ export function createEvent(protocol, type, actor, createdAt, nonce, payload) {
67
+ validateAgentId(actor);
68
+ return {
69
+ protocol,
70
+ type,
71
+ actor,
72
+ created_at: createdAt,
73
+ nonce,
74
+ payload,
75
+ };
76
+ }
77
+ export function withRoomId(event, roomId) {
78
+ return {
79
+ ...event,
80
+ room_id: roomId,
81
+ };
82
+ }
83
+ export function agentIdFromPublicKey(publicKey) {
84
+ if (publicKey.byteLength !== 32) {
85
+ throw protocolError("invalid_public_key", `public key must be 32 bytes, got ${publicKey.byteLength}`);
86
+ }
87
+ return `${AGENT_ID_PREFIX}${base58BtcEncode(publicKey)}`;
88
+ }
89
+ export function publicKeyBytes(agentId) {
90
+ const encoded = agentId.startsWith(AGENT_ID_PREFIX)
91
+ ? agentId.slice(AGENT_ID_PREFIX.length)
92
+ : undefined;
93
+ if (!encoded) {
94
+ throw protocolError("invalid_agent_id", "agent id must start with did:agent:");
95
+ }
96
+ const bytes = base58BtcDecode(encoded);
97
+ if (bytes.byteLength !== 32) {
98
+ throw protocolError("invalid_public_key", `agent id public key must be 32 bytes, got ${bytes.byteLength}`);
99
+ }
100
+ return bytes;
101
+ }
102
+ export function validateAgentId(agentId) {
103
+ publicKeyBytes(agentId);
104
+ return agentId;
105
+ }
106
+ export function canonicalEventBytes(event) {
107
+ const canonical = canonicalize(event);
108
+ if (canonical === undefined) {
109
+ throw protocolError("canonical_json", "event cannot be represented as canonical JSON");
110
+ }
111
+ return new TextEncoder().encode(canonical);
112
+ }
113
+ export function eventId(event) {
114
+ const digest = createHash("sha256")
115
+ .update(canonicalEventBytes(event))
116
+ .digest();
117
+ return `${EVENT_ID_PREFIX}${base58BtcEncode(digest)}`;
118
+ }
119
+ export function signEvent(secretKey, event) {
120
+ if (secretKey.byteLength !== 64) {
121
+ throw protocolError("invalid_private_key", `secret key must be 64 bytes, got ${secretKey.byteLength}`);
122
+ }
123
+ return base64UrlEncode(nacl.sign.detached(canonicalEventBytes(event), secretKey));
124
+ }
125
+ export function verifyEventId(envelope) {
126
+ const expected = eventId(envelope.event);
127
+ if (expected !== envelope.event_id) {
128
+ throw protocolError("invalid_event_id", `invalid event id: expected ${expected}, got ${envelope.event_id}`);
129
+ }
130
+ }
131
+ export function verifySignature(envelope) {
132
+ const signature = base64UrlDecode(envelope.signature);
133
+ if (signature.byteLength !== 64) {
134
+ throw protocolError("invalid_signature", `signature must be 64 bytes, got ${signature.byteLength}`);
135
+ }
136
+ const ok = nacl.sign.detached.verify(canonicalEventBytes(envelope.event), signature, publicKeyBytes(envelope.event.actor));
137
+ if (!ok) {
138
+ throw protocolError("invalid_signature", "signature verification failed");
139
+ }
140
+ }
141
+ export function verifyEnvelope(envelope) {
142
+ verifyEventId(envelope);
143
+ verifySignature(envelope);
144
+ }
145
+ export function verifyTimestamp(createdAt, nowMs, windowMs) {
146
+ if (windowMs < 0 || Math.abs(createdAt - nowMs) > windowMs) {
147
+ throw protocolError("timestamp_out_of_window", "timestamp is outside the allowed live-write window");
148
+ }
149
+ }
150
+ export function nonceScopeForEvent(event, kind = "actor_protocol") {
151
+ return {
152
+ actor: event.actor,
153
+ protocol: event.protocol,
154
+ room_id: kind === "actor_room" ? event.room_id : undefined,
155
+ nonce: event.nonce,
156
+ };
157
+ }
158
+ export function verifyLiveEnvelope(envelope, nonceStore, options = {}) {
159
+ verifyEnvelope(envelope);
160
+ verifyTimestamp(envelope.event.created_at, options.nowMs ?? unixTimeMillis(), options.windowMs ?? DEFAULT_LIVE_WRITE_WINDOW_MS);
161
+ nonceStore.checkAndInsert(nonceScopeForEvent(envelope.event, options.nonceScope));
162
+ }
163
+ export function createRequestBinding(audience, method, host, path) {
164
+ return {
165
+ audience,
166
+ method: method.toUpperCase(),
167
+ host,
168
+ path,
169
+ };
170
+ }
171
+ export function createRequestJwtClaims(agentId, binding, issuedAt, ttlSecs, jti) {
172
+ return {
173
+ iss: agentId,
174
+ sub: agentId,
175
+ aud: binding.audience,
176
+ iat: issuedAt,
177
+ exp: issuedAt + ttlSecs,
178
+ jti,
179
+ method: binding.method.toUpperCase(),
180
+ host: binding.host,
181
+ path: binding.path,
182
+ };
183
+ }
184
+ export function verifyRequestJwt(token, context) {
185
+ const parts = token.split(".");
186
+ if (parts.length !== 3) {
187
+ throw protocolError("invalid_jwt", "expected three compact JWS parts");
188
+ }
189
+ const header = JSON.parse(new TextDecoder().decode(base64UrlDecode(parts[0])));
190
+ const claims = JSON.parse(new TextDecoder().decode(base64UrlDecode(parts[1])));
191
+ const signature = base64UrlDecode(parts[2]);
192
+ const signingInput = `${parts[0]}.${parts[1]}`;
193
+ if (header.alg !== "EdDSA") {
194
+ throw protocolError("invalid_jwt_claim", "alg must be EdDSA");
195
+ }
196
+ if (header.typ !== "JWT") {
197
+ throw protocolError("invalid_jwt_claim", "typ must be JWT");
198
+ }
199
+ if (header.kid !== claims.iss || claims.iss !== claims.sub) {
200
+ throw protocolError("invalid_jwt_claim", "kid, iss, and sub must identify the same Agent ID");
201
+ }
202
+ if (!nacl.sign.detached.verify(new TextEncoder().encode(signingInput), signature, publicKeyBytes(header.kid))) {
203
+ throw protocolError("invalid_signature", "JWT signature verification failed");
204
+ }
205
+ const method = context.method.toUpperCase();
206
+ if (claims.aud !== context.audience)
207
+ throw protocolError("invalid_jwt_claim", "aud mismatch");
208
+ if (claims.method !== method)
209
+ throw protocolError("invalid_jwt_claim", "method mismatch");
210
+ if (claims.host !== context.host)
211
+ throw protocolError("invalid_jwt_claim", "host mismatch");
212
+ if (claims.path !== context.path)
213
+ throw protocolError("invalid_jwt_claim", "path mismatch");
214
+ const nowSecs = context.nowSecs ?? unixTimeSecs();
215
+ const maxTtlSecs = context.maxTtlSecs ?? DEFAULT_REQUEST_JWT_TTL_SECS;
216
+ if (claims.iat > nowSecs || claims.exp < nowSecs) {
217
+ throw protocolError("invalid_jwt_claim", "iat/exp outside valid time window");
218
+ }
219
+ if (claims.exp - claims.iat > maxTtlSecs) {
220
+ throw protocolError("invalid_jwt_claim", "JWT ttl exceeds maximum");
221
+ }
222
+ return claims;
223
+ }
224
+ export function verifyRequestJwtLive(token, context, nonceStore) {
225
+ const claims = verifyRequestJwt(token, context);
226
+ nonceStore.checkAndInsert({
227
+ actor: claims.iss,
228
+ protocol: REQUEST_AUTH_REPLAY_SCOPE,
229
+ nonce: claims.jti,
230
+ });
231
+ return claims;
232
+ }
233
+ export function unixTimeMillis() {
234
+ return Date.now();
235
+ }
236
+ export function unixTimeSecs() {
237
+ return Math.floor(Date.now() / 1000);
238
+ }
239
+ export function randomNonce(prefix = "n_") {
240
+ return `${prefix}${base64UrlEncode(randomBytes(16))}`;
241
+ }
242
+ function base58BtcEncode(bytes) {
243
+ return `z${bs58.encode(bytes)}`;
244
+ }
245
+ function base58BtcDecode(value) {
246
+ if (!value.startsWith("z")) {
247
+ throw protocolError("invalid_encoding", "expected base58btc multibase value");
248
+ }
249
+ return bs58.decode(value.slice(1));
250
+ }
251
+ function base64UrlEncode(bytes) {
252
+ return Buffer.from(bytes).toString("base64url");
253
+ }
254
+ function base64UrlDecode(value) {
255
+ return new Uint8Array(Buffer.from(value, "base64url"));
256
+ }
257
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAC5C,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAC;AACpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAChD,MAAM,yBAAyB,GAAG,6BAA6B,CAAC;AAsEhE,MAAM,OAAO,WAAW;IACe;IAArC,YAAqC,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;IAAG,CAAC;IAElE,MAAM,CAAC,QAAQ;QACb,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAgB;QAC9B,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;YAC3B,MAAM,aAAa,CACjB,qBAAqB,EACrB,8BAA8B,IAAI,CAAC,UAAU,EAAE,CAChD,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,SAAS;QACP,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,SAAS,CAAI,KAAe;QAC1B,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC;YACxB,KAAK;YACL,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,MAAwB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACrD,MAAM,aAAa,CACjB,mBAAmB,EACnB,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAqB,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAC5E,MAAM,aAAa,GAAG,eAAe,CACnC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACjD,CAAC;QACF,MAAM,cAAc,GAAG,eAAe,CACpC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACjD,CAAC;QACF,MAAM,YAAY,GAAG,GAAG,aAAa,IAAI,cAAc,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAClC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EACtC,IAAI,CAAC,OAAO,CAAC,SAAS,CACvB,CAAC;QACF,OAAO,GAAG,YAAY,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,gBAAgB;IACV,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,cAAc,CAAC,KAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;YACzB,KAAK,CAAC,KAAK;YACX,KAAK,CAAC,QAAQ;YACd,KAAK,CAAC,OAAO,IAAI,IAAI;YACrB,KAAK,CAAC,KAAK;SACZ,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,aAAa,CACjB,cAAc,EACd,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,IAAY,EACZ,KAAc,EACd,SAAiB,EACjB,KAAa,EACb,OAAU;IAEV,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,KAAK;QACL,UAAU,EAAE,SAAS;QACrB,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAI,KAAe,EAAE,MAAc;IAC3D,OAAO;QACL,GAAG,KAAK;QACR,OAAO,EAAE,MAAM;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAqB;IACxD,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;QAChC,MAAM,aAAa,CACjB,oBAAoB,EACpB,oCAAoC,SAAS,CAAC,UAAU,EAAE,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;QACjD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC;QACvC,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,aAAa,CACjB,kBAAkB,EAClB,qCAAqC,CACtC,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,aAAa,CACjB,oBAAoB,EACpB,6CAA6C,KAAK,CAAC,UAAU,EAAE,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAqB;IACvD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,aAAa,CACjB,gBAAgB,EAChB,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAqB;IAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC;SAChC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;SAClC,MAAM,EAAE,CAAC;IACZ,OAAO,GAAG,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,SAAqB,EACrB,KAAqB;IAErB,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;QAChC,MAAM,aAAa,CACjB,qBAAqB,EACrB,oCAAoC,SAAS,CAAC,UAAU,EAAE,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,eAAe,CACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAA2B;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,aAAa,CACjB,kBAAkB,EAClB,8BAA8B,QAAQ,SAAS,QAAQ,CAAC,QAAQ,EAAE,CACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA2B;IACzD,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;QAChC,MAAM,aAAa,CACjB,mBAAmB,EACnB,mCAAmC,SAAS,CAAC,UAAU,EAAE,CAC1D,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EACnC,SAAS,EACT,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CACrC,CAAC;IACF,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,aAAa,CAAC,mBAAmB,EAAE,+BAA+B,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAA2B;IACxD,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxB,eAAe,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,KAAa,EACb,QAAgB;IAEhB,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC;QAC3D,MAAM,aAAa,CACjB,yBAAyB,EACzB,oDAAoD,CACrD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAqB,EACrB,OAAuB,gBAAgB;IAEvC,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC1D,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAA2B,EAC3B,UAAsB,EACtB,UAA4B,EAAE;IAE9B,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,eAAe,CACb,QAAQ,CAAC,KAAK,CAAC,UAAU,EACzB,OAAO,CAAC,KAAK,IAAI,cAAc,EAAE,EACjC,OAAO,CAAC,QAAQ,IAAI,4BAA4B,CACjD,CAAC;IACF,UAAU,CAAC,cAAc,CACvB,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,MAAc,EACd,IAAY,EACZ,IAAY;IAEZ,OAAO;QACL,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;QAC5B,IAAI;QACJ,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAgB,EAChB,OAAuB,EACvB,QAAgB,EAChB,OAAe,EACf,GAAW;IAEX,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,OAAO,CAAC,QAAQ;QACrB,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,QAAQ,GAAG,OAAO;QACvB,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;QACpC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,OAA2B;IAE3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,aAAa,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAChC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAChC,CAAC;IACtB,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,aAAa,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,aAAa,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;QAC3D,MAAM,aAAa,CACjB,mBAAmB,EACnB,mDAAmD,CACpD,CAAC;IACJ,CAAC;IACD,IACE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CACxB,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EACtC,SAAS,EACT,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAC3B,EACD,CAAC;QACD,MAAM,aAAa,CACjB,mBAAmB,EACnB,mCAAmC,CACpC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,QAAQ;QACjC,MAAM,aAAa,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAC1B,MAAM,aAAa,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;QAC9B,MAAM,aAAa,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;QAC9B,MAAM,aAAa,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,YAAY,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,4BAA4B,CAAC;IACtE,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACjD,MAAM,aAAa,CACjB,mBAAmB,EACnB,mCAAmC,CACpC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,UAAU,EAAE,CAAC;QACzC,MAAM,aAAa,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,OAA2B,EAC3B,UAAsB;IAEtB,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,UAAU,CAAC,cAAc,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC,GAAG;QACjB,QAAQ,EAAE,yBAAyB;QACnC,KAAK,EAAE,MAAM,CAAC,GAAG;KAClB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAM,GAAG,IAAI;IACvC,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,KAAiB;IACxC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,aAAa,CACjB,kBAAkB,EAClB,oCAAoC,CACrC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,KAAiB;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./errors.js";
2
+ export * from "./identity.js";
3
+ export * from "./profile.js";
4
+ export * from "./discourse.js";
5
+ export * from "./http-client.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from "./errors.js";
2
+ export * from "./identity.js";
3
+ export * from "./profile.js";
4
+ export * from "./discourse.js";
5
+ export * from "./http-client.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { AgentId, Envelope, Event } from "./identity.js";
2
+ export declare const PROFILE_PROTOCOL = "agent-profile/1.0";
3
+ export declare const PROFILE_UPDATE = "profile.update";
4
+ export interface ServiceEndpoint {
5
+ type: string;
6
+ url: string;
7
+ protocols?: string[];
8
+ }
9
+ export interface ProfileUpdatePayload {
10
+ agent_id: AgentId;
11
+ name: string;
12
+ description?: string;
13
+ avatar_url?: string;
14
+ provider?: string;
15
+ capabilities?: string[];
16
+ service_endpoints?: ServiceEndpoint[];
17
+ links?: Record<string, string>;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ export interface AgentProfile extends ProfileUpdatePayload {
21
+ updated_at: number;
22
+ profile_event_id: string;
23
+ }
24
+ export interface ProfileReadResponse {
25
+ profile: AgentProfile;
26
+ profile_event?: Envelope<ProfileUpdatePayload>;
27
+ }
28
+ export interface ProfileServiceEndpoints {
29
+ profiles: string;
30
+ }
31
+ export interface ProfileServiceDiscovery {
32
+ protocol: string;
33
+ service: string;
34
+ endpoints: ProfileServiceEndpoints;
35
+ features?: string[];
36
+ }
37
+ export declare function profileUpdateEvent(actor: AgentId, createdAt: number, nonce: string, payload: ProfileUpdatePayload): Event<ProfileUpdatePayload>;
38
+ export declare function validateProfileUpdate(envelope: Envelope<ProfileUpdatePayload>): void;
39
+ export declare function materializeProfile(envelope: Envelope<ProfileUpdatePayload>): AgentProfile;
40
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,KAAK,EAGN,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AACpD,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAa,SAAQ,oBAAoB;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,uBAAuB,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,oBAAoB,GAC5B,KAAK,CAAC,oBAAoB,CAAC,CAS7B;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GACvC,IAAI,CAoBN;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GACvC,YAAY,CAgBd"}
@@ -0,0 +1,37 @@
1
+ import { protocolError } from "./errors.js";
2
+ import { createEvent, verifyEnvelope, } from "./identity.js";
3
+ export const PROFILE_PROTOCOL = "agent-profile/1.0";
4
+ export const PROFILE_UPDATE = "profile.update";
5
+ export function profileUpdateEvent(actor, createdAt, nonce, payload) {
6
+ return createEvent(PROFILE_PROTOCOL, PROFILE_UPDATE, actor, createdAt, nonce, payload);
7
+ }
8
+ export function validateProfileUpdate(envelope) {
9
+ verifyEnvelope(envelope);
10
+ if (envelope.event.protocol !== PROFILE_PROTOCOL) {
11
+ throw protocolError("invalid_event_protocol", `expected ${PROFILE_PROTOCOL}, got ${envelope.event.protocol}`);
12
+ }
13
+ if (envelope.event.type !== PROFILE_UPDATE) {
14
+ throw protocolError("invalid_event_type", `expected ${PROFILE_UPDATE}, got ${envelope.event.type}`);
15
+ }
16
+ if (envelope.event.actor !== envelope.event.payload.agent_id) {
17
+ throw protocolError("invalid_actor", "profile update actor must match payload.agent_id");
18
+ }
19
+ }
20
+ export function materializeProfile(envelope) {
21
+ validateProfileUpdate(envelope);
22
+ const payload = envelope.event.payload;
23
+ return {
24
+ agent_id: payload.agent_id,
25
+ name: payload.name,
26
+ description: payload.description,
27
+ avatar_url: payload.avatar_url,
28
+ provider: payload.provider,
29
+ capabilities: payload.capabilities ?? [],
30
+ service_endpoints: payload.service_endpoints ?? [],
31
+ links: payload.links ?? {},
32
+ metadata: payload.metadata ?? {},
33
+ updated_at: envelope.event.created_at,
34
+ profile_event_id: envelope.event_id,
35
+ };
36
+ }
37
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAIL,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAyC/C,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,SAAiB,EACjB,KAAa,EACb,OAA6B;IAE7B,OAAO,WAAW,CAChB,gBAAgB,EAChB,cAAc,EACd,KAAK,EACL,SAAS,EACT,KAAK,EACL,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAwC;IAExC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QACjD,MAAM,aAAa,CACjB,wBAAwB,EACxB,YAAY,gBAAgB,SAAS,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAC/D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC3C,MAAM,aAAa,CACjB,oBAAoB,EACpB,YAAY,cAAc,SAAS,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CACzD,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC7D,MAAM,aAAa,CACjB,eAAe,EACf,kDAAkD,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAwC;IAExC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;IACvC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,EAAE;QAClD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;QACrC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ;KACpC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "agent-protocols",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript SDK for Agent Identity, Agent Profile, and Agent Discourse protocols",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/ldclabs/agent-protocols.git",
10
+ "directory": "packages/agent-protocols"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ },
17
+ "./identity": {
18
+ "types": "./dist/identity.d.ts",
19
+ "import": "./dist/identity.js"
20
+ },
21
+ "./profile": {
22
+ "types": "./dist/profile.d.ts",
23
+ "import": "./dist/profile.js"
24
+ },
25
+ "./discourse": {
26
+ "types": "./dist/discourse.d.ts",
27
+ "import": "./dist/discourse.js"
28
+ },
29
+ "./http-client": {
30
+ "types": "./dist/http-client.d.ts",
31
+ "import": "./dist/http-client.js"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.json",
40
+ "test": "node --import tsx --test src/*.test.ts"
41
+ },
42
+ "dependencies": {
43
+ "bs58": "^6.0.0",
44
+ "canonicalize": "^3.0.0",
45
+ "tweetnacl": "^1.0.3"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^24.0.0",
49
+ "tsx": "^4.22.0",
50
+ "typescript": "^6.0.0"
51
+ }
52
+ }