harnery 0.32.0 → 0.33.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.
- package/README.md +2 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +3 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +212 -1
- package/dist/commands/claude-desktop.d.ts +2 -2
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +74 -3
- package/dist/commands/doctor.d.ts +4 -2
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +45 -6
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +10 -0
- package/dist/commands/instructions.d.ts +4 -0
- package/dist/commands/instructions.d.ts.map +1 -0
- package/dist/commands/instructions.js +100 -0
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +4 -1
- package/dist/core/agents/canonical-emit.d.ts +1 -1
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +5 -3
- package/dist/core/agents/cli.js +5 -1
- package/dist/core/agents/coord-client.d.ts +11 -0
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/index.d.ts +1 -0
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +1 -0
- package/dist/core/agents/render/prompt-context.d.ts +6 -0
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +46 -5
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +8 -2
- package/dist/core/agents/rules/stop-hook.js +4 -4
- package/dist/core/agents/state/heartbeat-projector.d.ts +11 -0
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-projector.js +54 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts +15 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +32 -0
- package/dist/core/agents/state/session-state.d.ts +44 -0
- package/dist/core/agents/state/session-state.d.ts.map +1 -0
- package/dist/core/agents/state/session-state.js +81 -0
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +1 -0
- package/dist/core/hooks/adapter/parse.d.ts +1 -1
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +2 -0
- package/dist/core/hooks/cli.js +90 -6
- package/dist/core/hooks/codex-authorization.d.ts +30 -0
- package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
- package/dist/core/hooks/codex-authorization.js +199 -0
- package/dist/core/hooks/events/schema.d.ts +30 -1
- package/dist/core/hooks/events/schema.d.ts.map +1 -1
- package/dist/core/presence/blob.d.ts +4 -0
- package/dist/core/presence/blob.d.ts.map +1 -1
- package/dist/core/presence/blob.js +12 -0
- package/dist/core/presence/index.js +15 -1
- package/dist/lib/claude-desktop.d.ts +47 -0
- package/dist/lib/claude-desktop.d.ts.map +1 -1
- package/dist/lib/claude-desktop.js +169 -1
- package/dist/lib/instructions/bundle.d.ts +33 -0
- package/dist/lib/instructions/bundle.d.ts.map +1 -0
- package/dist/lib/instructions/bundle.js +149 -0
- package/package.json +2 -2
- package/src/commander.ts +3 -1
- package/src/commands/agents.ts +248 -1
- package/src/commands/claude-desktop.ts +106 -5
- package/src/commands/doctor.ts +59 -7
- package/src/commands/init.ts +11 -0
- package/src/commands/instructions.ts +129 -0
- package/src/commands/presence.ts +7 -1
- package/src/core/agents/canonical-emit.ts +6 -4
- package/src/core/agents/cli.ts +6 -1
- package/src/core/agents/coord-client.ts +11 -0
- package/src/core/agents/index.ts +1 -0
- package/src/core/agents/render/prompt-context.ts +71 -6
- package/src/core/agents/render/session-context.ts +14 -2
- package/src/core/agents/rules/stop-hook.ts +5 -5
- package/src/core/agents/state/heartbeat-projector.ts +63 -0
- package/src/core/agents/state/heartbeat-writer.ts +51 -0
- package/src/core/agents/state/session-state.ts +131 -0
- package/src/core/hooks/adapter/events.ts +1 -0
- package/src/core/hooks/adapter/parse.ts +3 -0
- package/src/core/hooks/cli.ts +98 -7
- package/src/core/hooks/codex-authorization.ts +253 -0
- package/src/core/hooks/events/schema.ts +44 -0
- package/src/core/presence/blob.ts +18 -0
- package/src/core/presence/index.ts +18 -1
- package/src/lib/claude-desktop.ts +232 -1
- package/src/lib/instructions/bundle.ts +199 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
function isObject(value) {
|
|
4
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
function stringArray(value) {
|
|
7
|
+
return Array.isArray(value)
|
|
8
|
+
? value.filter((item) => typeof item === "string")
|
|
9
|
+
: [];
|
|
10
|
+
}
|
|
11
|
+
function trustStatus(value) {
|
|
12
|
+
return value === "managed" || value === "trusted" || value === "untrusted" || value === "modified"
|
|
13
|
+
? value
|
|
14
|
+
: null;
|
|
15
|
+
}
|
|
16
|
+
function normalizedPath(value) {
|
|
17
|
+
return value.replaceAll("\\", "/").replace(/\/$/, "").toLowerCase();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convert Codex app-server's `hooks/list` response into the one authorization
|
|
21
|
+
* state doctor needs. This is intentionally read-only: hashes are observed but
|
|
22
|
+
* never persisted, and only commands containing Harnery's `agent-hook` binary
|
|
23
|
+
* are included in the result.
|
|
24
|
+
*/
|
|
25
|
+
export function assessCodexHookList(response, cwd) {
|
|
26
|
+
if (!isObject(response) || !isObject(response.result) || !Array.isArray(response.result.data)) {
|
|
27
|
+
return {
|
|
28
|
+
status: "error",
|
|
29
|
+
detail: "Codex hooks/list returned an invalid response",
|
|
30
|
+
hookCount: 0,
|
|
31
|
+
disabledCount: 0,
|
|
32
|
+
trustCounts: {},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const entries = response.result.data.filter(isObject);
|
|
36
|
+
const expected = normalizedPath(cwd);
|
|
37
|
+
const entry = entries.find((candidate) => {
|
|
38
|
+
const candidateCwd = candidate.cwd;
|
|
39
|
+
return typeof candidateCwd === "string" && normalizedPath(candidateCwd) === expected;
|
|
40
|
+
}) ?? (entries.length === 1 ? entries[0] : undefined);
|
|
41
|
+
if (!entry) {
|
|
42
|
+
return {
|
|
43
|
+
status: "error",
|
|
44
|
+
detail: "Codex hooks/list omitted the requested workspace",
|
|
45
|
+
hookCount: 0,
|
|
46
|
+
disabledCount: 0,
|
|
47
|
+
trustCounts: {},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const errors = stringArray(entry.errors);
|
|
51
|
+
if (errors.length > 0) {
|
|
52
|
+
return {
|
|
53
|
+
status: "error",
|
|
54
|
+
detail: `Codex could not load hooks: ${errors.join("; ")}`,
|
|
55
|
+
hookCount: 0,
|
|
56
|
+
disabledCount: 0,
|
|
57
|
+
trustCounts: {},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const hooks = Array.isArray(entry.hooks) ? entry.hooks.filter(isObject) : [];
|
|
61
|
+
const harneryHooks = hooks.filter((hook) => typeof hook.command === "string" && /(?:^|[\\/\s])agent-hook(?:\s|$)/.test(hook.command));
|
|
62
|
+
if (harneryHooks.length === 0) {
|
|
63
|
+
return {
|
|
64
|
+
status: "not_wired",
|
|
65
|
+
detail: "Codex discovered no Harnery hooks",
|
|
66
|
+
hookCount: 0,
|
|
67
|
+
disabledCount: 0,
|
|
68
|
+
trustCounts: {},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const counts = {};
|
|
72
|
+
let disabledCount = 0;
|
|
73
|
+
for (const hook of harneryHooks) {
|
|
74
|
+
const status = trustStatus(hook.trustStatus);
|
|
75
|
+
if (!status) {
|
|
76
|
+
return {
|
|
77
|
+
status: "error",
|
|
78
|
+
detail: "Codex returned an unknown hook trust state",
|
|
79
|
+
hookCount: harneryHooks.length,
|
|
80
|
+
disabledCount,
|
|
81
|
+
trustCounts: counts,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
counts[status] = (counts[status] ?? 0) + 1;
|
|
85
|
+
if (hook.enabled !== true)
|
|
86
|
+
disabledCount += 1;
|
|
87
|
+
}
|
|
88
|
+
const reviewCount = (counts.untrusted ?? 0) + (counts.modified ?? 0);
|
|
89
|
+
const warnings = stringArray(entry.warnings);
|
|
90
|
+
const warningSuffix = warnings.length > 0 ? `; ${warnings.length} Codex warning(s)` : "";
|
|
91
|
+
if (reviewCount > 0) {
|
|
92
|
+
return {
|
|
93
|
+
status: "review_required",
|
|
94
|
+
detail: `${reviewCount} of ${harneryHooks.length} Harnery hooks require review` +
|
|
95
|
+
` (${counts.untrusted ?? 0} new, ${counts.modified ?? 0} modified)${warningSuffix}`,
|
|
96
|
+
hookCount: harneryHooks.length,
|
|
97
|
+
disabledCount,
|
|
98
|
+
trustCounts: counts,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (disabledCount > 0) {
|
|
102
|
+
return {
|
|
103
|
+
status: "disabled",
|
|
104
|
+
detail: `${disabledCount} of ${harneryHooks.length} trusted Harnery hooks are disabled${warningSuffix}`,
|
|
105
|
+
hookCount: harneryHooks.length,
|
|
106
|
+
disabledCount,
|
|
107
|
+
trustCounts: counts,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
status: "runnable",
|
|
112
|
+
detail: `${harneryHooks.length} Harnery hooks trusted and enabled${warningSuffix}`,
|
|
113
|
+
hookCount: harneryHooks.length,
|
|
114
|
+
disabledCount: 0,
|
|
115
|
+
trustCounts: counts,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Ask the active Codex CLI for hook authorization through its app-server
|
|
120
|
+
* protocol. The child is closed as soon as `hooks/list` responds. Harnery never
|
|
121
|
+
* calls the trust-write method and never reads Codex's private config format.
|
|
122
|
+
*/
|
|
123
|
+
export function probeCodexHookAuthorization(options) {
|
|
124
|
+
const codexBin = options.codexBin ?? "codex";
|
|
125
|
+
const args = options.appServerArgs ?? ["app-server"];
|
|
126
|
+
const timeoutMs = options.timeoutMs ?? 5_000;
|
|
127
|
+
return new Promise((resolve) => {
|
|
128
|
+
const child = spawn(codexBin, args, {
|
|
129
|
+
cwd: options.cwd,
|
|
130
|
+
env: options.env ?? process.env,
|
|
131
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
132
|
+
windowsHide: true,
|
|
133
|
+
});
|
|
134
|
+
const lines = createInterface({ input: child.stdout });
|
|
135
|
+
let settled = false;
|
|
136
|
+
let stderr = "";
|
|
137
|
+
const finish = (result) => {
|
|
138
|
+
if (settled)
|
|
139
|
+
return;
|
|
140
|
+
settled = true;
|
|
141
|
+
clearTimeout(timer);
|
|
142
|
+
lines.close();
|
|
143
|
+
child.stdin.end();
|
|
144
|
+
child.kill();
|
|
145
|
+
resolve(result);
|
|
146
|
+
};
|
|
147
|
+
const fail = (detail) => finish({ status: "error", detail, hookCount: 0, disabledCount: 0, trustCounts: {} });
|
|
148
|
+
const timer = setTimeout(() => {
|
|
149
|
+
fail(`Codex hooks/list timed out after ${timeoutMs}ms`);
|
|
150
|
+
}, timeoutMs);
|
|
151
|
+
child.stderr.on("data", (chunk) => {
|
|
152
|
+
if (stderr.length < 4_096)
|
|
153
|
+
stderr += chunk.toString();
|
|
154
|
+
});
|
|
155
|
+
child.stdin.on("error", (error) => fail(`Codex app-server input failed: ${error.message}`));
|
|
156
|
+
child.on("error", (error) => fail(`could not start Codex app-server: ${error.message}`));
|
|
157
|
+
child.on("close", (code) => {
|
|
158
|
+
if (!settled) {
|
|
159
|
+
const suffix = stderr.trim() ? `: ${stderr.trim().slice(0, 500)}` : "";
|
|
160
|
+
fail(`Codex app-server exited before hooks/list completed (exit ${code ?? "unknown"})${suffix}`);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
lines.on("line", (line) => {
|
|
164
|
+
let message;
|
|
165
|
+
try {
|
|
166
|
+
const parsed = JSON.parse(line);
|
|
167
|
+
if (!isObject(parsed))
|
|
168
|
+
return;
|
|
169
|
+
message = parsed;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (message.id === 0) {
|
|
175
|
+
if (message.error) {
|
|
176
|
+
fail("Codex app-server rejected initialization");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
child.stdin.write(`${JSON.stringify({ method: "initialized" })}\n`);
|
|
180
|
+
child.stdin.write(`${JSON.stringify({ method: "hooks/list", id: 1, params: { cwds: [options.cwd] } })}\n`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (message.id === 1) {
|
|
184
|
+
if (message.error) {
|
|
185
|
+
fail("Codex app-server rejected hooks/list");
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
finish(assessCodexHookList(message, options.cwd));
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
child.stdin.write(`${JSON.stringify({
|
|
192
|
+
method: "initialize",
|
|
193
|
+
id: 0,
|
|
194
|
+
params: {
|
|
195
|
+
clientInfo: { name: "harnery_doctor", title: "Harnery Doctor", version: "0.0.0" },
|
|
196
|
+
},
|
|
197
|
+
})}\n`);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
@@ -41,6 +41,14 @@ export type SessionStart = EventEnvelope<"session.start", {
|
|
|
41
41
|
cwd: string;
|
|
42
42
|
model?: string;
|
|
43
43
|
pid: number;
|
|
44
|
+
/** Content hash of every repo-authored instruction/config file this
|
|
45
|
+
* adapter can load for the session's working-path profile. */
|
|
46
|
+
instruction_bundle_id?: string;
|
|
47
|
+
/** Parallel hash of canonical AGENTS.md + .agents sources. This diagnoses
|
|
48
|
+
* sync drift without splitting behavior cohorts when rendered bytes match. */
|
|
49
|
+
instruction_source_id?: string;
|
|
50
|
+
instruction_profile_root?: string;
|
|
51
|
+
instruction_component_count?: number;
|
|
44
52
|
/** Present iff this session is a `workflow run` child: the run id whose
|
|
45
53
|
* transcript owns it (child env HARNERY_WORKFLOW_RUN_ID). Optional-field
|
|
46
54
|
* addition per the schema evolution rules (minor bump). */
|
|
@@ -65,6 +73,12 @@ export type UserPromptSubmit = EventEnvelope<"user_prompt.submit", {
|
|
|
65
73
|
prompt_text: string;
|
|
66
74
|
truncated?: boolean;
|
|
67
75
|
}>;
|
|
76
|
+
/** Direct adapter evidence that the session is waiting for operator input. */
|
|
77
|
+
export type InteractionInputRequested = EventEnvelope<"interaction.input_requested", {
|
|
78
|
+
request_kind: "permission";
|
|
79
|
+
tool_name?: string;
|
|
80
|
+
reason?: string;
|
|
81
|
+
}>;
|
|
68
82
|
export type TurnStop = EventEnvelope<"turn.stop", {
|
|
69
83
|
tool_call_count: number;
|
|
70
84
|
text_length: number;
|
|
@@ -88,6 +102,17 @@ export type TurnStop = EventEnvelope<"turn.stop", {
|
|
|
88
102
|
/** Up to three bounded examples for diagnosing the mismatches locally. */
|
|
89
103
|
wsl_linux_file_link_examples?: string[];
|
|
90
104
|
}>;
|
|
105
|
+
/** The evaluated end-turn policy outcome. One row per Stop evaluation makes
|
|
106
|
+
* the future bounce denominator explicit and keeps repeated remediation nags
|
|
107
|
+
* from being mistaken for additional human turns. */
|
|
108
|
+
export type StopVerdict = EventEnvelope<"stop.verdict", {
|
|
109
|
+
allow: boolean;
|
|
110
|
+
rule: string;
|
|
111
|
+
reason?: string;
|
|
112
|
+
enforcement_mode: "enforced" | "observe_only" | "exempt" | "fail_open";
|
|
113
|
+
eligible: boolean;
|
|
114
|
+
nag_delivered: boolean;
|
|
115
|
+
}>;
|
|
91
116
|
export type CommandStart = EventEnvelope<"command.start", {
|
|
92
117
|
cmd_id: string;
|
|
93
118
|
intent?: string;
|
|
@@ -205,6 +230,10 @@ export type StateTaskSet = EventEnvelope<"state.task_set", {
|
|
|
205
230
|
/** The name produced by this call, for the Stop-hook naming rule. */
|
|
206
231
|
suggested_session_name?: string | null;
|
|
207
232
|
}>;
|
|
233
|
+
export type StateTaskState = EventEnvelope<"state.task_state", {
|
|
234
|
+
state: "active" | "blocked" | "done";
|
|
235
|
+
reason?: string;
|
|
236
|
+
}>;
|
|
208
237
|
export type StateStatusChecked = EventEnvelope<"state.status_checked", {
|
|
209
238
|
format: "box" | "json" | "table";
|
|
210
239
|
agent_count: number;
|
|
@@ -297,7 +326,7 @@ export type HealthVerdictFailure = EventEnvelope<"health.verdict_failure", {
|
|
|
297
326
|
timeout_ms?: number;
|
|
298
327
|
fallback: "allow";
|
|
299
328
|
}>;
|
|
300
|
-
export type Event = SessionStart | SessionEnd | SubagentStart | SubagentStop | UserPromptSubmit | TurnStop | CommandStart | CommandOutput | CommandEnd | Narration | ToolPreUse | ToolPostUse | ToolPostUseFailure | ToolOutputChunk | ImageCaptured | ContextSampled | ContextCheckpointCreated | ContextCompactionStarted | ContextCompactionCompleted | ContextRecoveryInjected | ClaimAcquire | ClaimRelease | ClaimConflict | StateTaskSet | StateStatusChecked | StateJournalAppend | StatePresenceChange | StateHeartbeat | IdentityAssumed | CouncilOpen | CouncilRoundOpen | CouncilContribution | CouncilRoundClose | CouncilClose | CouncilArchive | DecisionBlock | DecisionWarn | DecisionAllow | HealthHeartbeatHeal | HealthPidmapHeal | HealthHeartbeatSwept | HealthVerdictFailure;
|
|
329
|
+
export type Event = SessionStart | SessionEnd | SubagentStart | SubagentStop | UserPromptSubmit | InteractionInputRequested | TurnStop | StopVerdict | CommandStart | CommandOutput | CommandEnd | Narration | ToolPreUse | ToolPostUse | ToolPostUseFailure | ToolOutputChunk | ImageCaptured | ContextSampled | ContextCheckpointCreated | ContextCompactionStarted | ContextCompactionCompleted | ContextRecoveryInjected | ClaimAcquire | ClaimRelease | ClaimConflict | StateTaskSet | StateTaskState | StateStatusChecked | StateJournalAppend | StatePresenceChange | StateHeartbeat | IdentityAssumed | CouncilOpen | CouncilRoundOpen | CouncilContribution | CouncilRoundClose | CouncilClose | CouncilArchive | DecisionBlock | DecisionWarn | DecisionAllow | HealthHeartbeatHeal | HealthPidmapHeal | HealthHeartbeatSwept | HealthVerdictFailure;
|
|
301
330
|
export type EventType = Event["event_type"];
|
|
302
331
|
/**
|
|
303
332
|
* Redaction marker that may be attached to any `data` payload during emission.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/events/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/events/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* session on this machine; peers render it in their agents list / status box /
|
|
5
5
|
* peer table, labeled by machine.
|
|
6
6
|
*/
|
|
7
|
+
import type { AgentActivity, TaskState } from "../agents/state/session-state.js";
|
|
7
8
|
export interface PresenceAgent {
|
|
8
9
|
instance_id: string;
|
|
9
10
|
name?: string;
|
|
@@ -11,6 +12,9 @@ export interface PresenceAgent {
|
|
|
11
12
|
session_id?: string;
|
|
12
13
|
platform?: string;
|
|
13
14
|
task?: string;
|
|
15
|
+
activity: AgentActivity;
|
|
16
|
+
task_state: TaskState;
|
|
17
|
+
task_state_reason?: string;
|
|
14
18
|
turn_summary?: string;
|
|
15
19
|
files_touched?: string[];
|
|
16
20
|
last_tool?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../../../src/core/presence/blob.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../../../src/core/presence/blob.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AASjF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,CAAC,CAAC;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,CAAC;IACnB;kEAC8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,SAAS,CAmEtF"}
|
|
@@ -49,6 +49,9 @@ export function buildPresenceBlob(coordRoot, now = new Date()) {
|
|
|
49
49
|
session_id: strOr(hb.session_id),
|
|
50
50
|
platform: strOr(hb.platform),
|
|
51
51
|
task: strOr(hb.task),
|
|
52
|
+
activity: activityOrUnknown(hb.activity),
|
|
53
|
+
task_state: taskStateOrActive(hb.task_state),
|
|
54
|
+
task_state_reason: clamp(strOr(hb.task_state_reason), 160),
|
|
52
55
|
turn_summary: clamp(strOr(hb.turn_summary), 160),
|
|
53
56
|
files_touched: Array.isArray(hb.files_touched)
|
|
54
57
|
? hb.files_touched.slice(0, MAX_FILES_PER_AGENT)
|
|
@@ -75,6 +78,9 @@ export function buildPresenceBlob(coordRoot, now = new Date()) {
|
|
|
75
78
|
n: a.name ?? null,
|
|
76
79
|
k: a.kind ?? null,
|
|
77
80
|
t: a.task ?? null,
|
|
81
|
+
a: a.activity,
|
|
82
|
+
l: a.task_state,
|
|
83
|
+
r: a.task_state_reason ?? null,
|
|
78
84
|
s: a.turn_summary ?? null,
|
|
79
85
|
f: [...(a.files_touched ?? [])].sort(),
|
|
80
86
|
}));
|
|
@@ -84,6 +90,12 @@ export function buildPresenceBlob(coordRoot, now = new Date()) {
|
|
|
84
90
|
function strOr(v) {
|
|
85
91
|
return typeof v === "string" && v.length > 0 ? v : undefined;
|
|
86
92
|
}
|
|
93
|
+
function activityOrUnknown(v) {
|
|
94
|
+
return v === "working" || v === "needs_input" || v === "idle" ? v : "unknown";
|
|
95
|
+
}
|
|
96
|
+
function taskStateOrActive(v) {
|
|
97
|
+
return v === "blocked" || v === "done" ? v : "active";
|
|
98
|
+
}
|
|
87
99
|
function clamp(v, max) {
|
|
88
100
|
if (!v)
|
|
89
101
|
return undefined;
|
|
@@ -212,7 +212,7 @@ export function readRemoteMachines(coordRoot, opts = {}) {
|
|
|
212
212
|
machine,
|
|
213
213
|
published_at: blob.published_at,
|
|
214
214
|
age_secs: ageSecs,
|
|
215
|
-
agents: blob.agents,
|
|
215
|
+
agents: blob.agents.map(normalizePresenceAgent),
|
|
216
216
|
});
|
|
217
217
|
}
|
|
218
218
|
out.sort((a, b) => a.machine.localeCompare(b.machine));
|
|
@@ -222,3 +222,17 @@ export function readRemoteMachines(coordRoot, opts = {}) {
|
|
|
222
222
|
return [];
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
|
+
function normalizePresenceAgent(agent) {
|
|
226
|
+
const legacy = agent;
|
|
227
|
+
return {
|
|
228
|
+
...agent,
|
|
229
|
+
activity: legacy.activity === "working" ||
|
|
230
|
+
legacy.activity === "needs_input" ||
|
|
231
|
+
legacy.activity === "idle"
|
|
232
|
+
? legacy.activity
|
|
233
|
+
: "unknown",
|
|
234
|
+
task_state: legacy.task_state === "blocked" || legacy.task_state === "done"
|
|
235
|
+
? legacy.task_state
|
|
236
|
+
: "active",
|
|
237
|
+
};
|
|
238
|
+
}
|
|
@@ -58,6 +58,36 @@ export interface MirrorPlan {
|
|
|
58
58
|
/** Entries skipped because they are archived (opt in via includeArchived). */
|
|
59
59
|
skippedArchived: number;
|
|
60
60
|
}
|
|
61
|
+
export type DesktopLifecycleState = "active" | "blocked" | "done";
|
|
62
|
+
export interface DesktopLifecycleRecord {
|
|
63
|
+
state: DesktopLifecycleState;
|
|
64
|
+
updatedAt: string;
|
|
65
|
+
instanceId: string | null;
|
|
66
|
+
sessionId: string | null;
|
|
67
|
+
reason: string | null;
|
|
68
|
+
}
|
|
69
|
+
export type DesktopTidySource = "lifecycle" | "legacy-prefix";
|
|
70
|
+
export interface DesktopTidyAction {
|
|
71
|
+
entry: DesktopSessionEntry;
|
|
72
|
+
source: DesktopTidySource;
|
|
73
|
+
lifecycle: DesktopLifecycleRecord | null;
|
|
74
|
+
}
|
|
75
|
+
export type DesktopTidySkipReason = "already_archived" | "blocked_title" | "lifecycle_active" | "lifecycle_blocked" | "unmatched";
|
|
76
|
+
export interface DesktopTidySkip {
|
|
77
|
+
entry: DesktopSessionEntry;
|
|
78
|
+
reason: DesktopTidySkipReason;
|
|
79
|
+
lifecycle: DesktopLifecycleRecord | null;
|
|
80
|
+
}
|
|
81
|
+
export interface DesktopTidyPlan {
|
|
82
|
+
actions: DesktopTidyAction[];
|
|
83
|
+
skipped: DesktopTidySkip[];
|
|
84
|
+
}
|
|
85
|
+
export interface DesktopTidyOptions {
|
|
86
|
+
/** Restrict entries to accounts whose UUID starts with one of these prefixes. */
|
|
87
|
+
accounts?: string[];
|
|
88
|
+
/** Accept an unmatched historical `[DONE]` title as a compatibility fallback. */
|
|
89
|
+
includeLegacyPrefix?: boolean;
|
|
90
|
+
}
|
|
61
91
|
/**
|
|
62
92
|
* Candidate desktop-app data directories for this machine, most specific
|
|
63
93
|
* first. Only directories that exist AND contain a claude-code-sessions/
|
|
@@ -102,4 +132,21 @@ export declare function planMirror(accounts: DesktopAccount[], opts?: MirrorOpti
|
|
|
102
132
|
export declare function applyMirror(plan: MirrorPlan): {
|
|
103
133
|
copied: number;
|
|
104
134
|
};
|
|
135
|
+
/**
|
|
136
|
+
* Read the latest durable lifecycle declaration for every Harnery session.
|
|
137
|
+
*
|
|
138
|
+
* The canonical ledger rotates into `events-*.ndjson` archives. Stream each
|
|
139
|
+
* file rather than loading the whole history into one string, then compare
|
|
140
|
+
* event timestamps because adapter replay may append an older event later.
|
|
141
|
+
* Records are indexed by both session_id and instance_id so a desktop
|
|
142
|
+
* cliSessionId can match either identity shape used by older adapters.
|
|
143
|
+
*/
|
|
144
|
+
export declare function readDesktopLifecycleIndex(coordRoot: string): Promise<Map<string, DesktopLifecycleRecord>>;
|
|
145
|
+
/** Select desktop entries whose durable lifecycle is done. */
|
|
146
|
+
export declare function planTidy(accounts: DesktopAccount[], lifecycleBySession: ReadonlyMap<string, DesktopLifecycleRecord>, opts?: DesktopTidyOptions): DesktopTidyPlan;
|
|
147
|
+
/** Apply a tidy plan with same-directory temp files and atomic renames. */
|
|
148
|
+
export declare function applyTidy(plan: DesktopTidyPlan): {
|
|
149
|
+
archived: number;
|
|
150
|
+
alreadyArchived: number;
|
|
151
|
+
};
|
|
105
152
|
//# sourceMappingURL=claude-desktop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/lib/claude-desktop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/lib/claude-desktop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { copyFileSync, createReadStream, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
3
|
import { homedir } from "node:os";
|
|
3
4
|
import { basename, dirname, join } from "node:path";
|
|
5
|
+
import { createInterface } from "node:readline";
|
|
4
6
|
const SESSIONS_DIRNAME = "claude-code-sessions";
|
|
5
7
|
function isWsl() {
|
|
6
8
|
if (process.env.WSL_DISTRO_NAME)
|
|
@@ -218,3 +220,169 @@ export function applyMirror(plan) {
|
|
|
218
220
|
}
|
|
219
221
|
return { copied };
|
|
220
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Read the latest durable lifecycle declaration for every Harnery session.
|
|
225
|
+
*
|
|
226
|
+
* The canonical ledger rotates into `events-*.ndjson` archives. Stream each
|
|
227
|
+
* file rather than loading the whole history into one string, then compare
|
|
228
|
+
* event timestamps because adapter replay may append an older event later.
|
|
229
|
+
* Records are indexed by both session_id and instance_id so a desktop
|
|
230
|
+
* cliSessionId can match either identity shape used by older adapters.
|
|
231
|
+
*/
|
|
232
|
+
export async function readDesktopLifecycleIndex(coordRoot) {
|
|
233
|
+
const coordDir = join(coordRoot, ".harnery");
|
|
234
|
+
const archives = safeReaddir(coordDir)
|
|
235
|
+
.filter((name) => name.startsWith("events-") && name.endsWith(".ndjson"))
|
|
236
|
+
.sort();
|
|
237
|
+
const files = [...archives, "events.ndjson"]
|
|
238
|
+
.map((name) => join(coordDir, name))
|
|
239
|
+
.filter((path) => existsSync(path));
|
|
240
|
+
const records = new Map();
|
|
241
|
+
const timestamps = new Map();
|
|
242
|
+
for (const file of files) {
|
|
243
|
+
let lines = null;
|
|
244
|
+
try {
|
|
245
|
+
lines = createInterface({
|
|
246
|
+
input: createReadStream(file, { encoding: "utf8" }),
|
|
247
|
+
crlfDelay: Infinity,
|
|
248
|
+
});
|
|
249
|
+
for await (const line of lines) {
|
|
250
|
+
if (!line.trim())
|
|
251
|
+
continue;
|
|
252
|
+
let raw;
|
|
253
|
+
try {
|
|
254
|
+
raw = JSON.parse(line);
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (!raw || typeof raw !== "object")
|
|
260
|
+
continue;
|
|
261
|
+
const event = raw;
|
|
262
|
+
if (event.event_type !== "state.task_state" || typeof event.ts !== "string")
|
|
263
|
+
continue;
|
|
264
|
+
const data = event.data;
|
|
265
|
+
if (!data || typeof data !== "object")
|
|
266
|
+
continue;
|
|
267
|
+
const state = data.state;
|
|
268
|
+
if (state !== "active" && state !== "blocked" && state !== "done")
|
|
269
|
+
continue;
|
|
270
|
+
const instanceId = typeof event.instance_id === "string" ? event.instance_id : null;
|
|
271
|
+
const sessionId = typeof event.session_id === "string" ? event.session_id : null;
|
|
272
|
+
const reasonValue = data.reason;
|
|
273
|
+
const record = {
|
|
274
|
+
state,
|
|
275
|
+
updatedAt: event.ts,
|
|
276
|
+
instanceId,
|
|
277
|
+
sessionId,
|
|
278
|
+
reason: typeof reasonValue === "string" && reasonValue.length > 0 ? reasonValue : null,
|
|
279
|
+
};
|
|
280
|
+
const timestamp = Number.isFinite(Date.parse(event.ts)) ? Date.parse(event.ts) : 0;
|
|
281
|
+
for (const key of new Set([sessionId, instanceId].filter((value) => !!value))) {
|
|
282
|
+
const priorTimestamp = timestamps.get(key);
|
|
283
|
+
if (priorTimestamp !== undefined && priorTimestamp > timestamp)
|
|
284
|
+
continue;
|
|
285
|
+
timestamps.set(key, timestamp);
|
|
286
|
+
records.set(key, record);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// A missing or concurrently rotated event file cannot make tidy unsafe:
|
|
292
|
+
// absent lifecycle evidence leaves entries unmatched and therefore skipped.
|
|
293
|
+
}
|
|
294
|
+
finally {
|
|
295
|
+
lines?.close();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return records;
|
|
299
|
+
}
|
|
300
|
+
/** Select desktop entries whose durable lifecycle is done. */
|
|
301
|
+
export function planTidy(accounts, lifecycleBySession, opts = {}) {
|
|
302
|
+
const selectedAccounts = accounts.filter((account) => !opts.accounts?.length ||
|
|
303
|
+
opts.accounts.some((prefix) => account.accountUuid.startsWith(prefix)));
|
|
304
|
+
const actions = [];
|
|
305
|
+
const skipped = [];
|
|
306
|
+
for (const account of selectedAccounts) {
|
|
307
|
+
for (const entry of account.entries) {
|
|
308
|
+
const lifecycle = lifecycleForEntry(entry, lifecycleBySession);
|
|
309
|
+
if (entry.isArchived) {
|
|
310
|
+
skipped.push({ entry, reason: "already_archived", lifecycle });
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (hasLifecyclePrefix(entry.title, "BLOCKED")) {
|
|
314
|
+
skipped.push({ entry, reason: "blocked_title", lifecycle });
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (lifecycle) {
|
|
318
|
+
if (lifecycle.state === "done") {
|
|
319
|
+
actions.push({ entry, source: "lifecycle", lifecycle });
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
skipped.push({ entry, reason: `lifecycle_${lifecycle.state}`, lifecycle });
|
|
323
|
+
}
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
if (opts.includeLegacyPrefix && hasLifecyclePrefix(entry.title, "DONE")) {
|
|
327
|
+
actions.push({ entry, source: "legacy-prefix", lifecycle: null });
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
skipped.push({ entry, reason: "unmatched", lifecycle: null });
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return { actions, skipped };
|
|
335
|
+
}
|
|
336
|
+
/** Apply a tidy plan with same-directory temp files and atomic renames. */
|
|
337
|
+
export function applyTidy(plan) {
|
|
338
|
+
let archived = 0;
|
|
339
|
+
let alreadyArchived = 0;
|
|
340
|
+
for (const action of plan.actions) {
|
|
341
|
+
if (archiveEntry(action.entry.file))
|
|
342
|
+
archived++;
|
|
343
|
+
else
|
|
344
|
+
alreadyArchived++;
|
|
345
|
+
}
|
|
346
|
+
return { archived, alreadyArchived };
|
|
347
|
+
}
|
|
348
|
+
function lifecycleForEntry(entry, lifecycleBySession) {
|
|
349
|
+
if (entry.cliSessionId) {
|
|
350
|
+
const lifecycle = lifecycleBySession.get(entry.cliSessionId);
|
|
351
|
+
if (lifecycle)
|
|
352
|
+
return lifecycle;
|
|
353
|
+
}
|
|
354
|
+
return entry.sessionId ? (lifecycleBySession.get(entry.sessionId) ?? null) : null;
|
|
355
|
+
}
|
|
356
|
+
function hasLifecyclePrefix(title, state) {
|
|
357
|
+
if (!title)
|
|
358
|
+
return false;
|
|
359
|
+
return new RegExp(`^\\s*\\[${state}\\](?:\\s*-|\\s|$)`, "i").test(title);
|
|
360
|
+
}
|
|
361
|
+
function archiveEntry(file) {
|
|
362
|
+
const text = readFileSync(file, "utf8");
|
|
363
|
+
const raw = JSON.parse(text);
|
|
364
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
365
|
+
throw new Error(`desktop entry is not a JSON object: ${file}`);
|
|
366
|
+
}
|
|
367
|
+
const entry = raw;
|
|
368
|
+
if (entry.isArchived === true)
|
|
369
|
+
return false;
|
|
370
|
+
entry.isArchived = true;
|
|
371
|
+
const pretty = text.includes("\n");
|
|
372
|
+
const trailingNewline = text.endsWith("\n") ? "\n" : "";
|
|
373
|
+
const next = `${JSON.stringify(entry, null, pretty ? 2 : undefined)}${trailingNewline}`;
|
|
374
|
+
const temp = join(dirname(file), `.${basename(file)}.${process.pid}.${randomUUID()}.tmp`);
|
|
375
|
+
try {
|
|
376
|
+
writeFileSync(temp, next, { encoding: "utf8", mode: statSync(file).mode });
|
|
377
|
+
renameSync(temp, file);
|
|
378
|
+
}
|
|
379
|
+
finally {
|
|
380
|
+
try {
|
|
381
|
+
unlinkSync(temp);
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
// rename already consumed the temp file, or creation failed before it existed
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return true;
|
|
388
|
+
}
|