0sec-cli 0.22.1 → 0.22.4

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.
Files changed (107) hide show
  1. package/0.js +56 -45
  2. package/README.md +12 -0
  3. package/chunks/{adapt-loop-J6QCZZTB.js → adapt-loop-3CCOWE43.js} +4 -4
  4. package/chunks/{artifact-scraper-MFKT6OI4.js → artifact-scraper-Z4UUIOH3.js} +2 -2
  5. package/chunks/{assumption-mining-646LYSJY.js → assumption-mining-2UAKQB6V.js} +18 -14
  6. package/chunks/{chunk-OHHCGDJ2.js → chunk-2WWAPKAW.js} +126 -1089
  7. package/chunks/{chunk-XDKB2P5X.js → chunk-3BPX75OR.js} +1 -1
  8. package/chunks/chunk-4ZYYX5GY.js +74 -0
  9. package/chunks/{chunk-3E2KALZ5.js → chunk-5JNTMWPK.js} +2 -2
  10. package/chunks/{chunk-CPWA6RWE.js → chunk-5WAJGLCW.js} +3 -3
  11. package/chunks/{chunk-KAU6NLGP.js → chunk-6KFB6AYN.js} +515 -20
  12. package/chunks/{chunk-XA2O4WXA.js → chunk-6WQDXWQC.js} +169 -15
  13. package/chunks/chunk-6YZE552K.js +5603 -0
  14. package/chunks/chunk-BGX53365.js +309 -0
  15. package/chunks/{chunk-X7LAEEUW.js → chunk-C6JPA32H.js} +1 -1
  16. package/chunks/chunk-CF3MNS3O.js +990 -0
  17. package/chunks/{chunk-4VGLO2YS.js → chunk-CPCHLL6A.js} +5 -2
  18. package/chunks/{chunk-ZKQ2I3S2.js → chunk-DPUXXMJW.js} +1 -1
  19. package/chunks/{chunk-XCISCI4T.js → chunk-E3OOBVOK.js} +30 -12
  20. package/chunks/{chunk-4G7OVYJX.js → chunk-E74LXQFY.js} +1 -1
  21. package/chunks/{chunk-OSBPGWTE.js → chunk-ELI3BVIK.js} +3 -3
  22. package/chunks/chunk-FFHRANYC.js +547 -0
  23. package/chunks/{chunk-WSDDGFA6.js → chunk-G2BE2FC7.js} +1 -1
  24. package/chunks/chunk-GQ3DGHWE.js +1659 -0
  25. package/chunks/{chunk-V36HVTUL.js → chunk-GVY3S5E5.js} +21 -18
  26. package/chunks/{chunk-5BTJMINS.js → chunk-H4DH7COV.js} +192 -40
  27. package/chunks/{chunk-HHPWRY2M.js → chunk-H6Q2QAIY.js} +23475 -22747
  28. package/chunks/{chunk-7XCKYNLO.js → chunk-IHPTOTLL.js} +1 -1
  29. package/chunks/chunk-IXAHQICR.js +31 -0
  30. package/chunks/{chunk-TH2LW437.js → chunk-KCA35IL3.js} +2 -190
  31. package/chunks/{chunk-VWITLWXB.js → chunk-L2CCO4KE.js} +282 -34
  32. package/chunks/{chunk-6YNKRUMC.js → chunk-NJLKFC66.js} +321 -5
  33. package/chunks/{chunk-W6UWZFKL.js → chunk-O6KPVYOI.js} +100 -5
  34. package/chunks/{chunk-LGCASF2C.js → chunk-OAS5SAVZ.js} +6767 -2100
  35. package/chunks/chunk-PS5E7LUQ.js +277 -0
  36. package/chunks/{chunk-AV2LG2L7.js → chunk-QVIRWJ45.js} +257 -145
  37. package/chunks/{chunk-TV27OWIW.js → chunk-QWK4R3DB.js} +9 -9
  38. package/chunks/{chunk-WZRVS7SB.js → chunk-RCRTSKQN.js} +1 -1
  39. package/chunks/chunk-RS4MAN3Q.js +73 -0
  40. package/chunks/{chunk-V6GHX34G.js → chunk-RTBZ36BD.js} +8 -274
  41. package/chunks/{chunk-YL6YAGLL.js → chunk-SCWWLABR.js} +1 -1
  42. package/chunks/chunk-VDOWARMJ.js +63 -0
  43. package/chunks/{chunk-IFME676H.js → chunk-WBRGXCU2.js} +79 -18
  44. package/chunks/{chunk-IVQV574Y.js → chunk-WHUAUFSX.js} +1 -1
  45. package/chunks/{chunk-GOEA3NW6.js → chunk-XODDLNBI.js} +1534 -1305
  46. package/chunks/chunk-YAZARMJY.js +355 -0
  47. package/chunks/{chunk-NLH4LMWH.js → chunk-YED25PA4.js} +1 -1
  48. package/chunks/{codex-models-NHQW45SO.js → codex-models-Z43V3427.js} +9 -3
  49. package/chunks/{commands-N6GN5SBF.js → commands-EUGF4FUZ.js} +5842 -4093
  50. package/chunks/{db-5IWEJUYV.js → db-NVAW4WWR.js} +3 -3
  51. package/chunks/{dist-L3XJWWZ6.js → dist-27BNG6WD.js} +193 -112
  52. package/chunks/{dist-FSS7MBDF.js → dist-7RUOKPRJ.js} +12 -2
  53. package/chunks/{dist-KEULE5IQ.js → dist-LNXGATR2.js} +2 -2
  54. package/chunks/{dist-XZB53PS5.js → dist-M2X367VW.js} +2 -2
  55. package/chunks/{dist-BS4CY4RG.js → dist-NG2HT5XU.js} +27 -1
  56. package/chunks/{eval-runner-EMEGF24P.js → eval-runner-6Q3H52SP.js} +13 -9
  57. package/chunks/{exploit-agent-KW4EB7BE.js → exploit-agent-FCCR2HYX.js} +1 -1
  58. package/chunks/{exploit-autoclimb-CXJ2ERRO.js → exploit-autoclimb-X5ZS5FAO.js} +1 -1
  59. package/chunks/{exploit-climb-TJWLY4XC.js → exploit-climb-3JHGEO36.js} +2 -2
  60. package/chunks/{fix-UUKPXCFB.js → fix-NSNPU33B.js} +12 -6
  61. package/chunks/{harness-C5HOKIEV.js → harness-KXQOVIDQ.js} +3 -3
  62. package/chunks/{hunt-scan-KZZ444V2.js → hunt-scan-ELTKGKC4.js} +16 -12
  63. package/chunks/{kernel-primitive-Z77IR7YS.js → kernel-primitive-MT7YZSIG.js} +2 -2
  64. package/chunks/{kernel-vm-runner-JW77P276.js → kernel-vm-runner-YFRHYC6G.js} +2 -2
  65. package/chunks/{native-loop-P6P5GYVJ.js → native-loop-OFJDRHPI.js} +18 -8
  66. package/chunks/orchestrate-DRZ2SVCP.js +62 -0
  67. package/chunks/{prepare-KYHGFWCJ.js → prepare-72GWTRVI.js} +6 -2
  68. package/chunks/{process-N245QIQG.js → process-MJYJ2K5E.js} +2 -1
  69. package/chunks/{run-GAFKBCTN.js → run-WTJCZZHV.js} +1901 -4816
  70. package/chunks/{runtime-H7YBR5IZ.js → runtime-FCKOUB7V.js} +10 -4
  71. package/chunks/{runtime-XFWJTBUO.js → runtime-LCJ4XSKE.js} +5 -1
  72. package/chunks/{scan-stream-BMOCPKQX.js → scan-stream-GT6GKQ3U.js} +7 -1
  73. package/chunks/{scope-QWY4VQZ7.js → scope-E5QZUOOH.js} +2 -2
  74. package/chunks/service-plugins-MSK2EQP6.js +62 -0
  75. package/chunks/{session-store-XIDFGG7K.js → session-store-H3Q7KCYG.js} +6 -4
  76. package/chunks/{variant-candidates-7D4F5E4H.js → variant-candidates-SZKDCOLK.js} +9 -3
  77. package/chunks/{web-recon-prepass-VXXBPDAV.js → web-recon-prepass-IO3GXQMW.js} +11 -6
  78. package/dashboard/apple-touch-icon.png +0 -0
  79. package/dashboard/assets/operations-BvB5Qpmk.css +1 -0
  80. package/dashboard/assets/operations-D8Ii01SV.js +114 -0
  81. package/dashboard/assets/zero-peek-Dzm3MT3X.png +0 -0
  82. package/dashboard/favicon.ico +0 -0
  83. package/dashboard/favicon.svg +10 -0
  84. package/dashboard/index.html +5 -3
  85. package/package.json +1 -1
  86. package/chunks/chunk-6GHSR47F.js +0 -147
  87. package/chunks/chunk-BCSRRQG5.js +0 -3514
  88. package/chunks/chunk-BOUGKEKA.js +0 -193
  89. package/chunks/chunk-GHWODZMR.js +0 -16
  90. package/chunks/orchestrate-DWWUT5RC.js +0 -58
  91. package/dashboard/assets/bot-Bg1Tp9_d.js +0 -1
  92. package/dashboard/assets/dist-B_dDCPbu.js +0 -1
  93. package/dashboard/assets/findings-page-mayGhNx6.js +0 -5
  94. package/dashboard/assets/format--susmHX7.js +0 -1
  95. package/dashboard/assets/input-TuVPR3Zl.js +0 -1
  96. package/dashboard/assets/jsx-runtime-MGseXjj5.js +0 -3
  97. package/dashboard/assets/live-page-HWWHX99U.js +0 -1
  98. package/dashboard/assets/meta-tile-ckHo-w7k.js +0 -1
  99. package/dashboard/assets/operations-BxZ0OoXO.js +0 -10
  100. package/dashboard/assets/operations-CMFVrXEe.css +0 -2
  101. package/dashboard/assets/operations-app-D3d35rgo.js +0 -46
  102. package/dashboard/assets/overview-page-W_4IteEr.js +0 -1
  103. package/dashboard/assets/page-header-Bw9AJgBV.js +0 -1
  104. package/dashboard/assets/scans-page-CgzVXHnn.js +0 -1
  105. package/dashboard/assets/siren-KQj8QAnJ.js +0 -1
  106. package/dashboard/assets/table-8EDklulN.js +0 -1
  107. package/dashboard/assets/tabs-CFHPOwg8.js +0 -1
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __0CreateRequire } from "node:module";
3
+ const require = __0CreateRequire(import.meta.url);
4
+ import {
5
+ homeStateDir
6
+ } from "./chunk-6KFB6AYN.js";
7
+ import {
8
+ external_exports
9
+ } from "./chunk-VIT5ALXF.js";
10
+
11
+ // packages/cli/src/tui/session-store.ts
12
+ import { chmodSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ var SESSIONS_DIRNAME = "console-sessions";
15
+ var FILE_MODE = 384;
16
+ var DIR_MODE = 448;
17
+ var DEFAULT_PRUNE_KEEP = 20;
18
+ var PREVIEW_MAX_LENGTH = 120;
19
+ var SUMMARY_MAX_LENGTH = 120;
20
+ var SESSION_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
21
+ var FILE_SUFFIX = ".json";
22
+ function sessionsDir(homeDir) {
23
+ return join(homeStateDir(homeDir), SESSIONS_DIRNAME);
24
+ }
25
+ function isValidSessionId(id) {
26
+ return typeof id === "string" && SESSION_ID_PATTERN.test(id);
27
+ }
28
+ function sessionFilePath(id, homeDir) {
29
+ if (!isValidSessionId(id)) return null;
30
+ return join(sessionsDir(homeDir), `${id}${FILE_SUFFIX}`);
31
+ }
32
+ function rawValue(raw, key) {
33
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return void 0;
34
+ return raw[key];
35
+ }
36
+ function optionalString(raw, key) {
37
+ const value = rawValue(raw, key);
38
+ return typeof value === "string" && value.length > 0 ? value : void 0;
39
+ }
40
+ var CONTROL_CHARS = /[\u0000-\u001F\u007F-\u009F]+/g;
41
+ function sanitizeLine(value, maxLength) {
42
+ if (typeof value !== "string") return "";
43
+ const flattened = value.replace(CONTROL_CHARS, " ").replace(/\s+/g, " ").trim();
44
+ return flattened.length > maxLength ? `${flattened.slice(0, maxLength - 1)}\u2026` : flattened;
45
+ }
46
+ function sanitizePreview(value) {
47
+ return sanitizeLine(value, PREVIEW_MAX_LENGTH);
48
+ }
49
+ function sanitizeSummary(value) {
50
+ const flattened = sanitizeLine(value, SUMMARY_MAX_LENGTH);
51
+ return flattened.length > 0 ? flattened : void 0;
52
+ }
53
+ function toMeta(id, raw, messageCount) {
54
+ const savedAt = rawValue(raw, "savedAt");
55
+ const cwd = rawValue(raw, "cwd");
56
+ const target = optionalString(raw, "target");
57
+ const model = optionalString(raw, "model");
58
+ const mode = optionalString(raw, "mode");
59
+ const summary = sanitizeSummary(rawValue(raw, "summary"));
60
+ return {
61
+ id,
62
+ savedAt: typeof savedAt === "number" && Number.isFinite(savedAt) ? savedAt : 0,
63
+ ...target !== void 0 ? { target } : {},
64
+ ...model !== void 0 ? { model } : {},
65
+ ...mode !== void 0 ? { mode } : {},
66
+ cwd: typeof cwd === "string" ? cwd : "",
67
+ messageCount,
68
+ preview: sanitizePreview(rawValue(raw, "preview")),
69
+ ...rawValue(raw, "archived") === true ? { archived: true } : {},
70
+ ...summary !== void 0 ? { summary } : {}
71
+ };
72
+ }
73
+ var finite = external_exports.number().finite().nonnegative();
74
+ var boundedString = external_exports.string().max(1e6);
75
+ var jsonValueSchema = external_exports.lazy(() => external_exports.union([
76
+ external_exports.null(),
77
+ external_exports.boolean(),
78
+ external_exports.number().finite(),
79
+ boundedString,
80
+ external_exports.array(jsonValueSchema).max(1e4),
81
+ external_exports.record(jsonValueSchema)
82
+ ]));
83
+ var toolCallSchema = external_exports.object({ id: external_exports.string().max(256).optional(), name: external_exports.string().max(256), arguments: jsonValueSchema }).strict();
84
+ var workerTurnSchema = external_exports.object({
85
+ turn: finite,
86
+ ts: finite,
87
+ assistant: boundedString.optional(),
88
+ reasoning_summary: boundedString.optional(),
89
+ partial: external_exports.boolean().optional(),
90
+ tools: external_exports.array(external_exports.object({ callIndex: finite, call: toolCallSchema, result: jsonValueSchema, running: external_exports.boolean().optional() }).strict()).max(1e3).optional()
91
+ }).strict();
92
+ var workerSchema = external_exports.object({
93
+ id: external_exports.string().max(256),
94
+ parentId: external_exports.string().max(256),
95
+ name: external_exports.string().max(200),
96
+ status: external_exports.enum(["queued", "running", "parked", "completed", "failed", "stopped"]),
97
+ task: boundedString,
98
+ transcript: external_exports.array(workerTurnSchema).max(1e4),
99
+ telemetry: external_exports.record(jsonValueSchema).optional(),
100
+ operatorMessages: external_exports.array(external_exports.object({ id: external_exports.string().max(256), text: boundedString, createdAt: external_exports.string().max(64) }).strict()).max(1e4).optional(),
101
+ summary: boundedString.optional(),
102
+ error: boundedString.optional(),
103
+ model: external_exports.string().max(256).optional(),
104
+ role: external_exports.string().max(64).optional()
105
+ }).strict();
106
+ var consoleStateSchema = external_exports.object({
107
+ configuration: external_exports.object({
108
+ target: external_exports.string().max(8e3),
109
+ role: external_exports.enum(["discovery", "attack", "verify", "report", "audit", "review"]),
110
+ runtime: external_exports.object({
111
+ providerId: external_exports.string().max(256).optional(),
112
+ model: external_exports.string().max(256).optional(),
113
+ reasoningEffort: external_exports.enum(["none", "low", "medium", "high", "xhigh", "max"]).optional(),
114
+ agentModels: external_exports.record(external_exports.string().max(256)).optional(),
115
+ singleModel: external_exports.boolean().optional(),
116
+ autoRoute: external_exports.boolean().optional()
117
+ }).strict()
118
+ }).strict().optional(),
119
+ version: external_exports.literal(1),
120
+ title: external_exports.string().max(200),
121
+ objective: external_exports.string().max(8e3),
122
+ usage: external_exports.object({
123
+ inputTokens: finite,
124
+ outputTokens: finite,
125
+ costUsd: finite.optional(),
126
+ costKind: external_exports.enum(["estimated", "reported"]).optional(),
127
+ costUnavailable: external_exports.boolean().optional()
128
+ }).strict(),
129
+ contextInputTokens: finite.optional(),
130
+ lastOutcome: external_exports.object({
131
+ assistantText: boundedString,
132
+ stopReason: external_exports.enum(["end_turn", "max_tool_iterations", "max_turn_tokens", "output_cap", "cancelled", "error"]),
133
+ budget: external_exports.object({ tokensUsed: finite, tokenBudget: finite.nullable(), iterations: finite, maxToolIterations: finite }).strict(),
134
+ error: boundedString.optional(),
135
+ usage: external_exports.object({ inputTokens: finite, outputTokens: finite }).strict().optional(),
136
+ contextInputTokens: finite.optional(),
137
+ outputCap: external_exports.object({ checkpoint: jsonValueSchema, continuations: finite, message: boundedString }).strict().optional()
138
+ }).strict().nullable(),
139
+ todos: external_exports.object({
140
+ todos: external_exports.array(external_exports.object({ id: external_exports.string().max(256), content: external_exports.string().max(8e3), status: external_exports.string().max(64), group: external_exports.string().max(200).optional() }).strict()).max(1e3),
141
+ done: finite,
142
+ total: finite,
143
+ line: external_exports.string().max(8e3),
144
+ revision: finite
145
+ }).strict().nullable(),
146
+ workers: external_exports.array(workerSchema).max(1e3),
147
+ compaction: jsonValueSchema.nullable(),
148
+ queuedMessages: external_exports.array(external_exports.object({ id: external_exports.string().max(256), text: boundedString, createdAt: external_exports.string().max(64) }).strict()).max(20),
149
+ focusedFindingId: external_exports.string().max(256).optional(),
150
+ stagedPrompt: boundedString.optional()
151
+ }).strict();
152
+ function parseConsoleState(value) {
153
+ let nodes = 0;
154
+ const ancestors = /* @__PURE__ */ new Set();
155
+ const boundedJson = (entry, depth) => {
156
+ if (++nodes > 1e5 || depth > 24) return false;
157
+ if (entry === null || typeof entry === "boolean") return true;
158
+ if (typeof entry === "string") return entry.length <= 1e6;
159
+ if (typeof entry === "number") return Number.isFinite(entry);
160
+ if (typeof entry !== "object" || ancestors.has(entry)) return false;
161
+ if (!Array.isArray(entry) && Object.getPrototypeOf(entry) !== Object.prototype && Object.getPrototypeOf(entry) !== null) return false;
162
+ ancestors.add(entry);
163
+ const valid = (Array.isArray(entry) ? entry : Object.values(entry)).every((item) => boundedJson(item, depth + 1));
164
+ ancestors.delete(entry);
165
+ return valid;
166
+ };
167
+ if (!boundedJson(value, 0)) return void 0;
168
+ try {
169
+ if (JSON.stringify(value).length > 4 * 1024 * 1024) return void 0;
170
+ const parsed = consoleStateSchema.safeParse(value);
171
+ return parsed.success ? parsed.data : void 0;
172
+ } catch {
173
+ return void 0;
174
+ }
175
+ }
176
+ function parseSession(id, text) {
177
+ let raw;
178
+ try {
179
+ raw = JSON.parse(text);
180
+ } catch {
181
+ return null;
182
+ }
183
+ const messages = rawValue(raw, "messages");
184
+ if (!Array.isArray(messages)) return null;
185
+ const consoleState = parseConsoleState(rawValue(raw, "consoleState"));
186
+ return { ...toMeta(id, raw, messages.length), messages, ...consoleState ? { consoleState } : {} };
187
+ }
188
+ function saveSession(session, homeDir) {
189
+ try {
190
+ if (!Array.isArray(session?.messages)) return false;
191
+ const path = sessionFilePath(session.id, homeDir);
192
+ if (path === null) return false;
193
+ const consoleState = session.consoleState === void 0 ? void 0 : parseConsoleState(session.consoleState);
194
+ if (session.consoleState !== void 0 && !consoleState) return false;
195
+ const dir = sessionsDir(homeDir);
196
+ mkdirSync(dir, { recursive: true, mode: DIR_MODE });
197
+ chmodSync(dir, DIR_MODE);
198
+ const payload = {
199
+ ...toMeta(session.id, session, session.messages.length),
200
+ messages: session.messages,
201
+ ...consoleState ? { consoleState } : {}
202
+ };
203
+ writeFileSync(path, `${JSON.stringify(payload)}
204
+ `, { encoding: "utf8", mode: FILE_MODE });
205
+ chmodSync(path, FILE_MODE);
206
+ return true;
207
+ } catch {
208
+ return false;
209
+ }
210
+ }
211
+ function listSessions(homeDir, opts) {
212
+ const dir = sessionsDir(homeDir);
213
+ let entries;
214
+ try {
215
+ entries = readdirSync(dir);
216
+ } catch {
217
+ return [];
218
+ }
219
+ const out = [];
220
+ for (const entry of entries) {
221
+ if (!entry.endsWith(FILE_SUFFIX)) continue;
222
+ const id = entry.slice(0, -FILE_SUFFIX.length);
223
+ if (!isValidSessionId(id)) continue;
224
+ let text;
225
+ try {
226
+ text = readFileSync(join(dir, entry), "utf8");
227
+ } catch {
228
+ continue;
229
+ }
230
+ const parsed = parseSession(id, text);
231
+ if (parsed === null) continue;
232
+ if (opts?.cwd !== void 0 && parsed.cwd !== opts.cwd) continue;
233
+ const { messages: _messages, ...meta } = parsed;
234
+ out.push(meta);
235
+ }
236
+ out.sort((a, b) => b.savedAt - a.savedAt || a.id.localeCompare(b.id));
237
+ const limit = opts?.limit;
238
+ if (typeof limit === "number" && Number.isFinite(limit)) {
239
+ return out.slice(0, Math.max(0, Math.floor(limit)));
240
+ }
241
+ return out;
242
+ }
243
+ var SECONDS_PER_MINUTE = 60;
244
+ var MINUTES_PER_HOUR = 60;
245
+ var HOURS_PER_DAY = 24;
246
+ var DAYS_PER_WEEK = 7;
247
+ var FUTURE_SKEW_MS = 6e4;
248
+ function relativeAge(savedAt, now) {
249
+ if (!Number.isFinite(savedAt) || savedAt <= 0) return "";
250
+ if (savedAt > now + FUTURE_SKEW_MS) return "";
251
+ const seconds = Math.max(0, Math.floor((now - savedAt) / 1e3));
252
+ if (seconds < SECONDS_PER_MINUTE) return `${seconds}s`;
253
+ const minutes = Math.floor(seconds / SECONDS_PER_MINUTE);
254
+ if (minutes < MINUTES_PER_HOUR) return `${minutes}m`;
255
+ const hours = Math.floor(minutes / MINUTES_PER_HOUR);
256
+ if (hours < HOURS_PER_DAY) return `${hours}h`;
257
+ const days = Math.floor(hours / HOURS_PER_DAY);
258
+ if (days < DAYS_PER_WEEK) return `${days}d`;
259
+ return `${Math.floor(days / DAYS_PER_WEEK)}w`;
260
+ }
261
+ function loadSession(id, homeDir) {
262
+ const path = sessionFilePath(id, homeDir);
263
+ if (path === null) return null;
264
+ try {
265
+ return parseSession(id, readFileSync(path, "utf8"));
266
+ } catch {
267
+ return null;
268
+ }
269
+ }
270
+ function deleteSession(id, homeDir, opts) {
271
+ if (opts?.protectedIds?.has(id)) return false;
272
+ const path = sessionFilePath(id, homeDir);
273
+ if (path === null) return false;
274
+ try {
275
+ rmSync(path, { force: false });
276
+ return true;
277
+ } catch {
278
+ return false;
279
+ }
280
+ }
281
+ function pruneSessions(homeDir, opts) {
282
+ const requested = opts?.keep;
283
+ const keep = typeof requested === "number" && Number.isFinite(requested) ? Math.max(0, Math.floor(requested)) : DEFAULT_PRUNE_KEEP;
284
+ let removed = 0;
285
+ let archived = 0;
286
+ for (const meta of listSessions(homeDir)) {
287
+ if (opts?.protectedIds?.has(meta.id)) continue;
288
+ if (archived++ < keep) continue;
289
+ if (deleteSession(meta.id, homeDir, opts)) removed += 1;
290
+ }
291
+ return removed;
292
+ }
293
+ function setSessionArchived(id, archived, homeDir) {
294
+ const session = loadSession(id, homeDir);
295
+ return session !== null && saveSession({ ...session, archived }, homeDir);
296
+ }
297
+
298
+ export {
299
+ DEFAULT_PRUNE_KEEP,
300
+ sessionsDir,
301
+ isValidSessionId,
302
+ saveSession,
303
+ listSessions,
304
+ relativeAge,
305
+ loadSession,
306
+ deleteSession,
307
+ pruneSessions,
308
+ setSessionArchived
309
+ };
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-5IBCBQEH.js";
7
7
  import {
8
8
  homeStateDir
9
- } from "./chunk-KAU6NLGP.js";
9
+ } from "./chunk-6KFB6AYN.js";
10
10
 
11
11
  // packages/core/dist/scope/scope.js
12
12
  import { readFileSync as readFileSync3 } from "node:fs";