@tpsdev-ai/cli 0.1.0 → 0.3.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 (198) hide show
  1. package/README.md +46 -60
  2. package/bin/tps.cjs +22 -0
  3. package/bin/tps.ts +435 -0
  4. package/nono-profiles/tps-backup.toml +18 -0
  5. package/nono-profiles/tps-bootstrap.toml +20 -0
  6. package/nono-profiles/tps-office-manager.toml +21 -0
  7. package/nono-profiles/tps-restore.toml +18 -0
  8. package/nono-profiles/tps-status.toml +19 -0
  9. package/package.json +19 -15
  10. package/LICENSE +0 -201
  11. package/dist/bin/tps.d.ts +0 -3
  12. package/dist/bin/tps.d.ts.map +0 -1
  13. package/dist/bin/tps.js +0 -267
  14. package/dist/bin/tps.js.map +0 -1
  15. package/dist/src/cli/hire.d.ts +0 -16
  16. package/dist/src/cli/hire.d.ts.map +0 -1
  17. package/dist/src/cli/hire.js +0 -176
  18. package/dist/src/cli/hire.js.map +0 -1
  19. package/dist/src/cli/office.d.ts +0 -7
  20. package/dist/src/cli/office.d.ts.map +0 -1
  21. package/dist/src/cli/office.js +0 -51
  22. package/dist/src/cli/office.js.map +0 -1
  23. package/dist/src/cli/review.d.ts +0 -9
  24. package/dist/src/cli/review.d.ts.map +0 -1
  25. package/dist/src/cli/review.js +0 -109
  26. package/dist/src/cli/review.js.map +0 -1
  27. package/dist/src/cli/roster.d.ts +0 -6
  28. package/dist/src/cli/roster.d.ts.map +0 -1
  29. package/dist/src/cli/roster.js +0 -60
  30. package/dist/src/cli/roster.js.map +0 -1
  31. package/dist/src/commands/branch.d.ts +0 -14
  32. package/dist/src/commands/branch.d.ts.map +0 -1
  33. package/dist/src/commands/branch.js +0 -395
  34. package/dist/src/commands/branch.js.map +0 -1
  35. package/dist/src/commands/context.d.ts +0 -9
  36. package/dist/src/commands/context.d.ts.map +0 -1
  37. package/dist/src/commands/context.js +0 -57
  38. package/dist/src/commands/context.js.map +0 -1
  39. package/dist/src/commands/identity.d.ts +0 -13
  40. package/dist/src/commands/identity.d.ts.map +0 -1
  41. package/dist/src/commands/identity.js +0 -231
  42. package/dist/src/commands/identity.js.map +0 -1
  43. package/dist/src/commands/mail.d.ts +0 -12
  44. package/dist/src/commands/mail.d.ts.map +0 -1
  45. package/dist/src/commands/mail.js +0 -225
  46. package/dist/src/commands/mail.js.map +0 -1
  47. package/dist/src/commands/office.d.ts +0 -19
  48. package/dist/src/commands/office.d.ts.map +0 -1
  49. package/dist/src/commands/office.js +0 -598
  50. package/dist/src/commands/office.js.map +0 -1
  51. package/dist/src/commands/roster.d.ts +0 -10
  52. package/dist/src/commands/roster.d.ts.map +0 -1
  53. package/dist/src/commands/roster.js +0 -143
  54. package/dist/src/commands/roster.js.map +0 -1
  55. package/dist/src/generators/claude-code.d.ts +0 -17
  56. package/dist/src/generators/claude-code.d.ts.map +0 -1
  57. package/dist/src/generators/claude-code.js +0 -80
  58. package/dist/src/generators/claude-code.js.map +0 -1
  59. package/dist/src/generators/codex.d.ts +0 -22
  60. package/dist/src/generators/codex.d.ts.map +0 -1
  61. package/dist/src/generators/codex.js +0 -78
  62. package/dist/src/generators/codex.js.map +0 -1
  63. package/dist/src/generators/ollama.d.ts +0 -18
  64. package/dist/src/generators/ollama.d.ts.map +0 -1
  65. package/dist/src/generators/ollama.js +0 -97
  66. package/dist/src/generators/ollama.js.map +0 -1
  67. package/dist/src/generators/openclaw.d.ts +0 -15
  68. package/dist/src/generators/openclaw.d.ts.map +0 -1
  69. package/dist/src/generators/openclaw.js +0 -103
  70. package/dist/src/generators/openclaw.js.map +0 -1
  71. package/dist/src/generators/registry.d.ts +0 -36
  72. package/dist/src/generators/registry.d.ts.map +0 -1
  73. package/dist/src/generators/registry.js +0 -99
  74. package/dist/src/generators/registry.js.map +0 -1
  75. package/dist/src/schema/manifest.d.ts +0 -140
  76. package/dist/src/schema/manifest.d.ts.map +0 -1
  77. package/dist/src/schema/manifest.js +0 -62
  78. package/dist/src/schema/manifest.js.map +0 -1
  79. package/dist/src/schema/report.d.ts +0 -166
  80. package/dist/src/schema/report.d.ts.map +0 -1
  81. package/dist/src/schema/report.js +0 -90
  82. package/dist/src/schema/report.js.map +0 -1
  83. package/dist/src/schema/sanitizer.d.ts +0 -30
  84. package/dist/src/schema/sanitizer.d.ts.map +0 -1
  85. package/dist/src/schema/sanitizer.js +0 -97
  86. package/dist/src/schema/sanitizer.js.map +0 -1
  87. package/dist/src/soundstage/mock-llm.d.ts +0 -3
  88. package/dist/src/soundstage/mock-llm.d.ts.map +0 -1
  89. package/dist/src/soundstage/mock-llm.js +0 -68
  90. package/dist/src/soundstage/mock-llm.js.map +0 -1
  91. package/dist/src/utils/agent-info.d.ts +0 -28
  92. package/dist/src/utils/agent-info.d.ts.map +0 -1
  93. package/dist/src/utils/agent-info.js +0 -102
  94. package/dist/src/utils/agent-info.js.map +0 -1
  95. package/dist/src/utils/archive.d.ts +0 -27
  96. package/dist/src/utils/archive.d.ts.map +0 -1
  97. package/dist/src/utils/archive.js +0 -80
  98. package/dist/src/utils/archive.js.map +0 -1
  99. package/dist/src/utils/config-inject.d.ts +0 -27
  100. package/dist/src/utils/config-inject.d.ts.map +0 -1
  101. package/dist/src/utils/config-inject.js +0 -83
  102. package/dist/src/utils/config-inject.js.map +0 -1
  103. package/dist/src/utils/config.d.ts +0 -30
  104. package/dist/src/utils/config.d.ts.map +0 -1
  105. package/dist/src/utils/config.js +0 -55
  106. package/dist/src/utils/config.js.map +0 -1
  107. package/dist/src/utils/connection-state.d.ts +0 -27
  108. package/dist/src/utils/connection-state.d.ts.map +0 -1
  109. package/dist/src/utils/connection-state.js +0 -81
  110. package/dist/src/utils/connection-state.js.map +0 -1
  111. package/dist/src/utils/context.d.ts +0 -14
  112. package/dist/src/utils/context.d.ts.map +0 -1
  113. package/dist/src/utils/context.js +0 -68
  114. package/dist/src/utils/context.js.map +0 -1
  115. package/dist/src/utils/github-webhook.d.ts +0 -3
  116. package/dist/src/utils/github-webhook.d.ts.map +0 -1
  117. package/dist/src/utils/github-webhook.js +0 -105
  118. package/dist/src/utils/github-webhook.js.map +0 -1
  119. package/dist/src/utils/identity.d.ts +0 -114
  120. package/dist/src/utils/identity.d.ts.map +0 -1
  121. package/dist/src/utils/identity.js +0 -341
  122. package/dist/src/utils/identity.js.map +0 -1
  123. package/dist/src/utils/internal-mail.d.ts +0 -18
  124. package/dist/src/utils/internal-mail.d.ts.map +0 -1
  125. package/dist/src/utils/internal-mail.js +0 -75
  126. package/dist/src/utils/internal-mail.js.map +0 -1
  127. package/dist/src/utils/loop-detector.d.ts +0 -27
  128. package/dist/src/utils/loop-detector.d.ts.map +0 -1
  129. package/dist/src/utils/loop-detector.js +0 -42
  130. package/dist/src/utils/loop-detector.js.map +0 -1
  131. package/dist/src/utils/mail-handler.d.ts +0 -19
  132. package/dist/src/utils/mail-handler.d.ts.map +0 -1
  133. package/dist/src/utils/mail-handler.js +0 -94
  134. package/dist/src/utils/mail-handler.js.map +0 -1
  135. package/dist/src/utils/mail.d.ts +0 -22
  136. package/dist/src/utils/mail.d.ts.map +0 -1
  137. package/dist/src/utils/mail.js +0 -111
  138. package/dist/src/utils/mail.js.map +0 -1
  139. package/dist/src/utils/manifest.d.ts +0 -36
  140. package/dist/src/utils/manifest.d.ts.map +0 -1
  141. package/dist/src/utils/manifest.js +0 -91
  142. package/dist/src/utils/manifest.js.map +0 -1
  143. package/dist/src/utils/noise-ik-transport.d.ts +0 -18
  144. package/dist/src/utils/noise-ik-transport.d.ts.map +0 -1
  145. package/dist/src/utils/noise-ik-transport.js +0 -357
  146. package/dist/src/utils/noise-ik-transport.js.map +0 -1
  147. package/dist/src/utils/nono.d.ts +0 -72
  148. package/dist/src/utils/nono.d.ts.map +0 -1
  149. package/dist/src/utils/nono.js +0 -166
  150. package/dist/src/utils/nono.js.map +0 -1
  151. package/dist/src/utils/outbox.d.ts +0 -10
  152. package/dist/src/utils/outbox.d.ts.map +0 -1
  153. package/dist/src/utils/outbox.js +0 -29
  154. package/dist/src/utils/outbox.js.map +0 -1
  155. package/dist/src/utils/output.d.ts +0 -17
  156. package/dist/src/utils/output.d.ts.map +0 -1
  157. package/dist/src/utils/output.js +0 -83
  158. package/dist/src/utils/output.js.map +0 -1
  159. package/dist/src/utils/plain-tcp-transport.d.ts +0 -10
  160. package/dist/src/utils/plain-tcp-transport.d.ts.map +0 -1
  161. package/dist/src/utils/plain-tcp-transport.js +0 -209
  162. package/dist/src/utils/plain-tcp-transport.js.map +0 -1
  163. package/dist/src/utils/provision.d.ts +0 -2
  164. package/dist/src/utils/provision.d.ts.map +0 -1
  165. package/dist/src/utils/provision.js +0 -186
  166. package/dist/src/utils/provision.js.map +0 -1
  167. package/dist/src/utils/relay.d.ts +0 -30
  168. package/dist/src/utils/relay.d.ts.map +0 -1
  169. package/dist/src/utils/relay.js +0 -539
  170. package/dist/src/utils/relay.js.map +0 -1
  171. package/dist/src/utils/sandbox.d.ts +0 -37
  172. package/dist/src/utils/sandbox.d.ts.map +0 -1
  173. package/dist/src/utils/sandbox.js +0 -126
  174. package/dist/src/utils/sandbox.js.map +0 -1
  175. package/dist/src/utils/transport.d.ts +0 -62
  176. package/dist/src/utils/transport.d.ts.map +0 -1
  177. package/dist/src/utils/transport.js +0 -75
  178. package/dist/src/utils/transport.js.map +0 -1
  179. package/dist/src/utils/wall.d.ts +0 -5
  180. package/dist/src/utils/wall.d.ts.map +0 -1
  181. package/dist/src/utils/wall.js +0 -51
  182. package/dist/src/utils/wall.js.map +0 -1
  183. package/dist/src/utils/wire-delivery.d.ts +0 -10
  184. package/dist/src/utils/wire-delivery.d.ts.map +0 -1
  185. package/dist/src/utils/wire-delivery.js +0 -57
  186. package/dist/src/utils/wire-delivery.js.map +0 -1
  187. package/dist/src/utils/wire-frame.d.ts +0 -10
  188. package/dist/src/utils/wire-frame.d.ts.map +0 -1
  189. package/dist/src/utils/wire-frame.js +0 -66
  190. package/dist/src/utils/wire-frame.js.map +0 -1
  191. package/dist/src/utils/wire-mail.d.ts +0 -54
  192. package/dist/src/utils/wire-mail.d.ts.map +0 -1
  193. package/dist/src/utils/wire-mail.js +0 -24
  194. package/dist/src/utils/wire-mail.js.map +0 -1
  195. package/dist/src/utils/ws-noise-transport.d.ts +0 -18
  196. package/dist/src/utils/ws-noise-transport.d.ts.map +0 -1
  197. package/dist/src/utils/ws-noise-transport.js +0 -356
  198. package/dist/src/utils/ws-noise-transport.js.map +0 -1
