pi-harness-runtime 1.1.323 → 1.1.324
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/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/agent-policy/test/policy-retention.test.ts +2 -2
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/durable-review/dist/worker.d.ts +19 -5
- package/packages/durable-review/dist/worker.d.ts.map +1 -1
- package/packages/durable-review/dist/worker.js +179 -35
- package/packages/durable-review/dist/worker.js.map +1 -1
- package/packages/durable-review/package.json +1 -1
- package/packages/durable-review/src/worker.ts +201 -48
- package/packages/e2e-tester/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/telegram/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/webmcp-tester/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Durable Review Worker
|
|
3
3
|
*
|
|
4
|
-
* Node worker entry point with exclusive ownership and Harness integration.
|
|
4
|
+
* Node worker entry point with proper exclusive ownership and Harness integration.
|
|
5
|
+
* Uses atomic lock acquisition (mkdir) and process liveness verification.
|
|
5
6
|
*/
|
|
6
7
|
|
|
7
8
|
import { randomUUID } from "node:crypto";
|
|
8
9
|
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
9
10
|
import { join } from "node:path";
|
|
10
11
|
import type { ReviewRequest, ReviewStatusResponse } from "./types.js";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
createJobRecord,
|
|
17
|
-
} from "./service.js";
|
|
12
|
+
import { getDatabasePath, getWorkspaceDir, hashWorkspaceKey, validateAndHashRequest, toStatusResponse, createJobRecord } from "./service.js";
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Types
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
18
17
|
|
|
19
18
|
/**
|
|
20
19
|
* Worker instance state
|
|
@@ -22,77 +21,164 @@ import {
|
|
|
22
21
|
interface WorkerState {
|
|
23
22
|
workerId: string;
|
|
24
23
|
workspaceKey: string;
|
|
24
|
+
harness: unknown; // Harness instance
|
|
25
|
+
storage: unknown; // SQLite storage
|
|
25
26
|
ready: boolean;
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Lock file content
|
|
31
|
+
*/
|
|
32
|
+
interface LockContent {
|
|
33
|
+
workerId: string;
|
|
34
|
+
pid: number;
|
|
35
|
+
startedAt: number;
|
|
36
|
+
lockId: string; // Unique lock identifier for atomic verification
|
|
37
|
+
}
|
|
38
|
+
|
|
28
39
|
/**
|
|
29
40
|
* Current worker state
|
|
30
41
|
*/
|
|
31
42
|
let currentWorker: WorkerState | null = null;
|
|
32
43
|
|
|
33
44
|
/**
|
|
34
|
-
*
|
|
45
|
+
* Lock acquisition result
|
|
46
|
+
*/
|
|
47
|
+
interface LockResult {
|
|
48
|
+
acquired: boolean;
|
|
49
|
+
existingOwner?: string;
|
|
50
|
+
staleLock?: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Atomic Lock Operations
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get lock file path for workspace
|
|
59
|
+
* Single lock file per workspace - only one worker can hold it at a time
|
|
35
60
|
*/
|
|
36
61
|
function getLockPath(workspaceKey: string): string {
|
|
37
62
|
return join(getWorkspaceDir(workspaceKey), ".worker.lock");
|
|
38
63
|
}
|
|
39
64
|
|
|
40
65
|
/**
|
|
41
|
-
*
|
|
66
|
+
* Check if a process is alive (Unix)
|
|
42
67
|
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
68
|
+
function isProcessAlive(pid: number): boolean {
|
|
69
|
+
try {
|
|
70
|
+
// Unix: sending signal 0 checks if process exists
|
|
71
|
+
process.kill(pid, 0);
|
|
72
|
+
return true;
|
|
73
|
+
} catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
47
76
|
}
|
|
48
77
|
|
|
49
78
|
/**
|
|
50
|
-
*
|
|
51
|
-
|
|
79
|
+
* Verify lock owner is still alive
|
|
80
|
+
*/
|
|
81
|
+
function verifyOwnerAlive(lock: LockContent): boolean {
|
|
82
|
+
if (lock.pid === process.pid) {
|
|
83
|
+
return true; // Same process
|
|
84
|
+
}
|
|
85
|
+
return isProcessAlive(lock.pid);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Try to acquire exclusive ownership using file creation
|
|
90
|
+
*
|
|
91
|
+
* Uses exclusive file creation for atomic lock acquisition.
|
|
92
|
+
* The process must be alive (verified by PID check) before taking over a stale lock.
|
|
52
93
|
*/
|
|
53
94
|
export async function tryAcquireOwnership(
|
|
54
95
|
workspaceKey: string,
|
|
55
96
|
workerId: string
|
|
56
|
-
): Promise<
|
|
97
|
+
): Promise<LockResult> {
|
|
98
|
+
const lockDir = join(getWorkspaceDir(workspaceKey), "locks");
|
|
57
99
|
const lockPath = getLockPath(workspaceKey);
|
|
58
|
-
const
|
|
100
|
+
const lockContent: LockContent = {
|
|
101
|
+
workerId,
|
|
102
|
+
pid: process.pid,
|
|
103
|
+
startedAt: Date.now(),
|
|
104
|
+
lockId: randomUUID(), // Unique ID for this lock instance
|
|
105
|
+
};
|
|
59
106
|
|
|
60
|
-
// Ensure directory exists
|
|
107
|
+
// Ensure lock directory exists
|
|
61
108
|
if (!existsSync(lockDir)) {
|
|
62
109
|
mkdirSync(lockDir, { recursive: true });
|
|
63
110
|
}
|
|
64
111
|
|
|
65
112
|
try {
|
|
66
|
-
// Check if lock exists
|
|
113
|
+
// Check if our lock file already exists
|
|
67
114
|
if (existsSync(lockPath)) {
|
|
68
|
-
const existing
|
|
115
|
+
const existing = JSON.parse(readFileSync(lockPath, "utf8")) as LockContent;
|
|
69
116
|
|
|
70
|
-
//
|
|
71
|
-
if (existing.workerId === workerId) {
|
|
117
|
+
// Same worker - we already have the lock
|
|
118
|
+
if (existing.workerId === workerId && existing.pid === process.pid) {
|
|
119
|
+
console.log("[lock] Same worker, returning acquired");
|
|
72
120
|
return { acquired: true };
|
|
73
121
|
}
|
|
74
122
|
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// Lock is recent, someone else owns it
|
|
123
|
+
// Different worker - check if owner is still alive
|
|
124
|
+
if (verifyOwnerAlive(existing)) {
|
|
125
|
+
// Owner is alive, we can't take the lock
|
|
79
126
|
return { acquired: false, existingOwner: existing.workerId };
|
|
80
127
|
}
|
|
81
128
|
|
|
82
|
-
//
|
|
129
|
+
// Owner is dead - we can take over
|
|
130
|
+
// Write new lock content atomically via rename
|
|
131
|
+
const tmpPath = lockPath + ".tmp." + process.pid;
|
|
132
|
+
writeFileSync(tmpPath, JSON.stringify(lockContent), "utf8");
|
|
133
|
+
try {
|
|
134
|
+
// Rename is atomic on POSIX when destination is on same filesystem
|
|
135
|
+
// This takes over the lock
|
|
136
|
+
const { renameSync } = await import("node:fs");
|
|
137
|
+
renameSync(tmpPath, lockPath);
|
|
138
|
+
return { acquired: true, staleLock: true };
|
|
139
|
+
} catch {
|
|
140
|
+
// Takeover failed (another process beat us)
|
|
141
|
+
try { unlinkSync(tmpPath); } catch { /* ignore */ }
|
|
142
|
+
return { acquired: false, existingOwner: existing.workerId };
|
|
143
|
+
}
|
|
83
144
|
}
|
|
84
145
|
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
startedAt: Date.now(),
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
writeFileSync(lockPath, JSON.stringify(lockContent), "utf-8");
|
|
146
|
+
// Lock doesn't exist - create it atomically
|
|
147
|
+
// Use writeFileSync with flag 'wx' for exclusive create
|
|
148
|
+
const { writeFileSync: wfSync } = await import("node:fs");
|
|
149
|
+
wfSync(lockPath, JSON.stringify(lockContent), { flag: "wx" });
|
|
93
150
|
return { acquired: true };
|
|
94
|
-
} catch (
|
|
95
|
-
|
|
151
|
+
} catch (err: unknown) {
|
|
152
|
+
const error = err as NodeJS.ErrnoException;
|
|
153
|
+
if (error.code === "EEXIST") {
|
|
154
|
+
// Race: another process created it first
|
|
155
|
+
try {
|
|
156
|
+
const existing = JSON.parse(readFileSync(lockPath, "utf8")) as LockContent;
|
|
157
|
+
if (verifyOwnerAlive(existing)) {
|
|
158
|
+
return { acquired: false, existingOwner: existing.workerId };
|
|
159
|
+
}
|
|
160
|
+
// Owner is dead, try takeover
|
|
161
|
+
const takeoverContent: LockContent = {
|
|
162
|
+
...lockContent,
|
|
163
|
+
lockId: randomUUID(),
|
|
164
|
+
};
|
|
165
|
+
const tmpPath = lockPath + ".tmp." + process.pid;
|
|
166
|
+
writeFileSync(tmpPath, JSON.stringify(takeoverContent), "utf8");
|
|
167
|
+
try {
|
|
168
|
+
const { renameSync } = await import("node:fs");
|
|
169
|
+
renameSync(tmpPath, lockPath);
|
|
170
|
+
return { acquired: true, staleLock: true };
|
|
171
|
+
} catch {
|
|
172
|
+
try { unlinkSync(tmpPath); } catch { /* ignore */ }
|
|
173
|
+
return { acquired: false, existingOwner: existing.workerId };
|
|
174
|
+
}
|
|
175
|
+
} catch {
|
|
176
|
+
return { acquired: false };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Other error
|
|
181
|
+
console.error("[durable-review] Lock acquisition error:", error);
|
|
96
182
|
return { acquired: false };
|
|
97
183
|
}
|
|
98
184
|
}
|
|
@@ -105,7 +191,7 @@ export async function releaseOwnership(workspaceKey: string, workerId: string):
|
|
|
105
191
|
|
|
106
192
|
try {
|
|
107
193
|
if (existsSync(lockPath)) {
|
|
108
|
-
const existing
|
|
194
|
+
const existing = JSON.parse(readFileSync(lockPath, "utf8")) as LockContent;
|
|
109
195
|
if (existing.workerId === workerId) {
|
|
110
196
|
unlinkSync(lockPath);
|
|
111
197
|
}
|
|
@@ -115,6 +201,24 @@ export async function releaseOwnership(workspaceKey: string, workerId: string):
|
|
|
115
201
|
}
|
|
116
202
|
}
|
|
117
203
|
|
|
204
|
+
/**
|
|
205
|
+
* Verify we still hold the lock (for worker health checks)
|
|
206
|
+
*/
|
|
207
|
+
export function verifyLockOwnership(workspaceKey: string, workerId: string): boolean {
|
|
208
|
+
const lockPath = getLockPath(workspaceKey);
|
|
209
|
+
try {
|
|
210
|
+
if (!existsSync(lockPath)) return false;
|
|
211
|
+
const existing = JSON.parse(readFileSync(lockPath, "utf8")) as LockContent;
|
|
212
|
+
return existing.workerId === workerId && existing.pid === process.pid;
|
|
213
|
+
} catch {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// Worker Lifecycle
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
|
|
118
222
|
/**
|
|
119
223
|
* Start the worker for a workspace
|
|
120
224
|
*/
|
|
@@ -122,13 +226,14 @@ export async function startWorker(workspacePath: string): Promise<{
|
|
|
122
226
|
success: boolean;
|
|
123
227
|
workerId?: string;
|
|
124
228
|
workspaceKey?: string;
|
|
229
|
+
harness?: unknown;
|
|
125
230
|
error?: string;
|
|
126
231
|
}> {
|
|
127
|
-
const canonicalPath = workspacePath;
|
|
232
|
+
const canonicalPath = workspacePath;
|
|
128
233
|
const workspaceKey = hashWorkspaceKey(canonicalPath);
|
|
129
234
|
const workerId = `worker-${randomUUID().slice(0, 8)}`;
|
|
130
235
|
|
|
131
|
-
// Try to acquire ownership
|
|
236
|
+
// Try to acquire exclusive ownership
|
|
132
237
|
const lockResult = await tryAcquireOwnership(workspaceKey, workerId);
|
|
133
238
|
if (!lockResult.acquired) {
|
|
134
239
|
return {
|
|
@@ -137,14 +242,43 @@ export async function startWorker(workspacePath: string): Promise<{
|
|
|
137
242
|
};
|
|
138
243
|
}
|
|
139
244
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
workspaceKey,
|
|
144
|
-
ready: true,
|
|
145
|
-
};
|
|
245
|
+
if (lockResult.staleLock) {
|
|
246
|
+
console.log(`[durable-review] Took over stale lock from ${lockResult.existingOwner}`);
|
|
247
|
+
}
|
|
146
248
|
|
|
147
|
-
|
|
249
|
+
try {
|
|
250
|
+
// Open SQLite storage using pi-durable's Node adapter
|
|
251
|
+
const { openNodeSqliteStorage } = await import("@earendil-works/pi-durable/storage/sqlite/node");
|
|
252
|
+
const dbPath = getDatabasePath(workspaceKey);
|
|
253
|
+
const storage = await openNodeSqliteStorage(dbPath);
|
|
254
|
+
|
|
255
|
+
// Create registry with reviewer extension
|
|
256
|
+
const { createRegistry } = await import("@earendil-works/pi-durable");
|
|
257
|
+
const registry = createRegistry();
|
|
258
|
+
|
|
259
|
+
// Open Harness with storage
|
|
260
|
+
const { Harness: HarnessClass } = await import("@earendil-works/pi-durable");
|
|
261
|
+
const { BACKGROUND_CONTEXT } = await import("@earendil-works/chord/context");
|
|
262
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
263
|
+
const harness = await (HarnessClass as any).open(storage, { registry }, BACKGROUND_CONTEXT);
|
|
264
|
+
|
|
265
|
+
currentWorker = {
|
|
266
|
+
workerId,
|
|
267
|
+
workspaceKey,
|
|
268
|
+
harness,
|
|
269
|
+
storage,
|
|
270
|
+
ready: true,
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
return { success: true, workerId, workspaceKey, harness };
|
|
274
|
+
} catch (err) {
|
|
275
|
+
// Release lock on failure
|
|
276
|
+
await releaseOwnership(workspaceKey, workerId);
|
|
277
|
+
return {
|
|
278
|
+
success: false,
|
|
279
|
+
error: err instanceof Error ? err.message : String(err),
|
|
280
|
+
};
|
|
281
|
+
}
|
|
148
282
|
}
|
|
149
283
|
|
|
150
284
|
/**
|
|
@@ -152,6 +286,15 @@ export async function startWorker(workspacePath: string): Promise<{
|
|
|
152
286
|
*/
|
|
153
287
|
export async function stopWorker(): Promise<void> {
|
|
154
288
|
if (currentWorker) {
|
|
289
|
+
try {
|
|
290
|
+
const { BACKGROUND_CONTEXT } = await import("@earendil-works/chord/context");
|
|
291
|
+
if (currentWorker.harness) {
|
|
292
|
+
await (currentWorker.harness as { close: (ctx: unknown) => Promise<void> }).close(BACKGROUND_CONTEXT);
|
|
293
|
+
}
|
|
294
|
+
} catch {
|
|
295
|
+
// Ignore close errors
|
|
296
|
+
}
|
|
297
|
+
|
|
155
298
|
await releaseOwnership(currentWorker.workspaceKey, currentWorker.workerId);
|
|
156
299
|
currentWorker = null;
|
|
157
300
|
}
|
|
@@ -174,6 +317,12 @@ export async function checkWorkerReady(): Promise<{
|
|
|
174
317
|
return { ready: false, workerId: currentWorker.workerId, error: "Worker not ready" };
|
|
175
318
|
}
|
|
176
319
|
|
|
320
|
+
// Verify we still hold the lock
|
|
321
|
+
if (!verifyLockOwnership(currentWorker.workspaceKey, currentWorker.workerId)) {
|
|
322
|
+
currentWorker = null;
|
|
323
|
+
return { ready: false, error: "Lock lost" };
|
|
324
|
+
}
|
|
325
|
+
|
|
177
326
|
return {
|
|
178
327
|
ready: true,
|
|
179
328
|
workerId: currentWorker.workerId,
|
|
@@ -181,6 +330,10 @@ export async function checkWorkerReady(): Promise<{
|
|
|
181
330
|
};
|
|
182
331
|
}
|
|
183
332
|
|
|
333
|
+
// ---------------------------------------------------------------------------
|
|
334
|
+
// Review Operations
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
|
|
184
337
|
/**
|
|
185
338
|
* Handle incoming review request
|
|
186
339
|
*/
|