aimux-cli 0.1.4 → 0.1.6

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 (166) hide show
  1. package/dist/builtin-metadata-watchers.js +1 -1
  2. package/dist/context/context-bridge.d.ts +1 -1
  3. package/dist/context/context-bridge.js +1 -1
  4. package/dist/dashboard/command-spec.d.ts +7 -0
  5. package/dist/dashboard/command-spec.js +127 -0
  6. package/dist/dashboard/command-spec.js.map +1 -0
  7. package/dist/{dashboard-feedback.js → dashboard/feedback.js} +1 -1
  8. package/dist/dashboard/feedback.js.map +1 -0
  9. package/dist/{dashboard.d.ts → dashboard/index.d.ts} +16 -5
  10. package/dist/{dashboard.js → dashboard/index.js} +7 -4
  11. package/dist/dashboard/index.js.map +1 -0
  12. package/dist/{dashboard-pending-actions.d.ts → dashboard/pending-actions.d.ts} +8 -3
  13. package/dist/dashboard/pending-actions.js +90 -0
  14. package/dist/dashboard/pending-actions.js.map +1 -0
  15. package/dist/{dashboard-session-actions.d.ts → dashboard/session-actions.d.ts} +2 -2
  16. package/dist/{dashboard-session-actions.js → dashboard/session-actions.js} +1 -1
  17. package/dist/dashboard/session-actions.js.map +1 -0
  18. package/dist/{dashboard-session-registry.d.ts → dashboard/session-registry.d.ts} +7 -7
  19. package/dist/{dashboard-session-registry.js → dashboard/session-registry.js} +2 -2
  20. package/dist/dashboard/session-registry.js.map +1 -0
  21. package/dist/{dashboard-state.d.ts → dashboard/state.d.ts} +1 -1
  22. package/dist/{dashboard-state.js → dashboard/state.js} +1 -1
  23. package/dist/dashboard/state.js.map +1 -0
  24. package/dist/{dashboard-targets.d.ts → dashboard/targets.d.ts} +1 -6
  25. package/dist/{dashboard-targets.js → dashboard/targets.js} +5 -123
  26. package/dist/dashboard/targets.js.map +1 -0
  27. package/dist/{dashboard-ui-state-store.d.ts → dashboard/ui-state-store.d.ts} +2 -2
  28. package/dist/{dashboard-ui-state-store.js → dashboard/ui-state-store.js} +2 -2
  29. package/dist/dashboard/ui-state-store.js.map +1 -0
  30. package/dist/fast-control.d.ts +1 -1
  31. package/dist/fast-control.js +1 -1
  32. package/dist/instance-directory.js +1 -1
  33. package/dist/main.js +27 -13
  34. package/dist/main.js.map +1 -1
  35. package/dist/metadata-server.js +4 -17
  36. package/dist/metadata-server.js.map +1 -1
  37. package/dist/multiplexer/agent-io-methods.d.ts +40 -0
  38. package/dist/multiplexer/agent-io-methods.js +177 -0
  39. package/dist/multiplexer/agent-io-methods.js.map +1 -0
  40. package/dist/multiplexer/archives.d.ts +15 -0
  41. package/dist/multiplexer/archives.js +270 -0
  42. package/dist/multiplexer/archives.js.map +1 -0
  43. package/dist/multiplexer/dashboard-actions-methods.d.ts +57 -0
  44. package/dist/multiplexer/dashboard-actions-methods.js +159 -0
  45. package/dist/multiplexer/dashboard-actions-methods.js.map +1 -0
  46. package/dist/multiplexer/dashboard-control.d.ts +36 -0
  47. package/dist/multiplexer/dashboard-control.js +571 -0
  48. package/dist/multiplexer/dashboard-control.js.map +1 -0
  49. package/dist/multiplexer/dashboard-interaction.d.ts +12 -0
  50. package/dist/multiplexer/dashboard-interaction.js +552 -0
  51. package/dist/multiplexer/dashboard-interaction.js.map +1 -0
  52. package/dist/multiplexer/dashboard-model.d.ts +40 -0
  53. package/dist/multiplexer/dashboard-model.js +420 -0
  54. package/dist/multiplexer/dashboard-model.js.map +1 -0
  55. package/dist/multiplexer/dashboard-ops.d.ts +35 -0
  56. package/dist/multiplexer/dashboard-ops.js +158 -0
  57. package/dist/multiplexer/dashboard-ops.js.map +1 -0
  58. package/dist/multiplexer/dashboard-state-methods.d.ts +56 -0
  59. package/dist/multiplexer/dashboard-state-methods.js +123 -0
  60. package/dist/multiplexer/dashboard-state-methods.js.map +1 -0
  61. package/dist/multiplexer/dashboard-tail-methods.d.ts +104 -0
  62. package/dist/multiplexer/dashboard-tail-methods.js +252 -0
  63. package/dist/multiplexer/dashboard-tail-methods.js.map +1 -0
  64. package/dist/multiplexer/dashboard-view-methods.d.ts +51 -0
  65. package/dist/multiplexer/dashboard-view-methods.js +159 -0
  66. package/dist/multiplexer/dashboard-view-methods.js.map +1 -0
  67. package/dist/multiplexer/index.d.ts +205 -0
  68. package/dist/multiplexer/index.js +444 -0
  69. package/dist/multiplexer/index.js.map +1 -0
  70. package/dist/multiplexer/navigation.d.ts +17 -0
  71. package/dist/multiplexer/navigation.js +203 -0
  72. package/dist/multiplexer/navigation.js.map +1 -0
  73. package/dist/multiplexer/notifications.d.ts +6 -0
  74. package/dist/multiplexer/notifications.js +75 -0
  75. package/dist/multiplexer/notifications.js.map +1 -0
  76. package/dist/multiplexer/persistence-methods.d.ts +77 -0
  77. package/dist/multiplexer/persistence-methods.js +347 -0
  78. package/dist/multiplexer/persistence-methods.js.map +1 -0
  79. package/dist/multiplexer/runtime-lifecycle-methods.d.ts +36 -0
  80. package/dist/multiplexer/runtime-lifecycle-methods.js +235 -0
  81. package/dist/multiplexer/runtime-lifecycle-methods.js.map +1 -0
  82. package/dist/multiplexer/runtime-state.d.ts +32 -0
  83. package/dist/multiplexer/runtime-state.js +439 -0
  84. package/dist/multiplexer/runtime-state.js.map +1 -0
  85. package/dist/{multiplexer-runtime-sync.d.ts → multiplexer/runtime-sync.d.ts} +2 -2
  86. package/dist/{multiplexer-runtime-sync.js → multiplexer/runtime-sync.js} +1 -1
  87. package/dist/multiplexer/runtime-sync.js.map +1 -0
  88. package/dist/multiplexer/services.d.ts +23 -0
  89. package/dist/multiplexer/services.js +187 -0
  90. package/dist/multiplexer/services.js.map +1 -0
  91. package/dist/multiplexer/session-actions.d.ts +36 -0
  92. package/dist/multiplexer/session-actions.js +108 -0
  93. package/dist/multiplexer/session-actions.js.map +1 -0
  94. package/dist/multiplexer/session-launch.d.ts +20 -0
  95. package/dist/multiplexer/session-launch.js +407 -0
  96. package/dist/multiplexer/session-launch.js.map +1 -0
  97. package/dist/multiplexer/session-runtime-core.d.ts +37 -0
  98. package/dist/multiplexer/session-runtime-core.js +400 -0
  99. package/dist/multiplexer/session-runtime-core.js.map +1 -0
  100. package/dist/multiplexer/subscreens.d.ts +30 -0
  101. package/dist/multiplexer/subscreens.js +685 -0
  102. package/dist/multiplexer/subscreens.js.map +1 -0
  103. package/dist/multiplexer/tool-picker.d.ts +8 -0
  104. package/dist/multiplexer/tool-picker.js +142 -0
  105. package/dist/multiplexer/tool-picker.js.map +1 -0
  106. package/dist/multiplexer/worktrees.d.ts +12 -0
  107. package/dist/multiplexer/worktrees.js +181 -0
  108. package/dist/multiplexer/worktrees.js.map +1 -0
  109. package/dist/notification-context.js +6 -1
  110. package/dist/notification-context.js.map +1 -1
  111. package/dist/notify.js +19 -1
  112. package/dist/notify.js.map +1 -1
  113. package/dist/project-events.d.ts +2 -0
  114. package/dist/project-events.js +1 -0
  115. package/dist/project-events.js.map +1 -1
  116. package/dist/project-scanner.d.ts +1 -1
  117. package/dist/project-scanner.js +1 -1
  118. package/dist/session-bootstrap.d.ts +1 -1
  119. package/dist/session-semantics.d.ts +1 -1
  120. package/dist/{tmux-doctor.d.ts → tmux/doctor.d.ts} +1 -1
  121. package/dist/{tmux-doctor.js → tmux/doctor.js} +4 -3
  122. package/dist/tmux/doctor.js.map +1 -0
  123. package/dist/{tmux-runtime-manager.d.ts → tmux/runtime-manager.d.ts} +3 -0
  124. package/dist/{tmux-runtime-manager.js → tmux/runtime-manager.js} +81 -17
  125. package/dist/tmux/runtime-manager.js.map +1 -0
  126. package/dist/{tmux-session-transport.d.ts → tmux/session-transport.d.ts} +2 -2
  127. package/dist/{tmux-session-transport.js → tmux/session-transport.js} +2 -2
  128. package/dist/tmux/session-transport.js.map +1 -0
  129. package/dist/{tmux-statusline.d.ts → tmux/statusline.d.ts} +1 -1
  130. package/dist/{tmux-statusline.js → tmux/statusline.js} +4 -4
  131. package/dist/tmux/statusline.js.map +1 -0
  132. package/dist/{tmux-switcher.js → tmux/switcher.js} +7 -7
  133. package/dist/tmux/switcher.js.map +1 -0
  134. package/dist/{tmux-window-open.d.ts → tmux/window-open.d.ts} +1 -1
  135. package/dist/{tmux-window-open.js → tmux/window-open.js} +1 -1
  136. package/dist/tmux/window-open.js.map +1 -0
  137. package/dist/tool-output-watchers.js +1 -1
  138. package/dist/tui/render/box.js +25 -6
  139. package/dist/tui/render/box.js.map +1 -1
  140. package/dist/tui/screens/dashboard-renderers.d.ts +3 -2
  141. package/dist/tui/screens/dashboard-renderers.js +17 -2
  142. package/dist/tui/screens/dashboard-renderers.js.map +1 -1
  143. package/dist/tui/screens/overlay-renderers.js +2 -2
  144. package/dist/tui/screens/overlay-renderers.js.map +1 -1
  145. package/package.json +1 -1
  146. package/dist/dashboard-feedback.js.map +0 -1
  147. package/dist/dashboard-pending-actions.js +0 -52
  148. package/dist/dashboard-pending-actions.js.map +0 -1
  149. package/dist/dashboard-session-actions.js.map +0 -1
  150. package/dist/dashboard-session-registry.js.map +0 -1
  151. package/dist/dashboard-state.js.map +0 -1
  152. package/dist/dashboard-targets.js.map +0 -1
  153. package/dist/dashboard-ui-state-store.js.map +0 -1
  154. package/dist/dashboard.js.map +0 -1
  155. package/dist/multiplexer-runtime-sync.js.map +0 -1
  156. package/dist/multiplexer.d.ts +0 -500
  157. package/dist/multiplexer.js +0 -6081
  158. package/dist/multiplexer.js.map +0 -1
  159. package/dist/tmux-doctor.js.map +0 -1
  160. package/dist/tmux-runtime-manager.js.map +0 -1
  161. package/dist/tmux-session-transport.js.map +0 -1
  162. package/dist/tmux-statusline.js.map +0 -1
  163. package/dist/tmux-switcher.js.map +0 -1
  164. package/dist/tmux-window-open.js.map +0 -1
  165. /package/dist/{dashboard-feedback.d.ts → dashboard/feedback.d.ts} +0 -0
  166. /package/dist/{tmux-switcher.d.ts → tmux/switcher.d.ts} +0 -0
