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/cli.js +190 -124
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +33 -0
- package/dist/index.js +190 -124
- package/dist/index.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
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 {
|
|
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/
|
|
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
|
|
4463
|
-
|
|
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
|
-
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
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
|
-
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
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
|
-
|
|
4510
|
-
|
|
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
|
|
4524
|
-
|
|
4525
|
-
|
|
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
|
-
|
|
4528
|
-
} catch
|
|
4529
|
-
|
|
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
|
-
|
|
4535
|
-
|
|
4536
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
4566
|
-
|
|
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
|
-
|
|
4573
|
-
const
|
|
4574
|
-
|
|
4575
|
-
|
|
4576
|
-
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
|
|
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
|
|
4584
|
-
|
|
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
|
-
|
|
4618
|
+
return null;
|
|
4590
4619
|
}
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
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
|
-
|
|
4597
|
-
|
|
4598
|
-
|
|
4599
|
-
return
|
|
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
|
-
|
|
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
|
|
4608
|
-
const
|
|
4609
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
6716
|
+
cronEntry = await findCronJobInOpenClawCronJobsByObjectKey(
|
|
6651
6717
|
resolvedRequest.object_key,
|
|
6652
|
-
|
|
6718
|
+
openClawCronAdapter
|
|
6653
6719
|
);
|
|
6654
6720
|
}
|
|
6655
6721
|
if (cronEntry) {
|
|
6656
6722
|
const fileCronDeleted = await removeStoragePaymentCronJob(
|
|
6657
6723
|
cronEntry.cronId,
|
|
6658
|
-
|
|
6724
|
+
openClawCronAdapter
|
|
6659
6725
|
);
|
|
6660
6726
|
const dbCronDeleted = await datastore.removeCronJob(cronEntry.cronId);
|
|
6661
6727
|
cronDeleted = fileCronDeleted || dbCronDeleted;
|