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.
Files changed (107) hide show
  1. package/package.json +1 -1
  2. package/packages/a2a-adapter/package.json +1 -1
  3. package/packages/agent-policy/package.json +1 -1
  4. package/packages/agent-policy/test/policy-retention.test.ts +2 -2
  5. package/packages/architecture-generator/package.json +1 -1
  6. package/packages/auth/package.json +1 -1
  7. package/packages/autonomous-refactor/package.json +1 -1
  8. package/packages/autonomous-runtime/package.json +1 -1
  9. package/packages/cache-strategy/package.json +1 -1
  10. package/packages/capability-registry/package.json +1 -1
  11. package/packages/checkpoint/package.json +1 -1
  12. package/packages/cli-plugin-sdk/package.json +1 -1
  13. package/packages/clipboard/package.json +1 -1
  14. package/packages/clipboard-plugin/package.json +1 -1
  15. package/packages/code-generation/package.json +1 -1
  16. package/packages/code-review/package.json +1 -1
  17. package/packages/codex-adapter/package.json +1 -1
  18. package/packages/codex-watcher/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/context-compiler/package.json +1 -1
  21. package/packages/context-discovery/package.json +1 -1
  22. package/packages/context-manager/package.json +1 -1
  23. package/packages/cookie-sanitizer/package.json +1 -1
  24. package/packages/cost-optimizer/package.json +1 -1
  25. package/packages/dependency-analyzer/package.json +1 -1
  26. package/packages/django-plugin/package.json +1 -1
  27. package/packages/doc-generator/package.json +1 -1
  28. package/packages/durable-review/dist/worker.d.ts +19 -5
  29. package/packages/durable-review/dist/worker.d.ts.map +1 -1
  30. package/packages/durable-review/dist/worker.js +179 -35
  31. package/packages/durable-review/dist/worker.js.map +1 -1
  32. package/packages/durable-review/package.json +1 -1
  33. package/packages/durable-review/src/worker.ts +201 -48
  34. package/packages/e2e-tester/package.json +1 -1
  35. package/packages/evaluation-engine/package.json +1 -1
  36. package/packages/evaluation-runner/package.json +1 -1
  37. package/packages/event-bus/package.json +1 -1
  38. package/packages/event-store/package.json +1 -1
  39. package/packages/experience-replay/package.json +1 -1
  40. package/packages/feedback-collector/package.json +1 -1
  41. package/packages/file-copy-helper/package.json +1 -1
  42. package/packages/framework-detector/package.json +1 -1
  43. package/packages/framework-plugin-sdk/package.json +1 -1
  44. package/packages/frappe-plugin/package.json +1 -1
  45. package/packages/generic-web-plugin/package.json +1 -1
  46. package/packages/health-monitor/package.json +1 -1
  47. package/packages/intent-analyzer/package.json +1 -1
  48. package/packages/jev-judge/package.json +1 -1
  49. package/packages/knowledge-graph/package.json +1 -1
  50. package/packages/knowledge-retrieval/package.json +1 -1
  51. package/packages/laravel-plugin/package.json +1 -1
  52. package/packages/learning-engine/package.json +1 -1
  53. package/packages/mcp-adapter/package.json +1 -1
  54. package/packages/memory-engine/package.json +1 -1
  55. package/packages/milestone-manager/package.json +1 -1
  56. package/packages/model-registry/package.json +1 -1
  57. package/packages/nextjs-plugin/package.json +1 -1
  58. package/packages/notification/package.json +1 -1
  59. package/packages/observability/package.json +1 -1
  60. package/packages/okf-indexer/package.json +1 -1
  61. package/packages/paperclip-integration/package.json +1 -1
  62. package/packages/performance-optimizer/package.json +1 -1
  63. package/packages/privilege-broker/package.json +1 -1
  64. package/packages/project-analyzer/package.json +1 -1
  65. package/packages/project-bootstrap/package.json +1 -1
  66. package/packages/projection-engine/package.json +1 -1
  67. package/packages/prompt-compiler/package.json +1 -1
  68. package/packages/prompt-versioning/package.json +1 -1
  69. package/packages/provider-adapter-sdk/package.json +1 -1
  70. package/packages/provider-router/package.json +1 -1
  71. package/packages/provider-selector/package.json +1 -1
  72. package/packages/providers/package.json +1 -1
  73. package/packages/qdrant-skills/package.json +1 -1
  74. package/packages/quota-manager/package.json +1 -1
  75. package/packages/rate-limiter/package.json +1 -1
  76. package/packages/react-vite-plugin/package.json +1 -1
  77. package/packages/release-manager/package.json +1 -1
  78. package/packages/requirement-compiler/package.json +1 -1
  79. package/packages/runtime/package.json +1 -1
  80. package/packages/scheduler/package.json +1 -1
  81. package/packages/scheduler-adapter/package.json +1 -1
  82. package/packages/session/package.json +1 -1
  83. package/packages/session-api/package.json +1 -1
  84. package/packages/session-export/package.json +1 -1
  85. package/packages/shared-context/package.json +1 -1
  86. package/packages/skill-mcp-client/package.json +1 -1
  87. package/packages/skill-registry/package.json +1 -1
  88. package/packages/skills/package.json +1 -1
  89. package/packages/sprint-planner/package.json +1 -1
  90. package/packages/subscription-engine/package.json +1 -1
  91. package/packages/task-compiler/package.json +1 -1
  92. package/packages/telegram/package.json +1 -1
  93. package/packages/tencentdb-memory/package.json +1 -1
  94. package/packages/tencentdb-sync/package.json +1 -1
  95. package/packages/test-data-generator/package.json +1 -1
  96. package/packages/test-generator/package.json +1 -1
  97. package/packages/todo-bd-sync/package.json +1 -1
  98. package/packages/token-estimation/package.json +1 -1
  99. package/packages/token-optimizer/package.json +1 -1
  100. package/packages/trajectory/package.json +1 -1
  101. package/packages/tui/package.json +1 -1
  102. package/packages/types/package.json +1 -1
  103. package/packages/webmcp-tester/package.json +1 -1
  104. package/packages/workflow-events/package.json +1 -1
  105. package/packages/workspace-scanner/package.json +1 -1
  106. package/packages/worktree/package.json +1 -1
  107. package/packages/write-review/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/durable-review",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "SQLite-backed durable reviewer using @earendil-works/pi-durable",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -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