@@ -0,0 +1,347 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { spawn } from "node:child_process";
3
+ import { basename, join } from "node:path";
4
+ import { debug } from "../debug.js";
5
+ import { DashboardPendingActions } from "../dashboard/pending-actions.js";
6
+ import { loadDaemonInfo } from "../daemon.js";
7
+ import { getGraveyardPath, getLocalAimuxDir, getProjectStateDir, getStatePath } from "../paths.js";
8
+ import { loadMetadataState } from "../metadata-store.js";
9
+ import { renderCurrentDashboardView as renderCurrentDashboardViewImpl } from "./runtime-state.js";
10
+ import { loadStatusline, renderTmuxStatuslineFromData } from "../tmux/statusline.js";
11
+ import { findMainRepo, listWorktrees as listAllWorktrees } from "../worktree.js";
12
+ export const persistenceMethods = {
13
+ writeSessionsFile() {
14
+ const dir = getLocalAimuxDir();
15
+ if (!existsSync(dir))
16
+ mkdirSync(dir, { recursive: true });
17
+ const localSessions = this.sessions.map((s) => ({
18
+ id: s.id,
19
+ tool: s.command,
20
+ backendSessionId: s.backendSessionId,
21
+ worktreePath: this.sessionWorktreePaths.get(s.id),
22
+ }));
23
+ const data = this.instanceDirectory.buildSessionsFileEntries(localSessions, this.instanceDirectory.getRemoteInstancesSafe(this.instanceId, process.cwd()));
24
+ writeFileSync(`${dir}/sessions.json`, JSON.stringify(data, null, 2) + "\n");
25
+ },
26
+ writeStatuslineFile() {
27
+ try {
28
+ if (this.mode !== "project-service")
29
+ return;
30
+ for (const session of this.sessions) {
31
+ this.syncTmuxWindowMetadata(session.id);
32
+ }
33
+ this.refreshDesktopStateSnapshot();
34
+ const dir = getProjectStateDir();
35
+ const filePath = join(dir, "statusline.json");
36
+ const tmpPath = `${filePath}.tmp`;
37
+ const data = this.buildStatuslineSnapshot();
38
+ const { updatedAt: _updatedAt, ...stableData } = data;
39
+ const snapshotKey = JSON.stringify(stableData);
40
+ if (snapshotKey === this.lastStatuslineSnapshotKey) {
41
+ return;
42
+ }
43
+ this.lastStatuslineSnapshotKey = snapshotKey;
44
+ writeFileSync(tmpPath, JSON.stringify(data) + "\n");
45
+ renameSync(tmpPath, filePath);
46
+ this.writePrecomputedTmuxStatuslineFiles(data);
47
+ this.tmuxRuntimeManager.refreshStatus();
48
+ }
49
+ catch { }
50
+ },
51
+ getTmuxStatuslineDir() {
52
+ const dir = join(getProjectStateDir(), "tmux-statusline");
53
+ mkdirSync(dir, { recursive: true });
54
+ return dir;
55
+ },
56
+ writeStatuslineTextFile(name, content) {
57
+ const dir = this.getTmuxStatuslineDir();
58
+ const filePath = join(dir, name);
59
+ const tmpPath = `${filePath}.tmp`;
60
+ writeFileSync(tmpPath, `${content}\n`);
61
+ renameSync(tmpPath, filePath);
62
+ },
63
+ writePrecomputedTmuxStatuslineFiles(data) {
64
+ const dashboardTop = renderTmuxStatuslineFromData(data, process.cwd(), "top", {
65
+ currentWindow: "dashboard",
66
+ currentPath: process.cwd(),
67
+ });
68
+ const dashboardBottom = renderTmuxStatuslineFromData(data, process.cwd(), "bottom", {
69
+ currentWindow: "dashboard",
70
+ currentPath: process.cwd(),
71
+ });
72
+ this.writeStatuslineTextFile("top-dashboard.txt", dashboardTop);
73
+ this.writeStatuslineTextFile("bottom-dashboard.txt", dashboardBottom);
74
+ for (const entry of data.sessions) {
75
+ if (!entry.tmuxWindowId)
76
+ continue;
77
+ const renderOptions = {
78
+ currentWindow: entry.windowName,
79
+ currentWindowId: entry.tmuxWindowId,
80
+ currentPath: entry.worktreePath ?? process.cwd(),
81
+ };
82
+ const top = renderTmuxStatuslineFromData(data, process.cwd(), "top", renderOptions);
83
+ const bottom = renderTmuxStatuslineFromData(data, process.cwd(), "bottom", renderOptions);
84
+ this.writeStatuslineTextFile(`top-${entry.tmuxWindowId}.txt`, top);
85
+ this.writeStatuslineTextFile(`bottom-${entry.tmuxWindowId}.txt`, bottom);
86
+ }
87
+ },
88
+ writeDashboardClientStatuslineFile() {
89
+ if (this.mode !== "dashboard")
90
+ return;
91
+ const clientSession = this.tmuxRuntimeManager.currentClientSession();
92
+ if (!clientSession)
93
+ return;
94
+ const localData = loadStatusline(process.cwd()) ?? {
95
+ project: basename(process.cwd()),
96
+ sessions: [],
97
+ metadata: {},
98
+ tasks: { pending: 0, assigned: 0 },
99
+ controlPlane: { daemonAlive: true, projectServiceAlive: false },
100
+ flash: null,
101
+ updatedAt: new Date().toISOString(),
102
+ };
103
+ const data = { ...localData, dashboardScreen: this.dashboardState.screen };
104
+ const bottom = renderTmuxStatuslineFromData(data, process.cwd(), "bottom", {
105
+ currentSession: clientSession,
106
+ currentWindow: this.tmuxRuntimeManager.displayMessage("#{window_name}") ?? "dashboard",
107
+ currentPath: process.cwd(),
108
+ });
109
+ this.writeStatuslineTextFile(`bottom-dashboard-${clientSession}.txt`, bottom);
110
+ },
111
+ buildStatuslineSnapshot() {
112
+ const desktopState = this.desktopStateSnapshot ?? this.buildDesktopStateSnapshot();
113
+ return {
114
+ project: basename(process.cwd()),
115
+ dashboardScreen: this.dashboardState.screen,
116
+ sessions: [
117
+ ...desktopState.sessions.map((session) => ({
118
+ id: session.id,
119
+ kind: "agent",
120
+ tool: session.command,
121
+ label: session.label,
122
+ tmuxWindowId: session.tmuxWindowId,
123
+ tmuxWindowIndex: session.tmuxWindowIndex,
124
+ windowName: session.command,
125
+ headline: session.headline,
126
+ status: session.status,
127
+ role: session.role,
128
+ active: session.active,
129
+ worktreePath: session.worktreePath,
130
+ semantic: session.semantic,
131
+ })),
132
+ ...desktopState.services.map((service) => ({
133
+ id: service.id,
134
+ kind: "service",
135
+ tool: service.command,
136
+ label: service.label,
137
+ tmuxWindowId: service.tmuxWindowId,
138
+ tmuxWindowIndex: service.tmuxWindowIndex,
139
+ windowName: service.command,
140
+ headline: service.previewLine,
141
+ status: service.status,
142
+ active: service.active,
143
+ worktreePath: service.worktreePath,
144
+ })),
145
+ ],
146
+ tasks: this.taskDispatcher?.getTaskCounts() ?? { pending: 0, assigned: 0 },
147
+ controlPlane: {
148
+ daemonAlive: Boolean(loadDaemonInfo()),
149
+ projectServiceAlive: true,
150
+ },
151
+ flash: this.footerFlash,
152
+ metadata: loadMetadataState().sessions,
153
+ updatedAt: new Date().toISOString(),
154
+ };
155
+ },
156
+ buildDesktopState() {
157
+ if (!this.desktopStateSnapshot) {
158
+ this.refreshDesktopStateSnapshot();
159
+ }
160
+ const desktopState = this.desktopStateSnapshot ?? this.buildDesktopStateSnapshot();
161
+ return {
162
+ sessions: desktopState.sessions,
163
+ services: desktopState.services,
164
+ statusline: this.buildStatuslineSnapshot(),
165
+ worktrees: desktopState.worktrees,
166
+ mainCheckoutInfo: desktopState.mainCheckoutInfo,
167
+ mainCheckoutPath: desktopState.mainCheckoutPath,
168
+ };
169
+ },
170
+ reapplyDashboardPendingActions() {
171
+ this.dashboardSessionsCache = this.dashboardPendingActions.applyToSessions(this.dashboardSessionsCache.map(({ pendingAction: _pendingAction, optimistic: _optimistic, ...session }) => session));
172
+ this.dashboardServicesCache = this.dashboardPendingActions.applyToServices(this.dashboardServicesCache.map(({ pendingAction: _pendingAction, optimistic: _optimistic, ...service }) => service));
173
+ this.dashboardWorktreeGroupsCache = this.dashboardPendingActions.applyToWorktrees(this.dashboardWorktreeGroupsCache.map(({ pendingAction: _pendingAction, optimistic: _optimistic, pending: _pending, removing: _removing, ...wt }) => wt));
174
+ },
175
+ listDesktopWorktrees() {
176
+ const pendingRemovals = this.pendingWorktreeRemovals;
177
+ return listAllWorktrees()
178
+ .filter((wt) => !wt.isBare)
179
+ .map((wt) => ({
180
+ ...wt,
181
+ pending: pendingRemovals?.has(wt.path) ?? false,
182
+ removing: pendingRemovals?.has(wt.path) ?? false,
183
+ }));
184
+ },
185
+ async removeDesktopWorktree(path) {
186
+ const pendingRemovals = this.pendingWorktreeRemovals;
187
+ const existingRemoval = pendingRemovals.get(path);
188
+ if (existingRemoval) {
189
+ return existingRemoval;
190
+ }
191
+ let resolveRemoval;
192
+ let rejectRemoval;
193
+ const removalPromise = new Promise((resolve, reject) => {
194
+ resolveRemoval = resolve;
195
+ rejectRemoval = reject;
196
+ });
197
+ pendingRemovals.set(path, removalPromise);
198
+ this.dashboardPendingActions.set(DashboardPendingActions.worktreeKey(path), "removing", {
199
+ timeoutMs: 180_000,
200
+ onTimeout: () => {
201
+ this.footerFlash = `Timed out removing ${path.split("/").pop() ?? path}`;
202
+ this.footerFlashTicks = 5;
203
+ this.invalidateDesktopStateSnapshot();
204
+ this.refreshLocalDashboardModel();
205
+ if (this.mode === "dashboard") {
206
+ this.renderDashboard();
207
+ }
208
+ },
209
+ });
210
+ this.invalidateDesktopStateSnapshot();
211
+ this.refreshLocalDashboardModel();
212
+ if (this.mode === "dashboard") {
213
+ this.renderDashboard();
214
+ }
215
+ void (async () => {
216
+ try {
217
+ this.syncSessionsFromState();
218
+ const mainRepo = findMainRepo();
219
+ if (path === mainRepo) {
220
+ throw new Error("Cannot remove the main checkout");
221
+ }
222
+ const matching = this.listDesktopWorktrees().find((worktree) => worktree.path === path);
223
+ if (!matching) {
224
+ if (!existsSync(path)) {
225
+ this.offlineSessions = this.offlineSessions.filter((session) => session.worktreePath !== path);
226
+ this.offlineServices = this.offlineServices.filter((service) => service.worktreePath !== path);
227
+ this.saveState();
228
+ resolveRemoval({ path, status: "removed" });
229
+ return;
230
+ }
231
+ throw new Error(`Worktree "${path}" not found`);
232
+ }
233
+ const attachedSession = this.sessions.find((session) => session.worktreePath === path && this.isSessionRuntimeLive(session));
234
+ if (attachedSession) {
235
+ throw new Error(`Cannot remove "${matching.name}" while agent "${attachedSession.label || attachedSession.id}" is attached`);
236
+ }
237
+ const attachedService = this.buildLiveServiceStates().find((service) => service.worktreePath === path);
238
+ if (attachedService) {
239
+ throw new Error(`Cannot remove "${matching.name}" while service "${attachedService.label || attachedService.id}" is attached`);
240
+ }
241
+ await new Promise((resolve, reject) => {
242
+ let stderr = "";
243
+ let child;
244
+ try {
245
+ child = spawn("git", ["worktree", "remove", path, "--force"], {
246
+ cwd: mainRepo,
247
+ stdio: ["ignore", "ignore", "pipe"],
248
+ });
249
+ }
250
+ catch (error) {
251
+ reject(error);
252
+ return;
253
+ }
254
+ child.stderr.on("data", (chunk) => {
255
+ const text = chunk.toString();
256
+ stderr += text;
257
+ if (this.worktreeRemovalJob?.path === path) {
258
+ this.worktreeRemovalJob.stderr = stderr;
259
+ if (this.mode === "dashboard") {
260
+ this.renderDashboard();
261
+ }
262
+ }
263
+ });
264
+ child.on("error", reject);
265
+ child.on("close", (code) => {
266
+ if (code === 0) {
267
+ resolve();
268
+ return;
269
+ }
270
+ const detail = stderr
271
+ .split("\n")
272
+ .map((line) => line.trim())
273
+ .filter(Boolean)
274
+ .at(-1);
275
+ reject(new Error(detail || `git worktree remove exited with code ${code ?? 1}`));
276
+ });
277
+ });
278
+ this.offlineSessions = this.offlineSessions.filter((session) => session.worktreePath !== path);
279
+ this.offlineServices = this.offlineServices.filter((service) => service.worktreePath !== path);
280
+ this.saveState();
281
+ resolveRemoval({ path, status: "removed" });
282
+ }
283
+ catch (error) {
284
+ rejectRemoval(error);
285
+ }
286
+ })();
287
+ removalPromise.finally(() => {
288
+ this.dashboardPendingActions.set(DashboardPendingActions.worktreeKey(path), null);
289
+ pendingRemovals.delete(path);
290
+ this.invalidateDesktopStateSnapshot();
291
+ this.refreshLocalDashboardModel();
292
+ if (this.mode === "dashboard") {
293
+ this.renderDashboard();
294
+ }
295
+ });
296
+ return removalPromise;
297
+ },
298
+ listGraveyardEntries() {
299
+ try {
300
+ const content = readFileSync(getGraveyardPath(), "utf-8");
301
+ return JSON.parse(content);
302
+ }
303
+ catch {
304
+ return [];
305
+ }
306
+ },
307
+ async resurrectGraveyardSession(sessionId) {
308
+ this.loadOfflineSessions();
309
+ const graveyardEntries = this.listGraveyardEntries();
310
+ const entry = graveyardEntries.find((candidate) => candidate.id === sessionId);
311
+ if (!entry) {
312
+ throw new Error(`Graveyard session "${sessionId}" not found`);
313
+ }
314
+ const nextGraveyard = graveyardEntries.filter((candidate) => candidate.id !== sessionId);
315
+ writeFileSync(getGraveyardPath(), JSON.stringify(nextGraveyard, null, 2) + "\n");
316
+ this.offlineSessions.push(entry);
317
+ const statePath = getStatePath();
318
+ try {
319
+ let state = { savedAt: new Date().toISOString(), cwd: process.cwd(), sessions: [] };
320
+ if (existsSync(statePath)) {
321
+ state = JSON.parse(readFileSync(statePath, "utf-8"));
322
+ }
323
+ state.sessions.push(entry);
324
+ writeFileSync(statePath, JSON.stringify(state, null, 2) + "\n");
325
+ }
326
+ catch { }
327
+ debug(`resurrected ${entry.id} from graveyard`, "session");
328
+ return { sessionId, status: "offline" };
329
+ },
330
+ removeSessionsFile() {
331
+ try {
332
+ unlinkSync(`${getLocalAimuxDir()}/sessions.json`);
333
+ }
334
+ catch { }
335
+ },
336
+ stripAnsi(text) {
337
+ return text.replace(/\u001B\[[0-9;]*m/g, "");
338
+ },
339
+ centerInWidth(text, width) {
340
+ const pad = Math.max(0, Math.floor((width - this.stripAnsi(text).length) / 2));
341
+ return " ".repeat(pad) + text;
342
+ },
343
+ renderCurrentDashboardView() {
344
+ renderCurrentDashboardViewImpl(this);
345
+ },
346
+ };
347
+ //# sourceMappingURL=persistence-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence-methods.js","sourceRoot":"","sources":["../../src/multiplexer/persistence-methods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { InstanceSessionRef } from "../instance-registry.js";
2
+ import type { SessionRuntime } from "../session-runtime.js";
3
+ import type { Multiplexer, SavedState, ServiceState, SessionState } from "./index.js";
4
+ import { getRemoteInstancesSafe as getRemoteInstancesSafeImpl } from "./runtime-state.js";
5
+ export type RuntimeLifecycleMethods = {
6
+ writeInstructionFiles(this: Multiplexer): void;
7
+ removeInstructionFiles(this: Multiplexer): void;
8
+ startStatusRefresh(this: Multiplexer): void;
9
+ stopStatusRefresh(this: Multiplexer): void;
10
+ syncSessionsFromState(this: Multiplexer, state?: SavedState | null): void;
11
+ loadOfflineSessions(this: Multiplexer, state?: SavedState | null): boolean;
12
+ loadOfflineServices(this: Multiplexer, state?: SavedState | null): boolean;
13
+ buildLiveServiceStates(this: Multiplexer): ServiceState[];
14
+ restoreTmuxSessionsFromState(this: Multiplexer, state?: SavedState | null): void;
15
+ stopSessionToOffline(this: Multiplexer, session: SessionRuntime): void;
16
+ adjustAfterRemove(this: Multiplexer, hasWorktrees: boolean): void;
17
+ graveyardSession(this: Multiplexer, sessionId: string): void;
18
+ isSessionRuntimeLive(this: Multiplexer, runtime: SessionRuntime): boolean;
19
+ evictZombieSession(this: Multiplexer, runtime: SessionRuntime): void;
20
+ resumeOfflineSession(this: Multiplexer, session: SessionState): void;
21
+ startHeartbeat(this: Multiplexer): void;
22
+ handleSessionClaimed(this: Multiplexer, sessionId: string): void;
23
+ stopHeartbeat(this: Multiplexer): void;
24
+ startProjectServiceRefresh(this: Multiplexer): void;
25
+ stopProjectServiceRefresh(this: Multiplexer): void;
26
+ getRemoteInstancesSafe(this: Multiplexer): ReturnType<typeof getRemoteInstancesSafeImpl>;
27
+ getRemoteOwnedSessionKeys(this: Multiplexer): Set<string>;
28
+ getInstanceSessionRefs(this: Multiplexer): InstanceSessionRef[];
29
+ saveState(this: Multiplexer): void;
30
+ teardown(this: Multiplexer): void;
31
+ cleanup(this: Multiplexer): void;
32
+ cleanupTerminalOnly(this: Multiplexer): void;
33
+ exitDashboardClientOrProcess(this: Multiplexer): void;
34
+ };
35
+ export declare function loadStateStatic(): SavedState | null;
36
+ export declare const runtimeLifecycleMethods: RuntimeLifecycleMethods;
@@ -0,0 +1,235 @@
1
+ import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { closeDebug, debug } from "../debug.js";
5
+ import { loadConfig } from "../config.js";
6
+ import { getStatePath } from "../paths.js";
7
+ import { adjustAfterRemove as adjustAfterRemoveImpl, buildLiveServiceStates as buildLiveServiceStatesImpl, evictZombieSession as evictZombieSessionImpl, getInstanceSessionRefs as getInstanceSessionRefsImpl, getRemoteInstancesSafe as getRemoteInstancesSafeImpl, getRemoteOwnedSessionKeys as getRemoteOwnedSessionKeysImpl, graveyardSession as graveyardSessionImpl, handleSessionClaimed as handleSessionClaimedImpl, isSessionRuntimeLive as isSessionRuntimeLiveImpl, loadOfflineServices as loadOfflineServicesImpl, loadOfflineSessions as loadOfflineSessionsImpl, restoreTmuxSessionsFromState as restoreTmuxSessionsFromStateImpl, resumeOfflineSession as resumeOfflineSessionImpl, startHeartbeat as startHeartbeatImpl, startProjectServiceRefresh as startProjectServiceRefreshImpl, startStatusRefresh as startStatusRefreshImpl, stopHeartbeat as stopHeartbeatImpl, stopProjectServiceRefresh as stopProjectServiceRefreshImpl, stopSessionToOffline as stopSessionToOfflineImpl, stopStatusRefresh as stopStatusRefreshImpl, syncSessionsFromState as syncSessionsFromStateImpl, } from "./runtime-state.js";
8
+ export function loadStateStatic() {
9
+ const statePath = getStatePath();
10
+ if (!existsSync(statePath))
11
+ return null;
12
+ try {
13
+ const raw = readFileSync(statePath, "utf-8");
14
+ const state = JSON.parse(raw);
15
+ return state;
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ export const runtimeLifecycleMethods = {
22
+ writeInstructionFiles() {
23
+ const mux = this;
24
+ const config = loadConfig();
25
+ const preamble = "# aimux Agent Instructions\n\n" +
26
+ "You are running inside aimux, an agent multiplexer. " +
27
+ "Other agents may be working on this codebase simultaneously.\n\n" +
28
+ "## Context Files\n" +
29
+ "- `.aimux/context/{session-id}/live.md` — each agent's recent conversation\n" +
30
+ "- `.aimux/context/{session-id}/summary.md` — each agent's compacted history\n" +
31
+ "- `.aimux/sessions.json` — all running agents (use to find other agents' session IDs)\n" +
32
+ "- `.aimux/history/` — full raw conversation history (JSONL)\n\n" +
33
+ "Check sessions.json to discover other agents, then read their context files.\n" +
34
+ "This file is auto-generated by aimux and will be removed when aimux exits.\n";
35
+ let fullPreamble = preamble;
36
+ for (const mdPath of [join(homedir(), "AIMUX.md"), join(process.cwd(), "AIMUX.md")]) {
37
+ if (existsSync(mdPath)) {
38
+ try {
39
+ const userContent = readFileSync(mdPath, "utf-8").trim();
40
+ if (userContent) {
41
+ fullPreamble += "\n## User Instructions\n\n" + userContent + "\n";
42
+ debug(`loaded ${mdPath} for instructions file (${userContent.length} chars)`, "preamble");
43
+ }
44
+ }
45
+ catch { }
46
+ }
47
+ }
48
+ for (const [, tool] of Object.entries(config.tools)) {
49
+ if (!tool.instructionsFile || !tool.enabled)
50
+ continue;
51
+ const filePath = join(process.cwd(), tool.instructionsFile);
52
+ if (existsSync(filePath) && !mux.writtenInstructionFiles.has(filePath)) {
53
+ debug(`skipping ${tool.instructionsFile} — already exists`, "context");
54
+ continue;
55
+ }
56
+ writeFileSync(filePath, fullPreamble);
57
+ mux.writtenInstructionFiles.add(filePath);
58
+ debug(`wrote ${tool.instructionsFile}`, "context");
59
+ }
60
+ },
61
+ removeInstructionFiles() {
62
+ const mux = this;
63
+ for (const filePath of mux.writtenInstructionFiles) {
64
+ try {
65
+ unlinkSync(filePath);
66
+ }
67
+ catch { }
68
+ }
69
+ mux.writtenInstructionFiles.clear();
70
+ },
71
+ startStatusRefresh() {
72
+ startStatusRefreshImpl(this);
73
+ },
74
+ stopStatusRefresh() {
75
+ stopStatusRefreshImpl(this);
76
+ },
77
+ syncSessionsFromState(state = loadStateStatic()) {
78
+ syncSessionsFromStateImpl(this, state);
79
+ },
80
+ loadOfflineSessions(state = loadStateStatic()) {
81
+ return loadOfflineSessionsImpl(this, state);
82
+ },
83
+ loadOfflineServices(state = loadStateStatic()) {
84
+ return loadOfflineServicesImpl(this, state);
85
+ },
86
+ buildLiveServiceStates() {
87
+ return buildLiveServiceStatesImpl(this);
88
+ },
89
+ restoreTmuxSessionsFromState(state = loadStateStatic()) {
90
+ restoreTmuxSessionsFromStateImpl(this, state);
91
+ },
92
+ stopSessionToOffline(session) {
93
+ stopSessionToOfflineImpl(this, session);
94
+ },
95
+ adjustAfterRemove(hasWorktrees) {
96
+ adjustAfterRemoveImpl(this, hasWorktrees);
97
+ },
98
+ graveyardSession(sessionId) {
99
+ graveyardSessionImpl(this, sessionId);
100
+ },
101
+ isSessionRuntimeLive(runtime) {
102
+ return isSessionRuntimeLiveImpl(this, runtime);
103
+ },
104
+ evictZombieSession(runtime) {
105
+ evictZombieSessionImpl(this, runtime);
106
+ },
107
+ resumeOfflineSession(session) {
108
+ resumeOfflineSessionImpl(this, session);
109
+ },
110
+ startHeartbeat() {
111
+ startHeartbeatImpl(this);
112
+ },
113
+ handleSessionClaimed(sessionId) {
114
+ handleSessionClaimedImpl(this, sessionId);
115
+ },
116
+ stopHeartbeat() {
117
+ stopHeartbeatImpl(this);
118
+ },
119
+ startProjectServiceRefresh() {
120
+ startProjectServiceRefreshImpl(this);
121
+ },
122
+ stopProjectServiceRefresh() {
123
+ stopProjectServiceRefreshImpl(this);
124
+ },
125
+ getRemoteInstancesSafe() {
126
+ return getRemoteInstancesSafeImpl(this);
127
+ },
128
+ getRemoteOwnedSessionKeys() {
129
+ return getRemoteOwnedSessionKeysImpl(this);
130
+ },
131
+ getInstanceSessionRefs() {
132
+ return getInstanceSessionRefsImpl(this);
133
+ },
134
+ saveState() {
135
+ const mux = this;
136
+ const liveSessions = mux.sessions.map((s) => ({
137
+ id: s.id,
138
+ tool: s.command,
139
+ toolConfigKey: mux.sessionToolKeys.get(s.id) ?? s.command,
140
+ command: s.command,
141
+ args: mux.sessionOriginalArgs.get(s.id) ?? [],
142
+ backendSessionId: s.backendSessionId,
143
+ worktreePath: mux.sessionWorktreePaths.get(s.id),
144
+ label: this.getSessionLabel(s.id),
145
+ headline: this.deriveHeadline(s.id),
146
+ tmuxTarget: mux.sessionTmuxTargets.get(s.id),
147
+ }));
148
+ const mySessions = [...mux.offlineSessions, ...liveSessions];
149
+ const liveServices = this.buildLiveServiceStates();
150
+ const myServices = [...mux.offlineServices, ...liveServices].filter((service, index, services) => services.findIndex((entry) => entry.id === service.id) === index);
151
+ if (mySessions.length === 0 && myServices.length === 0)
152
+ return;
153
+ const statePath = getStatePath();
154
+ let mergedSessions = mySessions;
155
+ let mergedServices = myServices;
156
+ if (existsSync(statePath)) {
157
+ try {
158
+ const existing = JSON.parse(readFileSync(statePath, "utf-8"));
159
+ const myBackendIds = new Set(mySessions.map((s) => s.backendSessionId).filter(Boolean));
160
+ const myIds = new Set(mySessions.map((s) => s.id));
161
+ const otherSessions = existing.sessions.filter((s) => {
162
+ if (s.backendSessionId && myBackendIds.has(s.backendSessionId))
163
+ return false;
164
+ if (myIds.has(s.id))
165
+ return false;
166
+ return true;
167
+ });
168
+ mergedSessions = [...otherSessions, ...mySessions];
169
+ const myServiceIds = new Set(myServices.map((service) => service.id));
170
+ const otherServices = (existing.services ?? []).filter((service) => !myServiceIds.has(service.id));
171
+ mergedServices = [...otherServices, ...myServices];
172
+ }
173
+ catch { }
174
+ }
175
+ const state = {
176
+ savedAt: new Date().toISOString(),
177
+ cwd: process.cwd(),
178
+ sessions: mergedSessions,
179
+ services: mergedServices,
180
+ };
181
+ writeFileSync(statePath, JSON.stringify(state, null, 2) + "\n");
182
+ this.invalidateDesktopStateSnapshot();
183
+ },
184
+ teardown() {
185
+ const mux = this;
186
+ debug("teardown started", "session");
187
+ this.clearDashboardBusy();
188
+ this.stopHeartbeat();
189
+ this.stopProjectServiceRefresh();
190
+ mux.taskDispatcher = null;
191
+ mux.orchestrationDispatcher = null;
192
+ mux.instanceDirectory.unregisterInstance(mux.instanceId, process.cwd()).catch(() => { });
193
+ this.saveState();
194
+ this.stopStatusRefresh();
195
+ mux.contextWatcher.stop();
196
+ this.removeSessionsFile();
197
+ this.removeInstructionFiles();
198
+ closeDebug();
199
+ if (mux.onStdinData) {
200
+ process.stdin.removeListener("data", mux.onStdinData);
201
+ }
202
+ if (mux.onResize) {
203
+ process.stdout.removeListener("resize", mux.onResize);
204
+ }
205
+ mux.hotkeys.destroy();
206
+ mux.terminalHost.restoreTerminalState();
207
+ },
208
+ cleanup() {
209
+ const mux = this;
210
+ for (const session of mux.sessions) {
211
+ session.destroy();
212
+ }
213
+ void this.stopProjectServices().catch(() => { });
214
+ this.teardown();
215
+ },
216
+ cleanupTerminalOnly() {
217
+ const mux = this;
218
+ mux.terminalHost.restoreTerminalState();
219
+ },
220
+ exitDashboardClientOrProcess() {
221
+ const mux = this;
222
+ const insideTmux = mux.tmuxRuntimeManager.isInsideTmux();
223
+ const currentSession = insideTmux ? mux.tmuxRuntimeManager.currentClientSession() : null;
224
+ if (insideTmux && currentSession && mux.tmuxRuntimeManager.isManagedSessionName(currentSession)) {
225
+ mux.tmuxRuntimeManager.leaveManagedSession({
226
+ insideTmux: true,
227
+ sessionName: mux.tmuxRuntimeManager.getProjectSession(process.cwd()).sessionName,
228
+ });
229
+ return;
230
+ }
231
+ this.cleanup();
232
+ process.exit(0);
233
+ },
234
+ };
235
+ //# sourceMappingURL=runtime-lifecycle-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-lifecycle-methods.js","sourceRoot":"","sources":["../../src/multiplexer/runtime-lifecycle-methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EACL,iBAAiB,IAAI,qBAAqB,EAC1C,sBAAsB,IAAI,0BAA0B,EACpD,kBAAkB,IAAI,sBAAsB,EAC5C,sBAAsB,IAAI,0BAA0B,EACpD,sBAAsB,IAAI,0BAA0B,EACpD,yBAAyB,IAAI,6BAA6B,EAC1D,gBAAgB,IAAI,oBAAoB,EACxC,oBAAoB,IAAI,wBAAwB,EAChD,oBAAoB,IAAI,wBAAwB,EAChD,mBAAmB,IAAI,uBAAuB,EAC9C,mBAAmB,IAAI,uBAAuB,EAC9C,4BAA4B,IAAI,gCAAgC,EAChE,oBAAoB,IAAI,wBAAwB,EAChD,cAAc,IAAI,kBAAkB,EACpC,0BAA0B,IAAI,8BAA8B,EAC5D,kBAAkB,IAAI,sBAAsB,EAC5C,aAAa,IAAI,iBAAiB,EAClC,yBAAyB,IAAI,6BAA6B,EAC1D,oBAAoB,IAAI,wBAAwB,EAChD,iBAAiB,IAAI,qBAAqB,EAC1C,qBAAqB,IAAI,yBAAyB,GACnD,MAAM,oBAAoB,CAAC;AA4D5B,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;QAE5C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA4B;IAC9D,qBAAqB;QACnB,MAAM,GAAG,GAAG,IAAuC,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GACZ,gCAAgC;YAChC,sDAAsD;YACtD,kEAAkE;YAClE,oBAAoB;YACpB,8EAA8E;YAC9E,+EAA+E;YAC/E,yFAAyF;YACzF,iEAAiE;YACjE,gFAAgF;YAChF,8EAA8E,CAAC;QAEjF,IAAI,YAAY,GAAG,QAAQ,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YACpF,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzD,IAAI,WAAW,EAAE,CAAC;wBAChB,YAAY,IAAI,4BAA4B,GAAG,WAAW,GAAG,IAAI,CAAC;wBAClE,KAAK,CAAC,UAAU,MAAM,2BAA2B,WAAW,CAAC,MAAM,SAAS,EAAE,UAAU,CAAC,CAAC;oBAC5F,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,SAAS;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC5D,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvE,KAAK,CAAC,YAAY,IAAI,CAAC,gBAAgB,mBAAmB,EAAE,SAAS,CAAC,CAAC;gBACvE,SAAS;YACX,CAAC;YACD,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACtC,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,KAAK,CAAC,SAAS,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,sBAAsB;QACpB,MAAM,GAAG,GAAG,IAAuC,CAAC;QACpD,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,uBAAuB,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,GAAG,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IACD,kBAAkB;QAChB,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,iBAAiB;QACf,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,qBAAqB,CAAoB,KAAK,GAAG,eAAe,EAAE;QAChE,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,mBAAmB,CAAoB,KAAK,GAAG,eAAe,EAAE;QAC9D,OAAO,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,mBAAmB,CAAoB,KAAK,GAAG,eAAe,EAAE;QAC9D,OAAO,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,sBAAsB;QACpB,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,4BAA4B,CAAoB,KAAK,GAAG,eAAe,EAAE;QACvE,gCAAgC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,oBAAoB,CAAoB,OAAO;QAC7C,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,iBAAiB,CAAoB,YAAY;QAC/C,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;IACD,gBAAgB,CAAoB,SAAS;QAC3C,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IACD,oBAAoB,CAAoB,OAAO;QAC7C,OAAO,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,kBAAkB,CAAoB,OAAO;QAC3C,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,oBAAoB,CAAoB,OAAO;QAC7C,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,cAAc;QACZ,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,oBAAoB,CAAoB,SAAS;QAC/C,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IACD,aAAa;QACX,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,0BAA0B;QACxB,8BAA8B,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,yBAAyB;QACvB,6BAA6B,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,sBAAsB;QACpB,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,yBAAyB;QACvB,OAAO,6BAA6B,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,sBAAsB;QACpB,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,SAAS;QACP,MAAM,GAAG,GAAG,IAAuC,CAAC;QACpD,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC;YAC5D,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,OAAO;YACf,aAAa,EAAE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO;YACzD,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;YAC7C,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,YAAY,EAAE,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,UAAU,EAAE,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAU;SACtD,CAAC,CAAC,CAAC;QACJ,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,eAAe,EAAE,GAAG,YAAY,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,eAAe,EAAE,GAAG,YAAY,CAAC,CAAC,MAAM,CACjE,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,KAAK,KAAK,CAC/F,CAAC;QACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,IAAI,cAAc,GAAmB,UAAU,CAAC;QAChD,IAAI,cAAc,GAAmB,UAAU,CAAC;QAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAe,CAAC;gBAC5E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;oBACnD,IAAI,CAAC,CAAC,gBAAgB,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;wBAAE,OAAO,KAAK,CAAC;oBAC7E,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAE,OAAO,KAAK,CAAC;oBAClC,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBACH,cAAc,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,UAAU,CAAC,CAAC;gBAEnD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtE,MAAM,aAAa,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnG,cAAc,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,UAAU,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAe;YACxB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,cAAc;SACzB,CAAC;QAEF,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,8BAA8B,EAAE,CAAC;IACxC,CAAC;IACD,QAAQ;QACN,MAAM,GAAG,GAAG,IAAuC,CAAC;QACpD,KAAK,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;QAC1B,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACnC,GAAG,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,UAAU,EAAE,CAAC;QACb,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACtB,GAAG,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO;QACL,MAAM,GAAG,GAAG,IAAuC,CAAC;QACpD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;QACD,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IACD,mBAAmB;QACjB,MAAM,GAAG,GAAG,IAAuC,CAAC;QACpD,GAAG,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;IAC1C,CAAC;IACD,4BAA4B;QAC1B,MAAM,GAAG,GAAG,IAAuC,CAAC;QACpD,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;QACzD,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACzF,IAAI,UAAU,IAAI,cAAc,IAAI,GAAG,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,CAAC;YAChG,GAAG,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;gBACzC,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,GAAG,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW;aACjF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC"}