pi-harness-runtime 1.1.346 → 1.1.349

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 (125) hide show
  1. package/index.ts +83 -75
  2. package/package.json +1 -1
  3. package/packages/a2a-adapter/package.json +1 -1
  4. package/packages/agent-policy/package.json +1 -1
  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/connection-runtime/package.json +1 -1
  21. package/packages/context-compiler/package.json +1 -1
  22. package/packages/context-discovery/package.json +1 -1
  23. package/packages/context-manager/package.json +1 -1
  24. package/packages/contracts/package.json +1 -1
  25. package/packages/cookie-sanitizer/package.json +1 -1
  26. package/packages/cost-optimizer/package.json +1 -1
  27. package/packages/dependency-analyzer/package.json +1 -1
  28. package/packages/django-plugin/package.json +1 -1
  29. package/packages/doc-generator/package.json +1 -1
  30. package/packages/durable-review/package.json +1 -1
  31. package/packages/e2e-tester/package.json +1 -1
  32. package/packages/evaluation-engine/package.json +1 -1
  33. package/packages/evaluation-runner/package.json +1 -1
  34. package/packages/event-bus/package.json +1 -1
  35. package/packages/event-sink/package.json +1 -1
  36. package/packages/event-store/package.json +1 -1
  37. package/packages/experience-replay/package.json +1 -1
  38. package/packages/feedback-collector/package.json +1 -1
  39. package/packages/file-copy-helper/package.json +1 -1
  40. package/packages/framework-detector/package.json +1 -1
  41. package/packages/framework-plugin-sdk/package.json +1 -1
  42. package/packages/frappe-plugin/package.json +1 -1
  43. package/packages/generic-web-plugin/package.json +1 -1
  44. package/packages/health-monitor/package.json +1 -1
  45. package/packages/intent-analyzer/package.json +1 -1
  46. package/packages/jev-judge/package.json +1 -1
  47. package/packages/knowledge-graph/package.json +1 -1
  48. package/packages/knowledge-retrieval/package.json +1 -1
  49. package/packages/laravel-plugin/package.json +1 -1
  50. package/packages/learning-engine/package.json +1 -1
  51. package/packages/mcp-adapter/package.json +1 -1
  52. package/packages/memory-engine/package.json +1 -1
  53. package/packages/milestone-manager/package.json +1 -1
  54. package/packages/model-registry/package.json +1 -1
  55. package/packages/nextjs-plugin/package.json +1 -1
  56. package/packages/notification/dist/index.d.ts +1 -0
  57. package/packages/notification/dist/index.d.ts.map +1 -1
  58. package/packages/notification/dist/index.js +1 -0
  59. package/packages/notification/dist/index.js.map +1 -1
  60. package/packages/notification/dist/notification-center.d.ts +13 -0
  61. package/packages/notification/dist/notification-center.d.ts.map +1 -1
  62. package/packages/notification/dist/notification-center.js +91 -1
  63. package/packages/notification/dist/notification-center.js.map +1 -1
  64. package/packages/notification/dist/pending-question.d.ts +198 -0
  65. package/packages/notification/dist/pending-question.d.ts.map +1 -0
  66. package/packages/notification/dist/pending-question.js +410 -0
  67. package/packages/notification/dist/pending-question.js.map +1 -0
  68. package/packages/notification/package.json +1 -1
  69. package/packages/notification/src/index.ts +1 -0
  70. package/packages/notification/src/notification-center.ts +92 -1
  71. package/packages/notification/src/pending-question.ts +594 -0
  72. package/packages/notification/test/pending-question.test.ts +331 -0
  73. package/packages/observability/package.json +1 -1
  74. package/packages/okf-indexer/package.json +1 -1
  75. package/packages/paperclip-integration/package.json +1 -1
  76. package/packages/performance-optimizer/package.json +1 -1
  77. package/packages/permission-mode/package.json +1 -1
  78. package/packages/privilege-broker/package.json +1 -1
  79. package/packages/project-analyzer/package.json +1 -1
  80. package/packages/project-bootstrap/package.json +1 -1
  81. package/packages/projection-engine/package.json +1 -1
  82. package/packages/prompt-compiler/package.json +1 -1
  83. package/packages/prompt-versioning/package.json +1 -1
  84. package/packages/provider-adapter-sdk/package.json +1 -1
  85. package/packages/provider-router/package.json +1 -1
  86. package/packages/provider-selector/package.json +1 -1
  87. package/packages/providers/package.json +1 -1
  88. package/packages/qdrant-skills/package.json +1 -1
  89. package/packages/quota-manager/package.json +1 -1
  90. package/packages/rate-limiter/package.json +1 -1
  91. package/packages/react-vite-plugin/package.json +1 -1
  92. package/packages/relay/package.json +1 -1
  93. package/packages/release-manager/package.json +1 -1
  94. package/packages/requirement-compiler/package.json +1 -1
  95. package/packages/runtime/package.json +1 -1
  96. package/packages/scheduler/package.json +1 -1
  97. package/packages/scheduler-adapter/package.json +1 -1
  98. package/packages/session/package.json +1 -1
  99. package/packages/session-api/package.json +1 -1
  100. package/packages/session-export/package.json +1 -1
  101. package/packages/shared-context/package.json +1 -1
  102. package/packages/skill-mcp-client/package.json +1 -1
  103. package/packages/skill-registry/package.json +1 -1
  104. package/packages/skills/package.json +1 -1
  105. package/packages/sprint-planner/package.json +1 -1
  106. package/packages/subscription-engine/package.json +1 -1
  107. package/packages/task-compiler/package.json +1 -1
  108. package/packages/telegram/package.json +1 -1
  109. package/packages/tencentdb-memory/package.json +1 -1
  110. package/packages/tencentdb-sync/package.json +1 -1
  111. package/packages/test-data-generator/package.json +1 -1
  112. package/packages/test-generator/package.json +1 -1
  113. package/packages/todo-bd-sync/package.json +1 -1
  114. package/packages/token-estimation/package.json +1 -1
  115. package/packages/token-optimizer/package.json +1 -1
  116. package/packages/trajectory/package.json +1 -1
  117. package/packages/tui/package.json +1 -1
  118. package/packages/types/package.json +1 -1
  119. package/packages/voice-api/package.json +1 -1
  120. package/packages/webmcp-tester/package.json +1 -1
  121. package/packages/wiki/package.json +1 -1
  122. package/packages/workflow-events/package.json +1 -1
  123. package/packages/workspace-scanner/package.json +1 -1
  124. package/packages/worktree/package.json +1 -1
  125. package/packages/write-review/package.json +1 -1
