@polka-codes/cli-shared 0.9.88 → 0.9.89

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 (2) hide show
  1. package/dist/index.js +1366 -46
  2. package/package.json +4 -2
package/dist/index.js CHANGED
@@ -15363,7 +15363,7 @@ var init_multipart_parser = __esm(() => {
15363
15363
 
15364
15364
  // ../../node_modules/node-fetch/src/body.js
15365
15365
  import Stream, { PassThrough } from "node:stream";
15366
- import { types as types3, deprecate, promisify } from "node:util";
15366
+ import { types as types4, deprecate, promisify } from "node:util";
15367
15367
  import { Buffer as Buffer4 } from "node:buffer";
15368
15368
 
15369
15369
  class Body {
@@ -15375,7 +15375,7 @@ class Body {
15375
15375
  body = null;
15376
15376
  } else if (isURLSearchParameters(body)) {
15377
15377
  body = Buffer4.from(body.toString());
15378
- } else if (isBlob(body)) {} else if (Buffer4.isBuffer(body)) {} else if (types3.isAnyArrayBuffer(body)) {
15378
+ } else if (isBlob(body)) {} else if (Buffer4.isBuffer(body)) {} else if (types4.isAnyArrayBuffer(body)) {
15379
15379
  body = Buffer4.from(body);
15380
15380
  } else if (ArrayBuffer.isView(body)) {
15381
15381
  body = Buffer4.from(body.buffer, body.byteOffset, body.byteLength);
@@ -15521,7 +15521,7 @@ var pipeline, INTERNALS, clone2 = (instance, highWaterMark) => {
15521
15521
  if (isBlob(body)) {
15522
15522
  return body.type || null;
15523
15523
  }
15524
- if (Buffer4.isBuffer(body) || types3.isAnyArrayBuffer(body) || ArrayBuffer.isView(body)) {
15524
+ if (Buffer4.isBuffer(body) || types4.isAnyArrayBuffer(body) || ArrayBuffer.isView(body)) {
15525
15525
  return null;
15526
15526
  }
15527
15527
  if (body instanceof FormData2) {
@@ -15578,7 +15578,7 @@ var init_body = __esm(() => {
15578
15578
  });
15579
15579
 
15580
15580
  // ../../node_modules/node-fetch/src/headers.js
15581
- import { types as types4 } from "node:util";
15581
+ import { types as types5 } from "node:util";
15582
15582
  import http from "node:http";
15583
15583
  function fromRawHeaders(headers = []) {
15584
15584
  return new Headers2(headers.reduce((result, value, index, array2) => {
@@ -15620,7 +15620,7 @@ var init_headers = __esm(() => {
15620
15620
  for (const [name17, values] of Object.entries(raw)) {
15621
15621
  result.push(...values.map((value) => [name17, value]));
15622
15622
  }
15623
- } else if (init == null) {} else if (typeof init === "object" && !types4.isBoxedPrimitive(init)) {
15623
+ } else if (init == null) {} else if (typeof init === "object" && !types5.isBoxedPrimitive(init)) {
15624
15624
  const method = init[Symbol.iterator];
15625
15625
  if (method == null) {
15626
15626
  result.push(...Object.entries(init));
@@ -15629,7 +15629,7 @@ var init_headers = __esm(() => {
15629
15629
  throw new TypeError("Header pairs must be iterable");
15630
15630
  }
15631
15631
  result = [...init].map((pair) => {
15632
- if (typeof pair !== "object" || types4.isBoxedPrimitive(pair)) {
15632
+ if (typeof pair !== "object" || types5.isBoxedPrimitive(pair)) {
15633
15633
  throw new TypeError("Each header pair must be an iterable object");
15634
15634
  }
15635
15635
  return [...pair];
@@ -35104,6 +35104,771 @@ var require_mimeScore = __commonJS((exports, module) => {
35104
35104
  };
35105
35105
  });
35106
35106
 
35107
+ // ../../node_modules/better-sqlite3/lib/util.js
35108
+ var require_util3 = __commonJS((exports) => {
35109
+ exports.getBooleanOption = (options, key) => {
35110
+ let value = false;
35111
+ if (key in options && typeof (value = options[key]) !== "boolean") {
35112
+ throw new TypeError(`Expected the "${key}" option to be a boolean`);
35113
+ }
35114
+ return value;
35115
+ };
35116
+ exports.cppdb = Symbol();
35117
+ exports.inspect = Symbol.for("nodejs.util.inspect.custom");
35118
+ });
35119
+
35120
+ // ../../node_modules/better-sqlite3/lib/sqlite-error.js
35121
+ var require_sqlite_error = __commonJS((exports, module) => {
35122
+ var descriptor = { value: "SqliteError", writable: true, enumerable: false, configurable: true };
35123
+ function SqliteError(message, code) {
35124
+ if (new.target !== SqliteError) {
35125
+ return new SqliteError(message, code);
35126
+ }
35127
+ if (typeof code !== "string") {
35128
+ throw new TypeError("Expected second argument to be a string");
35129
+ }
35130
+ Error.call(this, message);
35131
+ descriptor.value = "" + message;
35132
+ Object.defineProperty(this, "message", descriptor);
35133
+ Error.captureStackTrace(this, SqliteError);
35134
+ this.code = code;
35135
+ }
35136
+ Object.setPrototypeOf(SqliteError, Error);
35137
+ Object.setPrototypeOf(SqliteError.prototype, Error.prototype);
35138
+ Object.defineProperty(SqliteError.prototype, "name", descriptor);
35139
+ module.exports = SqliteError;
35140
+ });
35141
+
35142
+ // ../../node_modules/file-uri-to-path/index.js
35143
+ var require_file_uri_to_path = __commonJS((exports, module) => {
35144
+ var sep = __require("path").sep || "/";
35145
+ module.exports = fileUriToPath;
35146
+ function fileUriToPath(uri) {
35147
+ if (typeof uri != "string" || uri.length <= 7 || uri.substring(0, 7) != "file://") {
35148
+ throw new TypeError("must pass in a file:// URI to convert to a file path");
35149
+ }
35150
+ var rest = decodeURI(uri.substring(7));
35151
+ var firstSlash = rest.indexOf("/");
35152
+ var host = rest.substring(0, firstSlash);
35153
+ var path = rest.substring(firstSlash + 1);
35154
+ if (host == "localhost")
35155
+ host = "";
35156
+ if (host) {
35157
+ host = sep + sep + host;
35158
+ }
35159
+ path = path.replace(/^(.+)\|/, "$1:");
35160
+ if (sep == "\\") {
35161
+ path = path.replace(/\//g, "\\");
35162
+ }
35163
+ if (/^.+\:/.test(path)) {} else {
35164
+ path = sep + path;
35165
+ }
35166
+ return host + path;
35167
+ }
35168
+ });
35169
+
35170
+ // ../../node_modules/bindings/bindings.js
35171
+ var require_bindings = __commonJS((exports, module) => {
35172
+ var __filename = "/Users/xiliangchen/projects/polka-codes/node_modules/bindings/bindings.js";
35173
+ var fs4 = __require("fs");
35174
+ var path = __require("path");
35175
+ var fileURLToPath = require_file_uri_to_path();
35176
+ var join3 = path.join;
35177
+ var dirname2 = path.dirname;
35178
+ var exists = fs4.accessSync && function(path2) {
35179
+ try {
35180
+ fs4.accessSync(path2);
35181
+ } catch (e2) {
35182
+ return false;
35183
+ }
35184
+ return true;
35185
+ } || fs4.existsSync || path.existsSync;
35186
+ var defaults = {
35187
+ arrow: process.env.NODE_BINDINGS_ARROW || " → ",
35188
+ compiled: process.env.NODE_BINDINGS_COMPILED_DIR || "compiled",
35189
+ platform: process.platform,
35190
+ arch: process.arch,
35191
+ nodePreGyp: "node-v" + process.versions.modules + "-" + process.platform + "-" + process.arch,
35192
+ version: process.versions.node,
35193
+ bindings: "bindings.node",
35194
+ try: [
35195
+ ["module_root", "build", "bindings"],
35196
+ ["module_root", "build", "Debug", "bindings"],
35197
+ ["module_root", "build", "Release", "bindings"],
35198
+ ["module_root", "out", "Debug", "bindings"],
35199
+ ["module_root", "Debug", "bindings"],
35200
+ ["module_root", "out", "Release", "bindings"],
35201
+ ["module_root", "Release", "bindings"],
35202
+ ["module_root", "build", "default", "bindings"],
35203
+ ["module_root", "compiled", "version", "platform", "arch", "bindings"],
35204
+ ["module_root", "addon-build", "release", "install-root", "bindings"],
35205
+ ["module_root", "addon-build", "debug", "install-root", "bindings"],
35206
+ ["module_root", "addon-build", "default", "install-root", "bindings"],
35207
+ ["module_root", "lib", "binding", "nodePreGyp", "bindings"]
35208
+ ]
35209
+ };
35210
+ function bindings(opts) {
35211
+ if (typeof opts == "string") {
35212
+ opts = { bindings: opts };
35213
+ } else if (!opts) {
35214
+ opts = {};
35215
+ }
35216
+ Object.keys(defaults).map(function(i3) {
35217
+ if (!(i3 in opts))
35218
+ opts[i3] = defaults[i3];
35219
+ });
35220
+ if (!opts.module_root) {
35221
+ opts.module_root = exports.getRoot(exports.getFileName());
35222
+ }
35223
+ if (path.extname(opts.bindings) != ".node") {
35224
+ opts.bindings += ".node";
35225
+ }
35226
+ var requireFunc = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
35227
+ var tries = [], i2 = 0, l = opts.try.length, n, b, err;
35228
+ for (;i2 < l; i2++) {
35229
+ n = join3.apply(null, opts.try[i2].map(function(p) {
35230
+ return opts[p] || p;
35231
+ }));
35232
+ tries.push(n);
35233
+ try {
35234
+ b = opts.path ? requireFunc.resolve(n) : requireFunc(n);
35235
+ if (!opts.path) {
35236
+ b.path = n;
35237
+ }
35238
+ return b;
35239
+ } catch (e2) {
35240
+ if (e2.code !== "MODULE_NOT_FOUND" && e2.code !== "QUALIFIED_PATH_RESOLUTION_FAILED" && !/not find/i.test(e2.message)) {
35241
+ throw e2;
35242
+ }
35243
+ }
35244
+ }
35245
+ err = new Error(`Could not locate the bindings file. Tried:
35246
+ ` + tries.map(function(a) {
35247
+ return opts.arrow + a;
35248
+ }).join(`
35249
+ `));
35250
+ err.tries = tries;
35251
+ throw err;
35252
+ }
35253
+ module.exports = exports = bindings;
35254
+ exports.getFileName = function getFileName(calling_file) {
35255
+ var { prepareStackTrace: origPST, stackTraceLimit: origSTL } = Error, dummy = {}, fileName;
35256
+ Error.stackTraceLimit = 10;
35257
+ Error.prepareStackTrace = function(e2, st) {
35258
+ for (var i2 = 0, l = st.length;i2 < l; i2++) {
35259
+ fileName = st[i2].getFileName();
35260
+ if (fileName !== __filename) {
35261
+ if (calling_file) {
35262
+ if (fileName !== calling_file) {
35263
+ return;
35264
+ }
35265
+ } else {
35266
+ return;
35267
+ }
35268
+ }
35269
+ }
35270
+ };
35271
+ Error.captureStackTrace(dummy);
35272
+ dummy.stack;
35273
+ Error.prepareStackTrace = origPST;
35274
+ Error.stackTraceLimit = origSTL;
35275
+ var fileSchema = "file://";
35276
+ if (fileName.indexOf(fileSchema) === 0) {
35277
+ fileName = fileURLToPath(fileName);
35278
+ }
35279
+ return fileName;
35280
+ };
35281
+ exports.getRoot = function getRoot(file2) {
35282
+ var dir = dirname2(file2), prev;
35283
+ while (true) {
35284
+ if (dir === ".") {
35285
+ dir = process.cwd();
35286
+ }
35287
+ if (exists(join3(dir, "package.json")) || exists(join3(dir, "node_modules"))) {
35288
+ return dir;
35289
+ }
35290
+ if (prev === dir) {
35291
+ throw new Error('Could not find module root given file: "' + file2 + '". Do you have a `package.json` file? ');
35292
+ }
35293
+ prev = dir;
35294
+ dir = join3(dir, "..");
35295
+ }
35296
+ };
35297
+ });
35298
+
35299
+ // ../../node_modules/better-sqlite3/lib/methods/wrappers.js
35300
+ var require_wrappers = __commonJS((exports) => {
35301
+ var { cppdb } = require_util3();
35302
+ exports.prepare = function prepare(sql) {
35303
+ return this[cppdb].prepare(sql, this, false);
35304
+ };
35305
+ exports.exec = function exec(sql) {
35306
+ this[cppdb].exec(sql);
35307
+ return this;
35308
+ };
35309
+ exports.close = function close() {
35310
+ this[cppdb].close();
35311
+ return this;
35312
+ };
35313
+ exports.loadExtension = function loadExtension(...args) {
35314
+ this[cppdb].loadExtension(...args);
35315
+ return this;
35316
+ };
35317
+ exports.defaultSafeIntegers = function defaultSafeIntegers(...args) {
35318
+ this[cppdb].defaultSafeIntegers(...args);
35319
+ return this;
35320
+ };
35321
+ exports.unsafeMode = function unsafeMode(...args) {
35322
+ this[cppdb].unsafeMode(...args);
35323
+ return this;
35324
+ };
35325
+ exports.getters = {
35326
+ name: {
35327
+ get: function name() {
35328
+ return this[cppdb].name;
35329
+ },
35330
+ enumerable: true
35331
+ },
35332
+ open: {
35333
+ get: function open() {
35334
+ return this[cppdb].open;
35335
+ },
35336
+ enumerable: true
35337
+ },
35338
+ inTransaction: {
35339
+ get: function inTransaction() {
35340
+ return this[cppdb].inTransaction;
35341
+ },
35342
+ enumerable: true
35343
+ },
35344
+ readonly: {
35345
+ get: function readonly() {
35346
+ return this[cppdb].readonly;
35347
+ },
35348
+ enumerable: true
35349
+ },
35350
+ memory: {
35351
+ get: function memory() {
35352
+ return this[cppdb].memory;
35353
+ },
35354
+ enumerable: true
35355
+ }
35356
+ };
35357
+ });
35358
+
35359
+ // ../../node_modules/better-sqlite3/lib/methods/transaction.js
35360
+ var require_transaction = __commonJS((exports, module) => {
35361
+ var { cppdb } = require_util3();
35362
+ var controllers = new WeakMap;
35363
+ module.exports = function transaction(fn) {
35364
+ if (typeof fn !== "function")
35365
+ throw new TypeError("Expected first argument to be a function");
35366
+ const db2 = this[cppdb];
35367
+ const controller = getController(db2, this);
35368
+ const { apply: apply2 } = Function.prototype;
35369
+ const properties = {
35370
+ default: { value: wrapTransaction(apply2, fn, db2, controller.default) },
35371
+ deferred: { value: wrapTransaction(apply2, fn, db2, controller.deferred) },
35372
+ immediate: { value: wrapTransaction(apply2, fn, db2, controller.immediate) },
35373
+ exclusive: { value: wrapTransaction(apply2, fn, db2, controller.exclusive) },
35374
+ database: { value: this, enumerable: true }
35375
+ };
35376
+ Object.defineProperties(properties.default.value, properties);
35377
+ Object.defineProperties(properties.deferred.value, properties);
35378
+ Object.defineProperties(properties.immediate.value, properties);
35379
+ Object.defineProperties(properties.exclusive.value, properties);
35380
+ return properties.default.value;
35381
+ };
35382
+ var getController = (db2, self2) => {
35383
+ let controller = controllers.get(db2);
35384
+ if (!controller) {
35385
+ const shared = {
35386
+ commit: db2.prepare("COMMIT", self2, false),
35387
+ rollback: db2.prepare("ROLLBACK", self2, false),
35388
+ savepoint: db2.prepare("SAVEPOINT `\t_bs3.\t`", self2, false),
35389
+ release: db2.prepare("RELEASE `\t_bs3.\t`", self2, false),
35390
+ rollbackTo: db2.prepare("ROLLBACK TO `\t_bs3.\t`", self2, false)
35391
+ };
35392
+ controllers.set(db2, controller = {
35393
+ default: Object.assign({ begin: db2.prepare("BEGIN", self2, false) }, shared),
35394
+ deferred: Object.assign({ begin: db2.prepare("BEGIN DEFERRED", self2, false) }, shared),
35395
+ immediate: Object.assign({ begin: db2.prepare("BEGIN IMMEDIATE", self2, false) }, shared),
35396
+ exclusive: Object.assign({ begin: db2.prepare("BEGIN EXCLUSIVE", self2, false) }, shared)
35397
+ });
35398
+ }
35399
+ return controller;
35400
+ };
35401
+ var wrapTransaction = (apply2, fn, db2, { begin, commit, rollback, savepoint, release, rollbackTo }) => function sqliteTransaction() {
35402
+ let before, after, undo;
35403
+ if (db2.inTransaction) {
35404
+ before = savepoint;
35405
+ after = release;
35406
+ undo = rollbackTo;
35407
+ } else {
35408
+ before = begin;
35409
+ after = commit;
35410
+ undo = rollback;
35411
+ }
35412
+ before.run();
35413
+ try {
35414
+ const result = apply2.call(fn, this, arguments);
35415
+ if (result && typeof result.then === "function") {
35416
+ throw new TypeError("Transaction function cannot return a promise");
35417
+ }
35418
+ after.run();
35419
+ return result;
35420
+ } catch (ex) {
35421
+ if (db2.inTransaction) {
35422
+ undo.run();
35423
+ if (undo !== rollback)
35424
+ after.run();
35425
+ }
35426
+ throw ex;
35427
+ }
35428
+ };
35429
+ });
35430
+
35431
+ // ../../node_modules/better-sqlite3/lib/methods/pragma.js
35432
+ var require_pragma = __commonJS((exports, module) => {
35433
+ var { getBooleanOption, cppdb } = require_util3();
35434
+ module.exports = function pragma(source, options) {
35435
+ if (options == null)
35436
+ options = {};
35437
+ if (typeof source !== "string")
35438
+ throw new TypeError("Expected first argument to be a string");
35439
+ if (typeof options !== "object")
35440
+ throw new TypeError("Expected second argument to be an options object");
35441
+ const simple = getBooleanOption(options, "simple");
35442
+ const stmt = this[cppdb].prepare(`PRAGMA ${source}`, this, true);
35443
+ return simple ? stmt.pluck().get() : stmt.all();
35444
+ };
35445
+ });
35446
+
35447
+ // ../../node_modules/better-sqlite3/lib/methods/backup.js
35448
+ var require_backup = __commonJS((exports, module) => {
35449
+ var fs4 = __require("fs");
35450
+ var path = __require("path");
35451
+ var { promisify: promisify2 } = __require("util");
35452
+ var { cppdb } = require_util3();
35453
+ var fsAccess = promisify2(fs4.access);
35454
+ module.exports = async function backup(filename, options) {
35455
+ if (options == null)
35456
+ options = {};
35457
+ if (typeof filename !== "string")
35458
+ throw new TypeError("Expected first argument to be a string");
35459
+ if (typeof options !== "object")
35460
+ throw new TypeError("Expected second argument to be an options object");
35461
+ filename = filename.trim();
35462
+ const attachedName = "attached" in options ? options.attached : "main";
35463
+ const handler13 = "progress" in options ? options.progress : null;
35464
+ if (!filename)
35465
+ throw new TypeError("Backup filename cannot be an empty string");
35466
+ if (filename === ":memory:")
35467
+ throw new TypeError('Invalid backup filename ":memory:"');
35468
+ if (typeof attachedName !== "string")
35469
+ throw new TypeError('Expected the "attached" option to be a string');
35470
+ if (!attachedName)
35471
+ throw new TypeError('The "attached" option cannot be an empty string');
35472
+ if (handler13 != null && typeof handler13 !== "function")
35473
+ throw new TypeError('Expected the "progress" option to be a function');
35474
+ await fsAccess(path.dirname(filename)).catch(() => {
35475
+ throw new TypeError("Cannot save backup because the directory does not exist");
35476
+ });
35477
+ const isNewFile = await fsAccess(filename).then(() => false, () => true);
35478
+ return runBackup(this[cppdb].backup(this, attachedName, filename, isNewFile), handler13 || null);
35479
+ };
35480
+ var runBackup = (backup, handler13) => {
35481
+ let rate = 0;
35482
+ let useDefault = true;
35483
+ return new Promise((resolve4, reject) => {
35484
+ setImmediate(function step() {
35485
+ try {
35486
+ const progress = backup.transfer(rate);
35487
+ if (!progress.remainingPages) {
35488
+ backup.close();
35489
+ resolve4(progress);
35490
+ return;
35491
+ }
35492
+ if (useDefault) {
35493
+ useDefault = false;
35494
+ rate = 100;
35495
+ }
35496
+ if (handler13) {
35497
+ const ret = handler13(progress);
35498
+ if (ret !== undefined) {
35499
+ if (typeof ret === "number" && ret === ret)
35500
+ rate = Math.max(0, Math.min(2147483647, Math.round(ret)));
35501
+ else
35502
+ throw new TypeError("Expected progress callback to return a number or undefined");
35503
+ }
35504
+ }
35505
+ setImmediate(step);
35506
+ } catch (err) {
35507
+ backup.close();
35508
+ reject(err);
35509
+ }
35510
+ });
35511
+ });
35512
+ };
35513
+ });
35514
+
35515
+ // ../../node_modules/better-sqlite3/lib/methods/serialize.js
35516
+ var require_serialize = __commonJS((exports, module) => {
35517
+ var { cppdb } = require_util3();
35518
+ module.exports = function serialize(options) {
35519
+ if (options == null)
35520
+ options = {};
35521
+ if (typeof options !== "object")
35522
+ throw new TypeError("Expected first argument to be an options object");
35523
+ const attachedName = "attached" in options ? options.attached : "main";
35524
+ if (typeof attachedName !== "string")
35525
+ throw new TypeError('Expected the "attached" option to be a string');
35526
+ if (!attachedName)
35527
+ throw new TypeError('The "attached" option cannot be an empty string');
35528
+ return this[cppdb].serialize(attachedName);
35529
+ };
35530
+ });
35531
+
35532
+ // ../../node_modules/better-sqlite3/lib/methods/function.js
35533
+ var require_function = __commonJS((exports, module) => {
35534
+ var { getBooleanOption, cppdb } = require_util3();
35535
+ module.exports = function defineFunction(name17, options, fn) {
35536
+ if (options == null)
35537
+ options = {};
35538
+ if (typeof options === "function") {
35539
+ fn = options;
35540
+ options = {};
35541
+ }
35542
+ if (typeof name17 !== "string")
35543
+ throw new TypeError("Expected first argument to be a string");
35544
+ if (typeof fn !== "function")
35545
+ throw new TypeError("Expected last argument to be a function");
35546
+ if (typeof options !== "object")
35547
+ throw new TypeError("Expected second argument to be an options object");
35548
+ if (!name17)
35549
+ throw new TypeError("User-defined function name cannot be an empty string");
35550
+ const safeIntegers = "safeIntegers" in options ? +getBooleanOption(options, "safeIntegers") : 2;
35551
+ const deterministic = getBooleanOption(options, "deterministic");
35552
+ const directOnly = getBooleanOption(options, "directOnly");
35553
+ const varargs = getBooleanOption(options, "varargs");
35554
+ let argCount = -1;
35555
+ if (!varargs) {
35556
+ argCount = fn.length;
35557
+ if (!Number.isInteger(argCount) || argCount < 0)
35558
+ throw new TypeError("Expected function.length to be a positive integer");
35559
+ if (argCount > 100)
35560
+ throw new RangeError("User-defined functions cannot have more than 100 arguments");
35561
+ }
35562
+ this[cppdb].function(fn, name17, argCount, safeIntegers, deterministic, directOnly);
35563
+ return this;
35564
+ };
35565
+ });
35566
+
35567
+ // ../../node_modules/better-sqlite3/lib/methods/aggregate.js
35568
+ var require_aggregate = __commonJS((exports, module) => {
35569
+ var { getBooleanOption, cppdb } = require_util3();
35570
+ module.exports = function defineAggregate(name17, options) {
35571
+ if (typeof name17 !== "string")
35572
+ throw new TypeError("Expected first argument to be a string");
35573
+ if (typeof options !== "object" || options === null)
35574
+ throw new TypeError("Expected second argument to be an options object");
35575
+ if (!name17)
35576
+ throw new TypeError("User-defined function name cannot be an empty string");
35577
+ const start = "start" in options ? options.start : null;
35578
+ const step = getFunctionOption(options, "step", true);
35579
+ const inverse = getFunctionOption(options, "inverse", false);
35580
+ const result = getFunctionOption(options, "result", false);
35581
+ const safeIntegers = "safeIntegers" in options ? +getBooleanOption(options, "safeIntegers") : 2;
35582
+ const deterministic = getBooleanOption(options, "deterministic");
35583
+ const directOnly = getBooleanOption(options, "directOnly");
35584
+ const varargs = getBooleanOption(options, "varargs");
35585
+ let argCount = -1;
35586
+ if (!varargs) {
35587
+ argCount = Math.max(getLength(step), inverse ? getLength(inverse) : 0);
35588
+ if (argCount > 0)
35589
+ argCount -= 1;
35590
+ if (argCount > 100)
35591
+ throw new RangeError("User-defined functions cannot have more than 100 arguments");
35592
+ }
35593
+ this[cppdb].aggregate(start, step, inverse, result, name17, argCount, safeIntegers, deterministic, directOnly);
35594
+ return this;
35595
+ };
35596
+ var getFunctionOption = (options, key, required2) => {
35597
+ const value = key in options ? options[key] : null;
35598
+ if (typeof value === "function")
35599
+ return value;
35600
+ if (value != null)
35601
+ throw new TypeError(`Expected the "${key}" option to be a function`);
35602
+ if (required2)
35603
+ throw new TypeError(`Missing required option "${key}"`);
35604
+ return null;
35605
+ };
35606
+ var getLength = ({ length }) => {
35607
+ if (Number.isInteger(length) && length >= 0)
35608
+ return length;
35609
+ throw new TypeError("Expected function.length to be a positive integer");
35610
+ };
35611
+ });
35612
+
35613
+ // ../../node_modules/better-sqlite3/lib/methods/table.js
35614
+ var require_table = __commonJS((exports, module) => {
35615
+ var { cppdb } = require_util3();
35616
+ module.exports = function defineTable(name17, factory) {
35617
+ if (typeof name17 !== "string")
35618
+ throw new TypeError("Expected first argument to be a string");
35619
+ if (!name17)
35620
+ throw new TypeError("Virtual table module name cannot be an empty string");
35621
+ let eponymous = false;
35622
+ if (typeof factory === "object" && factory !== null) {
35623
+ eponymous = true;
35624
+ factory = defer(parseTableDefinition(factory, "used", name17));
35625
+ } else {
35626
+ if (typeof factory !== "function")
35627
+ throw new TypeError("Expected second argument to be a function or a table definition object");
35628
+ factory = wrapFactory(factory);
35629
+ }
35630
+ this[cppdb].table(factory, name17, eponymous);
35631
+ return this;
35632
+ };
35633
+ function wrapFactory(factory) {
35634
+ return function virtualTableFactory(moduleName, databaseName, tableName, ...args) {
35635
+ const thisObject = {
35636
+ module: moduleName,
35637
+ database: databaseName,
35638
+ table: tableName
35639
+ };
35640
+ const def = apply2.call(factory, thisObject, args);
35641
+ if (typeof def !== "object" || def === null) {
35642
+ throw new TypeError(`Virtual table module "${moduleName}" did not return a table definition object`);
35643
+ }
35644
+ return parseTableDefinition(def, "returned", moduleName);
35645
+ };
35646
+ }
35647
+ function parseTableDefinition(def, verb, moduleName) {
35648
+ if (!hasOwnProperty10.call(def, "rows")) {
35649
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition without a "rows" property`);
35650
+ }
35651
+ if (!hasOwnProperty10.call(def, "columns")) {
35652
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition without a "columns" property`);
35653
+ }
35654
+ const rows = def.rows;
35655
+ if (typeof rows !== "function" || Object.getPrototypeOf(rows) !== GeneratorFunctionPrototype) {
35656
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "rows" property (should be a generator function)`);
35657
+ }
35658
+ let columns = def.columns;
35659
+ if (!Array.isArray(columns) || !(columns = [...columns]).every((x2) => typeof x2 === "string")) {
35660
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "columns" property (should be an array of strings)`);
35661
+ }
35662
+ if (columns.length !== new Set(columns).size) {
35663
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with duplicate column names`);
35664
+ }
35665
+ if (!columns.length) {
35666
+ throw new RangeError(`Virtual table module "${moduleName}" ${verb} a table definition with zero columns`);
35667
+ }
35668
+ let parameters;
35669
+ if (hasOwnProperty10.call(def, "parameters")) {
35670
+ parameters = def.parameters;
35671
+ if (!Array.isArray(parameters) || !(parameters = [...parameters]).every((x2) => typeof x2 === "string")) {
35672
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "parameters" property (should be an array of strings)`);
35673
+ }
35674
+ } else {
35675
+ parameters = inferParameters(rows);
35676
+ }
35677
+ if (parameters.length !== new Set(parameters).size) {
35678
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with duplicate parameter names`);
35679
+ }
35680
+ if (parameters.length > 32) {
35681
+ throw new RangeError(`Virtual table module "${moduleName}" ${verb} a table definition with more than the maximum number of 32 parameters`);
35682
+ }
35683
+ for (const parameter of parameters) {
35684
+ if (columns.includes(parameter)) {
35685
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with column "${parameter}" which was ambiguously defined as both a column and parameter`);
35686
+ }
35687
+ }
35688
+ let safeIntegers = 2;
35689
+ if (hasOwnProperty10.call(def, "safeIntegers")) {
35690
+ const bool = def.safeIntegers;
35691
+ if (typeof bool !== "boolean") {
35692
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "safeIntegers" property (should be a boolean)`);
35693
+ }
35694
+ safeIntegers = +bool;
35695
+ }
35696
+ let directOnly = false;
35697
+ if (hasOwnProperty10.call(def, "directOnly")) {
35698
+ directOnly = def.directOnly;
35699
+ if (typeof directOnly !== "boolean") {
35700
+ throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "directOnly" property (should be a boolean)`);
35701
+ }
35702
+ }
35703
+ const columnDefinitions = [
35704
+ ...parameters.map(identifier).map((str) => `${str} HIDDEN`),
35705
+ ...columns.map(identifier)
35706
+ ];
35707
+ return [
35708
+ `CREATE TABLE x(${columnDefinitions.join(", ")});`,
35709
+ wrapGenerator(rows, new Map(columns.map((x2, i2) => [x2, parameters.length + i2])), moduleName),
35710
+ parameters,
35711
+ safeIntegers,
35712
+ directOnly
35713
+ ];
35714
+ }
35715
+ function wrapGenerator(generator, columnMap, moduleName) {
35716
+ return function* virtualTable(...args) {
35717
+ const output = args.map((x2) => Buffer.isBuffer(x2) ? Buffer.from(x2) : x2);
35718
+ for (let i2 = 0;i2 < columnMap.size; ++i2) {
35719
+ output.push(null);
35720
+ }
35721
+ for (const row of generator(...args)) {
35722
+ if (Array.isArray(row)) {
35723
+ extractRowArray(row, output, columnMap.size, moduleName);
35724
+ yield output;
35725
+ } else if (typeof row === "object" && row !== null) {
35726
+ extractRowObject(row, output, columnMap, moduleName);
35727
+ yield output;
35728
+ } else {
35729
+ throw new TypeError(`Virtual table module "${moduleName}" yielded something that isn't a valid row object`);
35730
+ }
35731
+ }
35732
+ };
35733
+ }
35734
+ function extractRowArray(row, output, columnCount, moduleName) {
35735
+ if (row.length !== columnCount) {
35736
+ throw new TypeError(`Virtual table module "${moduleName}" yielded a row with an incorrect number of columns`);
35737
+ }
35738
+ const offset = output.length - columnCount;
35739
+ for (let i2 = 0;i2 < columnCount; ++i2) {
35740
+ output[i2 + offset] = row[i2];
35741
+ }
35742
+ }
35743
+ function extractRowObject(row, output, columnMap, moduleName) {
35744
+ let count = 0;
35745
+ for (const key of Object.keys(row)) {
35746
+ const index = columnMap.get(key);
35747
+ if (index === undefined) {
35748
+ throw new TypeError(`Virtual table module "${moduleName}" yielded a row with an undeclared column "${key}"`);
35749
+ }
35750
+ output[index] = row[key];
35751
+ count += 1;
35752
+ }
35753
+ if (count !== columnMap.size) {
35754
+ throw new TypeError(`Virtual table module "${moduleName}" yielded a row with missing columns`);
35755
+ }
35756
+ }
35757
+ function inferParameters({ length }) {
35758
+ if (!Number.isInteger(length) || length < 0) {
35759
+ throw new TypeError("Expected function.length to be a positive integer");
35760
+ }
35761
+ const params = [];
35762
+ for (let i2 = 0;i2 < length; ++i2) {
35763
+ params.push(`$${i2 + 1}`);
35764
+ }
35765
+ return params;
35766
+ }
35767
+ var { hasOwnProperty: hasOwnProperty10 } = Object.prototype;
35768
+ var { apply: apply2 } = Function.prototype;
35769
+ var GeneratorFunctionPrototype = Object.getPrototypeOf(function* () {});
35770
+ var identifier = (str) => `"${str.replace(/"/g, '""')}"`;
35771
+ var defer = (x2) => () => x2;
35772
+ });
35773
+
35774
+ // ../../node_modules/better-sqlite3/lib/methods/inspect.js
35775
+ var require_inspect = __commonJS((exports, module) => {
35776
+ var DatabaseInspection = function Database() {};
35777
+ module.exports = function inspect(depth, opts) {
35778
+ return Object.assign(new DatabaseInspection, this);
35779
+ };
35780
+ });
35781
+
35782
+ // ../../node_modules/better-sqlite3/lib/database.js
35783
+ var require_database = __commonJS((exports, module) => {
35784
+ var fs4 = __require("fs");
35785
+ var path = __require("path");
35786
+ var util2 = require_util3();
35787
+ var SqliteError = require_sqlite_error();
35788
+ var DEFAULT_ADDON;
35789
+ function Database(filenameGiven, options) {
35790
+ if (new.target == null) {
35791
+ return new Database(filenameGiven, options);
35792
+ }
35793
+ let buffer;
35794
+ if (Buffer.isBuffer(filenameGiven)) {
35795
+ buffer = filenameGiven;
35796
+ filenameGiven = ":memory:";
35797
+ }
35798
+ if (filenameGiven == null)
35799
+ filenameGiven = "";
35800
+ if (options == null)
35801
+ options = {};
35802
+ if (typeof filenameGiven !== "string")
35803
+ throw new TypeError("Expected first argument to be a string");
35804
+ if (typeof options !== "object")
35805
+ throw new TypeError("Expected second argument to be an options object");
35806
+ if ("readOnly" in options)
35807
+ throw new TypeError('Misspelled option "readOnly" should be "readonly"');
35808
+ if ("memory" in options)
35809
+ throw new TypeError('Option "memory" was removed in v7.0.0 (use ":memory:" filename instead)');
35810
+ const filename = filenameGiven.trim();
35811
+ const anonymous = filename === "" || filename === ":memory:";
35812
+ const readonly2 = util2.getBooleanOption(options, "readonly");
35813
+ const fileMustExist = util2.getBooleanOption(options, "fileMustExist");
35814
+ const timeout = "timeout" in options ? options.timeout : 5000;
35815
+ const verbose = "verbose" in options ? options.verbose : null;
35816
+ const nativeBinding = "nativeBinding" in options ? options.nativeBinding : null;
35817
+ if (readonly2 && anonymous && !buffer)
35818
+ throw new TypeError("In-memory/temporary databases cannot be readonly");
35819
+ if (!Number.isInteger(timeout) || timeout < 0)
35820
+ throw new TypeError('Expected the "timeout" option to be a positive integer');
35821
+ if (timeout > 2147483647)
35822
+ throw new RangeError('Option "timeout" cannot be greater than 2147483647');
35823
+ if (verbose != null && typeof verbose !== "function")
35824
+ throw new TypeError('Expected the "verbose" option to be a function');
35825
+ if (nativeBinding != null && typeof nativeBinding !== "string" && typeof nativeBinding !== "object")
35826
+ throw new TypeError('Expected the "nativeBinding" option to be a string or addon object');
35827
+ let addon;
35828
+ if (nativeBinding == null) {
35829
+ addon = DEFAULT_ADDON || (DEFAULT_ADDON = require_bindings()("better_sqlite3.node"));
35830
+ } else if (typeof nativeBinding === "string") {
35831
+ const requireFunc = typeof __non_webpack_require__ === "function" ? __non_webpack_require__ : __require;
35832
+ addon = requireFunc(path.resolve(nativeBinding).replace(/(\.node)?$/, ".node"));
35833
+ } else {
35834
+ addon = nativeBinding;
35835
+ }
35836
+ if (!addon.isInitialized) {
35837
+ addon.setErrorConstructor(SqliteError);
35838
+ addon.isInitialized = true;
35839
+ }
35840
+ if (!anonymous && !filename.startsWith("file:") && !fs4.existsSync(path.dirname(filename))) {
35841
+ throw new TypeError("Cannot open database because the directory does not exist");
35842
+ }
35843
+ Object.defineProperties(this, {
35844
+ [util2.cppdb]: { value: new addon.Database(filename, filenameGiven, anonymous, readonly2, fileMustExist, timeout, verbose || null, buffer || null) },
35845
+ ...wrappers.getters
35846
+ });
35847
+ }
35848
+ var wrappers = require_wrappers();
35849
+ Database.prototype.prepare = wrappers.prepare;
35850
+ Database.prototype.transaction = require_transaction();
35851
+ Database.prototype.pragma = require_pragma();
35852
+ Database.prototype.backup = require_backup();
35853
+ Database.prototype.serialize = require_serialize();
35854
+ Database.prototype.function = require_function();
35855
+ Database.prototype.aggregate = require_aggregate();
35856
+ Database.prototype.table = require_table();
35857
+ Database.prototype.loadExtension = wrappers.loadExtension;
35858
+ Database.prototype.exec = wrappers.exec;
35859
+ Database.prototype.close = wrappers.close;
35860
+ Database.prototype.defaultSafeIntegers = wrappers.defaultSafeIntegers;
35861
+ Database.prototype.unsafeMode = wrappers.unsafeMode;
35862
+ Database.prototype[util2.inspect] = require_inspect();
35863
+ module.exports = Database;
35864
+ });
35865
+
35866
+ // ../../node_modules/better-sqlite3/lib/index.js
35867
+ var require_lib2 = __commonJS((exports, module) => {
35868
+ module.exports = require_database();
35869
+ module.exports.SqliteError = require_sqlite_error();
35870
+ });
35871
+
35107
35872
  // src/config.ts
35108
35873
  import { existsSync, readFileSync } from "node:fs";
35109
35874
  import { readFile } from "node:fs/promises";
@@ -48641,6 +49406,13 @@ function date4(params) {
48641
49406
 
48642
49407
  // ../../node_modules/zod/v4/classic/external.js
48643
49408
  config(en_default());
49409
+ // ../core/src/config/memory.ts
49410
+ var memoryConfigSchema = exports_external.object({
49411
+ enabled: exports_external.boolean().optional().default(true),
49412
+ type: exports_external.enum(["sqlite", "memory"]).optional().default("sqlite"),
49413
+ path: exports_external.string().optional().default("~/.config/polka-codes/memory.sqlite")
49414
+ }).strict().optional();
49415
+
48644
49416
  // ../core/src/config.ts
48645
49417
  var ruleSchema = exports_external.union([
48646
49418
  exports_external.string(),
@@ -48773,7 +49545,8 @@ var configSchema = exports_external.object({
48773
49545
  mcpServers: exports_external.record(exports_external.string(), mcpServerConfigSchema).optional(),
48774
49546
  rules: exports_external.array(ruleSchema).optional().or(exports_external.string()).optional(),
48775
49547
  excludeFiles: exports_external.array(exports_external.string()).optional(),
48776
- agent: agentSchema
49548
+ agent: agentSchema,
49549
+ memory: memoryConfigSchema
48777
49550
  }).strict().nullish();
48778
49551
  // ../core/src/skills/constants.ts
48779
49552
  var SKILL_LIMITS = {
@@ -49246,14 +50019,40 @@ var readBinaryFile_default = {
49246
50019
  // ../core/src/tools/readFile.ts
49247
50020
  var toolInfo6 = {
49248
50021
  name: "readFile",
49249
- description: "Request to read the contents of one or multiple files at the specified paths. Use comma separated paths to read multiple files. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. May not be suitable for other types of binary files, as it returns the raw content as a string. Try to list all the potential files are relevent to the task, and then use this tool to read all the relevant files.",
50022
+ description: `Request to read the contents of one or multiple files at the specified paths.
50023
+
50024
+ When to use:
50025
+ - Examining file contents you don't know
50026
+ - Analyzing code, reviewing text files, extracting configuration info
50027
+ - Reading multiple files at once (use comma-separated paths)
50028
+ - Understanding file structure before editing
50029
+
50030
+ When NOT to use:
50031
+ - For file existence checks: Use listFiles instead
50032
+ - For searching within files: Use grep instead
50033
+ - For file name searches: Use searchFiles instead
50034
+ - Prefer this tool over executeCommand with cat/head/tail
50035
+
50036
+ Features:
50037
+ - Supports comma-separated paths for multiple files
50038
+ - Line numbers included for easy reference
50039
+ - Optional offset/limit for partial file reading
50040
+ - Automatically handles different file types
50041
+
50042
+ IMPORTANT:
50043
+ - Line numbers are included for easy reference
50044
+ - Use offset/limit for large files to read specific sections`,
49250
50045
  parameters: exports_external.object({
49251
50046
  path: exports_external.preprocess((val) => {
49252
50047
  if (!val)
49253
50048
  return [];
49254
- const values = Array.isArray(val) ? val : [val];
49255
- return values.flatMap((i) => typeof i === "string" ? i.split(",") : []).filter((s) => s.length > 0);
50049
+ if (Array.isArray(val)) {
50050
+ return val.filter((s) => typeof s === "string" && s.length > 0);
50051
+ }
50052
+ return val.split(",").filter((s) => s.length > 0);
49256
50053
  }, exports_external.array(exports_external.string())).describe("The path of the file to read").meta({ usageValue: "Comma separated paths here" }),
50054
+ offset: exports_external.number().optional().describe("Skip first N lines (for partial file reading)").meta({ usageValue: "100" }),
50055
+ limit: exports_external.number().optional().describe("Read at most N lines (for partial file reading)").meta({ usageValue: "50" }),
49257
50056
  includeIgnored: exports_external.preprocess(preprocessBoolean, exports_external.boolean().nullish().default(false)).describe("Whether to include ignored files. Use true to include files ignored by .gitignore.").meta({ usageValue: "true or false (optional)" })
49258
50057
  }).meta({
49259
50058
  examples: [
@@ -49268,6 +50067,14 @@ var toolInfo6 = {
49268
50067
  input: {
49269
50068
  path: "src/main.js,src/index.js"
49270
50069
  }
50070
+ },
50071
+ {
50072
+ description: "Read partial file (lines 100-150)",
50073
+ input: {
50074
+ path: "src/large-file.ts",
50075
+ offset: 100,
50076
+ limit: 50
50077
+ }
49271
50078
  }
49272
50079
  ]
49273
50080
  })
@@ -49276,15 +50083,39 @@ var handler6 = async (provider, args) => {
49276
50083
  if (!provider.readFile) {
49277
50084
  return createProviderErrorResponse("read file");
49278
50085
  }
49279
- const { path: paths, includeIgnored } = toolInfo6.parameters.parse(args);
50086
+ const parsed = toolInfo6.parameters.safeParse(args);
50087
+ if (!parsed.success) {
50088
+ return {
50089
+ success: false,
50090
+ message: {
50091
+ type: "error-text",
50092
+ value: `Invalid arguments for readFile: ${parsed.error.message}`
50093
+ }
50094
+ };
50095
+ }
50096
+ const { path: paths, offset, limit, includeIgnored } = parsed.data;
49280
50097
  const resp = [];
49281
50098
  for (const path of paths) {
49282
50099
  const fileContent = await provider.readFile(path, includeIgnored ?? false);
49283
50100
  if (!fileContent) {
49284
50101
  resp.push(createFileElement("read_file_file_content", path, undefined, { file_not_found: "true" }));
49285
- } else {
49286
- resp.push(createFileElement("read_file_file_content", path, fileContent));
50102
+ continue;
49287
50103
  }
50104
+ let lines = fileContent.split(`
50105
+ `);
50106
+ const start = offset ?? 0;
50107
+ const end = limit ? start + limit : lines.length;
50108
+ if (offset !== undefined || limit !== undefined) {
50109
+ lines = lines.slice(start, end);
50110
+ }
50111
+ const lineOffset = offset ?? 0;
50112
+ const numberedContent = lines.map((line, i) => {
50113
+ const lineNumber = lineOffset + i + 1;
50114
+ const paddedNumber = String(lineNumber).padStart(6, " ");
50115
+ return `${paddedNumber}→${line}`;
50116
+ }).join(`
50117
+ `);
50118
+ resp.push(createFileElement("read_file_file_content", path, numberedContent));
49288
50119
  }
49289
50120
  return {
49290
50121
  success: true,
@@ -49481,7 +50312,43 @@ var replaceInFile = (fileContent, diff) => {
49481
50312
  // ../core/src/tools/replaceInFile.ts
49482
50313
  var toolInfo9 = {
49483
50314
  name: "replaceInFile",
49484
- description: "Request to replace sections of content in an existing file using SEARCH/REPLACE blocks that define exact changes to specific parts of the file. This tool should be used when you need to make targeted changes to specific parts of a file.",
50315
+ description: `Request to replace sections of content in an existing file using
50316
+ SEARCH/REPLACE blocks.
50317
+
50318
+ When to use:
50319
+ - Making targeted changes to specific parts of a file
50320
+ - Replacing variable names, function signatures, imports
50321
+ - Fixing bugs in existing code
50322
+ - When you know the exact content to replace
50323
+
50324
+ When NOT to use:
50325
+ - For creating new files: Use writeToFile instead
50326
+ - For completely replacing file contents: Use writeToFile instead
50327
+ - When you don't know the exact content: Read file first
50328
+
50329
+ SEARCH/REPLACE FORMAT:
50330
+ <<<<<<< SEARCH
50331
+ [exact content to find]
50332
+ =======
50333
+ [new content to replace with]
50334
+ >>>>>>> REPLACE
50335
+
50336
+ Critical rules:
50337
+ 1. SEARCH content must match EXACTLY (character-for-character including whitespace)
50338
+ 2. Each block replaces only first occurrence
50339
+ 3. Include just enough lines for uniqueness (not too many, not too few)
50340
+ 4. Keep blocks concise (don't include long unchanged sections)
50341
+ 5. List blocks in order they appear in file
50342
+ 6. Use multiple blocks for multiple independent changes
50343
+
50344
+ Special operations:
50345
+ - Move code: Two blocks (delete from original + insert at new location)
50346
+ - Delete code: Empty REPLACE section
50347
+
50348
+ IMPORTANT CONSTRAINTS:
50349
+ - SEARCH text must match file content exactly
50350
+ - Each block is independent (doesn't affect other blocks)
50351
+ - Cannot use for appending or inserting without SEARCH context`,
49485
50352
  parameters: exports_external.object({
49486
50353
  path: exports_external.string().describe("The path of the file to modify").meta({ usageValue: "File path here" }),
49487
50354
  diff: exports_external.string().describe(`One or more SEARCH/REPLACE blocks following this exact format:
@@ -49507,7 +50374,7 @@ Critical rules:
49507
50374
  * Each line must be complete. Never truncate lines mid-way through as this can cause matching failures.
49508
50375
  4. Special operations:
49509
50376
  * To move code: Use two SEARCH/REPLACE blocks (one to delete from original + one to insert at new location)
49510
- * To delete code: Use empty REPLACE section`).meta({ usageValue: "Search and replace blocks here" })
50377
+ * To delete code: Empty REPLACE section`).meta({ usageValue: "Search and replace blocks here" })
49511
50378
  }).meta({
49512
50379
  examples: [
49513
50380
  {
@@ -49835,7 +50702,27 @@ var UpdateTodoItemOutputSchema = exports_external.object({
49835
50702
  // ../core/src/tools/writeToFile.ts
49836
50703
  var toolInfo12 = {
49837
50704
  name: "writeToFile",
49838
- description: "Request to write content to a file at the specified path. If the file exists, it will be overwritten with the provided content. If the file doesn't exist, it will be created. This tool will automatically create any directories needed to write the file. Ensure that the output content does not include incorrect escaped character patterns such as `&lt;`, `&gt;`, or `&amp;`. Also ensure there is no unwanted CDATA tags in the content.",
50705
+ description: `Request to write content to a file at the specified path.
50706
+
50707
+ When to use:
50708
+ - Creating new files
50709
+ - Completely replacing file contents
50710
+ - When you have the complete intended content
50711
+
50712
+ When NOT to use:
50713
+ - For modifying existing files: Use replaceInFile instead
50714
+ - For appending content: Use executeCommand with echo >> instead
50715
+ - For targeted edits: Use replaceInFile instead
50716
+
50717
+ Features:
50718
+ - Automatically creates any directories needed
50719
+ - Overwrites existing files completely
50720
+ - Must provide complete file content (no truncation)
50721
+
50722
+ IMPORTANT CONSTRAINT:
50723
+ - Always provide COMPLETE intended content (no omissions)
50724
+ - Ensure no incorrect escape sequences (&lt;, &gt;, &amp;)
50725
+ - Ensure no unwanted CDATA tags in content`,
49839
50726
  parameters: exports_external.object({
49840
50727
  path: exports_external.string().describe("The path of the file to write to").meta({ usageValue: "File path here" }),
49841
50728
  content: exports_external.string().describe("The content to write to the file. ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified.").meta({ usageValue: "Your file content here" })
@@ -49876,10 +50763,7 @@ var handler12 = async (provider, args) => {
49876
50763
  }
49877
50764
  };
49878
50765
  }
49879
- let { path, content } = parsed.data;
49880
- const trimmedContent = content.trim();
49881
- if (trimmedContent.startsWith("<![CDATA[") && trimmedContent.endsWith("]]>"))
49882
- content = trimmedContent.slice(9, -3);
50766
+ const { path, content } = parsed.data;
49883
50767
  await provider.writeFile(path, content);
49884
50768
  return {
49885
50769
  success: true,
@@ -53028,9 +53912,9 @@ class ZodUnion2 extends ZodType2 {
53028
53912
  return this._def.options;
53029
53913
  }
53030
53914
  }
53031
- ZodUnion2.create = (types2, params) => {
53915
+ ZodUnion2.create = (types3, params) => {
53032
53916
  return new ZodUnion2({
53033
- options: types2,
53917
+ options: types3,
53034
53918
  typeName: ZodFirstPartyTypeKind2.ZodUnion,
53035
53919
  ...processCreateParams(params)
53036
53920
  });
@@ -55524,15 +56408,15 @@ var primitiveMappings = {
55524
56408
  function parseUnionDef(def, refs) {
55525
56409
  const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;
55526
56410
  if (options.every((x) => (x._def.typeName in primitiveMappings) && (!x._def.checks || !x._def.checks.length))) {
55527
- const types2 = options.reduce((types22, x) => {
56411
+ const types3 = options.reduce((types22, x) => {
55528
56412
  const type = primitiveMappings[x._def.typeName];
55529
56413
  return type && !types22.includes(type) ? [...types22, type] : types22;
55530
56414
  }, []);
55531
56415
  return {
55532
- type: types2.length > 1 ? types2 : types2[0]
56416
+ type: types3.length > 1 ? types3 : types3[0]
55533
56417
  };
55534
56418
  } else if (options.every((x) => x._def.typeName === "ZodLiteral" && !x.description)) {
55535
- const types2 = options.reduce((acc, x) => {
56419
+ const types3 = options.reduce((acc, x) => {
55536
56420
  const type = typeof x._def.value;
55537
56421
  switch (type) {
55538
56422
  case "string":
@@ -55551,8 +56435,8 @@ function parseUnionDef(def, refs) {
55551
56435
  return acc;
55552
56436
  }
55553
56437
  }, []);
55554
- if (types2.length === options.length) {
55555
- const uniqueTypes = types2.filter((x, i, a) => a.indexOf(x) === i);
56438
+ if (types3.length === options.length) {
56439
+ const uniqueTypes = types3.filter((x, i, a) => a.indexOf(x) === i);
55556
56440
  return {
55557
56441
  type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],
55558
56442
  enum: options.reduce((acc, x) => {
@@ -60290,9 +61174,9 @@ var moduleExports2 = freeModule2 && freeModule2.exports === freeExports2;
60290
61174
  var freeProcess = moduleExports2 && _freeGlobal_default.process;
60291
61175
  var nodeUtil = function() {
60292
61176
  try {
60293
- var types3 = freeModule2 && freeModule2.require && freeModule2.require("util").types;
60294
- if (types3) {
60295
- return types3;
61177
+ var types4 = freeModule2 && freeModule2.require && freeModule2.require("util").types;
61178
+ if (types4) {
61179
+ return types4;
60296
61180
  }
60297
61181
  return freeProcess && freeProcess.binding && freeProcess.binding("util");
60298
61182
  } catch (e) {}
@@ -60992,6 +61876,37 @@ var readLocalConfig = (path) => {
60992
61876
  return;
60993
61877
  }
60994
61878
  };
61879
+ // src/memory-manager.ts
61880
+ class MemoryManager {
61881
+ store;
61882
+ constructor(store, _cwd) {
61883
+ this.store = store;
61884
+ }
61885
+ async readMemory(topic) {
61886
+ return this.store.readMemory(topic);
61887
+ }
61888
+ async updateMemory(operation, topic, content, metadata) {
61889
+ return this.store.updateMemory(operation, topic, content, metadata);
61890
+ }
61891
+ async queryMemory(query = {}, options) {
61892
+ const finalQuery = {
61893
+ ...query
61894
+ };
61895
+ if (!options?.operation && !finalQuery.limit) {
61896
+ finalQuery.limit = 1000;
61897
+ }
61898
+ return this.store.queryMemory(finalQuery, options);
61899
+ }
61900
+ async batchUpdateMemory(operations) {
61901
+ return this.store.batchUpdateMemory(operations);
61902
+ }
61903
+ async getStats() {
61904
+ return this.store.getStats();
61905
+ }
61906
+ close() {
61907
+ this.store.close();
61908
+ }
61909
+ }
60995
61910
  // src/provider.ts
60996
61911
  import { spawn as spawn2 } from "node:child_process";
60997
61912
  import { mkdir, readFile as readFile2, rename, unlink, writeFile } from "node:fs/promises";
@@ -64357,7 +65272,7 @@ function lookup(path) {
64357
65272
  }
64358
65273
  return $types[extension2] || false;
64359
65274
  }
64360
- function populateMaps(extensions, types5) {
65275
+ function populateMaps(extensions, types6) {
64361
65276
  Object.keys(db).forEach(function forEachMimeType(type) {
64362
65277
  var mime = db[type];
64363
65278
  var exts = mime.extensions;
@@ -64367,10 +65282,10 @@ function populateMaps(extensions, types5) {
64367
65282
  extensions[type] = exts;
64368
65283
  for (var i2 = 0;i2 < exts.length; i2++) {
64369
65284
  var extension2 = exts[i2];
64370
- types5[extension2] = _preferredType(extension2, types5[extension2], type);
64371
- const legacyType = _preferredTypeLegacy(extension2, types5[extension2], type);
64372
- if (legacyType !== types5[extension2]) {
64373
- $_extensionConflicts.push([extension2, legacyType, types5[extension2]]);
65285
+ types6[extension2] = _preferredType(extension2, types6[extension2], type);
65286
+ const legacyType = _preferredTypeLegacy(extension2, types6[extension2], type);
65287
+ if (legacyType !== types6[extension2]) {
65288
+ $_extensionConflicts.push([extension2, legacyType, types6[extension2]]);
64374
65289
  }
64375
65290
  }
64376
65291
  });
@@ -64675,35 +65590,35 @@ var getProvider = (options = {}) => {
64675
65590
  }
64676
65591
  },
64677
65592
  listMemoryTopics: async () => {
64678
- const memory = await memoryStore.read() ?? {};
64679
- return Object.keys(memory);
65593
+ const memory2 = await memoryStore.read() ?? {};
65594
+ return Object.keys(memory2);
64680
65595
  },
64681
65596
  readMemory: async (topic = defaultMemoryTopic) => {
64682
- const memory = await memoryStore.read() ?? {};
64683
- return memory[topic];
65597
+ const memory2 = await memoryStore.read() ?? {};
65598
+ return memory2[topic];
64684
65599
  },
64685
65600
  updateMemory: async (operation, topic, content) => {
64686
65601
  const memoryTopic = topic ?? defaultMemoryTopic;
64687
- const memory = await memoryStore.read() ?? {};
65602
+ const memory2 = await memoryStore.read() ?? {};
64688
65603
  switch (operation) {
64689
65604
  case "append":
64690
65605
  if (content === undefined) {
64691
65606
  throw new Error("Content is required for append operation.");
64692
65607
  }
64693
- memory[memoryTopic] = `${memory[memoryTopic] || ""}
65608
+ memory2[memoryTopic] = `${memory2[memoryTopic] || ""}
64694
65609
  ${content}`;
64695
65610
  break;
64696
65611
  case "replace":
64697
65612
  if (content === undefined) {
64698
65613
  throw new Error("Content is required for replace operation.");
64699
65614
  }
64700
- memory[memoryTopic] = content;
65615
+ memory2[memoryTopic] = content;
64701
65616
  break;
64702
65617
  case "remove":
64703
- delete memory[memoryTopic];
65618
+ delete memory2[memoryTopic];
64704
65619
  break;
64705
65620
  }
64706
- await memoryStore.write(memory);
65621
+ await memoryStore.write(memory2);
64707
65622
  },
64708
65623
  readFile: async (path, includeIgnored) => {
64709
65624
  if (!includeIgnored && ig.ignores(path)) {
@@ -64870,6 +65785,409 @@ ${content}`;
64870
65785
  }
64871
65786
  return provider2;
64872
65787
  };
65788
+ // src/sqlite-memory-store.ts
65789
+ var import_better_sqlite3 = __toESM(require_lib2(), 1);
65790
+ import { randomUUID } from "node:crypto";
65791
+ import { existsSync as existsSync2 } from "node:fs";
65792
+ import { mkdir as mkdir2, rename as rename2 } from "node:fs/promises";
65793
+ import { dirname as dirname2, resolve as resolve4 } from "node:path";
65794
+
65795
+ class SQLiteMemoryStore {
65796
+ db = null;
65797
+ dbPromise = null;
65798
+ config;
65799
+ currentScope;
65800
+ maxRetries = 3;
65801
+ retryDelay = 100;
65802
+ static SORT_COLUMNS = {
65803
+ created: "created_at",
65804
+ updated: "updated_at",
65805
+ accessed: "last_accessed",
65806
+ name: "name"
65807
+ };
65808
+ static ALLOWED_SORT_ORDERS = ["asc", "desc"];
65809
+ static ALLOWED_PRIORITIES = ["low", "medium", "high", "critical"];
65810
+ constructor(config3, scope) {
65811
+ this.config = config3;
65812
+ this.currentScope = scope;
65813
+ }
65814
+ async initializeDatabase() {
65815
+ if (this.dbPromise) {
65816
+ return this.dbPromise;
65817
+ }
65818
+ this.dbPromise = (async () => {
65819
+ if (this.db) {
65820
+ return this.db;
65821
+ }
65822
+ const dbPath = this.resolvePath(this.config.path || "~/.config/polka-codes/memory.sqlite");
65823
+ try {
65824
+ const dir = dirname2(dbPath);
65825
+ if (!existsSync2(dir)) {
65826
+ await mkdir2(dir, { recursive: true, mode: 448 });
65827
+ }
65828
+ if (!existsSync2(dbPath)) {
65829
+ const { openSync, closeSync } = await import("node:fs");
65830
+ const fd = openSync(dbPath, "w");
65831
+ closeSync(fd);
65832
+ await import("node:fs/promises").then((fs4) => fs4.chmod(dbPath, 384));
65833
+ }
65834
+ const db2 = new import_better_sqlite3.default(dbPath, {
65835
+ verbose: process.env.SQLITE_DEBUG ? console.log : undefined
65836
+ });
65837
+ this.configurePragmas(db2);
65838
+ this.checkIntegrity(db2);
65839
+ this.initializeSchema(db2);
65840
+ this.db = db2;
65841
+ return db2;
65842
+ } catch (error48) {
65843
+ console.error("[SQLiteMemoryStore] Initialization failed:", error48);
65844
+ if (existsSync2(dbPath)) {
65845
+ const backupPath = `${dbPath}.corrupted.${Date.now()}`;
65846
+ console.warn(`[SQLiteMemoryStore] Backing up corrupted database to: ${backupPath}`);
65847
+ try {
65848
+ await rename2(dbPath, backupPath);
65849
+ } catch (backupError) {
65850
+ console.error("[SQLiteMemoryStore] Failed to backup corrupted database:", backupError);
65851
+ this.dbPromise = null;
65852
+ throw backupError;
65853
+ }
65854
+ this.dbPromise = null;
65855
+ return this.initializeDatabase();
65856
+ }
65857
+ this.dbPromise = null;
65858
+ throw error48;
65859
+ }
65860
+ })();
65861
+ return this.dbPromise;
65862
+ }
65863
+ configurePragmas(db2) {
65864
+ db2.pragma("journal_mode = WAL");
65865
+ db2.pragma("synchronous = NORMAL");
65866
+ db2.pragma("busy_timeout = 5000");
65867
+ db2.pragma("foreign_keys = ON");
65868
+ db2.pragma("temp_store = MEMORY");
65869
+ db2.pragma("mmap_size = 30000000000");
65870
+ db2.pragma("page_size = 4096");
65871
+ }
65872
+ checkIntegrity(db2) {
65873
+ try {
65874
+ const result = db2.pragma("integrity_check", { simple: true });
65875
+ if (result !== "ok") {
65876
+ throw new Error(`Database integrity check failed: ${result}`);
65877
+ }
65878
+ } catch (error48) {
65879
+ console.error("[SQLiteMemoryStore] Integrity check failed:", error48);
65880
+ throw new Error("Database is corrupted");
65881
+ }
65882
+ }
65883
+ initializeSchema(db2) {
65884
+ db2.exec(`
65885
+ CREATE TABLE IF NOT EXISTS memory_entries (
65886
+ id TEXT PRIMARY KEY,
65887
+ name TEXT NOT NULL CHECK(length(name) > 0),
65888
+ scope TEXT NOT NULL CHECK(scope IN ('global') OR scope LIKE 'project:%'),
65889
+ content TEXT NOT NULL CHECK(length(content) > 0),
65890
+ entry_type TEXT NOT NULL CHECK(length(entry_type) > 0),
65891
+ status TEXT CHECK(status IS NULL OR length(status) > 0),
65892
+ priority TEXT CHECK(priority IS NULL OR priority IN ('low', 'medium', 'high', 'critical')),
65893
+ tags TEXT CHECK(tags IS NULL OR length(tags) > 0),
65894
+ metadata TEXT CHECK(metadata IS NULL OR json_valid(metadata)),
65895
+ created_at INTEGER NOT NULL CHECK(created_at > 0),
65896
+ updated_at INTEGER NOT NULL CHECK(updated_at > 0),
65897
+ last_accessed INTEGER NOT NULL CHECK(last_accessed > 0),
65898
+ UNIQUE(name, scope)
65899
+ )
65900
+ `);
65901
+ db2.exec(`
65902
+ CREATE INDEX IF NOT EXISTS idx_memory_entries_scope_type ON memory_entries(scope, entry_type);
65903
+ CREATE INDEX IF NOT EXISTS idx_memory_entries_updated ON memory_entries(updated_at);
65904
+ `);
65905
+ }
65906
+ async getDatabase() {
65907
+ if (!this.db) {
65908
+ this.db = await this.initializeDatabase();
65909
+ }
65910
+ return this.db;
65911
+ }
65912
+ resolvePath(path) {
65913
+ if (path.startsWith("~")) {
65914
+ const home = process.env.HOME || process.env.USERPROFILE || ".";
65915
+ if (home === ".") {
65916
+ throw new Error("Cannot resolve home directory");
65917
+ }
65918
+ const expanded = `${home}${path.slice(1)}`;
65919
+ const resolved = resolve4(expanded);
65920
+ const sep = process.platform === "win32" ? "\\" : "/";
65921
+ if (resolved !== home && !resolved.startsWith(home + sep)) {
65922
+ throw new Error(`Path escapes home directory: ${path}`);
65923
+ }
65924
+ return resolved;
65925
+ }
65926
+ return resolve4(path);
65927
+ }
65928
+ generateUUID() {
65929
+ return randomUUID();
65930
+ }
65931
+ now() {
65932
+ return Date.now();
65933
+ }
65934
+ sleep(ms) {
65935
+ return new Promise((resolve5) => setTimeout(resolve5, ms));
65936
+ }
65937
+ isRetryableError(error48) {
65938
+ if (error48 instanceof Error) {
65939
+ const message = error48.message.toLowerCase();
65940
+ return message.includes("database is locked") || message.includes("database is busy") || message.includes("sqlite_busy") || message.includes("sqlite_locked");
65941
+ }
65942
+ return false;
65943
+ }
65944
+ async transaction(callback, options = {}) {
65945
+ const db2 = await this.getDatabase();
65946
+ const retries = options.retries ?? this.maxRetries;
65947
+ for (let attempt = 0;attempt < retries; attempt++) {
65948
+ try {
65949
+ db2.exec("BEGIN IMMEDIATE");
65950
+ const result = await callback();
65951
+ db2.exec("COMMIT");
65952
+ return result;
65953
+ } catch (error48) {
65954
+ try {
65955
+ db2.exec("ROLLBACK");
65956
+ } catch (rollbackError) {
65957
+ console.error("[SQLiteMemoryStore] Rollback failed:", rollbackError);
65958
+ }
65959
+ const isRetryable = this.isRetryableError(error48);
65960
+ if (isRetryable && attempt < retries - 1) {
65961
+ const delay2 = this.retryDelay * 2 ** attempt;
65962
+ console.warn(`[SQLiteMemoryStore] Retryable error, retrying in ${delay2}ms...`);
65963
+ await this.sleep(delay2);
65964
+ continue;
65965
+ }
65966
+ throw error48;
65967
+ }
65968
+ }
65969
+ throw new Error("Maximum retries exceeded");
65970
+ }
65971
+ async readMemory(topic) {
65972
+ const db2 = await this.getDatabase();
65973
+ const scope = this.currentScope;
65974
+ return this.transaction(async () => {
65975
+ const stmt = db2.prepare("SELECT content FROM memory_entries WHERE name = ? AND scope = ?");
65976
+ const row = stmt.get(topic, scope);
65977
+ if (row) {
65978
+ const updateStmt = db2.prepare("UPDATE memory_entries SET last_accessed = ? WHERE name = ? AND scope = ?");
65979
+ updateStmt.run(this.now(), topic, scope);
65980
+ }
65981
+ return row?.content;
65982
+ });
65983
+ }
65984
+ async updateMemoryInternal(db2, operation, topic, content, metadata) {
65985
+ const scope = this.currentScope;
65986
+ const now = this.now();
65987
+ if (operation === "remove") {
65988
+ const stmt = db2.prepare("DELETE FROM memory_entries WHERE name = ? AND scope = ?");
65989
+ stmt.run(topic, scope);
65990
+ return;
65991
+ }
65992
+ const existingStmt = db2.prepare("SELECT content, entry_type, status, priority, tags FROM memory_entries WHERE name = ? AND scope = ?");
65993
+ const existing = existingStmt.get(topic, scope);
65994
+ let finalContent;
65995
+ let entry_type;
65996
+ let status;
65997
+ let priority;
65998
+ let tags;
65999
+ if (existing) {
66000
+ if (operation === "append") {
66001
+ if (!content) {
66002
+ throw new Error("Content is required for append operation.");
66003
+ }
66004
+ finalContent = `${existing.content}
66005
+ ${content}`;
66006
+ } else {
66007
+ if (!content) {
66008
+ throw new Error("Content is required for replace operation.");
66009
+ }
66010
+ finalContent = content;
66011
+ }
66012
+ entry_type = metadata?.entry_type || existing.entry_type;
66013
+ status = metadata?.status || existing.status;
66014
+ priority = metadata?.priority || existing.priority;
66015
+ tags = metadata?.tags || existing.tags;
66016
+ } else {
66017
+ if (!content) {
66018
+ throw new Error("Content is required for new memory entries.");
66019
+ }
66020
+ finalContent = content;
66021
+ entry_type = metadata?.entry_type || "note";
66022
+ status = metadata?.status;
66023
+ priority = metadata?.priority;
66024
+ tags = metadata?.tags;
66025
+ }
66026
+ const upsertStmt = db2.prepare(`
66027
+ INSERT INTO memory_entries (id, name, scope, content, entry_type, status, priority, tags, created_at, updated_at, last_accessed)
66028
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
66029
+ ON CONFLICT(name, scope) DO UPDATE SET
66030
+ content = excluded.content,
66031
+ entry_type = excluded.entry_type,
66032
+ status = excluded.status,
66033
+ priority = excluded.priority,
66034
+ tags = excluded.tags,
66035
+ updated_at = excluded.updated_at,
66036
+ last_accessed = excluded.last_accessed
66037
+ `);
66038
+ upsertStmt.run(this.generateUUID(), topic, scope, finalContent, entry_type, status || null, priority || null, tags || null, now, now, now);
66039
+ }
66040
+ async updateMemory(operation, topic, content, metadata) {
66041
+ return this.transaction(async () => {
66042
+ const db2 = await this.getDatabase();
66043
+ await this.updateMemoryInternal(db2, operation, topic, content, metadata);
66044
+ });
66045
+ }
66046
+ async queryMemory(query = {}, options = {}) {
66047
+ const db2 = await this.getDatabase();
66048
+ const { sql, params } = this.buildQuery(query, options);
66049
+ if (options.operation === "count") {
66050
+ const countStmt = db2.prepare(`SELECT COUNT(*) as count FROM (${sql})`);
66051
+ const result = countStmt.get(...params);
66052
+ return result.count;
66053
+ }
66054
+ if (options.operation === "delete") {
66055
+ const deleteStmt = db2.prepare(`DELETE FROM memory_entries WHERE id IN (SELECT id FROM (${sql}))`);
66056
+ const info = deleteStmt.run(...params);
66057
+ return info.changes;
66058
+ }
66059
+ const stmt = db2.prepare(sql);
66060
+ return stmt.all(...params);
66061
+ }
66062
+ buildQuery(query, _options) {
66063
+ const conditions = [];
66064
+ const params = [];
66065
+ let sql = "SELECT * FROM memory_entries WHERE 1=1";
66066
+ const scope = query.scope === "auto" ? this.currentScope : query.scope;
66067
+ if (scope === "global") {
66068
+ conditions.push("scope = ?");
66069
+ params.push("global");
66070
+ } else if (scope === "project" || !scope && this.currentScope !== "global") {
66071
+ conditions.push("scope = ?");
66072
+ params.push(this.currentScope);
66073
+ }
66074
+ if (query.type) {
66075
+ if (!query.type.trim()) {
66076
+ throw new Error("Type cannot be empty");
66077
+ }
66078
+ conditions.push("entry_type = ?");
66079
+ params.push(query.type.trim());
66080
+ }
66081
+ if (query.status) {
66082
+ conditions.push("status = ?");
66083
+ params.push(query.status);
66084
+ }
66085
+ if (query.priority) {
66086
+ if (!SQLiteMemoryStore.ALLOWED_PRIORITIES.includes(query.priority)) {
66087
+ throw new Error(`Invalid priority: ${query.priority}`);
66088
+ }
66089
+ conditions.push("priority = ?");
66090
+ params.push(query.priority);
66091
+ }
66092
+ if (query.tags) {
66093
+ const tags = Array.isArray(query.tags) ? query.tags : [query.tags];
66094
+ for (const tag of tags) {
66095
+ const trimmed = tag.trim();
66096
+ if (!trimmed) {
66097
+ throw new Error("Tags cannot be empty");
66098
+ }
66099
+ conditions.push("(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)");
66100
+ params.push(trimmed, `${trimmed},%`, `%,${trimmed}`, `%,${trimmed},%`);
66101
+ }
66102
+ }
66103
+ if (query.search) {
66104
+ const searchTerm = query.search.trim();
66105
+ const sanitized = searchTerm.replace(/[\\_%]/g, "\\$&");
66106
+ conditions.push("(content LIKE ? OR name LIKE ?)");
66107
+ params.push(`%${sanitized}%`, `%${sanitized}%`);
66108
+ }
66109
+ if (query.createdAfter) {
66110
+ conditions.push("created_at >= ?");
66111
+ params.push(query.createdAfter);
66112
+ }
66113
+ if (query.createdBefore) {
66114
+ conditions.push("created_at <= ?");
66115
+ params.push(query.createdBefore);
66116
+ }
66117
+ if (query.updatedAfter) {
66118
+ conditions.push("updated_at >= ?");
66119
+ params.push(query.updatedAfter);
66120
+ }
66121
+ if (query.updatedBefore) {
66122
+ conditions.push("updated_at <= ?");
66123
+ params.push(query.updatedBefore);
66124
+ }
66125
+ if (conditions.length > 0) {
66126
+ sql += ` AND ${conditions.join(" AND ")}`;
66127
+ }
66128
+ if (query.sortBy) {
66129
+ const column = SQLiteMemoryStore.SORT_COLUMNS[query.sortBy];
66130
+ if (!column) {
66131
+ throw new Error(`Invalid sortBy: ${query.sortBy}`);
66132
+ }
66133
+ const order = query.sortOrder || "desc";
66134
+ if (!SQLiteMemoryStore.ALLOWED_SORT_ORDERS.includes(order)) {
66135
+ throw new Error(`Invalid sortOrder: ${order}`);
66136
+ }
66137
+ sql += ` ORDER BY ${column} ${order.toUpperCase()}`;
66138
+ }
66139
+ if (query.limit) {
66140
+ const limit = Number(query.limit);
66141
+ if (Number.isNaN(limit) || limit < 1 || limit > 1e4) {
66142
+ throw new Error("Limit must be between 1 and 10000");
66143
+ }
66144
+ sql += " LIMIT ?";
66145
+ params.push(limit);
66146
+ if (query.offset) {
66147
+ const offset = Number(query.offset);
66148
+ if (Number.isNaN(offset) || offset < 0) {
66149
+ throw new Error("Offset must be >= 0");
66150
+ }
66151
+ sql += " OFFSET ?";
66152
+ params.push(offset);
66153
+ }
66154
+ }
66155
+ return { sql, params };
66156
+ }
66157
+ async batchUpdateMemory(operations) {
66158
+ return this.transaction(async () => {
66159
+ const db2 = await this.getDatabase();
66160
+ for (const op of operations) {
66161
+ await this.updateMemoryInternal(db2, op.operation, op.name, op.content, op.metadata);
66162
+ }
66163
+ });
66164
+ }
66165
+ close() {
66166
+ if (this.db) {
66167
+ this.db.close();
66168
+ this.db = null;
66169
+ }
66170
+ }
66171
+ async getStats() {
66172
+ const db2 = await this.getDatabase();
66173
+ const countStmt = db2.prepare("SELECT COUNT(*) as count FROM memory_entries");
66174
+ const { count: totalEntries } = countStmt.get();
66175
+ const typeStmt = db2.prepare("SELECT entry_type, COUNT(*) as count FROM memory_entries GROUP BY entry_type");
66176
+ const typeRows = typeStmt.all();
66177
+ const entriesByType = Object.fromEntries(typeRows.map((r2) => [r2.entry_type, r2.count]));
66178
+ const dbPath = this.resolvePath(this.config.path || "~/.config/polka-codes/memory.sqlite");
66179
+ let databaseSize = 0;
66180
+ try {
66181
+ const stats = await import("node:fs/promises").then((fs4) => fs4.stat(dbPath));
66182
+ databaseSize = stats.size;
66183
+ } catch {}
66184
+ return {
66185
+ totalEntries,
66186
+ entriesByType,
66187
+ databaseSize
66188
+ };
66189
+ }
66190
+ }
64873
66191
  // src/utils/eventHandler.ts
64874
66192
  import { Console } from "node:console";
64875
66193
 
@@ -65630,7 +66948,7 @@ Tool error:`, event.tool));
65630
66948
  // src/utils/readMultiline.ts
65631
66949
  import readline3 from "node:readline";
65632
66950
  function readMultiline(prompt = "Enter text (Ctrl+D to finish):") {
65633
- return new Promise((resolve4) => {
66951
+ return new Promise((resolve5) => {
65634
66952
  console.log(prompt);
65635
66953
  const rl = readline3.createInterface({
65636
66954
  input: process.stdin,
@@ -65642,7 +66960,7 @@ function readMultiline(prompt = "Enter text (Ctrl+D to finish):") {
65642
66960
  lines.push(line);
65643
66961
  });
65644
66962
  rl.on("close", () => {
65645
- resolve4(lines.join(`
66963
+ resolve5(lines.join(`
65646
66964
  `));
65647
66965
  });
65648
66966
  });
@@ -65666,5 +66984,7 @@ export {
65666
66984
  getGlobalConfigPath,
65667
66985
  configSchema,
65668
66986
  checkRipgrep,
66987
+ SQLiteMemoryStore,
66988
+ MemoryManager,
65669
66989
  InMemoryStore
65670
66990
  };