@scotthuang/agent-knock-knock 0.10.4 → 0.11.1
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/CHANGELOG.md +17 -0
- package/README.md +3 -3
- package/dist/src/cli.js +209 -22
- package/dist/src/cli.js.map +1 -1
- package/dist/src/codex-store-adapter.d.ts +21 -1
- package/dist/src/codex-store-adapter.js +449 -26
- package/dist/src/codex-store-adapter.js.map +1 -1
- package/dist/src/native-thread-resume-snapshot.d.ts +87 -0
- package/dist/src/native-thread-resume-snapshot.js +451 -0
- package/dist/src/native-thread-resume-snapshot.js.map +1 -0
- package/dist/src/openclaw-plugin-helpers.d.ts +18 -1
- package/dist/src/openclaw-plugin-helpers.js +116 -16
- package/dist/src/openclaw-plugin-helpers.js.map +1 -1
- package/dist/src/openclaw-plugin.js +131 -16
- package/dist/src/openclaw-plugin.js.map +1 -1
- package/docs/quickstart-tmux.md +2 -2
- package/package.json +1 -1
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +6 -4
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { isExactNativeThreadId } from "./managed-session.js";
|
|
5
|
+
export const NATIVE_THREAD_RESUME_SNAPSHOT_TTL_MS = 5 * 60 * 1000;
|
|
6
|
+
export const NATIVE_THREAD_RESUME_SNAPSHOT_SCHEMA = "agent-knock-knock/native-thread-resume-snapshot";
|
|
7
|
+
export const NATIVE_THREAD_RESUME_SNAPSHOT_VERSION = 1;
|
|
8
|
+
const PRIVATE_DIRECTORY_MODE = 0o700;
|
|
9
|
+
const PRIVATE_FILE_MODE = 0o600;
|
|
10
|
+
const NO_FOLLOW_FLAG = fs.constants.O_NOFOLLOW ?? 0;
|
|
11
|
+
const SNAPSHOT_ID_PATTERN = /^rs_[A-Za-z0-9_-]{22}$/u;
|
|
12
|
+
const SNAPSHOT_HANDLE_PATTERN = /^(rs_[A-Za-z0-9_-]{22}):([1-9][0-9]*)$/u;
|
|
13
|
+
const SHORT_ID_PATTERN = /^@[a-f0-9]{8,32}$/u;
|
|
14
|
+
export function sortNativeThreadCandidates(candidates) {
|
|
15
|
+
return [...candidates].sort((left, right) => {
|
|
16
|
+
const timestampDifference = Number(right.updated_at_ms ?? 0) - Number(left.updated_at_ms ?? 0);
|
|
17
|
+
return timestampDifference ||
|
|
18
|
+
left.native_thread_id.localeCompare(right.native_thread_id);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function collisionSafeNativeThreadShortIds(nativeThreadIds) {
|
|
22
|
+
const normalized = nativeThreadIds.map((value) => value.toLowerCase().replaceAll("-", ""));
|
|
23
|
+
if (new Set(normalized).size !== normalized.length) {
|
|
24
|
+
throw new Error("resume snapshot contains duplicate native thread ids");
|
|
25
|
+
}
|
|
26
|
+
const result = new Map();
|
|
27
|
+
for (let index = 0; index < normalized.length; index += 1) {
|
|
28
|
+
const compact = normalized[index];
|
|
29
|
+
let length = 8;
|
|
30
|
+
while (length <= compact.length &&
|
|
31
|
+
normalized.some((other, otherIndex) => otherIndex !== index &&
|
|
32
|
+
other.startsWith(compact.slice(0, length)))) {
|
|
33
|
+
length += 1;
|
|
34
|
+
}
|
|
35
|
+
if (length > compact.length) {
|
|
36
|
+
throw new Error("resume snapshot short ids cannot be made unique");
|
|
37
|
+
}
|
|
38
|
+
result.set(nativeThreadIds[index].toLowerCase(), `@${compact.slice(0, length)}`);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
export function canonicalNativeThreadResumeSnapshotRows(snapshotId, candidates) {
|
|
43
|
+
assertSnapshotId(snapshotId);
|
|
44
|
+
const ordered = sortNativeThreadCandidates(candidates);
|
|
45
|
+
const shortIds = collisionSafeNativeThreadShortIds(ordered.map((candidate) => candidate.native_thread_id));
|
|
46
|
+
return ordered.map((candidate, index) => ({
|
|
47
|
+
selection_number: index + 1,
|
|
48
|
+
short_id: shortIds.get(candidate.native_thread_id.toLowerCase()),
|
|
49
|
+
selection_handle: `${snapshotId}:${index + 1}`,
|
|
50
|
+
native_thread_id: candidate.native_thread_id,
|
|
51
|
+
candidate_token: candidate.candidate_token,
|
|
52
|
+
resumable: candidate.resumable,
|
|
53
|
+
unavailable_reason: candidate.unavailable_reason
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
export function nativeThreadResumeSnapshotRowsMatchCandidates(snapshot, candidates) {
|
|
57
|
+
return JSON.stringify(canonicalNativeThreadResumeSnapshotRows(snapshot.snapshot_id, candidates)) === JSON.stringify(snapshot.rows);
|
|
58
|
+
}
|
|
59
|
+
export function nativeThreadCandidateSnapshotFingerprint(candidates) {
|
|
60
|
+
return createHash("sha256")
|
|
61
|
+
.update(stableStringify(candidates.map((candidate) => ({
|
|
62
|
+
native_thread_id: candidate.native_thread_id,
|
|
63
|
+
candidate_token: candidate.candidate_token ?? null,
|
|
64
|
+
agent: candidate.agent,
|
|
65
|
+
workspace: path.resolve(candidate.workspace),
|
|
66
|
+
title: candidate.title ?? null,
|
|
67
|
+
preview: candidate.preview ?? null,
|
|
68
|
+
updated_at: candidate.updated_at ?? null,
|
|
69
|
+
updated_at_ms: candidate.updated_at_ms ?? null,
|
|
70
|
+
archived: candidate.archived ?? false,
|
|
71
|
+
active_elsewhere: candidate.active_elsewhere ?? false,
|
|
72
|
+
managed_session_id: candidate.managed_session_id ?? null,
|
|
73
|
+
resumable: candidate.resumable,
|
|
74
|
+
unavailable_reason: candidate.unavailable_reason ?? null
|
|
75
|
+
}))))
|
|
76
|
+
.digest("hex");
|
|
77
|
+
}
|
|
78
|
+
export function terminalActionFingerprint(value) {
|
|
79
|
+
return createHash("sha256")
|
|
80
|
+
.update(stableStringify(value ?? null))
|
|
81
|
+
.digest("hex");
|
|
82
|
+
}
|
|
83
|
+
export function verifiedPreviousResumeCandidate({ terminalId, agent, workspace, currentSession, transition, candidates }) {
|
|
84
|
+
const binding = currentSession?.binding;
|
|
85
|
+
const after = transition?.after_binding;
|
|
86
|
+
if (currentSession?.status !== "bound" ||
|
|
87
|
+
!binding ||
|
|
88
|
+
!currentSession.last_transition_id ||
|
|
89
|
+
!transition ||
|
|
90
|
+
transition.transition_id !== currentSession.last_transition_id ||
|
|
91
|
+
transition.status !== "committed" ||
|
|
92
|
+
transition.target_session_id !== currentSession.session_id ||
|
|
93
|
+
transition.terminal_id !== terminalId ||
|
|
94
|
+
transition.agent !== agent ||
|
|
95
|
+
path.resolve(transition.workspace) !== path.resolve(workspace) ||
|
|
96
|
+
path.resolve(currentSession.workspace) !== path.resolve(workspace) ||
|
|
97
|
+
!after ||
|
|
98
|
+
!lifecycleAfterBindingMatchesCurrent(after, binding)) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
const sourceNativeThreadId = transition.before_native_thread_id.toLowerCase();
|
|
102
|
+
if (!isExactNativeThreadId(sourceNativeThreadId) ||
|
|
103
|
+
sourceNativeThreadId === binding.native_thread_id?.toLowerCase()) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const matches = candidates.filter((candidate) => candidate.native_thread_id === sourceNativeThreadId);
|
|
107
|
+
if (matches.length !== 1) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const candidate = matches[0];
|
|
111
|
+
if (candidate.resumable !== true ||
|
|
112
|
+
candidate.active_elsewhere === true ||
|
|
113
|
+
!candidate.candidate_token ||
|
|
114
|
+
(transition.source_session_id
|
|
115
|
+
? candidate.managed_session_id !== transition.source_session_id
|
|
116
|
+
: candidate.managed_session_id !== undefined)) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
return candidate;
|
|
120
|
+
}
|
|
121
|
+
export function lifecycleAfterBindingMatchesCurrent(after, current) {
|
|
122
|
+
const afterProcess = after.native_process;
|
|
123
|
+
const currentProcess = current.native_process;
|
|
124
|
+
return (after.binding_id === current.binding_id &&
|
|
125
|
+
after.generation === current.generation &&
|
|
126
|
+
after.terminal_id === current.terminal_id &&
|
|
127
|
+
terminalControlKey(after.terminal_control) ===
|
|
128
|
+
terminalControlKey(current.terminal_control) &&
|
|
129
|
+
after.terminal_control.panePid === current.terminal_control.panePid &&
|
|
130
|
+
after.native_thread_id?.toLowerCase() ===
|
|
131
|
+
current.native_thread_id?.toLowerCase() &&
|
|
132
|
+
afterProcess.pid === currentProcess.pid &&
|
|
133
|
+
(!afterProcess.process_uuid ||
|
|
134
|
+
afterProcess.process_uuid === currentProcess.process_uuid) &&
|
|
135
|
+
(!afterProcess.process_birth ||
|
|
136
|
+
afterProcess.process_birth === currentProcess.process_birth) &&
|
|
137
|
+
(!afterProcess.rollout ||
|
|
138
|
+
JSON.stringify(afterProcess.rollout) ===
|
|
139
|
+
JSON.stringify(currentProcess.rollout)));
|
|
140
|
+
}
|
|
141
|
+
export function createNativeThreadResumeSnapshot({ storeDir, selectionScope, terminalId, agent, workspace, terminalControl, currentSessionId, currentNativeThreadId, expectedBindingToken, terminalActionFingerprint: actionFingerprint, candidates, now = new Date(), ttlMs = NATIVE_THREAD_RESUME_SNAPSHOT_TTL_MS }) {
|
|
142
|
+
if (!selectionScope.trim()) {
|
|
143
|
+
throw new Error("resume snapshot selection scope is required");
|
|
144
|
+
}
|
|
145
|
+
if (!Number.isSafeInteger(ttlMs) || ttlMs <= 0) {
|
|
146
|
+
throw new Error("resume snapshot TTL must be a positive integer");
|
|
147
|
+
}
|
|
148
|
+
const ordered = sortNativeThreadCandidates(candidates);
|
|
149
|
+
const snapshotId = `rs_${randomBytes(16).toString("base64url")}`;
|
|
150
|
+
const rows = canonicalNativeThreadResumeSnapshotRows(snapshotId, ordered);
|
|
151
|
+
return {
|
|
152
|
+
schema: NATIVE_THREAD_RESUME_SNAPSHOT_SCHEMA,
|
|
153
|
+
version: NATIVE_THREAD_RESUME_SNAPSHOT_VERSION,
|
|
154
|
+
snapshot_id: snapshotId,
|
|
155
|
+
store_key: resumeSnapshotStoreKey(storeDir),
|
|
156
|
+
selection_scope: selectionScope,
|
|
157
|
+
created_at: now.toISOString(),
|
|
158
|
+
expires_at: new Date(now.getTime() + ttlMs).toISOString(),
|
|
159
|
+
terminal_id: terminalId,
|
|
160
|
+
agent,
|
|
161
|
+
workspace: path.resolve(workspace),
|
|
162
|
+
terminal_control: {
|
|
163
|
+
target: terminalControl.target,
|
|
164
|
+
socket_path: terminalControl.socketPath,
|
|
165
|
+
pane_pid: terminalControl.panePid
|
|
166
|
+
},
|
|
167
|
+
current_session_id: currentSessionId,
|
|
168
|
+
current_native_thread_id: currentNativeThreadId,
|
|
169
|
+
expected_binding_token: expectedBindingToken,
|
|
170
|
+
terminal_action_fingerprint: actionFingerprint,
|
|
171
|
+
candidate_snapshot_fingerprint: nativeThreadCandidateSnapshotFingerprint(ordered),
|
|
172
|
+
rows
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export function saveNativeThreadResumeSnapshot(runtimeDir, storeDir, snapshot, now = new Date()) {
|
|
176
|
+
assertNativeThreadResumeSnapshot(snapshot, storeDir);
|
|
177
|
+
const directory = resumeSnapshotDirectory(runtimeDir, storeDir);
|
|
178
|
+
ensurePrivateDirectory(directory);
|
|
179
|
+
cleanupExpiredResumeSnapshots(directory, now);
|
|
180
|
+
const filePath = resumeSnapshotPath(runtimeDir, storeDir, snapshot.snapshot_id);
|
|
181
|
+
assertRegularOrAbsent(filePath);
|
|
182
|
+
const tempPath = path.join(directory, `.${snapshot.snapshot_id}.${process.pid}.${randomUUID()}.tmp`);
|
|
183
|
+
let fd;
|
|
184
|
+
try {
|
|
185
|
+
fd = fs.openSync(tempPath, fs.constants.O_CREAT |
|
|
186
|
+
fs.constants.O_EXCL |
|
|
187
|
+
fs.constants.O_WRONLY |
|
|
188
|
+
NO_FOLLOW_FLAG, PRIVATE_FILE_MODE);
|
|
189
|
+
fs.fchmodSync(fd, PRIVATE_FILE_MODE);
|
|
190
|
+
fs.writeFileSync(fd, `${JSON.stringify(snapshot, null, 2)}\n`, "utf8");
|
|
191
|
+
fs.fsyncSync(fd);
|
|
192
|
+
fs.closeSync(fd);
|
|
193
|
+
fd = undefined;
|
|
194
|
+
assertRegularOrAbsent(filePath);
|
|
195
|
+
fs.renameSync(tempPath, filePath);
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
if (fd !== undefined) {
|
|
199
|
+
fs.closeSync(fd);
|
|
200
|
+
}
|
|
201
|
+
fs.rmSync(tempPath, { force: true });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export function loadNativeThreadResumeSnapshot(runtimeDir, storeDir, snapshotId, now = new Date()) {
|
|
205
|
+
assertSnapshotId(snapshotId);
|
|
206
|
+
const filePath = resumeSnapshotPath(runtimeDir, storeDir, snapshotId);
|
|
207
|
+
let fd;
|
|
208
|
+
try {
|
|
209
|
+
fd = fs.openSync(filePath, fs.constants.O_RDONLY | NO_FOLLOW_FLAG);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
if (error.code === "ENOENT") {
|
|
213
|
+
throw new Error("resume selection snapshot is missing; run /akk threads again");
|
|
214
|
+
}
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
let parsed;
|
|
218
|
+
try {
|
|
219
|
+
const stat = fs.fstatSync(fd);
|
|
220
|
+
if (!stat.isFile()) {
|
|
221
|
+
throw new Error("resume selection snapshot is not a regular file");
|
|
222
|
+
}
|
|
223
|
+
parsed = JSON.parse(fs.readFileSync(fd, "utf8"));
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
throw new Error("resume selection snapshot is unreadable; run /akk threads again");
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
fs.closeSync(fd);
|
|
230
|
+
}
|
|
231
|
+
assertNativeThreadResumeSnapshot(parsed, storeDir, snapshotId);
|
|
232
|
+
if (Date.parse(parsed.created_at) > now.getTime()) {
|
|
233
|
+
throw new Error("resume selection snapshot is from the future; run /akk threads again");
|
|
234
|
+
}
|
|
235
|
+
if (Date.parse(parsed.expires_at) <= now.getTime()) {
|
|
236
|
+
throw new Error("resume selection snapshot expired; run /akk threads again");
|
|
237
|
+
}
|
|
238
|
+
return parsed;
|
|
239
|
+
}
|
|
240
|
+
export function resolveNativeThreadResumeSelection({ runtimeDir, storeDir, terminalId, selectionScope, snapshotId, selectionNumber, shortId, selectionHandle, now = new Date() }) {
|
|
241
|
+
const handleMatch = selectionHandle
|
|
242
|
+
? SNAPSHOT_HANDLE_PATTERN.exec(selectionHandle)
|
|
243
|
+
: undefined;
|
|
244
|
+
if (selectionHandle && !handleMatch) {
|
|
245
|
+
throw new Error("resume selection handle is malformed; run /akk threads again");
|
|
246
|
+
}
|
|
247
|
+
if (selectionHandle && snapshotId) {
|
|
248
|
+
throw new Error("resume selection handle cannot be combined with a snapshot id");
|
|
249
|
+
}
|
|
250
|
+
const resolvedSnapshotId = handleMatch?.[1] ?? snapshotId;
|
|
251
|
+
if (!resolvedSnapshotId) {
|
|
252
|
+
throw new Error("resume selection snapshot is required; run /akk threads again");
|
|
253
|
+
}
|
|
254
|
+
const selectors = [
|
|
255
|
+
handleMatch ? "handle" : undefined,
|
|
256
|
+
selectionNumber !== undefined ? "number" : undefined,
|
|
257
|
+
shortId !== undefined ? "short" : undefined
|
|
258
|
+
].filter(Boolean);
|
|
259
|
+
if (selectors.length !== 1) {
|
|
260
|
+
throw new Error("exactly one snapshot-bound resume selection is required");
|
|
261
|
+
}
|
|
262
|
+
const snapshot = loadNativeThreadResumeSnapshot(runtimeDir, storeDir, resolvedSnapshotId, now);
|
|
263
|
+
if (snapshot.terminal_id !== terminalId ||
|
|
264
|
+
snapshot.selection_scope !== selectionScope) {
|
|
265
|
+
throw new Error("resume selection belongs to another terminal or OpenClaw session; run /akk threads again");
|
|
266
|
+
}
|
|
267
|
+
const handleNumber = handleMatch ? Number(handleMatch[2]) : undefined;
|
|
268
|
+
const normalizedShortId = shortId?.toLowerCase();
|
|
269
|
+
if (normalizedShortId && !SHORT_ID_PATTERN.test(normalizedShortId)) {
|
|
270
|
+
throw new Error("resume short id is malformed; run /akk threads again");
|
|
271
|
+
}
|
|
272
|
+
const row = snapshot.rows.find((candidate) => handleNumber !== undefined
|
|
273
|
+
? candidate.selection_number === handleNumber &&
|
|
274
|
+
candidate.selection_handle === selectionHandle
|
|
275
|
+
: selectionNumber !== undefined
|
|
276
|
+
? candidate.selection_number === selectionNumber
|
|
277
|
+
: candidate.short_id === normalizedShortId);
|
|
278
|
+
if (!row) {
|
|
279
|
+
throw new Error("resume selection is not in the referenced snapshot; run /akk threads again");
|
|
280
|
+
}
|
|
281
|
+
if (!row.resumable || !row.candidate_token) {
|
|
282
|
+
throw new Error(`selected native thread is not resumable: ${row.unavailable_reason ?? "unavailable"}`);
|
|
283
|
+
}
|
|
284
|
+
return { snapshot, row };
|
|
285
|
+
}
|
|
286
|
+
function resumeSnapshotStoreKey(storeDir) {
|
|
287
|
+
return createHash("sha256")
|
|
288
|
+
.update(path.resolve(storeDir))
|
|
289
|
+
.digest("hex")
|
|
290
|
+
.slice(0, 20);
|
|
291
|
+
}
|
|
292
|
+
function resumeSnapshotDirectory(runtimeDir, storeDir) {
|
|
293
|
+
return path.join(path.resolve(runtimeDir), "resume-snapshots", resumeSnapshotStoreKey(storeDir));
|
|
294
|
+
}
|
|
295
|
+
function resumeSnapshotPath(runtimeDir, storeDir, snapshotId) {
|
|
296
|
+
assertSnapshotId(snapshotId);
|
|
297
|
+
return path.join(resumeSnapshotDirectory(runtimeDir, storeDir), `${snapshotId}.json`);
|
|
298
|
+
}
|
|
299
|
+
function assertSnapshotId(snapshotId) {
|
|
300
|
+
if (!SNAPSHOT_ID_PATTERN.test(snapshotId)) {
|
|
301
|
+
throw new Error("resume selection snapshot id is malformed");
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function assertNativeThreadResumeSnapshot(value, storeDir, expectedSnapshotId) {
|
|
305
|
+
if (!isRecord(value) ||
|
|
306
|
+
value.schema !== NATIVE_THREAD_RESUME_SNAPSHOT_SCHEMA ||
|
|
307
|
+
value.version !== NATIVE_THREAD_RESUME_SNAPSHOT_VERSION ||
|
|
308
|
+
typeof value.snapshot_id !== "string" ||
|
|
309
|
+
!SNAPSHOT_ID_PATTERN.test(value.snapshot_id) ||
|
|
310
|
+
(expectedSnapshotId !== undefined &&
|
|
311
|
+
value.snapshot_id !== expectedSnapshotId) ||
|
|
312
|
+
value.store_key !== resumeSnapshotStoreKey(storeDir) ||
|
|
313
|
+
!nonEmptyString(value.selection_scope) ||
|
|
314
|
+
!validIsoDate(value.created_at) ||
|
|
315
|
+
!validIsoDate(value.expires_at) ||
|
|
316
|
+
Date.parse(String(value.expires_at)) <= Date.parse(String(value.created_at)) ||
|
|
317
|
+
Date.parse(String(value.expires_at)) - Date.parse(String(value.created_at)) >
|
|
318
|
+
NATIVE_THREAD_RESUME_SNAPSHOT_TTL_MS ||
|
|
319
|
+
!nonEmptyString(value.terminal_id) ||
|
|
320
|
+
!nonEmptyString(value.agent) ||
|
|
321
|
+
!nonEmptyString(value.workspace) ||
|
|
322
|
+
!isRecord(value.terminal_control) ||
|
|
323
|
+
!nonEmptyString(value.terminal_control.target) ||
|
|
324
|
+
!nonEmptyString(value.expected_binding_token) ||
|
|
325
|
+
!hexDigest(value.terminal_action_fingerprint) ||
|
|
326
|
+
!hexDigest(value.candidate_snapshot_fingerprint) ||
|
|
327
|
+
!Array.isArray(value.rows)) {
|
|
328
|
+
throw new Error("resume selection snapshot is malformed");
|
|
329
|
+
}
|
|
330
|
+
const numbers = new Set();
|
|
331
|
+
const shortIds = new Set();
|
|
332
|
+
const handles = new Set();
|
|
333
|
+
for (const row of value.rows) {
|
|
334
|
+
if (!isRecord(row) ||
|
|
335
|
+
!Number.isSafeInteger(row.selection_number) ||
|
|
336
|
+
Number(row.selection_number) < 1 ||
|
|
337
|
+
!nonEmptyString(row.short_id) ||
|
|
338
|
+
!SHORT_ID_PATTERN.test(String(row.short_id)) ||
|
|
339
|
+
!nonEmptyString(row.selection_handle) ||
|
|
340
|
+
row.selection_handle !== `${value.snapshot_id}:${row.selection_number}` ||
|
|
341
|
+
!nonEmptyString(row.native_thread_id) ||
|
|
342
|
+
!isExactNativeThreadId(row.native_thread_id) ||
|
|
343
|
+
typeof row.resumable !== "boolean" ||
|
|
344
|
+
(row.candidate_token !== undefined && !nonEmptyString(row.candidate_token)) ||
|
|
345
|
+
(row.resumable === true && !nonEmptyString(row.candidate_token))) {
|
|
346
|
+
throw new Error("resume selection snapshot row is malformed");
|
|
347
|
+
}
|
|
348
|
+
const number = Number(row.selection_number);
|
|
349
|
+
const shortId = String(row.short_id);
|
|
350
|
+
const handle = String(row.selection_handle);
|
|
351
|
+
if (numbers.has(number) || shortIds.has(shortId) || handles.has(handle)) {
|
|
352
|
+
throw new Error("resume selection snapshot contains duplicate selectors");
|
|
353
|
+
}
|
|
354
|
+
numbers.add(number);
|
|
355
|
+
shortIds.add(shortId);
|
|
356
|
+
handles.add(handle);
|
|
357
|
+
}
|
|
358
|
+
if (value.rows.some((row, index) => row.selection_number !== index + 1)) {
|
|
359
|
+
throw new Error("resume selection snapshot numbering is not contiguous");
|
|
360
|
+
}
|
|
361
|
+
const expectedShortIds = collisionSafeNativeThreadShortIds(value.rows.map((row) => row.native_thread_id));
|
|
362
|
+
if (value.rows.some((row) => expectedShortIds.get(row.native_thread_id.toLowerCase()) !== row.short_id)) {
|
|
363
|
+
throw new Error("resume selection snapshot short ids are inconsistent");
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function cleanupExpiredResumeSnapshots(directory, now) {
|
|
367
|
+
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
|
|
368
|
+
if (!entry.isFile() || !/^rs_[A-Za-z0-9_-]{22}\.json$/u.test(entry.name)) {
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
const filePath = path.join(directory, entry.name);
|
|
372
|
+
try {
|
|
373
|
+
const stat = fs.lstatSync(filePath);
|
|
374
|
+
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
const value = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
378
|
+
if (validIsoDate(value?.expires_at) && Date.parse(value.expires_at) <= now.getTime()) {
|
|
379
|
+
fs.unlinkSync(filePath);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
// Invalid files are never trusted or removed by opportunistic cleanup.
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
function ensurePrivateDirectory(directory) {
|
|
388
|
+
const runtimeDir = path.dirname(path.dirname(directory));
|
|
389
|
+
fs.mkdirSync(runtimeDir, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
|
|
390
|
+
const hierarchy = [runtimeDir];
|
|
391
|
+
for (const current of [
|
|
392
|
+
path.join(runtimeDir, "resume-snapshots"),
|
|
393
|
+
directory
|
|
394
|
+
]) {
|
|
395
|
+
try {
|
|
396
|
+
fs.mkdirSync(current, { mode: PRIVATE_DIRECTORY_MODE });
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
if (error.code !== "EEXIST") {
|
|
400
|
+
throw error;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
hierarchy.push(current);
|
|
404
|
+
}
|
|
405
|
+
for (const current of hierarchy) {
|
|
406
|
+
const stat = fs.lstatSync(current);
|
|
407
|
+
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
408
|
+
throw new Error(`resume snapshot directory must be a real directory: ${current}`);
|
|
409
|
+
}
|
|
410
|
+
if (current !== runtimeDir) {
|
|
411
|
+
fs.chmodSync(current, PRIVATE_DIRECTORY_MODE);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
function assertRegularOrAbsent(filePath) {
|
|
416
|
+
if (!fs.existsSync(filePath)) {
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
const stat = fs.lstatSync(filePath);
|
|
420
|
+
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
421
|
+
throw new Error("resume selection snapshot path is not a regular file");
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
function stableStringify(value) {
|
|
425
|
+
if (Array.isArray(value)) {
|
|
426
|
+
return `[${value.map(stableStringify).join(",")}]`;
|
|
427
|
+
}
|
|
428
|
+
if (isRecord(value)) {
|
|
429
|
+
return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`).join(",")}}`;
|
|
430
|
+
}
|
|
431
|
+
return JSON.stringify(value);
|
|
432
|
+
}
|
|
433
|
+
function terminalControlKey(value) {
|
|
434
|
+
return JSON.stringify({
|
|
435
|
+
target: value.target,
|
|
436
|
+
socket_path: value.socketPath ?? null
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
function isRecord(value) {
|
|
440
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
441
|
+
}
|
|
442
|
+
function nonEmptyString(value) {
|
|
443
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
444
|
+
}
|
|
445
|
+
function validIsoDate(value) {
|
|
446
|
+
return nonEmptyString(value) && Number.isFinite(Date.parse(value));
|
|
447
|
+
}
|
|
448
|
+
function hexDigest(value) {
|
|
449
|
+
return typeof value === "string" && /^[a-f0-9]{64}$/u.test(value);
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=native-thread-resume-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-thread-resume-snapshot.js","sourceRoot":"","sources":["../../src/native-thread-resume-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
export declare const AKK_CALLBACK_METHOD = "agent-knock-knock.callback";
|
|
2
|
+
export type AkkResumeSelection = {
|
|
3
|
+
kind: "exact";
|
|
4
|
+
nativeThreadId: string;
|
|
5
|
+
} | {
|
|
6
|
+
kind: "previous";
|
|
7
|
+
} | {
|
|
8
|
+
kind: "number";
|
|
9
|
+
selectionNumber: number;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "short-id";
|
|
12
|
+
shortId: string;
|
|
13
|
+
} | {
|
|
14
|
+
kind: "snapshot-handle";
|
|
15
|
+
selectionHandle: string;
|
|
16
|
+
};
|
|
2
17
|
type AkkCloseCommand = {
|
|
3
18
|
action: "close";
|
|
4
19
|
turnId: string;
|
|
@@ -28,7 +43,7 @@ export type AkkCommand = {
|
|
|
28
43
|
} | {
|
|
29
44
|
action: "resume-thread";
|
|
30
45
|
terminalId: string;
|
|
31
|
-
|
|
46
|
+
selection?: AkkResumeSelection;
|
|
32
47
|
} | {
|
|
33
48
|
action: "status";
|
|
34
49
|
turnId?: string;
|
|
@@ -73,6 +88,8 @@ export declare function buildAkkCommandCliArgs(command: AkkCommand, config: Reco
|
|
|
73
88
|
sessionKey?: unknown;
|
|
74
89
|
expectedBindingToken?: unknown;
|
|
75
90
|
candidateToken?: unknown;
|
|
91
|
+
selectionScope?: unknown;
|
|
92
|
+
selectionSnapshotId?: unknown;
|
|
76
93
|
}): string[] | undefined;
|
|
77
94
|
export declare function resolvePluginStoreDir(config: Record<string, unknown>, gatewayCwd?: string): string | undefined;
|
|
78
95
|
export {};
|