@dorokuma/herdsman 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/LICENSE +23 -0
  2. package/README.ja.md +143 -0
  3. package/README.md +150 -0
  4. package/dist/drizzle.config.d.ts +3 -0
  5. package/dist/drizzle.config.d.ts.map +1 -0
  6. package/dist/drizzle.config.js +7 -0
  7. package/dist/drizzle.config.js.map +1 -0
  8. package/dist/src/agent-history/claude-reader.d.ts +10 -0
  9. package/dist/src/agent-history/claude-reader.d.ts.map +1 -0
  10. package/dist/src/agent-history/claude-reader.js +90 -0
  11. package/dist/src/agent-history/claude-reader.js.map +1 -0
  12. package/dist/src/agent-history/codex-reader.d.ts +10 -0
  13. package/dist/src/agent-history/codex-reader.d.ts.map +1 -0
  14. package/dist/src/agent-history/codex-reader.js +119 -0
  15. package/dist/src/agent-history/codex-reader.js.map +1 -0
  16. package/dist/src/agent-history/discovery.d.ts +13 -0
  17. package/dist/src/agent-history/discovery.d.ts.map +1 -0
  18. package/dist/src/agent-history/discovery.js +220 -0
  19. package/dist/src/agent-history/discovery.js.map +1 -0
  20. package/dist/src/agent-history/gemini-reader.d.ts +10 -0
  21. package/dist/src/agent-history/gemini-reader.d.ts.map +1 -0
  22. package/dist/src/agent-history/gemini-reader.js +96 -0
  23. package/dist/src/agent-history/gemini-reader.js.map +1 -0
  24. package/dist/src/agent-history/opencode-reader.d.ts +10 -0
  25. package/dist/src/agent-history/opencode-reader.d.ts.map +1 -0
  26. package/dist/src/agent-history/opencode-reader.js +90 -0
  27. package/dist/src/agent-history/opencode-reader.js.map +1 -0
  28. package/dist/src/agent-history/pi-reader.d.ts +10 -0
  29. package/dist/src/agent-history/pi-reader.d.ts.map +1 -0
  30. package/dist/src/agent-history/pi-reader.js +59 -0
  31. package/dist/src/agent-history/pi-reader.js.map +1 -0
  32. package/dist/src/agent-history/readers.d.ts +16 -0
  33. package/dist/src/agent-history/readers.d.ts.map +1 -0
  34. package/dist/src/agent-history/readers.js +45 -0
  35. package/dist/src/agent-history/readers.js.map +1 -0
  36. package/dist/src/agent-history/service.d.ts +43 -0
  37. package/dist/src/agent-history/service.d.ts.map +1 -0
  38. package/dist/src/agent-history/service.js +124 -0
  39. package/dist/src/agent-history/service.js.map +1 -0
  40. package/dist/src/agent-history/text.d.ts +10 -0
  41. package/dist/src/agent-history/text.d.ts.map +1 -0
  42. package/dist/src/agent-history/text.js +64 -0
  43. package/dist/src/agent-history/text.js.map +1 -0
  44. package/dist/src/agent-history/tool-compaction.d.ts +8 -0
  45. package/dist/src/agent-history/tool-compaction.d.ts.map +1 -0
  46. package/dist/src/agent-history/tool-compaction.js +134 -0
  47. package/dist/src/agent-history/tool-compaction.js.map +1 -0
  48. package/dist/src/cli/herdsman-daemon.d.ts +3 -0
  49. package/dist/src/cli/herdsman-daemon.d.ts.map +1 -0
  50. package/dist/src/cli/herdsman-daemon.js +18 -0
  51. package/dist/src/cli/herdsman-daemon.js.map +1 -0
  52. package/dist/src/cli/herdsman.d.ts +42 -0
  53. package/dist/src/cli/herdsman.d.ts.map +1 -0
  54. package/dist/src/cli/herdsman.js +338 -0
  55. package/dist/src/cli/herdsman.js.map +1 -0
  56. package/dist/src/config/load.d.ts +14 -0
  57. package/dist/src/config/load.d.ts.map +1 -0
  58. package/dist/src/config/load.js +28 -0
  59. package/dist/src/config/load.js.map +1 -0
  60. package/dist/src/config/runtime.d.ts +40 -0
  61. package/dist/src/config/runtime.d.ts.map +1 -0
  62. package/dist/src/config/runtime.js +111 -0
  63. package/dist/src/config/runtime.js.map +1 -0
  64. package/dist/src/config/schema.d.ts +25 -0
  65. package/dist/src/config/schema.d.ts.map +1 -0
  66. package/dist/src/config/schema.js +26 -0
  67. package/dist/src/config/schema.js.map +1 -0
  68. package/dist/src/daemon/client.d.ts +9 -0
  69. package/dist/src/daemon/client.d.ts.map +1 -0
  70. package/dist/src/daemon/client.js +51 -0
  71. package/dist/src/daemon/client.js.map +1 -0
  72. package/dist/src/daemon/herdr-session-watch-manager.d.ts +33 -0
  73. package/dist/src/daemon/herdr-session-watch-manager.d.ts.map +1 -0
  74. package/dist/src/daemon/herdr-session-watch-manager.js +245 -0
  75. package/dist/src/daemon/herdr-session-watch-manager.js.map +1 -0
  76. package/dist/src/daemon/observability-server.d.ts +60 -0
  77. package/dist/src/daemon/observability-server.d.ts.map +1 -0
  78. package/dist/src/daemon/observability-server.js +501 -0
  79. package/dist/src/daemon/observability-server.js.map +1 -0
  80. package/dist/src/daemon/process-manager.d.ts +80 -0
  81. package/dist/src/daemon/process-manager.d.ts.map +1 -0
  82. package/dist/src/daemon/process-manager.js +178 -0
  83. package/dist/src/daemon/process-manager.js.map +1 -0
  84. package/dist/src/daemon/service.d.ts +5 -0
  85. package/dist/src/daemon/service.d.ts.map +1 -0
  86. package/dist/src/daemon/service.js +104 -0
  87. package/dist/src/daemon/service.js.map +1 -0
  88. package/dist/src/db/agent-context-snapshots.d.ts +11 -0
  89. package/dist/src/db/agent-context-snapshots.d.ts.map +1 -0
  90. package/dist/src/db/agent-context-snapshots.js +129 -0
  91. package/dist/src/db/agent-context-snapshots.js.map +1 -0
  92. package/dist/src/db/agent-events.d.ts +54 -0
  93. package/dist/src/db/agent-events.d.ts.map +1 -0
  94. package/dist/src/db/agent-events.js +124 -0
  95. package/dist/src/db/agent-events.js.map +1 -0
  96. package/dist/src/db/agent-history-cache.d.ts +31 -0
  97. package/dist/src/db/agent-history-cache.d.ts.map +1 -0
  98. package/dist/src/db/agent-history-cache.js +46 -0
  99. package/dist/src/db/agent-history-cache.js.map +1 -0
  100. package/dist/src/db/agent-orchestrator-scopes.d.ts +40 -0
  101. package/dist/src/db/agent-orchestrator-scopes.d.ts.map +1 -0
  102. package/dist/src/db/agent-orchestrator-scopes.js +148 -0
  103. package/dist/src/db/agent-orchestrator-scopes.js.map +1 -0
  104. package/dist/src/db/agents.d.ts +34 -0
  105. package/dist/src/db/agents.d.ts.map +1 -0
  106. package/dist/src/db/agents.js +295 -0
  107. package/dist/src/db/agents.js.map +1 -0
  108. package/dist/src/db/apply-migrations.d.ts +4 -0
  109. package/dist/src/db/apply-migrations.d.ts.map +1 -0
  110. package/dist/src/db/apply-migrations.js +37 -0
  111. package/dist/src/db/apply-migrations.js.map +1 -0
  112. package/dist/src/db/client.d.ts +5 -0
  113. package/dist/src/db/client.d.ts.map +1 -0
  114. package/dist/src/db/client.js +6 -0
  115. package/dist/src/db/client.js.map +1 -0
  116. package/dist/src/db/herdr-sessions.d.ts +18 -0
  117. package/dist/src/db/herdr-sessions.d.ts.map +1 -0
  118. package/dist/src/db/herdr-sessions.js +67 -0
  119. package/dist/src/db/herdr-sessions.js.map +1 -0
  120. package/dist/src/db/herdr-workspaces.d.ts +14 -0
  121. package/dist/src/db/herdr-workspaces.d.ts.map +1 -0
  122. package/dist/src/db/herdr-workspaces.js +53 -0
  123. package/dist/src/db/herdr-workspaces.js.map +1 -0
  124. package/dist/src/db/migrate.d.ts +2 -0
  125. package/dist/src/db/migrate.d.ts.map +1 -0
  126. package/dist/src/db/migrate.js +8 -0
  127. package/dist/src/db/migrate.js.map +1 -0
  128. package/dist/src/db/schema.d.ts +1258 -0
  129. package/dist/src/db/schema.d.ts.map +1 -0
  130. package/dist/src/db/schema.js +102 -0
  131. package/dist/src/db/schema.js.map +1 -0
  132. package/dist/src/herdr/pane-identity-resolver.d.ts +14 -0
  133. package/dist/src/herdr/pane-identity-resolver.d.ts.map +1 -0
  134. package/dist/src/herdr/pane-identity-resolver.js +34 -0
  135. package/dist/src/herdr/pane-identity-resolver.js.map +1 -0
  136. package/dist/src/herdr/session-list.d.ts +14 -0
  137. package/dist/src/herdr/session-list.d.ts.map +1 -0
  138. package/dist/src/herdr/session-list.js +44 -0
  139. package/dist/src/herdr/session-list.js.map +1 -0
  140. package/dist/src/herdr/session-snapshot.d.ts +10 -0
  141. package/dist/src/herdr/session-snapshot.d.ts.map +1 -0
  142. package/dist/src/herdr/session-snapshot.js +19 -0
  143. package/dist/src/herdr/session-snapshot.js.map +1 -0
  144. package/dist/src/herdr/socket-client.d.ts +19 -0
  145. package/dist/src/herdr/socket-client.d.ts.map +1 -0
  146. package/dist/src/herdr/socket-client.js +230 -0
  147. package/dist/src/herdr/socket-client.js.map +1 -0
  148. package/dist/src/observability/agent-context-service.d.ts +29 -0
  149. package/dist/src/observability/agent-context-service.d.ts.map +1 -0
  150. package/dist/src/observability/agent-context-service.js +170 -0
  151. package/dist/src/observability/agent-context-service.js.map +1 -0
  152. package/dist/src/observability/agent-index-service.d.ts +60 -0
  153. package/dist/src/observability/agent-index-service.d.ts.map +1 -0
  154. package/dist/src/observability/agent-index-service.js +376 -0
  155. package/dist/src/observability/agent-index-service.js.map +1 -0
  156. package/dist/src/observability/agent-orchestrator-service.d.ts +42 -0
  157. package/dist/src/observability/agent-orchestrator-service.d.ts.map +1 -0
  158. package/dist/src/observability/agent-orchestrator-service.js +95 -0
  159. package/dist/src/observability/agent-orchestrator-service.js.map +1 -0
  160. package/dist/src/observability/contracts.d.ts +161 -0
  161. package/dist/src/observability/contracts.d.ts.map +1 -0
  162. package/dist/src/observability/contracts.js +10 -0
  163. package/dist/src/observability/contracts.js.map +1 -0
  164. package/dist/src/observability/schemas.d.ts +49 -0
  165. package/dist/src/observability/schemas.d.ts.map +1 -0
  166. package/dist/src/observability/schemas.js +47 -0
  167. package/dist/src/observability/schemas.js.map +1 -0
  168. package/dist/src/shared/json-lines.d.ts +7 -0
  169. package/dist/src/shared/json-lines.d.ts.map +1 -0
  170. package/dist/src/shared/json-lines.js +25 -0
  171. package/dist/src/shared/json-lines.js.map +1 -0
  172. package/drizzle/0000_rare_robin_chapel.sql +90 -0
  173. package/drizzle/0001_opposite_toxin.sql +13 -0
  174. package/drizzle/0002_worthless_energizer.sql +2 -0
  175. package/drizzle/0003_opposite_tarantula.sql +14 -0
  176. package/drizzle/0004_serious_lorna_dane.sql +1 -0
  177. package/drizzle/0005_pane_generation.sql +7 -0
  178. package/drizzle/meta/0000_snapshot.json +621 -0
  179. package/drizzle/meta/0001_snapshot.json +709 -0
  180. package/drizzle/meta/0002_snapshot.json +563 -0
  181. package/drizzle/meta/0003_snapshot.json +657 -0
  182. package/drizzle/meta/0004_snapshot.json +664 -0
  183. package/drizzle/meta/_journal.json +12 -0
  184. package/package.json +82 -0