- getWorkspaceDir,
13
- hashWorkspaceKey,
14
- validateAndHashRequest,
15
- toStatusResponse,
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
- * Get lock file path for ownership
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
- * Lock file content
66
+ * Check if a process is alive (Unix)
42
67
  */
43
- interface LockContent {
44
- workerId: string;
45
- pid: number;
46
- startedAt: number;
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
- * Try to acquire exclusive ownership of the workspace database
51
- * Uses a simple file-based lock with stale detection
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<{ acquired: boolean; existingOwner?: string }> {
97
+ ): Promise<LockResult> {
98
+ const lockDir = join(getWorkspaceDir(workspaceKey), "locks");
57
99
  const lockPath = getLockPath(workspaceKey);
58
- const lockDir = getWorkspaceDir(workspaceKey);
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: LockContent = JSON.parse(readFileSync(lockPath, "utf-8"));
115
+ const existing = JSON.parse(readFileSync(lockPath, "utf8")) as LockContent;
69
116
 
70
- // If same worker, we already own it
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
- // Check if lock is stale (older than 60 seconds)
76
- const lockAge = Date.now() - existing.startedAt;
77
- if (lockAge < 60_000) {
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
- // Lock is stale, we can take over
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
- // Write new lock file
86
- const lockContent: LockContent = {
87
- workerId,
88
- pid: process.pid,
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 (error) {
95
- console.error("Error acquiring lock:", error);
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: LockContent = JSON.parse(readFileSync(lockPath, "utf-8"));
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; // TODO: resolve realpath
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
- // Set up worker state
141
- currentWorker = {
142
- workerId,
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
- return { success: true, workerId, workspaceKey };
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
  */
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/e2e-tester",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "WebMCP-powered E2E testing for pi-harness - natural language test scenarios",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/evaluation-engine",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Evaluation engine for pi-harness runtime (RFC-0057)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/evaluation-runner",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "type": "module",
5
5
  "description": "Framework-agnostic evaluation framework for AI outputs (RFC-0020)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-bus",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-store",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/experience-replay",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Experience replay for debugging and reproducibility (RFC-0059)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/feedback-collector",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "type": "module",
5
5
  "description": "Collect and aggregate human/automated feedback (RFC-0021)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/file-copy-helper",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Injects cp/sudo cp rule when user asks to mimic/copy files",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-detector",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Framework detection system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-plugin-sdk",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Framework plugin SDK for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/frappe-plugin",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Frappe/ERPNext framework analysis — DocTypes, hooks, bench sites, site config",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/generic-web-plugin",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Generic web framework analysis — REST/GraphQL endpoints, OpenAPI, auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/health-monitor",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "type": "module",
5
5
  "description": "Health monitoring and auto-healing",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/intent-analyzer",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/jev-judge",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Jev Judge - Structured decision model for agent routing, E2E testing, and automated decisions",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-graph",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Knowledge Graph extraction and provenance linking for SKILL.md files",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-retrieval",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Knowledge retrieval via TencentDB-Agent-Memory MCP (RFC-0105)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/laravel-plugin",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Laravel framework analysis — artisan commands, Eloquent models, Blade",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/learning-engine",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Learning engine for extracting lessons from runtime execution (RFC-0058)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/mcp-adapter",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "type": "module",
5
5
  "description": "MCP server adapter for pi-harness — exposes harness capabilities as MCP tools/resources/prompts (RFC-0068)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/memory-engine",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Memory engine with OKF integration for durable knowledge management (RFC-0060)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/milestone-manager",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Track milestones and alerts when items are at risk",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/model-registry",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Model Registry for pi-harness-runtime — centralized model metadata with pricing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/nextjs-plugin",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Next.js framework detection and analysis for pi-harness-runtime (RFC-0062)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/notification",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "pi-harness-runtime — notification",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/observability",
3
- "version": "1.1.323",
3
+ "version": "1.1.324",
4
4
  "description": "Comprehensive observability system with structured logging, tracing, metrics, and alerting",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",