@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,170 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { historySourceFromSessionRef } from "../agent-history/discovery.js";
3
+ import { emptyCompactHistory } from "../agent-history/service.js";
4
+ export class AgentContextService {
5
+ #history;
6
+ #stores;
7
+ constructor(options) {
8
+ this.#history = options.history;
9
+ this.#stores = options.stores;
10
+ }
11
+ async refreshAgent(input) {
12
+ const previous = this.#stores.agentContextSnapshots.get(input.agent.id);
13
+ const directAuthoritativeRef = pathHistoryRefFromAgent(input.agent);
14
+ const preferredRef = directAuthoritativeRef ??
15
+ matchingAuthoritativeIdRef(input.agent, previous?.historyRef ?? null) ??
16
+ (input.agent.agentSession ? null : (previous?.historyRef ?? null));
17
+ const forceDiscovery = await shouldForceDiscovery({
18
+ agent: input.agent,
19
+ directAuthoritativeRef,
20
+ identityChanged: input.identityChanged,
21
+ preferredRef,
22
+ previous,
23
+ });
24
+ const resolved = bindAuthoritativeId(input.agent, await this.#history.resolveCompactHistory(historyLookup(input.agent), {
25
+ forceDiscovery,
26
+ ...(preferredRef ? { preferredRef } : {}),
27
+ }));
28
+ const next = {
29
+ agentId: input.agent.id,
30
+ compactHistory: resolved.compactHistory,
31
+ historyRef: resolved.historyRef,
32
+ paneRevision: input.agent.paneRevision,
33
+ sourceFingerprint: resolved.sourceFingerprint,
34
+ };
35
+ if (previous && sameSnapshotPayload(previous, next)) {
36
+ return { changed: false, snapshot: previous };
37
+ }
38
+ return { changed: true, snapshot: this.#stores.agentContextSnapshots.put(next) };
39
+ }
40
+ getAgentSnapshot(agentId) {
41
+ return this.#stores.agentContextSnapshots.get(agentId);
42
+ }
43
+ listAgents(scope) {
44
+ const agents = this.#stores.agents.list(scope);
45
+ const snapshots = new Map(this.#stores.agentContextSnapshots
46
+ .listByAgentIds(agents.map((agent) => agent.id))
47
+ .map((snapshot) => [snapshot.agentId, snapshot]));
48
+ return agents.map((agent) => listItem(agent, snapshots.get(agent.id)?.compactHistory));
49
+ }
50
+ workspaceSnapshot(input) {
51
+ const agents = this.#stores.agents
52
+ .list({ herdrSessionName: input.herdrSessionName, workspaceId: input.workspaceId })
53
+ .filter((agent) => agent.terminalId !== input.excludeTerminalId);
54
+ const snapshots = this.#stores.agentContextSnapshots.listByAgentIds(agents.map((agent) => agent.id));
55
+ if (snapshots.length === 0)
56
+ return null;
57
+ const firstSnapshot = snapshots[0];
58
+ if (!firstSnapshot)
59
+ return null;
60
+ const byAgentId = new Map(snapshots.map((snapshot) => [snapshot.agentId, snapshot]));
61
+ const updatedAt = snapshots.reduce((latest, snapshot) => (snapshot.updatedAt > latest ? snapshot.updatedAt : latest), firstSnapshot.updatedAt);
62
+ return {
63
+ agents: agents.map((agent) => listItem(agent, byAgentId.get(agent.id)?.compactHistory)),
64
+ herdrSessionName: input.herdrSessionName,
65
+ updatedAt: updatedAt.toISOString(),
66
+ workspaceId: input.workspaceId,
67
+ };
68
+ }
69
+ }
70
+ async function shouldForceDiscovery(input) {
71
+ if (input.directAuthoritativeRef)
72
+ return false;
73
+ if (input.agent.agentSession?.kind === "id")
74
+ return input.preferredRef === null;
75
+ if (input.identityChanged || !input.previous?.historyRef)
76
+ return true;
77
+ if (paneRevisionDecreased(input.agent.paneRevision, input.previous.paneRevision))
78
+ return true;
79
+ if (!paneRevisionIncreased(input.agent.paneRevision, input.previous.paneRevision))
80
+ return false;
81
+ const fingerprint = input.previous.sourceFingerprint;
82
+ if (!fingerprint)
83
+ return true;
84
+ const current = await sourceFingerprint(fingerprint.path);
85
+ return !current || sameFingerprint(fingerprint, current);
86
+ }
87
+ function pathHistoryRefFromAgent(agent) {
88
+ if (agent.agentSession?.kind !== "path")
89
+ return null;
90
+ return {
91
+ kind: "agent_session",
92
+ path: agent.agentSession.value,
93
+ source: historySourceFromSessionRef(agent.agentSession),
94
+ value: agent.agentSession.value,
95
+ };
96
+ }
97
+ function matchingAuthoritativeIdRef(agent, previous) {
98
+ const session = agent.agentSession;
99
+ if (session?.kind !== "id" ||
100
+ previous?.kind !== "agent_session" ||
101
+ !previous.path ||
102
+ previous.source !== historySourceFromSessionRef(session) ||
103
+ previous.value !== session.value) {
104
+ return null;
105
+ }
106
+ return previous;
107
+ }
108
+ function bindAuthoritativeId(agent, resolved) {
109
+ const session = agent.agentSession;
110
+ if (session?.kind !== "id" || !resolved.historyRef?.path)
111
+ return resolved;
112
+ const historyRef = {
113
+ kind: "agent_session",
114
+ path: resolved.historyRef.path,
115
+ source: historySourceFromSessionRef(session),
116
+ value: session.value,
117
+ };
118
+ return {
119
+ ...resolved,
120
+ compactHistory: { ...resolved.compactHistory, historyRef },
121
+ historyRef,
122
+ };
123
+ }
124
+ function historyLookup(agent) {
125
+ return {
126
+ agent: agent.agent,
127
+ agentSession: agent.agentSession,
128
+ cwd: agent.cwd,
129
+ firstSeenAtMs: agent.firstSeenAt.getTime(),
130
+ foregroundCwd: agent.foregroundCwd,
131
+ };
132
+ }
133
+ async function sourceFingerprint(path) {
134
+ const source = await stat(path).catch(() => null);
135
+ return source ? { mtimeMs: Math.trunc(source.mtimeMs), path, size: source.size } : null;
136
+ }
137
+ function paneRevisionIncreased(current, previous) {
138
+ return current !== null && previous !== null && current > previous;
139
+ }
140
+ function paneRevisionDecreased(current, previous) {
141
+ return current !== null && previous !== null && current < previous;
142
+ }
143
+ function sameSnapshotPayload(previous, next) {
144
+ return (JSON.stringify(previous.compactHistory) === JSON.stringify(next.compactHistory) &&
145
+ sameHistoryRef(previous.historyRef, next.historyRef) &&
146
+ sameFingerprint(previous.sourceFingerprint, next.sourceFingerprint) &&
147
+ previous.paneRevision === next.paneRevision);
148
+ }
149
+ function sameFingerprint(left, right) {
150
+ return (left?.path === right?.path && left?.mtimeMs === right?.mtimeMs && left?.size === right?.size);
151
+ }
152
+ function sameHistoryRef(left, right) {
153
+ return (left?.kind === right?.kind &&
154
+ left?.path === right?.path &&
155
+ left?.source === right?.source &&
156
+ left?.value === right?.value);
157
+ }
158
+ function listItem(agent, compactHistory) {
159
+ const compact = compactHistory ?? emptyCompactHistory();
160
+ return {
161
+ ...agent,
162
+ history: {
163
+ lastAssistantMessage: compact.lastAssistantMessage,
164
+ lastUserMessage: compact.lastUserMessage,
165
+ source: compact.source,
166
+ updatedAt: compact.updatedAt,
167
+ },
168
+ };
169
+ }
170
+ //# sourceMappingURL=agent-context-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-context-service.js","sourceRoot":"","sources":["../../../src/observability/agent-context-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { type AgentHistoryService } from "../agent-history/service.js";
2
+ import type { AgentEventStore } from "../db/agent-events.js";
3
+ import type { AgentHistoryCacheStore } from "../db/agent-history-cache.js";
4
+ import type { AgentStore } from "../db/agents.js";
5
+ import type { HerdrSessionStore } from "../db/herdr-sessions.js";
6
+ import type { HerdrWorkspaceStore } from "../db/herdr-workspaces.js";
7
+ import { HerdrSocketClient } from "../herdr/socket-client.js";
8
+ import { AgentContextService } from "../observability/agent-context-service.js";
9
+ import { type AgentEventRecord, type AgentIndexRecord, type AgentScope, type AgentSessionRef } from "../observability/contracts.js";
10
+ export type AgentIndexRefreshResult = {
11
+ agents: AgentIndexRecord[];
12
+ contextChangedScopes: AgentScope[];
13
+ events: AgentEventRecord[];
14
+ };
15
+ export type AgentEventHandlingResult = {
16
+ contextChangedScopes: AgentScope[];
17
+ events: AgentEventRecord[];
18
+ };
19
+ export type PiSessionRefRegistrationResult = {
20
+ agent: AgentIndexRecord | undefined;
21
+ contextChangedScopes: AgentScope[];
22
+ };
23
+ export type AgentIndexServiceStores = {
24
+ agentContextSnapshots?: ConstructorParameters<typeof AgentContextService>[0]["stores"]["agentContextSnapshots"];
25
+ agentEvents: AgentEventStore;
26
+ agentHistoryCache?: AgentHistoryCacheStore;
27
+ agents: AgentStore;
28
+ herdrSessions: HerdrSessionStore;
29
+ herdrWorkspaces: HerdrWorkspaceStore;
30
+ };
31
+ type RefreshInput = {
32
+ herdrSessionName: string;
33
+ sessionDir: string;
34
+ socketPath: string;
35
+ };
36
+ export declare class AgentIndexService {
37
+ #private;
38
+ constructor(options: {
39
+ clientFactory?: (input: {
40
+ socketPath: string;
41
+ }) => Pick<HerdrSocketClient, "close" | "sessionSnapshot">;
42
+ context?: AgentContextService;
43
+ history?: AgentHistoryService;
44
+ stores: AgentIndexServiceStores;
45
+ });
46
+ refreshHerdrSession(input: RefreshInput): Promise<AgentIndexRefreshResult>;
47
+ handleHerdrEvent(input: {
48
+ event: unknown;
49
+ herdrSessionName: string;
50
+ sessionDir: string;
51
+ socketPath: string;
52
+ }): Promise<AgentEventHandlingResult>;
53
+ registerPiSessionRef(input: {
54
+ herdrSessionName: string;
55
+ sessionRef: AgentSessionRef;
56
+ terminalId: string;
57
+ }): Promise<PiSessionRefRegistrationResult>;
58
+ }
59
+ export {};
60
+ //# sourceMappingURL=agent-index-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-index-service.d.ts","sourceRoot":"","sources":["../../../src/observability/agent-index-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,4BAA4B,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,eAAe,EAGrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,oBAAoB,EAAE,UAAU,EAAE,CAAC;IACnC,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,oBAAoB,EAAE,UAAU,EAAE,CAAC;IACnC,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,oBAAoB,EAAE,UAAU,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,qBAAqB,CAAC,EAAE,qBAAqB,CAC3C,OAAO,mBAAmB,CAC3B,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACxC,WAAW,EAAE,eAAe,CAAC;IAC7B,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IAC3C,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,iBAAiB,CAAC;IACjC,eAAe,EAAE,mBAAmB,CAAC;CACtC,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,iBAAiB;;gBAchB,OAAO,EAAE;QACnB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;YACtB,UAAU,EAAE,MAAM,CAAC;SACpB,KAAK,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,iBAAiB,CAAC,CAAC;QAC3D,OAAO,CAAC,EAAE,mBAAmB,CAAC;QAC9B,OAAO,CAAC,EAAE,mBAAmB,CAAC;QAC9B,MAAM,EAAE,uBAAuB,CAAC;KACjC;IAwBD,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiB1E,gBAAgB,CAAC,KAAK,EAAE;QACtB,KAAK,EAAE,OAAO,CAAC;QACf,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAOrC,oBAAoB,CAAC,KAAK,EAAE;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,eAAe,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,8BAA8B,CAAC;CAkR5C"}
@@ -0,0 +1,376 @@
1
+ import { createAgentHistoryService } from "../agent-history/service.js";
2
+ import { normalizeHerdrSessionSnapshot } from "../herdr/session-snapshot.js";
3
+ import { HerdrSocketClient } from "../herdr/socket-client.js";
4
+ import { AgentContextService } from "../observability/agent-context-service.js";
5
+ import { parseAgentStatus, } from "../observability/contracts.js";
6
+ export class AgentIndexService {
7
+ #clientFactory;
8
+ #context;
9
+ #stores;
10
+ #mutationEpochBySession = new Map();
11
+ #pendingPiSessionRefs = new Map();
12
+ #refreshInFlightBySession = new Map();
13
+ #sessionOperationTail = new Map();
14
+ constructor(options) {
15
+ this.#clientFactory = options.clientFactory ?? ((input) => new HerdrSocketClient(input));
16
+ this.#stores = options.stores;
17
+ if (options.context) {
18
+ this.#context = options.context;
19
+ }
20
+ else {
21
+ if (!options.stores.agentContextSnapshots) {
22
+ throw new Error("AgentIndexService requires context or agentContextSnapshots store");
23
+ }
24
+ const history = options.history ??
25
+ createAgentHistoryService({
26
+ ...(options.stores.agentHistoryCache ? { cache: options.stores.agentHistoryCache } : {}),
27
+ });
28
+ this.#context = new AgentContextService({
29
+ history,
30
+ stores: {
31
+ agentContextSnapshots: options.stores.agentContextSnapshots,
32
+ agents: options.stores.agents,
33
+ },
34
+ });
35
+ }
36
+ }
37
+ refreshHerdrSession(input) {
38
+ const epoch = this.#mutationEpochBySession.get(input.herdrSessionName) ?? 0;
39
+ const existing = this.#refreshInFlightBySession.get(input.herdrSessionName);
40
+ if (existing?.epoch === epoch)
41
+ return existing.promise;
42
+ const promise = this.#enqueueSessionOperation(input.herdrSessionName, () => this.#refreshHerdrSessionNow(input));
43
+ this.#refreshInFlightBySession.set(input.herdrSessionName, { epoch, promise });
44
+ const clear = () => {
45
+ if (this.#refreshInFlightBySession.get(input.herdrSessionName)?.promise === promise) {
46
+ this.#refreshInFlightBySession.delete(input.herdrSessionName);
47
+ }
48
+ };
49
+ void promise.then(clear, clear);
50
+ return promise;
51
+ }
52
+ handleHerdrEvent(input) {
53
+ this.#incrementMutationEpoch(input.herdrSessionName);
54
+ return this.#enqueueSessionOperation(input.herdrSessionName, () => this.#handleHerdrEventNow(input));
55
+ }
56
+ registerPiSessionRef(input) {
57
+ this.#incrementMutationEpoch(input.herdrSessionName);
58
+ return this.#enqueueSessionOperation(input.herdrSessionName, () => this.#registerPiSessionRefNow(input));
59
+ }
60
+ async #refreshHerdrSessionNow(input) {
61
+ const client = this.#clientFactory({ socketPath: input.socketPath });
62
+ try {
63
+ const previous = this.#stores.agents.listForHerdrSession(input.herdrSessionName);
64
+ const previousByPane = new Map(previous.map((agent) => [agent.paneId, agent]));
65
+ const previousByTerminal = new Map(previous.flatMap((agent) => agent.terminalId ? [[agent.terminalId, agent]] : []));
66
+ const snapshot = normalizeHerdrSessionSnapshot(await client.sessionSnapshot());
67
+ const revisionByPane = new Map(snapshot.panes.flatMap((pane) => {
68
+ const value = record(pane);
69
+ const paneId = stringValue(value.pane_id) ?? stringValue(value.paneId);
70
+ const revision = integerValue(value.revision);
71
+ return paneId && revision !== undefined ? [[paneId, revision]] : [];
72
+ }));
73
+ const snapshotAgents = snapshot.agents.map((agent) => withPaneRevision(agent, revisionByPane));
74
+ this.#stores.herdrSessions.upsertRunning({
75
+ name: input.herdrSessionName,
76
+ sessionDir: input.sessionDir,
77
+ socketPath: input.socketPath,
78
+ });
79
+ this.#stores.herdrWorkspaces.replaceForSession({
80
+ herdrSessionName: input.herdrSessionName,
81
+ workspaces: snapshot.workspaces.map(record),
82
+ });
83
+ const indexedAgents = this.#stores.agents.replaceForSession({
84
+ agents: snapshotAgents,
85
+ herdrSessionName: input.herdrSessionName,
86
+ });
87
+ const agents = indexedAgents.map((agent) => {
88
+ if (!agent.terminalId)
89
+ return agent;
90
+ const key = terminalSessionKey(input.herdrSessionName, agent.terminalId);
91
+ const pending = this.#pendingPiSessionRefs.get(key);
92
+ if (!pending)
93
+ return agent;
94
+ this.#pendingPiSessionRefs.delete(key);
95
+ return (this.#stores.agents.setSessionRefByTerminal({
96
+ agentSession: pending,
97
+ herdrSessionName: input.herdrSessionName,
98
+ terminalId: agent.terminalId,
99
+ }) ?? agent);
100
+ });
101
+ const scopes = new Map();
102
+ const events = [];
103
+ const currentIds = new Set(agents.map((agent) => agent.id));
104
+ for (const prior of previous) {
105
+ if (!currentIds.has(prior.id))
106
+ addScope(scopes, scopeOf(prior));
107
+ }
108
+ for (const agent of agents) {
109
+ const prior = matchingPrior(agent, previousByTerminal, previousByPane);
110
+ const identityChanged = !prior || !sameIdentity(prior, agent);
111
+ const metadataChanged = !prior || !sameContextMetadata(prior, agent);
112
+ const cached = this.#context.getAgentSnapshot(agent.id);
113
+ const dirty = !cached ||
114
+ agent.paneRevision === null ||
115
+ cached.paneRevision !== agent.paneRevision ||
116
+ identityChanged;
117
+ let refreshed = cached;
118
+ if (dirty) {
119
+ const result = await this.#context.refreshAgent({ agent, identityChanged });
120
+ refreshed = result.snapshot;
121
+ if (result.changed)
122
+ addScope(scopes, scopeOf(agent));
123
+ }
124
+ if (metadataChanged) {
125
+ if (prior && !sameScope(scopeOf(prior), scopeOf(agent)))
126
+ addScope(scopes, scopeOf(prior));
127
+ addScope(scopes, scopeOf(agent));
128
+ }
129
+ if (prior && prior.agentStatus !== agent.agentStatus) {
130
+ const event = this.#appendStatusEvents({
131
+ agent,
132
+ compactHistory: refreshed?.compactHistory ?? this.#context.getAgentSnapshot(agent.id)?.compactHistory,
133
+ from: prior.agentStatus,
134
+ to: agent.agentStatus,
135
+ });
136
+ if (event)
137
+ events.push(event);
138
+ addScope(scopes, scopeOf(agent));
139
+ }
140
+ }
141
+ return {
142
+ agents,
143
+ contextChangedScopes: sortedScopes(scopes),
144
+ events,
145
+ };
146
+ }
147
+ finally {
148
+ client.close();
149
+ }
150
+ }
151
+ async #handleHerdrEventNow(input) {
152
+ const event = record(input.event);
153
+ const paneId = stringValue(event.pane_id) ?? stringValue(event.paneId);
154
+ if (!paneId)
155
+ return { contextChangedScopes: [], events: [] };
156
+ if (event.type === "pane.closed") {
157
+ this.#stores.agentEvents.invalidatePane({ herdrSessionName: input.herdrSessionName, paneId });
158
+ return { contextChangedScopes: [], events: [] };
159
+ }
160
+ if (event.type !== "pane.agent_status_changed")
161
+ return { contextChangedScopes: [], events: [] };
162
+ let agent = this.#stores.agents.findByPane({
163
+ herdrSessionName: input.herdrSessionName,
164
+ paneId,
165
+ });
166
+ let recovered;
167
+ if (!agent) {
168
+ recovered = await this.#refreshHerdrSessionNow(input);
169
+ agent = this.#stores.agents.findByPane({ herdrSessionName: input.herdrSessionName, paneId });
170
+ }
171
+ if (!agent) {
172
+ return recovered
173
+ ? { contextChangedScopes: recovered.contextChangedScopes, events: recovered.events }
174
+ : { contextChangedScopes: [], events: [] };
175
+ }
176
+ const from = recovered ? "unknown" : agent.agentStatus;
177
+ const to = parseAgentStatus(event.agent_status);
178
+ const herdrEventKey = herdrInputIdempotencyKey(input.herdrSessionName, paneId, event, to);
179
+ const updated = this.#stores.agents.updateStatus({
180
+ agentStatus: to,
181
+ herdrSessionName: input.herdrSessionName,
182
+ paneId,
183
+ });
184
+ const current = updated ?? { ...agent, agentStatus: to };
185
+ const refreshed = await this.#context.refreshAgent({ agent: current, identityChanged: false });
186
+ const scopes = new Map();
187
+ for (const scope of recovered?.contextChangedScopes ?? [])
188
+ addScope(scopes, scope);
189
+ if (refreshed.changed || from !== to)
190
+ addScope(scopes, scopeOf(current));
191
+ const events = [...(recovered?.events ?? [])];
192
+ const equivalent = events.some((candidate) => candidate.agentId === current.id &&
193
+ candidate.type === statusEventType(to) &&
194
+ candidate.payload.to === to);
195
+ if (!equivalent) {
196
+ const statusEvent = this.#appendStatusEvents({
197
+ agent: current,
198
+ compactHistory: refreshed.snapshot.compactHistory,
199
+ from,
200
+ herdrEventKey,
201
+ to,
202
+ });
203
+ if (statusEvent)
204
+ events.push(statusEvent);
205
+ }
206
+ return { contextChangedScopes: sortedScopes(scopes), events };
207
+ }
208
+ async #registerPiSessionRefNow(input) {
209
+ const key = terminalSessionKey(input.herdrSessionName, input.terminalId);
210
+ const previous = this.#stores.agents.findByTerminal(input);
211
+ if (!previous) {
212
+ this.#pendingPiSessionRefs.set(key, input.sessionRef);
213
+ return { agent: undefined, contextChangedScopes: [] };
214
+ }
215
+ const agent = this.#stores.agents.setSessionRefByTerminal({
216
+ agentSession: input.sessionRef,
217
+ herdrSessionName: input.herdrSessionName,
218
+ terminalId: input.terminalId,
219
+ });
220
+ this.#pendingPiSessionRefs.delete(key);
221
+ if (!agent || sameAgentSession(previous.agentSession, agent.agentSession)) {
222
+ return { agent, contextChangedScopes: [] };
223
+ }
224
+ const refreshed = await this.#context.refreshAgent({ agent, identityChanged: true });
225
+ return {
226
+ agent,
227
+ contextChangedScopes: refreshed.changed ? [scopeOf(agent)] : [],
228
+ };
229
+ }
230
+ #incrementMutationEpoch(sessionName) {
231
+ this.#mutationEpochBySession.set(sessionName, (this.#mutationEpochBySession.get(sessionName) ?? 0) + 1);
232
+ }
233
+ #enqueueSessionOperation(sessionName, operation) {
234
+ const prior = this.#sessionOperationTail.get(sessionName) ?? Promise.resolve();
235
+ const result = prior.catch(() => undefined).then(operation);
236
+ const tail = result.then(() => undefined, () => undefined);
237
+ this.#sessionOperationTail.set(sessionName, tail);
238
+ void tail.finally(() => {
239
+ if (this.#sessionOperationTail.get(sessionName) === tail) {
240
+ this.#sessionOperationTail.delete(sessionName);
241
+ }
242
+ });
243
+ return result;
244
+ }
245
+ #appendStatusEvents(input) {
246
+ if (input.from === input.to || !input.compactHistory)
247
+ return undefined;
248
+ const latest = this.#stores.agentEvents.latestStatusTransition(input.agent.id, input.agent.herdrSessionName);
249
+ if (latest && statusTransitionMatches(latest, input.from, input.to))
250
+ return undefined;
251
+ const observationId = `transition:${latest?.id ?? 0}`;
252
+ let lastEvent = this.#stores.agentEvents.append({
253
+ agentId: input.agent.id,
254
+ compactHistory: input.compactHistory,
255
+ herdrSessionName: input.agent.herdrSessionName,
256
+ idempotencyKey: idempotencyKey("agent.status.changed", input.agent, input.from, input.to, `${observationId}:${input.herdrEventKey ?? "legacy"}:agent.status.changed`),
257
+ paneId: input.agent.paneId,
258
+ paneGeneration: input.agent.paneGeneration ?? null,
259
+ payload: payload(input.agent, input.from, input.to),
260
+ terminalId: input.agent.terminalId,
261
+ type: "agent.status.changed",
262
+ workspaceId: input.agent.workspaceId,
263
+ });
264
+ const statusType = statusEventType(input.to);
265
+ if (statusType) {
266
+ lastEvent = this.#stores.agentEvents.append({
267
+ agentId: input.agent.id,
268
+ compactHistory: input.compactHistory,
269
+ herdrSessionName: input.agent.herdrSessionName,
270
+ idempotencyKey: idempotencyKey(statusType, input.agent, input.from, input.to, `${observationId}:${input.herdrEventKey ?? "legacy"}:${statusType}`),
271
+ paneId: input.agent.paneId,
272
+ payload: payload(input.agent, input.from, input.to),
273
+ terminalId: input.agent.terminalId,
274
+ type: statusType,
275
+ workspaceId: input.agent.workspaceId,
276
+ });
277
+ }
278
+ return lastEvent;
279
+ }
280
+ }
281
+ function withPaneRevision(agent, revisionByPane) {
282
+ const raw = record(agent);
283
+ if (integerValue(raw.revision) !== undefined)
284
+ return raw;
285
+ const paneId = stringValue(raw.pane_id) ?? stringValue(raw.paneId);
286
+ const revision = paneId ? revisionByPane.get(paneId) : undefined;
287
+ return revision === undefined ? raw : { ...raw, revision };
288
+ }
289
+ function matchingPrior(agent, previousByTerminal, previousByPane) {
290
+ const terminalMatch = agent.terminalId ? previousByTerminal.get(agent.terminalId) : undefined;
291
+ const paneMatch = previousByPane.get(agent.paneId);
292
+ const canUsePaneFallback = paneMatch && (!agent.terminalId || !paneMatch.terminalId);
293
+ return terminalMatch ?? (canUsePaneFallback ? paneMatch : undefined);
294
+ }
295
+ function sameIdentity(left, right) {
296
+ return (left.agent === right.agent &&
297
+ left.terminalId === right.terminalId &&
298
+ left.cwd === right.cwd &&
299
+ left.foregroundCwd === right.foregroundCwd &&
300
+ sameAgentSession(left.agentSession, right.agentSession));
301
+ }
302
+ function sameContextMetadata(left, right) {
303
+ return (sameIdentity(left, right) &&
304
+ left.name === right.name &&
305
+ left.agentStatus === right.agentStatus &&
306
+ left.paneId === right.paneId &&
307
+ left.tabId === right.tabId &&
308
+ left.workspaceId === right.workspaceId);
309
+ }
310
+ function sameAgentSession(left, right) {
311
+ return (left?.agent === right?.agent &&
312
+ left?.kind === right?.kind &&
313
+ left?.source === right?.source &&
314
+ left?.value === right?.value);
315
+ }
316
+ function terminalSessionKey(herdrSessionName, terminalId) {
317
+ return `${herdrSessionName}\0${terminalId}`;
318
+ }
319
+ function scopeOf(agent) {
320
+ return { herdrSessionName: agent.herdrSessionName, workspaceId: agent.workspaceId };
321
+ }
322
+ function addScope(scopes, scope) {
323
+ scopes.set(`${scope.herdrSessionName}\0${scope.workspaceId}`, scope);
324
+ }
325
+ function sameScope(left, right) {
326
+ return left.herdrSessionName === right.herdrSessionName && left.workspaceId === right.workspaceId;
327
+ }
328
+ function sortedScopes(scopes) {
329
+ return [...scopes.values()].sort((left, right) => left.herdrSessionName.localeCompare(right.herdrSessionName) ||
330
+ left.workspaceId.localeCompare(right.workspaceId));
331
+ }
332
+ function statusEventType(status) {
333
+ if (status === "blocked")
334
+ return "agent.blocked";
335
+ if (status === "done")
336
+ return "agent.done";
337
+ if (status === "idle")
338
+ return "agent.idle";
339
+ return undefined;
340
+ }
341
+ function payload(agent, from, to) {
342
+ return {
343
+ agent: agent.agent,
344
+ from,
345
+ name: agent.name,
346
+ herdrSessionName: agent.herdrSessionName,
347
+ paneId: agent.paneId,
348
+ terminalId: agent.terminalId,
349
+ to,
350
+ workspaceId: agent.workspaceId,
351
+ };
352
+ }
353
+ function idempotencyKey(type, agent, from, to, observationId) {
354
+ return `${type}:${agent.herdrSessionName}:${agent.paneId}:${from}:${to}:${observationId}`;
355
+ }
356
+ function herdrInputIdempotencyKey(sessionName, paneId, event, targetStatus) {
357
+ const eventId = stringValue(event.id) ?? stringValue(event.event_id) ?? stringValue(event.eventId);
358
+ if (eventId)
359
+ return `${sessionName}:${paneId}:${String(event.type)}:${eventId}`;
360
+ const revision = integerValue(event.revision) ?? integerValue(event.pane_revision) ?? "unknown";
361
+ return `${sessionName}:${paneId}:${revision}:${targetStatus}`;
362
+ }
363
+ function statusTransitionMatches(event, from, to) {
364
+ const eventPayload = event.payload;
365
+ return eventPayload.from === from && eventPayload.to === to;
366
+ }
367
+ function record(value) {
368
+ return typeof value === "object" && value !== null ? value : {};
369
+ }
370
+ function stringValue(value) {
371
+ return typeof value === "string" && value.length > 0 ? value : null;
372
+ }
373
+ function integerValue(value) {
374
+ return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : undefined;
375
+ }
376
+ //# sourceMappingURL=agent-index-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-index-service.js","sourceRoot":"","sources":["../../../src/observability/agent-index-service.ts"],"names":[],"mappings":"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"}