package/index.ts CHANGED
@@ -134,6 +134,8 @@ const sharedState = {
134
134
  todoContinuationController: null as unknown,
135
135
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
136
  updateAutoContinueStatus: null as any,
137
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
+ pqController: null as any,
137
139
  };
138
140
 
139
141
  async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
@@ -168,6 +170,9 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
168
170
  readFileSync(`${keysDir}/jev-api-key.txt`, "utf8").trim();
169
171
 
170
172
  const mod = await import("./packages/jev-judge/src/auto-continue.js");
173
+ const { createPendingQuestionController } = await import("./packages/notification/dist/index.js");
174
+ const pqController = createPendingQuestionController();
175
+ sharedState.pqController = pqController;
171
176
 
172
177
  // Track waiting state
173
178
  let waitingForUserSince: Date | null = null;
@@ -176,6 +181,7 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
176
181
  let _inferenceInProgress = false; // Track for overlap prevention
177
182
  let _sessionId = Date.now().toString(36); // Track session for cancellation
178
183
  let _lastNotifiedQuestion = ""; // Track last question to prevent repeat notifications
184
+ let _completedNotifiedFor: string | null = null; // Track completion notification deduplication
179
185
 
180
186
  // UI status for auto-continue (captured from session_start ctx)
181
187
  let _setAutoContinueStatus: ((text: string | undefined) => void) | null = null;
@@ -271,50 +277,20 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
271
277
  }
272
278
 
273
279
  // Detect actual confirmation requests (questions, not progress statements)
