pi-harness-runtime 1.1.310 → 1.1.312
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/index.ts +84 -77
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/package.json +1 -1
- 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/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
package/index.ts
CHANGED
|
@@ -408,15 +408,17 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
408
408
|
{ deliverAs: "followUp" }
|
|
409
409
|
);
|
|
410
410
|
codexSessionState.greetedSessions.add(greetKey);
|
|
411
|
-
|
|
412
|
-
|
|
411
|
+
} catch (err) {
|
|
412
|
+
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
413
|
+
// Keep pendingGreeting for retry - don't clear on failure
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
codexSessionState.pendingGreeting = null;
|
|
413
418
|
}
|
|
414
|
-
}
|
|
415
|
-
codexSessionState.pendingGreeting = null;
|
|
416
419
|
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
logToFile("[codex-greeting]", "Error in session_start greeting drain");
|
|
420
|
+
} catch {
|
|
421
|
+
logToFile("[codex-greeting]", "Error in session_start greeting drain");
|
|
420
422
|
}
|
|
421
423
|
});
|
|
422
424
|
|
|
@@ -2548,22 +2550,15 @@ export default function (pi: ExtensionAPI) {
|
|
|
2548
2550
|
|
|
2549
2551
|
// --- greeting: Track baseline session on watcher startup ---
|
|
2550
2552
|
// Get the current Codex session ID as baseline - don't greet it.
|
|
2551
|
-
//
|
|
2552
|
-
//
|
|
2553
|
+
// The first watcher poll will see this as "existing" and skip it.
|
|
2554
|
+
// Also track firstPollDone to ensure the first callback is always skipped.
|
|
2555
|
+
let firstPollDone = false;
|
|
2553
2556
|
try {
|
|
2554
2557
|
const { getLatestSession } = await import("./packages/codex-watcher/dist/index.js");
|
|
2555
2558
|
const baseline = getLatestSession();
|
|
2556
|
-
if (baseline
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
const sessionAgeMs = Date.now() - updatedAtMs;
|
|
2560
|
-
const isRecent = updatedAtMs > 0 && sessionAgeMs < 10 * 60 * 1000;
|
|
2561
|
-
if (isRecent) {
|
|
2562
|
-
codexSessionState.greetingBaselineSessionId = baseline.id;
|
|
2563
|
-
logToFile("[codex-greeting]", "Baseline session set (recent):", baseline.id, `age=${Math.round(sessionAgeMs/1000)}s`);
|
|
2564
|
-
} else {
|
|
2565
|
-
logToFile("[codex-greeting]", "Baseline session stale, skipping baseline:", baseline.id, `age=${Math.round(sessionAgeMs/1000)}s`);
|
|
2566
|
-
}
|
|
2559
|
+
if (baseline) {
|
|
2560
|
+
codexSessionState.greetingBaselineSessionId = baseline.id;
|
|
2561
|
+
logToFile("[codex-greeting]", "Baseline session set:", baseline.id);
|
|
2567
2562
|
}
|
|
2568
2563
|
} catch {
|
|
2569
2564
|
logToFile("[codex-greeting]", "Could not get baseline session");
|
|
@@ -2590,6 +2585,8 @@ export default function (pi: ExtensionAPI) {
|
|
|
2590
2585
|
codexSessionState.greetedSessions.add(greetKey);
|
|
2591
2586
|
} catch (err) {
|
|
2592
2587
|
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
2588
|
+
// Keep pendingGreeting for retry - don't clear on failure
|
|
2589
|
+
return;
|
|
2593
2590
|
}
|
|
2594
2591
|
}
|
|
2595
2592
|
codexSessionState.pendingGreeting = null;
|
|
@@ -2599,68 +2596,78 @@ export default function (pi: ExtensionAPI) {
|
|
|
2599
2596
|
const codexHandle = startWatcher({
|
|
2600
2597
|
pollIntervalMs: 5000,
|
|
2601
2598
|
maxIdlePolls: Infinity,
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2599
|
+
onSessionChange: async (session) => {
|
|
2600
|
+
if (session) {
|
|
2601
|
+
logToFile("[codex]", `Session started: ${session.threadName}, root: ${session.projectRoot}`);
|
|
2602
|
+
|
|
2603
|
+
// Update session state FIRST - needed for message handler
|
|
2604
|
+
codexSessionState.currentCodexSessionId = session.id;
|
|
2605
|
+
codexSessionState.currentProjectRoot = session.projectRoot;
|
|
2606
|
+
nc("CodexSessionStarted", {
|
|
2607
|
+
requirement: `${session.threadName || "Codex session"} [${session.projectRoot || "unknown"}]`,
|
|
2608
|
+
taskTitle: session.id,
|
|
2609
|
+
});
|
|
2610
|
+
|
|
2611
|
+
// --- Same-workspace greeting ---
|
|
2612
|
+
const codexSessionId = session.id;
|
|
2613
|
+
const codexProjectRoot = session.projectRoot;
|
|
2614
|
+
|
|
2615
|
+
// Skip the first callback only if it matches the baseline
|
|
2616
|
+
if (!firstPollDone) {
|
|
2617
|
+
firstPollDone = true;
|
|
2611
2618
|
if (codexSessionId === codexSessionState.greetingBaselineSessionId) {
|
|
2612
|
-
logToFile("[codex-greeting]", "Skipping baseline session:", codexSessionId);
|
|
2613
|
-
|
|
2614
|
-
// Check for duplicate greeting
|
|
2615
|
-
const piCwd = _piSessionCwd || "";
|
|
2616
|
-
const greetKey = `${piCwd}:${codexSessionId}`;
|
|
2617
|
-
if (!codexSessionState.greetedSessions.has(greetKey)) {
|
|
2618
|
-
// Check root match
|
|
2619
|
-
if (piCwd && codexProjectRoot && piCwd === codexProjectRoot) {
|
|
2620
|
-
logToFile("[codex-greeting]", "Same workspace detected:", codexSessionId);
|
|
2621
|
-
|
|
2622
|
-
// Use _piSessionCwd (Pi state) to check if Pi is active, not Codex state
|
|
2623
|
-
if (piCwd) {
|
|
2624
|
-
// Pi session active - send greeting now with await for safe delivery
|
|
2625
|
-
logToFile("[codex-greeting]", "Sending greeting for:", codexSessionId);
|
|
2626
|
-
try {
|
|
2627
|
-
await pi.sendUserMessage(
|
|
2628
|
-
`Codex opened in this workspace (session ${codexSessionId.slice(0, 8)}...). Say hello briefly, then wait for the user's next instruction.`,
|
|
2629
|
-
{ deliverAs: "followUp" }
|
|
2630
|
-
);
|
|
2631
|
-
codexSessionState.greetedSessions.add(greetKey);
|
|
2632
|
-
} catch (err) {
|
|
2633
|
-
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
2634
|
-
}
|
|
2635
|
-
} else {
|
|
2636
|
-
// Pi session not active yet - queue for delivery on session_start
|
|
2637
|
-
logToFile("[codex-greeting]", "Pi not active, queueing greeting for:", codexSessionId);
|
|
2638
|
-
codexSessionState.pendingGreeting = {
|
|
2639
|
-
sessionId: codexSessionId,
|
|
2640
|
-
projectRoot: codexProjectRoot,
|
|
2641
|
-
timestamp: Date.now(),
|
|
2642
|
-
};
|
|
2643
|
-
}
|
|
2644
|
-
} else {
|
|
2645
|
-
logToFile("[codex-greeting]", "Different workspace or Pi cwd unknown, skipping greeting");
|
|
2646
|
-
}
|
|
2647
|
-
} else {
|
|
2648
|
-
logToFile("[codex-greeting]", "Already greeted:", greetKey);
|
|
2649
|
-
}
|
|
2619
|
+
logToFile("[codex-greeting]", "Skipping baseline session (first poll):", codexSessionId);
|
|
2620
|
+
return;
|
|
2650
2621
|
}
|
|
2622
|
+
// First poll was a new session - continue to greeting logic
|
|
2623
|
+
logToFile("[codex-greeting]", "First poll is new session:", codexSessionId);
|
|
2624
|
+
}
|
|
2651
2625
|
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2626
|
+
// Check for duplicate greeting
|
|
2627
|
+
const piCwd = _piSessionCwd || "";
|
|
2628
|
+
const greetKey = `${piCwd}:${codexSessionId}`;
|
|
2629
|
+
if (codexSessionState.greetedSessions.has(greetKey)) {
|
|
2630
|
+
logToFile("[codex-greeting]", "Already greeted:", greetKey);
|
|
2631
|
+
return;
|
|
2632
|
+
}
|
|
2633
|
+
|
|
2634
|
+
// Check root match
|
|
2635
|
+
if (!piCwd || !codexProjectRoot || piCwd !== codexProjectRoot) {
|
|
2636
|
+
logToFile("[codex-greeting]", "Different workspace or Pi cwd unknown, skipping greeting");
|
|
2637
|
+
return;
|
|
2638
|
+
}
|
|
2639
|
+
|
|
2640
|
+
logToFile("[codex-greeting]", "Same workspace detected:", codexSessionId);
|
|
2641
|
+
|
|
2642
|
+
// Use _piSessionCwd (Pi state) to check if Pi is active
|
|
2643
|
+
if (piCwd) {
|
|
2644
|
+
// Pi session active - send greeting now with await for safe delivery
|
|
2645
|
+
logToFile("[codex-greeting]", "Sending greeting for:", codexSessionId);
|
|
2646
|
+
try {
|
|
2647
|
+
await pi.sendUserMessage(
|
|
2648
|
+
`Codex opened in this workspace (session ${codexSessionId.slice(0, 8)}...). Say hello briefly, then wait for the user's next instruction.`,
|
|
2649
|
+
{ deliverAs: "followUp" }
|
|
2650
|
+
);
|
|
2651
|
+
codexSessionState.greetedSessions.add(greetKey);
|
|
2652
|
+
} catch (err) {
|
|
2653
|
+
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
2654
|
+
// Keep greetKey out of greetedSessions so retry is possible
|
|
2655
|
+
}
|
|
2658
2656
|
} else {
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
codexSessionState.
|
|
2657
|
+
// Pi session not active yet - queue for delivery on session_start
|
|
2658
|
+
logToFile("[codex-greeting]", "Pi not active, queueing greeting for:", codexSessionId);
|
|
2659
|
+
codexSessionState.pendingGreeting = {
|
|
2660
|
+
sessionId: codexSessionId,
|
|
2661
|
+
projectRoot: codexProjectRoot,
|
|
2662
|
+
timestamp: Date.now(),
|
|
2663
|
+
};
|
|
2662
2664
|
}
|
|
2663
|
-
}
|
|
2665
|
+
} else {
|
|
2666
|
+
codexSessionState.currentCodexSessionId = null;
|
|
2667
|
+
codexSessionState.currentProjectRoot = null;
|
|
2668
|
+
codexSessionState.currentPlanCandidate = null;
|
|
2669
|
+
}
|
|
2670
|
+
},
|
|
2664
2671
|
onMessages: (msgs) => {
|
|
2665
2672
|
if (!codexSessionState.currentCodexSessionId) return;
|
|
2666
2673
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/capability-registry",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.312",
|
|
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",
|