pi-harness-runtime 1.1.276 → 1.1.278
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 +153 -58
- 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/dist/src/session.d.ts.map +1 -1
- package/packages/codex-watcher/dist/src/session.js +57 -8
- package/packages/codex-watcher/dist/src/session.js.map +1 -1
- package/packages/codex-watcher/dist/src/types.d.ts +2 -0
- package/packages/codex-watcher/dist/src/types.d.ts.map +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/codex-watcher/src/session.ts +57 -8
- package/packages/codex-watcher/src/types.ts +2 -0
- 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
|
@@ -380,6 +380,20 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
380
380
|
let pendingPromptContents: string[] = []; // Accumulate batch prompt contents
|
|
381
381
|
const PROMPT_WINDOW_MS = 2000; // 2 second debounce window
|
|
382
382
|
|
|
383
|
+
// --- Codex plan auto-trigger: Track our Pi session's cwd ---
|
|
384
|
+
let _piSessionCwd = "";
|
|
385
|
+
const _SETTLE_DELAY_MS = 5000; // Wait 5 seconds after plan ready
|
|
386
|
+
|
|
387
|
+
// Capture our Pi session's cwd on session_start
|
|
388
|
+
pi.on("session_start", () => {
|
|
389
|
+
try {
|
|
390
|
+
_piSessionCwd = realpathSync(process.cwd());
|
|
391
|
+
logToFile("[codex-trigger]", "Pi session cwd captured:", _piSessionCwd);
|
|
392
|
+
} catch {
|
|
393
|
+
_piSessionCwd = process.cwd();
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
|
|
383
397
|
// Detect user responses - track prompts for debounced task capture
|
|
384
398
|
pi.on("message_start", async (event) => {
|
|
385
399
|
const msg = event.message as { role?: string } | undefined;
|
|
@@ -1627,7 +1641,7 @@ function processCompletionFile(filePath: string, pi: ExtensionAPI): void {
|
|
|
1627
1641
|
// --- Debug logging (file only, no console override) ---------------
|
|
1628
1642
|
// Logs written to file only. Real console output preserved for pi's TUI.
|
|
1629
1643
|
import { homedir } from "node:os";
|
|
1630
|
-
import { existsSync, mkdirSync, readFileSync, symlinkSync, appendFileSync } from "node:fs";
|
|
1644
|
+
import { existsSync, mkdirSync, readFileSync, symlinkSync, appendFileSync, realpathSync } from "node:fs";
|
|
1631
1645
|
import { truncateToWidth } from "@earendil-works/pi-tui";
|
|
1632
1646
|
import { join, dirname } from "node:path";
|
|
1633
1647
|
|
|
@@ -2049,39 +2063,122 @@ export default function (pi: ExtensionAPI) {
|
|
|
2049
2063
|
// Collect promise so we can wait for initialization before showing startup notification
|
|
2050
2064
|
asyncInitPromises.push(initTelegram(pi));
|
|
2051
2065
|
|
|
2052
|
-
// --- codex-watcher:
|
|
2053
|
-
//
|
|
2054
|
-
// On plan detected: sends Telegram alert + steer message to pi.dev.
|
|
2066
|
+
// --- codex-watcher: Auto-trigger Pi when Codex finishes a plan ---
|
|
2067
|
+
// Flow: detect plan -> settle timer -> file stability check -> cwd match -> trigger
|
|
2055
2068
|
try {
|
|
2056
|
-
//
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2069
|
+
// Event tracking for deduplication
|
|
2070
|
+
interface PlanEvent {
|
|
2071
|
+
codexSessionId: string;
|
|
2072
|
+
planPath: string;
|
|
2073
|
+
planHash: string;
|
|
2074
|
+
status: "observed" | "settling" | "ready" | "triggered" | "failed";
|
|
2075
|
+
ordinal: number;
|
|
2076
|
+
lastActivity: number;
|
|
2077
|
+
settleTimer: ReturnType<typeof setTimeout> | null;
|
|
2078
|
+
fileStableSince: number;
|
|
2079
|
+
}
|
|
2080
|
+
const deliveredEvents = new Map<string, PlanEvent>();
|
|
2081
|
+
let currentCodexSessionId: string | null = null;
|
|
2082
|
+
let currentProjectRoot = "";
|
|
2083
|
+
let _currentPlanCandidate: { ordinal: number; text: string; timestamp: number } | null = null;
|
|
2084
|
+
let lastActivityTime = 0;
|
|
2085
|
+
|
|
2086
|
+
// Check if plan file exists and is stable (mtime unchanged)
|
|
2087
|
+
function checkPlanFileStable(planPath: string, sinceMs: number): boolean {
|
|
2088
|
+
try {
|
|
2089
|
+
const stat = statSync(planPath);
|
|
2090
|
+
const ageMs = Date.now() - stat.mtimeMs;
|
|
2091
|
+
return ageMs >= sinceMs;
|
|
2092
|
+
} catch {
|
|
2093
|
+
return false;
|
|
2094
|
+
}
|
|
2095
|
+
}
|
|
2060
2096
|
|
|
2061
|
-
//
|
|
2062
|
-
function
|
|
2063
|
-
const
|
|
2064
|
-
|
|
2097
|
+
// Try to find wiki/plan.md in project root
|
|
2098
|
+
function findPlanFile(projectRoot: string): string | null {
|
|
2099
|
+
const candidates = [
|
|
2100
|
+
join(projectRoot, "wiki", "plan.md"),
|
|
2101
|
+
join(projectRoot, "wiki", "PLAN.md"),
|
|
2102
|
+
join(projectRoot, "docs", "plan.md"),
|
|
2103
|
+
];
|
|
2104
|
+
for (const path of candidates) {
|
|
2105
|
+
if (existsSync(path)) return path;
|
|
2106
|
+
}
|
|
2107
|
+
return null;
|
|
2108
|
+
}
|
|
2065
2109
|
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2110
|
+
// Trigger Pi to read the plan
|
|
2111
|
+
async function triggerPiForPlan(event: PlanEvent): Promise<void> {
|
|
2112
|
+
// Check cwd match
|
|
2113
|
+
if (_piSessionCwd && currentProjectRoot && _piSessionCwd !== currentProjectRoot) {
|
|
2114
|
+
logToFile("[codex-trigger]", "Cwd mismatch, skipping:", _piSessionCwd, "!=", currentProjectRoot);
|
|
2115
|
+
return;
|
|
2116
|
+
}
|
|
2069
2117
|
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2118
|
+
const triggerMsg = `Codex finished a plan for this workspace. Read and follow the plan at:\n${event.planPath}\n\nTreat that file as the task requirements. Start by summarizing the plan and then carry it out. Do not edit the plan unless the user asks.`;
|
|
2119
|
+
|
|
2120
|
+
try {
|
|
2121
|
+
await pi.sendUserMessage(triggerMsg, { deliverAs: "steer" });
|
|
2122
|
+
event.status = "triggered";
|
|
2123
|
+
logToFile("[codex-trigger]", "Triggered Pi for plan:", event.planPath);
|
|
2124
|
+
nc("CodexPlanDetected", {
|
|
2125
|
+
requirement: `Plan ready: ${event.planPath}`,
|
|
2126
|
+
taskTitle: `Ordinal ${event.ordinal}`,
|
|
2127
|
+
});
|
|
2128
|
+
} catch (err) {
|
|
2129
|
+
event.status = "failed";
|
|
2130
|
+
logToFile("[codex-trigger]", "Trigger failed:", String(err));
|
|
2079
2131
|
}
|
|
2132
|
+
}
|
|
2080
2133
|
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2134
|
+
// Start settle timer for plan
|
|
2135
|
+
function startSettleTimer(planPath: string, ordinal: number) {
|
|
2136
|
+
const eventKey = `${currentCodexSessionId}:${planPath}`;
|
|
2137
|
+
const existing = deliveredEvents.get(eventKey);
|
|
2138
|
+
if (existing && (existing.status === "triggered" || existing.status === "ready")) {
|
|
2139
|
+
logToFile("[codex-trigger]", "Plan already handled:", eventKey);
|
|
2140
|
+
return;
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2143
|
+
const event: PlanEvent = {
|
|
2144
|
+
codexSessionId: currentCodexSessionId ?? "",
|
|
2145
|
+
planPath,
|
|
2146
|
+
planHash: "",
|
|
2147
|
+
status: "settling",
|
|
2148
|
+
ordinal,
|
|
2149
|
+
lastActivity: Date.now(),
|
|
2150
|
+
settleTimer: null,
|
|
2151
|
+
fileStableSince: 0,
|
|
2152
|
+
};
|
|
2153
|
+
deliveredEvents.set(eventKey, event);
|
|
2154
|
+
|
|
2155
|
+
logToFile("[codex-trigger]", "Plan observed, starting settle timer:", planPath);
|
|
2156
|
+
|
|
2157
|
+
// Cancel existing timer if any
|
|
2158
|
+
if (event.settleTimer) {
|
|
2159
|
+
clearTimeout(event.settleTimer);
|
|
2084
2160
|
}
|
|
2161
|
+
|
|
2162
|
+
event.settleTimer = setTimeout(async () => {
|
|
2163
|
+
// Check file stability (5 seconds without changes)
|
|
2164
|
+
if (!checkPlanFileStable(planPath, _SETTLE_DELAY_MS)) {
|
|
2165
|
+
logToFile("[codex-trigger]", "Plan file still changing, restarting timer:", planPath);
|
|
2166
|
+
// Restart timer
|
|
2167
|
+
event.lastActivity = Date.now();
|
|
2168
|
+
startSettleTimer(planPath, ordinal);
|
|
2169
|
+
return;
|
|
2170
|
+
}
|
|
2171
|
+
|
|
2172
|
+
// Check no new activity during settle
|
|
2173
|
+
if (Date.now() - lastActivityTime > _SETTLE_DELAY_MS) {
|
|
2174
|
+
event.status = "ready";
|
|
2175
|
+
logToFile("[codex-trigger]", "Plan settled, triggering Pi:", planPath);
|
|
2176
|
+
await triggerPiForPlan(event);
|
|
2177
|
+
} else {
|
|
2178
|
+
logToFile("[codex-trigger]", "New activity during settle, restarting:", planPath);
|
|
2179
|
+
startSettleTimer(planPath, ordinal);
|
|
2180
|
+
}
|
|
2181
|
+
}, _SETTLE_DELAY_MS);
|
|
2085
2182
|
}
|
|
2086
2183
|
|
|
2087
2184
|
const codexHandle = startWatcher({
|
|
@@ -2089,61 +2186,59 @@ export default function (pi: ExtensionAPI) {
|
|
|
2089
2186
|
maxIdlePolls: Infinity,
|
|
2090
2187
|
onSessionChange: (session) => {
|
|
2091
2188
|
if (session) {
|
|
2092
|
-
logToFile("[codex]", `Session started: ${session.threadName}`);
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
if (!pendingDelivery.has(session.id)) {
|
|
2096
|
-
pendingDelivery.set(session.id, []);
|
|
2097
|
-
}
|
|
2189
|
+
logToFile("[codex]", `Session started: ${session.threadName}, root: ${session.projectRoot}`);
|
|
2190
|
+
currentCodexSessionId = session.id;
|
|
2191
|
+
currentProjectRoot = session.projectRoot;
|
|
2098
2192
|
nc("CodexSessionStarted", {
|
|
2099
|
-
requirement: session.threadName || "Codex session"
|
|
2193
|
+
requirement: `${session.threadName || "Codex session"} [${session.projectRoot || "unknown"}]`,
|
|
2100
2194
|
taskTitle: session.id,
|
|
2101
2195
|
});
|
|
2102
2196
|
} else {
|
|
2103
|
-
|
|
2197
|
+
currentCodexSessionId = null;
|
|
2198
|
+
currentProjectRoot = "";
|
|
2199
|
+
currentPlanCandidate = null;
|
|
2104
2200
|
}
|
|
2105
2201
|
},
|
|
2106
2202
|
onMessages: (msgs) => {
|
|
2107
|
-
|
|
2108
|
-
if (!sessionId) return;
|
|
2109
|
-
|
|
2110
|
-
// First, try to deliver any pending messages
|
|
2111
|
-
processDeliveryQueue(sessionId);
|
|
2203
|
+
if (!currentCodexSessionId) return;
|
|
2112
2204
|
|
|
2113
2205
|
for (const msg of msgs) {
|
|
2114
|
-
|
|
2206
|
+
lastActivityTime = Date.now();
|
|
2207
|
+
|
|
2115
2208
|
if (msg.role !== "assistant") continue;
|
|
2116
2209
|
|
|
2117
2210
|
const classification = classifyMessage(msg.text);
|
|
2118
2211
|
if (classification !== "plan" && classification !== "mixed") continue;
|
|
2119
2212
|
|
|
2120
|
-
//
|
|
2121
|
-
|
|
2213
|
+
// Track plan candidate
|
|
2214
|
+
currentPlanCandidate = { ordinal: msg.ordinal, text: msg.text, timestamp: Date.now() };
|
|
2215
|
+
|
|
2216
|
+
// Try to find plan file in project root
|
|
2217
|
+
if (currentProjectRoot) {
|
|
2218
|
+
const planPath = findPlanFile(currentProjectRoot);
|
|
2219
|
+
if (planPath) {
|
|
2220
|
+
logToFile("[codex-trigger]", "Plan message + wiki file detected:", planPath);
|
|
2221
|
+
startSettleTimer(planPath, msg.ordinal);
|
|
2222
|
+
} else {
|
|
2223
|
+
// No wiki/plan.md found yet - wait for file to appear
|
|
2224
|
+
logToFile("[codex-trigger]", "Plan message but no wiki/plan.md yet, waiting...");
|
|
2225
|
+
}
|
|
2226
|
+
}
|
|
2227
|
+
|
|
2228
|
+
// Emit Telegram alert
|
|
2229
|
+
const planPreview = msg.text.slice(0, 500) + (msg.text.length > 500 ? "\n..." : "");
|
|
2122
2230
|
nc("CodexPlanDetected", {
|
|
2123
2231
|
requirement: planPreview,
|
|
2124
2232
|
taskTitle: `Ordinal ${msg.ordinal}`,
|
|
2125
2233
|
});
|
|
2126
|
-
|
|
2127
|
-
// Inject full plan into pi.dev as a steer message
|
|
2128
|
-
const planContent = `[Codex plan detected — ordinal ${msg.ordinal}]\n\n${msg.text}`;
|
|
2129
|
-
try {
|
|
2130
|
-
pi.sendUserMessage(planContent, { deliverAs: "steer" });
|
|
2131
|
-
logToFile("[codex]", `Delivered ordinal ${msg.ordinal} to Pi`);
|
|
2132
|
-
} catch {
|
|
2133
|
-
// Add to pending queue for retry
|
|
2134
|
-
const queue = pendingDelivery.get(sessionId) ?? [];
|
|
2135
|
-
queue.push({ ordinal: msg.ordinal, text: msg.text, delivered: false });
|
|
2136
|
-
pendingDelivery.set(sessionId, queue);
|
|
2137
|
-
logToFile("[codex]", `Delivery failed for ordinal ${msg.ordinal}, queued for retry`);
|
|
2138
|
-
}
|
|
2139
2234
|
}
|
|
2140
2235
|
},
|
|
2141
2236
|
});
|
|
2142
2237
|
|
|
2143
2238
|
// Clean up when pi session ends
|
|
2144
|
-
|
|
2239
|
+
pi.on("session_shutdown", () => codexHandle.stop());
|
|
2145
2240
|
} catch {
|
|
2146
|
-
// Codex watcher unavailable
|
|
2241
|
+
// Codex watcher unavailable
|
|
2147
2242
|
}
|
|
2148
2243
|
|
|
2149
2244
|
// --- honcho-memory: Honcho MCP for peer/user memory (honcho_profile, etc.) ----
|
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.278",
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA0BvE;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAuBhE"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
5
5
|
import { homedir } from "node:os";
|
|
6
|
-
import { join } from "node:path";
|
|
6
|
+
import { join, resolve } from "node:path";
|
|
7
|
+
import { realpathSync } from "node:fs";
|
|
7
8
|
/** Find the most recently active Codex session. */
|
|
8
9
|
export function getLatestSession(codexDir) {
|
|
9
10
|
const indexPath = getSessionIndexPath(codexDir);
|
|
@@ -20,11 +21,14 @@ export function getLatestSession(codexDir) {
|
|
|
20
21
|
}
|
|
21
22
|
if (!latest)
|
|
22
23
|
return null;
|
|
24
|
+
const rolloutPath = findRolloutPath(latest.id, codexDir);
|
|
25
|
+
const projectRoot = getProjectRootFromRollout(rolloutPath);
|
|
23
26
|
return {
|
|
24
27
|
id: latest.id,
|
|
25
28
|
threadName: latest.thread_name,
|
|
26
29
|
updatedAt: latest.updated_at,
|
|
27
|
-
rolloutPath
|
|
30
|
+
rolloutPath,
|
|
31
|
+
projectRoot,
|
|
28
32
|
};
|
|
29
33
|
}
|
|
30
34
|
/** Get all sessions sorted by most recent first. */
|
|
@@ -40,12 +44,17 @@ export function getAllSessions(codexDir) {
|
|
|
40
44
|
}
|
|
41
45
|
return sessions
|
|
42
46
|
.sort((a, b) => b.updated_at.localeCompare(a.updated_at))
|
|
43
|
-
.map((e) =>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
.map((e) => {
|
|
48
|
+
const rolloutPath = findRolloutPath(e.id, codexDir);
|
|
49
|
+
const projectRoot = getProjectRootFromRollout(rolloutPath);
|
|
50
|
+
return {
|
|
51
|
+
id: e.id,
|
|
52
|
+
threadName: e.thread_name,
|
|
53
|
+
updatedAt: e.updated_at,
|
|
54
|
+
rolloutPath,
|
|
55
|
+
projectRoot,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
49
58
|
}
|
|
50
59
|
// ---------------------------------------------------------------------------
|
|
51
60
|
// Internal helpers
|
|
@@ -122,4 +131,44 @@ function readLines(filePath) {
|
|
|
122
131
|
return [];
|
|
123
132
|
}
|
|
124
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Parse rollout file for project working directory.
|
|
136
|
+
* Looks for session_meta JSONL records containing the working directory.
|
|
137
|
+
* Returns canonical absolute path or empty string if not found.
|
|
138
|
+
*/
|
|
139
|
+
function getProjectRootFromRollout(rolloutPath) {
|
|
140
|
+
try {
|
|
141
|
+
if (!existsSync(rolloutPath))
|
|
142
|
+
return "";
|
|
143
|
+
const lines = readLines(rolloutPath);
|
|
144
|
+
// Look for session_meta records with working directory
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
try {
|
|
147
|
+
const obj = JSON.parse(line);
|
|
148
|
+
if (obj.type === "session_meta" || obj.type === "session_start") {
|
|
149
|
+
const data = obj.data;
|
|
150
|
+
if (data && typeof data.working_directory === "string") {
|
|
151
|
+
const cwd = data.working_directory;
|
|
152
|
+
if (cwd && cwd.startsWith("/")) {
|
|
153
|
+
// Canonicalize the path
|
|
154
|
+
try {
|
|
155
|
+
return realpathSync(cwd);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return resolve(cwd);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Skip malformed JSON lines
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// File read error
|
|
171
|
+
}
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
125
174
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,8 @@ export interface CodexSession {
|
|
|
22
22
|
updatedAt: string;
|
|
23
23
|
/** Absolute path to the rollout transcript file */
|
|
24
24
|
rolloutPath: string;
|
|
25
|
+
/** Canonical absolute path to the project working directory */
|
|
26
|
+
projectRoot: string;
|
|
25
27
|
}
|
|
26
28
|
export interface CodexMessage {
|
|
27
29
|
/** Unique ordinal within the session (monotonically increasing) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,YAAY;IAC5B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC5B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,GAAG,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC9B,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAChD,+CAA+C;IAC/C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;IACzC,aAAa,EAAE,MAAM,MAAM,CAAC;CAC5B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,YAAY;IAC5B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC5B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,GAAG,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC9B,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAChD,+CAA+C;IAC/C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;IACzC,aAAa,EAAE,MAAM,MAAM,CAAC;CAC5B"}
|