@dorokuma/herdsman 0.9.0 → 0.11.4

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 (111) hide show
  1. package/dist/src/agent-history/antigravity-proto.js +1 -1
  2. package/dist/src/agent-history/antigravity-proto.js.map +1 -1
  3. package/dist/src/agent-history/antigravity-reader.d.ts +13 -1
  4. package/dist/src/agent-history/antigravity-reader.d.ts.map +1 -1
  5. package/dist/src/agent-history/antigravity-reader.js +22 -1
  6. package/dist/src/agent-history/antigravity-reader.js.map +1 -1
  7. package/dist/src/agent-history/discovery.d.ts +2 -1
  8. package/dist/src/agent-history/discovery.d.ts.map +1 -1
  9. package/dist/src/agent-history/discovery.js +24 -4
  10. package/dist/src/agent-history/discovery.js.map +1 -1
  11. package/dist/src/agent-history/readers.d.ts +15 -1
  12. package/dist/src/agent-history/readers.d.ts.map +1 -1
  13. package/dist/src/agent-history/readers.js +77 -31
  14. package/dist/src/agent-history/readers.js.map +1 -1
  15. package/dist/src/agent-history/service.d.ts +4 -2
  16. package/dist/src/agent-history/service.d.ts.map +1 -1
  17. package/dist/src/agent-history/service.js +22 -22
  18. package/dist/src/agent-history/service.js.map +1 -1
  19. package/dist/src/agent-history/source-fingerprint.d.ts +7 -0
  20. package/dist/src/agent-history/source-fingerprint.d.ts.map +1 -0
  21. package/dist/src/agent-history/source-fingerprint.js +26 -0
  22. package/dist/src/agent-history/source-fingerprint.js.map +1 -0
  23. package/dist/src/agent-history/text.d.ts.map +1 -1
  24. package/dist/src/agent-history/text.js +5 -0
  25. package/dist/src/agent-history/text.js.map +1 -1
  26. package/dist/src/cli/herdsman.d.ts.map +1 -1
  27. package/dist/src/cli/herdsman.js +31 -9
  28. package/dist/src/cli/herdsman.js.map +1 -1
  29. package/dist/src/daemon/agent-event-reconciler.d.ts +7 -0
  30. package/dist/src/daemon/agent-event-reconciler.d.ts.map +1 -1
  31. package/dist/src/daemon/agent-event-reconciler.js +39 -5
  32. package/dist/src/daemon/agent-event-reconciler.js.map +1 -1
  33. package/dist/src/daemon/herdr-session-watch-manager.d.ts +1 -0
  34. package/dist/src/daemon/herdr-session-watch-manager.d.ts.map +1 -1
  35. package/dist/src/daemon/herdr-session-watch-manager.js +176 -55
  36. package/dist/src/daemon/herdr-session-watch-manager.js.map +1 -1
  37. package/dist/src/daemon/observability-server.d.ts +3 -0
  38. package/dist/src/daemon/observability-server.d.ts.map +1 -1
  39. package/dist/src/daemon/observability-server.js +64 -9
  40. package/dist/src/daemon/observability-server.js.map +1 -1
  41. package/dist/src/daemon/process-manager.d.ts +41 -2
  42. package/dist/src/daemon/process-manager.d.ts.map +1 -1
  43. package/dist/src/daemon/process-manager.js +340 -19
  44. package/dist/src/daemon/process-manager.js.map +1 -1
  45. package/dist/src/daemon/service.d.ts +46 -0
  46. package/dist/src/daemon/service.d.ts.map +1 -1
  47. package/dist/src/daemon/service.js +171 -12
  48. package/dist/src/daemon/service.js.map +1 -1
  49. package/dist/src/db/agent-events.d.ts +27 -0
  50. package/dist/src/db/agent-events.d.ts.map +1 -1
  51. package/dist/src/db/agent-events.js +157 -26
  52. package/dist/src/db/agent-events.js.map +1 -1
  53. package/dist/src/db/agent-orchestrator-scopes.d.ts +8 -0
  54. package/dist/src/db/agent-orchestrator-scopes.d.ts.map +1 -1
  55. package/dist/src/db/agent-orchestrator-scopes.js +13 -0
  56. package/dist/src/db/agent-orchestrator-scopes.js.map +1 -1
  57. package/dist/src/db/agents.d.ts +44 -0
  58. package/dist/src/db/agents.d.ts.map +1 -1
  59. package/dist/src/db/agents.js +71 -0
  60. package/dist/src/db/agents.js.map +1 -1
  61. package/dist/src/db/client.d.ts +1 -0
  62. package/dist/src/db/client.d.ts.map +1 -1
  63. package/dist/src/db/client.js +12 -0
  64. package/dist/src/db/client.js.map +1 -1
  65. package/dist/src/db/schema.d.ts +391 -0
  66. package/dist/src/db/schema.d.ts.map +1 -1
  67. package/dist/src/db/schema.js +34 -0
  68. package/dist/src/db/schema.js.map +1 -1
  69. package/dist/src/db/status-event-plans.d.ts +62 -0
  70. package/dist/src/db/status-event-plans.d.ts.map +1 -0
  71. package/dist/src/db/status-event-plans.js +147 -0
  72. package/dist/src/db/status-event-plans.js.map +1 -0
  73. package/dist/src/herdr/pane-identity-resolver.d.ts +4 -0
  74. package/dist/src/herdr/pane-identity-resolver.d.ts.map +1 -1
  75. package/dist/src/herdr/pane-identity-resolver.js +13 -1
  76. package/dist/src/herdr/pane-identity-resolver.js.map +1 -1
  77. package/dist/src/herdr/socket-client.d.ts +2 -0
  78. package/dist/src/herdr/socket-client.d.ts.map +1 -1
  79. package/dist/src/herdr/socket-client.js +64 -20
  80. package/dist/src/herdr/socket-client.js.map +1 -1
  81. package/dist/src/observability/agent-context-service.d.ts.map +1 -1
  82. package/dist/src/observability/agent-context-service.js +3 -6
  83. package/dist/src/observability/agent-context-service.js.map +1 -1
  84. package/dist/src/observability/agent-index-service.d.ts +47 -2
  85. package/dist/src/observability/agent-index-service.d.ts.map +1 -1
  86. package/dist/src/observability/agent-index-service.js +1075 -103
  87. package/dist/src/observability/agent-index-service.js.map +1 -1
  88. package/dist/src/observability/agent-orchestrator-service.d.ts.map +1 -1
  89. package/dist/src/observability/agent-orchestrator-service.js +34 -12
  90. package/dist/src/observability/agent-orchestrator-service.js.map +1 -1
  91. package/dist/src/observability/contracts.d.ts +1 -1
  92. package/dist/src/observability/contracts.d.ts.map +1 -1
  93. package/dist/src/observability/contracts.js.map +1 -1
  94. package/dist/src/observability/interactive-pi.d.ts +1 -1
  95. package/dist/src/observability/interactive-pi.d.ts.map +1 -1
  96. package/dist/src/observability/interactive-pi.js +1 -1
  97. package/dist/src/observability/interactive-pi.js.map +1 -1
  98. package/dist/src/observability/turn-completion.d.ts +2 -1
  99. package/dist/src/observability/turn-completion.d.ts.map +1 -1
  100. package/dist/src/observability/turn-completion.js +10 -1
  101. package/dist/src/observability/turn-completion.js.map +1 -1
  102. package/dist/src/shared/unix-peercred.d.ts +14 -0
  103. package/dist/src/shared/unix-peercred.d.ts.map +1 -0
  104. package/dist/src/shared/unix-peercred.js +144 -0
  105. package/dist/src/shared/unix-peercred.js.map +1 -0
  106. package/drizzle/0008_pane_tombstones.sql +9 -0
  107. package/drizzle/0009_high_lake.sql +24 -0
  108. package/drizzle/meta/0008_snapshot.json +823 -0
  109. package/drizzle/meta/0009_snapshot.json +975 -0
  110. package/drizzle/meta/_journal.json +14 -0
  111. package/package.json +24 -22
