mnemospark 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -701,10 +701,43 @@ type CreateCloudCommandOptions = {
701
701
  requestStorageLsFn?: (request: StorageLsRequest, options?: ProxyStorageOptions) => Promise<StorageLsResponse>;
702
702
  requestStorageDownloadFn?: (request: StorageObjectRequest, options?: ProxyStorageOptions) => Promise<StorageDownloadProxyResponse>;
703
703
  requestStorageDeleteFn?: (request: StorageObjectRequest, options?: ProxyStorageOptions) => Promise<StorageDeleteResponse>;
704
+ openClawCronAdapter?: OpenClawCronAdapter;
704
705
  subagentOrchestrator?: MnemosparkSubagentOrchestrator;
705
706
  proxyStorageOptions?: ProxyStorageOptions;
706
707
  mnemosparkHomeDir?: string;
707
708
  };
709
+ type OpenClawCronSchedule = {
710
+ kind: "cron";
711
+ expr: string;
712
+ tz: string;
713
+ };
714
+ type OpenClawCronPayload = {
715
+ kind: "agentTurn";
716
+ message: string;
717
+ };
718
+ type OpenClawCronDelivery = {
719
+ mode: "announce";
720
+ text: string;
721
+ };
722
+ type OpenClawCronJobEntry = {
723
+ jobId: string;
724
+ name: string;
725
+ schedule: OpenClawCronSchedule;
726
+ payload: OpenClawCronPayload;
727
+ sessionTarget: "isolated";
728
+ delivery: OpenClawCronDelivery;
729
+ };
730
+ type OpenClawCronJobForLookup = {
731
+ jobId: string;
732
+ message: string;
733
+ };
734
+ type OpenClawCronAdapter = {
735
+ add: (job: OpenClawCronJobEntry) => Promise<{
736
+ jobId: string;
737
+ }>;
738
+ remove: (jobId: string) => Promise<boolean>;
739
+ list: () => Promise<OpenClawCronJobForLookup[]>;
740
+ };
708
741
  declare function createCloudCommand(options?: CreateCloudCommandOptions): OpenClawPluginCommandDefinition;
709
742
 
710
743
  /**
package/dist/index.js CHANGED
@@ -3025,7 +3025,7 @@ import {
3025
3025
  randomUUID as randomUUID3
3026
3026
  } from "crypto";
3027
3027
  import { createReadStream as createReadStream2, statfsSync } from "fs";
3028
- import { appendFile as appendFile2, lstat, mkdir as mkdir5, readFile as readFile3, readdir as readdir2, rm, stat as stat2, writeFile as writeFile3 } from "fs/promises";
3028
+ import { lstat, mkdir as mkdir5, readFile as readFile3, readdir as readdir2, rm, stat as stat2, writeFile as writeFile3 } from "fs/promises";
3029
3029
  import { homedir as homedir6 } from "os";
3030
3030
  import { basename as basename2, dirname as dirname5, join as join8, resolve as resolve2 } from "path";
3031
3031
  import { privateKeyToAccount as privateKeyToAccount5 } from "viem/accounts";
@@ -3811,7 +3811,6 @@ async function createCloudDatastore(homeDir) {
3811
3811
  var SUPPORTED_BACKUP_PLATFORMS = /* @__PURE__ */ new Set(["darwin", "linux"]);
3812
3812
  var BACKUP_DIR_SUBPATH = join8(".openclaw", "mnemospark", "backup");
3813
3813
  var DEFAULT_BACKUP_DIR = join8(homedir6(), BACKUP_DIR_SUBPATH);
3814
- var CRON_TABLE_SUBPATH = join8(".openclaw", "mnemospark", "crontab.txt");
3815
3814
  var BLOCKRUN_WALLET_KEY_SUBPATH = join8(".openclaw", "blockrun", "wallet.key");
3816
3815
  var MNEMOSPARK_WALLET_KEY_SUBPATH = join8(".openclaw", "mnemospark", "wallet", "wallet.key");
3817
3816
  var INLINE_UPLOAD_MAX_BYTES = 45e5;
@@ -3819,7 +3818,7 @@ var PAYMENT_CRON_SCHEDULE = "0 0 1 * *";
3819
3818
  var TAR_OVERHEAD_BYTES = 10 * 1024 * 1024;
