@tpsdev-ai/cli 0.2.0 → 0.3.1

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 (228) hide show
  1. package/README.md +65 -0
  2. package/bin/tps.cjs +24 -0
  3. package/bin/tps.ts +435 -0
  4. package/package.json +29 -5
  5. package/dist/bin/tps.d.ts +0 -3
  6. package/dist/bin/tps.d.ts.map +0 -1
  7. package/dist/bin/tps.js +0 -414
  8. package/dist/bin/tps.js.map +0 -1
  9. package/dist/src/cli/hire.d.ts +0 -16
  10. package/dist/src/cli/hire.d.ts.map +0 -1
  11. package/dist/src/cli/hire.js +0 -176
  12. package/dist/src/cli/hire.js.map +0 -1
  13. package/dist/src/cli/office.d.ts +0 -7
  14. package/dist/src/cli/office.d.ts.map +0 -1
  15. package/dist/src/cli/office.js +0 -51
  16. package/dist/src/cli/office.js.map +0 -1
  17. package/dist/src/cli/review.d.ts +0 -9
  18. package/dist/src/cli/review.d.ts.map +0 -1
  19. package/dist/src/cli/review.js +0 -109
  20. package/dist/src/cli/review.js.map +0 -1
  21. package/dist/src/cli/roster.d.ts +0 -6
  22. package/dist/src/cli/roster.d.ts.map +0 -1
  23. package/dist/src/cli/roster.js +0 -60
  24. package/dist/src/cli/roster.js.map +0 -1
  25. package/dist/src/commands/backup.d.ts +0 -19
  26. package/dist/src/commands/backup.d.ts.map +0 -1
  27. package/dist/src/commands/backup.js +0 -595
  28. package/dist/src/commands/backup.js.map +0 -1
  29. package/dist/src/commands/bootstrap.d.ts +0 -7
  30. package/dist/src/commands/bootstrap.d.ts.map +0 -1
  31. package/dist/src/commands/bootstrap.js +0 -255
  32. package/dist/src/commands/bootstrap.js.map +0 -1
  33. package/dist/src/commands/branch.d.ts +0 -14
  34. package/dist/src/commands/branch.d.ts.map +0 -1
  35. package/dist/src/commands/branch.js +0 -395
  36. package/dist/src/commands/branch.js.map +0 -1
  37. package/dist/src/commands/context.d.ts +0 -9
  38. package/dist/src/commands/context.d.ts.map +0 -1
  39. package/dist/src/commands/context.js +0 -57
  40. package/dist/src/commands/context.js.map +0 -1
  41. package/dist/src/commands/git.d.ts +0 -8
  42. package/dist/src/commands/git.d.ts.map +0 -1
  43. package/dist/src/commands/git.js +0 -53
  44. package/dist/src/commands/git.js.map +0 -1
  45. package/dist/src/commands/identity.d.ts +0 -13
  46. package/dist/src/commands/identity.d.ts.map +0 -1
  47. package/dist/src/commands/identity.js +0 -231
  48. package/dist/src/commands/identity.js.map +0 -1
  49. package/dist/src/commands/mail.d.ts +0 -12
  50. package/dist/src/commands/mail.d.ts.map +0 -1
  51. package/dist/src/commands/mail.js +0 -251
  52. package/dist/src/commands/mail.js.map +0 -1
  53. package/dist/src/commands/office-manager.d.ts +0 -147
  54. package/dist/src/commands/office-manager.d.ts.map +0 -1
  55. package/dist/src/commands/office-manager.js +0 -171
  56. package/dist/src/commands/office-manager.js.map +0 -1
  57. package/dist/src/commands/office.d.ts +0 -12
  58. package/dist/src/commands/office.d.ts.map +0 -1
  59. package/dist/src/commands/office.js +0 -480
  60. package/dist/src/commands/office.js.map +0 -1
  61. package/dist/src/commands/roster.d.ts +0 -10
  62. package/dist/src/commands/roster.d.ts.map +0 -1
  63. package/dist/src/commands/roster.js +0 -143
  64. package/dist/src/commands/roster.js.map +0 -1
  65. package/dist/src/commands/secrets.d.ts +0 -9
  66. package/dist/src/commands/secrets.d.ts.map +0 -1
  67. package/dist/src/commands/secrets.js +0 -54
  68. package/dist/src/commands/secrets.js.map +0 -1
  69. package/dist/src/commands/status.d.ts +0 -33
  70. package/dist/src/commands/status.d.ts.map +0 -1
  71. package/dist/src/commands/status.js +0 -407
  72. package/dist/src/commands/status.js.map +0 -1
  73. package/dist/src/generators/brief.d.ts +0 -6
  74. package/dist/src/generators/brief.d.ts.map +0 -1
  75. package/dist/src/generators/brief.js +0 -33
  76. package/dist/src/generators/brief.js.map +0 -1
  77. package/dist/src/generators/claude-code.d.ts +0 -18
  78. package/dist/src/generators/claude-code.d.ts.map +0 -1
  79. package/dist/src/generators/claude-code.js +0 -85
  80. package/dist/src/generators/claude-code.js.map +0 -1
  81. package/dist/src/generators/codex.d.ts +0 -23
  82. package/dist/src/generators/codex.d.ts.map +0 -1
  83. package/dist/src/generators/codex.js +0 -83
  84. package/dist/src/generators/codex.js.map +0 -1
  85. package/dist/src/generators/ollama.d.ts +0 -18
  86. package/dist/src/generators/ollama.d.ts.map +0 -1
  87. package/dist/src/generators/ollama.js +0 -97
  88. package/dist/src/generators/ollama.js.map +0 -1
  89. package/dist/src/generators/openclaw.d.ts +0 -15
  90. package/dist/src/generators/openclaw.d.ts.map +0 -1
  91. package/dist/src/generators/openclaw.js +0 -107
  92. package/dist/src/generators/openclaw.js.map +0 -1
  93. package/dist/src/generators/registry.d.ts +0 -36
  94. package/dist/src/generators/registry.d.ts.map +0 -1
  95. package/dist/src/generators/registry.js +0 -99
  96. package/dist/src/generators/registry.js.map +0 -1
  97. package/dist/src/schema/manifest.d.ts +0 -287
  98. package/dist/src/schema/manifest.d.ts.map +0 -1
  99. package/dist/src/schema/manifest.js +0 -65
  100. package/dist/src/schema/manifest.js.map +0 -1
  101. package/dist/src/schema/report.d.ts +0 -166
  102. package/dist/src/schema/report.d.ts.map +0 -1
  103. package/dist/src/schema/report.js +0 -90
  104. package/dist/src/schema/report.js.map +0 -1
  105. package/dist/src/schema/sanitizer.d.ts +0 -30
  106. package/dist/src/schema/sanitizer.d.ts.map +0 -1
  107. package/dist/src/schema/sanitizer.js +0 -99
  108. package/dist/src/schema/sanitizer.js.map +0 -1
  109. package/dist/src/soundstage/mock-llm.d.ts +0 -3
  110. package/dist/src/soundstage/mock-llm.d.ts.map +0 -1
  111. package/dist/src/soundstage/mock-llm.js +0 -68
  112. package/dist/src/soundstage/mock-llm.js.map +0 -1
  113. package/dist/src/utils/agent-info.d.ts +0 -28
  114. package/dist/src/utils/agent-info.d.ts.map +0 -1
  115. package/dist/src/utils/agent-info.js +0 -102
  116. package/dist/src/utils/agent-info.js.map +0 -1
  117. package/dist/src/utils/archive.d.ts +0 -20
  118. package/dist/src/utils/archive.d.ts.map +0 -1
  119. package/dist/src/utils/archive.js +0 -108
  120. package/dist/src/utils/archive.js.map +0 -1
  121. package/dist/src/utils/config-inject.d.ts +0 -27
  122. package/dist/src/utils/config-inject.d.ts.map +0 -1
  123. package/dist/src/utils/config-inject.js +0 -83
  124. package/dist/src/utils/config-inject.js.map +0 -1
  125. package/dist/src/utils/config.d.ts +0 -30
  126. package/dist/src/utils/config.d.ts.map +0 -1
  127. package/dist/src/utils/config.js +0 -55
  128. package/dist/src/utils/config.js.map +0 -1
  129. package/dist/src/utils/connection-state.d.ts +0 -27
  130. package/dist/src/utils/connection-state.d.ts.map +0 -1
  131. package/dist/src/utils/connection-state.js +0 -81
  132. package/dist/src/utils/connection-state.js.map +0 -1
  133. package/dist/src/utils/context.d.ts +0 -14
  134. package/dist/src/utils/context.d.ts.map +0 -1
  135. package/dist/src/utils/context.js +0 -68
  136. package/dist/src/utils/context.js.map +0 -1
  137. package/dist/src/utils/github-webhook.d.ts +0 -3
  138. package/dist/src/utils/github-webhook.d.ts.map +0 -1
  139. package/dist/src/utils/github-webhook.js +0 -105
  140. package/dist/src/utils/github-webhook.js.map +0 -1
  141. package/dist/src/utils/identity.d.ts +0 -124
  142. package/dist/src/utils/identity.d.ts.map +0 -1
  143. package/dist/src/utils/identity.js +0 -434
  144. package/dist/src/utils/identity.js.map +0 -1
  145. package/dist/src/utils/internal-mail.d.ts +0 -18
  146. package/dist/src/utils/internal-mail.d.ts.map +0 -1
  147. package/dist/src/utils/internal-mail.js +0 -75
  148. package/dist/src/utils/internal-mail.js.map +0 -1
  149. package/dist/src/utils/loop-detector.d.ts +0 -27
  150. package/dist/src/utils/loop-detector.d.ts.map +0 -1
  151. package/dist/src/utils/loop-detector.js +0 -42
  152. package/dist/src/utils/loop-detector.js.map +0 -1
  153. package/dist/src/utils/mail-handler.d.ts +0 -19
  154. package/dist/src/utils/mail-handler.d.ts.map +0 -1
  155. package/dist/src/utils/mail-handler.js +0 -94
  156. package/dist/src/utils/mail-handler.js.map +0 -1
  157. package/dist/src/utils/mail.d.ts +0 -22
  158. package/dist/src/utils/mail.d.ts.map +0 -1
  159. package/dist/src/utils/mail.js +0 -111
  160. package/dist/src/utils/mail.js.map +0 -1
  161. package/dist/src/utils/manifest.d.ts +0 -36
  162. package/dist/src/utils/manifest.d.ts.map +0 -1
  163. package/dist/src/utils/manifest.js +0 -94
  164. package/dist/src/utils/manifest.js.map +0 -1
  165. package/dist/src/utils/noise-ik-transport.d.ts +0 -18
  166. package/dist/src/utils/noise-ik-transport.d.ts.map +0 -1
  167. package/dist/src/utils/noise-ik-transport.js +0 -357
  168. package/dist/src/utils/noise-ik-transport.js.map +0 -1
  169. package/dist/src/utils/nono.d.ts +0 -72
  170. package/dist/src/utils/nono.d.ts.map +0 -1
  171. package/dist/src/utils/nono.js +0 -166
  172. package/dist/src/utils/nono.js.map +0 -1
  173. package/dist/src/utils/outbox.d.ts +0 -10
  174. package/dist/src/utils/outbox.d.ts.map +0 -1
  175. package/dist/src/utils/outbox.js +0 -29
  176. package/dist/src/utils/outbox.js.map +0 -1
  177. package/dist/src/utils/output.d.ts +0 -17
  178. package/dist/src/utils/output.d.ts.map +0 -1
  179. package/dist/src/utils/output.js +0 -83
  180. package/dist/src/utils/output.js.map +0 -1
  181. package/dist/src/utils/plain-tcp-transport.d.ts +0 -10
  182. package/dist/src/utils/plain-tcp-transport.d.ts.map +0 -1
  183. package/dist/src/utils/plain-tcp-transport.js +0 -209
  184. package/dist/src/utils/plain-tcp-transport.js.map +0 -1
  185. package/dist/src/utils/provision.d.ts +0 -2
  186. package/dist/src/utils/provision.d.ts.map +0 -1
  187. package/dist/src/utils/provision.js +0 -193
  188. package/dist/src/utils/provision.js.map +0 -1
  189. package/dist/src/utils/relay.d.ts +0 -30
  190. package/dist/src/utils/relay.d.ts.map +0 -1
  191. package/dist/src/utils/relay.js +0 -539
  192. package/dist/src/utils/relay.js.map +0 -1
  193. package/dist/src/utils/sandbox.d.ts +0 -37
  194. package/dist/src/utils/sandbox.d.ts.map +0 -1
  195. package/dist/src/utils/sandbox.js +0 -126
  196. package/dist/src/utils/sandbox.js.map +0 -1
  197. package/dist/src/utils/transport.d.ts +0 -62
  198. package/dist/src/utils/transport.d.ts.map +0 -1
  199. package/dist/src/utils/transport.js +0 -75
  200. package/dist/src/utils/transport.js.map +0 -1
  201. package/dist/src/utils/vault.d.ts +0 -21
  202. package/dist/src/utils/vault.d.ts.map +0 -1
  203. package/dist/src/utils/vault.js +0 -67
  204. package/dist/src/utils/vault.js.map +0 -1
  205. package/dist/src/utils/wall.d.ts +0 -5
  206. package/dist/src/utils/wall.d.ts.map +0 -1
  207. package/dist/src/utils/wall.js +0 -51
  208. package/dist/src/utils/wall.js.map +0 -1
  209. package/dist/src/utils/wire-delivery.d.ts +0 -10
  210. package/dist/src/utils/wire-delivery.d.ts.map +0 -1
  211. package/dist/src/utils/wire-delivery.js +0 -57
  212. package/dist/src/utils/wire-delivery.js.map +0 -1
  213. package/dist/src/utils/wire-frame.d.ts +0 -10
  214. package/dist/src/utils/wire-frame.d.ts.map +0 -1
  215. package/dist/src/utils/wire-frame.js +0 -66
  216. package/dist/src/utils/wire-frame.js.map +0 -1
  217. package/dist/src/utils/wire-mail.d.ts +0 -54
  218. package/dist/src/utils/wire-mail.d.ts.map +0 -1
  219. package/dist/src/utils/wire-mail.js +0 -24
  220. package/dist/src/utils/wire-mail.js.map +0 -1
  221. package/dist/src/utils/workspace.d.ts +0 -14
  222. package/dist/src/utils/workspace.d.ts.map +0 -1
  223. package/dist/src/utils/workspace.js +0 -53
  224. package/dist/src/utils/workspace.js.map +0 -1
  225. package/dist/src/utils/ws-noise-transport.d.ts +0 -18
  226. package/dist/src/utils/ws-noise-transport.d.ts.map +0 -1
  227. package/dist/src/utils/ws-noise-transport.js +0 -356
  228. 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 = await 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 = await 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 = await 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 = await 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,MAAM,gBAAgB,EAAE,CAAC;IAExC,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,MAAM,gBAAgB,EAAE,CAAC;IACxC,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,MAAM,gBAAgB,EAAE,CAAC;IACxC,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,MAAM,gBAAgB,EAAE,CAAC;IAExC,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"}