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.
Files changed (143) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +22 -0
  3. package/PROTOCOL.md +319 -0
  4. package/README.md +791 -0
  5. package/dist/cli/index.d.ts +7 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +1591 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/daemon/connection.d.ts +60 -0
  10. package/dist/daemon/connection.d.ts.map +1 -0
  11. package/dist/daemon/connection.js +245 -0
  12. package/dist/daemon/connection.js.map +1 -0
  13. package/dist/daemon/index.d.ts +4 -0
  14. package/dist/daemon/index.d.ts.map +1 -0
  15. package/dist/daemon/index.js +4 -0
  16. package/dist/daemon/index.js.map +1 -0
  17. package/dist/daemon/router.d.ts +72 -0
  18. package/dist/daemon/router.d.ts.map +1 -0
  19. package/dist/daemon/router.js +183 -0
  20. package/dist/daemon/router.js.map +1 -0
  21. package/dist/daemon/server.d.ts +52 -0
  22. package/dist/daemon/server.d.ts.map +1 -0
  23. package/dist/daemon/server.js +186 -0
  24. package/dist/daemon/server.js.map +1 -0
  25. package/dist/dashboard/public/index.html +690 -0
  26. package/dist/dashboard/server.d.ts +2 -0
  27. package/dist/dashboard/server.d.ts.map +1 -0
  28. package/dist/dashboard/server.js +220 -0
  29. package/dist/dashboard/server.js.map +1 -0
  30. package/dist/games/index.d.ts +2 -0
  31. package/dist/games/index.d.ts.map +1 -0
  32. package/dist/games/index.js +2 -0
  33. package/dist/games/index.js.map +1 -0
  34. package/dist/games/tictactoe.d.ts +24 -0
  35. package/dist/games/tictactoe.d.ts.map +1 -0
  36. package/dist/games/tictactoe.js +160 -0
  37. package/dist/games/tictactoe.js.map +1 -0
  38. package/dist/hooks/inbox-check/hook.d.ts +28 -0
  39. package/dist/hooks/inbox-check/hook.d.ts.map +1 -0
  40. package/dist/hooks/inbox-check/hook.js +97 -0
  41. package/dist/hooks/inbox-check/hook.js.map +1 -0
  42. package/dist/hooks/inbox-check/index.d.ts +8 -0
  43. package/dist/hooks/inbox-check/index.d.ts.map +1 -0
  44. package/dist/hooks/inbox-check/index.js +8 -0
  45. package/dist/hooks/inbox-check/index.js.map +1 -0
  46. package/dist/hooks/inbox-check/types.d.ts +31 -0
  47. package/dist/hooks/inbox-check/types.d.ts.map +1 -0
  48. package/dist/hooks/inbox-check/types.js +5 -0
  49. package/dist/hooks/inbox-check/types.js.map +1 -0
  50. package/dist/hooks/inbox-check/utils.d.ts +44 -0
  51. package/dist/hooks/inbox-check/utils.d.ts.map +1 -0
  52. package/dist/hooks/inbox-check/utils.js +107 -0
  53. package/dist/hooks/inbox-check/utils.js.map +1 -0
  54. package/dist/index.d.ts +10 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +10 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/protocol/framing.d.ts +32 -0
  59. package/dist/protocol/framing.d.ts.map +1 -0
  60. package/dist/protocol/framing.js +71 -0
  61. package/dist/protocol/framing.js.map +1 -0
  62. package/dist/protocol/index.d.ts +3 -0
  63. package/dist/protocol/index.d.ts.map +1 -0
  64. package/dist/protocol/index.js +3 -0
  65. package/dist/protocol/index.js.map +1 -0
  66. package/dist/protocol/types.d.ts +104 -0
  67. package/dist/protocol/types.d.ts.map +1 -0
  68. package/dist/protocol/types.js +6 -0
  69. package/dist/protocol/types.js.map +1 -0
  70. package/dist/state/agent-state.d.ts +40 -0
  71. package/dist/state/agent-state.d.ts.map +1 -0
  72. package/dist/state/agent-state.js +120 -0
  73. package/dist/state/agent-state.js.map +1 -0
  74. package/dist/storage/adapter.d.ts +29 -0
  75. package/dist/storage/adapter.d.ts.map +1 -0
  76. package/dist/storage/adapter.js +2 -0
  77. package/dist/storage/adapter.js.map +1 -0
  78. package/dist/storage/sqlite-adapter.d.ts +15 -0
  79. package/dist/storage/sqlite-adapter.d.ts.map +1 -0
  80. package/dist/storage/sqlite-adapter.js +116 -0
  81. package/dist/storage/sqlite-adapter.js.map +1 -0
  82. package/dist/supervisor/inbox.d.ts +38 -0
  83. package/dist/supervisor/inbox.d.ts.map +1 -0
  84. package/dist/supervisor/inbox.js +162 -0
  85. package/dist/supervisor/inbox.js.map +1 -0
  86. package/dist/supervisor/index.d.ts +10 -0
  87. package/dist/supervisor/index.d.ts.map +1 -0
  88. package/dist/supervisor/index.js +10 -0
  89. package/dist/supervisor/index.js.map +1 -0
  90. package/dist/supervisor/spawner.d.ts +54 -0
  91. package/dist/supervisor/spawner.d.ts.map +1 -0
  92. package/dist/supervisor/spawner.js +282 -0
  93. package/dist/supervisor/spawner.js.map +1 -0
  94. package/dist/supervisor/state.d.ts +132 -0
  95. package/dist/supervisor/state.d.ts.map +1 -0
  96. package/dist/supervisor/state.js +465 -0
  97. package/dist/supervisor/state.js.map +1 -0
  98. package/dist/supervisor/supervisor.d.ts +67 -0
  99. package/dist/supervisor/supervisor.d.ts.map +1 -0
  100. package/dist/supervisor/supervisor.js +263 -0
  101. package/dist/supervisor/supervisor.js.map +1 -0
  102. package/dist/supervisor/types.d.ts +139 -0
  103. package/dist/supervisor/types.d.ts.map +1 -0
  104. package/dist/supervisor/types.js +12 -0
  105. package/dist/supervisor/types.js.map +1 -0
  106. package/dist/utils/index.d.ts +2 -0
  107. package/dist/utils/index.d.ts.map +1 -0
  108. package/dist/utils/index.js +2 -0
  109. package/dist/utils/index.js.map +1 -0
  110. package/dist/utils/name-generator.d.ts +17 -0
  111. package/dist/utils/name-generator.d.ts.map +1 -0
  112. package/dist/utils/name-generator.js +52 -0
  113. package/dist/utils/name-generator.js.map +1 -0
  114. package/dist/webhook/spawner.d.ts +79 -0
  115. package/dist/webhook/spawner.d.ts.map +1 -0
  116. package/dist/webhook/spawner.js +288 -0
  117. package/dist/webhook/spawner.js.map +1 -0
  118. package/dist/wrapper/client.d.ts +72 -0
  119. package/dist/wrapper/client.d.ts.map +1 -0
  120. package/dist/wrapper/client.js +306 -0
  121. package/dist/wrapper/client.js.map +1 -0
  122. package/dist/wrapper/inbox.d.ts +37 -0
  123. package/dist/wrapper/inbox.d.ts.map +1 -0
  124. package/dist/wrapper/inbox.js +73 -0
  125. package/dist/wrapper/inbox.js.map +1 -0
  126. package/dist/wrapper/index.d.ts +4 -0
  127. package/dist/wrapper/index.d.ts.map +1 -0
  128. package/dist/wrapper/index.js +7 -0
  129. package/dist/wrapper/index.js.map +1 -0
  130. package/dist/wrapper/parser.d.ts +94 -0
  131. package/dist/wrapper/parser.d.ts.map +1 -0
  132. package/dist/wrapper/parser.js +360 -0
  133. package/dist/wrapper/parser.js.map +1 -0
  134. package/dist/wrapper/pty-wrapper.d.ts +125 -0
  135. package/dist/wrapper/pty-wrapper.d.ts.map +1 -0
  136. package/dist/wrapper/pty-wrapper.js +494 -0
  137. package/dist/wrapper/pty-wrapper.js.map +1 -0
  138. package/dist/wrapper/tmux-wrapper.d.ts +131 -0
  139. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -0
  140. package/dist/wrapper/tmux-wrapper.js +427 -0
  141. package/dist/wrapper/tmux-wrapper.js.map +1 -0
  142. package/install.sh +69 -0
  143. 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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"}
@@ -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,3 @@
1
+ export * from './types.js';
2
+ export * from './framing.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from './types.js';
2
+ export * from './framing.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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,6 @@
1
+ /**
2
+ * Agent Relay Protocol Types
3
+ * Version 1.0
4
+ */
5
+ export const PROTOCOL_VERSION = 1;
6
+ //# sourceMappingURL=types.js.map
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map