3820
3819
  var QUOTE_VALIDITY_USER_NOTE = "Quotes are valid for one hour. Please run price-storage again if you need a new quote.";
3821
3820
  var MNEMOSPARK_SUPPORT_EMAIL = "pluggedin@mnemospark.ai";
3822
- var CLOUD_HELP_FOOTER_STATE = "Local state: mnemospark records quotes, objects, payments, cron jobs, friendly names, and operation metadata in ~/.openclaw/mnemospark/state.db (SQLite). For troubleshooting and correlation, commands and the HTTP proxy append structured JSON lines to ~/.openclaw/mnemospark/events.jsonl. Monthly storage billing jobs are listed in ~/.openclaw/mnemospark/crontab.txt for your system scheduler.";
3821
+ var CLOUD_HELP_FOOTER_STATE = "Local state: mnemospark records quotes, objects, payments, cron jobs, friendly names, and operation metadata in ~/.openclaw/mnemospark/state.db (SQLite). For troubleshooting and correlation, commands and the HTTP proxy append structured JSON lines to ~/.openclaw/mnemospark/events.jsonl. Monthly storage billing jobs are listed in ~/.openclaw/cron/jobs.json for OpenClaw scheduling.";
3823
3822
  var REQUIRED_PRICE_STORAGE = "--wallet-address, --object-id, --object-id-hash, --gb, --provider, --region";
3824
3823
  var REQUIRED_UPLOAD = "--quote-id, --wallet-address, --object-id, --object-id-hash";
3825
3824
  var REQUIRED_BACKUP = "<file|directory> and --name <friendly-name>";
@@ -4299,9 +4298,6 @@ function parseCloudArgs(args) {
4299
4298
  }
4300
4299
  return { mode: "unknown" };
4301
4300
  }
