pi-harness-runtime 1.1.309 → 1.1.311
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 +119 -33
- 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
|
@@ -385,12 +385,40 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
385
385
|
const _SETTLE_DELAY_MS = 5000; // Wait 5 seconds after plan ready
|
|
386
386
|
|
|
387
387
|
// Capture our Pi session's cwd on session_start
|
|
388
|
-
pi.on("session_start", () => {
|
|
388
|
+
pi.on("session_start", async () => {
|
|
389
389
|
try {
|
|
390
390
|
_piSessionCwd = realpathSync(process.cwd());
|
|
391
391
|
logToFile("[codex-trigger]", "Pi session cwd captured:", _piSessionCwd);
|
|
392
|
-
|
|
393
|
-
|
|
392
|
+
|
|
393
|
+
// --- Drain pending greeting when Pi becomes active ---
|
|
394
|
+
if (codexSessionState.pendingGreeting) {
|
|
395
|
+
const pg = codexSessionState.pendingGreeting;
|
|
396
|
+
// Check expiry (5 minutes)
|
|
397
|
+
if (Date.now() - pg.timestamp > 5 * 60 * 1000) {
|
|
398
|
+
logToFile("[codex-greeting]", "Pending greeting expired");
|
|
399
|
+
codexSessionState.pendingGreeting = null;
|
|
400
|
+
} else if (_piSessionCwd === pg.projectRoot) {
|
|
401
|
+
// Roots match - send greeting with followUp mode
|
|
402
|
+
const greetKey = `${_piSessionCwd}:${pg.sessionId}`;
|
|
403
|
+
if (!codexSessionState.greetedSessions.has(greetKey)) {
|
|
404
|
+
logToFile("[codex-greeting]", "Delivering pending greeting for:", pg.sessionId);
|
|
405
|
+
try {
|
|
406
|
+
await pi.sendUserMessage(
|
|
407
|
+
`Codex opened in this workspace (session ${pg.sessionId.slice(0, 8)}...). Say hello briefly, then wait for the user's next instruction.`,
|
|
408
|
+
{ deliverAs: "followUp" }
|
|
409
|
+
);
|
|
410
|
+
codexSessionState.greetedSessions.add(greetKey);
|
|
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;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
} catch {
|
|
421
|
+
logToFile("[codex-greeting]", "Error in session_start greeting drain");
|
|
394
422
|
}
|
|
395
423
|
});
|
|
396
424
|
|
|
@@ -2522,22 +2550,15 @@ export default function (pi: ExtensionAPI) {
|
|
|
2522
2550
|
|
|
2523
2551
|
// --- greeting: Track baseline session on watcher startup ---
|
|
2524
2552
|
// Get the current Codex session ID as baseline - don't greet it.
|
|
2525
|
-
//
|
|
2526
|
-
//
|
|
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;
|
|
2527
2556
|
try {
|
|
2528
2557
|
const { getLatestSession } = await import("./packages/codex-watcher/dist/index.js");
|
|
2529
2558
|
const baseline = getLatestSession();
|
|
2530
|
-
if (baseline
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
const sessionAgeMs = Date.now() - updatedAtMs;
|
|
2534
|
-
const isRecent = updatedAtMs > 0 && sessionAgeMs < 10 * 60 * 1000;
|
|
2535
|
-
if (isRecent) {
|
|
2536
|
-
codexSessionState.greetingBaselineSessionId = baseline.id;
|
|
2537
|
-
logToFile("[codex-greeting]", "Baseline session set (recent):", baseline.id, `age=${Math.round(sessionAgeMs/1000)}s`);
|
|
2538
|
-
} else {
|
|
2539
|
-
logToFile("[codex-greeting]", "Baseline session stale, skipping baseline:", baseline.id, `age=${Math.round(sessionAgeMs/1000)}s`);
|
|
2540
|
-
}
|
|
2559
|
+
if (baseline) {
|
|
2560
|
+
codexSessionState.greetingBaselineSessionId = baseline.id;
|
|
2561
|
+
logToFile("[codex-greeting]", "Baseline session set:", baseline.id);
|
|
2541
2562
|
}
|
|
2542
2563
|
} catch {
|
|
2543
2564
|
logToFile("[codex-greeting]", "Could not get baseline session");
|
|
@@ -2564,6 +2585,8 @@ export default function (pi: ExtensionAPI) {
|
|
|
2564
2585
|
codexSessionState.greetedSessions.add(greetKey);
|
|
2565
2586
|
} catch (err) {
|
|
2566
2587
|
logToFile("[codex-greeting]", "Failed to deliver greeting:", String(err));
|
|
2588
|
+
// Keep pendingGreeting for retry - don't clear on failure
|
|
2589
|
+
return;
|
|
2567
2590
|
}
|
|
2568
2591
|
}
|
|
2569
2592
|
codexSessionState.pendingGreeting = null;
|
|
@@ -2573,9 +2596,67 @@ export default function (pi: ExtensionAPI) {
|
|
|
2573
2596
|
const codexHandle = startWatcher({
|
|
2574
2597
|
pollIntervalMs: 5000,
|
|
2575
2598
|
maxIdlePolls: Infinity,
|
|
2576
|
-
onSessionChange: (session) => {
|
|
2599
|
+
onSessionChange: async (session) => {
|
|
2577
2600
|
if (session) {
|
|
2578
2601
|
logToFile("[codex]", `Session started: ${session.threadName}, root: ${session.projectRoot}`);
|
|
2602
|
+
|
|
2603
|
+
// --- Same-workspace greeting ---
|
|
2604
|
+
const codexSessionId = session.id;
|
|
2605
|
+
const codexProjectRoot = session.projectRoot;
|
|
2606
|
+
|
|
2607
|
+
// Skip the first callback - it's the baseline poll, not a new session
|
|
2608
|
+
if (!firstPollDone) {
|
|
2609
|
+
firstPollDone = true;
|
|
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
|
+
}
|
|
2619
|
+
|
|
2620
|
+
// Check for duplicate greeting
|
|
2621
|
+
const piCwd = _piSessionCwd || "";
|
|
2622
|
+
const greetKey = `${piCwd}:${codexSessionId}`;
|
|
2623
|
+
if (codexSessionState.greetedSessions.has(greetKey)) {
|
|
2624
|
+
logToFile("[codex-greeting]", "Already greeted:", greetKey);
|
|
2625
|
+
return;
|
|
2626
|
+
}
|
|
2627
|
+
|
|
2628
|
+
// Check root match
|
|
2629
|
+
if (!piCwd || !codexProjectRoot || piCwd !== codexProjectRoot) {
|
|
2630
|
+
logToFile("[codex-greeting]", "Different workspace or Pi cwd unknown, skipping greeting");
|
|
2631
|
+
return;
|
|
2632
|
+
}
|
|
2633
|
+
|
|
2634
|
+
logToFile("[codex-greeting]", "Same workspace detected:", codexSessionId);
|
|
2635
|
+
|
|
2636
|
+
// Use _piSessionCwd (Pi state) to check if Pi is active
|
|
2637
|
+
if (piCwd) {
|
|
2638
|
+
// Pi session active - send greeting now with await for safe delivery
|
|
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
|
+
}
|
|
2659
|
+
return;
|
|
2579
2660
|
|
|
2580
2661
|
// --- Same-workspace greeting ---
|
|
2581
2662
|
const codexSessionId = session.id;
|
|
@@ -2593,22 +2674,27 @@ export default function (pi: ExtensionAPI) {
|
|
|
2593
2674
|
if (piCwd && codexProjectRoot && piCwd === codexProjectRoot) {
|
|
2594
2675
|
logToFile("[codex-greeting]", "Same workspace detected:", codexSessionId);
|
|
2595
2676
|
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
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
|
+
};
|
|
2612
2698
|
}
|
|
2613
2699
|
} else {
|
|
2614
2700
|
logToFile("[codex-greeting]", "Different workspace or Pi cwd unknown, skipping greeting");
|
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.311",
|
|
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",
|