274
- // Must be a question ending with ? AND contain both a request word AND user intent
280
+ // Uses the pending question controller for detection with expanded patterns
275
281
  function detectConfirmationRequest(text: string): string | null {
276
- // Find questions ending with ? and check each
277
- // Use regex to match question sentences (ending with ?)
278
- const questionPattern = /([^?]*\?)/g;
279
- const matches = text.matchAll(questionPattern);
280
-
281
- for (const match of matches) {
282
- const sentence = match[1].trim();
283
- const lower = sentence.toLowerCase();
284
-
285
- // Must contain request words AND user intent words
286
- const hasRequest = /\b(continue|proceed|next|wait|pause|stop|hold|resume|repeat|rephrase|clarify|explain)\b/i.test(lower);
287
- const hasUserIntent = /\b(should|would|could|shall|may i|do you|would you|should i|could we|can i|can we|would like)\b/i.test(lower);
288
-
289
- if (hasRequest && hasUserIntent) {
290
- // Return the question for deduplication (with the ? preserved)
291
- return sentence;
292
- }
282
+ const result = pqController.detectQuestion(text);
283
+ if (result.detected && result.questionText) {
284
+ return result.questionText;
293
285
  }
294
-
295
286
  return null;
296
287
  }
297
288
 
298
289
  // Detect routine continuation questions ("Should I continue?")
299
290
  // These should NOT block immediate continuation - let Jev/todo controller decide
300
291
  function isRoutineContinuation(question: string): boolean {
301
- const lower = question.toLowerCase();
302
- // Match ALL routine continuation patterns
303
- const routinePatterns = [
304
- /\b(should i|should we|should the|can i continue|can we continue)\b/,
305
- /\b(would you like me to continue|shall i proceed)\b/,
306
- /\b(can i proceed|may i continue)\b/,
307
- /\b(continue|proceed)\s*(with|to|on|with the next|to the next)\b/,
308
- /\bshall\s+(i|we)\s+(proceed|continue)\b/,
309
- /\bshould\s+(i|we)\s+(continue|proceed|move on)\b/,
310
- /\b(continue|proceed)\s+\?/,
311
- ];
312
- for (const pattern of routinePatterns) {
313
- if (pattern.test(lower)) {
314
- return true;
315
- }
316
- }
317
- return false;
292
+ const result = pqController.detectQuestion(question);
293
+ return result.isRoutine ?? false;
318
294
  }
319
295
 
320
296
  // Detect when agent asks for continuation
@@ -488,6 +464,9 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
488
464
  waitingForUserSince = null;
489
465
  _lastNotifiedQuestion = "";
490
466
  updateAutoContinueStatus("IDLE");
467
+ // Cancel pending question on user response
468
+ // (User answered via Pi instead of button)
469
+ sharedState.pqController?.cancel("User responded via Pi");
491
470
  }
492
471
  }
493
472
  });
@@ -550,6 +529,8 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
550
529
 
551
530
  // Check session validity and user response before applying
552
531
  if (checkSessionId !== _sessionId) {
532
+ // Session changed - cancel pending question
533
+ sharedState.pqController?.cancel("Session switched");
553
534
  _inferenceInProgress = false;
554
535
  updateAutoContinueStatus("IDLE");
555
536
  return;
@@ -792,26 +773,50 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
792
773
  if (result.action === "blocked") {
793
774
  updateAutoContinueStatus("ERROR", "blocked");
794
775
  logToFile("[auto-continue]", "Tasks blocked:", result.question ?? "unknown");
795
- } else if (result.action === "stop") {
796
- logToFile("[auto-continue]", "decide returned stop:", result.reason ?? "unknown");
797
- // Get full todo list for notification
798
- const snapshot = await todoContinuationController.getSnapshot();
799
- const todoList = snapshot.items
800
- .map((item) => {
801
- const status = item.status === "completed" ? "[DONE]" : "[PENDING]";
802
- const subject = item.subject.length > 50 ? item.subject.slice(0, 47) + "..." : item.subject;
803
- return `${status} ${subject}`;
804
- })
805
- .join("\n");
806
- const message = todoList || "All tasks completed";
807
- // Notify user that all work is complete with todo list
808
- _nc?.notify("ReadyForClient", {
809
- jobId: `done-${Date.now()}`,
810
- requirement: message,
811
- }).catch((e) => logToFile("[Notification]", "ReadyForClient failed:", String(e)));
776
+ } else if (result.action === "stop") {
777
+ const reason = result.reason ?? "unknown";
778
+ logToFile("[auto-continue]", "decide returned stop:", reason);
779
+
780
+ // Only send completion notification for "No pending tasks"
781
+ // Other stop reasons (paused, unavailable, max attempts) are not completion
782
+ const isNoPendingTasks = reason === "No pending tasks";
783
+
784
+ if (isNoPendingTasks) {
785
+ // Check if there's a pending question - suppress completion if so
786
+ if (pqController.hasPendingQuestion()) {
787
+ logToFile("[auto-continue]", "Suppressing completion - pending question exists");
788
+ updateAutoContinueStatus("WAITING", "pending");
789
+ return;
790
+ }
791
+
792
+ // Deduplication: only notify once per work generation
793
+ // Use a static flag for this session's settled cycle
794
+ const completionKey = `done-${reason}`;
795
+ if (_completedNotifiedFor === completionKey) {
796
+ logToFile("[auto-continue]", "Completion already notified for:", reason);
797
+ return;
798
+ }
799
+ _completedNotifiedFor = completionKey;
800
+
801
+ // Get full todo list for notification
802
+ const snapshot = await todoContinuationController.getSnapshot();
803
+ const todoList = snapshot.items
804
+ .map((item) => {
805
+ const status = item.status === "completed" ? "[DONE]" : "[PENDING]";
806
+ const subject = item.subject.length > 50 ? item.subject.slice(0, 47) + "..." : item.subject;
807
+ return `${status} ${subject}`;
808
+ })
809
+ .join("\n");
810
+ const message = todoList || "All tasks completed";
811
+ // Notify user that all work is complete with todo list
812
+ _nc?.notify("ReadyForClient", {
813
+ jobId: `done-${reason.replace(/\s+/g, "-")}`,
814
+ requirement: message,
815
+ }).catch((e) => logToFile("[Notification]", "ReadyForClient failed:", String(e)));
812
816
  }
813
- }
814
- } catch (err) {
817
+ }
818
+ }
819
+ } catch (err) {
815
820
  logToFile("[auto-continue]", "agent_settled handler error:", String(err));
816
821
  todoContinuationController?.clearQueue();
817
822
  }
