@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 @@
1
+ {"version":3,"file":"agent-events.js","sourceRoot":"","sources":["../../../src/db/agent-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import type { AgentHistoryRef, CompactAgentHistory } from "../observability/contracts.js";
3
+ export type AgentHistoryCacheRecord = {
4
+ compactHistory: CompactAgentHistory;
5
+ formatterVersion: string;
6
+ historyRef: AgentHistoryRef;
7
+ id: number;
8
+ sourceMtimeMs: number;
9
+ sourcePath: string;
10
+ sourceSize: number;
11
+ updatedAt: Date;
12
+ };
13
+ export declare class AgentHistoryCacheStore {
14
+ #private;
15
+ constructor(sqlite: DatabaseSync);
16
+ getFresh(input: {
17
+ formatterVersion: string;
18
+ sourceMtimeMs: number;
19
+ sourcePath: string;
20
+ sourceSize: number;
21
+ }): AgentHistoryCacheRecord | undefined;
22
+ put(input: {
23
+ compactHistory: CompactAgentHistory;
24
+ formatterVersion: string;
25
+ historyRef: AgentHistoryRef;
26
+ sourceMtimeMs: number;
27
+ sourcePath: string;
28
+ sourceSize: number;
29
+ }): AgentHistoryCacheRecord;
30
+ }
31
+ //# sourceMappingURL=agent-history-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-history-cache.d.ts","sourceRoot":"","sources":["../../../src/db/agent-history-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEzF,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,EAAE,mBAAmB,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,eAAe,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAaF,qBAAa,sBAAsB;;gBAGrB,MAAM,EAAE,YAAY;IAIhC,QAAQ,CAAC,KAAK,EAAE;QACd,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,uBAAuB,GAAG,SAAS;IAYvC,GAAG,CAAC,KAAK,EAAE;QACT,cAAc,EAAE,mBAAmB,CAAC;QACpC,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,eAAe,CAAC;QAC5B,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,uBAAuB;CA6B5B"}
@@ -0,0 +1,46 @@
1
+ export class AgentHistoryCacheStore {
2
+ #sqlite;
3
+ constructor(sqlite) {
4
+ this.#sqlite = sqlite;
5
+ }
6
+ getFresh(input) {
7
+ const row = this.#sqlite
8
+ .prepare(`select * from agent_history_cache
9
+ where source_path = ? and formatter_version = ? and source_mtime_ms = ? and source_size = ?`)
10
+ .get(input.sourcePath, input.formatterVersion, input.sourceMtimeMs, input.sourceSize);
11
+ return row ? mapCache(row) : undefined;
12
+ }
13
+ put(input) {
14
+ const now = Date.now();
15
+ this.#sqlite
16
+ .prepare(`insert into agent_history_cache
17
+ (source_path, formatter_version, history_ref_json, compact_history_json, source_mtime_ms, source_size, updated_at)
18
+ values (?, ?, ?, ?, ?, ?, ?)
19
+ on conflict(source_path, formatter_version) do update set
20
+ history_ref_json = excluded.history_ref_json,
21
+ compact_history_json = excluded.compact_history_json,
22
+ source_mtime_ms = excluded.source_mtime_ms,
23
+ source_size = excluded.source_size,
24
+ updated_at = excluded.updated_at`)
25
+ .run(input.sourcePath, input.formatterVersion, JSON.stringify(input.historyRef), JSON.stringify(input.compactHistory), input.sourceMtimeMs, input.sourceSize, now);
26
+ const row = this.#sqlite
27
+ .prepare("select * from agent_history_cache where source_path = ? and formatter_version = ?")
28
+ .get(input.sourcePath, input.formatterVersion);
29
+ if (!row)
30
+ throw new Error("Agent history cache write failed");
31
+ return mapCache(row);
32
+ }
33
+ }
34
+ function mapCache(row) {
35
+ return {
36
+ compactHistory: JSON.parse(row.compact_history_json),
37
+ formatterVersion: row.formatter_version,
38
+ historyRef: JSON.parse(row.history_ref_json),
39
+ id: row.id,
40
+ sourceMtimeMs: row.source_mtime_ms,
41
+ sourcePath: row.source_path,
42
+ sourceSize: row.source_size,
43
+ updatedAt: new Date(row.updated_at),
44
+ };
45
+ }
46
+ //# sourceMappingURL=agent-history-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-history-cache.js","sourceRoot":"","sources":["../../../src/db/agent-history-cache.ts"],"names":[],"mappings":"AAyBA,MAAM,OAAO,sBAAsB;IACxB,OAAO,CAAe;IAE/B,YAAY,MAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,QAAQ,CAAC,KAKR;QACC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;aACrB,OAAO,CACN;qGAC6F,CAC9F;aACA,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAEzE,CAAC;QACd,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,KAOH;QACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO;aACT,OAAO,CACN;;;;;;;;4CAQoC,CACrC;aACA,GAAG,CACF,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,gBAAgB,EACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAChC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,EACpC,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,UAAU,EAChB,GAAG,CACJ,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;aACrB,OAAO,CAAC,mFAAmF,CAAC;aAC5F,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAqC,CAAC;QACrF,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC9D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,GAAyB;IACzC,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAwB;QAC3E,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;QACvC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAoB;QAC/D,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,aAAa,EAAE,GAAG,CAAC,eAAe;QAClC,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import type { AgentOrchestratorState, AgentScope } from "../observability/contracts.js";
3
+ export type AgentOrchestratorScopeKey = AgentScope;
4
+ export type ClaimOrchestratorInput = AgentOrchestratorScopeKey & {
5
+ ackedEventId: number;
6
+ paneId: string;
7
+ terminalId: string;
8
+ };
9
+ type ScopeChange = {
10
+ current: AgentOrchestratorState;
11
+ previous: AgentOrchestratorState;
12
+ };
13
+ export declare class AgentOrchestratorScopeStore {
14
+ #private;
15
+ constructor(sqlite: DatabaseSync);
16
+ get(scope: AgentOrchestratorScopeKey): AgentOrchestratorState | undefined;
17
+ listOwned(): AgentOrchestratorState[];
18
+ listOwnedForSession(herdrSessionName: string): AgentOrchestratorState[];
19
+ claim(input: ClaimOrchestratorInput): ScopeChange;
20
+ releaseIfOwner(input: AgentOrchestratorScopeKey & {
21
+ terminalId: string;
22
+ }): {
23
+ changed: boolean;
24
+ current: AgentOrchestratorState | undefined;
25
+ previous: AgentOrchestratorState | undefined;
26
+ };
27
+ moveOwner(input: {
28
+ from: AgentOrchestratorScopeKey;
29
+ paneId: string;
30
+ targetAckedEventId: number;
31
+ terminalId: string;
32
+ to: AgentOrchestratorScopeKey;
33
+ }): ScopeChange[];
34
+ ack(input: AgentOrchestratorScopeKey & {
35
+ eventId: number;
36
+ terminalId: string;
37
+ }): AgentOrchestratorState;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=agent-orchestrator-scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-orchestrator-scopes.d.ts","sourceRoot":"","sources":["../../../src/db/agent-orchestrator-scopes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAEvF,MAAM,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEnD,MAAM,MAAM,sBAAsB,GAAG,yBAAyB,GAAG;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAYF,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,sBAAsB,CAAC;CAClC,CAAC;AAEF,qBAAa,2BAA2B;;gBAG1B,MAAM,EAAE,YAAY;IAIhC,GAAG,CAAC,KAAK,EAAE,yBAAyB,GAAG,sBAAsB,GAAG,SAAS;IAKzE,SAAS,IAAI,sBAAsB,EAAE;IAWrC,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,sBAAsB,EAAE;IAUvE,KAAK,CAAC,KAAK,EAAE,sBAAsB,GAAG,WAAW;IAIjD,cAAc,CAAC,KAAK,EAAE,yBAAyB,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG;QACzE,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAAC;QAC5C,QAAQ,EAAE,sBAAsB,GAAG,SAAS,CAAC;KAC9C;IAqBD,SAAS,CAAC,KAAK,EAAE;QACf,IAAI,EAAE,yBAAyB,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC;QACf,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,yBAAyB,CAAC;KAC/B,GAAG,WAAW,EAAE;IA2BjB,GAAG,CACD,KAAK,EAAE,yBAAyB,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GACzE,sBAAsB;CAmF1B"}
@@ -0,0 +1,148 @@
1
+ export class AgentOrchestratorScopeStore {
2
+ #sqlite;
3
+ constructor(sqlite) {
4
+ this.#sqlite = sqlite;
5
+ }
6
+ get(scope) {
7
+ const row = this.#getRow(scope);
8
+ return row ? mapScope(row) : undefined;
9
+ }
10
+ listOwned() {
11
+ const rows = this.#sqlite
12
+ .prepare(`select * from agent_orchestrator_scopes
13
+ where owner_terminal_id is not null
14
+ order by herdr_session_name, workspace_id`)
15
+ .all();
16
+ return rows.map(mapScope);
17
+ }
18
+ listOwnedForSession(herdrSessionName) {
19
+ const rows = this.#sqlite
20
+ .prepare(`select * from agent_orchestrator_scopes
21
+ where herdr_session_name = ? and owner_terminal_id is not null`)
22
+ .all(herdrSessionName);
23
+ return rows.map(mapScope);
24
+ }
25
+ claim(input) {
26
+ return this.#transaction(() => this.#claim(input));
27
+ }
28
+ releaseIfOwner(input) {
29
+ return this.#transaction(() => {
30
+ const row = this.#getRow(input);
31
+ if (!row || row.owner_terminal_id !== input.terminalId) {
32
+ return { changed: false, current: row ? mapScope(row) : undefined, previous: undefined };
33
+ }
34
+ const previous = mapScope(row);
35
+ const now = Date.now();
36
+ this.#sqlite
37
+ .prepare(`update agent_orchestrator_scopes
38
+ set owner_pane_id = null, owner_terminal_id = null, updated_at = ?
39
+ where herdr_session_name = ? and workspace_id = ?`)
40
+ .run(now, input.herdrSessionName, input.workspaceId);
41
+ const current = this.get(input);
42
+ if (!current)
43
+ throw new Error("Orchestrator scope disappeared during release");
44
+ return { changed: true, current, previous };
45
+ });
46
+ }
47
+ moveOwner(input) {
48
+ return this.#transaction(() => {
49
+ const sourceRow = this.#getRow(input.from);
50
+ if (!sourceRow || sourceRow.owner_terminal_id !== input.terminalId) {
51
+ throw new Error("Only the current orchestrator can move ownership");
52
+ }
53
+ const sourcePrevious = mapScope(sourceRow);
54
+ const now = Date.now();
55
+ this.#sqlite
56
+ .prepare(`update agent_orchestrator_scopes
57
+ set owner_pane_id = null, owner_terminal_id = null, updated_at = ?
58
+ where herdr_session_name = ? and workspace_id = ?`)
59
+ .run(now, input.from.herdrSessionName, input.from.workspaceId);
60
+ const sourceCurrent = this.get(input.from);
61
+ if (!sourceCurrent)
62
+ throw new Error("Orchestrator source disappeared during move");
63
+ const target = this.#claim({
64
+ ...input.to,
65
+ ackedEventId: input.targetAckedEventId,
66
+ paneId: input.paneId,
67
+ terminalId: input.terminalId,
68
+ });
69
+ return [{ current: sourceCurrent, previous: sourcePrevious }, target];
70
+ });
71
+ }
72
+ ack(input) {
73
+ return this.#transaction(() => {
74
+ const row = this.#getRow(input);
75
+ if (!row || row.owner_terminal_id !== input.terminalId) {
76
+ throw new Error("Only the current orchestrator can acknowledge notifications");
77
+ }
78
+ const now = Date.now();
79
+ this.#sqlite
80
+ .prepare(`update agent_orchestrator_scopes
81
+ set acked_event_id = max(acked_event_id, ?), updated_at = ?
82
+ where herdr_session_name = ? and workspace_id = ?`)
83
+ .run(input.eventId, now, input.herdrSessionName, input.workspaceId);
84
+ const current = this.get(input);
85
+ if (!current)
86
+ throw new Error("Orchestrator scope disappeared during acknowledgement");
87
+ return current;
88
+ });
89
+ }
90
+ #claim(input) {
91
+ const row = this.#getRow(input);
92
+ const now = Date.now();
93
+ if (!row) {
94
+ this.#sqlite
95
+ .prepare(`insert into agent_orchestrator_scopes
96
+ (herdr_session_name, workspace_id, acked_event_id, owner_pane_id, owner_terminal_id, created_at, updated_at)
97
+ values (?, ?, ?, ?, ?, ?, ?)`)
98
+ .run(input.herdrSessionName, input.workspaceId, input.ackedEventId, input.paneId, input.terminalId, now, now);
99
+ const current = this.get(input);
100
+ if (!current)
101
+ throw new Error("Failed to create orchestrator scope");
102
+ return { current, previous: { ...current, owner: null } };
103
+ }
104
+ const previous = mapScope(row);
105
+ this.#sqlite
106
+ .prepare(`update agent_orchestrator_scopes
107
+ set acked_event_id = ?, owner_pane_id = ?, owner_terminal_id = ?, updated_at = ?
108
+ where herdr_session_name = ? and workspace_id = ?`)
109
+ .run(input.ackedEventId, input.paneId, input.terminalId, now, input.herdrSessionName, input.workspaceId);
110
+ const current = this.get(input);
111
+ if (!current)
112
+ throw new Error("Orchestrator scope disappeared during claim");
113
+ return { current, previous };
114
+ }
115
+ #getRow(scope) {
116
+ return this.#sqlite
117
+ .prepare(`select * from agent_orchestrator_scopes
118
+ where herdr_session_name = ? and workspace_id = ?`)
119
+ .get(scope.herdrSessionName, scope.workspaceId);
120
+ }
121
+ #transaction(operation) {
122
+ this.#sqlite.exec("begin immediate");
123
+ try {
124
+ const result = operation();
125
+ this.#sqlite.exec("commit");
126
+ return result;
127
+ }
128
+ catch (error) {
129
+ this.#sqlite.exec("rollback");
130
+ throw error;
131
+ }
132
+ }
133
+ }
134
+ function mapScope(row) {
135
+ if ((row.owner_pane_id === null) !== (row.owner_terminal_id === null)) {
136
+ throw new Error("Corrupt orchestrator scope owner identity");
137
+ }
138
+ return {
139
+ ackedEventId: row.acked_event_id,
140
+ herdrSessionName: row.herdr_session_name,
141
+ owner: row.owner_pane_id === null || row.owner_terminal_id === null
142
+ ? null
143
+ : { paneId: row.owner_pane_id, terminalId: row.owner_terminal_id },
144
+ updatedAt: new Date(row.updated_at),
145
+ workspaceId: row.workspace_id,
146
+ };
147
+ }
148
+ //# sourceMappingURL=agent-orchestrator-scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-orchestrator-scopes.js","sourceRoot":"","sources":["../../../src/db/agent-orchestrator-scopes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import { type AgentIndexRecord, type AgentQueryScope, type AgentSessionRef, type AgentStatus } from "../observability/contracts.js";
3
+ export type HerdrAgentLike = Record<string, unknown>;
4
+ export declare class AgentStore {
5
+ #private;
6
+ constructor(sqlite: DatabaseSync);
7
+ replaceForSession(input: {
8
+ agents: HerdrAgentLike[];
9
+ herdrSessionName: string;
10
+ }): AgentIndexRecord[];
11
+ setSessionRefByTerminal(input: {
12
+ agentSession: AgentSessionRef;
13
+ herdrSessionName: string;
14
+ terminalId: string;
15
+ }): AgentIndexRecord | undefined;
16
+ updateStatus(input: {
17
+ agentStatus: AgentStatus;
18
+ herdrSessionName: string;
19
+ paneId: string;
20
+ }): AgentIndexRecord | undefined;
21
+ list(scope?: AgentQueryScope): AgentIndexRecord[];
22
+ listForHerdrSession(herdrSessionName: string): AgentIndexRecord[];
23
+ findByPane(input: {
24
+ herdrSessionName: string;
25
+ paneId: string;
26
+ }): AgentIndexRecord | undefined;
27
+ findByTerminal(input: {
28
+ herdrSessionName: string;
29
+ terminalId: string;
30
+ }): AgentIndexRecord | undefined;
31
+ get(id: string): AgentIndexRecord;
32
+ resolveTarget(scope: AgentQueryScope, target: string): AgentIndexRecord;
33
+ }
34
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/db/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,WAAW,EAEjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAuBrD,qBAAa,UAAU;;gBAGT,MAAM,EAAE,YAAY;IAIhC,iBAAiB,CAAC,KAAK,EAAE;QACvB,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,gBAAgB,EAAE;IAyHtB,uBAAuB,CAAC,KAAK,EAAE;QAC7B,YAAY,EAAE,eAAe,CAAC;QAC9B,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,gBAAgB,GAAG,SAAS;IAkBhC,YAAY,CAAC,KAAK,EAAE;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,gBAAgB,GAAG,SAAS;IAUhC,IAAI,CAAC,KAAK,GAAE,eAAoB,GAAG,gBAAgB,EAAE;IA6BrD,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAIjE,UAAU,CAAC,KAAK,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,GAAG,SAAS;IAO7F,cAAc,CAAC,KAAK,EAAE;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,gBAAgB,GAAG,SAAS;IAOhC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB;IAQjC,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;CA2BxE"}
@@ -0,0 +1,295 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { parseAgentStatus, } from "../observability/contracts.js";
3
+ export class AgentStore {
4
+ #sqlite;
5
+ constructor(sqlite) {
6
+ this.#sqlite = sqlite;
7
+ }
8
+ replaceForSession(input) {
9
+ const now = Date.now();
10
+ const snapshots = input.agents.flatMap((agent) => {
11
+ const paneId = stringValue(agent.pane_id) ?? stringValue(agent.paneId);
12
+ const workspaceId = stringValue(agent.workspace_id) ?? stringValue(agent.workspaceId);
13
+ if (!paneId || !workspaceId)
14
+ return [];
15
+ return [
16
+ {
17
+ agent,
18
+ paneId,
19
+ terminalId: stringValue(agent.terminal_id) ?? stringValue(agent.terminalId),
20
+ workspaceId,
21
+ },
22
+ ];
23
+ });
24
+ return this.#transaction(() => {
25
+ const existing = this.#sqlite
26
+ .prepare("select * from agents where herdr_session_name = ?")
27
+ .all(input.herdrSessionName);
28
+ const byPane = new Map(existing.map((agent) => [agent.pane_id, agent]));
29
+ const byTerminal = new Map(existing.flatMap((agent) => agent.terminal_id ? [[agent.terminal_id, agent]] : []));
30
+ const matched = snapshots.map((snapshot) => {
31
+ const terminalMatch = snapshot.terminalId ? byTerminal.get(snapshot.terminalId) : undefined;
32
+ const paneMatch = byPane.get(snapshot.paneId);
33
+ const incomingGeneration = paneGeneration(snapshot.agent);
34
+ const canUsePaneFallback = paneMatch && (snapshot.terminalId === null || paneMatch.terminal_id === null);
35
+ const generationMatches = !incomingGeneration || !paneMatch?.pane_generation || incomingGeneration === paneMatch.pane_generation;
36
+ return {
37
+ existing: terminalMatch ?? (generationMatches && canUsePaneFallback ? paneMatch : undefined),
38
+ snapshot,
39
+ };
40
+ });
41
+ const temporaryPaneIds = new Set();
42
+ for (const { existing: current, snapshot } of matched) {
43
+ if (current && current.pane_id !== snapshot.paneId)
44
+ temporaryPaneIds.add(current.id);
45
+ const occupant = byPane.get(snapshot.paneId);
46
+ if (occupant && occupant.id !== current?.id)
47
+ temporaryPaneIds.add(occupant.id);
48
+ }
49
+ for (const id of temporaryPaneIds) {
50
+ this.#sqlite
51
+ .prepare("update agents set pane_id = ? where id = ?")
52
+ .run(`__herdsman_moving__:${id}`, id);
53
+ }
54
+ const retainedIds = [];
55
+ for (const { existing: current, snapshot } of matched) {
56
+ const id = current?.id ?? `ag_${randomUUID()}`;
57
+ retainedIds.push(id);
58
+ const agent = stringValue(snapshot.agent.agent);
59
+ const name = stringValue(snapshot.agent.name);
60
+ const sessionHint = current?.agent === agent ? current.agent_session_hint_json : null;
61
+ const values = [
62
+ snapshot.paneId,
63
+ snapshot.terminalId,
64
+ stringValue(snapshot.agent.tab_id) ?? stringValue(snapshot.agent.tabId),
65
+ snapshot.workspaceId,
66
+ agent,
67
+ name,
68
+ parseAgentStatus(snapshot.agent.agent_status),
69
+ agentSessionJson(snapshot.agent.agent_session),
70
+ sessionHint,
71
+ integerValue(snapshot.agent.revision),
72
+ paneGeneration(snapshot.agent) ?? current?.pane_generation ?? null,
73
+ stringValue(snapshot.agent.cwd),
74
+ stringValue(snapshot.agent.foreground_cwd) ?? stringValue(snapshot.agent.foregroundCwd),
75
+ snapshot.agent.focused === true ? 1 : 0,
76
+ now,
77
+ ];
78
+ if (current) {
79
+ this.#sqlite
80
+ .prepare(`update agents
81
+ set pane_id = ?, terminal_id = ?, tab_id = ?, workspace_id = ?, agent = ?, name = ?,
82
+ agent_status = ?, agent_session_json = ?, agent_session_hint_json = ?, pane_revision = ?, pane_generation = ?,
83
+ cwd = ?, foreground_cwd = ?, focused = ?, last_seen_at = ?
84
+ where id = ?`)
85
+ .run(...values, id);
86
+ }
87
+ else {
88
+ this.#sqlite
89
+ .prepare(`insert into agents
90
+ (id, herdr_session_name, pane_id, terminal_id, tab_id, workspace_id, agent, name, agent_status, agent_session_json, agent_session_hint_json, pane_revision, pane_generation, cwd, foreground_cwd, focused, first_seen_at, last_seen_at)
91
+ values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
92
+ .run(id, input.herdrSessionName, ...values, now);
93
+ }
94
+ }
95
+ const removedIds = existing
96
+ .map((agent) => agent.id)
97
+ .filter((id) => !retainedIds.includes(id));
98
+ if (removedIds.length > 0) {
99
+ const placeholders = removedIds.map(() => "?").join(", ");
100
+ this.#sqlite
101
+ .prepare(`delete from agent_context_snapshots where agent_id in (${placeholders})`)
102
+ .run(...removedIds);
103
+ }
104
+ if (retainedIds.length === 0) {
105
+ this.#sqlite
106
+ .prepare("delete from agents where herdr_session_name = ?")
107
+ .run(input.herdrSessionName);
108
+ }
109
+ else {
110
+ const placeholders = retainedIds.map(() => "?").join(", ");
111
+ this.#sqlite
112
+ .prepare(`delete from agents where herdr_session_name = ? and id not in (${placeholders})`)
113
+ .run(input.herdrSessionName, ...retainedIds);
114
+ }
115
+ return this.listForHerdrSession(input.herdrSessionName);
116
+ });
117
+ }
118
+ setSessionRefByTerminal(input) {
119
+ const current = this.findByTerminal(input);
120
+ if (!current)
121
+ return undefined;
122
+ const compatible = current.agent?.toLowerCase() === input.agentSession.agent.toLowerCase();
123
+ this.#sqlite
124
+ .prepare(`update agents
125
+ set agent_session_hint_json = ?
126
+ where herdr_session_name = ? and terminal_id = ?`)
127
+ .run(compatible ? JSON.stringify(input.agentSession) : null, input.herdrSessionName, input.terminalId);
128
+ return this.findByTerminal(input);
129
+ }
130
+ updateStatus(input) {
131
+ const now = Date.now();
132
+ this.#sqlite
133
+ .prepare("update agents set agent_status = ?, last_seen_at = ? where herdr_session_name = ? and pane_id = ?")
134
+ .run(input.agentStatus, now, input.herdrSessionName, input.paneId);
135
+ return this.findByPane(input);
136
+ }
137
+ list(scope = {}) {
138
+ const clauses = ["sessions.running = 1"];
139
+ const params = [];
140
+ if (!scope.all && scope.herdrSessionName) {
141
+ clauses.push("agents.herdr_session_name = ?");
142
+ params.push(scope.herdrSessionName);
143
+ }
144
+ if (!scope.all && scope.workspaceId) {
145
+ clauses.push("agents.workspace_id = ?");
146
+ params.push(scope.workspaceId);
147
+ }
148
+ if (scope.all && scope.herdrSessionName) {
149
+ clauses.push("agents.herdr_session_name = ?");
150
+ params.push(scope.herdrSessionName);
151
+ }
152
+ const where = ` where ${clauses.join(" and ")}`;
153
+ const rows = this.#sqlite
154
+ .prepare(`select agents.*
155
+ from agents
156
+ inner join herdr_sessions as sessions
157
+ on sessions.name = agents.herdr_session_name
158
+ ${where}
159
+ order by agents.herdr_session_name, agents.workspace_id, agents.pane_id`)
160
+ .all(...params);
161
+ return rows.map(mapAgent);
162
+ }
163
+ listForHerdrSession(herdrSessionName) {
164
+ return this.list({ herdrSessionName });
165
+ }
166
+ findByPane(input) {
167
+ const row = this.#sqlite
168
+ .prepare("select * from agents where herdr_session_name = ? and pane_id = ?")
169
+ .get(input.herdrSessionName, input.paneId);
170
+ return row ? mapAgent(row) : undefined;
171
+ }
172
+ findByTerminal(input) {
173
+ const row = this.#sqlite
174
+ .prepare("select * from agents where herdr_session_name = ? and terminal_id = ?")
175
+ .get(input.herdrSessionName, input.terminalId);
176
+ return row ? mapAgent(row) : undefined;
177
+ }
178
+ get(id) {
179
+ const row = this.#sqlite.prepare("select * from agents where id = ?").get(id);
180
+ if (!row)
181
+ throw new Error(`Agent not found: ${id}`);
182
+ return mapAgent(row);
183
+ }
184
+ resolveTarget(scope, target) {
185
+ const agents = this.list(scope);
186
+ const candidateGroups = [
187
+ agents.filter((agent) => agent.paneId === target || agent.terminalId === target || agent.id === target),
188
+ agents.filter((agent) => agent.name === target),
189
+ agents.filter((agent) => agent.agent === target),
190
+ ];
191
+ for (const candidates of candidateGroups) {
192
+ if (candidates.length === 1)
193
+ return candidates[0];
194
+ if (candidates.length > 1)
195
+ throw ambiguousTargetError(target, candidates);
196
+ }
197
+ throw new Error(`agent target not found: ${target}`);
198
+ }
199
+ #transaction(operation) {
200
+ this.#sqlite.exec("begin immediate");
201
+ try {
202
+ const result = operation();
203
+ this.#sqlite.exec("commit");
204
+ return result;
205
+ }
206
+ catch (error) {
207
+ this.#sqlite.exec("rollback");
208
+ throw error;
209
+ }
210
+ }
211
+ }
212
+ function mapAgent(row) {
213
+ const reportedSession = parseAgentSession(row.agent_session_json);
214
+ const hintedSession = parseAgentSession(row.agent_session_hint_json);
215
+ const compatibleHint = row.agent?.toLowerCase() === hintedSession?.agent.toLowerCase() ? hintedSession : null;
216
+ return {
217
+ agent: row.agent,
218
+ agentSession: reportedSession ?? compatibleHint,
219
+ agentStatus: row.agent_status,
220
+ cwd: row.cwd,
221
+ firstSeenAt: new Date(row.first_seen_at),
222
+ focused: row.focused === 1,
223
+ foregroundCwd: row.foreground_cwd,
224
+ herdrSessionName: row.herdr_session_name,
225
+ id: row.id,
226
+ lastSeenAt: new Date(row.last_seen_at),
227
+ name: row.name,
228
+ paneId: row.pane_id,
229
+ paneRevision: row.pane_revision,
230
+ ...(row.pane_generation === null ? {} : { paneGeneration: row.pane_generation }),
231
+ tabId: row.tab_id,
232
+ terminalId: row.terminal_id,
233
+ workspaceId: row.workspace_id,
234
+ };
235
+ }
236
+ function paneGeneration(agent) {
237
+ return (stringValue(agent.pane_generation) ??
238
+ stringValue(agent.paneGeneration) ??
239
+ stringValue(agent.creation_id) ??
240
+ stringValue(agent.creationId));
241
+ }
242
+ function agentSessionJson(value) {
243
+ if (typeof value !== "object" || value === null)
244
+ return null;
245
+ const record = value;
246
+ if (typeof record.agent === "string" &&
247
+ (record.kind === "id" || record.kind === "path") &&
248
+ typeof record.source === "string" &&
249
+ typeof record.value === "string") {
250
+ return JSON.stringify({
251
+ agent: record.agent,
252
+ kind: record.kind,
253
+ source: record.source,
254
+ value: record.value,
255
+ });
256
+ }
257
+ return null;
258
+ }
259
+ function parseAgentSession(value) {
260
+ if (!value)
261
+ return null;
262
+ try {
263
+ const parsed = JSON.parse(value);
264
+ if (typeof parsed !== "object" || parsed === null)
265
+ return null;
266
+ const record = parsed;
267
+ if (typeof record.agent === "string" &&
268
+ (record.kind === "id" || record.kind === "path") &&
269
+ typeof record.source === "string" &&
270
+ typeof record.value === "string") {
271
+ return {
272
+ agent: record.agent,
273
+ kind: record.kind,
274
+ source: record.source,
275
+ value: record.value,
276
+ };
277
+ }
278
+ }
279
+ catch {
280
+ return null;
281
+ }
282
+ return null;
283
+ }
284
+ function ambiguousTargetError(target, candidates) {
285
+ return new Error(`agent target ${target} is ambiguous; candidates: ${candidates
286
+ .map((agent) => `session=${agent.herdrSessionName} workspace=${agent.workspaceId} pane=${agent.paneId} terminal=${agent.terminalId ?? "unknown"} name=${agent.name ?? "unnamed"} agent=${agent.agent ?? "unknown"}`)
287
+ .join("; ")}`);
288
+ }
289
+ function integerValue(value) {
290
+ return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : null;
291
+ }
292
+ function stringValue(value) {
293
+ return typeof value === "string" && value.length > 0 ? value : null;
294
+ }
295
+ //# sourceMappingURL=agents.js.map