@@ -1,6 +1,14 @@
1
- import { HerdrSocketClient } from "../herdr/socket-client.js";
1
+ import { HERDR_TOPOLOGY_EVENT_TYPES, HerdrSocketClient } from "../herdr/socket-client.js";
2
2
  export const ACTIVE_REVISION_POLL_MS = 10_000;
3
3
  export const FULL_RESCAN_MS = 60_000;
4
+ export const PLAN_DRAIN_GRACE_MS = 12_000;
5
+ const VALID_AGENT_EVENT_TYPES = new Set([
6
+ "agent.status.changed",
7
+ "agent.idle",
8
+ "agent.done",
9
+ "agent.blocked",
10
+ "agent.failed",
11
+ ]);
4
12
  export class HerdrSessionWatchManager {
5
13
  #agents;
6
14
  #activeRevisionPollMs;
@@ -14,6 +22,7 @@ export class HerdrSessionWatchManager {
14
22
  #reconnectDelayMs;
15
23
  #refreshPublications = new WeakMap();
16
24
  #retiringWatcherLoops = new Set();
25
+ #inFlightPlans = new Set();
17
26
  #sessionList;
18
27
  #watchers = new Map();
19
28
  #lastFullRescanAt = 0;
@@ -58,6 +67,13 @@ export class HerdrSessionWatchManager {
58
67
  await this.#abortWatchers();
59
68
  await this.#tickInFlight?.catch(() => undefined);
60
69
  await Promise.all([...this.#retiringWatcherLoops]);
70
+ if (this.#inFlightPlans.size > 0) {
71
+ const controller = new AbortController();
72
+ const timeout = delay(PLAN_DRAIN_GRACE_MS, controller.signal);
73
+ await Promise.race([Promise.all([...this.#inFlightPlans]), timeout]).finally(() => {
74
+ controller.abort();
75
+ });
76
+ }
61
77
  await this.#abortWatchers();
62
78
  }
63
79
  async rescanNow() {
@@ -94,7 +110,12 @@ export class HerdrSessionWatchManager {
94
110
  return;
95
111
  }
96
112
  const workingSessions = [...this.#watchers.values()].filter(({ entry }) => this.#agents.listForHerdrSession(entry.name).some((agent) => agent.agentStatus === "working"));
97
- await Promise.all(workingSessions.map(({ entry }) => this.#refresh(entry)));
113
+ await mapConcurrent(workingSessions, 4, async (watcher) => {
114
+ const agents = await this.#refresh(watcher.entry);
115
+ if (containsNewPaneId(agents, watcher.subscribedPaneIds)) {
116
+ watcher.restartSubscription?.();
117
+ }
118
+ });
98
119
  }
99
120
  async #startWatcher(entry, generation) {
100
121
  if (this.#stopping || generation !== this.#lifecycleGeneration)
@@ -106,7 +127,13 @@ export class HerdrSessionWatchManager {
106
127
  });
107
128
  const abort = new AbortController();
108
129
  const client = this.#clientFactory({ socketPath: entry.socketPath });
109
- const watcher = { abort, client, entry, loop: Promise.resolve() };
130
+ const watcher = {
131
+ abort,
132
+ client,
133
+ entry,
134
+ loop: Promise.resolve(),
135
+ subscribedPaneIds: [],
136
+ };
110
137
  watcher.loop = this.#watch(entry, watcher, generation, abort.signal).catch(() => undefined);
111
138
  this.#watchers.set(entry.name, watcher);
112
139
  if (this.#stopping || generation !== this.#lifecycleGeneration) {
@@ -135,74 +162,84 @@ export class HerdrSessionWatchManager {
135
162
  let lastPaneIds = [];
136
163
  let lastEvent;
137
164
  let lastClosedTriggered = false;
165
+ let restartAgents;
138
166
  while (!signal.aborted && generation === this.#lifecycleGeneration) {
139
167
  let restart = false;
168
+ const subscriptionAbort = new AbortController();
169
+ const stopSubscription = () => subscriptionAbort.abort();
170
+ signal.addEventListener("abort", stopSubscription, { once: true });
171
+ watcher.restartSubscription = () => {
172
+ restart = true;
173
+ subscriptionAbort.abort();
174
+ };
140
175
  try {
141
- const agents = await this.#refresh(entry);
176
+ if (signal.aborted)
177
+ return;
178
+ const agents = restartAgents ?? (await this.#refresh(entry));
179
+ restartAgents = undefined;
142
180
  reconnectCount = 0;
143
181
  if (signal.aborted)
144
182
  return;
145
183
  const paneIds = agents.map((agent) => agent.paneId);
146
184
  lastPaneIds = paneIds;
147
- for await (const event of watcher.client.subscribeEvents({ paneIds }, { signal })) {
185
+ watcher.subscribedPaneIds = paneIds;
186
+ for await (const event of watcher.client.subscribeEvents({ paneIds }, { signal: subscriptionAbort.signal })) {
148
187
  if (signal.aborted)
149
188
  return;
150
189
  const eventRecord = record(event);
151
190
  reconnectCount = 0;
152
191
  lastEvent = eventRecord;
153
192
  if (eventRecord.type === "pane.agent_status_changed") {
154
- const result = await this.#index.handleHerdrEvent({
155
- event,
156
- herdrSessionName: entry.name,
157
- sessionDir: entry.sessionDir,
158
- socketPath: entry.socketPath,
159
- });
160
- this.#publishResult({
161
- agents: this.#agents.listForHerdrSession(entry.name),
162
- herdrSessionName: entry.name,
163
- ...result,
164
- });
193
+ await this.#handleWatchEvent(entry, event);
165
194
  continue;
166
195
  }
167
- if (eventRecord.type === "pane.closed") {
168
- await this.#index.handleHerdrEvent({
169
- event,
170
- herdrSessionName: entry.name,
171
- sessionDir: entry.sessionDir,
172
- socketPath: entry.socketPath,
173
- });
196
+ if (!isTopologyEvent(eventRecord.type))
197
+ continue;
198
+ const refreshed = await this.#refresh(entry);
199
+ lastPaneIds = refreshed.map((agent) => agent.paneId);
200
+ if (eventRecord.type === "pane.closed" && !closedHitsLivePane(eventRecord, refreshed)) {
201
+ await this.#handleWatchEvent(entry, event);
174
202
  }
175
- if (shouldRestartSubscription(eventRecord.type)) {
203
+ if (containsNewPaneId(refreshed, watcher.subscribedPaneIds)) {
176
204
  restart = true;
205
+ restartAgents = refreshed;
177
206
  lastClosedTriggered = eventRecord.type === "pane.closed";
178
- break;
207
+ subscriptionAbort.abort();
179
208
  }
180
209
  }
181
210
  }
182
211
  catch (error) {
183
212
  if (signal.aborted)
184
213
  return;
185
- reconnectCount += 1;
186
- const reconnectDelayMs = Math.min(this.#reconnectDelayMs * 2 ** (reconnectCount - 1), 30_000);
187
- console.warn("Herdsman Herdr subscription reconnect", {
188
- sessionName: entry.name,
189
- socketPath: entry.socketPath,
190
- paneIds: lastPaneIds,
191
- subscriptionGeneration: this.#lifecycleGeneration,
192
- eventId: lastEvent?.id ?? lastEvent?.event_id ?? null,
193
- revision: lastEvent?.revision ?? lastEvent?.pane_revision ?? null,
194
- reconnectCount,
195
- paneClosedTriggered: lastClosedTriggered,
196
- error: error instanceof Error ? error.message : String(error),
197
- });
198
- lastClosedTriggered = false;
199
- watcher.client.close();
200
- if (signal.aborted)
201
- return;
202
- watcher.client = this.#clientFactory({ socketPath: entry.socketPath });
203
- await delay(reconnectDelayMs, signal);
204
- continue;
214
+ if (!restart) {
215
+ reconnectCount += 1;
216
+ const reconnectDelayMs = Math.min(this.#reconnectDelayMs * 2 ** (reconnectCount - 1), 30_000);
217
+ console.warn("Herdsman Herdr subscription reconnect", {
218
+ sessionName: entry.name,
219
+ socketPath: entry.socketPath,
220
+ paneIds: lastPaneIds,
221
+ subscriptionGeneration: this.#lifecycleGeneration,
222
+ eventId: lastEvent?.id ?? lastEvent?.event_id ?? null,
223
+ revision: lastEvent?.revision ?? lastEvent?.pane_revision ?? null,
224
+ reconnectCount,
225
+ paneClosedTriggered: lastClosedTriggered,
226
+ error: error instanceof Error ? error.message : String(error),
227
+ });
228
+ lastClosedTriggered = false;
229
+ restartAgents = undefined;
230
+ if (signal.aborted)
231
+ return;
232
+ this.#replaceClient(watcher, entry.socketPath);
233
+ await delay(reconnectDelayMs, signal);
234
+ continue;
235
+ }
236
+ }
237
+ finally {
238
+ signal.removeEventListener("abort", stopSubscription);
205
239
  }
240
+ if (signal.aborted)
241
+ return;
242
+ this.#replaceClient(watcher, entry.socketPath);
206
243
  if (restart) {
207
244
  reconnectCount = 0;
208
245
  continue;
@@ -211,22 +248,85 @@ export class HerdrSessionWatchManager {
211
248
  await delay(this.#reconnectDelayMs, signal);
212
249
  }
213
250
  }
214
- #refresh(entry) {
215
- const source = this.#index.refreshHerdrSession({
251
+ #replaceClient(watcher, socketPath) {
252
+ watcher.client.close();
253
+ watcher.client = this.#clientFactory({ socketPath });
254
+ }
255
+ async #handleWatchEvent(entry, event) {
256
+ const result = this.#index.handleHerdrEventFast
257
+ ? await this.#index.handleHerdrEventFast({
258
+ event,
259
+ herdrSessionName: entry.name,
260
+ sessionDir: entry.sessionDir,
261
+ socketPath: entry.socketPath,
262
+ })
263
+ : await this.#index.handleHerdrEvent({
264
+ event,
265
+ herdrSessionName: entry.name,
266
+ sessionDir: entry.sessionDir,
267
+ socketPath: entry.socketPath,
268
+ });
269
+ this.#publishResult({
270
+ agents: this.#agents.listForHerdrSession(entry.name),
216
271
  herdrSessionName: entry.name,
217
- sessionDir: entry.sessionDir,
218
- socketPath: entry.socketPath,
272
+ ...result,
219
273
  });
274
+ if ("statusEventPlans" in result && Array.isArray(result.statusEventPlans)) {
275
+ for (const plan of result.statusEventPlans) {
276
+ this.#submitPlan(plan);
277
+ }
278
+ }
279
+ }
280
+ #refresh(entry) {
281
+ const source = (this.#index.refreshHerdrSessionFast
282
+ ? this.#index.refreshHerdrSessionFast({
283
+ herdrSessionName: entry.name,
284
+ sessionDir: entry.sessionDir,
285
+ socketPath: entry.socketPath,
286
+ })
287
+ : this.#index.refreshHerdrSession({
288
+ herdrSessionName: entry.name,
289
+ sessionDir: entry.sessionDir,
290
+ socketPath: entry.socketPath,
291
+ }));
220
292
  const existing = this.#refreshPublications.get(source);
221
293
  if (existing)
222
294
  return existing;
223
295
  const publication = source.then((result) => {
224
296
  this.#publishResult({ herdrSessionName: entry.name, ...result });
297
+ if ("statusEventPlans" in result && Array.isArray(result.statusEventPlans)) {
298
+ for (const plan of result.statusEventPlans) {
299
+ this.#submitPlan(plan);
300
+ }
301
+ }
225
302
  return result.agents;
226
303
  });
227
304
  this.#refreshPublications.set(source, publication);
228
305
  return publication;
229
306
  }
