@pensar/apex 2.0.0-canary.241920ad → 2.0.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.
Files changed (55) hide show
  1. package/README.md +0 -20
  2. package/build/agent-84enr6xn.js +22 -0
  3. package/build/{agent-7866ka7b.js → agent-x1tnsg7n.js} +10 -7
  4. package/build/{agent-aj7jpehp.js → agent-z8043nrm.js} +12 -9
  5. package/build/{apps-hse35c2d.js → apps-gdze0s68.js} +18 -15
  6. package/build/{auth-15rkvgam.js → auth-24ca1qwx.js} +19 -16
  7. package/build/authentication-0k43jay4.js +22 -0
  8. package/build/blackboxAgent-76tnwwg7.js +22 -0
  9. package/build/{blackboxPentest-vmtnnp5d.js → blackboxPentest-xwc031xm.js} +16 -13
  10. package/build/{cli-23xtyah8.js → cli-0v9x0eby.js} +1 -1
  11. package/build/cli-1yavz2pb.js +17 -0
  12. package/build/{cli-6gge86w5.js → cli-31cara07.js} +6 -8
  13. package/build/cli-3knnkdps.js +666 -0
  14. package/build/{cli-cbw2rmv7.js → cli-5fr9k6m4.js} +35 -58
  15. package/build/{cli-78s9w64j.js → cli-948dk60p.js} +1 -1
  16. package/build/{cli-k1vsv3qh.js → cli-a20jcpmp.js} +1 -1
  17. package/build/{cli-0svsmc2c.js → cli-cb5va0cs.js} +1 -10
  18. package/build/{cli-rtbry75t.js → cli-h6nw89zf.js} +1 -1
  19. package/build/{cli-5h1kv0v4.js → cli-h825qzmd.js} +53 -1492
  20. package/build/{cli-gtepvg8s.js → cli-k8mvghe1.js} +921 -444
  21. package/build/{cli-4dpc999m.js → cli-mswm4k81.js} +1 -11
  22. package/build/{cli-zyk3xsth.js → cli-ntd42071.js} +1 -1
  23. package/build/{cli-mb837pv4.js → cli-pkdjamer.js} +5 -15
  24. package/build/cli-s1nckt4k.js +20 -0
  25. package/build/{cli-4ez6yssj.js → cli-sw5swz40.js} +3 -3
  26. package/build/{cli-ft17f9nh.js → cli-wdmqkshz.js} +2 -2
  27. package/build/{cli-demg7sj2.js → cli-zpvmaxem.js} +2 -2
  28. package/build/{cli-r0s5br0a.js → cli-zvq4gy61.js} +6 -13
  29. package/build/cli.js +45 -105
  30. package/build/{config-bb6q79q0.js → config-cmq1cxz3.js} +3 -3
  31. package/build/{doctor-tkz0a0g4.js → doctor-2bkpddws.js} +1 -8
  32. package/build/{fixes-krvbkbey.js → fixes-a4qscvkx.js} +18 -15
  33. package/build/{index-pamhzcx3.js → index-0fnbx38r.js} +14 -20
  34. package/build/{index-ah3cm7hf.js → index-2a1x5nnv.js} +3 -3
  35. package/build/{index-v4sz6cee.js → index-48pjf9d2.js} +124 -76
  36. package/build/{index-tknvj68q.js → index-54ep0ery.js} +12 -9
  37. package/build/{index-wsp4kqtm.js → index-aymt8k9w.js} +2 -2
  38. package/build/{index-a9ea9c1q.js → index-hfhkjj2g.js} +11 -8
  39. package/build/{index-4gk224ac.js → index-s17r2akv.js} +4 -4
  40. package/build/{issues-m2me70rs.js → issues-5pnrspt7.js} +18 -15
  41. package/build/{logs-rxf1a0be.js → logs-1mfm901x.js} +18 -15
  42. package/build/{offesecAgent-hmxcpch7.js → offesecAgent-mrbyc93d.js} +11 -8
  43. package/build/pentest-wy4eeagc.js +31 -0
  44. package/build/{pentests-201vfsn6.js → pentests-htmtq66d.js} +18 -15
  45. package/build/{targetedPentest-85b1dndy.js → targetedPentest-cpbd87rc.js} +12 -9
  46. package/build/threatModel-9n56z6a6.js +29 -0
  47. package/build/{uninstall-qa8jvrj1.js → uninstall-6y9dkgyt.js} +1 -1
  48. package/build/{upload-p58nxxvf.js → upload-7wtbr768.js} +1 -8
  49. package/build/{utils-hsde107p.js → utils-trqnyj77.js} +8 -6
  50. package/package.json +1 -1
  51. package/build/agent-mjyx1amj.js +0 -19
  52. package/build/authentication-b8p1afqq.js +0 -19
  53. package/build/blackboxAgent-z1h2cgyg.js +0 -19
  54. package/build/pentest-r6hfzf8n.js +0 -28
  55. package/build/threatModel-hbpz15y7.js +0 -26
