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 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { type MessageQuery, type StorageAdapter, type StoredMessage } from './adapter.js';
2
+ export interface SqliteAdapterOptions {
3
+ dbPath: string;
4
+ }
5
+ export declare class SqliteStorageAdapter implements StorageAdapter {
6
+ private dbPath;
7
+ private db?;
8
+ private insertStmt?;
9
+ constructor(options: SqliteAdapterOptions);
10
+ init(): Promise<void>;
11
+ saveMessage(message: StoredMessage): Promise<void>;
12
+ getMessages(query?: MessageQuery): Promise<StoredMessage[]>;
13
+ close(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=sqlite-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1F,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAC,CAAoB;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAqB;gBAE5B,OAAO,EAAE,oBAAoB;IAInC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCrB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBlD,WAAW,CAAC,KAAK,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAqD/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -0,0 +1,116 @@
1
+ import Database from 'better-sqlite3';
2
+ import path from 'node:path';
3
+ import fs from 'node:fs';
4
+ export class SqliteStorageAdapter {
5
+ dbPath;
6
+ db;
7
+ insertStmt;
8
+ constructor(options) {
9
+ this.dbPath = options.dbPath;
10
+ }
11
+ async init() {
12
+ const dir = path.dirname(this.dbPath);
13
+ if (!fs.existsSync(dir)) {
14
+ fs.mkdirSync(dir, { recursive: true });
15
+ }
16
+ this.db = new Database(this.dbPath);
17
+ this.db.pragma('journal_mode = WAL');
18
+ this.db.exec(`
19
+ CREATE TABLE IF NOT EXISTS messages (
20
+ id TEXT PRIMARY KEY,
21
+ ts INTEGER NOT NULL,
22
+ sender TEXT NOT NULL,
23
+ recipient TEXT NOT NULL,
24
+ topic TEXT,
25
+ kind TEXT NOT NULL,
26
+ body TEXT NOT NULL,
27
+ data TEXT,
28
+ delivery_seq INTEGER,
29
+ delivery_session_id TEXT,
30
+ session_id TEXT
31
+ );
32
+ CREATE INDEX IF NOT EXISTS idx_messages_ts ON messages (ts);
33
+ CREATE INDEX IF NOT EXISTS idx_messages_sender ON messages (sender);
34
+ CREATE INDEX IF NOT EXISTS idx_messages_recipient ON messages (recipient);
35
+ CREATE INDEX IF NOT EXISTS idx_messages_topic ON messages (topic);
36
+ `);
37
+ this.insertStmt = this.db.prepare(`
38
+ INSERT OR REPLACE INTO messages
39
+ (id, ts, sender, recipient, topic, kind, body, data, delivery_seq, delivery_session_id, session_id)
40
+ VALUES (@id, @ts, @sender, @recipient, @topic, @kind, @body, @data, @delivery_seq, @delivery_session_id, @session_id)
41
+ `);
42
+ }
43
+ async saveMessage(message) {
44
+ if (!this.db || !this.insertStmt) {
45
+ throw new Error('SqliteStorageAdapter not initialized');
46
+ }
47
+ const payload = {
48
+ id: message.id,
49
+ ts: message.ts,
50
+ sender: message.from,
51
+ recipient: message.to,
52
+ topic: message.topic ?? null,
53
+ kind: message.kind,
54
+ body: message.body,
55
+ data: message.data ? JSON.stringify(message.data) : null,
56
+ delivery_seq: message.deliverySeq ?? null,
57
+ delivery_session_id: message.deliverySessionId ?? null,
58
+ session_id: message.sessionId ?? null,
59
+ };
60
+ this.insertStmt.run(payload);
61
+ }
62
+ async getMessages(query = {}) {
63
+ if (!this.db) {
64
+ throw new Error('SqliteStorageAdapter not initialized');
65
+ }
66
+ const clauses = [];
67
+ const params = {};
68
+ if (query.sinceTs) {
69
+ clauses.push('ts >= @sinceTs');
70
+ params.sinceTs = query.sinceTs;
71
+ }
72
+ if (query.from) {
73
+ clauses.push('sender = @from');
74
+ params.from = query.from;
75
+ }
76
+ if (query.to) {
77
+ clauses.push('recipient = @to');
78
+ params.to = query.to;
79
+ }
80
+ if (query.topic) {
81
+ clauses.push('topic = @topic');
82
+ params.topic = query.topic;
83
+ }
84
+ const where = clauses.length ? `WHERE ${clauses.join(' AND ')}` : '';
85
+ const order = query.order === 'asc' ? 'ASC' : 'DESC';
86
+ const limit = query.limit ?? 200;
87
+ const stmt = this.db.prepare(`
88
+ SELECT id, ts, sender, recipient, topic, kind, body, data, delivery_seq, delivery_session_id, session_id
89
+ FROM messages
90
+ ${where}
91
+ ORDER BY ts ${order}
92
+ LIMIT @limit
93
+ `);
94
+ const rows = stmt.all({ ...params, limit });
95
+ return rows.map((row) => ({
96
+ id: row.id,
97
+ ts: row.ts,
98
+ from: row.sender,
99
+ to: row.recipient,
100
+ topic: row.topic ?? undefined,
101
+ kind: row.kind,
102
+ body: row.body,
103
+ data: row.data ? JSON.parse(row.data) : undefined,
104
+ deliverySeq: row.delivery_seq ?? undefined,
105
+ deliverySessionId: row.delivery_session_id ?? undefined,
106
+ sessionId: row.session_id ?? undefined,
107
+ }));
108
+ }
109
+ async close() {
110
+ if (this.db) {
111
+ this.db.close();
112
+ this.db = undefined;
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=sqlite-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/storage/sqlite-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAOzB,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAS;IACf,EAAE,CAAqB;IACvB,UAAU,CAAsB;IAExC,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAErC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;KAkBZ,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIjC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAsB;QACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YACxD,YAAY,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACzC,mBAAmB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;YACtD,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;SACtC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAsB,EAAE;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QACjC,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAChC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;QAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;QAGzB,KAAK;oBACO,KAAK;;KAEpB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC7B,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,MAAM;YAChB,EAAE,EAAE,GAAG,CAAC,SAAS;YACjB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;YAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACjD,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;YAC1C,iBAAiB,EAAE,GAAG,CAAC,mBAAmB,IAAI,SAAS;YACvD,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;SACvC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Supervisor Inbox Utilities
3
+ *
4
+ * Provides an atomic "claim" for an agent inbox file to avoid losing messages
5
+ * that arrive while the supervisor is processing.
6
+ */
7
+ export interface InboxMessage {
8
+ from: string;
9
+ timestamp: string;
10
+ body: string;
11
+ }
12
+ export interface ClaimedInbox {
13
+ inboxPath: string;
14
+ processingPath: string;
15
+ content: string;
16
+ }
17
+ /**
18
+ * Parse inbox markdown into structured messages.
19
+ *
20
+ * Expected format (repeated blocks):
21
+ * ## Message from <sender> | <timestamp>
22
+ * <body>
23
+ */
24
+ export declare function parseInboxMarkdown(content: string): InboxMessage[];
25
+ /**
26
+ * Atomically claim an inbox by renaming it to a processing file.
27
+ * New incoming messages will be written to a new inbox.md.
28
+ */
29
+ export declare function claimInbox(inboxPath: string): ClaimedInbox | null;
30
+ /**
31
+ * Finalize a claimed inbox.
32
+ *
33
+ * - On success: delete processing file.
34
+ * - On failure: re-queue the claimed content back into inbox.md without
35
+ * overwriting any messages that arrived while processing.
36
+ */
37
+ export declare function finalizeClaim(claim: ClaimedInbox, success: boolean): void;
38
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/supervisor/inbox.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAeD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CA4DlE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAyBjE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA6CzE"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Supervisor Inbox Utilities
3
+ *
4
+ * Provides an atomic "claim" for an agent inbox file to avoid losing messages
5
+ * that arrive while the supervisor is processing.
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ // Supported inbox formats:
10
+ // 1) New canonical:
11
+ // ## Message from <sender> | <iso>
12
+ // <body>
13
+ //
14
+ // 2) Legacy (from early inbox-write):
15
+ // ## Message from <sender>
16
+ // **Time:** <iso>
17
+ // <body>
18
+ const MESSAGE_HEADER_V1 = /^## Message from (.+?) \| (.+?)$/gm;
19
+ const MESSAGE_HEADER_LEGACY = /^## Message from (.+?)$/gm;
20
+ const LEGACY_TIME_LINE = /^\*\*Time:\*\*\s*(.+?)\s*$/m;
21
+ /**
22
+ * Parse inbox markdown into structured messages.
23
+ *
24
+ * Expected format (repeated blocks):
25
+ * ## Message from <sender> | <timestamp>
26
+ * <body>
27
+ */
28
+ export function parseInboxMarkdown(content) {
29
+ const matches = [];
30
+ let m;
31
+ // eslint-disable-next-line no-cond-assign
32
+ while ((m = MESSAGE_HEADER_V1.exec(content)) !== null) {
33
+ matches.push({
34
+ index: m.index,
35
+ from: (m[1] ?? '').trim(),
36
+ timestamp: (m[2] ?? '').trim(),
37
+ headerLen: m[0].length,
38
+ isLegacy: false,
39
+ });
40
+ }
41
+ // If no canonical headers, try legacy headers.
42
+ if (matches.length === 0) {
43
+ // eslint-disable-next-line no-cond-assign
44
+ while ((m = MESSAGE_HEADER_LEGACY.exec(content)) !== null) {
45
+ matches.push({
46
+ index: m.index,
47
+ from: (m[1] ?? '').trim(),
48
+ timestamp: '',
49
+ headerLen: m[0].length,
50
+ isLegacy: true,
51
+ });
52
+ }
53
+ }
54
+ if (matches.length === 0)
55
+ return [];
56
+ const messages = [];
57
+ for (let i = 0; i < matches.length; i++) {
58
+ const cur = matches[i];
59
+ const next = matches[i + 1];
60
+ const bodyStart = cur.index + cur.headerLen;
61
+ const bodyEnd = next ? next.index : content.length;
62
+ let bodyChunk = content.substring(bodyStart, bodyEnd).replace(/^\s*\n/, '');
63
+ let timestamp = cur.timestamp;
64
+ if (cur.isLegacy) {
65
+ const t = bodyChunk.match(LEGACY_TIME_LINE);
66
+ if (t?.[1]) {
67
+ timestamp = t[1].trim();
68
+ // Remove the time line from the body
69
+ bodyChunk = bodyChunk.replace(LEGACY_TIME_LINE, '').replace(/^\s*\n/, '');
70
+ }
71
+ }
72
+ const body = bodyChunk.trim();
73
+ if (!cur.from)
74
+ continue;
75
+ if (!timestamp)
76
+ timestamp = new Date().toISOString();
77
+ if (!body)
78
+ continue;
79
+ messages.push({ from: cur.from, timestamp, body });
80
+ }
81
+ return messages;
82
+ }
83
+ /**
84
+ * Atomically claim an inbox by renaming it to a processing file.
85
+ * New incoming messages will be written to a new inbox.md.
86
+ */
87
+ export function claimInbox(inboxPath) {
88
+ if (!fs.existsSync(inboxPath))
89
+ return null;
90
+ const dir = path.dirname(inboxPath);
91
+ const processingPath = path.join(dir, 'inbox.processing.md');
92
+ try {
93
+ fs.renameSync(inboxPath, processingPath);
94
+ }
95
+ catch (err) {
96
+ const code = err.code;
97
+ // If someone else claimed it or it disappeared, treat as no work.
98
+ if (code === 'ENOENT' || code === 'EACCES' || code === 'EBUSY') {
99
+ return null;
100
+ }
101
+ throw err;
102
+ }
103
+ let content = '';
104
+ try {
105
+ content = fs.readFileSync(processingPath, 'utf-8');
106
+ }
107
+ catch {
108
+ content = '';
109
+ }
110
+ return { inboxPath, processingPath, content };
111
+ }
112
+ /**
113
+ * Finalize a claimed inbox.
114
+ *
115
+ * - On success: delete processing file.
116
+ * - On failure: re-queue the claimed content back into inbox.md without
117
+ * overwriting any messages that arrived while processing.
118
+ */
119
+ export function finalizeClaim(claim, success) {
120
+ if (success) {
121
+ try {
122
+ if (fs.existsSync(claim.processingPath)) {
123
+ fs.unlinkSync(claim.processingPath);
124
+ }
125
+ }
126
+ catch {
127
+ // Best-effort cleanup
128
+ }
129
+ return;
130
+ }
131
+ // Failure path: merge back into inbox.
132
+ try {
133
+ const claimedContent = fs.existsSync(claim.processingPath)
134
+ ? fs.readFileSync(claim.processingPath, 'utf-8')
135
+ : claim.content;
136
+ if (!claimedContent.trim()) {
137
+ // Nothing to restore
138
+ if (fs.existsSync(claim.processingPath))
139
+ fs.unlinkSync(claim.processingPath);
140
+ return;
141
+ }
142
+ if (!fs.existsSync(claim.inboxPath)) {
143
+ fs.renameSync(claim.processingPath, claim.inboxPath);
144
+ return;
145
+ }
146
+ // Inbox exists (new messages arrived). Prepend claimed content so older messages come first.
147
+ const currentInbox = fs.readFileSync(claim.inboxPath, 'utf-8');
148
+ const merged = `${claimedContent.trimEnd()}\n\n${currentInbox.trimStart()}`;
149
+ const tmpPath = `${claim.inboxPath}.tmp`;
150
+ fs.writeFileSync(tmpPath, merged, 'utf-8');
151
+ fs.renameSync(tmpPath, claim.inboxPath);
152
+ if (fs.existsSync(claim.processingPath)) {
153
+ fs.unlinkSync(claim.processingPath);
154
+ }
155
+ }
156
+ catch (err) {
157
+ // Last-resort: don't crash the supervisor on finalize
158
+ // eslint-disable-next-line no-console
159
+ console.error('[supervisor] Failed to finalize inbox claim:', err);
160
+ }
161
+ }
162
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/supervisor/inbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent Relay Supervisor
3
+ *
4
+ * Exports for the spawn-per-message supervisor system.
5
+ */
6
+ export * from './types.js';
7
+ export * from './state.js';
8
+ export * from './spawner.js';
9
+ export * from './supervisor.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supervisor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent Relay Supervisor
3
+ *
4
+ * Exports for the spawn-per-message supervisor system.
5
+ */
6
+ export * from './types.js';
7
+ export * from './state.js';
8
+ export * from './spawner.js';
9
+ export * from './supervisor.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supervisor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * CLI Spawner
3
+ *
4
+ * Handles spawning fresh CLI instances for different agent types.
5
+ * Supports Claude Code, Codex, Cursor, and custom commands.
6
+ */
7
+ import type { CLIType, SpawnResult, ParsedRelayCommand, SupervisorConfig } from './types.js';
8
+ /** Parsed structured markers from output */
9
+ export interface ParsedDecision {
10
+ what: string;
11
+ why: string;
12
+ }
13
+ export interface ParsedTodo {
14
+ task: string;
15
+ priority: 'high' | 'normal' | 'low';
16
+ owner?: string;
17
+ }
18
+ export interface ParsedDone {
19
+ taskMatch: string;
20
+ }
21
+ export interface ParsedStateMarkers {
22
+ decisions: ParsedDecision[];
23
+ todos: ParsedTodo[];
24
+ dones: ParsedDone[];
25
+ summary?: string;
26
+ }
27
+ /**
28
+ * Parse structured state markers from CLI output
29
+ */
30
+ export declare function parseStateMarkers(output: string): ParsedStateMarkers;
31
+ /**
32
+ * Parse relay commands from CLI output
33
+ */
34
+ export declare function parseRelayCommands(output: string): ParsedRelayCommand[];
35
+ /**
36
+ * CLI Spawner class
37
+ */
38
+ export declare class CLISpawner {
39
+ private config;
40
+ constructor(config: SupervisorConfig);
41
+ /**
42
+ * Spawn a CLI with the given prompt
43
+ */
44
+ spawn(cli: CLIType, prompt: string, cwd: string, customCommand?: string): Promise<SpawnResult>;
45
+ /**
46
+ * Parse a custom command string into cmd, args, promptFlag
47
+ */
48
+ private parseCustomCommand;
49
+ /**
50
+ * Check if a CLI is available
51
+ */
52
+ isAvailable(cli: CLIType, customCommand?: string): Promise<boolean>;
53
+ }
54
+ //# sourceMappingURL=spawner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../src/supervisor/spawner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA0C7F,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA6DpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,CA8BvE;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,EAAE,gBAAgB;IAIpC;;OAEG;IACG,KAAK,CACT,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC;IAmHvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAa1E"}