pi-harness-runtime 1.1.311 → 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 +61 -109
- 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
|
@@ -2596,126 +2596,78 @@ export default function (pi: ExtensionAPI) {
|
|
|
2596
2596
|
const codexHandle = startWatcher({
|
|
2597
2597
|
pollIntervalMs: 5000,
|
|
2598
2598
|
maxIdlePolls: Infinity,
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
logToFile("[codex-greeting]", "Skipping first poll callback (baseline):", codexSessionId);
|
|
2611
|
-
return;
|
|
2612
|
-
}
|
|
2613
|
-
|
|
2614
|
-
// Skip if this is the baseline session (Pi just restarted)
|
|
2615
|
-
if (codexSessionId === codexSessionState.greetingBaselineSessionId) {
|
|
2616
|
-
logToFile("[codex-greeting]", "Skipping baseline session:", codexSessionId);
|
|
2617
|
-
return;
|
|
2618
|
-
}
|
|
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
|
+
});
|
|
2619
2610
|
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
if (codexSessionState.greetedSessions.has(greetKey)) {
|
|
2624
|
-
logToFile("[codex-greeting]", "Already greeted:", greetKey);
|
|
2625
|
-
return;
|
|
2626
|
-
}
|
|
2611
|
+
// --- Same-workspace greeting ---
|
|
2612
|
+
const codexSessionId = session.id;
|
|
2613
|
+
const codexProjectRoot = session.projectRoot;
|
|
2627
2614
|
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2615
|
+
// Skip the first callback only if it matches the baseline
|
|
2616
|
+
if (!firstPollDone) {
|
|
2617
|
+
firstPollDone = true;
|
|
2618
|
+
if (codexSessionId === codexSessionState.greetingBaselineSessionId) {
|
|
2619
|
+
logToFile("[codex-greeting]", "Skipping baseline session (first poll):", codexSessionId);
|
|
2631
2620
|
return;
|
|
2632
2621
|
}
|
|
2622
|
+
// First poll was a new session - continue to greeting logic
|
|
2623
|
+
logToFile("[codex-greeting]", "First poll is new session:", codexSessionId);
|
|
2624
|
+
}
|
|
2633
2625
|
|
|
2634
|
-
|
|
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
|
+
}
|
|
2635
2633
|
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
logToFile("[codex-greeting]", "Sending greeting for:", codexSessionId);
|
|
2640
|
-
try {
|
|
2641
|
-
await pi.sendUserMessage(
|
|
2642
|
-
`Codex opened in this workspace (session ${codexSessionId.slice(0, 8)}...). Say hello briefly, then wait for the user's next instruction.`,
|
|
2643
|
-
{ deliverAs: "followUp" }
|
|
2644
|
-
);
|
|
2645
|
-
codexSessionState.greetedSessions.add(greetKey);
|
|
2646
|
-
} catch (err) {
|
|
2647
|
-
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
2648
|
-
// Keep greetKey out of greetedSessions so retry is possible
|
|
2649
|
-
}
|
|
2650
|
-
} else {
|
|
2651
|
-
// Pi session not active yet - queue for delivery on session_start
|
|
2652
|
-
logToFile("[codex-greeting]", "Pi not active, queueing greeting for:", codexSessionId);
|
|
2653
|
-
codexSessionState.pendingGreeting = {
|
|
2654
|
-
sessionId: codexSessionId,
|
|
2655
|
-
projectRoot: codexProjectRoot,
|
|
2656
|
-
timestamp: Date.now(),
|
|
2657
|
-
};
|
|
2658
|
-
}
|
|
2634
|
+
// Check root match
|
|
2635
|
+
if (!piCwd || !codexProjectRoot || piCwd !== codexProjectRoot) {
|
|
2636
|
+
logToFile("[codex-greeting]", "Different workspace or Pi cwd unknown, skipping greeting");
|
|
2659
2637
|
return;
|
|
2660
|
-
|
|
2661
|
-
// --- Same-workspace greeting ---
|
|
2662
|
-
const codexSessionId = session.id;
|
|
2663
|
-
const codexProjectRoot = session.projectRoot;
|
|
2638
|
+
}
|
|
2664
2639
|
|
|
2665
|
-
|
|
2666
|
-
if (codexSessionId === codexSessionState.greetingBaselineSessionId) {
|
|
2667
|
-
logToFile("[codex-greeting]", "Skipping baseline session:", codexSessionId);
|
|
2668
|
-
} else {
|
|
2669
|
-
// Check for duplicate greeting
|
|
2670
|
-
const piCwd = _piSessionCwd || "";
|
|
2671
|
-
const greetKey = `${piCwd}:${codexSessionId}`;
|
|
2672
|
-
if (!codexSessionState.greetedSessions.has(greetKey)) {
|
|
2673
|
-
// Check root match
|
|
2674
|
-
if (piCwd && codexProjectRoot && piCwd === codexProjectRoot) {
|
|
2675
|
-
logToFile("[codex-greeting]", "Same workspace detected:", codexSessionId);
|
|
2676
|
-
|
|
2677
|
-
// Use _piSessionCwd (Pi state) to check if Pi is active, not Codex state
|
|
2678
|
-
if (piCwd) {
|
|
2679
|
-
// Pi session active - send greeting now with await for safe delivery
|
|
2680
|
-
logToFile("[codex-greeting]", "Sending greeting for:", codexSessionId);
|
|
2681
|
-
try {
|
|
2682
|
-
await pi.sendUserMessage(
|
|
2683
|
-
`Codex opened in this workspace (session ${codexSessionId.slice(0, 8)}...). Say hello briefly, then wait for the user's next instruction.`,
|
|
2684
|
-
{ deliverAs: "followUp" }
|
|
2685
|
-
);
|
|
2686
|
-
codexSessionState.greetedSessions.add(greetKey);
|
|
2687
|
-
} catch (err) {
|
|
2688
|
-
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
2689
|
-
}
|
|
2690
|
-
} else {
|
|
2691
|
-
// Pi session not active yet - queue for delivery on session_start
|
|
2692
|
-
logToFile("[codex-greeting]", "Pi not active, queueing greeting for:", codexSessionId);
|
|
2693
|
-
codexSessionState.pendingGreeting = {
|
|
2694
|
-
sessionId: codexSessionId,
|
|
2695
|
-
projectRoot: codexProjectRoot,
|
|
2696
|
-
timestamp: Date.now(),
|
|
2697
|
-
};
|
|
2698
|
-
}
|
|
2699
|
-
} else {
|
|
2700
|
-
logToFile("[codex-greeting]", "Different workspace or Pi cwd unknown, skipping greeting");
|
|
2701
|
-
}
|
|
2702
|
-
} else {
|
|
2703
|
-
logToFile("[codex-greeting]", "Already greeted:", greetKey);
|
|
2704
|
-
}
|
|
2705
|
-
}
|
|
2640
|
+
logToFile("[codex-greeting]", "Same workspace detected:", codexSessionId);
|
|
2706
2641
|
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
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
|
+
}
|
|
2713
2656
|
} else {
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
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
|
+
};
|
|
2717
2664
|
}
|
|
2718
|
-
}
|
|
2665
|
+
} else {
|
|
2666
|
+
codexSessionState.currentCodexSessionId = null;
|
|
2667
|
+
codexSessionState.currentProjectRoot = null;
|
|
2668
|
+
codexSessionState.currentPlanCandidate = null;
|
|
2669
|
+
}
|
|
2670
|
+
},
|
|
2719
2671
|
onMessages: (msgs) => {
|
|
2720
2672
|
if (!codexSessionState.currentCodexSessionId) return;
|
|
2721
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",
|