@@ -1202,12 +1207,16 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
1202
1207
  logToFile("[TelegramCallback] Approved - user clicked Continue, resuming work");
1203
1208
  sharedState.waitingForUserSince = null;
1204
1209
  sharedState.updateAutoContinueStatus?.("IDLE");
1210
+ // Resolve pending question with yes
1211
+ sharedState.pqController?.resolve({ resolution: "yes", by: "user" });
1205
1212
  // Also resume continuation controller
1206
1213
  (sharedState.todoContinuationController as any)?.resume?.();
1207
1214
  break;
1208
1215
  case CallbackActions.REJECT:
1209
1216
  // User clicked Not yet - just dismiss, don't resume
1210
1217
  logToFile("[TelegramCallback] Rejected - user clicked Not yet, pausing");
1218
+ // Resolve pending question with no
1219
+ sharedState.pqController?.resolve({ resolution: "no", by: "user" });
1211
1220
  // Explicitly pause the continuation
1212
1221
  (sharedState.todoContinuationController as any)?.explicitPause?.();
1213
1222
  break;
@@ -1231,30 +1240,29 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
1231
1240
 
1232
1241
  // Register message handler to forward Telegram messages to Pi
1233
1242
  center.setMessageHandler(async (text: string, _chatId: string) => {
1234
- // Parse /notify command for channel management
1235
- // Usage: /notify on telegram, /notify off line, /notify on all, /notify (show status)
1236
- const notifyRegex = /^\/notify(?:\s+(on|off)(?:\s+(telegram|line|all))?/i;
1237
- const notifyMatch = text.match(notifyRegex);
1238
- if (notifyMatch) {
1239
- const [, action, channel] = notifyMatch;
1240
- const isEnabled = action === "on";
1241
- const channels = channel === "all" ? ["telegram", "line"] : [channel || "telegram"];
1242
-
1243
- for (const ch of channels) {
1244
- (center as any).setChannelEnabled?.(ch, isEnabled);
1245
- logToFile("[NotifyCommand]", `Set ${ch} to ${isEnabled ? "enabled" : "disabled"}`);
1243
+ // Parse /notify-settings command for channel management
1244
+ // Usage: /notify-settings - show current status
1245
+ // /notify-settings telegram on - enable Telegram
1246
+ // /notify-settings line off - disable LINE
1247
+ // /notify-settings all on - enable all channels
1248
+ const settingsMatch = text.match(/^\/notify-settings(?:\s+(\w+)\s+(on|off))?/i);
1249
+ if (settingsMatch || text === "/notify-settings") {
1250
+ const [, channel, action] = settingsMatch || [];
1251
+
1252
+ if (action && channel) {
1253
+ const isEnabled = action === "on";
1254
+ const targetChannels = channel === "all" ? ["telegram", "line"] : [channel];
1255
+ for (const ch of targetChannels) {
1256
+ (center as any).setChannelEnabled?.(ch, isEnabled);
1257
+ logToFile("[NotifySettings]", `Set ${ch} to ${isEnabled ? "enabled" : "disabled"}`);
1258
+ }
1246
1259
  }
1247
- const telegramStatus = (center as any).isChannelEnabled?.("telegram") ? "ON" : "OFF";
1248
- const lineStatus = (center as any).isChannelEnabled?.("line") ? "ON" : "OFF";
1249
- logToFile("[NotifyCommand]", `Current: Telegram=${telegramStatus}, LINE=${lineStatus}`);
1250
- return;
1251
- }
1252
1260
 
1253
- // Show help for /notify without args
1254
- if (text === "/notify") {
1261
+ // Show current status
1255
1262
  const telegramStatus = (center as any).isChannelEnabled?.("telegram") ? "ON" : "OFF";
1256
1263
  const lineStatus = (center as any).isChannelEnabled?.("line") ? "ON" : "OFF";
1257
- logToFile("[NotifyCommand]", `Channel Status: Telegram=${telegramStatus}, LINE=${lineStatus}`);
1264
+ logToFile("[NotifySettings]", `Current: Telegram=${telegramStatus}, LINE=${lineStatus}`);
1265
+ logToFile("[NotifySettings]", `Commands: /notify-settings telegram on|off, /notify-settings line on|off, /notify-settings all on|off`);
1258
1266
  return;
1259
1267
  }
1260
1268
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-harness-runtime",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "[BETA] Codex-style /usage status + autonomous coding harness for pi. Not production ready — expect breaking changes.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/a2a-adapter",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "Google Agent-to-Agent (A2A) protocol adapter for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/agent-policy",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Agent policy runtime for pi-harness - enforces mandatory rule delivery and mutation gating",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/architecture-generator",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Generate ADR and Mermaid diagrams from project analysis",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/auth",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "pi-harness-runtime — auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/autonomous-refactor",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "Autonomous refactoring engine",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/autonomous-runtime",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Autonomous Operations Runtime — task inbox, lease management, and worker lifecycle (RFC-0101)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/cache-strategy",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "Smart caching with TTL and invalidation strategies (RFC-0022)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/capability-registry",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Capability Registry for pi-harness-runtime — tracks model capabilities and enables capability-based routing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/checkpoint",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Enhanced checkpoint system with incremental snapshots, diff-based storage, and recovery strategies",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/cli-plugin-sdk",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "CLI Plugin SDK for pi-harness — install, list, remove, update, invoke plugins",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/clipboard",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/clipboard-plugin",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/code-generation",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Code generation pipeline for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/code-review",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Automated code review engine for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/codex-adapter",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "OpenAI Codex provider adapter for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/codex-watcher",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Watches Codex CLI sessions and emits visible messages for PING-PONG monitoring",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/config-capture",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Auto-capture API-fetched configuration values to AGENTS.md",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/connection-runtime",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "Connection management with jittered exponential backoff for pi-harness",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/context-compiler",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Bounded context selection engine for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/context-discovery",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/context-manager",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Context Window Manager — prevents model context overflow via compaction and resume prompts (RFC-0010)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/contracts",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "RPC schema definitions for pi-harness runtime",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cookie-sanitizer",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "pi-harness-runtime — cookie sanitizer (provider-quota cookie file normaliser)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cost-optimizer",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Cost Optimizer for pi-harness-runtime — budget tracking, forecasting, and model selection optimization",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/dependency-analyzer",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/django-plugin",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Django framework analysis — models, management commands, settings",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/doc-generator",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "Auto-Doc Generator — generate documentation from source code (RFC-0014)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/durable-review",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "description": "SQLite-backed durable reviewer using @earendil-works/pi-durable",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/e2e-tester",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/event-sink",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
4
4
  "type": "module",
5
5
  "description": "Atomic event sourcing with SQLite transactions for pi-harness",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-store",
3
- "version": "1.1.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
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.346",
3
+ "version": "1.1.349",
4
4
  "description": "Generic web framework analysis — REST/GraphQL endpoints, OpenAPI, auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",