pi-x-ide 1.2.0 → 1.4.0

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.
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZED_POLL_INTERVAL_MS = exports.PI_X_IDE_ZED_DB_ENV = void 0;
4
+ exports.isZedTerminal = isZedTerminal;
5
+ exports.isWsl = isWsl;
6
+ exports.normalizeZedPathForHost = normalizeZedPathForHost;
7
+ exports.resolveZedDbPath = resolveZedDbPath;
8
+ exports.parseZedWorkspacePaths = parseZedWorkspacePaths;
9
+ exports.resolveZedSelection = resolveZedSelection;
10
+ exports.stopZedPolling = stopZedPolling;
11
+ exports.startZedPolling = startZedPolling;
12
+ const node_fs_1 = require("node:fs");
13
+ const node_os_1 = require("node:os");
14
+ const node_path_1 = require("node:path");
15
+ const node_sqlite_1 = require("node:sqlite");
16
+ const config_1 = require("../shared/config");
17
+ const format_1 = require("../shared/format");
18
+ const paths_1 = require("../shared/paths");
19
+ const context_1 = require("./context");
20
+ const ui_1 = require("./ui");
21
+ exports.PI_X_IDE_ZED_DB_ENV = "PI_X_IDE_ZED_DB";
22
+ exports.ZED_POLL_INTERVAL_MS = 1000;
23
+ // ── Terminal detection ──────────────────────────────────────────
24
+ function isZedTerminal(env = process.env) {
25
+ const configuredEnv = (0, config_1.resolvePiConfigEnv)(env);
26
+ return configuredEnv.ZED_TERM === "true" || configuredEnv.TERM_PROGRAM?.toLowerCase() === "zed";
27
+ }
28
+ function isWsl(env = process.env) {
29
+ const configuredEnv = (0, config_1.resolvePiConfigEnv)(env);
30
+ if (configuredEnv.WSL_DISTRO_NAME || configuredEnv.WSL_INTEROP)
31
+ return true;
32
+ if (!(0, config_1.isProcessEnvOrPiConfigOverlay)(configuredEnv))
33
+ return false;
34
+ try {
35
+ return /microsoft|wsl/i.test((0, node_fs_1.readFileSync)("/proc/version", "utf8"));
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ function normalizeZedPathForHost(input, env = process.env) {
42
+ const configuredEnv = (0, config_1.resolvePiConfigEnv)(env);
43
+ if (!input || !isWsl(configuredEnv))
44
+ return input;
45
+ const driveMatch = input.match(/^([a-zA-Z]):[\\/](.*)$/);
46
+ if (driveMatch) {
47
+ const drive = driveMatch[1].toLowerCase();
48
+ const rest = driveMatch[2].replaceAll("\\", "/");
49
+ return `/mnt/${drive}/${rest}`;
50
+ }
51
+ const uncMatch = input.match(/^\\\\(?:wsl\$|wsl\.localhost)\\([^\\]+)\\(.*)$/i);
52
+ if (uncMatch) {
53
+ const distro = uncMatch[1];
54
+ const rest = uncMatch[2].replaceAll("\\", "/");
55
+ const currentDistro = configuredEnv.WSL_DISTRO_NAME;
56
+ if (!currentDistro || distro.toLowerCase() === currentDistro.toLowerCase()) {
57
+ return `/${rest}`;
58
+ }
59
+ }
60
+ return input;
61
+ }
62
+ // ── DB path resolution ─────────────────────────────────────────
63
+ function resolveZedDbPath(env = process.env, home = (0, node_os_1.homedir)()) {
64
+ const configuredEnv = (0, config_1.resolvePiConfigEnv)(env);
65
+ const override = configuredEnv[exports.PI_X_IDE_ZED_DB_ENV]?.trim();
66
+ if (override) {
67
+ const normalizedOverride = normalizeZedPathForHost(override, configuredEnv);
68
+ return isFile(normalizedOverride) ? normalizedOverride : undefined;
69
+ }
70
+ const candidates = [
71
+ (0, node_path_1.resolve)(home, ".local", "share", "zed", "db", "0-stable", "db.sqlite"), // Linux
72
+ (0, node_path_1.resolve)(home, "Library", "Application Support", "Zed", "db", "0-stable", "db.sqlite"), // macOS
73
+ (0, node_path_1.resolve)(home, "AppData", "Local", "Zed", "db", "0-stable", "db.sqlite"), // Windows
74
+ ...zedDbCandidatesFromWindowsEnv(configuredEnv),
75
+ ...zedDbCandidatesFromWslMount(configuredEnv),
76
+ ];
77
+ return candidates.find(isFile);
78
+ }
79
+ function zedDbCandidatesFromWindowsEnv(env) {
80
+ const localAppData = env.LOCALAPPDATA?.trim();
81
+ if (localAppData)
82
+ return [(0, node_path_1.resolve)(normalizeZedPathForHost(localAppData, env), "Zed", "db", "0-stable", "db.sqlite")];
83
+ const userProfile = env.USERPROFILE?.trim();
84
+ if (userProfile) {
85
+ return [
86
+ (0, node_path_1.resolve)(normalizeZedPathForHost(userProfile, env), "AppData", "Local", "Zed", "db", "0-stable", "db.sqlite"),
87
+ ];
88
+ }
89
+ return [];
90
+ }
91
+ function zedDbCandidatesFromWslMount(env) {
92
+ if (!isWsl(env))
93
+ return [];
94
+ const usersRoot = "/mnt/c/Users";
95
+ try {
96
+ return (0, node_fs_1.readdirSync)(usersRoot, { withFileTypes: true })
97
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
98
+ .map((entry) => (0, node_path_1.resolve)(usersRoot, entry.name, "AppData", "Local", "Zed", "db", "0-stable", "db.sqlite"));
99
+ }
100
+ catch {
101
+ return [];
102
+ }
103
+ }
104
+ function isFile(path) {
105
+ try {
106
+ return (0, node_fs_1.statSync)(path).isFile();
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ function openZedDatabase(dbPath, env = process.env) {
113
+ const configuredEnv = (0, config_1.resolvePiConfigEnv)(env);
114
+ // Direct open on live WAL-mode databases can succeed at construction time
115
+ // but fail on the first query on WSL/Windows mounts. Always snapshot
116
+ // under WSL to avoid "disk I/O error" during SQL execution.
117
+ if (isWsl(configuredEnv))
118
+ return openZedDatabaseSnapshot(dbPath);
119
+ try {
120
+ return { db: new node_sqlite_1.DatabaseSync(dbPath, { readOnly: true }), cleanup: () => undefined };
121
+ }
122
+ catch {
123
+ // Fall back to snapshot if direct open throws (e.g. file lock on non-WSL).
124
+ return openZedDatabaseSnapshot(dbPath);
125
+ }
126
+ }
127
+ function openZedDatabaseSnapshot(dbPath) {
128
+ let snapshotDir;
129
+ try {
130
+ snapshotDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "pi-x-ide-zed-db-"));
131
+ const cleanupDir = snapshotDir;
132
+ const snapshotPath = (0, node_path_1.join)(cleanupDir, "db.sqlite");
133
+ // Copy the main DB file plus any WAL/SHM sidecars.
134
+ (0, node_fs_1.copyFileSync)(dbPath, snapshotPath);
135
+ for (const suffix of ["-wal", "-shm"]) {
136
+ const sidecarPath = `${dbPath}${suffix}`;
137
+ if (isFile(sidecarPath))
138
+ (0, node_fs_1.copyFileSync)(sidecarPath, `${snapshotPath}${suffix}`);
139
+ }
140
+ // Merge WAL changes into the main database file so we can open
141
+ // read-only afterwards without hitting a disk I/O error on
142
+ // cross-filesystem mounts (WSL / Windows).
143
+ try {
144
+ const dbRW = new node_sqlite_1.DatabaseSync(snapshotPath);
145
+ dbRW.exec("PRAGMA wal_checkpoint(TRUNCATE)");
146
+ dbRW.close();
147
+ }
148
+ catch {
149
+ // Checkpoint may fail—continue with the stale main DB.
150
+ }
151
+ return {
152
+ db: new node_sqlite_1.DatabaseSync(snapshotPath, { readOnly: true }),
153
+ cleanup: () => (0, node_fs_1.rmSync)(cleanupDir, { recursive: true, force: true }),
154
+ };
155
+ }
156
+ catch {
157
+ if (snapshotDir)
158
+ (0, node_fs_1.rmSync)(snapshotDir, { recursive: true, force: true });
159
+ return undefined;
160
+ }
161
+ }
162
+ // ── Workspace path parsing ─────────────────────────────────────
163
+ function parseZedWorkspacePaths(value) {
164
+ if (!value)
165
+ return [];
166
+ const trimmed = value.trim();
167
+ if (!trimmed)
168
+ return [];
169
+ // Try JSON array. If it looks like JSON but is malformed, treat it as invalid
170
+ // instead of accidentally interpreting the raw JSON-ish text as a path.
171
+ if (trimmed.startsWith("[") || trimmed.startsWith("{")) {
172
+ try {
173
+ const parsed = JSON.parse(trimmed);
174
+ return Array.isArray(parsed)
175
+ ? parsed.filter((item) => typeof item === "string" && item.length > 0)
176
+ : [];
177
+ }
178
+ catch {
179
+ return [];
180
+ }
181
+ }
182
+ return trimmed
183
+ .split(/\r?\n/)
184
+ .map((line) => line.trim())
185
+ .filter((line) => line.length > 0);
186
+ }
187
+ // ── UTF-8 byte-offset conversion ──────────────────────────────
188
+ function utf8ByteOffsetToStringIndex(text, byteOffset) {
189
+ if (byteOffset <= 0)
190
+ return 0;
191
+ const encoder = new TextEncoder();
192
+ let bytes = 0;
193
+ for (let index = 0; index < text.length;) {
194
+ const codePoint = text.codePointAt(index);
195
+ if (codePoint === undefined)
196
+ return text.length;
197
+ const nextIndex = index + (codePoint > 0xffff ? 2 : 1);
198
+ bytes += encoder.encode(text.slice(index, nextIndex)).length;
199
+ if (bytes >= byteOffset)
200
+ return nextIndex;
201
+ index = nextIndex;
202
+ }
203
+ return text.length;
204
+ }
205
+ function byteOffsetToSelection(text, startByte, endByte) {
206
+ const startIndex = utf8ByteOffsetToStringIndex(text, startByte);
207
+ const endIndex = utf8ByteOffsetToStringIndex(text, endByte);
208
+ const lines = text.split("\n");
209
+ let startLine = 0;
210
+ let startChar = 0;
211
+ let remaining = startIndex;
212
+ for (let lineIdx = 0; lineIdx < lines.length && remaining >= 0; lineIdx += 1) {
213
+ const lineLen = lines[lineIdx].length + 1; // +1 for the \n
214
+ if (remaining <= lines[lineIdx].length) {
215
+ startLine = lineIdx;
216
+ startChar = remaining;
217
+ break;
218
+ }
219
+ remaining -= lineLen;
220
+ }
221
+ let endLine = 0;
222
+ let endChar = 0;
223
+ remaining = endIndex;
224
+ for (let lineIdx = 0; lineIdx < lines.length && remaining >= 0; lineIdx += 1) {
225
+ const lineLen = lines[lineIdx].length + 1;
226
+ if (remaining <= lines[lineIdx].length) {
227
+ endLine = lineIdx;
228
+ endChar = remaining;
229
+ break;
230
+ }
231
+ remaining -= lineLen;
232
+ }
233
+ return {
234
+ start: { line: startLine, character: startChar },
235
+ end: { line: endLine, character: endChar },
236
+ };
237
+ }
238
+ // ── SQLite query ───────────────────────────────────────────────
239
+ function scoreWorkspace(workspacePaths, cwd, env) {
240
+ const normalizedCwd = normalizeZedPathForHost(cwd, env);
241
+ return parseZedWorkspacePaths(workspacePaths).reduce((best, workspacePath) => {
242
+ const normalizedWorkspacePath = normalizeZedPathForHost(workspacePath, env);
243
+ if ((0, paths_1.isPathInsideOrEqual)(normalizedWorkspacePath, normalizedCwd)) {
244
+ const resolved = (0, node_path_1.resolve)(normalizedWorkspacePath);
245
+ return Math.max(best, resolved.length);
246
+ }
247
+ return best;
248
+ }, 0);
249
+ }
250
+ function resolveZedSelection(options) {
251
+ const { dbPath, cwd, readFile = (path) => (0, node_fs_1.readFileSync)(path, "utf8"), env: inputEnv = process.env } = options;
252
+ const env = (0, config_1.resolvePiConfigEnv)(inputEnv);
253
+ const dbHandle = openZedDatabase(dbPath, env);
254
+ if (!dbHandle)
255
+ return undefined;
256
+ const { db, cleanup } = dbHandle;
257
+ try {
258
+ const rows = db
259
+ .prepare(`SELECT i.kind AS item_kind,
260
+ e.item_id AS editor_id,
261
+ i.workspace_id,
262
+ w.paths AS workspace_paths,
263
+ w.timestamp,
264
+ e.buffer_path
265
+ FROM items i
266
+ JOIN panes p ON p.pane_id = i.pane_id AND p.workspace_id = i.workspace_id
267
+ JOIN workspaces w ON w.workspace_id = i.workspace_id
268
+ LEFT JOIN editors e ON e.item_id = i.item_id AND e.workspace_id = i.workspace_id
269
+ WHERE i.active = 1 AND p.active = 1
270
+ ORDER BY w.timestamp DESC`)
271
+ .all();
272
+ // Filter to Editor rows only, score by workspace match.
273
+ // editor_id may be string or number — Zed uses INTEGER primary keys,
274
+ // node:sqlite returns them as JS numbers.
275
+ const scored = rows
276
+ .filter((row) => row.item_kind === "Editor" && row.editor_id != null && typeof row.buffer_path === "string")
277
+ .map((row) => ({
278
+ ...row,
279
+ score: scoreWorkspace(row.workspace_paths, cwd, env),
280
+ }))
281
+ .filter((row) => row.score > 0);
282
+ if (scored.length === 0)
283
+ return undefined;
284
+ // Pick best: highest score, then latest timestamp
285
+ scored.sort((a, b) => b.score - a.score || b.timestamp - a.timestamp);
286
+ const best = scored[0];
287
+ if (!best)
288
+ return undefined;
289
+ const { editor_id, workspace_id, buffer_path, workspace_paths } = best;
290
+ const normalizedBufferPath = normalizeZedPathForHost(buffer_path, env);
291
+ // Determine workspace folder from matching path
292
+ const workspaceFolder = bestWorkspaceFolder(workspace_paths, cwd, env);
293
+ // Query editor contents
294
+ let contents;
295
+ const contentRow = db
296
+ .prepare("SELECT contents FROM editors WHERE item_id = ? AND workspace_id = ?")
297
+ .get(editor_id, workspace_id);
298
+ if (contentRow && typeof contentRow.contents === "string") {
299
+ contents = contentRow.contents;
300
+ }
301
+ else {
302
+ // Fall back to reading the file on disk.
303
+ try {
304
+ contents = readFile(normalizedBufferPath);
305
+ }
306
+ catch {
307
+ return undefined;
308
+ }
309
+ }
310
+ if (contents === undefined)
311
+ return undefined;
312
+ // Query selections
313
+ const selectionRows = db
314
+ .prepare("SELECT start AS selection_start, end AS selection_end FROM editor_selections WHERE editor_id = ? AND workspace_id = ?")
315
+ .all(editor_id, workspace_id);
316
+ const ranges = [];
317
+ for (const sel of selectionRows) {
318
+ const rawStart = sel.selection_start;
319
+ const rawEnd = sel.selection_end;
320
+ // Normalize reversed ranges
321
+ const start = Math.min(rawStart, rawEnd);
322
+ const end = Math.max(rawStart, rawEnd);
323
+ // Skip empty caret positions
324
+ if (start >= end)
325
+ continue;
326
+ const text = contents.slice(utf8ByteOffsetToStringIndex(contents, start), utf8ByteOffsetToStringIndex(contents, end));
327
+ if (!text)
328
+ continue;
329
+ const selection = byteOffsetToSelection(contents, start, end);
330
+ ranges.push({ text, selection });
331
+ }
332
+ return {
333
+ source: "zed",
334
+ filePath: normalizedBufferPath,
335
+ workspaceFolder,
336
+ ranges,
337
+ receivedAt: options.now ?? Date.now(),
338
+ };
339
+ }
340
+ catch {
341
+ return undefined;
342
+ }
343
+ finally {
344
+ try {
345
+ db.close();
346
+ }
347
+ finally {
348
+ cleanup();
349
+ }
350
+ }
351
+ }
352
+ function bestWorkspaceFolder(workspacePaths, cwd, env) {
353
+ const paths = parseZedWorkspacePaths(workspacePaths).map((workspacePath) => normalizeZedPathForHost(workspacePath, env));
354
+ const normalizedCwd = normalizeZedPathForHost(cwd, env);
355
+ const matches = paths.filter((workspacePath) => (0, paths_1.isPathInsideOrEqual)(workspacePath, normalizedCwd));
356
+ if (matches.length === 0)
357
+ return paths[0];
358
+ return matches.sort((a, b) => (0, node_path_1.resolve)(b).length - (0, node_path_1.resolve)(a).length)[0];
359
+ }
360
+ // ── Polling lifecycle ─────────────────────────────────────────
361
+ function stopZedPolling(runtime) {
362
+ if (runtime.zedPollTimer) {
363
+ clearTimeout(runtime.zedPollTimer);
364
+ runtime.zedPollTimer = undefined;
365
+ }
366
+ runtime.zedPollSelectionKey = undefined;
367
+ runtime.zedPollWalMtimeMs = undefined;
368
+ }
369
+ function startZedPolling(runtime, ctx, options) {
370
+ const env = (0, config_1.resolvePiConfigEnv)(options?.env ?? process.env);
371
+ if (!isZedTerminal(env))
372
+ return false;
373
+ const dbPath = options?.dbPath ?? resolveZedDbPath(env);
374
+ if (!dbPath)
375
+ return false;
376
+ const intervalMs = options?.intervalMs ?? exports.ZED_POLL_INTERVAL_MS;
377
+ const generation = options?.generation;
378
+ // Set connection status and clear any stale WebSocket candidate state.
379
+ runtime.connection?.disconnect();
380
+ runtime.connection = undefined;
381
+ runtime.currentCandidate = undefined;
382
+ runtime.connectionStatus = "connected";
383
+ runtime.connectedServer = { name: "Zed", ide: "zed" };
384
+ runtime.connectionMessage = undefined;
385
+ (0, ui_1.updateIdeUi)(runtime, ctx);
386
+ const schedule = () => {
387
+ if (runtime.zedPollTimer)
388
+ return; // already stopped
389
+ runtime.zedPollTimer = setTimeout(() => {
390
+ runtime.zedPollTimer = undefined;
391
+ // Guard: session generation changed
392
+ if (generation !== undefined && runtime.sessionGeneration !== generation)
393
+ return;
394
+ // Guard: WebSocket has taken over
395
+ if (runtime.connection && runtime.connection !== undefined) {
396
+ // connection is an IdeConnection — if WebSocket took over, stop
397
+ if (runtime.connectedServer?.ide !== "zed")
398
+ return;
399
+ }
400
+ // Check whether the WAL sidecar has changed since the last poll.
401
+ // On WSL the DB snapshot is expensive (~10 MB copy + checkpoint),
402
+ // so skip the work when nothing changed in the editor.
403
+ const walPath = `${dbPath}-wal`;
404
+ let walMtimeMs;
405
+ try {
406
+ walMtimeMs = (0, node_fs_1.statSync)(walPath).mtimeMs;
407
+ }
408
+ catch {
409
+ // WAL absent — always poll (Zed may be in a different journal mode).
410
+ }
411
+ if (walMtimeMs !== undefined &&
412
+ runtime.zedPollWalMtimeMs !== undefined &&
413
+ walMtimeMs === runtime.zedPollWalMtimeMs) {
414
+ schedule();
415
+ return;
416
+ }
417
+ runtime.zedPollWalMtimeMs = walMtimeMs;
418
+ let snapshot;
419
+ try {
420
+ snapshot = resolveZedSelection({ dbPath, cwd: ctx.cwd, env });
421
+ }
422
+ catch {
423
+ snapshot = undefined;
424
+ }
425
+ if (snapshot) {
426
+ const key = (0, format_1.snapshotKey)(snapshot);
427
+ if (key !== runtime.zedPollSelectionKey) {
428
+ runtime.zedPollSelectionKey = key;
429
+ (0, context_1.setLatestSelection)(runtime, snapshot, ctx);
430
+ }
431
+ }
432
+ else {
433
+ (0, context_1.clearLatestSelection)(runtime, ctx);
434
+ }
435
+ schedule();
436
+ }, intervalMs);
437
+ };
438
+ schedule();
439
+ return true;
440
+ }
441
+ //# sourceMappingURL=zed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zed.js","sourceRoot":"","sources":["../../../src/pi/zed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ export type ConfigEnvValueType = "string" | "number" | "boolean";
2
+ export interface ConfigEnvOption {
3
+ readonly type: readonly ConfigEnvValueType[];
4
+ readonly description: string;
5
+ readonly default?: string;
6
+ }
7
+ export interface ConfigEnvPatternOption extends ConfigEnvOption {
8
+ readonly pattern: string;
9
+ }
10
+ export declare const CONFIG_ENV_VALUE_TYPES: readonly ["string", "number", "boolean"];
11
+ export declare function isConfigEnvValue(value: unknown): value is string | number | boolean;
12
+ export declare const CONFIG_ENV_OPTIONS: {
13
+ readonly PI_X_IDE_LOCK_DIR: {
14
+ readonly type: readonly ["string"];
15
+ readonly default: "~/.pi/pi-x-ide/lock";
16
+ readonly description: "Directory containing Pi x IDE lock files. Defaults to ~/.pi/pi-x-ide/lock.";
17
+ };
18
+ readonly PI_X_IDE_AUTO_INSTALL: {
19
+ readonly type: readonly ["string", "number", "boolean"];
20
+ readonly default: "enabled";
21
+ readonly description: "Controls VS Code-family extension auto-install. Values 0, false, and off disable it.";
22
+ };
23
+ readonly PI_X_IDE_ZED_DB: {
24
+ readonly type: readonly ["string"];
25
+ readonly description: "Override path to Zed's SQLite database.";
26
+ };
27
+ readonly TERM_PROGRAM: {
28
+ readonly type: readonly ["string"];
29
+ readonly description: "Terminal program marker used to detect VS Code, Cursor, Windsurf, or Zed.";
30
+ };
31
+ readonly VSCODE_CWD: {
32
+ readonly type: readonly ["string"];
33
+ readonly description: "VS Code-family cwd marker and IDE path hint.";
34
+ };
35
+ readonly VSCODE_PID: {
36
+ readonly type: readonly ["string", "number"];
37
+ readonly description: "VS Code-family process marker.";
38
+ };
39
+ readonly VSCODE_IPC_HOOK_CLI: {
40
+ readonly type: readonly ["string"];
41
+ readonly description: "VS Code-family IPC marker and IDE path hint.";
42
+ };
43
+ readonly VSCODE_GIT_IPC_HANDLE: {
44
+ readonly type: readonly ["string"];
45
+ readonly description: "VS Code-family Git IPC marker and IDE path hint.";
46
+ };
47
+ readonly ZED_TERM: {
48
+ readonly type: readonly ["string", "boolean"];
49
+ readonly description: "Zed terminal marker. Pi x IDE detects Zed when this is true.";
50
+ };
51
+ readonly WSL_DISTRO_NAME: {
52
+ readonly type: readonly ["string"];
53
+ readonly description: "WSL distribution name used for WSL path normalization and Zed database discovery.";
54
+ };
55
+ readonly WSL_INTEROP: {
56
+ readonly type: readonly ["string"];
57
+ readonly description: "WSL interop marker used for WSL path normalization and Zed database discovery.";
58
+ };
59
+ readonly LOCALAPPDATA: {
60
+ readonly type: readonly ["string"];
61
+ readonly description: "Windows local application data directory used to find Zed's database.";
62
+ };
63
+ readonly USERPROFILE: {
64
+ readonly type: readonly ["string"];
65
+ readonly description: "Windows user profile directory used to find Zed's database when LOCALAPPDATA is unavailable.";
66
+ };
67
+ readonly PATH: {
68
+ readonly type: readonly ["string"];
69
+ readonly description: "Executable search path used to find code, cursor, and windsurf CLIs.";
70
+ };
71
+ readonly Path: {
72
+ readonly type: readonly ["string"];
73
+ readonly description: "Windows-style executable search path used to find code, cursor, and windsurf CLIs.";
74
+ };
75
+ readonly path: {
76
+ readonly type: readonly ["string"];
77
+ readonly description: "Lowercase executable search path used to find code, cursor, and windsurf CLIs.";
78
+ };
79
+ readonly PATHEXT: {
80
+ readonly type: readonly ["string"];
81
+ readonly description: "Windows executable extensions used when searching for IDE CLIs.";
82
+ };
83
+ };
84
+ export declare const CONFIG_ENV_PATTERN_OPTIONS: readonly [{
85
+ readonly pattern: "^(CURSOR|WINDSURF|CODEIUM).*";
86
+ readonly type: readonly ["string", "number", "boolean"];
87
+ readonly description: "IDE-specific marker used to detect Cursor or Windsurf terminals.";
88
+ }];
89
+ export type ConfigEnvOptionName = keyof typeof CONFIG_ENV_OPTIONS;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_ENV_PATTERN_OPTIONS = exports.CONFIG_ENV_OPTIONS = exports.CONFIG_ENV_VALUE_TYPES = void 0;
4
+ exports.isConfigEnvValue = isConfigEnvValue;
5
+ exports.CONFIG_ENV_VALUE_TYPES = ["string", "number", "boolean"];
6
+ function isConfigEnvValue(value) {
7
+ return exports.CONFIG_ENV_VALUE_TYPES.some((type) => typeof value === type);
8
+ }
9
+ exports.CONFIG_ENV_OPTIONS = {
10
+ PI_X_IDE_LOCK_DIR: {
11
+ type: ["string"],
12
+ default: "~/.pi/pi-x-ide/lock",
13
+ description: "Directory containing Pi x IDE lock files. Defaults to ~/.pi/pi-x-ide/lock.",
14
+ },
15
+ PI_X_IDE_AUTO_INSTALL: {
16
+ type: ["string", "number", "boolean"],
17
+ default: "enabled",
18
+ description: "Controls VS Code-family extension auto-install. Values 0, false, and off disable it.",
19
+ },
20
+ PI_X_IDE_ZED_DB: {
21
+ type: ["string"],
22
+ description: "Override path to Zed's SQLite database.",
23
+ },
24
+ TERM_PROGRAM: {
25
+ type: ["string"],
26
+ description: "Terminal program marker used to detect VS Code, Cursor, Windsurf, or Zed.",
27
+ },
28
+ VSCODE_CWD: {
29
+ type: ["string"],
30
+ description: "VS Code-family cwd marker and IDE path hint.",
31
+ },
32
+ VSCODE_PID: {
33
+ type: ["string", "number"],
34
+ description: "VS Code-family process marker.",
35
+ },
36
+ VSCODE_IPC_HOOK_CLI: {
37
+ type: ["string"],
38
+ description: "VS Code-family IPC marker and IDE path hint.",
39
+ },
40
+ VSCODE_GIT_IPC_HANDLE: {
41
+ type: ["string"],
42
+ description: "VS Code-family Git IPC marker and IDE path hint.",
43
+ },
44
+ ZED_TERM: {
45
+ type: ["string", "boolean"],
46
+ description: "Zed terminal marker. Pi x IDE detects Zed when this is true.",
47
+ },
48
+ WSL_DISTRO_NAME: {
49
+ type: ["string"],
50
+ description: "WSL distribution name used for WSL path normalization and Zed database discovery.",
51
+ },
52
+ WSL_INTEROP: {
53
+ type: ["string"],
54
+ description: "WSL interop marker used for WSL path normalization and Zed database discovery.",
55
+ },
56
+ LOCALAPPDATA: {
57
+ type: ["string"],
58
+ description: "Windows local application data directory used to find Zed's database.",
59
+ },
60
+ USERPROFILE: {
61
+ type: ["string"],
62
+ description: "Windows user profile directory used to find Zed's database when LOCALAPPDATA is unavailable.",
63
+ },
64
+ PATH: {
65
+ type: ["string"],
66
+ description: "Executable search path used to find code, cursor, and windsurf CLIs.",
67
+ },
68
+ Path: {
69
+ type: ["string"],
70
+ description: "Windows-style executable search path used to find code, cursor, and windsurf CLIs.",
71
+ },
72
+ path: {
73
+ type: ["string"],
74
+ description: "Lowercase executable search path used to find code, cursor, and windsurf CLIs.",
75
+ },
76
+ PATHEXT: {
77
+ type: ["string"],
78
+ description: "Windows executable extensions used when searching for IDE CLIs.",
79
+ },
80
+ };
81
+ exports.CONFIG_ENV_PATTERN_OPTIONS = [
82
+ {
83
+ pattern: "^(CURSOR|WINDSURF|CODEIUM).*",
84
+ type: ["string", "number", "boolean"],
85
+ description: "IDE-specific marker used to detect Cursor or Windsurf terminals.",
86
+ },
87
+ ];
88
+ //# sourceMappingURL=config-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-options.js","sourceRoot":"","sources":["../../../src/shared/config-options.ts"],"names":[],"mappings":";;;AAcA,4CAEC;AAJY,QAAA,sBAAsB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAkD,CAAC;AAEvH,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,OAAO,8BAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AACtE,CAAC;AAEY,QAAA,kBAAkB,GAAG;IAChC,iBAAiB,EAAE;QACjB,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,4EAA4E;KAC1F;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;QACrC,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,sFAAsF;KACpG;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,yCAAyC;KACvD;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,2EAA2E;KACzF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,8CAA8C;KAC5D;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,WAAW,EAAE,gCAAgC;KAC9C;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,8CAA8C;KAC5D;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,kDAAkD;KAChE;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;QAC3B,WAAW,EAAE,8DAA8D;KAC5E;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,mFAAmF;KACjG;IACD,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,gFAAgF;KAC9F;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,uEAAuE;KACrF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,8FAA8F;KAC5G;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,sEAAsE;KACpF;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,oFAAoF;KAClG;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,gFAAgF;KAC9F;IACD,OAAO,EAAE;QACP,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,WAAW,EAAE,iEAAiE;KAC/E;CACiD,CAAC;AAExC,QAAA,0BAA0B,GAAG;IACxC;QACE,OAAO,EAAE,8BAA8B;QACvC,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;QACrC,WAAW,EAAE,kEAAkE;KAChF;CACmD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const PI_CONFIG_FILE = "config.json";
2
+ export declare function resolvePiConfigPath(home?: string): string;
3
+ export declare function readPiConfigEnv(configPath?: string): NodeJS.ProcessEnv;
4
+ export declare function resolvePiConfigEnv(env?: NodeJS.ProcessEnv, options?: {
5
+ configPath?: string;
6
+ }): NodeJS.ProcessEnv;
7
+ export declare function isProcessEnvOrPiConfigOverlay(env: NodeJS.ProcessEnv): boolean;