pi-harness-runtime 1.1.303 → 1.1.305

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 (101) hide show
  1. package/index.ts +209 -63
  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/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/e2e-tester/package.json +1 -1
  29. package/packages/evaluation-engine/package.json +1 -1
  30. package/packages/evaluation-runner/package.json +1 -1
  31. package/packages/event-bus/package.json +1 -1
  32. package/packages/event-store/package.json +1 -1
  33. package/packages/experience-replay/package.json +1 -1
  34. package/packages/feedback-collector/package.json +1 -1
  35. package/packages/file-copy-helper/package.json +1 -1
  36. package/packages/framework-detector/package.json +1 -1
  37. package/packages/framework-plugin-sdk/package.json +1 -1
  38. package/packages/frappe-plugin/package.json +1 -1
  39. package/packages/generic-web-plugin/package.json +1 -1
  40. package/packages/health-monitor/package.json +1 -1
  41. package/packages/intent-analyzer/package.json +1 -1
  42. package/packages/jev-judge/package.json +1 -1
  43. package/packages/knowledge-graph/package.json +1 -1
  44. package/packages/knowledge-retrieval/package.json +1 -1
  45. package/packages/laravel-plugin/package.json +1 -1
  46. package/packages/learning-engine/package.json +1 -1
  47. package/packages/mcp-adapter/package.json +1 -1
  48. package/packages/memory-engine/package.json +1 -1
  49. package/packages/milestone-manager/package.json +1 -1
  50. package/packages/model-registry/package.json +1 -1
  51. package/packages/nextjs-plugin/package.json +1 -1
  52. package/packages/notification/package.json +1 -1
  53. package/packages/observability/package.json +1 -1
  54. package/packages/okf-indexer/package.json +1 -1
  55. package/packages/paperclip-integration/package.json +1 -1
  56. package/packages/performance-optimizer/package.json +1 -1
  57. package/packages/privilege-broker/package.json +1 -1
  58. package/packages/project-analyzer/package.json +1 -1
  59. package/packages/project-bootstrap/package.json +1 -1
  60. package/packages/projection-engine/package.json +1 -1
  61. package/packages/prompt-compiler/package.json +1 -1
  62. package/packages/prompt-versioning/package.json +1 -1
  63. package/packages/provider-adapter-sdk/package.json +1 -1
  64. package/packages/provider-router/package.json +1 -1
  65. package/packages/provider-selector/package.json +1 -1
  66. package/packages/providers/package.json +1 -1
  67. package/packages/qdrant-skills/package.json +1 -1
  68. package/packages/quota-manager/package.json +1 -1
  69. package/packages/rate-limiter/package.json +1 -1
  70. package/packages/react-vite-plugin/package.json +1 -1
  71. package/packages/release-manager/package.json +1 -1
  72. package/packages/requirement-compiler/package.json +1 -1
  73. package/packages/runtime/package.json +1 -1
  74. package/packages/scheduler/package.json +1 -1
  75. package/packages/scheduler-adapter/package.json +1 -1
  76. package/packages/session/package.json +1 -1
  77. package/packages/session-api/package.json +1 -1
  78. package/packages/session-export/package.json +1 -1
  79. package/packages/shared-context/package.json +1 -1
  80. package/packages/skill-mcp-client/package.json +1 -1
  81. package/packages/skill-registry/package.json +1 -1
  82. package/packages/skills/package.json +1 -1
  83. package/packages/sprint-planner/package.json +1 -1
  84. package/packages/subscription-engine/package.json +1 -1
  85. package/packages/task-compiler/package.json +1 -1
  86. package/packages/telegram/package.json +1 -1
  87. package/packages/tencentdb-memory/package.json +1 -1
  88. package/packages/tencentdb-sync/package.json +1 -1
  89. package/packages/test-data-generator/package.json +1 -1
  90. package/packages/test-generator/package.json +1 -1
  91. package/packages/todo-bd-sync/package.json +1 -1
  92. package/packages/token-estimation/package.json +1 -1
  93. package/packages/token-optimizer/package.json +1 -1
  94. package/packages/trajectory/package.json +1 -1
  95. package/packages/tui/package.json +1 -1
  96. package/packages/types/package.json +1 -1
  97. package/packages/webmcp-tester/package.json +1 -1
  98. package/packages/workflow-events/package.json +1 -1
  99. package/packages/workspace-scanner/package.json +1 -1
  100. package/packages/worktree/package.json +1 -1
  101. package/packages/write-review/package.json +1 -1