307
+ #submitPlan(plan) {
308
+ const execute = this.#index.executeStatusEventPlan?.(plan);
309
+ if (!execute)
310
+ return;
311
+ const task = Promise.resolve(execute)
312
+ .then((planEvent) => {
313
+ if (planEvent && VALID_AGENT_EVENT_TYPES.has(planEvent.type)) {
314
+ this.#onAgentEvent(planEvent);
315
+ }
316
+ })
317
+ .catch((error) => {
318
+ console.warn("Herdsman status event plan failed", {
319
+ agentId: plan.agent.id,
320
+ error,
321
+ from: plan.from,
322
+ to: plan.to,
323
+ });
324
+ })
325
+ .finally(() => {
326
+ this.#inFlightPlans.delete(task);
327
+ });
328
+ this.#inFlightPlans.add(task);
329
+ }
230
330
  #publishResult(input) {
231
331
  this.#onAgentIndexRefreshed({ agents: input.agents, herdrSessionName: input.herdrSessionName });
232
332
  for (const scope of input.contextChangedScopes)
@@ -246,14 +346,35 @@ async function delay(ms, signal) {
246
346
  }, { once: true });
247
347
  });
248
348
  }
249
- function shouldRestartSubscription(type) {
250
- return (type === "pane.agent_detected" ||
251
- type === "pane.closed" ||
252
- type === "pane.created" ||
253
- type === "pane.moved" ||
254
- type === "workspace.closed");
349
+ function isTopologyEvent(type) {
350
+ return HERDR_TOPOLOGY_EVENT_TYPES.includes(type);
351
+ }
352
+ function closedHitsLivePane(event, agents) {
353
+ const paneId = stringValue(event.pane_id) ?? stringValue(event.paneId);
354
+ if (!paneId)
355
+ return false;
356
+ const generation = stringValue(event.pane_generation) ?? stringValue(event.paneGeneration);
357
+ return agents.some((agent) => agent.paneId === paneId && (generation == null || agent.paneGeneration === generation));
358
+ }
359
+ function stringValue(value) {
360
+ return typeof value === "string" && value.length > 0 ? value : null;
361
+ }
362
+ function containsNewPaneId(agents, subscribedPaneIds) {
363
+ if (agents.length === 0)
364
+ return false;
365
+ const subscribed = new Set(subscribedPaneIds);
366
+ return agents.some((agent) => !subscribed.has(agent.paneId));
255
367
  }
256
368
  function record(value) {
257
369
  return typeof value === "object" && value !== null ? value : {};
258
370
  }
371
+ async function mapConcurrent(items, limit, fn) {
372
+ const results = [];
373
+ for (let i = 0; i < items.length; i += limit) {
374
+ const chunk = items.slice(i, i + limit);
375
+ const chunkResults = await Promise.all(chunk.map(fn));
376
+ results.push(...chunkResults);
377
+ }
378
+ return results;
379
+ }
259
380
  //# sourceMappingURL=herdr-session-watch-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"herdr-session-watch-manager.js","sourceRoot":"","sources":["../../../src/daemon/herdr-session-watch-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAO7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAWrC,MAAM,OAAO,wBAAwB;IAC1B,OAAO,CAAa;IACpB,qBAAqB,CAAS;IAC9B,cAAc,CAEoC;IAClD,aAAa,CAAS;IACtB,cAAc,CAAoB;IAClC,MAAM,CAAoB;IAC1B,sBAAsB,CAA8B;IACpD,aAAa,CAAoC;IACjD,sBAAsB,CAGpB;IACF,iBAAiB,CAAS;IAC1B,oBAAoB,GAAG,IAAI,OAAO,EAGxC,CAAC;IACK,qBAAqB,GAAG,IAAI,GAAG,EAAiB,CAAC;IACjD,YAAY,CAAyB;IACrC,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAChD,iBAAiB,GAAG,CAAC,CAAC;IACtB,oBAAoB,GAAG,CAAC,CAAC;IACzB,UAAU,CAA6B;IACvC,SAAS,GAAG,KAAK,CAAC;IAClB,aAAa,CAA4B;IAEzC,YAAY,OAcX;QACC,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,IAAI,uBAAuB,CAAC;QACrF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,IAAI,cAAc,CAAC;QAC5D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC7C,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC7C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBACjC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,UAAU;YAAE,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;QAE9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;gBAAE,OAAO;YACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,QAAQ;gBAAE,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC9D,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACxE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAC9F,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAA4B,EAAE,UAAkB;QAClE,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5F,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/D,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,CAAC,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,OAAgB;QAC3C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAC3D,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CACnC,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAA4B,EAC5B,OAAgB,EAChB,UAAkB,EAClB,MAAmB;QAEnB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,SAA8C,CAAC;QACnD,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACnE,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC1C,cAAc,GAAG,CAAC,CAAC;gBACnB,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpD,WAAW,GAAG,OAAO,CAAC;gBACtB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;oBAClF,IAAI,MAAM,CAAC,OAAO;wBAAE,OAAO;oBAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;oBAClC,cAAc,GAAG,CAAC,CAAC;oBACnB,SAAS,GAAG,WAAW,CAAC;oBACxB,IAAI,WAAW,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;wBACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;4BAChD,KAAK;4BACL,gBAAgB,EAAE,KAAK,CAAC,IAAI;4BAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;yBAC7B,CAAC,CAAC;wBACH,IAAI,CAAC,cAAc,CAAC;4BAClB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC;4BACpD,gBAAgB,EAAE,KAAK,CAAC,IAAI;4BAC5B,GAAG,MAAM;yBACV,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBACD,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACvC,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;4BACjC,KAAK;4BACL,gBAAgB,EAAE,KAAK,CAAC,IAAI;4BAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;yBAC7B,CAAC,CAAC;oBACL,CAAC;oBACD,IAAI,yBAAyB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChD,OAAO,GAAG,IAAI,CAAC;wBACf,mBAAmB,GAAG,WAAW,CAAC,IAAI,KAAK,aAAa,CAAC;wBACzD,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC3B,cAAc,IAAI,CAAC,CAAC;gBACpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAC/B,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,EAClD,MAAM,CACP,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE;oBACpD,WAAW,EAAE,KAAK,CAAC,IAAI;oBACvB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,OAAO,EAAE,WAAW;oBACpB,sBAAsB,EAAE,IAAI,CAAC,oBAAoB;oBACjD,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,SAAS,EAAE,QAAQ,IAAI,IAAI;oBACrD,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,SAAS,EAAE,aAAa,IAAI,IAAI;oBACjE,cAAc;oBACd,mBAAmB,EAAE,mBAAmB;oBACxC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;gBACH,mBAAmB,GAAG,KAAK,CAAC;gBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACvB,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;gBACvE,MAAM,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;gBACtC,SAAS;YACX,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,cAAc,GAAG,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YACD,cAAc,GAAG,CAAC,CAAC;YACnB,MAAM,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAA4B;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YAC7C,gBAAgB,EAAE,KAAK,CAAC,IAAI;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,IAAI,CAAC,cAAc,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACjE,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,cAAc,CAAC,KAKd;QACC,IAAI,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChG,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,oBAAoB;YAAE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACnF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM;YAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF;AAED,KAAK,UAAU,KAAK,CAAC,EAAU,EAAE,MAAmB;IAClD,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IACtC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,GAAG,EAAE;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAa;IAC9C,OAAO,CACL,IAAI,KAAK,qBAAqB;QAC9B,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,kBAAkB,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/F,CAAC"}
1
+ {"version":3,"file":"herdr-session-watch-manager.js","sourceRoot":"","sources":["../../../src/daemon/herdr-session-watch-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AASzF,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAS;IAC9C,sBAAsB;IACtB,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,cAAc;CACf,CAAC,CAAC;AAaH,MAAM,OAAO,wBAAwB;IAC1B,OAAO,CAAa;IACpB,qBAAqB,CAAS;IAC9B,cAAc,CAEoC;IAClD,aAAa,CAAS;IACtB,cAAc,CAAoB;IAClC,MAAM,CAAoB;IAC1B,sBAAsB,CAA8B;IACpD,aAAa,CAAoC;IACjD,sBAAsB,CAGpB;IACF,iBAAiB,CAAS;IAC1B,oBAAoB,GAAG,IAAI,OAAO,EAGxC,CAAC;IACK,qBAAqB,GAAG,IAAI,GAAG,EAAiB,CAAC;IACjD,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,YAAY,CAAyB;IACrC,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAChD,iBAAiB,GAAG,CAAC,CAAC;IACtB,oBAAoB,GAAG,CAAC,CAAC;IACzB,UAAU,CAA6B;IACvC,SAAS,GAAG,KAAK,CAAC;IAClB,aAAa,CAA4B;IAEzC,YAAY,OAcX;QACC,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,IAAI,uBAAuB,CAAC;QACrF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,IAAI,cAAc,CAAC;QAC5D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC7C,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC7C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBACjC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,UAAU;YAAE,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,KAAK,CAAC,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChF,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;QAE9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;gBAAE,OAAO;YACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,QAAQ;gBAAE,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC9D,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACxE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAC9F,CAAC;QACF,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAA4B,EAAE,UAAkB;QAClE,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvE,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,MAAM,OAAO,GAAY;YACvB,KAAK;YACL,MAAM;YACN,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;YACvB,iBAAiB,EAAE,EAAE;SACtB,CAAC;QACF,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5F,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/D,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,CAAC,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,OAAgB;QAC3C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAC3D,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CACnC,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAA4B,EAC5B,OAAgB,EAChB,UAAkB,EAClB,MAAmB;QAEnB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,SAA8C,CAAC;QACnD,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,aAA6C,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACnE,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,iBAAiB,GAAG,IAAI,eAAe,EAAE,CAAC;YAChD,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACzD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,mBAAmB,GAAG,GAAG,EAAE;gBACjC,OAAO,GAAG,IAAI,CAAC;gBACf,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC,CAAC;YACF,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC3B,MAAM,MAAM,GAAG,aAAa,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7D,aAAa,GAAG,SAAS,CAAC;gBAC1B,cAAc,GAAG,CAAC,CAAC;gBACnB,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpD,WAAW,GAAG,OAAO,CAAC;gBACtB,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC;gBACpC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,CACtD,EAAE,OAAO,EAAE,EACX,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,CACrC,EAAE,CAAC;oBACF,IAAI,MAAM,CAAC,OAAO;wBAAE,OAAO;oBAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;oBAClC,cAAc,GAAG,CAAC,CAAC;oBACnB,SAAS,GAAG,WAAW,CAAC;oBACxB,IAAI,WAAW,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;wBACrD,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;wBAC3C,SAAS;oBACX,CAAC;oBACD,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC;wBAAE,SAAS;oBACjD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAC7C,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACrD,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;wBACtF,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;oBAC7C,CAAC;oBACD,IAAI,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBAC5D,OAAO,GAAG,IAAI,CAAC;wBACf,aAAa,GAAG,SAAS,CAAC;wBAC1B,mBAAmB,GAAG,WAAW,CAAC,IAAI,KAAK,aAAa,CAAC;wBACzD,iBAAiB,CAAC,KAAK,EAAE,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,cAAc,IAAI,CAAC,CAAC;oBACpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAC/B,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,EAClD,MAAM,CACP,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE;wBACpD,WAAW,EAAE,KAAK,CAAC,IAAI;wBACvB,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,OAAO,EAAE,WAAW;wBACpB,sBAAsB,EAAE,IAAI,CAAC,oBAAoB;wBACjD,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,SAAS,EAAE,QAAQ,IAAI,IAAI;wBACrD,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,SAAS,EAAE,aAAa,IAAI,IAAI;wBACjE,cAAc;wBACd,mBAAmB,EAAE,mBAAmB;wBACxC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,mBAAmB,GAAG,KAAK,CAAC;oBAC5B,aAAa,GAAG,SAAS,CAAC;oBAC1B,IAAI,MAAM,CAAC,OAAO;wBAAE,OAAO;oBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC/C,MAAM,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;oBACtC,SAAS;gBACX,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO;YAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,OAAO,EAAE,CAAC;gBACZ,cAAc,GAAG,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YACD,cAAc,GAAG,CAAC,CAAC;YACnB,MAAM,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,cAAc,CAAC,OAAgB,EAAE,UAAkB;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAA4B,EAAE,KAAc;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB;YAC7C,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;gBACrC,KAAK;gBACL,gBAAgB,EAAE,KAAK,CAAC,IAAI;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC;YACJ,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACjC,KAAK;gBACL,gBAAgB,EAAE,KAAK,CAAC,IAAI;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;QACP,IAAI,CAAC,cAAc,CAAC;YAClB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC;YACpD,gBAAgB,EAAE,KAAK,CAAC,IAAI;YAC5B,GAAG,MAAM;SACV,CAAC,CAAC;QACH,IAAI,kBAAkB,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAA4B;QACnC,MAAM,MAAM,GAAG,CACb,IAAI,CAAC,MAAM,CAAC,uBAAuB;YACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC;gBAClC,gBAAgB,EAAE,KAAK,CAAC,IAAI;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;gBAC9B,gBAAgB,EAAE,KAAK,CAAC,IAAI;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAC2D,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,IAAI,CAAC,cAAc,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACjE,IAAI,kBAAkB,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC3E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,IAAqB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAkB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;aACjD,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YAClB,IAAI,SAAS,IAAI,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAChD,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACtB,KAAK;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;aACZ,CAAC,CAAC;QACL,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,KAKd;QACC,IAAI,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChG,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,oBAAoB;YAAE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACnF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM;YAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF;AAED,KAAK,UAAU,KAAK,CAAC,EAAU,EAAE,MAAmB;IAClD,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IACtC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,GAAG,EAAE;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,OAAQ,0BAAgD,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,kBAAkB,CACzB,KAA8B,EAC9B,MAAyE;IAEzE,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC,IAAI,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU,CAAC,CACzF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAyC,EACzC,iBAAoC;IAEpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAU,EACV,KAAa,EACb,EAA2B;IAE3B,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;QACxC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type Socket } from "node:net";
1
2
  import type { AgentHistoryService } from "../agent-history/service.js";
2
3
  import type { AgentEventStore } from "../db/agent-events.js";
3
4
  import type { AgentStore } from "../db/agents.js";
@@ -32,6 +33,7 @@ export declare class ObservabilityRpcServer {
32
33
  clearInterval?: (handle: IntervalHandle) => void;
33
34
  setInterval?: (callback: () => void, delay: number) => IntervalHandle;
34
35
  clearTimeout?: (handle: TimerHandle) => void;
36
+ connectSocket?: (socketPath: string) => Promise<boolean>;
35
37
  context: AgentContextService;
36
38
  disconnectGraceMs?: number;
37
39
  heartbeatScanIntervalMs?: number;
@@ -39,6 +41,7 @@ export declare class ObservabilityRpcServer {
39
41
  history: AgentHistoryService;
40
42
  now?: () => number;
41
43
  orchestrator: AgentOrchestratorService;
44
+ peerPidOf?: (socket: Socket) => number | undefined;
42
45
  registerPiSessionRef?: (input: {
43
46
  herdrSessionName: string;
44
47
  sessionRef: PiPresenceRegistration["sessionRef"];
@@ -1 +1 @@
1
- {"version":3,"file":"observability-server.d.ts","sourceRoot":"","sources":["../../../src/daemon/observability-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observability-server.d.ts","sourceRoot":"","sources":["../../../src/daemon/observability-server.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { chmodSync, existsSync, unlinkSync } from "node:fs";
2
2
  import { createServer } from "node:net";
3
3
  import { Value } from "@sinclair/typebox/value";
4
+ import { defaultConnectSocket } from "../daemon/process-manager.js";
4
5
  import { resolveHerdrPaneIdentity, } from "../herdr/pane-identity-resolver.js";
5
6
  import { OrchestratorAckError } from "../observability/errors.js";
6
7
  import { agentEventsInputSchema, agentGetInputSchema, agentListInputSchema, agentOrchestratorAckInputSchema, agentOrchestratorGetInputSchema, agentOrchestratorRegisterInputSchema, agentOrchestratorSetInputSchema, agentReadInputSchema, agentTurnCompletedInputSchema, } from "../observability/schemas.js";
7
8
  import { TurnCompletionRegistry } from "../observability/turn-completion.js";
8
9
  import { encodeJsonLine, JsonLineDecoder, JsonLineFrameTooLargeError, } from "../shared/json-lines.js";
10
+ import { linuxPeerPid, peerBoundToPaneCwd } from "../shared/unix-peercred.js";
9
11
  export const DISCONNECT_GRACE_MS = 5_000;
10
12
  export const STARTUP_RECONNECT_GRACE_MS = 10_000;
11
13
  export const TERMINAL_HEARTBEAT_TIMEOUT_MS = 90_000;
@@ -14,6 +16,7 @@ export class ObservabilityRpcServer {
14
16
  #clearInterval;
15
17
  #setInterval;
16
18
  #clearTimeout;
19
+ #connectSocket;
17
20
  #context;
18
21
  #connectionOrderBySocket = new Map();
19
22
  #publishedContextFingerprintByScope = new Map();
@@ -26,6 +29,7 @@ export class ObservabilityRpcServer {
26
29
  #heartbeatTimer;
27
30
  #now;
28
31
  #orchestrator;
32
+ #peerPidOf;
29
33
  #piPresenceBySocket = new Map();
30
34
  #socketsByTerminal = new Map();
31
35
  #registerPiSessionRef;
@@ -44,6 +48,7 @@ export class ObservabilityRpcServer {
44
48
  this.#clearInterval = options.clearInterval ?? clearInterval;
45
49
  this.#setInterval = options.setInterval ?? setInterval;
46
50
  this.#clearTimeout = options.clearTimeout ?? clearTimeout;
51
+ this.#connectSocket = options.connectSocket ?? defaultConnectSocket;
47
52
  this.#context = options.context;
48
53
  this.#disconnectGraceMs = options.disconnectGraceMs ?? DISCONNECT_GRACE_MS;
49
54
  this.#heartbeatScanIntervalMs =
@@ -52,6 +57,7 @@ export class ObservabilityRpcServer {
52
57
  this.#history = options.history;
53
58
  this.#now = options.now ?? Date.now;
54
59
  this.#orchestrator = options.orchestrator;
60
+ this.#peerPidOf = options.peerPidOf ?? linuxPeerPid;
55
61
  this.#registerPiSessionRef =
56
62
  options.registerPiSessionRef ?? (async () => ({ contextChangedScopes: [] }));
57
63
  this.#resolvePaneIdentity = options.resolvePaneIdentity ?? resolveHerdrPaneIdentity;
@@ -64,8 +70,12 @@ export class ObservabilityRpcServer {
64
70
  }
65
71
  async start() {
66
72
  this.#stopping = false;
67
- if (existsSync(this.#socketPath))
73
+ if (existsSync(this.#socketPath)) {
74
+ if (await this.#connectSocket(this.#socketPath)) {
75
+ throw new Error(`Herdsman daemon socket is already reachable: ${this.#socketPath}`);
76
+ }
68
77
  unlinkSync(this.#socketPath);
78
+ }
69
79
  process.umask(0o077);
70
80
  await new Promise((resolve, reject) => {
71
81
  this.#server.once("error", reject);
@@ -92,14 +102,15 @@ export class ObservabilityRpcServer {
92
102
  this.#piPresenceBySocket.clear();
93
103
  this.#socketsByTerminal.clear();
94
104
  this.#connectionOrderBySocket.clear();
105
+ const wasListening = this.#server.listening;
95
106
  await new Promise((resolve, reject) => {
96
- if (!this.#server.listening) {
107
+ if (!wasListening) {
97
108
  resolve();
98
109
  return;
99
110
  }
100
111
  this.#server.close((error) => (error ? reject(error) : resolve()));
101
112
  });
102
- if (existsSync(this.#socketPath))
113
+ if (wasListening && existsSync(this.#socketPath))
103
114
  unlinkSync(this.#socketPath);
104
115
  }
105
116
  publishAgentContext(scope) {
@@ -129,6 +140,9 @@ export class ObservabilityRpcServer {
129
140
  // Status changes are persisted for history but never routed as worker wake events.
130
141
  if (event.type === "agent.status.changed")
131
142
  return;
143
+ if ((event.status !== "pending" && event.status !== "delivered") || event.deliverable !== 1) {
144
+ return;
145
+ }
132
146
  const scope = { herdrSessionName: event.herdrSessionName, workspaceId: event.workspaceId };
133
147
  const owner = this.#orchestrator.status(scope)?.owner;
134
148
  if (!owner || event.terminalId === owner.terminalId)
@@ -270,7 +284,7 @@ export class ObservabilityRpcServer {
270
284
  case "agent.orchestrator.register": {
271
285
  assertSchema(agentOrchestratorRegisterInputSchema, params);
272
286
  const previous = this.#piPresenceBySocket.get(socket);
273
- const presence = await this.#resolvePiPresence(params);
287
+ const presence = await this.#resolvePiPresence(socket, params);
274
288
  if (previous)
275
289
  this.#unregisterTerminalSocket(socket, previous);
276
290
  this.#piPresenceBySocket.set(socket, presence);
@@ -345,7 +359,7 @@ export class ObservabilityRpcServer {
345
359
  throw new Error(`Unknown method: ${method}`);
346
360
  }
347
361
  }
348
- async #resolvePiPresence(input) {
362
+ async #resolvePiPresence(socket, input) {
349
363
  const session = this.#stores.herdrSessions.findRunningBySocketPath(input.herdrSocketPath);
350
364
  if (!session)
351
365
  throw new Error("Herdr socket is not registered as a running session");
@@ -354,7 +368,7 @@ export class ObservabilityRpcServer {
354
368
  paneId: input.paneId,
355
369
  });
356
370
  if (indexed?.workspaceId === input.workspaceId && indexed.terminalId) {
357
- return {
371
+ const presence = {
358
372
  connectedAt: this.#now(),
359
373
  herdrSessionName: session.name,
360
374
  paneId: indexed.paneId,
@@ -362,13 +376,15 @@ export class ObservabilityRpcServer {
362
376
  terminalId: indexed.terminalId,
363
377
  workspaceId: indexed.workspaceId,
364
378
  };
379
+ this.#assertConnectorBoundToPane(socket, await this.#tryPaneIdentity(session.socketPath, input.paneId));
380
+ return presence;
365
381
  }
366
382
  try {
367
383
  const live = await this.#resolvePaneIdentity({
368
384
  paneId: input.paneId,
369
385
  socketPath: session.socketPath,
370
386
  });
371
- return {
387
+ const presence = {
372
388
  connectedAt: this.#now(),
373
389
  herdrSessionName: session.name,
374
390
  paneId: live.paneId,
@@ -376,8 +392,12 @@ export class ObservabilityRpcServer {
376
392
  terminalId: live.terminalId,
377
393
  workspaceId: live.workspaceId,
378
394
  };
395
+ this.#assertConnectorBoundToPane(socket, live);
396
+ return presence;
379
397
  }
380
- catch {
398
+ catch (error) {
399
+ if (error instanceof ConnectorPaneMismatchError)
400
+ throw error;
381
401
  if (!indexed)
382
402
  throw new Error("Herdr pane is not indexed yet");
383
403
  if (indexed.workspaceId !== input.workspaceId) {
@@ -386,6 +406,31 @@ export class ObservabilityRpcServer {
386
406
  throw new Error("Herdr pane has no terminal identity");
387
407
  }
388
408
  }
409
+ async #tryPaneIdentity(socketPath, paneId) {
410
+ try {
411
+ return await this.#resolvePaneIdentity({ paneId, socketPath });
412
+ }
413
+ catch {
414
+ return undefined;
415
+ }
416
+ }
417
+ #assertConnectorBoundToPane(socket, pane) {
418
+ const paneCwd = pane?.cwd ?? pane?.foregroundCwd;
419
+ if (!pane || !paneCwd) {
420
+ console.warn("Herdsman could not resolve Herdr pane cwd for connector binding");
421
+ return;
422
+ }
423
+ const peerPid = this.#peerPidOf(socket);
424
+ if (peerPid === undefined) {
425
+ console.warn("Herdsman could not read UDS peer pid for pane binding");
426
+ return;
427
+ }
428
+ const bound = (pane.cwd !== undefined && peerBoundToPaneCwd(peerPid, pane.cwd)) ||
429
+ (pane.foregroundCwd !== undefined && peerBoundToPaneCwd(peerPid, pane.foregroundCwd));
430
+ if (!bound) {
431
+ throw new ConnectorPaneMismatchError();
432
+ }
433
+ }
389
434
  #connectionState(presence) {
390
435
  const state = this.#orchestrator.status(presence);
391
436
  const context = state?.owner?.terminalId === presence.terminalId
@@ -393,7 +438,10 @@ export class ObservabilityRpcServer {
393
438
  : null;
394
439
  return {
395
440
  context,
396
- events: this.#orchestrator.pending({ ...presence, limit: 100 }),
441
+ events: this.#orchestrator.pending({
442
+ ...presence,
443
+ limit: 100,
444
+ }),
397
445
  presence,
398
446
  state: state ? toWireState(state) : null,
399
447
  };
@@ -572,6 +620,12 @@ export class ObservabilityRpcServer {
572
620
  throw new Error("agent scope requires current Herdr workspace, --workspace, --session, or --all");
573
621
  }
574
622
  }
623
+ class ConnectorPaneMismatchError extends Error {
624
+ constructor() {
625
+ super("Connector process does not match Herdr pane");
626
+ this.name = "ConnectorPaneMismatchError";
627
+ }
628
+ }
575
629
  function historyInput(agent) {
576
630
  return {
577
631
  agent: agent.agent,
@@ -579,6 +633,7 @@ function historyInput(agent) {
579
633
  cwd: agent.cwd,
580
634
  firstSeenAtMs: agent.firstSeenAt.getTime(),
581
635
  foregroundCwd: agent.foregroundCwd,
636
+ herdrSessionName: agent.herdrSessionName,
582
637
  };
583
638
  }
584
639
  function assertSchema(schema, value) {