@@ -0,0 +1,666 @@
1
+ import {
2
+ init_ai
3
+ } from "./cli-1yavz2pb.js";
4
+ import {
5
+ generateObjectResponse
6
+ } from "./cli-h825qzmd.js";
7
+ import {
8
+ exports_external1 as exports_external,
9
+ init_zod,
10
+ zod_default
11
+ } from "./cli-e6rgwtpb.js";
12
+ import {
13
+ __callDispose,
14
+ __using
15
+ } from "./cli-8rxa073f.js";
16
+
17
+ // src/util/name.ts
18
+ init_zod();
19
+ init_ai();
20
+ var adjectives = [
21
+ "swift",
22
+ "bright",
23
+ "calm",
24
+ "bold",
25
+ "keen",
26
+ "noble",
27
+ "quick",
28
+ "sharp",
29
+ "vivid",
30
+ "warm",
31
+ "agile",
32
+ "brave",
33
+ "clever",
34
+ "daring",
35
+ "eager",
36
+ "fierce",
37
+ "gentle",
38
+ "humble",
39
+ "jolly",
40
+ "lively",
41
+ "merry",
42
+ "nimble",
43
+ "proud",
44
+ "quiet",
45
+ "rapid",
46
+ "serene",
47
+ "sturdy",
48
+ "tender",
49
+ "valiant",
50
+ "witty",
51
+ "zealous"
52
+ ];
53
+ var nouns = [
54
+ "falcon",
55
+ "wolf",
56
+ "hawk",
57
+ "bear",
58
+ "lion",
59
+ "tiger",
60
+ "eagle",
61
+ "raven",
62
+ "phoenix",
63
+ "dragon",
64
+ "panther",
65
+ "cobra",
66
+ "viper",
67
+ "shark",
68
+ "orca",
69
+ "mantis",
70
+ "spider",
71
+ "scorpion",
72
+ "hydra",
73
+ "griffin",
74
+ "sphinx",
75
+ "kraken",
76
+ "cipher",
77
+ "nexus",
78
+ "prism",
79
+ "vector",
80
+ "matrix",
81
+ "pulse",
82
+ "surge",
83
+ "flux"
84
+ ];
85
+ function generateRandomName() {
86
+ const adj = adjectives[Math.floor(Math.random() * adjectives.length)] ?? "swift";
87
+ const noun = nouns[Math.floor(Math.random() * nouns.length)] ?? "falcon";
88
+ return `${adj}-${noun}`;
89
+ }
90
+ var sessionNameSchema = exports_external.object({
91
+ name: exports_external.string().describe("A short, descriptive session name (2-4 words, lowercase, hyphenated)")
92
+ });
93
+ async function generateSessionName(opts) {
94
+ const { targets, userMessage, model, authConfig, abortSignal } = opts;
95
+ const contextParts = [];
96
+ if (targets.length > 0) {
97
+ contextParts.push(`Target(s): ${targets.join(", ")}`);
98
+ }
99
+ if (userMessage) {
100
+ contextParts.push(`User objective: ${userMessage}`);
101
+ }
102
+ if (contextParts.length === 0)
103
+ return null;
104
+ const prompt = [
105
+ "Generate a short, descriptive name for a penetration testing session.",
106
+ "The name should be 2-4 lowercase words separated by hyphens.",
107
+ "It should capture the key aspect of the target or task — e.g. 'acme-api-pentest', 'login-auth-bypass', 'ecommerce-checkout-test'.",
108
+ "",
109
+ ...contextParts
110
+ ].join(`
111
+ `);
112
+ try {
113
+ const result = await generateObjectResponse({
114
+ model,
115
+ schema: sessionNameSchema,
116
+ prompt,
117
+ maxTokens: 50,
118
+ temperature: 0.7,
119
+ authConfig,
120
+ abortSignal
121
+ });
122
+ if (!result?.name)
123
+ return null;
124
+ const name = result.name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 50);
125
+ return name || null;
126
+ } catch {
127
+ return null;
128
+ }
129
+ }
130
+
131
+ // src/core/credentials/manager.ts
132
+ import { randomBytes } from "crypto";
133
+ function generateCredentialId() {
134
+ return `cred_${randomBytes(8).toString("hex")}`;
135
+ }
136
+ function inferType(cred) {
137
+ const hasPwd = !!cred.password;
138
+ const hasApiKey = !!cred.apiKey;
139
+ const hasBearer = !!cred.tokens?.bearerToken;
140
+ const hasHeaders = !!cred.tokens?.customHeaders && Object.keys(cred.tokens.customHeaders).length > 0;
141
+ const hasCookies = !!cred.tokens?.cookies;
142
+ const count = (hasPwd ? 1 : 0) + (hasApiKey ? 1 : 0) + (hasBearer ? 1 : 0) + (hasHeaders ? 1 : 0) + (hasCookies ? 1 : 0);
143
+ if (count > 1)
144
+ return "composite";
145
+ if (hasPwd)
146
+ return "username-password";
147
+ if (hasApiKey)
148
+ return "api-key";
149
+ if (hasBearer)
150
+ return "bearer-token";
151
+ if (hasHeaders)
152
+ return "custom-headers";
153
+ if (hasCookies)
154
+ return "cookies";
155
+ return "username-password";
156
+ }
157
+ function toReference(stored) {
158
+ const ref = {
159
+ id: stored.id,
160
+ type: stored.type
161
+ };
162
+ if (stored.label)
163
+ ref.label = stored.label;
164
+ if (stored.role)
165
+ ref.role = stored.role;
166
+ if (stored.username)
167
+ ref.username = stored.username;
168
+ if (stored.loginUrl)
169
+ ref.loginUrl = stored.loginUrl;
170
+ if (stored.tokens?.customHeaders) {
171
+ ref.customHeaderKeys = Object.keys(stored.tokens.customHeaders);
172
+ }
173
+ const ctx = stored.metadata?.context;
174
+ if (typeof ctx === "string" && ctx)
175
+ ref.context = ctx;
176
+ return ref;
177
+ }
178
+
179
+ class CredentialManager {
180
+ store = new Map;
181
+ findDuplicate(candidate) {
182
+ for (const [id, existing] of this.store) {
183
+ if (existing.username === candidate.username && existing.password === candidate.password && existing.apiKey === candidate.apiKey && existing.loginUrl === candidate.loginUrl && existing.tokens?.bearerToken === candidate.tokens?.bearerToken && existing.tokens?.cookies === candidate.tokens?.cookies && existing.tokens?.sessionToken === candidate.tokens?.sessionToken && JSON.stringify(existing.tokens?.customHeaders) === JSON.stringify(candidate.tokens?.customHeaders)) {
184
+ return id;
185
+ }
186
+ }
187
+ return;
188
+ }
189
+ add(input) {
190
+ const id = input.id ?? generateCredentialId();
191
+ const type = input.type ?? inferType(input);
192
+ const stored = { ...input, id, type };
193
+ this.store.set(id, stored);
194
+ return id;
195
+ }
196
+ addFromAuthCredentials(creds, extra) {
197
+ const candidate = {
198
+ username: creds.username,
199
+ password: creds.password,
200
+ apiKey: creds.apiKey,
201
+ loginUrl: creds.loginUrl,
202
+ additionalFields: creds.additionalFields,
203
+ tokens: creds.tokens,
204
+ label: extra?.label,
205
+ role: extra?.role ?? creds.role,
206
+ metadata: creds.context ? { context: creds.context } : undefined
207
+ };
208
+ const existingId = this.findDuplicate(candidate);
209
+ if (existingId)
210
+ return existingId;
211
+ return this.add(candidate);
212
+ }
213
+ resolve(credentialId) {
214
+ return this.store.get(credentialId);
215
+ }
216
+ getReference(credentialId) {
217
+ const stored = this.store.get(credentialId);
218
+ if (!stored)
219
+ return;
220
+ return toReference(stored);
221
+ }
222
+ listReferences() {
223
+ return Array.from(this.store.values()).map(toReference);
224
+ }
225
+ listCredentialsWithHeaders() {
226
+ const out = [];
227
+ for (const stored of this.store.values()) {
228
+ const headers = stored.tokens?.customHeaders;
229
+ if (headers && Object.keys(headers).length > 0) {
230
+ out.push({ tokens: { customHeaders: { ...headers } } });
231
+ }
232
+ }
233
+ return out;
234
+ }
235
+ remove(credentialId) {
236
+ return this.store.delete(credentialId);
237
+ }
238
+ get size() {
239
+ return this.store.size;
240
+ }
241
+ clear() {
242
+ this.store.clear();
243
+ }
244
+ toAuthCredentials(credentialId) {
245
+ const stored = this.resolve(credentialId);
246
+ if (!stored)
247
+ return;
248
+ const result = {};
249
+ if (stored.username)
250
+ result.username = stored.username;
251
+ if (stored.password)
252
+ result.password = stored.password;
253
+ if (stored.apiKey)
254
+ result.apiKey = stored.apiKey;
255
+ if (stored.loginUrl)
256
+ result.loginUrl = stored.loginUrl;
257
+ if (stored.additionalFields)
258
+ result.additionalFields = stored.additionalFields;
259
+ if (stored.tokens)
260
+ result.tokens = { ...stored.tokens };
261
+ return result;
262
+ }
263
+ formatForPrompt() {
264
+ const refs = this.listReferences();
265
+ if (refs.length === 0)
266
+ return "";
267
+ const lines = refs.map((ref) => {
268
+ const parts = [`- Credential ID: ${ref.id}`];
269
+ if (ref.label)
270
+ parts.push(` Label: ${ref.label}`);
271
+ parts.push(` Type: ${ref.type}`);
272
+ if (ref.role)
273
+ parts.push(` Role: ${ref.role}`);
274
+ if (ref.username)
275
+ parts.push(` Username: ${ref.username}`);
276
+ if (ref.loginUrl)
277
+ parts.push(` Login URL: ${ref.loginUrl}`);
278
+ if (ref.customHeaderKeys?.length) {
279
+ parts.push(` Header keys: ${ref.customHeaderKeys.join(", ")}`);
280
+ }
281
+ if (ref.context)
282
+ parts.push(` Context: ${ref.context}`);
283
+ return parts.join(`
284
+ `);
285
+ });
286
+ return `<available_credentials>
287
+ The following credentials are available. To use a credential, pass its ID to the appropriate tool.
288
+ Do NOT ask the user for passwords or secrets — they are resolved automatically from the credential ID.
289
+
290
+ ${lines.join(`
291
+
292
+ `)}
293
+ </available_credentials>`;
294
+ }
295
+ }
296
+ // src/core/id/id.ts
297
+ init_zod();
298
+ import { randomBytes as randomBytes2 } from "crypto";
299
+ var prefixes = {
300
+ session: "ses",
301
+ message: "msg",
302
+ permission: "per",
303
+ user: "usr",
304
+ part: "prt"
305
+ };
306
+ function schema(prefix) {
307
+ return zod_default.string().startsWith(prefixes[prefix]);
308
+ }
309
+ var LENGTH = 26;
310
+ var lastTimestamp = 0;
311
+ var counter = 0;
312
+ function descending(prefix, given) {
313
+ return generateID(prefix, true, given);
314
+ }
315
+ function generateID(prefix, descending2, given) {
316
+ if (!given) {
317
+ return create(prefix, descending2);
318
+ }
319
+ if (!given.startsWith(prefixes[prefix])) {
320
+ throw new Error(`ID ${given} does not start with ${prefixes[prefix]}`);
321
+ }
322
+ return given;
323
+ }
324
+ function randomBase62(length) {
325
+ const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
326
+ let result = "";
327
+ const bytes = randomBytes2(length);
328
+ for (let i = 0;i < length; i++) {
329
+ result += chars[bytes[i] % 62];
330
+ }
331
+ return result;
332
+ }
333
+ function create(prefix, descending2, timestamp) {
334
+ const currentTimestamp = timestamp ?? Date.now();
335
+ if (currentTimestamp !== lastTimestamp) {
336
+ lastTimestamp = currentTimestamp;
337
+ counter = 0;
338
+ }
339
+ counter++;
340
+ let now = BigInt(currentTimestamp) * BigInt(4096) + BigInt(counter);
341
+ now = descending2 ? ~now : now;
342
+ const timeBytes = Buffer.alloc(6);
343
+ for (let i = 0;i < 6; i++) {
344
+ timeBytes[i] = Number(now >> BigInt(40 - 8 * i) & BigInt(255));
345
+ }
346
+ return prefixes[prefix] + "_" + timeBytes.toString("hex") + randomBase62(LENGTH - 12);
347
+ }
348
+
349
+ // src/core/services/rateLimiter/index.ts
350
+ function sleep(ms) {
351
+ return new Promise((resolve) => setTimeout(resolve, ms));
352
+ }
353
+
354
+ class RateLimiter {
355
+ tokens;
356
+ lastRefillTime;
357
+ rps;
358
+ bucketSize;
359
+ msPerToken;
360
+ queue;
361
+ constructor(config) {
362
+ this.rps = config?.requestsPerSecond;
363
+ this.bucketSize = this.rps ? 1 : 0;
364
+ this.tokens = this.bucketSize;
365
+ this.lastRefillTime = performance.now();
366
+ this.msPerToken = this.rps ? 1000 / this.rps : undefined;
367
+ this.queue = Promise.resolve();
368
+ }
369
+ async acquireSlot() {
370
+ if (!this.rps || !this.msPerToken)
371
+ return;
372
+ const previousPromise = this.queue;
373
+ let resolveCurrentRequest;
374
+ this.queue = new Promise((resolve) => {
375
+ resolveCurrentRequest = resolve;
376
+ });
377
+ await previousPromise;
378
+ try {
379
+ const now = performance.now();
380
+ this.refill(now);
381
+ if (this.tokens < 1) {
382
+ const waitTime = (1 - this.tokens) * this.msPerToken;
383
+ await sleep(waitTime);
384
+ const nowAfterSleep = performance.now();
385
+ this.refill(nowAfterSleep);
386
+ }
387
+ this.tokens -= 1;
388
+ } finally {
389
+ resolveCurrentRequest();
390
+ }
391
+ }
392
+ refill(now) {
393
+ if (this.tokens >= this.bucketSize) {
394
+ this.lastRefillTime = now;
395
+ return;
396
+ }
397
+ const elapsed = now - this.lastRefillTime;
398
+ const tokensToAdd = elapsed / this.msPerToken;
399
+ this.tokens = Math.min(this.bucketSize, this.tokens + tokensToAdd);
400
+ this.lastRefillTime = now;
401
+ }
402
+ isEnabled() {
403
+ return this.rps !== undefined;
404
+ }
405
+ }
406
+
407
+ // src/core/storage/index.ts
408
+ init_zod();
409
+ import fs, { readdir } from "fs/promises";
410
+ import os from "os";
411
+ import path from "path";
412
+
413
+ // src/util/errors.ts
414
+ init_zod();
415
+
416
+ class NamedError extends Error {
417
+ static create(name, data) {
418
+ const schema2 = zod_default.object({
419
+ name: zod_default.literal(name),
420
+ data
421
+ });
422
+ const result = class extends NamedError {
423
+ data;
424
+ static Schema = schema2;
425
+ name = name;
426
+ constructor(data2, options) {
427
+ super(name, options);
428
+ this.data = data2;
429
+ this.name = name;
430
+ }
431
+ static isInstance(input) {
432
+ return typeof input === "object" && input !== null && "name" in input && input.name === name;
433
+ }
434
+ schema() {
435
+ return schema2;
436
+ }
437
+ toObject() {
438
+ return {
439
+ name,
440
+ data: this.data
441
+ };
442
+ }
443
+ };
444
+ Object.defineProperty(result, "name", { value: name });
445
+ return result;
446
+ }
447
+ static Unknown = NamedError.create("UnknownError", zod_default.object({
448
+ message: zod_default.string()
449
+ }));
450
+ }
451
+
452
+ // src/util/lock.ts
453
+ var locks = new Map;
454
+ function getLock(key) {
455
+ let lock = locks.get(key);
456
+ if (!lock) {
457
+ lock = {
458
+ readers: 0,
459
+ writer: false,
460
+ waitingReaders: [],
461
+ waitingWriters: []
462
+ };
463
+ locks.set(key, lock);
464
+ }
465
+ return lock;
466
+ }
467
+ function processQueue(key) {
468
+ const lock = locks.get(key);
469
+ if (!lock || lock.writer || lock.readers > 0)
470
+ return;
471
+ if (lock.waitingWriters.length > 0) {
472
+ const nextWriter = lock.waitingWriters.shift();
473
+ nextWriter?.();
474
+ return;
475
+ }
476
+ while (lock.waitingReaders.length > 0) {
477
+ const nextReader = lock.waitingReaders.shift();
478
+ nextReader?.();
479
+ }
480
+ if (lock.readers === 0 && !lock.writer && lock.waitingReaders.length === 0 && lock.waitingWriters.length === 0) {
481
+ locks.delete(key);
482
+ }
483
+ }
484
+ async function read(key) {
485
+ const lock = getLock(key);
486
+ return new Promise((resolve) => {
487
+ if (!lock.writer && lock.waitingWriters.length === 0) {
488
+ lock.readers++;
489
+ resolve({
490
+ [Symbol.dispose]: () => {
491
+ lock.readers--;
492
+ processQueue(key);
493
+ }
494
+ });
495
+ } else {
496
+ lock.waitingReaders.push(() => {
497
+ lock.readers++;
498
+ resolve({
499
+ [Symbol.dispose]: () => {
500
+ lock.readers--;
501
+ processQueue(key);
502
+ }
503
+ });
504
+ });
505
+ }
506
+ });
507
+ }
508
+ async function write(key) {
509
+ const lock = getLock(key);
510
+ return new Promise((resolve) => {
511
+ if (!lock.writer && lock.readers === 0) {
512
+ lock.writer = true;
513
+ resolve({
514
+ [Symbol.dispose]: () => {
515
+ lock.writer = false;
516
+ processQueue(key);
517
+ }
518
+ });
519
+ } else {
520
+ lock.waitingWriters.push(() => {
521
+ lock.writer = true;
522
+ resolve({
523
+ [Symbol.dispose]: () => {
524
+ lock.writer = false;
525
+ processQueue(key);
526
+ }
527
+ });
528
+ });
529
+ }
530
+ });
531
+ }
532
+
533
+ // src/core/storage/index.ts
534
+ var NotFoundError = NamedError.create("NotFoundError", zod_default.object({
535
+ message: zod_default.string()
536
+ }));
537
+ function getBaseDir() {
538
+ return process.env.PENSAR_DATA_DIR ?? path.join(os.homedir(), ".pensar");
539
+ }
540
+ async function write2(key, content, ext) {
541
+ const dir = getBaseDir();
542
+ const target = path.join(dir, ...key) + (ext ? ext : ".json");
543
+ return withErrorHandling(async () => {
544
+ let __stack = [];
545
+ try {
546
+ const _ = __using(__stack, await write(target), 0);
547
+ await fs.mkdir(path.dirname(target), { recursive: true });
548
+ await fs.writeFile(target, JSON.stringify(content, null, 2), "utf-8");
549
+ } catch (_catch) {
550
+ var _err = _catch, _hasErr = 1;
551
+ } finally {
552
+ __callDispose(__stack, _err, _hasErr);
553
+ }
554
+ });
555
+ }
556
+ async function createDir(key) {
557
+ const dir = getBaseDir();
558
+ const target = path.join(dir, ...key);
559
+ return withErrorHandling(async () => {
560
+ let __stack = [];
561
+ try {
562
+ const _ = __using(__stack, await write(target), 0);
563
+ await fs.mkdir(target, { recursive: true });
564
+ } catch (_catch) {
565
+ var _err = _catch, _hasErr = 1;
566
+ } finally {
567
+ __callDispose(__stack, _err, _hasErr);
568
+ }
569
+ });
570
+ }
571
+ async function writeRaw(key, content) {
572
+ const dir = getBaseDir();
573
+ const target = path.join(dir, ...key);
574
+ return withErrorHandling(async () => {
575
+ let __stack = [];
576
+ try {
577
+ const _ = __using(__stack, await write(target), 0);
578
+ const parentDir = path.dirname(target);
579
+ await fs.mkdir(parentDir, { recursive: true });
580
+ await fs.writeFile(target, content, "utf-8");
581
+ } catch (_catch) {
582
+ var _err = _catch, _hasErr = 1;
583
+ } finally {
584
+ __callDispose(__stack, _err, _hasErr);
585
+ }
586
+ });
587
+ }
588
+ async function read2(key, ext) {
589
+ const dir = getBaseDir();
590
+ const target = path.join(dir, ...key) + (ext ? ext : ".json");
591
+ return withErrorHandling(async () => {
592
+ let __stack = [];
593
+ try {
594
+ const _ = __using(__stack, await read(target), 0);
595
+ const text = await fs.readFile(target, "utf-8");
596
+ const result = ext ? text : JSON.parse(text);
597
+ return result;
598
+ } catch (_catch) {
599
+ var _err = _catch, _hasErr = 1;
600
+ } finally {
601
+ __callDispose(__stack, _err, _hasErr);
602
+ }
603
+ });
604
+ }
605
+ async function update(key, fn, ext) {
606
+ const dir = getBaseDir();
607
+ const target = path.join(dir, ...key) + (ext ? ext : ".json");
608
+ return withErrorHandling(async () => {
609
+ let __stack = [];
610
+ try {
611
+ const _ = __using(__stack, await write(target), 0);
612
+ const text = await fs.readFile(target, "utf-8");
613
+ const content = ext ? text : JSON.parse(text);
614
+ fn(content);
615
+ await fs.writeFile(target, JSON.stringify(content, null, 2), "utf-8");
616
+ return content;
617
+ } catch (_catch) {
618
+ var _err = _catch, _hasErr = 1;
619
+ } finally {
620
+ __callDispose(__stack, _err, _hasErr);
621
+ }
622
+ });
623
+ }
624
+ async function withErrorHandling(body) {
625
+ return body().catch((e) => {
626
+ if (!(e instanceof Error))
627
+ throw e;
628
+ const errnoExcpetion = e;
629
+ if (errnoExcpetion.code === "ENOENT") {
630
+ throw new NotFoundError({
631
+ message: `Resource not found: ${errnoExcpetion.path}`
632
+ });
633
+ }
634
+ throw e;
635
+ });
636
+ }
637
+ async function listFilesRecursively(dir) {
638
+ const entries = await readdir(dir, { withFileTypes: true });
639
+ const files = [];
640
+ for (const entry of entries) {
641
+ const fullPath = path.join(dir, entry.name);
642
+ if (entry.isDirectory()) {
643
+ files.push(...await listFilesRecursively(fullPath));
644
+ } else {
645
+ files.push(fullPath);
646
+ }
647
+ }
648
+ return files;
649
+ }
650
+ async function list(prefix) {
651
+ const dir = getBaseDir();
652
+ const targetDir = path.join(dir, ...prefix);
653
+ try {
654
+ const files = await listFilesRecursively(targetDir);
655
+ const result = files.map((filePath) => {
656
+ const relativePath = path.relative(targetDir, filePath);
657
+ return [...prefix, ...relativePath.slice(0, -5).split(path.sep)];
658
+ });
659
+ result.sort();
660
+ return result;
661
+ } catch {
662
+ return [];
663
+ }
664
+ }
665
+
666
+ export { generateRandomName, generateSessionName, CredentialManager, schema, descending, RateLimiter, NotFoundError, write2 as write, createDir, writeRaw, read2 as read, update, list };