pi-harness-runtime 1.1.252 → 1.1.254
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 +41 -23
- 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/index.d.ts +1 -0
- package/packages/codex-watcher/dist/src/index.d.ts.map +1 -1
- package/packages/codex-watcher/dist/src/index.js +41 -17
- package/packages/codex-watcher/dist/src/index.js.map +1 -1
- package/packages/codex-watcher/dist/src/session.js +23 -29
- package/packages/codex-watcher/dist/src/session.js.map +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/codex-watcher/src/index.ts +45 -19
- package/packages/codex-watcher/src/session.ts +20 -33
- 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
|
@@ -1977,22 +1977,35 @@ export default function (pi: ExtensionAPI) {
|
|
|
1977
1977
|
// Collect promise so we can wait for initialization before showing startup notification
|
|
1978
1978
|
asyncInitPromises.push(initTelegram(pi));
|
|
1979
1979
|
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1980
|
+
// --- codex-watcher: Inject Codex plans into pi.dev + Telegram --------------
|
|
1981
|
+
// Lightweight: polls ~/.codex/sessions/ every 5s, no LangChain daemon.
|
|
1982
|
+
// On plan detected: sends Telegram alert + steer message to pi.dev.
|
|
1983
|
+
try {
|
|
1984
|
+
// Track accepted and delivered ordinals per session
|
|
1985
|
+
// Accepted: we've seen this ordinal and are trying to deliver
|
|
1986
|
+
// Delivered: successfully sent to destination
|
|
1987
|
+
const sessionAcceptedOrdinals = new Map<string, number>();
|
|
1988
|
+
const sessionDeliveredOrdinals = new Map<string, number>();
|
|
1989
|
+
let currentSessionId: string | null = null;
|
|
1990
|
+
|
|
1991
|
+
const codexHandle = startWatcher({
|
|
1992
|
+
pollIntervalMs: 5000,
|
|
1993
|
+
maxIdlePolls: Infinity,
|
|
1994
|
+
onSessionChange: (session) => {
|
|
1990
1995
|
if (session) {
|
|
1991
1996
|
logToFile("[codex]", `Session started: ${session.threadName}`);
|
|
1997
|
+
currentSessionId = session.id;
|
|
1998
|
+
// Initialize ordinal tracking for new session if not tracked yet
|
|
1999
|
+
if (!sessionAcceptedOrdinals.has(session.id)) {
|
|
2000
|
+
sessionAcceptedOrdinals.set(session.id, 0);
|
|
2001
|
+
sessionDeliveredOrdinals.set(session.id, 0);
|
|
2002
|
+
}
|
|
1992
2003
|
nc("CodexSessionStarted", {
|
|
1993
2004
|
requirement: session.threadName || "Codex session",
|
|
1994
2005
|
taskTitle: session.id,
|
|
1995
2006
|
});
|
|
2007
|
+
} else {
|
|
2008
|
+
currentSessionId = null;
|
|
1996
2009
|
}
|
|
1997
2010
|
},
|
|
1998
2011
|
onMessages: (msgs) => {
|
|
@@ -2002,27 +2015,32 @@ export default function (pi: ExtensionAPI) {
|
|
|
2002
2015
|
|
|
2003
2016
|
const classification = classifyMessage(msg.text);
|
|
2004
2017
|
if (classification !== "plan" && classification !== "mixed") continue;
|
|
2005
|
-
if (msg.ordinal <= latestPlanOrdinal) continue;
|
|
2006
2018
|
|
|
2007
|
-
|
|
2019
|
+
// Get session-specific ordinal tracking (use currentSessionId from watcher)
|
|
2020
|
+
const sessionId = currentSessionId;
|
|
2021
|
+
if (!sessionId) continue;
|
|
2008
2022
|
|
|
2009
|
-
//
|
|
2023
|
+
// Check if we've already delivered this ordinal to this session
|
|
2024
|
+
const deliveredOrdinal = sessionDeliveredOrdinals.get(sessionId) ?? 0;
|
|
2025
|
+
if (msg.ordinal <= deliveredOrdinal) continue;
|
|
2026
|
+
|
|
2027
|
+
// Emit Telegram alert with preview (include more of the plan)
|
|
2028
|
+
const planPreview = msg.text.slice(0, 800) + (msg.text.length > 800 ? "\n... (full plan forwarded to Pi)" : "");
|
|
2010
2029
|
nc("CodexPlanDetected", {
|
|
2011
|
-
requirement:
|
|
2030
|
+
requirement: planPreview,
|
|
2012
2031
|
taskTitle: `Ordinal ${msg.ordinal}`,
|
|
2013
2032
|
});
|
|
2014
2033
|
|
|
2015
|
-
// Inject plan into pi.dev as a steer message
|
|
2016
|
-
const
|
|
2034
|
+
// Inject full plan into pi.dev as a steer message
|
|
2035
|
+
const planContent = `[Codex plan detected — ordinal ${msg.ordinal}]\n\n${msg.text}`;
|
|
2017
2036
|
try {
|
|
2018
|
-
pi.sendUserMessage(
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
${
|
|
2022
|
-
{ deliverAs: "steer" },
|
|
2023
|
-
);
|
|
2037
|
+
pi.sendUserMessage(planContent, { deliverAs: "steer" });
|
|
2038
|
+
// Mark as delivered only if Pi send succeeds
|
|
2039
|
+
sessionDeliveredOrdinals.set(sessionId, msg.ordinal);
|
|
2040
|
+
logToFile("[codex]", `Delivered ordinal ${msg.ordinal} to Pi`);
|
|
2024
2041
|
} catch {
|
|
2025
|
-
|
|
2042
|
+
// pi.dev may not be ready - log failure, will retry on next poll
|
|
2043
|
+
logToFile("[codex]", `Delivery failed for ordinal ${msg.ordinal}, will retry on next poll`);
|
|
2026
2044
|
}
|
|
2027
2045
|
}
|
|
2028
2046
|
},
|
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.254",
|
|
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",
|
|
@@ -37,6 +37,7 @@ export declare function getVisibleMessages(rolloutPath: string, options?: {
|
|
|
37
37
|
* 1. Polls session_index.jsonl to detect active session changes
|
|
38
38
|
* 2. Tracks file position so it only reads new lines (no re-read of full file)
|
|
39
39
|
* 3. Calls onMessages with incremental messages each poll cycle
|
|
40
|
+
* 4. Preserves incomplete JSON lines until a complete newline-delimited record arrives
|
|
40
41
|
*/
|
|
41
42
|
export declare function startWatcher(options?: WatcherOptions): WatcherHandle;
|
|
42
43
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC;AAM7D,oFAAoF;AACpF,wBAAsB,kBAAkB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBzB;AAMD
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC;AAM7D,oFAAoF;AACpF,wBAAsB,kBAAkB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBzB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAsLxE"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* });
|
|
18
18
|
* // later: handle.stop();
|
|
19
19
|
*/
|
|
20
|
-
import { existsSync, openSync, readFileSync,
|
|
20
|
+
import { existsSync, openSync, readFileSync, readSync, fstatSync, closeSync } from "node:fs";
|
|
21
21
|
import { homedir } from "node:os";
|
|
22
22
|
import { join } from "node:path";
|
|
23
23
|
import { classifyMessage, parseNewMessages } from "./parser.js";
|
|
@@ -57,6 +57,7 @@ export async function getVisibleMessages(rolloutPath, options = {}) {
|
|
|
57
57
|
* 1. Polls session_index.jsonl to detect active session changes
|
|
58
58
|
* 2. Tracks file position so it only reads new lines (no re-read of full file)
|
|
59
59
|
* 3. Calls onMessages with incremental messages each poll cycle
|
|
60
|
+
* 4. Preserves incomplete JSON lines until a complete newline-delimited record arrives
|
|
60
61
|
*/
|
|
61
62
|
export function startWatcher(options = {}) {
|
|
62
63
|
const { pollIntervalMs = 2000, codexDir, onMessages, onSessionChange, } = options;
|
|
@@ -65,6 +66,8 @@ export function startWatcher(options = {}) {
|
|
|
65
66
|
let currentFd = null;
|
|
66
67
|
let currentPath = null;
|
|
67
68
|
let currentOrdinal = 0;
|
|
69
|
+
let currentBytePos = 0; // Track byte position we're at in the file
|
|
70
|
+
let pendingText = ""; // Preserve incomplete lines across reads
|
|
68
71
|
let pollCount = 0;
|
|
69
72
|
const maxIdlePolls = options.maxIdlePolls ?? Infinity;
|
|
70
73
|
// Track last known session to detect changes
|
|
@@ -73,12 +76,12 @@ export function startWatcher(options = {}) {
|
|
|
73
76
|
stopped = true;
|
|
74
77
|
if (currentFd !== null) {
|
|
75
78
|
try {
|
|
76
|
-
const { closeSync } = require("node:fs");
|
|
77
79
|
closeSync(currentFd);
|
|
78
80
|
}
|
|
79
81
|
catch {
|
|
80
82
|
// ignore
|
|
81
83
|
}
|
|
84
|
+
currentFd = null;
|
|
82
85
|
}
|
|
83
86
|
}
|
|
84
87
|
function isRunning() {
|
|
@@ -93,32 +96,52 @@ export function startWatcher(options = {}) {
|
|
|
93
96
|
function openRollout(path) {
|
|
94
97
|
if (currentFd !== null && currentPath !== path) {
|
|
95
98
|
try {
|
|
96
|
-
const { closeSync } = require("node:fs");
|
|
97
99
|
closeSync(currentFd);
|
|
98
100
|
}
|
|
99
101
|
catch {
|
|
100
102
|
// ignore
|
|
101
103
|
}
|
|
104
|
+
currentFd = null;
|
|
102
105
|
}
|
|
103
|
-
//
|
|
104
|
-
const stat = statSync(path);
|
|
106
|
+
// Open the file for reading
|
|
105
107
|
currentFd = openSync(path, "r");
|
|
106
108
|
currentPath = path;
|
|
107
109
|
currentOrdinal = 0;
|
|
108
|
-
|
|
110
|
+
currentBytePos = 0;
|
|
111
|
+
pendingText = ""; // Reset pending text for new file
|
|
112
|
+
return currentFd;
|
|
109
113
|
}
|
|
110
|
-
|
|
111
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Read new lines from the file, preserving incomplete records.
|
|
116
|
+
* Returns complete lines only; incomplete trailing data is kept for next read.
|
|
117
|
+
*/
|
|
118
|
+
function readNewLines(fd) {
|
|
112
119
|
const stat = fstatSync(fd);
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
120
|
+
const fileSize = stat.size;
|
|
121
|
+
// Read from our tracked position to current end of file
|
|
122
|
+
const bytesToRead = fileSize - currentBytePos;
|
|
123
|
+
if (bytesToRead <= 0) {
|
|
124
|
+
return { lines: [], newBytePos: currentBytePos };
|
|
116
125
|
}
|
|
117
|
-
const buf = Buffer.alloc(
|
|
118
|
-
const bytesRead = readSync(fd, buf, 0, buf.length,
|
|
126
|
+
const buf = Buffer.alloc(bytesToRead);
|
|
127
|
+
const bytesRead = readSync(fd, buf, 0, buf.length, currentBytePos);
|
|
119
128
|
const text = buf.subarray(0, bytesRead).toString("utf8");
|
|
120
|
-
|
|
121
|
-
|
|
129
|
+
// Prepend any pending text from previous incomplete read
|
|
130
|
+
const fullText = pendingText + text;
|
|
131
|
+
// Split by newline, keeping track of whether we ended with a complete line
|
|
132
|
+
const lines = fullText.split("\n");
|
|
133
|
+
// If text doesn't end with newline, last element is incomplete - save it
|
|
134
|
+
if (!text.endsWith("\n")) {
|
|
135
|
+
pendingText = lines.pop() ?? "";
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
pendingText = "";
|
|
139
|
+
}
|
|
140
|
+
// Filter out empty lines
|
|
141
|
+
const completeLines = lines.filter((l) => l.trim());
|
|
142
|
+
// Update our tracked position by bytes actually read
|
|
143
|
+
const newBytePos = currentBytePos + bytesRead;
|
|
144
|
+
return { lines: completeLines, newBytePos };
|
|
122
145
|
}
|
|
123
146
|
async function poll() {
|
|
124
147
|
if (stopped)
|
|
@@ -155,8 +178,9 @@ export function startWatcher(options = {}) {
|
|
|
155
178
|
}
|
|
156
179
|
return;
|
|
157
180
|
}
|
|
158
|
-
|
|
159
|
-
const { lines } = readNewLines(currentFd
|
|
181
|
+
// Read new lines from our tracked byte position
|
|
182
|
+
const { lines, newBytePos } = readNewLines(currentFd);
|
|
183
|
+
currentBytePos = newBytePos; // Update tracked position
|
|
160
184
|
if (lines.length > 0) {
|
|
161
185
|
pollCount = 0;
|
|
162
186
|
const messages = parseNewMessages(lines, currentOrdinal);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session discovery — reads ~/.codex/session_index.jsonl to find active sessions.
|
|
3
3
|
*/
|
|
4
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
5
5
|
import { homedir } from "node:os";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
/** Find the most recently active Codex session. */
|
|
@@ -60,46 +60,40 @@ function findRolloutPath(sessionId, codexDir) {
|
|
|
60
60
|
// The rollout path follows: sessions/YYYY/MM/DD/rollout-YYYY-MM-DDTHH-MM-SS-<sessionId>.jsonl
|
|
61
61
|
// We need to find the file whose name ends with <sessionId>.jsonl
|
|
62
62
|
// Since there can be multiple sessions per day, iterate all files.
|
|
63
|
-
try {
|
|
64
|
-
const { readdirSync } = require("node:fs");
|
|
65
|
-
for (const dirPath of walkDirs(sessionsDir)) {
|
|
66
|
-
for (const file of readdirSync(dirPath)) {
|
|
67
|
-
if (file.endsWith(`${sessionId}.jsonl`)) {
|
|
68
|
-
return join(dirPath, file);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// walkSync may not be available on all Node versions; fall back to find
|
|
75
|
-
}
|
|
76
|
-
return findRolloutPathFallback(sessionId, sessionsDir);
|
|
77
|
-
}
|
|
78
|
-
function findRolloutPathFallback(sessionId, sessionsDir) {
|
|
79
63
|
const found = walkForSession(sessionsDir, sessionId);
|
|
80
|
-
|
|
64
|
+
if (found)
|
|
65
|
+
return found;
|
|
66
|
+
return join(sessionsDir, "unknown", `${sessionId}.jsonl`);
|
|
81
67
|
}
|
|
82
68
|
/** Recursively walk all subdirectories, yielding each directory path. */
|
|
83
69
|
function* walkDirs(dir) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
70
|
+
try {
|
|
71
|
+
for (const entry of readdirSync(dir)) {
|
|
72
|
+
const full = join(dir, entry);
|
|
73
|
+
const stat = statSync(full);
|
|
74
|
+
if (stat.isDirectory()) {
|
|
75
|
+
yield full;
|
|
76
|
+
yield* walkDirs(full);
|
|
77
|
+
}
|
|
91
78
|
}
|
|
92
79
|
}
|
|
80
|
+
catch {
|
|
81
|
+
// Directory may not exist or be readable
|
|
82
|
+
}
|
|
93
83
|
}
|
|
94
84
|
/** Find the rollout file for a given session ID by walking directories. */
|
|
95
85
|
function walkForSession(sessionsDir, sessionId) {
|
|
96
|
-
const { readdirSync } = require("node:fs");
|
|
97
86
|
for (const dirPath of walkDirs(sessionsDir)) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
87
|
+
try {
|
|
88
|
+
for (const file of readdirSync(dirPath)) {
|
|
89
|
+
if (file.startsWith("rollout-") && file.endsWith(`${sessionId}.jsonl`)) {
|
|
90
|
+
return join(dirPath, file);
|
|
91
|
+
}
|
|
101
92
|
}
|
|
102
93
|
}
|
|
94
|
+
catch {
|
|
95
|
+
// Skip unreadable directories
|
|
96
|
+
}
|
|
103
97
|
}
|
|
104
98
|
return null;
|
|
105
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|