agent-relay 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/CHANGELOG.md +11 -0
- package/LICENSE +22 -0
- package/PROTOCOL.md +319 -0
- package/README.md +791 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1591 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/daemon/connection.d.ts +60 -0
- package/dist/daemon/connection.d.ts.map +1 -0
- package/dist/daemon/connection.js +245 -0
- package/dist/daemon/connection.js.map +1 -0
- package/dist/daemon/index.d.ts +4 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +4 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/router.d.ts +72 -0
- package/dist/daemon/router.d.ts.map +1 -0
- package/dist/daemon/router.js +183 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/server.d.ts +52 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +186 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/dashboard/public/index.html +690 -0
- package/dist/dashboard/server.d.ts +2 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +220 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/games/index.d.ts +2 -0
- package/dist/games/index.d.ts.map +1 -0
- package/dist/games/index.js +2 -0
- package/dist/games/index.js.map +1 -0
- package/dist/games/tictactoe.d.ts +24 -0
- package/dist/games/tictactoe.d.ts.map +1 -0
- package/dist/games/tictactoe.js +160 -0
- package/dist/games/tictactoe.js.map +1 -0
- package/dist/hooks/inbox-check/hook.d.ts +28 -0
- package/dist/hooks/inbox-check/hook.d.ts.map +1 -0
- package/dist/hooks/inbox-check/hook.js +97 -0
- package/dist/hooks/inbox-check/hook.js.map +1 -0
- package/dist/hooks/inbox-check/index.d.ts +8 -0
- package/dist/hooks/inbox-check/index.d.ts.map +1 -0
- package/dist/hooks/inbox-check/index.js +8 -0
- package/dist/hooks/inbox-check/index.js.map +1 -0
- package/dist/hooks/inbox-check/types.d.ts +31 -0
- package/dist/hooks/inbox-check/types.d.ts.map +1 -0
- package/dist/hooks/inbox-check/types.js +5 -0
- package/dist/hooks/inbox-check/types.js.map +1 -0
- package/dist/hooks/inbox-check/utils.d.ts +44 -0
- package/dist/hooks/inbox-check/utils.d.ts.map +1 -0
- package/dist/hooks/inbox-check/utils.js +107 -0
- package/dist/hooks/inbox-check/utils.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/framing.d.ts +32 -0
- package/dist/protocol/framing.d.ts.map +1 -0
- package/dist/protocol/framing.js +71 -0
- package/dist/protocol/framing.js.map +1 -0
- package/dist/protocol/index.d.ts +3 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +3 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/types.d.ts +104 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +6 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/state/agent-state.d.ts +40 -0
- package/dist/state/agent-state.d.ts.map +1 -0
- package/dist/state/agent-state.js +120 -0
- package/dist/state/agent-state.js.map +1 -0
- package/dist/storage/adapter.d.ts +29 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +2 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/sqlite-adapter.d.ts +15 -0
- package/dist/storage/sqlite-adapter.d.ts.map +1 -0
- package/dist/storage/sqlite-adapter.js +116 -0
- package/dist/storage/sqlite-adapter.js.map +1 -0
- package/dist/supervisor/inbox.d.ts +38 -0
- package/dist/supervisor/inbox.d.ts.map +1 -0
- package/dist/supervisor/inbox.js +162 -0
- package/dist/supervisor/inbox.js.map +1 -0
- package/dist/supervisor/index.d.ts +10 -0
- package/dist/supervisor/index.d.ts.map +1 -0
- package/dist/supervisor/index.js +10 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/supervisor/spawner.d.ts +54 -0
- package/dist/supervisor/spawner.d.ts.map +1 -0
- package/dist/supervisor/spawner.js +282 -0
- package/dist/supervisor/spawner.js.map +1 -0
- package/dist/supervisor/state.d.ts +132 -0
- package/dist/supervisor/state.d.ts.map +1 -0
- package/dist/supervisor/state.js +465 -0
- package/dist/supervisor/state.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +67 -0
- package/dist/supervisor/supervisor.d.ts.map +1 -0
- package/dist/supervisor/supervisor.js +263 -0
- package/dist/supervisor/supervisor.js.map +1 -0
- package/dist/supervisor/types.d.ts +139 -0
- package/dist/supervisor/types.d.ts.map +1 -0
- package/dist/supervisor/types.js +12 -0
- package/dist/supervisor/types.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/name-generator.d.ts +17 -0
- package/dist/utils/name-generator.d.ts.map +1 -0
- package/dist/utils/name-generator.js +52 -0
- package/dist/utils/name-generator.js.map +1 -0
- package/dist/webhook/spawner.d.ts +79 -0
- package/dist/webhook/spawner.d.ts.map +1 -0
- package/dist/webhook/spawner.js +288 -0
- package/dist/webhook/spawner.js.map +1 -0
- package/dist/wrapper/client.d.ts +72 -0
- package/dist/wrapper/client.d.ts.map +1 -0
- package/dist/wrapper/client.js +306 -0
- package/dist/wrapper/client.js.map +1 -0
- package/dist/wrapper/inbox.d.ts +37 -0
- package/dist/wrapper/inbox.d.ts.map +1 -0
- package/dist/wrapper/inbox.js +73 -0
- package/dist/wrapper/inbox.js.map +1 -0
- package/dist/wrapper/index.d.ts +4 -0
- package/dist/wrapper/index.d.ts.map +1 -0
- package/dist/wrapper/index.js +7 -0
- package/dist/wrapper/index.js.map +1 -0
- package/dist/wrapper/parser.d.ts +94 -0
- package/dist/wrapper/parser.d.ts.map +1 -0
- package/dist/wrapper/parser.js +360 -0
- package/dist/wrapper/parser.js.map +1 -0
- package/dist/wrapper/pty-wrapper.d.ts +125 -0
- package/dist/wrapper/pty-wrapper.d.ts.map +1 -0
- package/dist/wrapper/pty-wrapper.js +494 -0
- package/dist/wrapper/pty-wrapper.js.map +1 -0
- package/dist/wrapper/tmux-wrapper.d.ts +131 -0
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -0
- package/dist/wrapper/tmux-wrapper.js +427 -0
- package/dist/wrapper/tmux-wrapper.js.map +1 -0
- package/install.sh +69 -0
- package/package.json +82 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for Agent Relay Inbox Check Hook
|
|
3
|
+
*/
|
|
4
|
+
import type { InboxConfig, InboxMessage } from './types.js';
|
|
5
|
+
/** Default inbox directory */
|
|
6
|
+
export declare const DEFAULT_INBOX_DIR = "/tmp/agent-relay";
|
|
7
|
+
/**
|
|
8
|
+
* Get the agent name from environment or config
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAgentName(): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Get the inbox file path for an agent
|
|
13
|
+
*/
|
|
14
|
+
export declare function getInboxPath(config: InboxConfig): string;
|
|
15
|
+
/**
|
|
16
|
+
* Check if inbox file exists and has content
|
|
17
|
+
*/
|
|
18
|
+
export declare function inboxExists(inboxPath: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Read inbox file content
|
|
21
|
+
*/
|
|
22
|
+
export declare function readInbox(inboxPath: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Check if inbox has unread messages
|
|
25
|
+
* Messages are marked with "## Message from" header
|
|
26
|
+
*/
|
|
27
|
+
export declare function hasUnreadMessages(inboxPath: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Count unread messages in inbox
|
|
30
|
+
*/
|
|
31
|
+
export declare function countMessages(inboxPath: string): number;
|
|
32
|
+
/**
|
|
33
|
+
* Parse messages from inbox content
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseMessages(inboxPath: string): InboxMessage[];
|
|
36
|
+
/**
|
|
37
|
+
* Format a message for display
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatMessagePreview(msg: InboxMessage, maxLength?: number): string;
|
|
40
|
+
/**
|
|
41
|
+
* Build the block reason message
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildBlockReason(inboxPath: string, messageCount: number): string;
|
|
44
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/hooks/inbox-check/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAGjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAO5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CAmB/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAKtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAehF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for Agent Relay Inbox Check Hook
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
/** Default inbox directory */
|
|
7
|
+
export const DEFAULT_INBOX_DIR = '/tmp/agent-relay';
|
|
8
|
+
/**
|
|
9
|
+
* Get the agent name from environment or config
|
|
10
|
+
*/
|
|
11
|
+
export function getAgentName() {
|
|
12
|
+
// Check environment variable set by agent-relay wrapper
|
|
13
|
+
return process.env.AGENT_RELAY_NAME;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the inbox file path for an agent
|
|
17
|
+
*/
|
|
18
|
+
export function getInboxPath(config) {
|
|
19
|
+
const agentName = config.agentName || getAgentName();
|
|
20
|
+
if (!agentName) {
|
|
21
|
+
throw new Error('Agent name not configured. Set AGENT_RELAY_NAME env var.');
|
|
22
|
+
}
|
|
23
|
+
return join(config.inboxDir, agentName, 'inbox.md');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if inbox file exists and has content
|
|
27
|
+
*/
|
|
28
|
+
export function inboxExists(inboxPath) {
|
|
29
|
+
return existsSync(inboxPath);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read inbox file content
|
|
33
|
+
*/
|
|
34
|
+
export function readInbox(inboxPath) {
|
|
35
|
+
if (!inboxExists(inboxPath)) {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
return readFileSync(inboxPath, 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if inbox has unread messages
|
|
42
|
+
* Messages are marked with "## Message from" header
|
|
43
|
+
*/
|
|
44
|
+
export function hasUnreadMessages(inboxPath) {
|
|
45
|
+
const content = readInbox(inboxPath);
|
|
46
|
+
if (!content || !content.trim()) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
// Check for message headers
|
|
50
|
+
return content.includes('## Message from');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Count unread messages in inbox
|
|
54
|
+
*/
|
|
55
|
+
export function countMessages(inboxPath) {
|
|
56
|
+
const content = readInbox(inboxPath);
|
|
57
|
+
if (!content) {
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
const matches = content.match(/## Message from/g);
|
|
61
|
+
return matches ? matches.length : 0;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse messages from inbox content
|
|
65
|
+
*/
|
|
66
|
+
export function parseMessages(inboxPath) {
|
|
67
|
+
const content = readInbox(inboxPath);
|
|
68
|
+
if (!content) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
const messages = [];
|
|
72
|
+
const messageBlocks = content.split(/(?=## Message from)/);
|
|
73
|
+
for (const block of messageBlocks) {
|
|
74
|
+
const headerMatch = block.match(/## Message from (\S+) \| (.+)\n/);
|
|
75
|
+
if (headerMatch) {
|
|
76
|
+
const [, from, timestamp] = headerMatch;
|
|
77
|
+
const body = block.replace(/## Message from .+\n/, '').trim();
|
|
78
|
+
messages.push({ from, timestamp, body });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return messages;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Format a message for display
|
|
85
|
+
*/
|
|
86
|
+
export function formatMessagePreview(msg, maxLength = 50) {
|
|
87
|
+
const preview = msg.body.length > maxLength
|
|
88
|
+
? msg.body.substring(0, maxLength) + '...'
|
|
89
|
+
: msg.body;
|
|
90
|
+
return `[${msg.from}]: ${preview}`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Build the block reason message
|
|
94
|
+
*/
|
|
95
|
+
export function buildBlockReason(inboxPath, messageCount) {
|
|
96
|
+
const messages = parseMessages(inboxPath);
|
|
97
|
+
const previews = messages.slice(0, 3).map(m => formatMessagePreview(m));
|
|
98
|
+
let reason = `You have ${messageCount} unread relay message(s) in ${inboxPath}.\n\n`;
|
|
99
|
+
reason += 'Messages:\n';
|
|
100
|
+
reason += previews.map(p => ` - ${p}`).join('\n');
|
|
101
|
+
if (messages.length > 3) {
|
|
102
|
+
reason += `\n ... and ${messages.length - 3} more`;
|
|
103
|
+
}
|
|
104
|
+
reason += '\n\nPlease read the inbox file and respond to all messages before stopping.';
|
|
105
|
+
return reason;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/hooks/inbox-check/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Relay
|
|
3
|
+
* Real-time agent-to-agent communication system.
|
|
4
|
+
*/
|
|
5
|
+
export * from './protocol/index.js';
|
|
6
|
+
export * from './daemon/index.js';
|
|
7
|
+
export * from './wrapper/index.js';
|
|
8
|
+
export * from './games/index.js';
|
|
9
|
+
export * from './utils/index.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Relay
|
|
3
|
+
* Real-time agent-to-agent communication system.
|
|
4
|
+
*/
|
|
5
|
+
export * from './protocol/index.js';
|
|
6
|
+
export * from './daemon/index.js';
|
|
7
|
+
export * from './wrapper/index.js';
|
|
8
|
+
export * from './games/index.js';
|
|
9
|
+
export * from './utils/index.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame encoding/decoding for the agent relay protocol.
|
|
3
|
+
* Uses 4-byte big-endian length prefix + UTF-8 JSON.
|
|
4
|
+
*/
|
|
5
|
+
import type { Envelope } from './types.js';
|
|
6
|
+
export declare const MAX_FRAME_BYTES: number;
|
|
7
|
+
export declare const HEADER_SIZE = 4;
|
|
8
|
+
/**
|
|
9
|
+
* Encode a message envelope into a framed buffer.
|
|
10
|
+
*/
|
|
11
|
+
export declare function encodeFrame(envelope: Envelope): Buffer;
|
|
12
|
+
/**
|
|
13
|
+
* Frame parser state machine for streaming data.
|
|
14
|
+
*/
|
|
15
|
+
export declare class FrameParser {
|
|
16
|
+
private buffer;
|
|
17
|
+
private maxFrameBytes;
|
|
18
|
+
constructor(maxFrameBytes?: number);
|
|
19
|
+
/**
|
|
20
|
+
* Push data into the parser and extract complete frames.
|
|
21
|
+
*/
|
|
22
|
+
push(data: Buffer): Envelope[];
|
|
23
|
+
/**
|
|
24
|
+
* Reset parser state (e.g., on connection reset).
|
|
25
|
+
*/
|
|
26
|
+
reset(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Get current buffer size (for debugging).
|
|
29
|
+
*/
|
|
30
|
+
get pendingBytes(): number;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=framing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../../src/protocol/framing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,eAAe,QAAc,CAAC;AAC3C,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAYtD;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAwB;IAInD;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAgC9B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame encoding/decoding for the agent relay protocol.
|
|
3
|
+
* Uses 4-byte big-endian length prefix + UTF-8 JSON.
|
|
4
|
+
*/
|
|
5
|
+
export const MAX_FRAME_BYTES = 1024 * 1024; // 1 MiB default
|
|
6
|
+
export const HEADER_SIZE = 4;
|
|
7
|
+
/**
|
|
8
|
+
* Encode a message envelope into a framed buffer.
|
|
9
|
+
*/
|
|
10
|
+
export function encodeFrame(envelope) {
|
|
11
|
+
const json = JSON.stringify(envelope);
|
|
12
|
+
const data = Buffer.from(json, 'utf-8');
|
|
13
|
+
if (data.length > MAX_FRAME_BYTES) {
|
|
14
|
+
throw new Error(`Frame too large: ${data.length} > ${MAX_FRAME_BYTES}`);
|
|
15
|
+
}
|
|
16
|
+
const header = Buffer.alloc(HEADER_SIZE);
|
|
17
|
+
header.writeUInt32BE(data.length, 0);
|
|
18
|
+
return Buffer.concat([header, data]);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Frame parser state machine for streaming data.
|
|
22
|
+
*/
|
|
23
|
+
export class FrameParser {
|
|
24
|
+
buffer = Buffer.alloc(0);
|
|
25
|
+
maxFrameBytes;
|
|
26
|
+
constructor(maxFrameBytes = MAX_FRAME_BYTES) {
|
|
27
|
+
this.maxFrameBytes = maxFrameBytes;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Push data into the parser and extract complete frames.
|
|
31
|
+
*/
|
|
32
|
+
push(data) {
|
|
33
|
+
this.buffer = Buffer.concat([this.buffer, data]);
|
|
34
|
+
const frames = [];
|
|
35
|
+
while (this.buffer.length >= HEADER_SIZE) {
|
|
36
|
+
const frameLength = this.buffer.readUInt32BE(0);
|
|
37
|
+
if (frameLength > this.maxFrameBytes) {
|
|
38
|
+
throw new Error(`Frame too large: ${frameLength} > ${this.maxFrameBytes}`);
|
|
39
|
+
}
|
|
40
|
+
const totalLength = HEADER_SIZE + frameLength;
|
|
41
|
+
if (this.buffer.length < totalLength) {
|
|
42
|
+
// Need more data
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
// Extract frame
|
|
46
|
+
const frameData = this.buffer.subarray(HEADER_SIZE, totalLength);
|
|
47
|
+
this.buffer = this.buffer.subarray(totalLength);
|
|
48
|
+
try {
|
|
49
|
+
const envelope = JSON.parse(frameData.toString('utf-8'));
|
|
50
|
+
frames.push(envelope);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
throw new Error(`Invalid JSON in frame: ${err}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return frames;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Reset parser state (e.g., on connection reset).
|
|
60
|
+
*/
|
|
61
|
+
reset() {
|
|
62
|
+
this.buffer = Buffer.alloc(0);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get current buffer size (for debugging).
|
|
66
|
+
*/
|
|
67
|
+
get pendingBytes() {
|
|
68
|
+
return this.buffer.length;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=framing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../src/protocol/framing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,gBAAgB;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAExC,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,MAAM,eAAe,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,MAAM,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,aAAa,CAAS;IAE9B,YAAY,gBAAwB,eAAe;QACjD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACjD,MAAM,MAAM,GAAe,EAAE,CAAC;QAE9B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEhD,IAAI,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YAC7E,CAAC;YAED,MAAM,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;YAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;gBACrC,iBAAiB;gBACjB,MAAM;YACR,CAAC;YAED,gBAAgB;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAEhD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAa,CAAC;gBACrE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Relay Protocol Types
|
|
3
|
+
* Version 1.0
|
|
4
|
+
*/
|
|
5
|
+
export declare const PROTOCOL_VERSION = 1;
|
|
6
|
+
export type MessageType = 'HELLO' | 'WELCOME' | 'SEND' | 'DELIVER' | 'ACK' | 'NACK' | 'PING' | 'PONG' | 'ERROR' | 'BUSY' | 'RESUME' | 'BYE' | 'STATE' | 'SYNC' | 'SYNC_SNAPSHOT' | 'SYNC_DELTA' | 'SUBSCRIBE' | 'UNSUBSCRIBE';
|
|
7
|
+
export type PayloadKind = 'message' | 'action' | 'state' | 'thinking';
|
|
8
|
+
export interface Envelope<T = unknown> {
|
|
9
|
+
v: number;
|
|
10
|
+
type: MessageType;
|
|
11
|
+
id: string;
|
|
12
|
+
ts: number;
|
|
13
|
+
from?: string;
|
|
14
|
+
to?: string | '*';
|
|
15
|
+
topic?: string;
|
|
16
|
+
payload: T;
|
|
17
|
+
}
|
|
18
|
+
export interface HelloPayload {
|
|
19
|
+
agent: string;
|
|
20
|
+
capabilities: {
|
|
21
|
+
ack: boolean;
|
|
22
|
+
resume: boolean;
|
|
23
|
+
max_inflight: number;
|
|
24
|
+
supports_topics: boolean;
|
|
25
|
+
};
|
|
26
|
+
session?: {
|
|
27
|
+
resume_token?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface WelcomePayload {
|
|
31
|
+
session_id: string;
|
|
32
|
+
resume_token: string;
|
|
33
|
+
server: {
|
|
34
|
+
max_frame_bytes: number;
|
|
35
|
+
heartbeat_ms: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface SendPayload {
|
|
39
|
+
kind: PayloadKind;
|
|
40
|
+
body: string;
|
|
41
|
+
data?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
export interface SendMeta {
|
|
44
|
+
requires_ack?: boolean;
|
|
45
|
+
ttl_ms?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface DeliveryInfo {
|
|
48
|
+
seq: number;
|
|
49
|
+
session_id: string;
|
|
50
|
+
}
|
|
51
|
+
export interface AckPayload {
|
|
52
|
+
ack_id: string;
|
|
53
|
+
seq: number;
|
|
54
|
+
cumulative_seq?: number;
|
|
55
|
+
sack?: number[];
|
|
56
|
+
}
|
|
57
|
+
export interface NackPayload {
|
|
58
|
+
ack_id: string;
|
|
59
|
+
code?: 'BUSY' | 'INVALID' | 'FORBIDDEN' | 'STALE';
|
|
60
|
+
reason?: 'busy' | 'invalid' | 'forbidden';
|
|
61
|
+
message?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface BusyPayload {
|
|
64
|
+
retry_after_ms: number;
|
|
65
|
+
queue_depth: number;
|
|
66
|
+
}
|
|
67
|
+
export interface PingPayload {
|
|
68
|
+
nonce: string;
|
|
69
|
+
}
|
|
70
|
+
export interface PongPayload {
|
|
71
|
+
nonce: string;
|
|
72
|
+
}
|
|
73
|
+
export type ErrorCode = 'BAD_REQUEST' | 'UNAUTHORIZED' | 'NOT_FOUND' | 'INTERNAL' | 'RESUME_TOO_OLD';
|
|
74
|
+
export interface ErrorPayload {
|
|
75
|
+
code: ErrorCode;
|
|
76
|
+
message: string;
|
|
77
|
+
fatal: boolean;
|
|
78
|
+
}
|
|
79
|
+
export interface SyncStream {
|
|
80
|
+
topic: string;
|
|
81
|
+
peer: string;
|
|
82
|
+
last_seq: number;
|
|
83
|
+
server_last_seq?: number;
|
|
84
|
+
}
|
|
85
|
+
export interface SyncPayload {
|
|
86
|
+
session_id: string;
|
|
87
|
+
streams: SyncStream[];
|
|
88
|
+
}
|
|
89
|
+
export type HelloEnvelope = Envelope<HelloPayload>;
|
|
90
|
+
export type WelcomeEnvelope = Envelope<WelcomePayload>;
|
|
91
|
+
export type SendEnvelope = Envelope<SendPayload> & {
|
|
92
|
+
payload_meta?: SendMeta;
|
|
93
|
+
};
|
|
94
|
+
export type DeliverEnvelope = Envelope<SendPayload> & {
|
|
95
|
+
delivery: DeliveryInfo;
|
|
96
|
+
};
|
|
97
|
+
export type AckEnvelope = Envelope<AckPayload>;
|
|
98
|
+
export type NackEnvelope = Envelope<NackPayload>;
|
|
99
|
+
export type PingEnvelope = Envelope<PingPayload>;
|
|
100
|
+
export type PongEnvelope = Envelope<PongPayload>;
|
|
101
|
+
export type ErrorEnvelope = Envelope<ErrorPayload>;
|
|
102
|
+
export type BusyEnvelope = Envelope<BusyPayload>;
|
|
103
|
+
export type SyncEnvelope = Envelope<SyncPayload>;
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent State Manager
|
|
3
|
+
* Persists agent context between spawns for non-hook CLIs (Codex, Gemini, etc.)
|
|
4
|
+
*/
|
|
5
|
+
export interface AgentState {
|
|
6
|
+
name: string;
|
|
7
|
+
lastActive: string;
|
|
8
|
+
currentTask: string;
|
|
9
|
+
completedTasks: string[];
|
|
10
|
+
decisions: string[];
|
|
11
|
+
context: string;
|
|
12
|
+
files: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare class AgentStateManager {
|
|
15
|
+
private dataDir;
|
|
16
|
+
constructor(dataDir?: string);
|
|
17
|
+
private getStatePath;
|
|
18
|
+
/**
|
|
19
|
+
* Load agent state from file
|
|
20
|
+
*/
|
|
21
|
+
load(agentName: string): AgentState | null;
|
|
22
|
+
/**
|
|
23
|
+
* Save agent state to file
|
|
24
|
+
*/
|
|
25
|
+
save(state: AgentState): void;
|
|
26
|
+
/**
|
|
27
|
+
* Update specific fields in state
|
|
28
|
+
*/
|
|
29
|
+
update(agentName: string, updates: Partial<AgentState>): AgentState;
|
|
30
|
+
/**
|
|
31
|
+
* Format state as context for agent prompt
|
|
32
|
+
*/
|
|
33
|
+
formatAsContext(agentName: string): string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* CLI helper to save state from agent output
|
|
37
|
+
* Agent outputs: [[STATE]]{"currentTask": "...", "context": "..."}[[/STATE]]
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseStateFromOutput(output: string): Partial<AgentState> | null;
|
|
40
|
+
//# sourceMappingURL=agent-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../../src/state/agent-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAgC;IAIrD,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAe1C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAW7B;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU;IAqBnE;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CA8C3C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAY/E"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent State Manager
|
|
3
|
+
* Persists agent context between spawns for non-hook CLIs (Codex, Gemini, etc.)
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
export class AgentStateManager {
|
|
8
|
+
dataDir;
|
|
9
|
+
constructor(dataDir = '/tmp/agent-relay-team') {
|
|
10
|
+
this.dataDir = dataDir;
|
|
11
|
+
}
|
|
12
|
+
getStatePath(agentName) {
|
|
13
|
+
return path.join(this.dataDir, agentName, 'state.json');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load agent state from file
|
|
17
|
+
*/
|
|
18
|
+
load(agentName) {
|
|
19
|
+
const statePath = this.getStatePath(agentName);
|
|
20
|
+
if (!fs.existsSync(statePath)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const content = fs.readFileSync(statePath, 'utf-8');
|
|
25
|
+
return JSON.parse(content);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Save agent state to file
|
|
33
|
+
*/
|
|
34
|
+
save(state) {
|
|
35
|
+
const statePath = this.getStatePath(state.name);
|
|
36
|
+
const dir = path.dirname(statePath);
|
|
37
|
+
if (!fs.existsSync(dir)) {
|
|
38
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
fs.writeFileSync(statePath, JSON.stringify(state, null, 2));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Update specific fields in state
|
|
44
|
+
*/
|
|
45
|
+
update(agentName, updates) {
|
|
46
|
+
const existing = this.load(agentName) || {
|
|
47
|
+
name: agentName,
|
|
48
|
+
lastActive: new Date().toISOString(),
|
|
49
|
+
currentTask: '',
|
|
50
|
+
completedTasks: [],
|
|
51
|
+
decisions: [],
|
|
52
|
+
context: '',
|
|
53
|
+
files: [],
|
|
54
|
+
};
|
|
55
|
+
const updated = {
|
|
56
|
+
...existing,
|
|
57
|
+
...updates,
|
|
58
|
+
lastActive: new Date().toISOString(),
|
|
59
|
+
};
|
|
60
|
+
this.save(updated);
|
|
61
|
+
return updated;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Format state as context for agent prompt
|
|
65
|
+
*/
|
|
66
|
+
formatAsContext(agentName) {
|
|
67
|
+
const state = this.load(agentName);
|
|
68
|
+
if (!state) {
|
|
69
|
+
return 'No previous session state found. Starting fresh.';
|
|
70
|
+
}
|
|
71
|
+
const lines = [
|
|
72
|
+
'=== PREVIOUS SESSION CONTEXT ===',
|
|
73
|
+
`Last active: ${state.lastActive}`,
|
|
74
|
+
'',
|
|
75
|
+
];
|
|
76
|
+
if (state.currentTask) {
|
|
77
|
+
lines.push(`Current task: ${state.currentTask}`);
|
|
78
|
+
}
|
|
79
|
+
if (state.completedTasks.length > 0) {
|
|
80
|
+
lines.push('');
|
|
81
|
+
lines.push('Completed tasks:');
|
|
82
|
+
state.completedTasks.forEach(t => lines.push(` - ${t}`));
|
|
83
|
+
}
|
|
84
|
+
if (state.decisions.length > 0) {
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push('Key decisions made:');
|
|
87
|
+
state.decisions.forEach(d => lines.push(` - ${d}`));
|
|
88
|
+
}
|
|
89
|
+
if (state.context) {
|
|
90
|
+
lines.push('');
|
|
91
|
+
lines.push('Context:');
|
|
92
|
+
lines.push(state.context);
|
|
93
|
+
}
|
|
94
|
+
if (state.files.length > 0) {
|
|
95
|
+
lines.push('');
|
|
96
|
+
lines.push('Files being worked on:');
|
|
97
|
+
state.files.forEach(f => lines.push(` - ${f}`));
|
|
98
|
+
}
|
|
99
|
+
lines.push('=== END CONTEXT ===');
|
|
100
|
+
lines.push('');
|
|
101
|
+
return lines.join('\n');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* CLI helper to save state from agent output
|
|
106
|
+
* Agent outputs: [[STATE]]{"currentTask": "...", "context": "..."}[[/STATE]]
|
|
107
|
+
*/
|
|
108
|
+
export function parseStateFromOutput(output) {
|
|
109
|
+
const match = output.match(/\[\[STATE\]\]([\s\S]*?)\[\[\/STATE\]\]/);
|
|
110
|
+
if (!match) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(match[1]);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=agent-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../../src/state/agent-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PayloadKind } from '../protocol/types.js';
|
|
2
|
+
export interface StoredMessage {
|
|
3
|
+
id: string;
|
|
4
|
+
ts: number;
|
|
5
|
+
from: string;
|
|
6
|
+
to: string;
|
|
7
|
+
topic?: string;
|
|
8
|
+
kind: PayloadKind;
|
|
9
|
+
body: string;
|
|
10
|
+
data?: Record<string, unknown>;
|
|
11
|
+
deliverySeq?: number;
|
|
12
|
+
deliverySessionId?: string;
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface MessageQuery {
|
|
16
|
+
limit?: number;
|
|
17
|
+
sinceTs?: number;
|
|
18
|
+
from?: string;
|
|
19
|
+
to?: string;
|
|
20
|
+
topic?: string;
|
|
21
|
+
order?: 'asc' | 'desc';
|
|
22
|
+
}
|
|
23
|
+
export interface StorageAdapter {
|
|
24
|
+
init(): Promise<void>;
|
|
25
|
+
saveMessage(message: StoredMessage): Promise<void>;
|
|
26
|
+
getMessages(query?: MessageQuery): Promise<StoredMessage[]>;
|
|
27
|
+
close?(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB"}
|