@@ -1,539 +0,0 @@
1
- import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { homedir } from "node:os";
4
- import { randomUUID } from "node:crypto";
5
- import { sanitizeIdentifier } from "../schema/sanitizer.js";
6
- import { countInboxMessages, MAX_INBOX_MESSAGES, sendMessage } from "./mail.js";
7
- import { LoopDetector } from "./loop-detector.js";
8
- import { FileSystemTransport, resolveTransport, TransportRegistry } from "./transport.js";
9
- import { NoiseIkTransport } from "./noise-ik-transport.js";
10
- import { WsNoiseTransport } from "./ws-noise-transport.js";
11
- import { WireDeliveryTransport } from "./wire-delivery.js";
12
- import { loadHostIdentity, lookupBranch } from "./identity.js";
13
- import { MSG_MAIL_DELIVER, MSG_MAIL_ACK, MSG_HEARTBEAT, MailDeliverBodySchema } from "./wire-mail.js";
14
- import { clearHostState, writeHostState } from "./connection-state.js";
15
- function resolveDeliveryPath(agentId) {
16
- const branchDir = join(process.env.HOME || homedir(), ".tps", "branch-office");
17
- if (!existsSync(branchDir))
18
- return join(branchDir, agentId, "mail");
19
- // Case 1: agentId is a team (has team.json in its root)
20
- const teamPath = join(branchDir, agentId);
21
- const teamSidecar = join(teamPath, "team.json");
22
- if (existsSync(teamSidecar)) {
23
- try {
24
- const sidecar = JSON.parse(readFileSync(teamSidecar, "utf-8"));
25
- if (sidecar.workspaceMail)
26
- return sidecar.workspaceMail;
27
- }
28
- catch { }
29
- return join(teamPath, "workspace", "mail");
30
- }
31
- // Case 2: agentId is a member of a team
32
- try {
33
- const teams = readdirSync(branchDir).filter(d => {
34
- return existsSync(join(branchDir, d, "team.json"));
35
- });
36
- for (const team of teams) {
37
- const sidecarPath = join(branchDir, team, "team.json");
38
- const sidecar = JSON.parse(readFileSync(sidecarPath, "utf-8"));
39
- if (Array.isArray(sidecar.members) && sidecar.members.includes(agentId)) {
40
- return sidecar.workspaceMail || join(branchDir, team, "workspace", "mail");
41
- }
42
- }
43
- }
44
- catch {
45
- // Fallback to per-agent path on any read error
46
- }
47
- // Case 3: Legacy per-agent path
48
- return join(branchDir, agentId, "mail");
49
- }
50
- function branchRoot(agentId) {
51
- return resolveDeliveryPath(agentId);
52
- }
53
- function assertAgent(agentId) {
54
- const safe = sanitizeIdentifier(agentId);
55
- if (!agentId || safe !== agentId) {
56
- throw new Error(`Invalid agent id: ${agentId}`);
57
- }
58
- }
59
- function ensureDir(path) {
60
- mkdirSync(path, { recursive: true });
61
- }
62
- function atomicWriteJson(targetPath, data) {
63
- const tmp = `${targetPath}.tmp-${process.pid}-${Date.now()}`;
64
- writeFileSync(tmp, JSON.stringify(data, null, 2), "utf-8");
65
- renameSync(tmp, targetPath);
66
- }
67
- const detectors = new Map();
68
- const transportRegistry = new TransportRegistry(new FileSystemTransport());
69
- function getDetector(agentId) {
70
- if (!detectors.has(agentId)) {
71
- detectors.set(agentId, new LoopDetector());
72
- }
73
- return detectors.get(agentId);
74
- }
75
- function timestampPrefix() {
76
- return new Date().toISOString().replace(/[:.]/g, "-");
77
- }
78
- export async function processOutboxOnce(agentId) {
79
- assertAgent(agentId);
80
- const root = branchRoot(agentId);
81
- const outNew = join(root, "outbox", "new");
82
- const outCur = join(root, "outbox", "cur");
83
- const outFailed = join(root, "outbox", "failed");
84
- ensureDir(outNew);
85
- ensureDir(outCur);
86
- ensureDir(outFailed);
87
- const files = readdirSync(outNew).filter((f) => f.endsWith(".json"));
88
- let processed = 0;
89
- let failed = 0;
90
- for (const f of files) {
91
- const src = join(outNew, f);
92
- const failedPath = join(outFailed, f);
93
- try {
94
- const raw = readFileSync(src, "utf-8");
95
- const msg = JSON.parse(raw);
96
- // Loop detection — check before delivery
97
- const detector = getDetector(agentId);
98
- if (detector.check(String(msg.body ?? ""))) {
99
- // Move to paused directory instead of delivering
100
- const outPaused = join(root, "outbox", "paused");
101
- ensureDir(outPaused);
102
- renameSync(src, join(outPaused, f));
103
- // Write warning to WALL.md if it exists
104
- const wallPath = join(root, "..", "WALL.md");
105
- if (existsSync(join(root, ".."))) {
106
- const warning = `\n[${new Date().toISOString()}] ⚠️ LOOP DETECTED: Agent ${agentId} sent duplicate message ${detector.duplicateCount(String(msg.body ?? ""))} times in 5 minutes. Message paused. Review paused/ directory.\n`;
107
- try {
108
- appendFileSync(wallPath, warning, "utf-8");
109
- }
110
- catch { }
111
- }
112
- failed += 1;
113
- continue;
114
- }
115
- const recipient = msg.to;
116
- const safeRecipient = sanitizeIdentifier(recipient || "");
117
- if (!recipient || safeRecipient !== recipient) {
118
- throw new Error(`Invalid recipient id: ${recipient}`);
119
- }
120
- if (Buffer.byteLength(String(msg.body ?? ""), "utf8") > 64 * 1024) {
121
- throw new Error("Message body exceeds maximum size (64KB)");
122
- }
123
- if (countInboxMessages(recipient) >= MAX_INBOX_MESSAGES) {
124
- throw new Error("Inbox full");
125
- }
126
- const transport = resolveTransport(recipient, transportRegistry);
127
- const result = await transport.deliver({
128
- from: `container:${agentId}`,
129
- to: recipient,
130
- body: Buffer.from(String(msg.body ?? ""), "utf-8"),
131
- headers: {
132
- "x-tps-id": msg.id || randomUUID(),
133
- "x-tps-timestamp": msg.timestamp || new Date().toISOString(),
134
- "x-tps-origin": "docker-sandbox",
135
- },
136
- });
137
- if (!result.delivered) {
138
- throw new Error(result.error || `Delivery failed via ${result.transport}`);
139
- }
140
- renameSync(src, join(outCur, f));
141
- processed += 1;
142
- }
143
- catch (e) {
144
- try {
145
- const raw = existsSync(src) ? readFileSync(src, "utf-8") : "{}";
146
- const parsed = JSON.parse(raw || "{}");
147
- parsed.error = e?.message || "Relay failed";
148
- atomicWriteJson(failedPath, parsed);
149
- if (existsSync(src)) {
150
- try {
151
- renameSync(src, join(outFailed, `${Date.now()}-${f}`));
152
- }
153
- catch { }
154
- }
155
- }
156
- catch {
157
- // fallback: best effort move raw file
158
- if (existsSync(src)) {
159
- try {
160
- renameSync(src, failedPath);
161
- }
162
- catch { }
163
- }
164
- }
165
- failed += 1;
166
- }
167
- }
168
- return { processed, failed };
169
- }
170
- export async function connectRemoteBranches(registry, onMail) {
171
- const branchDir = join(process.env.HOME || homedir(), ".tps", "branch-office");
172
- if (!existsSync(branchDir))
173
- return { connected: [], cleanup: async () => { } };
174
- const channels = new Map();
175
- const connected = [];
176
- const entries = readdirSync(branchDir);
177
- const remoteEntries = entries
178
- .map((name) => ({ name, path: join(branchDir, name, "remote.json") }))
179
- .filter((e) => existsSync(e.path))
180
- .filter((e) => {
181
- try {
182
- const remote = JSON.parse(readFileSync(e.path, "utf-8"));
183
- return remote.transport === "ws" || remote.transport === "tcp";
184
- }
185
- catch {
186
- return false;
187
- }
188
- });
189
- if (remoteEntries.length === 0) {
190
- return { connected: [], cleanup: async () => { } };
191
- }
192
- const hostKp = loadHostIdentity();
193
- for (const name of entries) {
194
- const remotePath = join(branchDir, name, "remote.json");
195
- if (!existsSync(remotePath))
196
- continue;
197
- try {
198
- const remote = JSON.parse(readFileSync(remotePath, "utf-8"));
199
- if (remote.transport !== "ws" && remote.transport !== "tcp")
200
- continue;
201
- // Validate host/port from remote.json (S6-A)
202
- const remoteHost = String(remote.host || "");
203
- const remotePort = Number(remote.port);
204
- if (!remoteHost || /[^a-zA-Z0-9._\-:]/.test(remoteHost)) {
205
- console.error(`Remote branch '${name}': invalid host in remote.json`);
206
- continue;
207
- }
208
- if (!Number.isFinite(remotePort) || remotePort <= 0 || remotePort > 65535) {
209
- console.error(`Remote branch '${name}': invalid port in remote.json`);
210
- continue;
211
- }
212
- const branch = lookupBranch(name);
213
- if (!branch || !branch.encryptionKey) {
214
- console.error(`Remote branch '${name}': not registered or missing encryption key`);
215
- continue;
216
- }
217
- const transport = remote.transport === "ws" ? new WsNoiseTransport(hostKp) : new NoiseIkTransport(hostKp);
218
- const channel = await transport.connect({
219
- host: remoteHost,
220
- port: remotePort,
221
- branchId: name,
222
- hostPublicKey: branch.encryptionKey,
223
- });
224
- const wireTransport = new WireDeliveryTransport(channel);
225
- registry.register(name, wireTransport);
226
- channels.set(name, channel);
227
- connected.push(name);
228
- channel.onMessage((msg) => {
229
- if (msg.type === MSG_MAIL_DELIVER) {
230
- onMail?.(name, msg);
231
- }
232
- });
233
- console.log(`Connected to remote branch '${name}' at ${remote.host}:${remote.port}`);
234
- }
235
- catch (e) {
236
- console.error(`Failed to connect to remote branch '${name}': ${e.message}`);
237
- }
238
- }
239
- const cleanup = async () => {
240
- for (const [id, ch] of channels) {
241
- try {
242
- registry.unregister(id);
243
- await ch.close();
244
- }
245
- catch { }
246
- }
247
- channels.clear();
248
- };
249
- return { connected, cleanup };
250
- }
251
- export function handleIncomingMail(branchId, msg) {
252
- const parsed = MailDeliverBodySchema.safeParse(msg.body);
253
- if (!parsed.success) {
254
- console.error(`Invalid MAIL_DELIVER from ${branchId}`);
255
- return;
256
- }
257
- const { to, content, id, from, timestamp } = parsed.data;
258
- const safe = sanitizeIdentifier(to);
259
- if (safe !== to) {
260
- console.error(`Invalid recipient in mail from ${branchId}: ${to}`);
261
- return;
262
- }
263
- deliverToSandbox(to, {
264
- id: id || randomUUID(),
265
- from: from || branchId,
266
- to,
267
- body: content,
268
- timestamp: timestamp || new Date().toISOString(),
269
- origin: `remote:${branchId}`,
270
- });
271
- }
272
- export function startRelay(agentId) {
273
- assertAgent(agentId);
274
- let remoteCleanup = null;
275
- connectRemoteBranches(transportRegistry, (branchId, msg) => {
276
- handleIncomingMail(branchId, msg);
277
- })
278
- .then(({ connected, cleanup }) => {
279
- remoteCleanup = cleanup;
280
- if (connected.length > 0) {
281
- console.log(`Connected to ${connected.length} remote branch(es): ${connected.join(", ")}`);
282
- }
283
- })
284
- .catch((e) => {
285
- console.error(`Remote branch connection error: ${e.message}`);
286
- });
287
- const intervalMs = Number(process.env.TPS_RELAY_POLL_MS || 1000);
288
- const timer = setInterval(() => {
289
- processOutboxOnce(agentId).catch(() => {
290
- // keep relay alive
291
- });
292
- }, intervalMs);
293
- const stop = () => {
294
- clearInterval(timer);
295
- remoteCleanup?.().catch(() => { });
296
- };
297
- return stop;
298
- }
299
- export async function deliverToRemoteBranch(branchId, message) {
300
- const branchDir = join(process.env.HOME || homedir(), ".tps", "branch-office", branchId);
301
- const remotePath = join(branchDir, "remote.json");
302
- if (!existsSync(remotePath)) {
303
- throw new Error(`No remote.json for branch: ${branchId}`);
304
- }
305
- const remote = JSON.parse(readFileSync(remotePath, "utf-8"));
306
- const host = String(remote.host || "");
307
- const port = Number(remote.port);
308
- const transportType = remote.transport === "tcp" ? "tcp" : "ws";
309
- const branch = lookupBranch(branchId);
310
- if (!branch || !branch.encryptionKey) {
311
- throw new Error(`Remote branch '${branchId}': not registered or missing encryption key`);
312
- }
313
- const hostKp = loadHostIdentity();
314
- const transport = transportType === "ws" ? new WsNoiseTransport(hostKp) : new NoiseIkTransport(hostKp);
315
- const channel = await transport.connect({
316
- host,
317
- port,
318
- branchId,
319
- hostPublicKey: branch.encryptionKey,
320
- });
321
- try {
322
- const msgId = message.id || randomUUID();
323
- const payload = {
324
- id: msgId,
325
- from: message.from || "host",
326
- to: message.to,
327
- content: message.body,
328
- timestamp: message.timestamp || new Date().toISOString(),
329
- };
330
- const acked = new Promise((resolve, reject) => {
331
- const timeout = setTimeout(() => {
332
- channel.offMessage(handler);
333
- reject(new Error("Delivery timeout (5s)"));
334
- }, 5000);
335
- const handler = (msg) => {
336
- if (msg.type === MSG_MAIL_ACK && msg.body?.id === msgId) {
337
- clearTimeout(timeout);
338
- channel.offMessage(handler);
339
- resolve();
340
- }
341
- };
342
- channel.onMessage(handler);
343
- });
344
- await channel.send({
345
- type: MSG_MAIL_DELIVER,
346
- seq: 0,
347
- ts: payload.timestamp,
348
- body: payload,
349
- });
350
- await acked;
351
- await new Promise((resolve) => {
352
- const timer = setTimeout(() => {
353
- channel.offMessage(handler);
354
- resolve();
355
- }, 2000);
356
- const handler = (msg) => {
357
- if (msg.type !== MSG_MAIL_DELIVER)
358
- return;
359
- const parsed = MailDeliverBodySchema.safeParse(msg.body);
360
- if (!parsed.success)
361
- return;
362
- const b = parsed.data;
363
- try {
364
- sendMessage(b.to, b.content, b.from);
365
- }
366
- catch { }
367
- };
368
- channel.onMessage(handler);
369
- });
370
- }
371
- finally {
372
- await channel.close();
373
- }
374
- }
375
- export async function syncRemoteBranch(branchId) {
376
- const branchDir = join(process.env.HOME || homedir(), ".tps", "branch-office", branchId);
377
- const remotePath = join(branchDir, "remote.json");
378
- if (!existsSync(remotePath)) {
379
- throw new Error(`No remote.json for branch: ${branchId}`);
380
- }
381
- const remote = JSON.parse(readFileSync(remotePath, "utf-8"));
382
- const host = String(remote.host || "");
383
- const port = Number(remote.port);
384
- const transportType = remote.transport === "tcp" ? "tcp" : "ws";
385
- const branch = lookupBranch(branchId);
386
- if (!branch || !branch.encryptionKey) {
387
- throw new Error(`Remote branch '${branchId}': not registered or missing encryption key`);
388
- }
389
- const hostKp = loadHostIdentity();
390
- const transport = transportType === "ws" ? new WsNoiseTransport(hostKp) : new NoiseIkTransport(hostKp);
391
- const channel = await transport.connect({ host, port, branchId, hostPublicKey: branch.encryptionKey });
392
- let received = 0;
393
- try {
394
- await channel.send({ type: MSG_HEARTBEAT, seq: 0, ts: new Date().toISOString(), body: {} });
395
- await new Promise((resolve) => {
396
- const timer = setTimeout(() => {
397
- channel.offMessage(handler);
398
- resolve();
399
- }, 3000);
400
- const handler = (msg) => {
401
- if (msg.type !== MSG_MAIL_DELIVER)
402
- return;
403
- const parsed = MailDeliverBodySchema.safeParse(msg.body);
404
- if (!parsed.success)
405
- return;
406
- const b = parsed.data;
407
- try {
408
- sendMessage(b.to, b.content, b.from);
409
- received++;
410
- }
411
- catch { }
412
- };
413
- channel.onMessage(handler);
414
- });
415
- }
416
- finally {
417
- await channel.close().catch(() => { });
418
- }
419
- return { received };
420
- }
421
- const HEARTBEAT_INTERVAL_MS = 30_000;
422
- const RECONNECT_BASE_MS = 2_000;
423
- const RECONNECT_MAX_MS = 60_000;
424
- export async function connectAndKeepAlive(branchId, opts = {}) {
425
- let stopped = false;
426
- let reconnectCount = 0;
427
- let currentChannel = null;
428
- const remotePath = join(process.env.HOME || homedir(), ".tps", "branch-office", branchId, "remote.json");
429
- if (!existsSync(remotePath))
430
- throw new Error(`No remote.json for branch: ${branchId}`);
431
- const remote = JSON.parse(readFileSync(remotePath, "utf-8"));
432
- const branch = lookupBranch(branchId);
433
- if (!branch?.encryptionKey)
434
- throw new Error(`Branch '${branchId}' missing encryption key`);
435
- const hostKp = loadHostIdentity();
436
- const loop = async () => {
437
- let backoff = RECONNECT_BASE_MS;
438
- while (!stopped) {
439
- try {
440
- const transport = remote.transport === "tcp" ? new NoiseIkTransport(hostKp) : new WsNoiseTransport(hostKp);
441
- const channel = await transport.connect({
442
- host: String(remote.host),
443
- port: Number(remote.port),
444
- branchId,
445
- hostPublicKey: branch.encryptionKey,
446
- });
447
- currentChannel = channel;
448
- const now = new Date().toISOString();
449
- const state = {
450
- branch: branchId,
451
- connectedAt: now,
452
- lastHeartbeatSent: now,
453
- lastHeartbeatAck: null,
454
- reconnectCount,
455
- bytesSent: 0,
456
- bytesReceived: 0,
457
- messagesSent: 0,
458
- messagesReceived: 0,
459
- pid: process.pid,
460
- };
461
- writeHostState(state);
462
- await channel.send({ type: MSG_HEARTBEAT, seq: 0, ts: now, body: {} });
463
- state.messagesSent++;
464
- writeHostState(state);
465
- const hb = setInterval(async () => {
466
- if (stopped || !channel.isAlive())
467
- return;
468
- try {
469
- await channel.send({ type: MSG_HEARTBEAT, seq: 0, ts: new Date().toISOString(), body: {} });
470
- state.lastHeartbeatSent = new Date().toISOString();
471
- state.messagesSent++;
472
- writeHostState(state);
473
- }
474
- catch { }
475
- }, HEARTBEAT_INTERVAL_MS);
476
- const handler = (msg) => {
477
- state.messagesReceived++;
478
- state.lastHeartbeatAck = new Date().toISOString();
479
- writeHostState(state);
480
- if (msg.type === MSG_MAIL_DELIVER) {
481
- const parsed = MailDeliverBodySchema.safeParse(msg.body);
482
- if (parsed.success) {
483
- const b = parsed.data;
484
- try {
485
- sendMessage(b.to, b.content, b.from);
486
- }
487
- catch { }
488
- }
489
- }
490
- opts.onMessage?.(msg);
491
- };
492
- channel.onMessage(handler);
493
- while (!stopped && channel.isAlive()) {
494
- await new Promise((r) => setTimeout(r, 1000));
495
- }
496
- clearInterval(hb);
497
- channel.offMessage(handler);
498
- try {
499
- await channel.close();
500
- }
501
- catch { }
502
- currentChannel = null;
503
- }
504
- catch { }
505
- reconnectCount++;
506
- const st = (RECONNECT_BASE_MS * Math.pow(2, Math.min(reconnectCount, 6)));
507
- const wait = Math.min(st, RECONNECT_MAX_MS);
508
- if (!stopped)
509
- await new Promise((r) => setTimeout(r, wait));
510
- }
511
- };
512
- void loop();
513
- return async () => {
514
- stopped = true;
515
- try {
516
- await currentChannel?.close();
517
- }
518
- catch { }
519
- clearHostState(branchId);
520
- };
521
- }
522
- export function deliverToSandbox(agentId, message) {
523
- assertAgent(agentId);
524
- const root = branchRoot(agentId);
525
- const inboxNew = join(root, "inbox", "new");
526
- ensureDir(inboxNew);
527
- const payload = {
528
- id: message.id || randomUUID(),
529
- from: message.from || "host",
530
- to: message.to,
531
- body: message.body,
532
- timestamp: message.timestamp || new Date().toISOString(),
533
- read: false,
534
- origin: message.origin || "host",
535
- };
536
- const filename = `${timestampPrefix()}-${randomUUID()}.json`;
537
- atomicWriteJson(join(inboxNew, filename), payload);
538
- }
539
- //# sourceMappingURL=relay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../src/utils/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAA0C,MAAM,gBAAgB,CAAC;AAClI,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,cAAc,EAAE,cAAc,EAA4B,MAAM,uBAAuB,CAAC;AAajG,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEpE,wDAAwD;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,aAAa;gBAAE,OAAO,OAAO,CAAC,aAAa,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxE,OAAO,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IAED,gCAAgC;IAChC,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB,EAAE,IAAa;IACxD,MAAM,GAAG,GAAG,GAAG,UAAU,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7D,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;AAClD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;AAE3E,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;AACjC,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjD,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,SAAS,CAAC,SAAS,CAAC,CAAC;IAErB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;YAE5C,yCAAyC;YACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3C,iDAAiD;gBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACjD,SAAS,CAAC,SAAS,CAAC,CAAC;gBACrB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;gBAEpC,wCAAwC;gBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC7C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,6BAA6B,OAAO,2BAA2B,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,kEAAkE,CAAC;oBAC/N,IAAI,CAAC;wBACH,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC7C,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;gBAED,MAAM,IAAI,CAAC,CAAC;gBACZ,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YAED,IAAI,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACrC,IAAI,EAAE,aAAa,OAAO,EAAE;gBAC5B,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;gBAClD,OAAO,EAAE;oBACP,UAAU,EAAE,GAAG,CAAC,EAAE,IAAI,UAAU,EAAE;oBAClC,iBAAiB,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBAC5D,cAAc,EAAE,gBAAgB;iBACjC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,uBAAuB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7E,CAAC;YAED,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACjC,SAAS,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAA4B,CAAC;gBAClE,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,IAAI,cAAc,CAAC;gBAC5C,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACpC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC;wBAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBAC1E,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;gBACtC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC;wBAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBAC/C,CAAC;YACH,CAAC;YACD,MAAM,IAAI,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAA2B,EAC3B,MAAoD;IAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CAAC;IAE9E,MAAM,QAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,OAAO;SAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,OAAO,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IACL,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAEtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK;gBAAE,SAAS;YAEtE,6CAA6C;YAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxD,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,gCAAgC,CAAC,CAAC;gBACtE,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;gBAC1E,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,gCAAgC,CAAC,CAAC;gBACtE,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,6CAA6C,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1G,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACtC,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACzD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACvC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErB,OAAO,CAAC,SAAS,CAAC,CAAC,GAAe,EAAE,EAAE;gBACpC,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBAClC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,QAAQ,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,uCAAuC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,GAAe;IAClE,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,KAAK,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,gBAAgB,CAAC,EAAE,EAAE;QACnB,EAAE,EAAE,EAAE,IAAI,UAAU,EAAE;QACtB,IAAI,EAAE,IAAI,IAAI,QAAQ;QACtB,EAAE;QACF,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAChD,MAAM,EAAE,UAAU,QAAQ,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,IAAI,aAAa,GAAiC,IAAI,CAAC;IACvD,qBAAqB,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QACzD,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC;SACC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/B,aAAa,GAAG,OAAO,CAAC;QACxB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,MAAM,uBAAuB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;QAChB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEL,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACpC,mBAAmB;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,aAAa,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,OAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAEhE,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,6CAA6C,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEvG,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;QACtC,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;YAC5B,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzD,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAC7C,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,MAAM,OAAO,GAAG,CAAC,GAAe,EAAE,EAAE;gBAClC,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAK,GAAG,CAAC,IAAY,EAAE,EAAE,KAAK,KAAK,EAAE,CAAC;oBACjE,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC;YACF,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,CAAC;YACN,EAAE,EAAE,OAAO,CAAC,SAAS;YACrB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC;QAEZ,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,MAAM,OAAO,GAAG,CAAC,GAAe,EAAE,EAAE;gBAClC,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB;oBAAE,OAAO;gBAC1C,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAE5B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;gBACtB,IAAI,CAAC;oBACH,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC,CAAC;YAEF,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAEhE,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,6CAA6C,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvG,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAEvG,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5F,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,MAAM,OAAO,GAAG,CAAC,GAAe,EAAE,EAAE;gBAClC,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB;oBAAE,OAAO;gBAC1C,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;gBACtB,IAAI,CAAC;oBACH,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBACrC,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC,CAAC;YAEF,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,OAAkD,EAAE;IAEpD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAA4B,IAAI,CAAC;IAEnD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACzG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,0BAA0B,CAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,OAAO,GAAG,iBAAiB,CAAC;QAChC,OAAO,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC3G,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;oBACtC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACzB,QAAQ;oBACR,aAAa,EAAE,MAAM,CAAC,aAAc;iBACrC,CAAC,CAAC;gBACH,cAAc,GAAG,OAAO,CAAC;gBAEzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAwB;oBACjC,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,GAAG;oBAChB,iBAAiB,EAAE,GAAG;oBACtB,gBAAgB,EAAE,IAAI;oBACtB,cAAc;oBACd,SAAS,EAAE,CAAC;oBACZ,aAAa,EAAE,CAAC;oBAChB,YAAY,EAAE,CAAC;oBACf,gBAAgB,EAAE,CAAC;oBACnB,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB,CAAC;gBACF,cAAc,CAAC,KAAK,CAAC,CAAC;gBAEtB,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvE,KAAK,CAAC,YAAY,EAAE,CAAC;gBACrB,cAAc,CAAC,KAAK,CAAC,CAAC;gBAEtB,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;oBAChC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;wBAAE,OAAO;oBAC1C,IAAI,CAAC;wBACH,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC5F,KAAK,CAAC,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;wBACnD,KAAK,CAAC,YAAY,EAAE,CAAC;wBACrB,cAAc,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC,EAAE,qBAAqB,CAAC,CAAC;gBAE1B,MAAM,OAAO,GAAG,CAAC,GAAe,EAAE,EAAE;oBAClC,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBACzB,KAAK,CAAC,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAClD,cAAc,CAAC,KAAK,CAAC,CAAC;oBACtB,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;wBAClC,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBACzD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;4BACnB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;4BACtB,IAAI,CAAC;gCAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;4BAAC,CAAC;4BAAC,MAAM,CAAC,CAAA,CAAC;wBACxD,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC,CAAC;gBACF,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE3B,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBACrC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAChD,CAAC;gBACD,aAAa,CAAC,EAAE,CAAC,CAAC;gBAClB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC5B,IAAI,CAAC;oBAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBACvC,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,IAAI,EAAE,CAAC;IAEZ,OAAO,KAAK,IAAI,EAAE;QAChB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC;YAAC,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAC/C,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAqB;IACrE,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpB,MAAM,OAAO,GAAG;QACd,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,UAAU,EAAE;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;QAC5B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACxD,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;KACjC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,eAAe,EAAE,IAAI,UAAU,EAAE,OAAO,CAAC;IAC7D,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC"}
@@ -1,37 +0,0 @@
1
- import { type SpawnSyncReturns } from "node:child_process";
2
- export interface SandboxInfo {
3
- name: string;
4
- agent: string;
5
- status: string;
6
- socketPath: string;
7
- }
8
- /**
9
- * Get the Docker daemon socket path for a sandbox VM.
10
- */
11
- export declare function sandboxSocketPath(name: string): string;
12
- /**
13
- * Check if a sandbox VM's Docker daemon is accessible.
14
- */
15
- export declare function isSandboxReady(name: string): boolean;
16
- /**
17
- * List sandboxes via `docker sandbox ls --json`.
18
- */
19
- export declare function listSandboxes(): SandboxInfo[];
20
- /**
21
- * Execute a command inside a sandbox VM's Docker daemon.
22
- * Runs a container with the workspace mounted.
23
- */
24
- export declare function sandboxExec(sandboxName: string, command: string[], options?: {
25
- workspace?: string;
26
- image?: string;
27
- }): SpawnSyncReturns<string>;
28
- /**
29
- * Load an image into a sandbox VM by piping from host.
30
- * Uses `docker save | docker -H unix://<sock> load`.
31
- */
32
- export declare function loadImageIntoSandbox(sandboxName: string, imageName: string): boolean;
33
- /**
34
- * Wait for a sandbox VM to become ready (socket accessible).
35
- */
36
- export declare function waitForSandbox(name: string, timeoutMs?: number): boolean;
37
- //# sourceMappingURL=sandbox.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/utils/sandbox.ts"],"names":[],"mappings":"AAaA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASpD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,WAAW,EAAE,CAoB7C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,gBAAgB,CAAC,MAAM,CAAC,CAiB1B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CA4BpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAiBvE"}