@yu_robotics/remote-cli 1.6.156 → 1.6.165
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/README.md +14 -3
- package/dist/client/MessageHandler.d.ts +4 -5
- package/dist/client/MessageHandler.d.ts.map +1 -1
- package/dist/client/MessageHandler.js +102 -9
- package/dist/client/MessageHandler.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +15 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/session.d.ts +17 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +37 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/delegation/GitCheckpoint.d.ts +1 -0
- package/dist/delegation/GitCheckpoint.d.ts.map +1 -1
- package/dist/delegation/GitCheckpoint.js +15 -4
- package/dist/delegation/GitCheckpoint.js.map +1 -1
- package/dist/executor/IExecutor.d.ts +21 -0
- package/dist/executor/IExecutor.d.ts.map +1 -1
- package/dist/executor/PiExecutor.d.ts +26 -1
- package/dist/executor/PiExecutor.d.ts.map +1 -1
- package/dist/executor/PiExecutor.js +256 -15
- package/dist/executor/PiExecutor.js.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/maintenance/release-notes.json +1 -1
- package/dist/session/SessionCatalog.d.ts +76 -0
- package/dist/session/SessionCatalog.d.ts.map +1 -0
- package/dist/session/SessionCatalog.js +197 -0
- package/dist/session/SessionCatalog.js.map +1 -0
- package/dist/session/SessionControl.d.ts +56 -0
- package/dist/session/SessionControl.d.ts.map +1 -0
- package/dist/session/SessionControl.js +262 -0
- package/dist/session/SessionControl.js.map +1 -0
- package/dist/session/SessionLocalInfo.d.ts +48 -0
- package/dist/session/SessionLocalInfo.d.ts.map +1 -0
- package/dist/session/SessionLocalInfo.js +145 -0
- package/dist/session/SessionLocalInfo.js.map +1 -0
- package/dist/session/SessionMenu.d.ts +102 -0
- package/dist/session/SessionMenu.d.ts.map +1 -0
- package/dist/session/SessionMenu.js +144 -0
- package/dist/session/SessionMenu.js.map +1 -0
- package/dist/session/SessionResumeService.d.ts +38 -0
- package/dist/session/SessionResumeService.d.ts.map +1 -0
- package/dist/session/SessionResumeService.js +147 -0
- package/dist/session/SessionResumeService.js.map +1 -0
- package/dist/session/adapters/ClaudeSessionCatalog.d.ts +10 -0
- package/dist/session/adapters/ClaudeSessionCatalog.d.ts.map +1 -0
- package/dist/session/adapters/ClaudeSessionCatalog.js +156 -0
- package/dist/session/adapters/ClaudeSessionCatalog.js.map +1 -0
- package/dist/session/adapters/CodexSessionCatalog.d.ts +9 -0
- package/dist/session/adapters/CodexSessionCatalog.d.ts.map +1 -0
- package/dist/session/adapters/CodexSessionCatalog.js +214 -0
- package/dist/session/adapters/CodexSessionCatalog.js.map +1 -0
- package/dist/session/adapters/PiSessionCatalog.d.ts +52 -0
- package/dist/session/adapters/PiSessionCatalog.d.ts.map +1 -0
- package/dist/session/adapters/PiSessionCatalog.js +252 -0
- package/dist/session/adapters/PiSessionCatalog.js.map +1 -0
- package/dist/session/adapters/index.d.ts +13 -0
- package/dist/session/adapters/index.d.ts.map +1 -0
- package/dist/session/adapters/index.js +17 -0
- package/dist/session/adapters/index.js.map +1 -0
- package/dist/types/config.d.ts +11 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeSessionCatalog.js","sourceRoot":"","sources":["../../../src/session/adapters/ClaudeSessionCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type SessionCatalog, type SessionCatalogOptions } from '../SessionCatalog';
|
|
2
|
+
/**
|
|
3
|
+
* Read-only discovery of Codex sessions whose recorded workspace equals the
|
|
4
|
+
* thread workspace. It never starts `codex app-server`, reads transcript bodies,
|
|
5
|
+
* migrates files, or writes anything. Counts are left unavailable rather than
|
|
6
|
+
* inferred from a partial record.
|
|
7
|
+
*/
|
|
8
|
+
export declare function listCodexSessions(workingDirectory: string, options?: SessionCatalogOptions): SessionCatalog;
|
|
9
|
+
//# sourceMappingURL=CodexSessionCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexSessionCatalog.d.ts","sourceRoot":"","sources":["../../../src/session/adapters/CodexSessionCatalog.ts"],"names":[],"mappings":"AAGA,OAAO,EAUL,KAAK,cAAc,EAEnB,KAAK,qBAAqB,EAE3B,MAAM,mBAAmB,CAAC;AAsH3B;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAuC/G"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.listCodexSessions = listCodexSessions;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const SessionCatalog_1 = require("../SessionCatalog");
|
|
11
|
+
/**
|
|
12
|
+
* Codex rollout headers carry the full base instructions, so a bounded first-line
|
|
13
|
+
* read needs more than the shared 64 KiB header budget. The cap stays a hard
|
|
14
|
+
* resource bound, and oversized headers become an explicit coverage gap.
|
|
15
|
+
*/
|
|
16
|
+
const CODEX_HEADER_MAX_BYTES = 1024 * 1024;
|
|
17
|
+
/** Native date-partitioned rollout layout: sessions/<year>/<month>/<day>/rollout-*.jsonl */
|
|
18
|
+
const CODEX_SESSION_DEPTH = 3;
|
|
19
|
+
/** Read the first LF-terminated line with a hard byte cap; never follows a symlink. */
|
|
20
|
+
function readFirstLine(file, maxBytes) {
|
|
21
|
+
let fd;
|
|
22
|
+
try {
|
|
23
|
+
const before = fs_1.default.lstatSync(file);
|
|
24
|
+
if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1)
|
|
25
|
+
return undefined;
|
|
26
|
+
fd = fs_1.default.openSync(file, fs_1.default.constants.O_RDONLY | (fs_1.default.constants.O_NOFOLLOW ?? 0));
|
|
27
|
+
const stat = fs_1.default.fstatSync(fd);
|
|
28
|
+
if (stat.ino !== before.ino || stat.dev !== before.dev)
|
|
29
|
+
return undefined;
|
|
30
|
+
const chunks = [];
|
|
31
|
+
let read = 0;
|
|
32
|
+
const buffer = Buffer.alloc(Math.min(64 * 1024, maxBytes));
|
|
33
|
+
while (read < maxBytes) {
|
|
34
|
+
const length = fs_1.default.readSync(fd, buffer, 0, Math.min(buffer.length, maxBytes - read), null);
|
|
35
|
+
if (length <= 0)
|
|
36
|
+
break;
|
|
37
|
+
const slice = buffer.subarray(0, length);
|
|
38
|
+
const newline = slice.indexOf(0x0a);
|
|
39
|
+
if (newline !== -1) {
|
|
40
|
+
chunks.push(slice.subarray(0, newline));
|
|
41
|
+
return { line: Buffer.concat(chunks).toString('utf8'), complete: true };
|
|
42
|
+
}
|
|
43
|
+
chunks.push(Buffer.from(slice));
|
|
44
|
+
read += length;
|
|
45
|
+
}
|
|
46
|
+
return { line: Buffer.concat(chunks).toString('utf8'), complete: false };
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
if (fd !== undefined)
|
|
53
|
+
fs_1.default.closeSync(fd);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function headerOf(file, threadCwd) {
|
|
57
|
+
const first = readFirstLine(file, CODEX_HEADER_MAX_BYTES);
|
|
58
|
+
if (!first || !first.complete)
|
|
59
|
+
return undefined;
|
|
60
|
+
let record;
|
|
61
|
+
try {
|
|
62
|
+
record = JSON.parse(first.line);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
if (record.type !== 'session_meta' || !record.payload || typeof record.payload !== 'object')
|
|
68
|
+
return undefined;
|
|
69
|
+
const payload = record.payload;
|
|
70
|
+
const id = payload.id;
|
|
71
|
+
const cwd = payload.cwd;
|
|
72
|
+
if (typeof id !== 'string' || !id || id.length > SessionCatalog_1.SESSION_CATALOG_MAX_ID
|
|
73
|
+
|| /[\u0000-\u001f\u007f\s`]/.test(id) || SessionCatalog_1.SYNTHETIC_SESSION.test(id))
|
|
74
|
+
return undefined;
|
|
75
|
+
if (typeof cwd !== 'string' || !path_1.default.isAbsolute(cwd) || (0, SessionCatalog_1.canonicalPath)(cwd) !== threadCwd)
|
|
76
|
+
return undefined;
|
|
77
|
+
// Sub-agents and forks belong to another thread's private work, never to the
|
|
78
|
+
// user's local history. Structured `source` plus explicit parent/agent fields
|
|
79
|
+
// identify them independently of any friendly name.
|
|
80
|
+
const subagent = (typeof payload.source === 'object' && payload.source !== null)
|
|
81
|
+
|| typeof payload.parent_thread_id === 'string' || typeof payload.agent_path === 'string';
|
|
82
|
+
let modifiedAt;
|
|
83
|
+
try {
|
|
84
|
+
modifiedAt = fs_1.default.lstatSync(file).mtimeMs;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
if (!Number.isFinite(modifiedAt) || modifiedAt - Date.now() > SessionCatalog_1.SESSION_CATALOG_MAX_MODIFIED_SKEW_MS)
|
|
90
|
+
return undefined;
|
|
91
|
+
return { id, cwd, modifiedAt, subagent };
|
|
92
|
+
}
|
|
93
|
+
/** Bounded read of the native index used only for display names. */
|
|
94
|
+
function nativeNames(home) {
|
|
95
|
+
const names = new Map();
|
|
96
|
+
const file = path_1.default.join(home, 'session_index.jsonl');
|
|
97
|
+
let fd;
|
|
98
|
+
try {
|
|
99
|
+
const stat = fs_1.default.lstatSync(file);
|
|
100
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1 || stat.size === 0
|
|
101
|
+
|| stat.size > SessionCatalog_1.SESSION_CATALOG_MAX_SETTINGS_BYTES)
|
|
102
|
+
return names;
|
|
103
|
+
fd = fs_1.default.openSync(file, fs_1.default.constants.O_RDONLY | (fs_1.default.constants.O_NOFOLLOW ?? 0));
|
|
104
|
+
for (const line of fs_1.default.readFileSync(fd, 'utf8').split('\n')) {
|
|
105
|
+
if (!line)
|
|
106
|
+
continue;
|
|
107
|
+
try {
|
|
108
|
+
const entry = JSON.parse(line);
|
|
109
|
+
if (typeof entry.id !== 'string' || typeof entry.thread_name !== 'string')
|
|
110
|
+
continue;
|
|
111
|
+
const label = (0, SessionCatalog_1.safeSessionLabel)(entry.thread_name);
|
|
112
|
+
if (label && label.length <= SessionCatalog_1.SESSION_CATALOG_MAX_ID)
|
|
113
|
+
names.set(entry.id, label);
|
|
114
|
+
}
|
|
115
|
+
catch { /* one malformed line never hides the rest of the index */ }
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch { /* a missing or unreadable index only removes display names */ }
|
|
119
|
+
finally {
|
|
120
|
+
if (fd !== undefined)
|
|
121
|
+
fs_1.default.closeSync(fd);
|
|
122
|
+
}
|
|
123
|
+
return names;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Native rollout IDs belonging to synthetic delegated workers or temporary
|
|
127
|
+
* metadata executors. Worker-native IDs differ from their executor IDs, so the
|
|
128
|
+
* pointer filename decides the class and the native ID is what gets excluded.
|
|
129
|
+
*/
|
|
130
|
+
function syntheticRolloutIds(remoteDirectory) {
|
|
131
|
+
const excluded = new Set();
|
|
132
|
+
const directory = path_1.default.join(remoteDirectory, 'codex-sessions');
|
|
133
|
+
let names = [];
|
|
134
|
+
try {
|
|
135
|
+
names = fs_1.default.readdirSync(directory);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return excluded;
|
|
139
|
+
}
|
|
140
|
+
for (const name of names) {
|
|
141
|
+
if (!name.endsWith('.json'))
|
|
142
|
+
continue;
|
|
143
|
+
const executorId = name.slice(0, -'.json'.length);
|
|
144
|
+
try {
|
|
145
|
+
const pointer = JSON.parse(fs_1.default.readFileSync(path_1.default.join(directory, name), 'utf8'));
|
|
146
|
+
if (typeof pointer.id !== 'string' || !pointer.id)
|
|
147
|
+
continue;
|
|
148
|
+
// A synthetic pointer always excludes; a foreground pointer also protects
|
|
149
|
+
// the user's own history from the sub-agent heuristic.
|
|
150
|
+
if (SessionCatalog_1.SYNTHETIC_SESSION.test(executorId))
|
|
151
|
+
excluded.add(pointer.id);
|
|
152
|
+
}
|
|
153
|
+
catch { /* malformed pointers never grant visibility */ }
|
|
154
|
+
}
|
|
155
|
+
return excluded;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Read-only discovery of Codex sessions whose recorded workspace equals the
|
|
159
|
+
* thread workspace. It never starts `codex app-server`, reads transcript bodies,
|
|
160
|
+
* migrates files, or writes anything. Counts are left unavailable rather than
|
|
161
|
+
* inferred from a partial record.
|
|
162
|
+
*/
|
|
163
|
+
function listCodexSessions(workingDirectory, options = {}) {
|
|
164
|
+
const home = options.home ?? os_1.default.homedir();
|
|
165
|
+
const env = options.env ?? process.env;
|
|
166
|
+
const remoteDirectory = options.remoteCliDirectory ?? path_1.default.join(home, '.remote-cli');
|
|
167
|
+
const notes = [];
|
|
168
|
+
const threadCwd = (0, SessionCatalog_1.canonicalPath)(workingDirectory);
|
|
169
|
+
if (!threadCwd)
|
|
170
|
+
return { candidates: [], complete: false, notes: ['The thread working directory is unavailable.'] };
|
|
171
|
+
const nativeHome = env.CODEX_HOME ? (0, SessionCatalog_1.expandHomePath)(env.CODEX_HOME, home) : path_1.default.join(home, '.codex');
|
|
172
|
+
if (env.CODEX_HOME && !nativeHome)
|
|
173
|
+
notes.push('A relative Codex home override was ignored.');
|
|
174
|
+
if (!nativeHome) {
|
|
175
|
+
return { candidates: [], complete: false,
|
|
176
|
+
notes: [...notes, 'The native Codex home could not be resolved.'] };
|
|
177
|
+
}
|
|
178
|
+
const excluded = syntheticRolloutIds(remoteDirectory);
|
|
179
|
+
const names = nativeNames(nativeHome);
|
|
180
|
+
const stores = [
|
|
181
|
+
{ directory: path_1.default.join(nativeHome, 'sessions'), source: 'native-local', maxDepth: CODEX_SESSION_DEPTH },
|
|
182
|
+
{ directory: path_1.default.join(nativeHome, 'archived_sessions'), source: 'native-local' },
|
|
183
|
+
];
|
|
184
|
+
const scan = (0, SessionCatalog_1.scanSessionCatalogs)(stores, (file, root, store) => {
|
|
185
|
+
let header;
|
|
186
|
+
try {
|
|
187
|
+
header = headerOf(file, threadCwd);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
header = undefined;
|
|
191
|
+
}
|
|
192
|
+
if (!header || header.subagent || excluded.has(header.id))
|
|
193
|
+
return undefined;
|
|
194
|
+
const real = (0, SessionCatalog_1.canonicalPath)(file);
|
|
195
|
+
if (!real || !(0, SessionCatalog_1.isInside)(root, real))
|
|
196
|
+
return undefined;
|
|
197
|
+
return { id: header.id, name: names.get(header.id), source: store.source,
|
|
198
|
+
modifiedAt: header.modifiedAt, messageCount: 0, countComplete: false };
|
|
199
|
+
}, { onGap: (reason, store) => notes.push(reason === 'truncated'
|
|
200
|
+
? `Some Codex session storage could not be fully scanned (${store.directory.endsWith('archived_sessions') ? 'archived' : 'active'}).`
|
|
201
|
+
: 'The Codex session storage could not be read safely.') });
|
|
202
|
+
if (!fs_1.default.existsSync(nativeHome))
|
|
203
|
+
notes.push('No local Codex installation directory was found.');
|
|
204
|
+
if (scan.duplicates)
|
|
205
|
+
notes.push(`${scan.duplicates} duplicated session ID(s) were hidden.`);
|
|
206
|
+
if (scan.candidates.length === 0 && scan.complete)
|
|
207
|
+
notes.push('No Codex sessions were found for this workspace.');
|
|
208
|
+
if (scan.candidates.length > 0)
|
|
209
|
+
notes.push('Codex message counts are not available without reading native transcripts.');
|
|
210
|
+
if (!scan.complete && !notes.some(note => note.includes('could not be')))
|
|
211
|
+
notes.push('Some Codex session storage could not be fully scanned.');
|
|
212
|
+
return { candidates: scan.candidates, complete: scan.complete, notes };
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=CodexSessionCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexSessionCatalog.js","sourceRoot":"","sources":["../../../src/session/adapters/CodexSessionCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { safeSessionLabel, type SessionCatalog, type SessionCatalogCandidate, type SessionCatalogOptions } from '../SessionCatalog';
|
|
2
|
+
/** Safe, bounded metadata for one native Pi session. Never contains transcript content. */
|
|
3
|
+
export type PiSessionCandidate = SessionCatalogCandidate;
|
|
4
|
+
export type PiSessionCatalog = SessionCatalog;
|
|
5
|
+
export type PiCatalogOptions = SessionCatalogOptions;
|
|
6
|
+
export { safeSessionLabel };
|
|
7
|
+
/** Pi's documented per-project directory encoding under the agent directory. */
|
|
8
|
+
export declare function piProjectDirectoryName(cwd: string): string;
|
|
9
|
+
export interface PiSessionDirectoryResolution {
|
|
10
|
+
directory?: string;
|
|
11
|
+
/** Which locally approved configuration produced the directory; never a path. */
|
|
12
|
+
source: 'env-override' | 'project-setting' | 'global-setting' | 'default';
|
|
13
|
+
/** True when an explicit override exists but cannot be used as a safe local path. */
|
|
14
|
+
unresolved: boolean;
|
|
15
|
+
notes: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Effective Pi session directory, matching Pi's own precedence and path
|
|
19
|
+
* normalization: --session-dir (the launched argv we control, intentionally
|
|
20
|
+
* excluded here), then `PI_CODING_AGENT_SESSION_DIR`, then the native
|
|
21
|
+
* `sessionDir` setting. Pi reads `sessionDir` before project trust is resolved
|
|
22
|
+
* because its session lookup depends on it, so project `.pi/settings.json`
|
|
23
|
+
* overrides the agent-directory file here as well. Unreadable or unsafe files
|
|
24
|
+
* fall through instead of guessing a namespace.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolvePiSessionDirectory(workingDirectory: string, options?: PiCatalogOptions): PiSessionDirectoryResolution;
|
|
27
|
+
/**
|
|
28
|
+
* Local-only locator for a listed Pi session. It never leaves the CLI: chat
|
|
29
|
+
* messages carry only the native ID, and the file is re-resolved before use.
|
|
30
|
+
*/
|
|
31
|
+
export interface PiSessionLocator {
|
|
32
|
+
id: string;
|
|
33
|
+
file: string;
|
|
34
|
+
/** Changes when the file is replaced, appended or touched after listing. */
|
|
35
|
+
revision: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Read-only discovery of Pi sessions whose header workspace equals the thread workspace.
|
|
39
|
+
* It never starts Pi, migrates files, follows symlinks, or returns transcript text.
|
|
40
|
+
*/
|
|
41
|
+
export declare function listPiSessions(workingDirectory: string, options?: PiCatalogOptions, locators?: Map<string, PiSessionLocator>): PiSessionCatalog;
|
|
42
|
+
/**
|
|
43
|
+
* Re-resolve a listed session by native ID with the same read-only rules as
|
|
44
|
+
* the catalog. Hidden duplicates and filtered sessions are never resolvable.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolvePiSessionLocator(workingDirectory: string, id: string, options?: PiCatalogOptions): PiSessionLocator | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Return another remote-cli thread whose Pi pointer references the file, so one
|
|
49
|
+
* native session is never driven by two remote threads at once.
|
|
50
|
+
*/
|
|
51
|
+
export declare function piSessionHolder(file: string, threadId: string, options?: PiCatalogOptions): string | undefined;
|
|
52
|
+
//# sourceMappingURL=PiSessionCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiSessionCatalog.d.ts","sourceRoot":"","sources":["../../../src/session/adapters/PiSessionCatalog.ts"],"names":[],"mappings":"AAGA,OAAO,EASL,gBAAgB,EAEhB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAE3B,MAAM,mBAAmB,CAAC;AAE3B,2FAA2F;AAC3F,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACzD,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAC9C,MAAM,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAkBD,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,MAAM,EAAE,cAAc,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAC1E,qFAAqF;IACrF,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,4BAA4B,CAgChI;AAmBD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,EACrF,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,gBAAgB,CAgC5D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAC1E,OAAO,GAAE,gBAAqB,GAAG,gBAAgB,GAAG,SAAS,CAI9D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,GAAG,SAAS,CAgBlH"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.safeSessionLabel = void 0;
|
|
7
|
+
exports.piProjectDirectoryName = piProjectDirectoryName;
|
|
8
|
+
exports.resolvePiSessionDirectory = resolvePiSessionDirectory;
|
|
9
|
+
exports.listPiSessions = listPiSessions;
|
|
10
|
+
exports.resolvePiSessionLocator = resolvePiSessionLocator;
|
|
11
|
+
exports.piSessionHolder = piSessionHolder;
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const os_1 = __importDefault(require("os"));
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
const SessionCatalog_1 = require("../SessionCatalog");
|
|
16
|
+
Object.defineProperty(exports, "safeSessionLabel", { enumerable: true, get: function () { return SessionCatalog_1.safeSessionLabel; } });
|
|
17
|
+
/** Pi's documented per-project directory encoding under the agent directory. */
|
|
18
|
+
function piProjectDirectoryName(cwd) {
|
|
19
|
+
return `--${path_1.default.resolve(cwd).replace(/^[/\\]/, '').replace(/[/\\:]/g, '-')}--`;
|
|
20
|
+
}
|
|
21
|
+
/** A bounded JSON read for native settings; never follows a symlink and never throws. */
|
|
22
|
+
function readJsonFile(file) {
|
|
23
|
+
let fd;
|
|
24
|
+
try {
|
|
25
|
+
const before = fs_1.default.lstatSync(file);
|
|
26
|
+
if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1 || before.size === 0
|
|
27
|
+
|| before.size > SessionCatalog_1.SESSION_CATALOG_MAX_SETTINGS_BYTES)
|
|
28
|
+
return undefined;
|
|
29
|
+
fd = fs_1.default.openSync(file, fs_1.default.constants.O_RDONLY | (fs_1.default.constants.O_NOFOLLOW ?? 0));
|
|
30
|
+
const stat = fs_1.default.fstatSync(fd);
|
|
31
|
+
if (stat.ino !== before.ino || stat.dev !== before.dev)
|
|
32
|
+
return undefined;
|
|
33
|
+
const value = JSON.parse(fs_1.default.readFileSync(fd, 'utf8'));
|
|
34
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
if (fd !== undefined)
|
|
41
|
+
fs_1.default.closeSync(fd);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Effective Pi session directory, matching Pi's own precedence and path
|
|
46
|
+
* normalization: --session-dir (the launched argv we control, intentionally
|
|
47
|
+
* excluded here), then `PI_CODING_AGENT_SESSION_DIR`, then the native
|
|
48
|
+
* `sessionDir` setting. Pi reads `sessionDir` before project trust is resolved
|
|
49
|
+
* because its session lookup depends on it, so project `.pi/settings.json`
|
|
50
|
+
* overrides the agent-directory file here as well. Unreadable or unsafe files
|
|
51
|
+
* fall through instead of guessing a namespace.
|
|
52
|
+
*/
|
|
53
|
+
function resolvePiSessionDirectory(workingDirectory, options = {}) {
|
|
54
|
+
const home = options.home ?? os_1.default.homedir();
|
|
55
|
+
const env = options.env ?? process.env;
|
|
56
|
+
const notes = [];
|
|
57
|
+
const override = env.PI_CODING_AGENT_SESSION_DIR;
|
|
58
|
+
if (override) {
|
|
59
|
+
const exact = (0, SessionCatalog_1.expandHomePath)(override, home);
|
|
60
|
+
if (exact)
|
|
61
|
+
return { directory: exact, source: 'env-override', unresolved: false, notes };
|
|
62
|
+
notes.push('A relative Pi session directory override was ignored.');
|
|
63
|
+
// Pi would resolve a relative override against its own process cwd, so the
|
|
64
|
+
// real namespace is unknown to us; never fall back to the default store.
|
|
65
|
+
return { source: 'env-override', unresolved: true, notes };
|
|
66
|
+
}
|
|
67
|
+
const agentOverride = env.PI_CODING_AGENT_DIR ? (0, SessionCatalog_1.expandHomePath)(env.PI_CODING_AGENT_DIR, home) : undefined;
|
|
68
|
+
if (env.PI_CODING_AGENT_DIR && !agentOverride)
|
|
69
|
+
notes.push('A relative Pi agent directory override was ignored.');
|
|
70
|
+
const agent = agentOverride ?? path_1.default.join(home, '.pi', 'agent');
|
|
71
|
+
const configured = (settings) => {
|
|
72
|
+
const value = settings?.sessionDir;
|
|
73
|
+
if (value === undefined)
|
|
74
|
+
return undefined;
|
|
75
|
+
if (typeof value !== 'string') {
|
|
76
|
+
notes.push('A non-string Pi sessionDir setting was ignored.');
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const expanded = (0, SessionCatalog_1.expandHomePath)(value, home);
|
|
80
|
+
if (!expanded) {
|
|
81
|
+
notes.push('A relative Pi sessionDir setting was ignored.');
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return expanded;
|
|
85
|
+
};
|
|
86
|
+
const project = configured(readJsonFile(path_1.default.join(workingDirectory, '.pi', 'settings.json')));
|
|
87
|
+
if (project)
|
|
88
|
+
return { directory: project, source: 'project-setting', unresolved: false, notes };
|
|
89
|
+
if (env.PI_CODING_AGENT_DIR && !agentOverride) {
|
|
90
|
+
return { source: 'default', unresolved: true, notes };
|
|
91
|
+
}
|
|
92
|
+
const global = configured(readJsonFile(path_1.default.join(agent, 'settings.json')));
|
|
93
|
+
if (global)
|
|
94
|
+
return { directory: global, source: 'global-setting', unresolved: false, notes };
|
|
95
|
+
return { directory: path_1.default.join(agent, 'sessions', piProjectDirectoryName(workingDirectory)), source: 'default', unresolved: false, notes };
|
|
96
|
+
}
|
|
97
|
+
/** Session files referenced by synthetic worker/metadata pointers stay excluded after reuse. */
|
|
98
|
+
function syntheticFiles(remoteDirectory) {
|
|
99
|
+
const excluded = new Set();
|
|
100
|
+
const pointers = path_1.default.join(remoteDirectory, 'pi-sessions');
|
|
101
|
+
let names = [];
|
|
102
|
+
try {
|
|
103
|
+
names = fs_1.default.readdirSync(pointers);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return excluded;
|
|
107
|
+
}
|
|
108
|
+
for (const name of names) {
|
|
109
|
+
if (!name.endsWith('.json') || !SessionCatalog_1.SYNTHETIC_SESSION.test(name))
|
|
110
|
+
continue;
|
|
111
|
+
try {
|
|
112
|
+
const pointer = JSON.parse(fs_1.default.readFileSync(path_1.default.join(pointers, name), 'utf8'));
|
|
113
|
+
const resolved = typeof pointer.sessionFile === 'string' ? (0, SessionCatalog_1.canonicalPath)(pointer.sessionFile) : undefined;
|
|
114
|
+
if (resolved)
|
|
115
|
+
excluded.add(resolved);
|
|
116
|
+
}
|
|
117
|
+
catch { /* malformed pointers do not grant visibility */ }
|
|
118
|
+
}
|
|
119
|
+
return excluded;
|
|
120
|
+
}
|
|
121
|
+
function candidate(file, root, cwd, source, excluded, locators) {
|
|
122
|
+
const stat = fs_1.default.lstatSync(file);
|
|
123
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.size === 0)
|
|
124
|
+
return undefined;
|
|
125
|
+
const real = (0, SessionCatalog_1.canonicalPath)(file);
|
|
126
|
+
if (!real || !(0, SessionCatalog_1.isInside)(root, real) || excluded.has(real))
|
|
127
|
+
return undefined;
|
|
128
|
+
const text = (0, SessionCatalog_1.readBoundedHead)(real);
|
|
129
|
+
if (text === undefined)
|
|
130
|
+
return undefined;
|
|
131
|
+
const complete = stat.size <= Buffer.byteLength(text);
|
|
132
|
+
const lines = text.split('\n');
|
|
133
|
+
if (!complete)
|
|
134
|
+
lines.pop();
|
|
135
|
+
let header;
|
|
136
|
+
try {
|
|
137
|
+
header = JSON.parse(lines[0]);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
if (header.type !== 'session' || typeof header.id !== 'string' || !header.id || header.id.length > SessionCatalog_1.SESSION_CATALOG_MAX_ID
|
|
143
|
+
|| /[\u0000-\u001f\u007f\s`]/.test(header.id) || SessionCatalog_1.SYNTHETIC_SESSION.test(header.id) || typeof header.cwd !== 'string')
|
|
144
|
+
return undefined;
|
|
145
|
+
// Pi documents `cwd` as absolute (`resolvePath` output), and its own discovery
|
|
146
|
+
// compares resolved paths. Reject relative/normalization tricks instead of
|
|
147
|
+
// silently passing them to realpath.
|
|
148
|
+
if (!path_1.default.isAbsolute(header.cwd) || (0, SessionCatalog_1.canonicalPath)(header.cwd) !== cwd)
|
|
149
|
+
return undefined;
|
|
150
|
+
if (!Number.isFinite(stat.mtimeMs) || stat.mtimeMs - Date.now() > SessionCatalog_1.SESSION_CATALOG_MAX_MODIFIED_SKEW_MS)
|
|
151
|
+
return undefined;
|
|
152
|
+
let name;
|
|
153
|
+
let messages = 0;
|
|
154
|
+
for (const line of lines.slice(1)) {
|
|
155
|
+
if (!line)
|
|
156
|
+
continue;
|
|
157
|
+
try {
|
|
158
|
+
const entry = JSON.parse(line);
|
|
159
|
+
if (entry.type === 'message' && (entry.message?.role === 'user' || entry.message?.role === 'assistant'))
|
|
160
|
+
messages++;
|
|
161
|
+
// Pi writes the latest session name; keep the last valid one in append order.
|
|
162
|
+
if (entry.type === 'session_info' && typeof entry.name === 'string')
|
|
163
|
+
name = (0, SessionCatalog_1.safeSessionLabel)(entry.name);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (name && SessionCatalog_1.SYNTHETIC_SESSION.test(name))
|
|
170
|
+
return undefined;
|
|
171
|
+
locators?.set(`${source}\u0000${header.id}`, { id: header.id, file: real, revision: `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeMs}` });
|
|
172
|
+
return { id: header.id, name, source,
|
|
173
|
+
modifiedAt: stat.mtimeMs, messageCount: messages, countComplete: complete };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Read-only discovery of Pi sessions whose header workspace equals the thread workspace.
|
|
177
|
+
* It never starts Pi, migrates files, follows symlinks, or returns transcript text.
|
|
178
|
+
*/
|
|
179
|
+
function listPiSessions(workingDirectory, options = {}, locators) {
|
|
180
|
+
const home = options.home ?? os_1.default.homedir();
|
|
181
|
+
const env = options.env ?? process.env;
|
|
182
|
+
const remoteDirectory = options.remoteCliDirectory ?? path_1.default.join(home, '.remote-cli');
|
|
183
|
+
const notes = [];
|
|
184
|
+
const cwd = (0, SessionCatalog_1.canonicalPath)(workingDirectory);
|
|
185
|
+
if (!cwd)
|
|
186
|
+
return { candidates: [], complete: false, notes: ['The thread working directory is unavailable.'] };
|
|
187
|
+
const roots = [];
|
|
188
|
+
const resolved = resolvePiSessionDirectory(cwd, { home, env });
|
|
189
|
+
notes.push(...resolved.notes);
|
|
190
|
+
const nativeDefault = path_1.default.join(home, '.pi', 'agent', 'sessions', piProjectDirectoryName(cwd));
|
|
191
|
+
// A configured directory is a different namespace than the cwd-derived
|
|
192
|
+
// default; Pi does not cwd-encode an explicit sessionDir. An unresolvable
|
|
193
|
+
// override means the native namespace is unknown, not the default.
|
|
194
|
+
if (resolved.source === 'project-setting' || resolved.source === 'global-setting') {
|
|
195
|
+
notes.push('Pi session storage is set by a local native sessionDir setting.');
|
|
196
|
+
}
|
|
197
|
+
if (!resolved.unresolved)
|
|
198
|
+
roots.push({ directory: resolved.directory ?? nativeDefault, source: 'native-local' });
|
|
199
|
+
roots.push({ directory: path_1.default.join(remoteDirectory, 'pi-sessions', 'store'), source: 'remote-cli' });
|
|
200
|
+
const excluded = syntheticFiles(remoteDirectory);
|
|
201
|
+
// Coverage gaps are reported per store through the shared scanner so the Pi,
|
|
202
|
+
// Codex and Claude catalogs cannot drift apart on bounds or wording.
|
|
203
|
+
const scan = (0, SessionCatalog_1.scanSessionCatalogs)(roots, (file, root, store) => candidate(file, root, cwd, store.source, excluded, locators), { onGap: (reason, store) => notes.push(reason === 'truncated'
|
|
204
|
+
? `Some Pi session storage could not be fully scanned (${store.source}).`
|
|
205
|
+
: `Pi session storage could not be read safely (${store.source}).`) });
|
|
206
|
+
if (resolved.unresolved) {
|
|
207
|
+
notes.push('The native Pi session namespace could not be resolved.');
|
|
208
|
+
}
|
|
209
|
+
if (scan.duplicates)
|
|
210
|
+
notes.push(`${scan.duplicates} duplicated session ID(s) were hidden.`);
|
|
211
|
+
if (!scan.complete && !notes.some(note => note.includes('could not')))
|
|
212
|
+
notes.push('Some session storage could not be fully scanned.');
|
|
213
|
+
return { candidates: scan.candidates, complete: scan.complete && !resolved.unresolved, notes };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Re-resolve a listed session by native ID with the same read-only rules as
|
|
217
|
+
* the catalog. Hidden duplicates and filtered sessions are never resolvable.
|
|
218
|
+
*/
|
|
219
|
+
function resolvePiSessionLocator(workingDirectory, id, options = {}) {
|
|
220
|
+
const locators = new Map();
|
|
221
|
+
const listed = listPiSessions(workingDirectory, options, locators).candidates.find(item => item.id === id);
|
|
222
|
+
return listed ? locators.get(`${listed.source}\u0000${listed.id}`) : undefined;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Return another remote-cli thread whose Pi pointer references the file, so one
|
|
226
|
+
* native session is never driven by two remote threads at once.
|
|
227
|
+
*/
|
|
228
|
+
function piSessionHolder(file, threadId, options = {}) {
|
|
229
|
+
const home = options.home ?? os_1.default.homedir();
|
|
230
|
+
const directory = path_1.default.join(options.remoteCliDirectory ?? path_1.default.join(home, '.remote-cli'), 'pi-sessions');
|
|
231
|
+
const target = (0, SessionCatalog_1.canonicalPath)(file) ?? file;
|
|
232
|
+
let names;
|
|
233
|
+
try {
|
|
234
|
+
names = fs_1.default.readdirSync(directory);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
for (const name of names) {
|
|
240
|
+
if (!name.endsWith('.json') || name === `${threadId}.json`)
|
|
241
|
+
continue;
|
|
242
|
+
try {
|
|
243
|
+
const pointer = JSON.parse(fs_1.default.readFileSync(path_1.default.join(directory, name), 'utf8'));
|
|
244
|
+
if (typeof pointer.sessionFile === 'string' && ((0, SessionCatalog_1.canonicalPath)(pointer.sessionFile) ?? pointer.sessionFile) === target) {
|
|
245
|
+
return name.slice(0, -'.json'.length);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch { /* unreadable pointers do not hold a session */ }
|
|
249
|
+
}
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=PiSessionCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiSessionCatalog.js","sourceRoot":"","sources":["../../../src/session/adapters/PiSessionCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BackendKey } from '../../types/config';
|
|
2
|
+
import type { SessionCatalog, SessionCatalogOptions } from '../SessionCatalog';
|
|
3
|
+
/**
|
|
4
|
+
* Implemented read-only catalogs, keyed by stable backend key. Adding a backend
|
|
5
|
+
* here is what enables `/resume` discovery for it and what `CATALOG_BACKENDS`
|
|
6
|
+
* reports; connecting to a session stays unavailable until strict native resume
|
|
7
|
+
* is verified separately.
|
|
8
|
+
*/
|
|
9
|
+
export type SessionCatalogReader = (workingDirectory: string, options?: SessionCatalogOptions) => SessionCatalog;
|
|
10
|
+
export declare const SESSION_CATALOG_READERS: Partial<Record<BackendKey, SessionCatalogReader>>;
|
|
11
|
+
/** List one workspace's native sessions for an implemented backend; undefined when unsupported. */
|
|
12
|
+
export declare function readSessionCatalog(backend: BackendKey, workingDirectory: string, options?: SessionCatalogOptions): SessionCatalog | undefined;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAK/E;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,KAAK,cAAc,CAAC;AAEjH,eAAO,MAAM,uBAAuB,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAIrF,CAAC;AAEF,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAC9E,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,GAAG,SAAS,CAE7D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SESSION_CATALOG_READERS = void 0;
|
|
4
|
+
exports.readSessionCatalog = readSessionCatalog;
|
|
5
|
+
const ClaudeSessionCatalog_1 = require("./ClaudeSessionCatalog");
|
|
6
|
+
const CodexSessionCatalog_1 = require("./CodexSessionCatalog");
|
|
7
|
+
const PiSessionCatalog_1 = require("./PiSessionCatalog");
|
|
8
|
+
exports.SESSION_CATALOG_READERS = {
|
|
9
|
+
claude: ClaudeSessionCatalog_1.listClaudeSessions,
|
|
10
|
+
codex: CodexSessionCatalog_1.listCodexSessions,
|
|
11
|
+
pi: PiSessionCatalog_1.listPiSessions,
|
|
12
|
+
};
|
|
13
|
+
/** List one workspace's native sessions for an implemented backend; undefined when unsupported. */
|
|
14
|
+
function readSessionCatalog(backend, workingDirectory, options) {
|
|
15
|
+
return exports.SESSION_CATALOG_READERS[backend]?.(workingDirectory, options);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/adapters/index.ts"],"names":[],"mappings":";;;AAqBA,gDAGC;AAtBD,iEAA4D;AAC5D,+DAA0D;AAC1D,yDAAoD;AAUvC,QAAA,uBAAuB,GAAsD;IACxF,MAAM,EAAE,yCAAkB;IAC1B,KAAK,EAAE,uCAAiB;IACxB,EAAE,EAAE,iCAAc;CACnB,CAAC;AAEF,mGAAmG;AACnG,SAAgB,kBAAkB,CAAC,OAAmB,EAAE,gBAAwB,EAC9E,OAA+B;IAC/B,OAAO,+BAAuB,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC"}
|