@@ -0,0 +1,501 @@
1
+ import { existsSync, unlinkSync } from "node:fs";
2
+ import { createServer } from "node:net";
3
+ import { Value } from "@sinclair/typebox/value";
4
+ import { resolveHerdrPaneIdentity, } from "../herdr/pane-identity-resolver.js";
5
+ import { agentEventsInputSchema, agentGetInputSchema, agentListInputSchema, agentOrchestratorAckInputSchema, agentOrchestratorGetInputSchema, agentOrchestratorRegisterInputSchema, agentOrchestratorSetInputSchema, agentReadInputSchema, } from "../observability/schemas.js";
6
+ import { encodeJsonLine, JsonLineDecoder } from "../shared/json-lines.js";
7
+ export const DISCONNECT_GRACE_MS = 5_000;
8
+ export const STARTUP_RECONNECT_GRACE_MS = 10_000;
9
+ export class ObservabilityRpcServer {
10
+ #clearTimeout;
11
+ #context;
12
+ #connectionOrderBySocket = new Map();
13
+ #disconnectGraceMs;
14
+ #disconnectTimers = new Map();
15
+ #history;
16
+ #now;
17
+ #orchestrator;
18
+ #piPresenceBySocket = new Map();
19
+ #registerPiSessionRef;
20
+ #resolvePaneIdentity;
21
+ #server;
22
+ #setTimeout;
23
+ #socketPath;
24
+ #sockets = new Set();
25
+ #startupReconnectGraceMs;
26
+ #startupTimers = new Map();
27
+ #stores;
28
+ #connectionSequence = 0;
29
+ #stopping = false;
30
+ constructor(options) {
31
+ this.#clearTimeout = options.clearTimeout ?? clearTimeout;
32
+ this.#context = options.context;
33
+ this.#disconnectGraceMs = options.disconnectGraceMs ?? DISCONNECT_GRACE_MS;
34
+ this.#history = options.history;
35
+ this.#now = options.now ?? Date.now;
36
+ this.#orchestrator = options.orchestrator;
37
+ this.#registerPiSessionRef =
38
+ options.registerPiSessionRef ?? (async () => ({ contextChangedScopes: [] }));
39
+ this.#resolvePaneIdentity = options.resolvePaneIdentity ?? resolveHerdrPaneIdentity;
40
+ this.#setTimeout = options.setTimeout ?? setTimeout;
41
+ this.#socketPath = options.socketPath;
42
+ this.#startupReconnectGraceMs = options.startupReconnectGraceMs ?? STARTUP_RECONNECT_GRACE_MS;
43
+ this.#stores = options.stores;
44
+ this.#server = createServer((socket) => this.#handleConnection(socket));
45
+ }
46
+ async start() {
47
+ this.#stopping = false;
48
+ if (existsSync(this.#socketPath))
49
+ unlinkSync(this.#socketPath);
50
+ await new Promise((resolve, reject) => {
51
+ this.#server.once("error", reject);
52
+ this.#server.listen(this.#socketPath, () => {
53
+ this.#server.off("error", reject);
54
+ resolve();
55
+ });
56
+ });
57
+ this.#armStartupGrace();
58
+ }
59
+ async stop() {
60
+ this.#stopping = true;
61
+ this.#clearGraceTimers(this.#disconnectTimers);
62
+ this.#clearGraceTimers(this.#startupTimers);
63
+ for (const socket of this.#sockets)
64
+ socket.destroy();
65
+ this.#sockets.clear();
66
+ this.#piPresenceBySocket.clear();
67
+ this.#connectionOrderBySocket.clear();
68
+ await new Promise((resolve, reject) => {
69
+ if (!this.#server.listening) {
70
+ resolve();
71
+ return;
72
+ }
73
+ this.#server.close((error) => (error ? reject(error) : resolve()));
74
+ });
75
+ if (existsSync(this.#socketPath))
76
+ unlinkSync(this.#socketPath);
77
+ }
78
+ publishAgentContext(scope) {
79
+ const owner = this.#orchestrator.status(scope)?.owner;
80
+ if (!owner)
81
+ return;
82
+ const socket = this.#newestSocketForTerminal({ ...scope, terminalId: owner.terminalId });
83
+ if (!socket)
84
+ return;
85
+ const context = this.#context.workspaceSnapshot({
86
+ ...scope,
87
+ excludeTerminalId: owner.terminalId,
88
+ });
89
+ this.#write(socket, {
90
+ method: "agent.context.changed",
91
+ params: { context, herdrSessionName: scope.herdrSessionName, workspaceId: scope.workspaceId },
92
+ });
93
+ }
94
+ publishAgentEvent(event) {
95
+ if (!event.workspaceId || !event.terminalId)
96
+ return;
97
+ const scope = { herdrSessionName: event.herdrSessionName, workspaceId: event.workspaceId };
98
+ const owner = this.#orchestrator.status(scope)?.owner;
99
+ if (!owner || event.terminalId === owner.terminalId)
100
+ return;
101
+ const socket = this.#newestSocketForTerminal({ ...scope, terminalId: owner.terminalId });
102
+ if (socket)
103
+ this.#write(socket, { method: "agent.event", params: { event } });
104
+ }
105
+ reconcileAgentLocations(input) {
106
+ const byTerminal = new Map(input.agents.flatMap((agent) => agent.terminalId ? [[agent.terminalId, agent]] : []));
107
+ const owners = this.#orchestrator
108
+ .persistedOwners()
109
+ .filter((state) => state.herdrSessionName === input.herdrSessionName);
110
+ for (const [socket, presence] of this.#piPresenceBySocket) {
111
+ if (presence.herdrSessionName !== input.herdrSessionName)
112
+ continue;
113
+ const agent = byTerminal.get(presence.terminalId);
114
+ // Missing terminal owners are retained until an explicit disconnect/release; this refresh only relocates known agents.
115
+ if (!agent)
116
+ continue;
117
+ this.#piPresenceBySocket.set(socket, {
118
+ ...presence,
119
+ paneId: agent.paneId,
120
+ workspaceId: agent.workspaceId,
121
+ });
122
+ }
123
+ for (const ownerState of owners) {
124
+ const owner = ownerState.owner;
125
+ if (!owner)
126
+ continue;
127
+ const current = this.#orchestrator.status(ownerState);
128
+ if (current?.owner?.terminalId !== owner.terminalId)
129
+ continue;
130
+ const agent = byTerminal.get(owner.terminalId);
131
+ // Missing terminal owners are retained until an explicit disconnect/release; this refresh only relocates known agents.
132
+ if (!agent)
133
+ continue;
134
+ if (agent.workspaceId === ownerState.workspaceId) {
135
+ if (agent.paneId === owner.paneId)
136
+ continue;
137
+ const change = this.#orchestrator.claim({
138
+ ...ownerState,
139
+ paneId: agent.paneId,
140
+ terminalId: owner.terminalId,
141
+ });
142
+ this.#publishOrchestratorChange(toWireChange({ ...change, reason: "moved" }));
143
+ continue;
144
+ }
145
+ const changes = this.#orchestrator.move({
146
+ from: ownerState,
147
+ paneId: agent.paneId,
148
+ terminalId: owner.terminalId,
149
+ to: {
150
+ herdrSessionName: input.herdrSessionName,
151
+ workspaceId: agent.workspaceId,
152
+ },
153
+ });
154
+ for (const change of changes) {
155
+ this.#publishOrchestratorChange(toWireChange(change));
156
+ }
157
+ }
158
+ }
159
+ #handleConnection(socket) {
160
+ this.#sockets.add(socket);
161
+ this.#connectionSequence += 1;
162
+ this.#connectionOrderBySocket.set(socket, this.#connectionSequence);
163
+ const decoder = new JsonLineDecoder();
164
+ socket.on("data", (chunk) => {
165
+ for (const message of decoder.push(chunk.toString("utf8"))) {
166
+ void this.#handleRequest(socket, message);
167
+ }
168
+ });
169
+ socket.on("close", () => this.#handleSocketClose(socket));
170
+ socket.on("error", () => undefined);
171
+ }
172
+ async #handleRequest(socket, request) {
173
+ try {
174
+ if (!request.method)
175
+ throw new Error("Missing method");
176
+ const result = await this.#dispatch(socket, request.method, request.params ?? {});
177
+ this.#write(socket, { id: request.id, result });
178
+ }
179
+ catch (error) {
180
+ this.#write(socket, {
181
+ error: { message: error instanceof Error ? error.message : String(error) },
182
+ id: request.id,
183
+ });
184
+ }
185
+ }
186
+ async #dispatch(socket, method, params) {
187
+ switch (method) {
188
+ case "agent.list": {
189
+ assertSchema(agentListInputSchema, params);
190
+ const scope = this.#resolveScope(params);
191
+ return { agents: this.#context.listAgents(scope) };
192
+ }
193
+ case "agent.get": {
194
+ assertSchema(agentGetInputSchema, params);
195
+ const input = params;
196
+ const scope = this.#resolveScope(input);
197
+ const agent = this.#stores.agents.resolveTarget(scope, input.target);
198
+ const preferredRef = this.#context.getAgentSnapshot(agent.id)?.historyRef;
199
+ const history = await this.#history.resolveCompactHistory(historyInput(agent), {
200
+ preferredRef: preferredRef ?? null,
201
+ });
202
+ return { agent: { ...agent, history: history.compactHistory } };
203
+ }
204
+ case "agent.read": {
205
+ assertSchema(agentReadInputSchema, params);
206
+ const input = params;
207
+ const scope = this.#resolveScope(input);
208
+ const agent = this.#stores.agents.resolveTarget(scope, input.target);
209
+ const preferredRef = this.#context.getAgentSnapshot(agent.id)?.historyRef;
210
+ const read = await this.#history.read(historyInput(agent), {
211
+ limit: input.limit ?? 20,
212
+ preferredRef: preferredRef ?? null,
213
+ });
214
+ return { agent: { ...agent, historyRef: read.historyRef, messages: read.messages } };
215
+ }
216
+ case "agent.events": {
217
+ assertSchema(agentEventsInputSchema, params);
218
+ const input = params;
219
+ return { events: this.#stores.agentEvents.listAfter(input) };
220
+ }
221
+ case "agent.orchestrator.register": {
222
+ assertSchema(agentOrchestratorRegisterInputSchema, params);
223
+ const previous = this.#piPresenceBySocket.get(socket);
224
+ const presence = await this.#resolvePiPresence(params);
225
+ this.#piPresenceBySocket.set(socket, presence);
226
+ this.#cancelGraceForTerminal(presence);
227
+ if (previous && terminalPresenceKey(previous) !== terminalPresenceKey(presence)) {
228
+ this.#scheduleDisconnect(previous);
229
+ }
230
+ const registration = await this.#registerPiSessionRef({
231
+ herdrSessionName: presence.herdrSessionName,
232
+ sessionRef: params.sessionRef,
233
+ terminalId: presence.terminalId,
234
+ });
235
+ for (const scope of registration.contextChangedScopes)
236
+ this.publishAgentContext(scope);
237
+ return this.#connectionState(presence);
238
+ }
239
+ case "agent.orchestrator.get": {
240
+ assertSchema(agentOrchestratorGetInputSchema, params);
241
+ return this.#connectionState(this.#requirePiPresence(socket));
242
+ }
243
+ case "agent.orchestrator.set": {
244
+ assertSchema(agentOrchestratorSetInputSchema, params);
245
+ const presence = this.#requirePiPresence(socket);
246
+ const enabled = params.enabled;
247
+ let changed = false;
248
+ if (enabled) {
249
+ const change = this.#orchestrator.claim(presence);
250
+ changed = !sameOwner(change.current.owner, change.previous.owner);
251
+ if (changed)
252
+ this.#publishOrchestratorChange(toWireChange(change));
253
+ }
254
+ else {
255
+ const change = this.#orchestrator.release({
256
+ ...presence,
257
+ reason: "released",
258
+ });
259
+ changed = change !== undefined;
260
+ if (change)
261
+ this.#publishOrchestratorChange(toWireChange(change));
262
+ }
263
+ return { ...this.#connectionState(presence), changed };
264
+ }
265
+ case "agent.notifications.ack": {
266
+ assertSchema(agentOrchestratorAckInputSchema, params);
267
+ const presence = this.#requirePiPresence(socket);
268
+ const state = this.#orchestrator.ack({
269
+ ...presence,
270
+ eventId: params.eventId,
271
+ });
272
+ return { acknowledged: true, state: toWireState(state) };
273
+ }
274
+ default:
275
+ throw new Error(`Unknown method: ${method}`);
276
+ }
277
+ }
278
+ async #resolvePiPresence(input) {
279
+ const session = this.#stores.herdrSessions.findRunningBySocketPath(input.herdrSocketPath);
280
+ if (!session)
281
+ throw new Error("Herdr socket is not registered as a running session");
282
+ const indexed = this.#stores.agents.findByPane({
283
+ herdrSessionName: session.name,
284
+ paneId: input.paneId,
285
+ });
286
+ if (indexed?.workspaceId === input.workspaceId && indexed.terminalId) {
287
+ return {
288
+ connectedAt: this.#now(),
289
+ herdrSessionName: session.name,
290
+ paneId: indexed.paneId,
291
+ subscriberId: input.subscriberId,
292
+ terminalId: indexed.terminalId,
293
+ workspaceId: indexed.workspaceId,
294
+ };
295
+ }
296
+ try {
297
+ const live = await this.#resolvePaneIdentity({
298
+ paneId: input.paneId,
299
+ socketPath: session.socketPath,
300
+ });
301
+ return {
302
+ connectedAt: this.#now(),
303
+ herdrSessionName: session.name,
304
+ paneId: live.paneId,
305
+ subscriberId: input.subscriberId,
306
+ terminalId: live.terminalId,
307
+ workspaceId: live.workspaceId,
308
+ };
309
+ }
310
+ catch {
311
+ if (!indexed)
312
+ throw new Error("Herdr pane is not indexed yet");
313
+ if (indexed.workspaceId !== input.workspaceId) {
314
+ throw new Error("Pi presence workspace does not match indexed Herdr pane");
315
+ }
316
+ throw new Error("Herdr pane has no terminal identity");
317
+ }
318
+ }
319
+ #connectionState(presence) {
320
+ const state = this.#orchestrator.status(presence);
321
+ const context = state?.owner?.terminalId === presence.terminalId
322
+ ? this.#context.workspaceSnapshot({ ...presence, excludeTerminalId: presence.terminalId })
323
+ : null;
324
+ return {
325
+ context,
326
+ events: this.#orchestrator.pending({ ...presence, limit: 100 }),
327
+ presence,
328
+ state: state ? toWireState(state) : null,
329
+ };
330
+ }
331
+ #requirePiPresence(socket) {
332
+ const presence = this.#piPresenceBySocket.get(socket);
333
+ if (!presence)
334
+ throw new Error("Pi presence is not registered for this connection");
335
+ return presence;
336
+ }
337
+ #publishOrchestratorChange(change) {
338
+ for (const [socket, presence] of this.#piPresenceBySocket) {
339
+ if (sameScope(presence, change.previous) || sameScope(presence, change.current)) {
340
+ this.#write(socket, { method: "agent.orchestrator.changed", params: { change } });
341
+ }
342
+ }
343
+ }
344
+ #newestSocketForTerminal(input) {
345
+ let newest;
346
+ for (const [socket, presence] of this.#piPresenceBySocket) {
347
+ if (sameScope(presence, input) &&
348
+ presence.terminalId === input.terminalId &&
349
+ !socket.destroyed) {
350
+ const order = this.#connectionOrderBySocket.get(socket) ?? 0;
351
+ if (!newest || order > newest.order)
352
+ newest = { order, socket };
353
+ }
354
+ }
355
+ return newest?.socket;
356
+ }
357
+ #handleSocketClose(socket) {
358
+ if (!this.#sockets.delete(socket))
359
+ return;
360
+ this.#connectionOrderBySocket.delete(socket);
361
+ const presence = this.#piPresenceBySocket.get(socket);
362
+ this.#piPresenceBySocket.delete(socket);
363
+ if (!this.#stopping && presence)
364
+ this.#scheduleDisconnect(presence);
365
+ }
366
+ #scheduleDisconnect(presence) {
367
+ const key = terminalPresenceKey(presence);
368
+ if (this.#hasTerminalPresence(presence) || this.#disconnectTimers.has(key))
369
+ return;
370
+ const handle = this.#setTimeout(() => {
371
+ this.#disconnectTimers.delete(key);
372
+ if (this.#stopping || this.#hasTerminalPresence(presence))
373
+ return;
374
+ this.#releaseCurrentOwnersForTerminal({
375
+ ...presence,
376
+ reason: "disconnected",
377
+ });
378
+ }, this.#disconnectGraceMs);
379
+ this.#disconnectTimers.set(key, { handle });
380
+ }
381
+ #armStartupGrace() {
382
+ for (const state of this.#orchestrator.persistedOwners()) {
383
+ if (!state.owner)
384
+ continue;
385
+ const key = terminalPresenceKey({ ...state, terminalId: state.owner.terminalId });
386
+ const handle = this.#setTimeout(() => {
387
+ this.#startupTimers.delete(key);
388
+ if (this.#stopping ||
389
+ this.#hasTerminalPresence({ ...state, terminalId: state.owner?.terminalId ?? "" })) {
390
+ return;
391
+ }
392
+ this.#releaseCurrentOwnersForTerminal({
393
+ herdrSessionName: state.herdrSessionName,
394
+ reason: "startup_timeout",
395
+ terminalId: state.owner?.terminalId ?? "",
396
+ });
397
+ }, this.#startupReconnectGraceMs);
398
+ this.#startupTimers.set(key, { handle });
399
+ }
400
+ }
401
+ #releaseCurrentOwnersForTerminal(input) {
402
+ const owners = this.#orchestrator
403
+ .persistedOwners()
404
+ .filter((state) => state.herdrSessionName === input.herdrSessionName &&
405
+ state.owner?.terminalId === input.terminalId);
406
+ for (const owner of owners) {
407
+ const change = this.#orchestrator.release({
408
+ ...owner,
409
+ reason: input.reason,
410
+ terminalId: input.terminalId,
411
+ });
412
+ if (change)
413
+ this.#publishOrchestratorChange(toWireChange(change));
414
+ }
415
+ }
416
+ #cancelGraceForTerminal(presence) {
417
+ const key = terminalPresenceKey(presence);
418
+ this.#cancelTimer(this.#disconnectTimers, key);
419
+ this.#cancelTimer(this.#startupTimers, key);
420
+ }
421
+ #hasTerminalPresence(input) {
422
+ for (const presence of this.#piPresenceBySocket.values()) {
423
+ if (presence.herdrSessionName === input.herdrSessionName &&
424
+ presence.terminalId === input.terminalId) {
425
+ return true;
426
+ }
427
+ }
428
+ return false;
429
+ }
430
+ #cancelTimer(registry, key) {
431
+ const timer = registry.get(key);
432
+ if (!timer)
433
+ return;
434
+ this.#clearTimeout(timer.handle);
435
+ registry.delete(key);
436
+ }
437
+ #clearGraceTimers(registry) {
438
+ for (const timer of registry.values())
439
+ this.#clearTimeout(timer.handle);
440
+ registry.clear();
441
+ }
442
+ #write(socket, message) {
443
+ if (!socket.destroyed)
444
+ socket.write(encodeJsonLine(message));
445
+ }
446
+ #resolveScope(input) {
447
+ if (input.all)
448
+ return {
449
+ all: true,
450
+ ...(input.herdrSessionName ? { herdrSessionName: input.herdrSessionName } : {}),
451
+ };
452
+ if (input.workspaceId && !input.herdrSessionName) {
453
+ const sessions = new Set(this.#stores.agents
454
+ .list({ workspaceId: input.workspaceId })
455
+ .map((agent) => agent.herdrSessionName));
456
+ if (sessions.size > 1) {
457
+ throw new Error(`workspace ${input.workspaceId} exists in multiple Herdr sessions; pass --session <name>: ${[...sessions].join(", ")}`);
458
+ }
459
+ }
460
+ if (input.workspaceId || input.herdrSessionName) {
461
+ return {
462
+ ...(input.herdrSessionName ? { herdrSessionName: input.herdrSessionName } : {}),
463
+ ...(input.workspaceId ? { workspaceId: input.workspaceId } : {}),
464
+ };
465
+ }
466
+ throw new Error("agent scope requires current Herdr workspace, --workspace, --session, or --all");
467
+ }
468
+ }
469
+ function historyInput(agent) {
470
+ return {
471
+ agent: agent.agent,
472
+ agentSession: agent.agentSession,
473
+ cwd: agent.cwd,
474
+ firstSeenAtMs: agent.firstSeenAt.getTime(),
475
+ foregroundCwd: agent.foregroundCwd,
476
+ };
477
+ }
478
+ function assertSchema(schema, value) {
479
+ if (!Value.Check(schema, value))
480
+ throw new Error("Invalid RPC params");
481
+ }
482
+ function toWireState(state) {
483
+ return { ...state, updatedAt: state.updatedAt.toISOString() };
484
+ }
485
+ function toWireChange(change) {
486
+ return {
487
+ current: toWireState(change.current),
488
+ previous: toWireState(change.previous),
489
+ reason: change.reason,
490
+ };
491
+ }
492
+ function sameScope(left, right) {
493
+ return left.herdrSessionName === right.herdrSessionName && left.workspaceId === right.workspaceId;
494
+ }
495
+ function sameOwner(left, right) {
496
+ return left?.terminalId === right?.terminalId && left?.paneId === right?.paneId;
497
+ }
498
+ function terminalPresenceKey(input) {
499
+ return `${input.herdrSessionName}\0${input.terminalId}`;
500
+ }
501
+ //# sourceMappingURL=observability-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-server.js","sourceRoot":"","sources":["../../../src/daemon/observability-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export type DaemonRuntimeRecord = {
2
+ dbPath: string;
3
+ homeDir: string;
4
+ logPath: string;
5
+ pid: number;
6
+ pidPath: string;
7
+ socketPath: string;
8
+ startedAt: string;
9
+ version: 1;
10
+ };
11
+ export type DaemonStatus = {
12
+ pidPath: string;
13
+ socketPath: string;
14
+ socketReachable: true;
15
+ stalePid?: number;
16
+ state: "orphaned";
17
+ } | {
18
+ pidPath: string;
19
+ socketPath: string;
20
+ state: "stopped";
21
+ stalePid?: number;
22
+ } | {
23
+ pid: number;
24
+ pidPath: string;
25
+ socketPath: string;
26
+ socketReachable: boolean;
27
+ state: "running";
28
+ };
29
+ type DaemonSpawnProcess = (command: string, args: string[], options: {
30
+ detached: boolean;
31
+ env: NodeJS.ProcessEnv;
32
+ stdio: ["ignore", number, number];
33
+ }) => {
34
+ pid: number | undefined;
35
+ unref(): void;
36
+ };
37
+ export type DaemonProcessDependencies = {
38
+ connectSocket?: (socketPath: string) => Promise<boolean>;
39
+ isProcessRunning?: (pid: number) => boolean;
40
+ killProcess?: (pid: number, signal: NodeJS.Signals) => void;
41
+ spawnProcess?: DaemonSpawnProcess;
42
+ waitMs?: (ms: number) => Promise<void>;
43
+ };
44
+ export declare function readDaemonRuntimeRecord(path: string): DaemonRuntimeRecord | undefined;
45
+ export declare function writeDaemonRuntimeRecord(path: string, record: DaemonRuntimeRecord): void;
46
+ export declare function prepareDaemonSocketPath(input: {
47
+ deps?: DaemonProcessDependencies;
48
+ socketPath: string;
49
+ }): Promise<void>;
50
+ export declare function getDaemonStatus(input: {
51
+ deps?: DaemonProcessDependencies;
52
+ pidPath: string;
53
+ socketPath: string;
54
+ }): Promise<DaemonStatus>;
55
+ export declare function startDaemonProcess(input: {
56
+ deps?: DaemonProcessDependencies;
57
+ entrypointPath: string;
58
+ env: NodeJS.ProcessEnv;
59
+ logPath: string;
60
+ nodePath: string;
61
+ pidPath: string;
62
+ runtimeRecord: Omit<DaemonRuntimeRecord, "pid" | "startedAt" | "version">;
63
+ runtimeRecordPath: string;
64
+ socketPath: string;
65
+ }): Promise<{
66
+ pid: number;
67
+ }>;
68
+ export declare function stopDaemonProcess(input: {
69
+ deps?: DaemonProcessDependencies;
70
+ pidPath: string;
71
+ socketPath: string;
72
+ timeoutMs: number;
73
+ }): Promise<{
74
+ alreadyStopped: boolean;
75
+ pid?: number;
76
+ }>;
77
+ type ProcessProbe = (pid: number, signal: 0) => unknown;
78
+ export declare function isProcessRunning(pid: number, probe?: ProcessProbe): boolean;
79
+ export {};
80
+ //# sourceMappingURL=process-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../../src/daemon/process-manager.ts"],"names":[],"mappings":"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"}