package/index.ts CHANGED
@@ -916,13 +916,133 @@ interface PlanEvent {
916
916
  fileStableSince: number;
917
917
  }
918
918
 
919
+ interface PendingPINGPONGAction {
920
+ token: string;
921
+ sessionId: string;
922
+ action: "code" | "review" | "code_again" | "done";
923
+ projectRoot: string;
924
+ allowedStage: string;
925
+ expiresAt: number;
926
+ used: boolean;
927
+ }
928
+
919
929
  const codexSessionState = {
920
930
  deliveredEvents: new Map<string, PlanEvent>(),
921
931
  currentCodexSessionId: null as string | null,
922
932
  currentProjectRoot: null as string | null,
923
933
  currentPlanCandidate: null as { ordinal: number; text: string; timestamp: number } | null,
934
+ pendingActions: new Map<string, PendingPINGPONGAction>(),
924
935
  };
925
936
 
937
+ // PING_PONG callback action type (different from generic APPROVE/REJECT)
938
+ const PING_PONG_ACTIONS = {
939
+ CODE: "ping_code",
940
+ REVIEW: "ping_review",
941
+ CODE_AGAIN: "ping_code_again",
942
+ DONE: "ping_done",
943
+ } as const;
944
+
945
+ // Generate opaque token for PING_PONG action
946
+ function createPINGPONGToken(): string {
947
+ const array = new Uint8Array(16);
948
+ crypto.getRandomValues(array);
949
+ return Array.from(array, b => b.toString(16).padStart(2, "0")).join("");
950
+ }
951
+
952
+ // Create a pending PING_PONG action and return its token (used when sending button notifications)
953
+ function _createPendingAction(
954
+ sessionId: string,
955
+ action: "code" | "review" | "code_again" | "done",
956
+ projectRoot: string,
957
+ allowedStage: string
958
+ ): string {
959
+ const token = createPINGPONGToken();
960
+ codexSessionState.pendingActions.set(token, {
961
+ token,
962
+ sessionId,
963
+ action,
964
+ projectRoot,
965
+ allowedStage,
966
+ expiresAt: Date.now() + 30 * 60 * 1000, // 30 min expiry
967
+ used: false,
968
+ });
969
+ return token;
970
+ }
971
+
972
+ // Find pending action by session ID (for /task fallback)
973
+ function findPendingActionBySession(sessionId: string): PendingPINGPONGAction | undefined {
974
+ for (const action of codexSessionState.pendingActions.values()) {
975
+ if (action.sessionId === sessionId && !action.used && Date.now() < action.expiresAt) {
976
+ return action;
977
+ }
978
+ }
979
+ return undefined;
980
+ }
981
+
982
+ // Advance Codex task - shared by both button callbacks and /task commands
983
+ async function advanceCodexTask(
984
+ token: string,
985
+ action: "code" | "review" | "code_again" | "done",
986
+ pi: ExtensionAPI
987
+ ): Promise<{ success: boolean; error?: string }> {
988
+ const pending = codexSessionState.pendingActions.get(token);
989
+
990
+ // Validate pending action
991
+ if (!pending) {
992
+ return { success: false, error: "Action expired or not found" };
993
+ }
994
+ if (pending.used) {
995
+ return { success: false, error: "Action already used" };
996
+ }
997
+ if (Date.now() > pending.expiresAt) {
998
+ codexSessionState.pendingActions.delete(token);
999
+ return { success: false, error: "Action expired" };
1000
+ }
1001
+ if (pending.sessionId !== codexSessionState.currentCodexSessionId) {
1002
+ return { success: false, error: "Session no longer active" };
1003
+ }
1004
+ if (pending.projectRoot !== codexSessionState.currentProjectRoot) {
1005
+ return { success: false, error: "Project root mismatch" };
1006
+ }
1007
+
1008
+ // Mark as used
1009
+ pending.used = true;
1010
+
1011
+ // Find the event
1012
+ const event = Array.from(codexSessionState.deliveredEvents.values()).find(
1013
+ e => e.codexSessionId === pending.sessionId
1014
+ );
1015
+ if (!event) {
1016
+ return { success: false, error: "Session event not found" };
1017
+ }
1018
+
1019
+ // Check status for code action
1020
+ if (action === "code" && event.status !== "manual_wait" && event.status !== "ready") {
1021
+ return { success: false, error: `Plan not ready (status=${event.status})` };
1022
+ }
1023
+
1024
+ // Execute action
1025
+ if (action === "code" || action === "code_again") {
1026
+ await pi.sendUserMessage(
1027
+ `Human approved. Proceed to implement: ${event.planPath}`,
1028
+ { deliverAs: "steer" }
1029
+ );
1030
+ event.status = "triggered";
1031
+ logToFile("[codex-trigger]", `Advanced to code: ${event.planPath}`);
1032
+ } else if (action === "review") {
1033
+ await pi.sendUserMessage(
1034
+ "Human requests a review of the implementation.",
1035
+ { deliverAs: "steer" }
1036
+ );
1037
+ logToFile("[codex-trigger]", "Advanced to review");
1038
+ } else if (action === "done") {
1039
+ event.status = "done";
1040
+ logToFile("[codex-trigger]", "Human marked done");
1041
+ }
1042
+
1043
+ return { success: true };
1044
+ }
1045
+
926
1046
  async function initTelegram(pi: ExtensionAPI): Promise<void> {
927
1047
  addHarnessMessage("Telegram", "initializing", "wait");
928
1048
  try {
@@ -986,14 +1106,37 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
986
1106
  return;
987
1107
  }
988
1108
 
989
- // Register callback handler for inline keyboard button clicks (approve/reject)
1109
+ // Register callback handler for inline keyboard button clicks
990
1110
  const { parseCallbackData, CallbackActions } = await import(
991
- "./packages/notification/dist/telegram-webhook-handler.js"
1111
+ "./packages/notification/dist/telegram-webhook-handler.js"
992
1112
  );
993
- center.setCallbackHandler(async (data: string, _query: { id: string }) => {
1113
+ center.setCallbackHandler(async (data: string, _query: { id: string; from: { id: number } }) => {
994
1114
  const parsed = parseCallbackData(data);
995
1115
  logToFile("[TelegramCallback]", `action=${parsed.action} target=${parsed.targetId}`);
996
1116
 
1117
+ // Handle PING_PONG button callbacks
1118
+ if (parsed.action === PING_PONG_ACTIONS.CODE ||
1119
+ parsed.action === PING_PONG_ACTIONS.REVIEW ||
1120
+ parsed.action === PING_PONG_ACTIONS.CODE_AGAIN ||
1121
+ parsed.action === PING_PONG_ACTIONS.DONE) {
1122
+ // Map action string to internal action type
1123
+ const actionMap: Record<string, "code" | "review" | "code_again" | "done"> = {
1124
+ [PING_PONG_ACTIONS.CODE]: "code",
1125
+ [PING_PONG_ACTIONS.REVIEW]: "review",
1126
+ [PING_PONG_ACTIONS.CODE_AGAIN]: "code_again",
1127
+ [PING_PONG_ACTIONS.DONE]: "done",
1128
+ };
1129
+ const internalAction = actionMap[parsed.action];
1130
+
1131
+ const result = await advanceCodexTask(parsed.targetId, internalAction, pi);
1132
+ if (result.success) {
1133
+ logToFile("[TelegramCallback]", `PING_PONG ${internalAction} succeeded`);
1134
+ } else {
1135
+ logToFile("[TelegramCallback]", `PING_PONG ${internalAction} failed: ${result.error}`);
1136
+ }
1137
+ return; // Don't fall through to generic handlers
1138
+ }
1139
+
997
1140
  switch (parsed.action) {
998
1141
  case CallbackActions.APPROVE:
999
1142
  // User clicked Continue - clear waiting state and resume continuation
@@ -1021,52 +1164,38 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
1021
1164
  if (taskCommandMatch) {
1022
1165
  const [, sessionId, action] = taskCommandMatch;
1023
1166
 
1024
- // Find matching Codex session
1025
- const matchingSession = codexSessionState.deliveredEvents.get(sessionId) ||
1026
- Array.from(codexSessionState.deliveredEvents.values()).find(e => e.codexSessionId === sessionId);
1167
+ // Map action string to internal type
1168
+ const actionMap: Record<string, "code" | "review" | "code_again" | "done"> = {
1169
+ code: "code",
1170
+ review: "review",
1171
+ done: "done",
1172
+ };
1173
+ const internalAction = actionMap[action.toLowerCase()];
1174
+ if (!internalAction) {
1175
+ logToFile("[codex-trigger]", `Unknown /task action: ${action}`);
1176
+ return;
1177
+ }
1027
1178
 
1028
- // Validate session matches current project
1029
- if (!matchingSession || matchingSession.codexSessionId !== codexSessionState.currentCodexSessionId) {
1030
- logToFile("[codex-trigger]", `Unknown session or session not active: ${sessionId}`);
1179
+ // For /task, find pending action by session ID (buttons use token directly)
1180
+ const pendingAction = findPendingActionBySession(sessionId);
1181
+ if (!pendingAction) {
1182
+ logToFile("[codex-trigger]", `No pending action found for session: ${sessionId}`);
1031
1183
  return;
1032
1184
  }
1033
1185
 
1034
- // For code/review commands, check Pi cwd matches project root
1035
- if (action.toLowerCase() === "code" || action.toLowerCase() === "review") {
1186
+ // Validate cwd for code/review
1187
+ if (internalAction === "code" || internalAction === "review") {
1036
1188
  if (_piSessionCwd && codexSessionState.currentProjectRoot &&
1037
1189
  _piSessionCwd !== codexSessionState.currentProjectRoot) {
1038
- logToFile("[codex-trigger]", `Cwd mismatch for /task ${action}: Pi cwd=${_piSessionCwd} vs project=${codexSessionState.currentProjectRoot}`);
1039
- return;
1040
- }
1041
-
1042
- // For code command, require manual_wait or ready status
1043
- if (action.toLowerCase() === "code" &&
1044
- matchingSession.status !== "manual_wait" && matchingSession.status !== "ready") {
1045
- logToFile("[codex-trigger]", `Cannot /task code: plan not ready (status=${matchingSession.status})`);
1190
+ logToFile("[codex-trigger]", `Cwd mismatch: Pi cwd=${_piSessionCwd} vs project=${codexSessionState.currentProjectRoot}`);
1046
1191
  return;
1047
1192
  }
1048
1193
  }
1049
1194
 
1050
- logToFile("[codex-trigger]", `Human command: ${action} for session ${sessionId}`);
1051
-
1052
- if (action.toLowerCase() === "code") {
1053
- // Advance to code stage - send a message to Pi
1054
- await pi.sendUserMessage(
1055
- `Human approved the plan. Proceed to implement: ${matchingSession.planPath}`,
1056
- { deliverAs: "steer" }
1057
- );
1058
- matchingSession.status = "triggered";
1059
- logToFile("[codex-trigger]", "Triggered Pi for plan:", matchingSession.planPath);
1060
- } else if (action.toLowerCase() === "review") {
1061
- // Advance to review stage
1062
- await pi.sendUserMessage(
1063
- "Human requests a review of the implementation.",
1064
- { deliverAs: "steer" }
1065
- );
1066
- } else if (action.toLowerCase() === "done") {
1067
- // Mark as done
1068
- matchingSession.status = "done";
1069
- logToFile("[codex-trigger]", "Human marked session done:", sessionId);
1195
+ logToFile("[codex-trigger]", `Human command: /task ${sessionId} ${action}`);
1196
+ const result = await advanceCodexTask(pendingAction.token, internalAction, pi);
1197
+ if (!result.success) {
1198
+ logToFile("[codex-trigger]", `/task failed: ${result.error}`);
1070
1199
  }
1071
1200
  return;
1072
1201
  }
@@ -2435,34 +2564,51 @@ export default function (pi: ExtensionAPI) {
2435
2564
  }
2436
2565
  }
2437
2566
 
2438
- // Emit Telegram alert with full content
2567
+ // Emit Telegram alert with full content (async, non-blocking)
2439
2568
  const planPath = codexSessionState.currentProjectRoot ? findPlanFile(codexSessionState.currentProjectRoot) : undefined;
2440
2569
 
2570
+ // Create pending actions for PING_PONG buttons
2571
+ const sessionId = codexSessionState.currentCodexSessionId || "unknown";
2572
+ const projectRoot = codexSessionState.currentProjectRoot || "";
2573
+
2574
+ // Create tokens for each action
2575
+ const codeToken = _createPendingAction(sessionId, "code", projectRoot, "plan");
2576
+ const doneToken = _createPendingAction(sessionId, "done", projectRoot, "plan");
2577
+
2441
2578
  // Use event type based on stage
2442
2579
  if (hasReviewMarker) {
2443
- nc("CodexReviewDetected", {
2444
- requirement: msg.text,
2445
- taskTitle: codexSessionState.currentCodexSessionId || `Ordinal ${msg.ordinal}`,
2446
- details: {
2447
- ordinal: msg.ordinal,
2448
- stage: "review",
2449
- projectRoot: codexSessionState.currentProjectRoot || undefined,
2450
- messageLength: msg.text.length,
2451
- },
2452
- });
2453
- } else {
2454
- nc("CodexPlanDetected", {
2455
- requirement: msg.text, // Full text, no truncation
2456
- taskTitle: codexSessionState.currentCodexSessionId || `Ordinal ${msg.ordinal}`,
2457
- details: {
2458
- ordinal: msg.ordinal,
2459
- stage: "plan",
2460
- projectRoot: codexSessionState.currentProjectRoot || undefined,
2461
- planPath: planPath || undefined,
2462
- messageLength: msg.text.length,
2463
- },
2464
- });
2465
- }
2580
+ // Review stage: buttons are Code again and Done
2581
+ const codeAgainToken = _createPendingAction(sessionId, "code_again", projectRoot, "review");
2582
+ void nc.center.notifyWithButtons("CodexReviewDetected", {
2583
+ requirement: msg.text,
2584
+ taskTitle: sessionId,
2585
+ details: {
2586
+ ordinal: msg.ordinal,
2587
+ stage: "review",
2588
+ projectRoot,
2589
+ messageLength: msg.text.length,
2590
+ },
2591
+ }, [
2592
+ { text: "Code again", action: PING_PONG_ACTIONS.CODE_AGAIN, targetId: codeAgainToken },
2593
+ { text: "Done", action: PING_PONG_ACTIONS.DONE, targetId: doneToken },
2594
+ ]);
2595
+ } else {
2596
+ // Plan stage: buttons are Code and Done
2597
+ void nc.center.notifyWithButtons("CodexPlanDetected", {
2598
+ requirement: msg.text, // Full text, no truncation
2599
+ taskTitle: sessionId,
2600
+ details: {
2601
+ ordinal: msg.ordinal,
2602
+ stage: "plan",
2603
+ projectRoot,
2604
+ planPath: planPath || undefined,
2605
+ messageLength: msg.text.length,
2606
+ },
2607
+ }, [
2608
+ { text: "Code", action: PING_PONG_ACTIONS.CODE, targetId: codeToken },
2609
+ { text: "Done", action: PING_PONG_ACTIONS.DONE, targetId: doneToken },
2610
+ ]);
2611
+ }
2466
2612
  }
2467
2613
  },
2468
2614
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-harness-runtime",
3
- "version": "1.1.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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/context-compiler",
3
- "version": "1.1.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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/cookie-sanitizer",
3
- "version": "1.1.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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": "@pi-harness/e2e-tester",
3
- "version": "1.1.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
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.303",
3
+ "version": "1.1.305",
4
4
  "description": "Framework detection system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",