@dorokuma/herdsman 0.9.0 → 0.11.5
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.
- package/README.ja.md +4 -2
- package/README.md +5 -3
- package/dist/src/agent-history/antigravity-proto.js +1 -1
- package/dist/src/agent-history/antigravity-proto.js.map +1 -1
- package/dist/src/agent-history/antigravity-reader.d.ts +13 -1
- package/dist/src/agent-history/antigravity-reader.d.ts.map +1 -1
- package/dist/src/agent-history/antigravity-reader.js +22 -1
- package/dist/src/agent-history/antigravity-reader.js.map +1 -1
- package/dist/src/agent-history/discovery.d.ts +8 -2
- package/dist/src/agent-history/discovery.d.ts.map +1 -1
- package/dist/src/agent-history/discovery.js +89 -9
- package/dist/src/agent-history/discovery.js.map +1 -1
- package/dist/src/agent-history/readers.d.ts +15 -1
- package/dist/src/agent-history/readers.d.ts.map +1 -1
- package/dist/src/agent-history/readers.js +77 -31
- package/dist/src/agent-history/readers.js.map +1 -1
- package/dist/src/agent-history/service.d.ts +4 -2
- package/dist/src/agent-history/service.d.ts.map +1 -1
- package/dist/src/agent-history/service.js +22 -22
- package/dist/src/agent-history/service.js.map +1 -1
- package/dist/src/agent-history/source-fingerprint.d.ts +7 -0
- package/dist/src/agent-history/source-fingerprint.d.ts.map +1 -0
- package/dist/src/agent-history/source-fingerprint.js +26 -0
- package/dist/src/agent-history/source-fingerprint.js.map +1 -0
- package/dist/src/agent-history/text.d.ts.map +1 -1
- package/dist/src/agent-history/text.js +5 -0
- package/dist/src/agent-history/text.js.map +1 -1
- package/dist/src/cli/herdsman.d.ts.map +1 -1
- package/dist/src/cli/herdsman.js +31 -9
- package/dist/src/cli/herdsman.js.map +1 -1
- package/dist/src/daemon/agent-event-reconciler.d.ts +25 -4
- package/dist/src/daemon/agent-event-reconciler.d.ts.map +1 -1
- package/dist/src/daemon/agent-event-reconciler.js +84 -6
- package/dist/src/daemon/agent-event-reconciler.js.map +1 -1
- package/dist/src/daemon/herdr-session-watch-manager.d.ts +1 -0
- package/dist/src/daemon/herdr-session-watch-manager.d.ts.map +1 -1
- package/dist/src/daemon/herdr-session-watch-manager.js +176 -55
- package/dist/src/daemon/herdr-session-watch-manager.js.map +1 -1
- package/dist/src/daemon/observability-server.d.ts +3 -0
- package/dist/src/daemon/observability-server.d.ts.map +1 -1
- package/dist/src/daemon/observability-server.js +73 -24
- package/dist/src/daemon/observability-server.js.map +1 -1
- package/dist/src/daemon/process-manager.d.ts +41 -2
- package/dist/src/daemon/process-manager.d.ts.map +1 -1
- package/dist/src/daemon/process-manager.js +340 -19
- package/dist/src/daemon/process-manager.js.map +1 -1
- package/dist/src/daemon/service.d.ts +46 -0
- package/dist/src/daemon/service.d.ts.map +1 -1
- package/dist/src/daemon/service.js +172 -12
- package/dist/src/daemon/service.js.map +1 -1
- package/dist/src/db/agent-events.d.ts +34 -1
- package/dist/src/db/agent-events.d.ts.map +1 -1
- package/dist/src/db/agent-events.js +168 -28
- package/dist/src/db/agent-events.js.map +1 -1
- package/dist/src/db/agent-history-cache.d.ts +4 -0
- package/dist/src/db/agent-history-cache.d.ts.map +1 -1
- package/dist/src/db/agent-history-cache.js +27 -0
- package/dist/src/db/agent-history-cache.js.map +1 -1
- package/dist/src/db/agent-orchestrator-scopes.d.ts +8 -0
- package/dist/src/db/agent-orchestrator-scopes.d.ts.map +1 -1
- package/dist/src/db/agent-orchestrator-scopes.js +13 -0
- package/dist/src/db/agent-orchestrator-scopes.js.map +1 -1
- package/dist/src/db/agents.d.ts +44 -0
- package/dist/src/db/agents.d.ts.map +1 -1
- package/dist/src/db/agents.js +91 -5
- package/dist/src/db/agents.js.map +1 -1
- package/dist/src/db/client.d.ts +1 -0
- package/dist/src/db/client.d.ts.map +1 -1
- package/dist/src/db/client.js +12 -0
- package/dist/src/db/client.js.map +1 -1
- package/dist/src/db/schema.d.ts +391 -0
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +34 -0
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/db/status-event-plans.d.ts +62 -0
- package/dist/src/db/status-event-plans.d.ts.map +1 -0
- package/dist/src/db/status-event-plans.js +147 -0
- package/dist/src/db/status-event-plans.js.map +1 -0
- package/dist/src/herdr/pane-identity-resolver.d.ts +4 -0
- package/dist/src/herdr/pane-identity-resolver.d.ts.map +1 -1
- package/dist/src/herdr/pane-identity-resolver.js +13 -1
- package/dist/src/herdr/pane-identity-resolver.js.map +1 -1
- package/dist/src/herdr/socket-client.d.ts +2 -0
- package/dist/src/herdr/socket-client.d.ts.map +1 -1
- package/dist/src/herdr/socket-client.js +64 -20
- package/dist/src/herdr/socket-client.js.map +1 -1
- package/dist/src/observability/agent-context-service.d.ts +17 -1
- package/dist/src/observability/agent-context-service.d.ts.map +1 -1
- package/dist/src/observability/agent-context-service.js +85 -21
- package/dist/src/observability/agent-context-service.js.map +1 -1
- package/dist/src/observability/agent-index-service.d.ts +47 -2
- package/dist/src/observability/agent-index-service.d.ts.map +1 -1
- package/dist/src/observability/agent-index-service.js +1125 -115
- package/dist/src/observability/agent-index-service.js.map +1 -1
- package/dist/src/observability/agent-orchestrator-service.d.ts.map +1 -1
- package/dist/src/observability/agent-orchestrator-service.js +34 -12
- package/dist/src/observability/agent-orchestrator-service.js.map +1 -1
- package/dist/src/observability/contracts.d.ts +2 -1
- package/dist/src/observability/contracts.d.ts.map +1 -1
- package/dist/src/observability/contracts.js.map +1 -1
- package/dist/src/observability/interactive-pi.d.ts +1 -1
- package/dist/src/observability/interactive-pi.d.ts.map +1 -1
- package/dist/src/observability/interactive-pi.js +1 -1
- package/dist/src/observability/interactive-pi.js.map +1 -1
- package/dist/src/observability/schemas.d.ts +1 -0
- package/dist/src/observability/schemas.d.ts.map +1 -1
- package/dist/src/observability/schemas.js +1 -0
- package/dist/src/observability/schemas.js.map +1 -1
- package/dist/src/observability/turn-completion.d.ts +2 -1
- package/dist/src/observability/turn-completion.d.ts.map +1 -1
- package/dist/src/observability/turn-completion.js +10 -1
- package/dist/src/observability/turn-completion.js.map +1 -1
- package/dist/src/shared/unix-peercred.d.ts +14 -0
- package/dist/src/shared/unix-peercred.d.ts.map +1 -0
- package/dist/src/shared/unix-peercred.js +144 -0
- package/dist/src/shared/unix-peercred.js.map +1 -0
- package/drizzle/0008_pane_tombstones.sql +9 -0
- package/drizzle/0009_high_lake.sql +24 -0
- package/drizzle/meta/0008_snapshot.json +823 -0
- package/drizzle/meta/0009_snapshot.json +975 -0
- package/drizzle/meta/_journal.json +14 -0
- package/package.json +24 -22
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
export const STATUS_PLAN_MAX_ATTEMPTS = 8;
|
|
2
|
+
function mapStatusEventPlan(row) {
|
|
3
|
+
let compactHistory;
|
|
4
|
+
if (row.compact_history_json) {
|
|
5
|
+
try {
|
|
6
|
+
compactHistory = JSON.parse(row.compact_history_json);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
compactHistory = undefined;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
agentId: row.agent_id,
|
|
14
|
+
attempts: row.attempts,
|
|
15
|
+
...(compactHistory ? { compactHistory } : {}),
|
|
16
|
+
createdAt: new Date(row.created_at),
|
|
17
|
+
fromStatus: row.from_status,
|
|
18
|
+
herdrEventKey: row.herdr_event_key,
|
|
19
|
+
herdrSessionName: row.herdr_session_name,
|
|
20
|
+
id: row.id,
|
|
21
|
+
lastError: row.last_error,
|
|
22
|
+
paneGeneration: row.pane_generation,
|
|
23
|
+
paneId: row.pane_id,
|
|
24
|
+
status: row.status,
|
|
25
|
+
toStatus: row.to_status,
|
|
26
|
+
updatedAt: new Date(row.updated_at),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export class StatusEventPlanStore {
|
|
30
|
+
#sqlite;
|
|
31
|
+
constructor(sqlite) {
|
|
32
|
+
this.#sqlite = sqlite;
|
|
33
|
+
}
|
|
34
|
+
insertPending(plan) {
|
|
35
|
+
const herdrSessionName = plan.herdrSessionName ?? plan.agent?.herdrSessionName;
|
|
36
|
+
const agentId = plan.agentId ?? plan.agent?.id;
|
|
37
|
+
const paneId = plan.paneId ?? plan.agent?.paneId;
|
|
38
|
+
const paneGeneration = plan.paneGeneration ?? plan.agent?.paneGeneration ?? null;
|
|
39
|
+
const fromStatus = plan.fromStatus ?? plan.from;
|
|
40
|
+
const toStatus = plan.toStatus ?? plan.to;
|
|
41
|
+
const herdrEventKey = plan.herdrEventKey ?? null;
|
|
42
|
+
if (!herdrSessionName || !agentId || !paneId || !fromStatus || !toStatus) {
|
|
43
|
+
throw new Error("Missing required fields for status event plan");
|
|
44
|
+
}
|
|
45
|
+
if (herdrEventKey) {
|
|
46
|
+
const existing = this.#sqlite
|
|
47
|
+
.prepare("select * from status_event_plans where herdr_session_name = ? and herdr_event_key = ?")
|
|
48
|
+
.get(herdrSessionName, herdrEventKey);
|
|
49
|
+
if (existing) {
|
|
50
|
+
return mapStatusEventPlan(existing);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const now = Date.now();
|
|
54
|
+
const compactHistoryJson = plan.compactHistory ? JSON.stringify(plan.compactHistory) : null;
|
|
55
|
+
try {
|
|
56
|
+
const result = this.#sqlite
|
|
57
|
+
.prepare(`insert into status_event_plans
|
|
58
|
+
(agent_id, attempts, compact_history_json, created_at, from_status, herdr_event_key, herdr_session_name, last_error, pane_generation, pane_id, status, to_status, updated_at)
|
|
59
|
+
values (?, 0, ?, ?, ?, ?, ?, null, ?, ?, 'pending', ?, ?)`)
|
|
60
|
+
.run(agentId, compactHistoryJson, now, fromStatus, herdrEventKey, herdrSessionName, paneGeneration, paneId, toStatus, now);
|
|
61
|
+
return this.get(Number(result.lastInsertRowid));
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (herdrEventKey) {
|
|
65
|
+
const existing = this.#sqlite
|
|
66
|
+
.prepare("select * from status_event_plans where herdr_session_name = ? and herdr_event_key = ?")
|
|
67
|
+
.get(herdrSessionName, herdrEventKey);
|
|
68
|
+
if (existing)
|
|
69
|
+
return mapStatusEventPlan(existing);
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
get(id) {
|
|
75
|
+
const row = this.#sqlite.prepare("select * from status_event_plans where id = ?").get(id);
|
|
76
|
+
if (!row)
|
|
77
|
+
throw new Error(`StatusEventPlan with id ${id} not found`);
|
|
78
|
+
return mapStatusEventPlan(row);
|
|
79
|
+
}
|
|
80
|
+
listUnfinished() {
|
|
81
|
+
const rows = this.#sqlite
|
|
82
|
+
.prepare("select * from status_event_plans where status in ('pending', 'running') order by id asc")
|
|
83
|
+
.all();
|
|
84
|
+
return rows.map(mapStatusEventPlan);
|
|
85
|
+
}
|
|
86
|
+
listFailed() {
|
|
87
|
+
const rows = this.#sqlite
|
|
88
|
+
.prepare("select * from status_event_plans where status = 'failed' order by id asc")
|
|
89
|
+
.all();
|
|
90
|
+
return rows.map(mapStatusEventPlan);
|
|
91
|
+
}
|
|
92
|
+
listWaitingHistory() {
|
|
93
|
+
const rows = this.#sqlite
|
|
94
|
+
.prepare("select * from status_event_plans where status = 'pending' and last_error = 'PLAN_WAITING_HISTORY' order by id asc")
|
|
95
|
+
.all();
|
|
96
|
+
return rows.map(mapStatusEventPlan);
|
|
97
|
+
}
|
|
98
|
+
resetRunningToPending() {
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
const result = this.#sqlite
|
|
101
|
+
.prepare("update status_event_plans set status = 'pending', updated_at = ? where status = 'running'")
|
|
102
|
+
.run(now);
|
|
103
|
+
return Number(result.changes);
|
|
104
|
+
}
|
|
105
|
+
markRunning(id) {
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
this.#sqlite
|
|
108
|
+
.prepare("update status_event_plans set status = 'running', updated_at = ? where id = ?")
|
|
109
|
+
.run(now, id);
|
|
110
|
+
}
|
|
111
|
+
markCompleted(id) {
|
|
112
|
+
const now = Date.now();
|
|
113
|
+
this.#sqlite
|
|
114
|
+
.prepare("update status_event_plans set status = 'completed', updated_at = ? where id = ?")
|
|
115
|
+
.run(now, id);
|
|
116
|
+
}
|
|
117
|
+
markCancelled(id) {
|
|
118
|
+
const now = Date.now();
|
|
119
|
+
this.#sqlite
|
|
120
|
+
.prepare("update status_event_plans set status = 'cancelled', updated_at = ? where id = ?")
|
|
121
|
+
.run(now, id);
|
|
122
|
+
}
|
|
123
|
+
markRetry(id, error) {
|
|
124
|
+
const now = Date.now();
|
|
125
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
126
|
+
const current = this.get(id);
|
|
127
|
+
const attempts = current.attempts + 1;
|
|
128
|
+
const newStatus = attempts >= STATUS_PLAN_MAX_ATTEMPTS ? "failed" : "pending";
|
|
129
|
+
this.#sqlite
|
|
130
|
+
.prepare("update status_event_plans set attempts = ?, status = ?, last_error = ?, updated_at = ? where id = ?")
|
|
131
|
+
.run(attempts, newStatus, errorMessage, now, id);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Purges settled plans (completed/cancelled/failed) whose updated_at is
|
|
135
|
+
* older than ageMs. Pending and running rows are never touched: they are
|
|
136
|
+
* still owned by the drain/retry cycle.
|
|
137
|
+
*/
|
|
138
|
+
deleteSettledOlderThan(ageMs) {
|
|
139
|
+
const cutoff = Date.now() - ageMs;
|
|
140
|
+
const result = this.#sqlite
|
|
141
|
+
.prepare(`delete from status_event_plans
|
|
142
|
+
where status in ('completed', 'cancelled', 'failed') and updated_at < ?`)
|
|
143
|
+
.run(cutoff);
|
|
144
|
+
return Number(result.changes);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=status-event-plans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-event-plans.js","sourceRoot":"","sources":["../../../src/db/status-event-plans.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,10 @@ export type HerdrPaneIdentity = {
|
|
|
3
3
|
paneId: string;
|
|
4
4
|
terminalId: string;
|
|
5
5
|
workspaceId: string;
|
|
6
|
+
agent?: string;
|
|
7
|
+
cwd?: string;
|
|
8
|
+
foregroundCwd?: string;
|
|
9
|
+
tabId?: string;
|
|
6
10
|
};
|
|
7
11
|
type PaneClient = Pick<HerdrSocketClient, "close" | "getPane">;
|
|
8
12
|
export declare function resolveHerdrPaneIdentity(input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pane-identity-resolver.d.ts","sourceRoot":"","sources":["../../../src/herdr/pane-identity-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pane-identity-resolver.d.ts","sourceRoot":"","sources":["../../../src/herdr/pane-identity-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;AAE/D,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,UAAU,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6B7B"}
|
|
@@ -12,7 +12,19 @@ export async function resolveHerdrPaneIdentity(input) {
|
|
|
12
12
|
if (!paneId || !terminalId || !workspaceId) {
|
|
13
13
|
throw new Error("Herdr pane response has no terminal identity");
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
const agent = stringField(pane, "agent", "agent");
|
|
16
|
+
const cwd = stringField(pane, "cwd", "cwd");
|
|
17
|
+
const foregroundCwd = stringField(pane, "foreground_cwd", "foregroundCwd");
|
|
18
|
+
const tabId = stringField(pane, "tab_id", "tabId");
|
|
19
|
+
return {
|
|
20
|
+
paneId,
|
|
21
|
+
terminalId,
|
|
22
|
+
workspaceId,
|
|
23
|
+
...(agent ? { agent } : {}),
|
|
24
|
+
...(cwd ? { cwd } : {}),
|
|
25
|
+
...(foregroundCwd ? { foregroundCwd } : {}),
|
|
26
|
+
...(tabId ? { tabId } : {}),
|
|
27
|
+
};
|
|
16
28
|
}
|
|
17
29
|
finally {
|
|
18
30
|
client.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pane-identity-resolver.js","sourceRoot":"","sources":["../../../src/herdr/pane-identity-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"pane-identity-resolver.js","sourceRoot":"","sources":["../../../src/herdr/pane-identity-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAc7D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAI9C;IACC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa;QAChC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;QACvC,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO;YACL,MAAM;YACN,UAAU;YACV,WAAW;YACX,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAClB,KAA8B,EAC9B,SAAiB,EACjB,SAAiB;IAEjB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
|
|
@@ -2,6 +2,8 @@ export type HerdrRequestId = string;
|
|
|
2
2
|
export type HerdrSocketClientOptions = {
|
|
3
3
|
socketPath: string;
|
|
4
4
|
};
|
|
5
|
+
/** Session-wide topology events that must be subscribed even when no pane ids are known yet. */
|
|
6
|
+
export declare const HERDR_TOPOLOGY_EVENT_TYPES: readonly ["pane.created", "pane.closed", "pane.moved", "pane.agent_detected", "workspace.closed"];
|
|
5
7
|
export declare class HerdrSocketClient {
|
|
6
8
|
#private;
|
|
7
9
|
constructor(options: HerdrSocketClientOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-client.d.ts","sourceRoot":"","sources":["../../../src/herdr/socket-client.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAsBF,qBAAa,iBAAiB;;
|
|
1
|
+
{"version":3,"file":"socket-client.d.ts","sourceRoot":"","sources":["../../../src/herdr/socket-client.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAsBF,gGAAgG;AAChG,eAAO,MAAM,0BAA0B,mGAM7B,CAAC;AAEX,qBAAa,iBAAiB;;gBAShB,OAAO,EAAE,wBAAwB;IAQ7C,KAAK,IAAI,IAAI;IAgCb,OAAO,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAgClC,eAAe,CACpB,MAAM,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,EACnC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,aAAa,CAAC,OAAO,CAAC;CA8I1B"}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { createConnection } from "node:net";
|
|
2
2
|
import { encodeJsonLine, JsonLineDecoder } from "../shared/json-lines.js";
|
|
3
|
+
/** Session-wide topology events that must be subscribed even when no pane ids are known yet. */
|
|
4
|
+
export const HERDR_TOPOLOGY_EVENT_TYPES = [
|
|
5
|
+
"pane.created",
|
|
6
|
+
"pane.closed",
|
|
7
|
+
"pane.moved",
|
|
8
|
+
"pane.agent_detected",
|
|
9
|
+
"workspace.closed",
|
|
10
|
+
];
|
|
3
11
|
export class HerdrSocketClient {
|
|
4
12
|
#decoder = new JsonLineDecoder();
|
|
5
13
|
#pending = new Map();
|
|
6
14
|
#subscribers = new Set();
|
|
7
15
|
#socket;
|
|
8
16
|
#socketPath;
|
|
17
|
+
#eventsSubscribed = false;
|
|
9
18
|
#nextId = 1;
|
|
10
19
|
constructor(options) {
|
|
11
20
|
this.#socketPath = options.socketPath;
|
|
@@ -17,11 +26,30 @@ export class HerdrSocketClient {
|
|
|
17
26
|
close() {
|
|
18
27
|
this.#socket.destroy();
|
|
19
28
|
}
|
|
20
|
-
#request(method, params = {}) {
|
|
29
|
+
#request(method, params = {}, signal) {
|
|
30
|
+
if (signal?.aborted) {
|
|
31
|
+
return Promise.reject(new Error("Herdr request aborted"));
|
|
32
|
+
}
|
|
21
33
|
const id = `herdsman-${this.#nextId}`;
|
|
22
34
|
this.#nextId += 1;
|
|
23
35
|
return new Promise((resolve, reject) => {
|
|
24
|
-
|
|
36
|
+
const onAbort = () => {
|
|
37
|
+
if (!this.#pending.has(id))
|
|
38
|
+
return;
|
|
39
|
+
this.#pending.delete(id);
|
|
40
|
+
reject(new Error("Herdr request aborted"));
|
|
41
|
+
};
|
|
42
|
+
this.#pending.set(id, {
|
|
43
|
+
reject: (error) => {
|
|
44
|
+
signal?.removeEventListener("abort", onAbort);
|
|
45
|
+
reject(error);
|
|
46
|
+
},
|
|
47
|
+
resolve: (value) => {
|
|
48
|
+
signal?.removeEventListener("abort", onAbort);
|
|
49
|
+
resolve(value);
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
25
53
|
this.#socket.write(encodeJsonLine({ id, method, params }));
|
|
26
54
|
});
|
|
27
55
|
}
|
|
@@ -59,6 +87,11 @@ export class HerdrSocketClient {
|
|
|
59
87
|
};
|
|
60
88
|
}
|
|
61
89
|
async *subscribeEvents(params = {}, options = {}) {
|
|
90
|
+
// Herdr 0.9 / protocol 22 ACKs the first events.subscribe, then resets the
|
|
91
|
+
// socket if the same connection sends it again. Never re-subscribe here.
|
|
92
|
+
if (this.#eventsSubscribed) {
|
|
93
|
+
throw new Error("Herdr connection already has an events.subscribe");
|
|
94
|
+
}
|
|
62
95
|
const queue = [];
|
|
63
96
|
let failure;
|
|
64
97
|
let wake;
|
|
@@ -76,30 +109,41 @@ export class HerdrSocketClient {
|
|
|
76
109
|
};
|
|
77
110
|
if (options.signal?.aborted)
|
|
78
111
|
return;
|
|
112
|
+
this.#eventsSubscribed = true;
|
|
79
113
|
this.#subscribers.add(subscriber);
|
|
80
114
|
try {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
115
|
+
try {
|
|
116
|
+
await this.#request("events.subscribe", {
|
|
117
|
+
subscriptions: [
|
|
118
|
+
...HERDR_TOPOLOGY_EVENT_TYPES.map((type) => ({ type })),
|
|
119
|
+
...(params.paneIds ?? []).map((pane_id) => ({
|
|
120
|
+
pane_id,
|
|
121
|
+
type: "pane.agent_status_changed",
|
|
122
|
+
})),
|
|
123
|
+
],
|
|
124
|
+
}, options.signal);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (!options.signal?.aborted)
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
// Drain events already queued before honoring abort so a restart does
|
|
131
|
+
// not drop status already received for panes this connection subscribed
|
|
132
|
+
// to. New panes are not visible here: herdr only emits
|
|
133
|
+
// pane.agent_status_changed for pane-specific subscriptions.
|
|
134
|
+
while (true) {
|
|
98
135
|
if (failure)
|
|
99
136
|
throw failure;
|
|
100
|
-
|
|
137
|
+
if (queue.length > 0) {
|
|
101
138
|
yield queue.shift();
|
|
139
|
+
continue;
|
|
102
140
|
}
|
|
141
|
+
if (options.signal?.aborted)
|
|
142
|
+
return;
|
|
143
|
+
await new Promise((resolve) => {
|
|
144
|
+
wake = resolve;
|
|
145
|
+
options.signal?.addEventListener("abort", () => resolve(), { once: true });
|
|
146
|
+
});
|
|
103
147
|
}
|
|
104
148
|
}
|
|
105
149
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-client.js","sourceRoot":"","sources":["../../../src/herdr/socket-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA4BzE,MAAM,OAAO,iBAAiB;IACnB,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IACrD,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1C,OAAO,CAAS;IAChB,WAAW,CAAS;IAC7B,OAAO,GAAG,CAAC,CAAC;IAEZ,YAAY,OAAiC;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,MAAc,EAAE,SAAkB,EAAE;
|
|
1
|
+
{"version":3,"file":"socket-client.js","sourceRoot":"","sources":["../../../src/herdr/socket-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AgentHistoryService } from "../agent-history/service.js";
|
|
2
2
|
import type { AgentContextSnapshotStore } from "../db/agent-context-snapshots.js";
|
|
3
3
|
import type { AgentStore } from "../db/agents.js";
|
|
4
|
-
import type { AgentContextSnapshotRecord, AgentIndexRecord, AgentListItem, AgentQueryScope, AgentScope, AgentWorkspaceContextSnapshot } from "./contracts.js";
|
|
4
|
+
import type { AgentContextSnapshotRecord, AgentHistoryRef, AgentIndexRecord, AgentListItem, AgentQueryScope, AgentScope, AgentWorkspaceContextSnapshot } from "./contracts.js";
|
|
5
5
|
export type RefreshAgentContextInput = {
|
|
6
6
|
agent: AgentIndexRecord;
|
|
7
7
|
identityChanged: boolean;
|
|
@@ -21,6 +21,9 @@ export declare class AgentContextService {
|
|
|
21
21
|
agents: AgentStore;
|
|
22
22
|
};
|
|
23
23
|
});
|
|
24
|
+
occupiedSessionPathsFor(agent: AgentIndexRecord): ReadonlySet<string>;
|
|
25
|
+
historyLookupInput(agent: AgentIndexRecord, occupiedSessionPaths?: ReadonlySet<string>): ReturnType<typeof historyLookup>;
|
|
26
|
+
preferredHistoryRef(agent: AgentIndexRecord): Promise<AgentHistoryRef | null>;
|
|
24
27
|
refreshAgent(input: RefreshAgentContextInput): Promise<RefreshAgentContextResult>;
|
|
25
28
|
getAgentSnapshot(agentId: string): AgentContextSnapshotRecord | undefined;
|
|
26
29
|
listAgents(scope: AgentQueryScope): AgentListItem[];
|
|
@@ -28,4 +31,17 @@ export declare class AgentContextService {
|
|
|
28
31
|
excludeTerminalId: string;
|
|
29
32
|
}): AgentWorkspaceContextSnapshot | null;
|
|
30
33
|
}
|
|
34
|
+
export declare function occupiedForAgent(agent: AgentIndexRecord, agents: AgentStore, snapshots: AgentContextSnapshotStore): ReadonlySet<string>;
|
|
35
|
+
declare function historyLookup(agent: AgentIndexRecord, agents: AgentStore, snapshots: AgentContextSnapshotStore, occupiedSessionPaths?: ReadonlySet<string>): {
|
|
36
|
+
occupiedSessionPaths: ReadonlySet<string>;
|
|
37
|
+
terminalTitle?: string;
|
|
38
|
+
grokHome?: string;
|
|
39
|
+
agent: string | null;
|
|
40
|
+
agentSession: import("./contracts.js").AgentSessionRef | null;
|
|
41
|
+
cwd: string | null;
|
|
42
|
+
firstSeenAtMs: number;
|
|
43
|
+
foregroundCwd: string | null;
|
|
44
|
+
herdrSessionName: string;
|
|
45
|
+
};
|
|
46
|
+
export {};
|
|
31
47
|
//# sourceMappingURL=agent-context-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-context-service.d.ts","sourceRoot":"","sources":["../../../src/observability/agent-context-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-context-service.d.ts","sourceRoot":"","sources":["../../../src/observability/agent-context-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EACV,0BAA0B,EAC1B,eAAe,EAEf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,UAAU,EACV,6BAA6B,EAE9B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,0BAA0B,CAAC;CACtC,CAAC;AAEF,qBAAa,mBAAmB;;gBAQlB,OAAO,EAAE;QACnB,OAAO,EAAE,mBAAmB,CAAC;QAC7B,MAAM,EAAE;YACN,qBAAqB,EAAE,yBAAyB,CAAC;YACjD,MAAM,EAAE,UAAU,CAAC;SACpB,CAAC;KACH;IAKD,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC;IAIrE,kBAAkB,CAChB,KAAK,EAAE,gBAAgB,EACvB,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACzC,UAAU,CAAC,OAAO,aAAa,CAAC;IAS7B,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAoB7E,YAAY,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAmDvF,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS;IAIzE,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,EAAE;IAUnD,iBAAiB,CACf,KAAK,EAAE,UAAU,GAAG;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAChD,6BAA6B,GAAG,IAAI;CAsBxC;AAuGD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,yBAAyB,GACnC,WAAW,CAAC,MAAM,CAAC,CAYrB;AAMD,iBAAS,aAAa,CACpB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,yBAAyB,EACpC,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;;;;;;;;;;EAe3C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { historySourceFromSessionRef } from "../agent-history/discovery.js";
|
|
1
|
+
import { discoveryRecencyGraceMs, historySourceFromSessionRef, safeAllowedSessionPath, } from "../agent-history/discovery.js";
|
|
3
2
|
import { emptyCompactHistory } from "../agent-history/service.js";
|
|
3
|
+
import { statSourceFingerprint } from "../agent-history/source-fingerprint.js";
|
|
4
4
|
export class AgentContextService {
|
|
5
5
|
#history;
|
|
6
6
|
#stores;
|
|
@@ -9,26 +9,52 @@ export class AgentContextService {
|
|
|
9
9
|
this.#history = options.history;
|
|
10
10
|
this.#stores = options.stores;
|
|
11
11
|
}
|
|
12
|
+
occupiedSessionPathsFor(agent) {
|
|
13
|
+
return occupiedForAgent(agent, this.#stores.agents, this.#stores.agentContextSnapshots);
|
|
14
|
+
}
|
|
15
|
+
historyLookupInput(agent, occupiedSessionPaths) {
|
|
16
|
+
return historyLookup(agent, this.#stores.agents, this.#stores.agentContextSnapshots, occupiedSessionPaths);
|
|
17
|
+
}
|
|
18
|
+
async preferredHistoryRef(agent) {
|
|
19
|
+
const previous = this.#stores.agentContextSnapshots.get(agent.id);
|
|
20
|
+
const occupiedSessionPaths = occupiedForAgent(agent, this.#stores.agents, this.#stores.agentContextSnapshots);
|
|
21
|
+
const occupiedFingerprint = fingerprintOccupied(occupiedSessionPaths);
|
|
22
|
+
const priorOccupiedFingerprint = this.#occupiedFingerprintByAgent.get(agent.id);
|
|
23
|
+
const occupiedChanged = priorOccupiedFingerprint !== undefined && priorOccupiedFingerprint !== occupiedFingerprint;
|
|
24
|
+
return selectPreferredRef({
|
|
25
|
+
agent,
|
|
26
|
+
identityChanged: occupiedChanged,
|
|
27
|
+
occupiedChanged,
|
|
28
|
+
occupiedSessionPaths,
|
|
29
|
+
previous,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
12
32
|
async refreshAgent(input) {
|
|
13
33
|
const previous = this.#stores.agentContextSnapshots.get(input.agent.id);
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const occupiedSessionPaths = input.occupiedSessionPaths ?? occupiedForAgent(input.agent, this.#stores.agents);
|
|
34
|
+
const occupiedSessionPaths = new Set([
|
|
35
|
+
...(input.occupiedSessionPaths ?? []),
|
|
36
|
+
...occupiedForAgent(input.agent, this.#stores.agents, this.#stores.agentContextSnapshots),
|
|
37
|
+
]);
|
|
19
38
|
const occupiedFingerprint = fingerprintOccupied(occupiedSessionPaths);
|
|
20
39
|
const priorOccupiedFingerprint = this.#occupiedFingerprintByAgent.get(input.agent.id);
|
|
21
40
|
const occupiedChanged = priorOccupiedFingerprint !== undefined && priorOccupiedFingerprint !== occupiedFingerprint;
|
|
22
41
|
this.#occupiedFingerprintByAgent.set(input.agent.id, occupiedFingerprint);
|
|
42
|
+
const preferredRef = await selectPreferredRef({
|
|
43
|
+
agent: input.agent,
|
|
44
|
+
identityChanged: input.identityChanged || occupiedChanged,
|
|
45
|
+
occupiedChanged,
|
|
46
|
+
occupiedSessionPaths,
|
|
47
|
+
previous,
|
|
48
|
+
});
|
|
23
49
|
const forceDiscovery = input.forceRefresh ||
|
|
24
50
|
(await shouldForceDiscovery({
|
|
25
51
|
agent: input.agent,
|
|
26
|
-
directAuthoritativeRef,
|
|
52
|
+
directAuthoritativeRef: pathHistoryRefFromAgent(input.agent),
|
|
27
53
|
identityChanged: input.identityChanged || occupiedChanged,
|
|
28
54
|
preferredRef,
|
|
29
55
|
previous,
|
|
30
56
|
}));
|
|
31
|
-
const resolved = bindAuthoritativeId(input.agent, await this.#history.resolveCompactHistory(
|
|
57
|
+
const resolved = bindAuthoritativeId(input.agent, await this.#history.resolveCompactHistory(this.historyLookupInput(input.agent, occupiedSessionPaths), {
|
|
32
58
|
forceDiscovery,
|
|
33
59
|
...(input.forceRefresh === undefined ? {} : { forceRefresh: input.forceRefresh }),
|
|
34
60
|
...(preferredRef ? { preferredRef } : {}),
|
|
@@ -89,15 +115,18 @@ async function shouldForceDiscovery(input) {
|
|
|
89
115
|
const fingerprint = input.previous.sourceFingerprint;
|
|
90
116
|
if (!fingerprint)
|
|
91
117
|
return true;
|
|
92
|
-
const current = await
|
|
118
|
+
const current = await statSourceFingerprint(fingerprint.path);
|
|
93
119
|
return !current || sameFingerprint(fingerprint, current);
|
|
94
120
|
}
|
|
95
121
|
function pathHistoryRefFromAgent(agent) {
|
|
96
122
|
if (agent.agentSession?.kind !== "path")
|
|
97
123
|
return null;
|
|
124
|
+
const path = safeAllowedSessionPath(agent.agentSession.value);
|
|
125
|
+
if (!path)
|
|
126
|
+
return null;
|
|
98
127
|
return {
|
|
99
128
|
kind: "agent_session",
|
|
100
|
-
path
|
|
129
|
+
path,
|
|
101
130
|
source: historySourceFromSessionRef(agent.agentSession),
|
|
102
131
|
value: agent.agentSession.value,
|
|
103
132
|
};
|
|
@@ -129,32 +158,67 @@ function bindAuthoritativeId(agent, resolved) {
|
|
|
129
158
|
historyRef,
|
|
130
159
|
};
|
|
131
160
|
}
|
|
132
|
-
function
|
|
133
|
-
|
|
161
|
+
async function selectPreferredRef(input) {
|
|
162
|
+
const previousRef = input.previous?.historyRef ?? null;
|
|
163
|
+
const directAuthoritativeRef = pathHistoryRefFromAgent(input.agent);
|
|
164
|
+
if (directAuthoritativeRef)
|
|
165
|
+
return directAuthoritativeRef;
|
|
166
|
+
const matchingId = matchingAuthoritativeIdRef(input.agent, previousRef);
|
|
167
|
+
if (matchingId)
|
|
168
|
+
return matchingId;
|
|
169
|
+
if (previousRef?.kind === "discovered_file") {
|
|
170
|
+
const path = previousRef.path ?? previousRef.value;
|
|
171
|
+
if (input.identityChanged || input.occupiedChanged || input.occupiedSessionPaths.has(path)) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
if (!(await discoveredFileStillRecent(input.agent, path)))
|
|
175
|
+
return null;
|
|
176
|
+
return previousRef;
|
|
177
|
+
}
|
|
178
|
+
if (input.agent.agentSession)
|
|
179
|
+
return null;
|
|
180
|
+
return previousRef;
|
|
181
|
+
}
|
|
182
|
+
async function discoveredFileStillRecent(agent, path) {
|
|
183
|
+
const fingerprint = await statSourceFingerprint(path);
|
|
184
|
+
if (!fingerprint)
|
|
185
|
+
return false;
|
|
186
|
+
const graceMs = discoveryRecencyGraceMs({
|
|
187
|
+
agent: agent.agent,
|
|
188
|
+
agentSession: agent.agentSession,
|
|
189
|
+
...(agent.terminalTitle ? { terminalTitle: agent.terminalTitle } : {}),
|
|
190
|
+
});
|
|
191
|
+
return fingerprint.mtimeMs >= agent.firstSeenAt.getTime() - graceMs;
|
|
192
|
+
}
|
|
193
|
+
export function occupiedForAgent(agent, agents, snapshots) {
|
|
194
|
+
const others = agents
|
|
134
195
|
.listForHerdrSession(agent.herdrSessionName)
|
|
135
|
-
.filter((candidate) => candidate.id !== agent.id)
|
|
136
|
-
|
|
196
|
+
.filter((candidate) => candidate.id !== agent.id);
|
|
197
|
+
return new Set([
|
|
198
|
+
...others.flatMap((candidate) => candidate.agentSession?.kind === "path" ? [candidate.agentSession.value] : []),
|
|
199
|
+
...snapshots
|
|
200
|
+
.listByAgentIds(others.map((candidate) => candidate.id))
|
|
201
|
+
.flatMap((snapshot) => (snapshot.historyRef?.path ? [snapshot.historyRef.path] : [])),
|
|
202
|
+
]);
|
|
137
203
|
}
|
|
138
204
|
function fingerprintOccupied(paths) {
|
|
139
205
|
return [...paths].sort().join("\0");
|
|
140
206
|
}
|
|
141
|
-
function historyLookup(agent, agents, occupiedSessionPaths) {
|
|
207
|
+
function historyLookup(agent, agents, snapshots, occupiedSessionPaths) {
|
|
142
208
|
return {
|
|
143
209
|
agent: agent.agent,
|
|
144
210
|
agentSession: agent.agentSession,
|
|
145
211
|
cwd: agent.cwd,
|
|
146
212
|
firstSeenAtMs: agent.firstSeenAt.getTime(),
|
|
147
213
|
foregroundCwd: agent.foregroundCwd,
|
|
214
|
+
herdrSessionName: agent.herdrSessionName,
|
|
148
215
|
...(agent.agent?.toLowerCase() === "grok" && agent.grokHome
|
|
149
216
|
? { grokHome: agent.grokHome }
|
|
150
217
|
: {}),
|
|
151
|
-
|
|
218
|
+
...(agent.terminalTitle ? { terminalTitle: agent.terminalTitle } : {}),
|
|
219
|
+
occupiedSessionPaths: occupiedSessionPaths ?? occupiedForAgent(agent, agents, snapshots),
|
|
152
220
|
};
|
|
153
221
|
}
|
|
154
|
-
async function sourceFingerprint(path) {
|
|
155
|
-
const source = await stat(path).catch(() => null);
|
|
156
|
-
return source ? { mtimeMs: Math.trunc(source.mtimeMs), path, size: source.size } : null;
|
|
157
|
-
}
|
|
158
222
|
function paneRevisionIncreased(current, previous) {
|
|
159
223
|
return current !== null && previous !== null && current > previous;
|
|
160
224
|
}
|