@dp-pcs/ogp 0.2.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 +437 -0
- package/dist/cli/agent-comms.d.ts +55 -0
- package/dist/cli/agent-comms.d.ts.map +1 -0
- package/dist/cli/agent-comms.js +217 -0
- package/dist/cli/agent-comms.js.map +1 -0
- package/dist/cli/expose.d.ts +3 -0
- package/dist/cli/expose.d.ts.map +1 -0
- package/dist/cli/expose.js +104 -0
- package/dist/cli/expose.js.map +1 -0
- package/dist/cli/federation.d.ts +28 -0
- package/dist/cli/federation.d.ts.map +1 -0
- package/dist/cli/federation.js +409 -0
- package/dist/cli/federation.js.map +1 -0
- package/dist/cli/install.d.ts +3 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +111 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +33 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +305 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon/agent-comms.d.ts +76 -0
- package/dist/daemon/agent-comms.d.ts.map +1 -0
- package/dist/daemon/agent-comms.js +188 -0
- package/dist/daemon/agent-comms.js.map +1 -0
- package/dist/daemon/doorman.d.ts +52 -0
- package/dist/daemon/doorman.d.ts.map +1 -0
- package/dist/daemon/doorman.js +203 -0
- package/dist/daemon/doorman.js.map +1 -0
- package/dist/daemon/intent-registry.d.ts +11 -0
- package/dist/daemon/intent-registry.d.ts.map +1 -0
- package/dist/daemon/intent-registry.js +101 -0
- package/dist/daemon/intent-registry.js.map +1 -0
- package/dist/daemon/keypair.d.ts +5 -0
- package/dist/daemon/keypair.d.ts.map +1 -0
- package/dist/daemon/keypair.js +25 -0
- package/dist/daemon/keypair.js.map +1 -0
- package/dist/daemon/message-handler.d.ts +20 -0
- package/dist/daemon/message-handler.d.ts.map +1 -0
- package/dist/daemon/message-handler.js +159 -0
- package/dist/daemon/message-handler.js.map +1 -0
- package/dist/daemon/notify.d.ts +7 -0
- package/dist/daemon/notify.d.ts.map +1 -0
- package/dist/daemon/notify.js +54 -0
- package/dist/daemon/notify.js.map +1 -0
- package/dist/daemon/peers.d.ts +66 -0
- package/dist/daemon/peers.d.ts.map +1 -0
- package/dist/daemon/peers.js +171 -0
- package/dist/daemon/peers.js.map +1 -0
- package/dist/daemon/reply-handler.d.ts +67 -0
- package/dist/daemon/reply-handler.d.ts.map +1 -0
- package/dist/daemon/reply-handler.js +176 -0
- package/dist/daemon/reply-handler.js.map +1 -0
- package/dist/daemon/scopes.d.ts +62 -0
- package/dist/daemon/scopes.d.ts.map +1 -0
- package/dist/daemon/scopes.js +113 -0
- package/dist/daemon/scopes.js.map +1 -0
- package/dist/daemon/server.d.ts +8 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +286 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/shared/config.d.ts +42 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +42 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/signing.d.ts +13 -0
- package/dist/shared/signing.d.ts.map +1 -0
- package/dist/shared/signing.js +46 -0
- package/dist/shared/signing.js.map +1 -0
- package/docs/agent-comms.md +277 -0
- package/docs/federation-flow.md +407 -0
- package/docs/quickstart.md +241 -0
- package/docs/scopes.md +198 -0
- package/package.json +57 -0
- package/scripts/install-skills.js +32 -0
- package/skills/ogp/SKILL.md +235 -0
- package/skills/ogp-agent-comms/SKILL.md +345 -0
- package/skills/ogp-expose/SKILL.md +281 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ResponseLevel, type ResponsePolicy, type TopicPolicy } from '../shared/config.js';
|
|
2
|
+
import type { ScopeBundle } from './scopes.js';
|
|
3
|
+
export type { ResponseLevel, ResponsePolicy, TopicPolicy };
|
|
4
|
+
export interface Peer {
|
|
5
|
+
id: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
email: string;
|
|
8
|
+
gatewayUrl: string;
|
|
9
|
+
publicKey: string;
|
|
10
|
+
status: 'pending' | 'approved' | 'rejected';
|
|
11
|
+
requestedAt: string;
|
|
12
|
+
approvedAt?: string;
|
|
13
|
+
metadata?: Record<string, any>;
|
|
14
|
+
protocolVersion?: string;
|
|
15
|
+
grantedScopes?: ScopeBundle;
|
|
16
|
+
receivedScopes?: ScopeBundle;
|
|
17
|
+
responsePolicy?: ResponsePolicy;
|
|
18
|
+
}
|
|
19
|
+
export declare function loadPeers(): Peer[];
|
|
20
|
+
export declare function savePeers(peers: Peer[]): void;
|
|
21
|
+
export declare function addPeer(peer: Peer): void;
|
|
22
|
+
export declare function getPeer(peerId: string): Peer | null;
|
|
23
|
+
export declare function approvePeer(peerId: string): boolean;
|
|
24
|
+
export declare function rejectPeer(peerId: string): boolean;
|
|
25
|
+
export declare function listPeers(status?: 'pending' | 'approved' | 'rejected'): Peer[];
|
|
26
|
+
/**
|
|
27
|
+
* Update the scopes granted TO a peer (what they can request from us)
|
|
28
|
+
*/
|
|
29
|
+
export declare function updatePeerGrantedScopes(peerId: string, scopes: ScopeBundle): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Update the scopes received FROM a peer (what we can request from them)
|
|
32
|
+
*/
|
|
33
|
+
export declare function updatePeerReceivedScopes(peerId: string, scopes: ScopeBundle): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Update the protocol version for a peer
|
|
36
|
+
*/
|
|
37
|
+
export declare function updatePeerVersion(peerId: string, version: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get a peer's granted scopes (what they can request from us)
|
|
40
|
+
*/
|
|
41
|
+
export declare function getPeerGrantedScopes(peerId: string): ScopeBundle | null;
|
|
42
|
+
/**
|
|
43
|
+
* Update multiple peer fields at once
|
|
44
|
+
*/
|
|
45
|
+
export declare function updatePeer(peerId: string, updates: Partial<Peer>): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Update response policy for a peer
|
|
48
|
+
*/
|
|
49
|
+
export declare function updatePeerResponsePolicy(peerId: string, policy: ResponsePolicy): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Set a topic policy for a peer
|
|
52
|
+
*/
|
|
53
|
+
export declare function setPeerTopicPolicy(peerId: string, topic: string, level: ResponseLevel, notes?: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Remove a topic from peer's response policy
|
|
56
|
+
*/
|
|
57
|
+
export declare function removePeerTopicPolicy(peerId: string, topic: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Get response policy for a peer (peer-specific only, no global fallback)
|
|
60
|
+
*/
|
|
61
|
+
export declare function getPeerResponsePolicy(peerId: string): ResponsePolicy | null;
|
|
62
|
+
/**
|
|
63
|
+
* Clear response policy for a peer (reset to global defaults)
|
|
64
|
+
*/
|
|
65
|
+
export declare function clearPeerResponsePolicy(peerId: string): boolean;
|
|
66
|
+
//# sourceMappingURL=peers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peers.d.ts","sourceRoot":"","sources":["../../src/daemon/peers.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAE3D,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,cAAc,CAAC,EAAE,WAAW,CAAC;IAE7B,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAID,wBAAgB,SAAS,IAAI,IAAI,EAAE,CAOlC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAG7C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CASxC;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGnD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CASnD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQlD;AAED,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI,EAAE,CAM9E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAQpF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAQrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAGvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAQ1E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAQxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAYT;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAQ5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAG3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ/D"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { getConfigDir, ensureConfigDir } from '../shared/config.js';
|
|
4
|
+
const PEERS_FILE = path.join(getConfigDir(), 'peers.json');
|
|
5
|
+
export function loadPeers() {
|
|
6
|
+
ensureConfigDir();
|
|
7
|
+
if (!fs.existsSync(PEERS_FILE)) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const data = fs.readFileSync(PEERS_FILE, 'utf-8');
|
|
11
|
+
return JSON.parse(data);
|
|
12
|
+
}
|
|
13
|
+
export function savePeers(peers) {
|
|
14
|
+
ensureConfigDir();
|
|
15
|
+
fs.writeFileSync(PEERS_FILE, JSON.stringify(peers, null, 2), 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
export function addPeer(peer) {
|
|
18
|
+
const peers = loadPeers();
|
|
19
|
+
const existing = peers.findIndex(p => p.id === peer.id);
|
|
20
|
+
if (existing >= 0) {
|
|
21
|
+
peers[existing] = peer;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
peers.push(peer);
|
|
25
|
+
}
|
|
26
|
+
savePeers(peers);
|
|
27
|
+
}
|
|
28
|
+
export function getPeer(peerId) {
|
|
29
|
+
const peers = loadPeers();
|
|
30
|
+
return peers.find(p => p.id === peerId) || null;
|
|
31
|
+
}
|
|
32
|
+
export function approvePeer(peerId) {
|
|
33
|
+
const peers = loadPeers();
|
|
34
|
+
const peer = peers.find(p => p.id === peerId);
|
|
35
|
+
if (!peer)
|
|
36
|
+
return false;
|
|
37
|
+
peer.status = 'approved';
|
|
38
|
+
peer.approvedAt = new Date().toISOString();
|
|
39
|
+
savePeers(peers);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
export function rejectPeer(peerId) {
|
|
43
|
+
const peers = loadPeers();
|
|
44
|
+
const peer = peers.find(p => p.id === peerId);
|
|
45
|
+
if (!peer)
|
|
46
|
+
return false;
|
|
47
|
+
peer.status = 'rejected';
|
|
48
|
+
savePeers(peers);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
export function listPeers(status) {
|
|
52
|
+
const peers = loadPeers();
|
|
53
|
+
if (status) {
|
|
54
|
+
return peers.filter(p => p.status === status);
|
|
55
|
+
}
|
|
56
|
+
return peers;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Update the scopes granted TO a peer (what they can request from us)
|
|
60
|
+
*/
|
|
61
|
+
export function updatePeerGrantedScopes(peerId, scopes) {
|
|
62
|
+
const peers = loadPeers();
|
|
63
|
+
const peer = peers.find(p => p.id === peerId);
|
|
64
|
+
if (!peer)
|
|
65
|
+
return false;
|
|
66
|
+
peer.grantedScopes = scopes;
|
|
67
|
+
savePeers(peers);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Update the scopes received FROM a peer (what we can request from them)
|
|
72
|
+
*/
|
|
73
|
+
export function updatePeerReceivedScopes(peerId, scopes) {
|
|
74
|
+
const peers = loadPeers();
|
|
75
|
+
const peer = peers.find(p => p.id === peerId);
|
|
76
|
+
if (!peer)
|
|
77
|
+
return false;
|
|
78
|
+
peer.receivedScopes = scopes;
|
|
79
|
+
savePeers(peers);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Update the protocol version for a peer
|
|
84
|
+
*/
|
|
85
|
+
export function updatePeerVersion(peerId, version) {
|
|
86
|
+
const peers = loadPeers();
|
|
87
|
+
const peer = peers.find(p => p.id === peerId);
|
|
88
|
+
if (!peer)
|
|
89
|
+
return false;
|
|
90
|
+
peer.protocolVersion = version;
|
|
91
|
+
savePeers(peers);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get a peer's granted scopes (what they can request from us)
|
|
96
|
+
*/
|
|
97
|
+
export function getPeerGrantedScopes(peerId) {
|
|
98
|
+
const peer = getPeer(peerId);
|
|
99
|
+
return peer?.grantedScopes || null;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Update multiple peer fields at once
|
|
103
|
+
*/
|
|
104
|
+
export function updatePeer(peerId, updates) {
|
|
105
|
+
const peers = loadPeers();
|
|
106
|
+
const peerIndex = peers.findIndex(p => p.id === peerId);
|
|
107
|
+
if (peerIndex === -1)
|
|
108
|
+
return false;
|
|
109
|
+
peers[peerIndex] = { ...peers[peerIndex], ...updates };
|
|
110
|
+
savePeers(peers);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Update response policy for a peer
|
|
115
|
+
*/
|
|
116
|
+
export function updatePeerResponsePolicy(peerId, policy) {
|
|
117
|
+
const peers = loadPeers();
|
|
118
|
+
const peer = peers.find(p => p.id === peerId);
|
|
119
|
+
if (!peer)
|
|
120
|
+
return false;
|
|
121
|
+
peer.responsePolicy = policy;
|
|
122
|
+
savePeers(peers);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Set a topic policy for a peer
|
|
127
|
+
*/
|
|
128
|
+
export function setPeerTopicPolicy(peerId, topic, level, notes) {
|
|
129
|
+
const peers = loadPeers();
|
|
130
|
+
const peer = peers.find(p => p.id === peerId);
|
|
131
|
+
if (!peer)
|
|
132
|
+
return false;
|
|
133
|
+
if (!peer.responsePolicy) {
|
|
134
|
+
peer.responsePolicy = {};
|
|
135
|
+
}
|
|
136
|
+
peer.responsePolicy[topic] = { level, ...(notes && { notes }) };
|
|
137
|
+
savePeers(peers);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Remove a topic from peer's response policy
|
|
142
|
+
*/
|
|
143
|
+
export function removePeerTopicPolicy(peerId, topic) {
|
|
144
|
+
const peers = loadPeers();
|
|
145
|
+
const peer = peers.find(p => p.id === peerId);
|
|
146
|
+
if (!peer || !peer.responsePolicy)
|
|
147
|
+
return false;
|
|
148
|
+
delete peer.responsePolicy[topic];
|
|
149
|
+
savePeers(peers);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get response policy for a peer (peer-specific only, no global fallback)
|
|
154
|
+
*/
|
|
155
|
+
export function getPeerResponsePolicy(peerId) {
|
|
156
|
+
const peer = getPeer(peerId);
|
|
157
|
+
return peer?.responsePolicy || null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Clear response policy for a peer (reset to global defaults)
|
|
161
|
+
*/
|
|
162
|
+
export function clearPeerResponsePolicy(peerId) {
|
|
163
|
+
const peers = loadPeers();
|
|
164
|
+
const peer = peers.find(p => p.id === peerId);
|
|
165
|
+
if (!peer)
|
|
166
|
+
return false;
|
|
167
|
+
delete peer.responsePolicy;
|
|
168
|
+
savePeers(peers);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=peers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peers.js","sourceRoot":"","sources":["../../src/daemon/peers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OGP Reply Handler - Async reply mechanism for federation messages
|
|
3
|
+
*
|
|
4
|
+
* Supports two patterns:
|
|
5
|
+
* 1. Callback: Sender provides replyTo URL, we POST the reply there
|
|
6
|
+
* 2. Polling: We store the reply, sender polls GET /federation/reply/:nonce
|
|
7
|
+
*/
|
|
8
|
+
export interface ReplyPayload {
|
|
9
|
+
nonce: string;
|
|
10
|
+
success: boolean;
|
|
11
|
+
data?: any;
|
|
12
|
+
error?: string;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
}
|
|
15
|
+
export interface StoredReply extends ReplyPayload {
|
|
16
|
+
storedAt: string;
|
|
17
|
+
retrieved: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Start periodic cleanup of expired replies
|
|
21
|
+
*/
|
|
22
|
+
export declare function startReplyCleanup(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Stop periodic cleanup
|
|
25
|
+
*/
|
|
26
|
+
export declare function stopReplyCleanup(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Store a reply for later retrieval via polling
|
|
29
|
+
*/
|
|
30
|
+
export declare function storePendingReply(nonce: string, reply: ReplyPayload): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get a pending reply by nonce
|
|
33
|
+
*/
|
|
34
|
+
export declare function getPendingReply(nonce: string): StoredReply | null;
|
|
35
|
+
/**
|
|
36
|
+
* Delete a pending reply (after retrieval)
|
|
37
|
+
*/
|
|
38
|
+
export declare function deletePendingReply(nonce: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a reply exists
|
|
41
|
+
*/
|
|
42
|
+
export declare function hasReply(nonce: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Send a reply to a callback URL
|
|
45
|
+
*
|
|
46
|
+
* @param peerId - The peer to reply to (for logging)
|
|
47
|
+
* @param replyToUrl - The URL to POST the reply to
|
|
48
|
+
* @param payload - The reply payload
|
|
49
|
+
* @returns Success status and any error
|
|
50
|
+
*/
|
|
51
|
+
export declare function sendReply(peerId: string, replyToUrl: string, payload: ReplyPayload): Promise<{
|
|
52
|
+
success: boolean;
|
|
53
|
+
error?: string;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* Create a reply payload
|
|
57
|
+
*/
|
|
58
|
+
export declare function createReply(nonce: string, success: boolean, dataOrError?: any): ReplyPayload;
|
|
59
|
+
/**
|
|
60
|
+
* Handle sending reply via callback or storing for polling
|
|
61
|
+
*
|
|
62
|
+
* @param peerId - Peer to reply to
|
|
63
|
+
* @param replyToUrl - Optional callback URL (if provided, POST; otherwise store)
|
|
64
|
+
* @param payload - Reply payload
|
|
65
|
+
*/
|
|
66
|
+
export declare function handleReply(peerId: string, replyToUrl: string | undefined, payload: ReplyPayload): Promise<void>;
|
|
67
|
+
//# sourceMappingURL=reply-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply-handler.d.ts","sourceRoot":"","sources":["../../src/daemon/reply-handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAeD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAeD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAgB1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAOjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiD/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,GAAG,GAChB,YAAY,CAOd;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAaf"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OGP Reply Handler - Async reply mechanism for federation messages
|
|
3
|
+
*
|
|
4
|
+
* Supports two patterns:
|
|
5
|
+
* 1. Callback: Sender provides replyTo URL, we POST the reply there
|
|
6
|
+
* 2. Polling: We store the reply, sender polls GET /federation/reply/:nonce
|
|
7
|
+
*/
|
|
8
|
+
import { signObject } from '../shared/signing.js';
|
|
9
|
+
import { getPrivateKey } from './keypair.js';
|
|
10
|
+
import { requireConfig } from '../shared/config.js';
|
|
11
|
+
// In-memory reply store (keyed by nonce)
|
|
12
|
+
const pendingReplies = new Map();
|
|
13
|
+
// Max replies to keep in memory
|
|
14
|
+
const MAX_PENDING_REPLIES = 1000;
|
|
15
|
+
// Reply TTL (10 minutes)
|
|
16
|
+
const REPLY_TTL_MS = 10 * 60 * 1000;
|
|
17
|
+
// Cleanup interval (1 minute)
|
|
18
|
+
const CLEANUP_INTERVAL_MS = 60 * 1000;
|
|
19
|
+
let cleanupTimer = null;
|
|
20
|
+
/**
|
|
21
|
+
* Start periodic cleanup of expired replies
|
|
22
|
+
*/
|
|
23
|
+
export function startReplyCleanup() {
|
|
24
|
+
if (cleanupTimer)
|
|
25
|
+
return;
|
|
26
|
+
cleanupTimer = setInterval(cleanupExpiredReplies, CLEANUP_INTERVAL_MS);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stop periodic cleanup
|
|
30
|
+
*/
|
|
31
|
+
export function stopReplyCleanup() {
|
|
32
|
+
if (cleanupTimer) {
|
|
33
|
+
clearInterval(cleanupTimer);
|
|
34
|
+
cleanupTimer = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Clean up expired replies
|
|
39
|
+
*/
|
|
40
|
+
function cleanupExpiredReplies() {
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
for (const [nonce, reply] of pendingReplies.entries()) {
|
|
43
|
+
const storedAt = new Date(reply.storedAt).getTime();
|
|
44
|
+
if (now - storedAt > REPLY_TTL_MS) {
|
|
45
|
+
pendingReplies.delete(nonce);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Store a reply for later retrieval via polling
|
|
51
|
+
*/
|
|
52
|
+
export function storePendingReply(nonce, reply) {
|
|
53
|
+
// Enforce max size by removing oldest entries
|
|
54
|
+
if (pendingReplies.size >= MAX_PENDING_REPLIES) {
|
|
55
|
+
const oldest = Array.from(pendingReplies.entries())
|
|
56
|
+
.sort((a, b) => new Date(a[1].storedAt).getTime() - new Date(b[1].storedAt).getTime())
|
|
57
|
+
.slice(0, 100);
|
|
58
|
+
for (const [key] of oldest) {
|
|
59
|
+
pendingReplies.delete(key);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
pendingReplies.set(nonce, {
|
|
63
|
+
...reply,
|
|
64
|
+
storedAt: new Date().toISOString(),
|
|
65
|
+
retrieved: false
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get a pending reply by nonce
|
|
70
|
+
*/
|
|
71
|
+
export function getPendingReply(nonce) {
|
|
72
|
+
const reply = pendingReplies.get(nonce);
|
|
73
|
+
if (!reply)
|
|
74
|
+
return null;
|
|
75
|
+
// Mark as retrieved but keep in store briefly
|
|
76
|
+
reply.retrieved = true;
|
|
77
|
+
return reply;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Delete a pending reply (after retrieval)
|
|
81
|
+
*/
|
|
82
|
+
export function deletePendingReply(nonce) {
|
|
83
|
+
return pendingReplies.delete(nonce);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a reply exists
|
|
87
|
+
*/
|
|
88
|
+
export function hasReply(nonce) {
|
|
89
|
+
return pendingReplies.has(nonce);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Send a reply to a callback URL
|
|
93
|
+
*
|
|
94
|
+
* @param peerId - The peer to reply to (for logging)
|
|
95
|
+
* @param replyToUrl - The URL to POST the reply to
|
|
96
|
+
* @param payload - The reply payload
|
|
97
|
+
* @returns Success status and any error
|
|
98
|
+
*/
|
|
99
|
+
export async function sendReply(peerId, replyToUrl, payload) {
|
|
100
|
+
const config = requireConfig();
|
|
101
|
+
const ourId = `${new URL(config.gatewayUrl).hostname}:${config.daemonPort}`;
|
|
102
|
+
// Sign the reply
|
|
103
|
+
const signedReply = {
|
|
104
|
+
...payload,
|
|
105
|
+
from: ourId,
|
|
106
|
+
to: peerId
|
|
107
|
+
};
|
|
108
|
+
const { payload: signedPayload, signature } = signObject(signedReply, getPrivateKey());
|
|
109
|
+
try {
|
|
110
|
+
const controller = new AbortController();
|
|
111
|
+
const timeout = setTimeout(() => controller.abort(), 10000); // 10 second timeout
|
|
112
|
+
const response = await fetch(replyToUrl, {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
headers: {
|
|
115
|
+
'Content-Type': 'application/json'
|
|
116
|
+
},
|
|
117
|
+
body: JSON.stringify({
|
|
118
|
+
reply: signedPayload,
|
|
119
|
+
signature
|
|
120
|
+
}),
|
|
121
|
+
signal: controller.signal
|
|
122
|
+
});
|
|
123
|
+
clearTimeout(timeout);
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
const text = await response.text().catch(() => '');
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
error: `Reply callback failed: ${response.status} ${response.statusText} - ${text}`
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
console.log(`[OGP] Reply sent to ${peerId} via callback`);
|
|
132
|
+
return { success: true };
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
136
|
+
console.error(`[OGP] Failed to send reply to ${replyToUrl}:`, message);
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
error: `Reply callback failed: ${message}`
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Create a reply payload
|
|
145
|
+
*/
|
|
146
|
+
export function createReply(nonce, success, dataOrError) {
|
|
147
|
+
return {
|
|
148
|
+
nonce,
|
|
149
|
+
success,
|
|
150
|
+
...(success ? { data: dataOrError } : { error: dataOrError }),
|
|
151
|
+
timestamp: new Date().toISOString()
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Handle sending reply via callback or storing for polling
|
|
156
|
+
*
|
|
157
|
+
* @param peerId - Peer to reply to
|
|
158
|
+
* @param replyToUrl - Optional callback URL (if provided, POST; otherwise store)
|
|
159
|
+
* @param payload - Reply payload
|
|
160
|
+
*/
|
|
161
|
+
export async function handleReply(peerId, replyToUrl, payload) {
|
|
162
|
+
if (replyToUrl) {
|
|
163
|
+
// Try callback first
|
|
164
|
+
const result = await sendReply(peerId, replyToUrl, payload);
|
|
165
|
+
if (!result.success) {
|
|
166
|
+
// Callback failed - store for polling as fallback
|
|
167
|
+
console.log(`[OGP] Callback failed, storing reply for polling`);
|
|
168
|
+
storePendingReply(payload.nonce, payload);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// No callback URL - store for polling
|
|
173
|
+
storePendingReply(payload.nonce, payload);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=reply-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply-handler.js","sourceRoot":"","sources":["../../src/daemon/reply-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OGP v0.2.0 Scope Types
|
|
3
|
+
*
|
|
4
|
+
* Three-layer model:
|
|
5
|
+
* Layer 1: Gateway Capabilities - What I CAN support (advertised globally)
|
|
6
|
+
* Layer 2: Peer Negotiation - What I WILL grant YOU (per-peer, during approval)
|
|
7
|
+
* Layer 3: Runtime Enforcement - Is THIS request within YOUR granted scope (doorman)
|
|
8
|
+
*/
|
|
9
|
+
export interface RateLimit {
|
|
10
|
+
requests: number;
|
|
11
|
+
windowSeconds: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ScopeGrant {
|
|
14
|
+
intent: string;
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
rateLimit?: RateLimit;
|
|
17
|
+
topics?: string[];
|
|
18
|
+
expiresAt?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ScopeBundle {
|
|
21
|
+
version: "0.2.0";
|
|
22
|
+
grantedAt: string;
|
|
23
|
+
scopes: ScopeGrant[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Default scopes granted to v0.1 peers (backward compatibility)
|
|
27
|
+
*/
|
|
28
|
+
export declare const DEFAULT_V1_SCOPES: ScopeBundle;
|
|
29
|
+
/**
|
|
30
|
+
* Default rate limit for all intents
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_RATE_LIMIT: RateLimit;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a rate limit string like "100/3600" or "10/60"
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseRateLimit(rateStr: string): RateLimit | null;
|
|
37
|
+
/**
|
|
38
|
+
* Format a rate limit as string like "100/3600"
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatRateLimit(limit: RateLimit): string;
|
|
41
|
+
/**
|
|
42
|
+
* Create a scope grant from CLI options
|
|
43
|
+
*/
|
|
44
|
+
export declare function createScopeGrant(intent: string, options?: {
|
|
45
|
+
enabled?: boolean;
|
|
46
|
+
rateLimit?: RateLimit;
|
|
47
|
+
topics?: string[];
|
|
48
|
+
expiresAt?: string;
|
|
49
|
+
}): ScopeGrant;
|
|
50
|
+
/**
|
|
51
|
+
* Create a scope bundle from an array of scope grants
|
|
52
|
+
*/
|
|
53
|
+
export declare function createScopeBundle(scopes: ScopeGrant[]): ScopeBundle;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a scope grant covers a specific intent and topic
|
|
56
|
+
*/
|
|
57
|
+
export declare function scopeCoversIntent(grant: ScopeGrant, intent: string, topic?: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Find a scope grant for a specific intent in a bundle
|
|
60
|
+
*/
|
|
61
|
+
export declare function findScopeGrant(bundle: ScopeBundle | undefined, intent: string): ScopeGrant | null;
|
|
62
|
+
//# sourceMappingURL=scopes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../../src/daemon/scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAoB/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAGhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,UAAU,CAQZ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAMnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAqBT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,GACb,UAAU,GAAG,IAAI,CAGnB"}
|