pi-harness-runtime 1.1.311 → 1.1.313
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 +72 -113
- 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
|
@@ -2551,14 +2551,21 @@ export default function (pi: ExtensionAPI) {
|
|
|
2551
2551
|
// --- greeting: Track baseline session on watcher startup ---
|
|
2552
2552
|
// Get the current Codex session ID as baseline - don't greet it.
|
|
2553
2553
|
// The first watcher poll will see this as "existing" and skip it.
|
|
2554
|
-
//
|
|
2554
|
+
// Only treat recent sessions (within 10 min) as baseline to avoid stale entries.
|
|
2555
2555
|
let firstPollDone = false;
|
|
2556
2556
|
try {
|
|
2557
2557
|
const { getLatestSession } = await import("./packages/codex-watcher/dist/index.js");
|
|
2558
2558
|
const baseline = getLatestSession();
|
|
2559
|
-
if (baseline) {
|
|
2560
|
-
|
|
2561
|
-
|
|
2559
|
+
if (baseline && baseline.updatedAt) {
|
|
2560
|
+
const updatedAtMs = Date.parse(baseline.updatedAt);
|
|
2561
|
+
const sessionAgeMs = Date.now() - updatedAtMs;
|
|
2562
|
+
const isRecent = updatedAtMs > 0 && sessionAgeMs < 10 * 60 * 1000;
|
|
2563
|
+
if (isRecent) {
|
|
2564
|
+
codexSessionState.greetingBaselineSessionId = baseline.id;
|
|
2565
|
+
logToFile("[codex-greeting]", "Baseline session set (recent):", baseline.id, `age=${Math.round(sessionAgeMs/1000)}s`);
|
|
2566
|
+
} else {
|
|
2567
|
+
logToFile("[codex-greeting]", "Baseline session stale, skipped:", baseline.id, `age=${Math.round(sessionAgeMs/1000)}s`);
|
|
2568
|
+
}
|
|
2562
2569
|
}
|
|
2563
2570
|
} catch {
|
|
2564
2571
|
logToFile("[codex-greeting]", "Could not get baseline session");
|
|
@@ -2596,126 +2603,78 @@ export default function (pi: ExtensionAPI) {
|
|
|
2596
2603
|
const codexHandle = startWatcher({
|
|
2597
2604
|
pollIntervalMs: 5000,
|
|
2598
2605
|
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
|
-
}
|
|
2606
|
+
onSessionChange: async (session) => {
|
|
2607
|
+
if (session) {
|
|
2608
|
+
logToFile("[codex]", `Session started: ${session.threadName}, root: ${session.projectRoot}`);
|
|
2609
|
+
|
|
2610
|
+
// Update session state FIRST - needed for message handler
|
|
2611
|
+
codexSessionState.currentCodexSessionId = session.id;
|
|
2612
|
+
codexSessionState.currentProjectRoot = session.projectRoot;
|
|
2613
|
+
nc("CodexSessionStarted", {
|
|
2614
|
+
requirement: `${session.threadName || "Codex session"} [${session.projectRoot || "unknown"}]`,
|
|
2615
|
+
taskTitle: session.id,
|
|
2616
|
+
});
|
|
2619
2617
|
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
if (codexSessionState.greetedSessions.has(greetKey)) {
|
|
2624
|
-
logToFile("[codex-greeting]", "Already greeted:", greetKey);
|
|
2625
|
-
return;
|
|
2626
|
-
}
|
|
2618
|
+
// --- Same-workspace greeting ---
|
|
2619
|
+
const codexSessionId = session.id;
|
|
2620
|
+
const codexProjectRoot = session.projectRoot;
|
|
2627
2621
|
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2622
|
+
// Skip the first callback only if it matches the baseline
|
|
2623
|
+
if (!firstPollDone) {
|
|
2624
|
+
firstPollDone = true;
|
|
2625
|
+
if (codexSessionId === codexSessionState.greetingBaselineSessionId) {
|
|
2626
|
+
logToFile("[codex-greeting]", "Skipping baseline session (first poll):", codexSessionId);
|
|
2631
2627
|
return;
|
|
2632
2628
|
}
|
|
2629
|
+
// First poll was a new session - continue to greeting logic
|
|
2630
|
+
logToFile("[codex-greeting]", "First poll is new session:", codexSessionId);
|
|
2631
|
+
}
|
|
2633
2632
|
|
|
2634
|
-
|
|
2633
|
+
// Check for duplicate greeting
|
|
2634
|
+
const piCwd = _piSessionCwd || "";
|
|
2635
|
+
const greetKey = `${piCwd}:${codexSessionId}`;
|
|
2636
|
+
if (codexSessionState.greetedSessions.has(greetKey)) {
|
|
2637
|
+
logToFile("[codex-greeting]", "Already greeted:", greetKey);
|
|
2638
|
+
return;
|
|
2639
|
+
}
|
|
2635
2640
|
|
|
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
|
-
}
|
|
2641
|
+
// Check root match
|
|
2642
|
+
if (!piCwd || !codexProjectRoot || piCwd !== codexProjectRoot) {
|
|
2643
|
+
logToFile("[codex-greeting]", "Different workspace or Pi cwd unknown, skipping greeting");
|
|
2659
2644
|
return;
|
|
2660
|
-
|
|
2661
|
-
// --- Same-workspace greeting ---
|
|
2662
|
-
const codexSessionId = session.id;
|
|
2663
|
-
const codexProjectRoot = session.projectRoot;
|
|
2645
|
+
}
|
|
2664
2646
|
|
|
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
|
-
}
|
|
2647
|
+
logToFile("[codex-greeting]", "Same workspace detected:", codexSessionId);
|
|
2706
2648
|
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2649
|
+
// Use _piSessionCwd (Pi state) to check if Pi is active
|
|
2650
|
+
if (piCwd) {
|
|
2651
|
+
// Pi session active - send greeting now with await for safe delivery
|
|
2652
|
+
logToFile("[codex-greeting]", "Sending greeting for:", codexSessionId);
|
|
2653
|
+
try {
|
|
2654
|
+
await pi.sendUserMessage(
|
|
2655
|
+
`Codex opened in this workspace (session ${codexSessionId.slice(0, 8)}...). Say hello briefly, then wait for the user's next instruction.`,
|
|
2656
|
+
{ deliverAs: "followUp" }
|
|
2657
|
+
);
|
|
2658
|
+
codexSessionState.greetedSessions.add(greetKey);
|
|
2659
|
+
} catch (err) {
|
|
2660
|
+
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
2661
|
+
// Keep greetKey out of greetedSessions so retry is possible
|
|
2662
|
+
}
|
|
2713
2663
|
} else {
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
codexSessionState.
|
|
2664
|
+
// Pi session not active yet - queue for delivery on session_start
|
|
2665
|
+
logToFile("[codex-greeting]", "Pi not active, queueing greeting for:", codexSessionId);
|
|
2666
|
+
codexSessionState.pendingGreeting = {
|
|
2667
|
+
sessionId: codexSessionId,
|
|
2668
|
+
projectRoot: codexProjectRoot,
|
|
2669
|
+
timestamp: Date.now(),
|
|
2670
|
+
};
|
|
2717
2671
|
}
|
|
2718
|
-
}
|
|
2672
|
+
} else {
|
|
2673
|
+
codexSessionState.currentCodexSessionId = null;
|
|
2674
|
+
codexSessionState.currentProjectRoot = null;
|
|
2675
|
+
codexSessionState.currentPlanCandidate = null;
|
|
2676
|
+
}
|
|
2677
|
+
},
|
|
2719
2678
|
onMessages: (msgs) => {
|
|
2720
2679
|
if (!codexSessionState.currentCodexSessionId) return;
|
|
2721
2680
|
|
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.313",
|
|
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",
|