@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.
Files changed (82) hide show
  1. package/README.md +437 -0
  2. package/dist/cli/agent-comms.d.ts +55 -0
  3. package/dist/cli/agent-comms.d.ts.map +1 -0
  4. package/dist/cli/agent-comms.js +217 -0
  5. package/dist/cli/agent-comms.js.map +1 -0
  6. package/dist/cli/expose.d.ts +3 -0
  7. package/dist/cli/expose.d.ts.map +1 -0
  8. package/dist/cli/expose.js +104 -0
  9. package/dist/cli/expose.js.map +1 -0
  10. package/dist/cli/federation.d.ts +28 -0
  11. package/dist/cli/federation.d.ts.map +1 -0
  12. package/dist/cli/federation.js +409 -0
  13. package/dist/cli/federation.js.map +1 -0
  14. package/dist/cli/install.d.ts +3 -0
  15. package/dist/cli/install.d.ts.map +1 -0
  16. package/dist/cli/install.js +111 -0
  17. package/dist/cli/install.js.map +1 -0
  18. package/dist/cli/setup.d.ts +2 -0
  19. package/dist/cli/setup.d.ts.map +1 -0
  20. package/dist/cli/setup.js +33 -0
  21. package/dist/cli/setup.js.map +1 -0
  22. package/dist/cli.d.ts +3 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +305 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/daemon/agent-comms.d.ts +76 -0
  27. package/dist/daemon/agent-comms.d.ts.map +1 -0
  28. package/dist/daemon/agent-comms.js +188 -0
  29. package/dist/daemon/agent-comms.js.map +1 -0
  30. package/dist/daemon/doorman.d.ts +52 -0
  31. package/dist/daemon/doorman.d.ts.map +1 -0
  32. package/dist/daemon/doorman.js +203 -0
  33. package/dist/daemon/doorman.js.map +1 -0
  34. package/dist/daemon/intent-registry.d.ts +11 -0
  35. package/dist/daemon/intent-registry.d.ts.map +1 -0
  36. package/dist/daemon/intent-registry.js +101 -0
  37. package/dist/daemon/intent-registry.js.map +1 -0
  38. package/dist/daemon/keypair.d.ts +5 -0
  39. package/dist/daemon/keypair.d.ts.map +1 -0
  40. package/dist/daemon/keypair.js +25 -0
  41. package/dist/daemon/keypair.js.map +1 -0
  42. package/dist/daemon/message-handler.d.ts +20 -0
  43. package/dist/daemon/message-handler.d.ts.map +1 -0
  44. package/dist/daemon/message-handler.js +159 -0
  45. package/dist/daemon/message-handler.js.map +1 -0
  46. package/dist/daemon/notify.d.ts +7 -0
  47. package/dist/daemon/notify.d.ts.map +1 -0
  48. package/dist/daemon/notify.js +54 -0
  49. package/dist/daemon/notify.js.map +1 -0
  50. package/dist/daemon/peers.d.ts +66 -0
  51. package/dist/daemon/peers.d.ts.map +1 -0
  52. package/dist/daemon/peers.js +171 -0
  53. package/dist/daemon/peers.js.map +1 -0
  54. package/dist/daemon/reply-handler.d.ts +67 -0
  55. package/dist/daemon/reply-handler.d.ts.map +1 -0
  56. package/dist/daemon/reply-handler.js +176 -0
  57. package/dist/daemon/reply-handler.js.map +1 -0
  58. package/dist/daemon/scopes.d.ts +62 -0
  59. package/dist/daemon/scopes.d.ts.map +1 -0
  60. package/dist/daemon/scopes.js +113 -0
  61. package/dist/daemon/scopes.js.map +1 -0
  62. package/dist/daemon/server.d.ts +8 -0
  63. package/dist/daemon/server.d.ts.map +1 -0
  64. package/dist/daemon/server.js +286 -0
  65. package/dist/daemon/server.js.map +1 -0
  66. package/dist/shared/config.d.ts +42 -0
  67. package/dist/shared/config.d.ts.map +1 -0
  68. package/dist/shared/config.js +42 -0
  69. package/dist/shared/config.js.map +1 -0
  70. package/dist/shared/signing.d.ts +13 -0
  71. package/dist/shared/signing.d.ts.map +1 -0
  72. package/dist/shared/signing.js +46 -0
  73. package/dist/shared/signing.js.map +1 -0
  74. package/docs/agent-comms.md +277 -0
  75. package/docs/federation-flow.md +407 -0
  76. package/docs/quickstart.md +241 -0
  77. package/docs/scopes.md +198 -0
  78. package/package.json +57 -0
  79. package/scripts/install-skills.js +32 -0
  80. package/skills/ogp/SKILL.md +235 -0
  81. package/skills/ogp-agent-comms/SKILL.md +345 -0
  82. 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"}