4302
- function resolveCronTablePath(homeDir) {
4303
- return join8(homeDir ?? homedir6(), CRON_TABLE_SUBPATH);
4304
- }
4305
4301
  async function calculateInputSizeBytes(targetPath) {
4306
4302
  const targetStats = await lstat(targetPath);
4307
4303
  if (targetStats.isFile() || targetStats.isSymbolicLink()) {
@@ -4459,84 +4455,126 @@ async function buildBackupObject(targetPathArg, options = {}) {
4459
4455
  throw error;
4460
4456
  }
4461
4457
  }
4462
- function formatTimestamp(date) {
4463
- const pad = (value) => value.toString().padStart(2, "0");
4464
- return [
4465
- date.getFullYear().toString(),
4466
- "-",
4467
- pad(date.getMonth() + 1),
4468
- "-",
4469
- pad(date.getDate()),
4470
- " ",
4471
- pad(date.getHours()),
4472
- ":",
4473
- pad(date.getMinutes()),
4474
- ":",
4475
- pad(date.getSeconds())
4476
- ].join("");
4477
- }
4478
- function parseStoragePaymentCronJobLine(line) {
4479
- const trimmed = line.trim();
4480
- if (!trimmed) {
4458
+ function normalizeOpenClawCronJobForLookup(value) {
4459
+ if (!value || typeof value !== "object") {
4481
4460
  return null;
4482
4461
  }
4483
- let payload;
4484
- try {
4485
- payload = JSON.parse(trimmed);
4486
- } catch {
4462
+ const record = value;
4463
+ const jobIdRaw = typeof record.jobId === "string" ? record.jobId : record.id;
4464
+ const jobId = typeof jobIdRaw === "string" ? jobIdRaw.trim() : "";
4465
+ const payloadRaw = record.payload;
4466
+ if (!jobId || !payloadRaw || typeof payloadRaw !== "object") {
4487
4467
  return null;
4488
4468
  }
4489
- if (!payload || typeof payload !== "object") {
4490
- return null;
4491
- }
4492
- const record = payload;
4493
- const cronId = typeof record.cronId === "string" ? record.cronId.trim() : "";
4494
- const createdAt = typeof record.createdAt === "string" ? record.createdAt.trim() : "";
4495
- const schedule = typeof record.schedule === "string" ? record.schedule.trim() : "";
4496
- const command = typeof record.command === "string" ? record.command.trim() : "";
4497
- const quoteId = typeof record.quoteId === "string" ? record.quoteId.trim() : "";
4498
- const storagePrice = typeof record.storagePrice === "number" ? record.storagePrice : Number.NaN;
4499
- const walletAddress = typeof record.walletAddress === "string" ? record.walletAddress.trim() : "";
4500
- const objectId = typeof record.objectId === "string" ? record.objectId.trim() : "";
4501
- const objectKey = typeof record.objectKey === "string" ? record.objectKey.trim() : "";
4502
- const provider = typeof record.provider === "string" ? record.provider.trim() : "";
4503
- const bucketName = typeof record.bucketName === "string" ? record.bucketName.trim() : "";
4504
- const location = typeof record.location === "string" ? record.location.trim() : "";
4505
- if (!cronId || !createdAt || !schedule || !command || !quoteId || !Number.isFinite(storagePrice) || storagePrice <= 0 || !walletAddress || !objectId || !objectKey || !provider || !bucketName || !location) {
4469
+ const payloadRecord = payloadRaw;
4470
+ const payloadKind = payloadRecord.kind;
4471
+ const payloadMessage = typeof payloadRecord.message === "string" ? payloadRecord.message.trim() : "";
4472
+ if (payloadKind !== "agentTurn" || !payloadMessage) {
4506
4473
  return null;
4507
4474
  }
4508
4475
  return {
4509
- cronId,
4510
- createdAt,
4511
- schedule,
4512
- command,
4513
- quoteId,
4514
- storagePrice,
4515
- walletAddress,
4516
- objectId,
4517
- objectKey,
4518
- provider,
4519
- bucketName,
4520
- location
4476
+ jobId,
4477
+ message: payloadMessage
4521
4478
  };
4522
4479
  }
4523
- async function findCronJobInCrontabByObjectKey(objectKey, homeDir) {
4524
- const cronTablePath = resolveCronTablePath(homeDir);
4525
- let content;
4480
+ async function runOpenClawCli(args, homeDir) {
4481
+ return await new Promise((resolvePromise, rejectPromise) => {
4482
+ let stdout = "";
4483
+ let stderr = "";
4484
+ const child = spawn("openclaw", args, {
4485
+ stdio: ["ignore", "pipe", "pipe"],
4486
+ env: {
4487
+ ...process.env,
4488
+ HOME: homeDir ?? process.env.HOME
4489
+ }
4490
+ });
4491
+ child.stdout.on("data", (chunk) => {
4492
+ stdout += chunk.toString();
4493
+ });
4494
+ child.stderr.on("data", (chunk) => {
4495
+ stderr += chunk.toString();
4496
+ });
4497
+ child.on("error", rejectPromise);
4498
+ child.on("close", (code) => {
4499
+ if (code === 0) {
4500
+ resolvePromise({ stdout, stderr });
4501
+ return;
4502
+ }
4503
+ rejectPromise(
4504
+ new Error(
4505
+ stderr.trim() || stdout.trim() || `openclaw ${args.join(" ")} exited with code ${code ?? "unknown"}`
4506
+ )
4507
+ );
4508
+ });
4509
+ });
4510
+ }
4511
+ function parseOpenClawCliJson(stdout, commandLabel) {
4512
+ const trimmed = stdout.trim();
4513
+ if (!trimmed) {
4514
+ throw new Error(`openclaw ${commandLabel} returned empty JSON output`);
4515
+ }
4526
4516
  try {
4527
- content = await readFile3(cronTablePath, "utf-8");
4528
- } catch (error) {
4529
- if (error.code === "ENOENT") {
4530
- return null;
4531
- }
4532
- throw error;
4517
+ return JSON.parse(trimmed);
4518
+ } catch {
4519
+ throw new Error(`openclaw ${commandLabel} returned invalid JSON output`);
4533
4520
  }
4534
- const lines = content.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
4535
- for (let idx = lines.length - 1; idx >= 0; idx -= 1) {
4536
- const parsed = parseStoragePaymentCronJobLine(lines[idx]);
4521
+ }
4522
+ function createOpenClawCliCronAdapter(homeDir) {
4523
+ return {
4524
+ add: async (job) => {
4525
+ const { stdout } = await runOpenClawCli(
4526
+ [
4527
+ "cron",
4528
+ "add",
4529
+ "--name",
4530
+ job.name,
4531
+ "--cron",
4532
+ job.schedule.expr,
4533
+ "--tz",
4534
+ job.schedule.tz,
4535
+ "--session",
4536
+ job.sessionTarget,
4537
+ "--message",
4538
+ job.payload.message,
4539
+ "--announce",
4540
+ "--description",
4541
+ job.delivery.text,
4542
+ "--json"
4543
+ ],
4544
+ homeDir
4545
+ );
4546
+ const payload = parseOpenClawCliJson(stdout, "cron add");
4547
+ const createdIdRaw = typeof payload.id === "string" ? payload.id : payload.jobId;
4548
+ const createdId = typeof createdIdRaw === "string" ? createdIdRaw.trim() : "";
4549
+ if (!createdId) {
4550
+ throw new Error("openclaw cron add did not return a job id");
4551
+ }
4552
+ return { jobId: createdId };
4553
+ },
4554
+ remove: async (jobId) => {
4555
+ const { stdout } = await runOpenClawCli(["cron", "rm", jobId, "--json"], homeDir);
4556
+ const payload = parseOpenClawCliJson(stdout, "cron rm");
4557
+ if (typeof payload.removed === "boolean") {
4558
+ return payload.removed;
4559
+ }
4560
+ return true;
4561
+ },
4562
+ list: async () => {
4563
+ const { stdout } = await runOpenClawCli(["cron", "list", "--all", "--json"], homeDir);
4564
+ const payload = parseOpenClawCliJson(stdout, "cron list");
4565
+ const jobsRaw = Array.isArray(payload.jobs) ? payload.jobs : [];
4566
+ return jobsRaw.map((entry) => normalizeOpenClawCronJobForLookup(entry)).filter((entry) => entry !== null);
4567
+ }
4568
+ };
4569
+ }
4570
+ async function findCronJobInOpenClawCronJobsByObjectKey(objectKey, adapter) {
4571
+ const cronJobs = await adapter.list();
4572
+ for (let idx = cronJobs.length - 1; idx >= 0; idx -= 1) {
4573
+ const cronJob = cronJobs[idx];
4574
+ const parsed = parseStoragePaymentCronCommand(cronJob.message);
4537
4575
  if (parsed && parsed.objectKey === objectKey) {
4538
4576
  return {
4539
- cronId: parsed.cronId,
4577
+ cronId: cronJob.jobId,
4540
4578
  objectId: parsed.objectId,
4541
4579
  objectKey: parsed.objectKey
4542
4580
  };
@@ -4547,9 +4585,8 @@ async function findCronJobInCrontabByObjectKey(objectKey, homeDir) {
4547
4585
  function quoteCronArgument(value) {
4548
4586
  return JSON.stringify(String(value));
4549
4587
  }
4550
- function buildStoragePaymentCronCommand(job) {
4588
+ function buildStoragePaymentRenewalArgs(job) {
4551
4589
  return [
4552
- "/mnemospark_cloud",
4553
4590
  "payment-settle",
4554
4591
  "--renewal",
4555
4592
  "--wallet-address",
@@ -4562,61 +4599,81 @@ function buildStoragePaymentCronCommand(job) {
4562
4599
  quoteCronArgument(job.storagePrice)
4563
4600
  ].join(" ");
4564
4601
  }
4565
- async function appendStoragePaymentCronJob(cronJob, homeDir) {
4566
- const cronTablePath = resolveCronTablePath(homeDir);
4567
- await mkdir5(dirname5(cronTablePath), { recursive: true });
4568
- await appendFile2(cronTablePath, `${JSON.stringify(cronJob)}
4569
- `, "utf-8");
4570
- return cronTablePath;
4602
+ function buildStoragePaymentCronCommand(job) {
4603
+ return `/mnemospark_cloud ${buildStoragePaymentRenewalArgs(job)}`;
4571
4604
  }
4572
- async function removeStoragePaymentCronJob(cronId, homeDir) {
4573
- const cronTablePath = resolveCronTablePath(homeDir);
4574
- let content;
4575
- try {
4576
- content = await readFile3(cronTablePath, "utf-8");
4577
- } catch (error) {
4578
- if (error.code === "ENOENT") {
4579
- return false;
4580
- }
4581
- throw error;
4605
+ function buildOpenClawRenewalAgentMessage(openClawHome, renewalArgs) {
4606
+ const cliPath = join8(openClawHome, ".openclaw/extensions/mnemospark/dist/cli.js");
4607
+ return `Run Mnemospark monthly renewal: node ${cliPath} cloud ${renewalArgs}`;
4608
+ }
4609
+ function parseStoragePaymentCronCommand(command) {
4610
+ const objectIdMatch = command.match(/--object-id\s+("([^"\\]|\\.)*"|'([^'\\]|\\.)*'|\S+)/);
4611
+ const objectKeyMatch = command.match(/--object-key\s+("([^"\\]|\\.)*"|'([^'\\]|\\.)*'|\S+)/);
4612
+ if (!objectIdMatch || !objectKeyMatch) {
4613
+ return null;
4582
4614
  }
4583
- const lines = content.split(/\r?\n/);
4584
- let removed = false;
4585
- const keptLines = [];
4586
- for (const line of lines) {
4587
- const trimmed = line.trim();
4615
+ const parseToken = (token) => {
4616
+ const trimmed = token.trim();
4588
4617
  if (!trimmed) {
4589
- continue;
4618
+ return null;
4590
4619
  }
4591
- const parsed = parseStoragePaymentCronJobLine(trimmed);
4592
- if (parsed && parsed.cronId === cronId) {
4593
- removed = true;
4594
- continue;
4620
+ if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
4621
+ try {
4622
+ return JSON.parse(trimmed);
4623
+ } catch {
4624
+ return trimmed.slice(1, -1);
4625
+ }
4595
4626
  }
4596
- keptLines.push(trimmed);
4597
- }
4598
- if (!removed) {
4599
- return false;
4627
+ if (trimmed.startsWith("'") && trimmed.endsWith("'")) {
4628
+ return trimmed.slice(1, -1);
4629
+ }
4630
+ return trimmed;
4631
+ };
4632
+ const objectId = parseToken(objectIdMatch[1] ?? "");
4633
+ const objectKey = parseToken(objectKeyMatch[1] ?? "");
4634
+ if (!objectId || !objectKey) {
4635
+ return null;
4600
4636
  }
4601
- await mkdir5(dirname5(cronTablePath), { recursive: true });
4602
- const nextContent = keptLines.length > 0 ? `${keptLines.join("\n")}
4603
- ` : "";
4604
- await writeFile3(cronTablePath, nextContent, "utf-8");
4605
- return true;
4637
+ return { objectId, objectKey };
4606
4638
  }
4607
- async function createStoragePaymentCronJob(upload, storagePrice, homeDir, nowDateFn = () => /* @__PURE__ */ new Date()) {
4608
- const cronId = randomUUID3();
4609
- const createdAt = formatTimestamp(nowDateFn());
4639
+ async function appendStoragePaymentCronJob(cronJob, adapter, payloadMessage) {
4640
+ const openClawJob = {
4641
+ jobId: cronJob.cronId,
4642
+ name: "Mnemospark Monthly Renewal",
4643
+ schedule: {
4644
+ kind: "cron",
4645
+ expr: PAYMENT_CRON_SCHEDULE,
4646
+ tz: "UTC"
4647
+ },
4648
+ payload: {
4649
+ kind: "agentTurn",
4650
+ message: payloadMessage
4651
+ },
4652
+ sessionTarget: "isolated",
4653
+ delivery: {
4654
+ mode: "announce",
4655
+ text: "Thank you for using mnemospark cloud storage. Your renewal has been processed."
4656
+ }
4657
+ };
4658
+ return adapter.add(openClawJob);
4659
+ }
4660
+ async function removeStoragePaymentCronJob(cronId, adapter) {
4661
+ return adapter.remove(cronId);
4662
+ }
4663
+ async function createStoragePaymentCronJob(upload, storagePrice, openClawCronAdapter, openClawHomeDir, nowDateFn = () => /* @__PURE__ */ new Date()) {
4664
+ const renewalFields = {
4665
+ walletAddress: upload.addr,
4666
+ objectId: upload.object_id,
4667
+ objectKey: upload.object_key,
4668
+ storagePrice
4669
+ };
4670
+ const renewalArgs = buildStoragePaymentRenewalArgs(renewalFields);
4671
+ const provisionalCronId = randomUUID3();
4610
4672
  const cronJob = {
4611
- cronId,
4612
- createdAt,
4673
+ cronId: provisionalCronId,
4674
+ createdAt: nowDateFn().toISOString(),
4613
4675
  schedule: PAYMENT_CRON_SCHEDULE,
4614
- command: buildStoragePaymentCronCommand({
4615
- walletAddress: upload.addr,
4616
- objectId: upload.object_id,
4617
- objectKey: upload.object_key,
4618
- storagePrice
4619
- }),
4676
+ command: buildStoragePaymentCronCommand(renewalFields),
4620
4677
  quoteId: upload.quote_id,
4621
4678
  storagePrice,
4622
4679
  walletAddress: upload.addr,
@@ -4626,7 +4683,11 @@ async function createStoragePaymentCronJob(upload, storagePrice, homeDir, nowDat
4626
4683
  bucketName: upload.bucket_name,
4627
4684
  location: upload.location
4628
4685
  };
4629
- await appendStoragePaymentCronJob(cronJob, homeDir);
4686
+ const payloadMessage = buildOpenClawRenewalAgentMessage(openClawHomeDir, renewalArgs);
4687
+ const created = await appendStoragePaymentCronJob(cronJob, openClawCronAdapter, payloadMessage);
4688
+ if (created.jobId?.trim()) {
4689
+ cronJob.cronId = created.jobId.trim();
4690
+ }
4630
4691
  return cronJob;
4631
4692
  }
4632
4693
  async function readWalletKeyIfPresent(walletPath) {
@@ -5016,6 +5077,9 @@ function createCloudCommand(options = {}) {
5016
5077
  requestStorageDeleteFn: options.requestStorageDeleteFn ?? requestStorageDeleteViaProxy,
5017
5078
  requestPaymentSettleViaProxyFn: options.requestPaymentSettleViaProxyFn ?? requestPaymentSettleViaProxy,
5018
5079
  mnemosparkHomeDir: options.mnemosparkHomeDir ?? options.backupOptions?.homeDir,
5080
+ openClawCronAdapter: options.openClawCronAdapter ?? createOpenClawCliCronAdapter(
5081
+ options.mnemosparkHomeDir ?? options.backupOptions?.homeDir
5082
+ ),
5019
5083
  backupOptions: options.backupOptions,
5020
5084
  proxyQuoteOptions: options.proxyQuoteOptions,
5021
5085
  proxyUploadOptions: options.proxyUploadOptions,
@@ -5311,6 +5375,7 @@ async function runCloudCommandHandler(ctx, options, executionContext = {}) {
5311
5375
  const requestStorageDownload = options.requestStorageDownloadFn;
5312
5376
  const requestStorageDelete = options.requestStorageDeleteFn;
5313
5377
  const requestPaymentSettleViaProxy2 = options.requestPaymentSettleViaProxyFn;
5378
+ const openClawCronAdapter = options.openClawCronAdapter;
5314
5379
  const subagentOrchestrator = options.subagentOrchestrator;
5315
5380
  if (parsed.mode === "help" || parsed.mode === "unknown") {
5316
5381
  return {
@@ -6283,7 +6348,8 @@ operation-id: ${operationId}`,
6283
6348
  const cronJob = await createStoragePaymentCronJob(
6284
6349
  finalizedUploadResponse,
6285
6350
  cronStoragePrice,
6286
- mnemosparkHomeDir,
6351
+ openClawCronAdapter,
6352
+ mnemosparkHomeDir ?? homedir6(),
6287
6353
  nowDateFn
6288
6354
  );
6289
6355
  await datastore.upsertObject({
@@ -6647,15 +6713,15 @@ operation-id: ${operationId}`,
6647
6713
  };
6648
6714
  }
6649
6715
  if (!cronEntry) {
6650
- cronEntry = await findCronJobInCrontabByObjectKey(
6716
+ cronEntry = await findCronJobInOpenClawCronJobsByObjectKey(
6651
6717
  resolvedRequest.object_key,
6652
- mnemosparkHomeDir
6718
+ openClawCronAdapter
6653
6719
  );
6654
6720
  }
6655
6721
  if (cronEntry) {
6656
6722
  const fileCronDeleted = await removeStoragePaymentCronJob(
6657
6723
  cronEntry.cronId,
6658
- mnemosparkHomeDir
6724
+ openClawCronAdapter
6659
6725
  );
6660
6726
  const dbCronDeleted = await datastore.removeCronJob(cronEntry.cronId);
6661
6727
  cronDeleted = fileCronDeleted || dbCronDeleted;