aiden-runtime 4.1.5 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +250 -847
- package/dist/api/server.js +32 -5
- package/dist/cli/v4/aidenCLI.js +351 -53
- package/dist/cli/v4/callbacks.js +170 -0
- package/dist/cli/v4/chatSession.js +138 -3
- package/dist/cli/v4/commands/_runtimeToggleHelpers.js +92 -0
- package/dist/cli/v4/commands/browserDepth.js +45 -0
- package/dist/cli/v4/commands/cron.js +264 -0
- package/dist/cli/v4/commands/daemon.js +541 -0
- package/dist/cli/v4/commands/daemonStatus.js +253 -0
- package/dist/cli/v4/commands/help.js +7 -0
- package/dist/cli/v4/commands/index.js +20 -1
- package/dist/cli/v4/commands/runs.js +203 -0
- package/dist/cli/v4/commands/sandbox.js +48 -0
- package/dist/cli/v4/commands/suggestions.js +68 -0
- package/dist/cli/v4/commands/tce.js +41 -0
- package/dist/cli/v4/commands/trigger.js +378 -0
- package/dist/cli/v4/commands/update.js +95 -3
- package/dist/cli/v4/daemonAgentBuilder.js +142 -0
- package/dist/cli/v4/defaultSoul.js +1 -1
- package/dist/cli/v4/display/capabilityCard.js +26 -0
- package/dist/cli/v4/display.js +18 -8
- package/dist/cli/v4/replyRenderer.js +31 -23
- package/dist/cli/v4/updateBootPrompt.js +170 -0
- package/dist/core/playwrightBridge.js +129 -0
- package/dist/core/v4/aidenAgent.js +308 -4
- package/dist/core/v4/browserState.js +436 -0
- package/dist/core/v4/checkpoint.js +79 -0
- package/dist/core/v4/daemon/bootstrap.js +604 -0
- package/dist/core/v4/daemon/cleanShutdown.js +154 -0
- package/dist/core/v4/daemon/cron/cronBridge.js +126 -0
- package/dist/core/v4/daemon/cron/cronEmitter.js +173 -0
- package/dist/core/v4/daemon/cron/migration.js +199 -0
- package/dist/core/v4/daemon/cron/misfirePolicy.js +115 -0
- package/dist/core/v4/daemon/daemonConfig.js +90 -0
- package/dist/core/v4/daemon/db/connection.js +106 -0
- package/dist/core/v4/daemon/db/migrations.js +296 -0
- package/dist/core/v4/daemon/db/schema/v1.spec.js +18 -0
- package/dist/core/v4/daemon/dispatcher/agentRunner.js +98 -0
- package/dist/core/v4/daemon/dispatcher/budgetGate.js +127 -0
- package/dist/core/v4/daemon/dispatcher/daemonApproval.js +113 -0
- package/dist/core/v4/daemon/dispatcher/dailyBudgetTracker.js +120 -0
- package/dist/core/v4/daemon/dispatcher/dispatcher.js +389 -0
- package/dist/core/v4/daemon/dispatcher/fireRateLimiter.js +113 -0
- package/dist/core/v4/daemon/dispatcher/index.js +53 -0
- package/dist/core/v4/daemon/dispatcher/promptTemplate.js +95 -0
- package/dist/core/v4/daemon/dispatcher/realAgentRunner.js +356 -0
- package/dist/core/v4/daemon/dispatcher/resolveModel.js +93 -0
- package/dist/core/v4/daemon/dispatcher/sessionId.js +93 -0
- package/dist/core/v4/daemon/drain.js +156 -0
- package/dist/core/v4/daemon/eventLoopLag.js +73 -0
- package/dist/core/v4/daemon/health.js +159 -0
- package/dist/core/v4/daemon/idempotencyStore.js +204 -0
- package/dist/core/v4/daemon/index.js +179 -0
- package/dist/core/v4/daemon/instanceTracker.js +99 -0
- package/dist/core/v4/daemon/resourceRegistry.js +150 -0
- package/dist/core/v4/daemon/restartCode.js +32 -0
- package/dist/core/v4/daemon/restartFailureCounter.js +77 -0
- package/dist/core/v4/daemon/runStore.js +114 -0
- package/dist/core/v4/daemon/runtimeLock.js +167 -0
- package/dist/core/v4/daemon/signals.js +50 -0
- package/dist/core/v4/daemon/supervisor.js +272 -0
- package/dist/core/v4/daemon/triggerBus.js +279 -0
- package/dist/core/v4/daemon/triggers/email/allowlist.js +70 -0
- package/dist/core/v4/daemon/triggers/email/automatedSender.js +78 -0
- package/dist/core/v4/daemon/triggers/email/bodyExtractor.js +0 -0
- package/dist/core/v4/daemon/triggers/email/emailSeenStore.js +99 -0
- package/dist/core/v4/daemon/triggers/email/emailSpec.js +107 -0
- package/dist/core/v4/daemon/triggers/email/imapConnection.js +211 -0
- package/dist/core/v4/daemon/triggers/email/index.js +332 -0
- package/dist/core/v4/daemon/triggers/email/seenUids.js +60 -0
- package/dist/core/v4/daemon/triggers/fileObservationsStore.js +93 -0
- package/dist/core/v4/daemon/triggers/fileWatcher.js +253 -0
- package/dist/core/v4/daemon/triggers/fileWatcherSpec.js +88 -0
- package/dist/core/v4/daemon/triggers/fsIdentity.js +42 -0
- package/dist/core/v4/daemon/triggers/globMatcher.js +100 -0
- package/dist/core/v4/daemon/triggers/reconcile.js +206 -0
- package/dist/core/v4/daemon/triggers/settleStat.js +81 -0
- package/dist/core/v4/daemon/triggers/webhook.js +376 -0
- package/dist/core/v4/daemon/triggers/webhookDeliveriesStore.js +109 -0
- package/dist/core/v4/daemon/triggers/webhookIdempotency.js +72 -0
- package/dist/core/v4/daemon/triggers/webhookRateLimit.js +56 -0
- package/dist/core/v4/daemon/triggers/webhookSpec.js +76 -0
- package/dist/core/v4/daemon/triggers/webhookVerifier.js +128 -0
- package/dist/core/v4/daemon/types.js +15 -0
- package/dist/core/v4/dockerSession.js +461 -0
- package/dist/core/v4/dryRun.js +117 -0
- package/dist/core/v4/failureClassifier.js +779 -0
- package/dist/core/v4/recoveryReport.js +449 -0
- package/dist/core/v4/runtimeToggles.js +187 -0
- package/dist/core/v4/sandboxConfig.js +285 -0
- package/dist/core/v4/sandboxFs.js +316 -0
- package/dist/core/v4/suggestionCatalog.js +41 -0
- package/dist/core/v4/suggestionEngine.js +210 -0
- package/dist/core/v4/toolRegistry.js +18 -0
- package/dist/core/v4/turnState.js +587 -0
- package/dist/core/v4/update/checkUpdate.js +63 -3
- package/dist/core/v4/update/installMethodDetect.js +115 -0
- package/dist/core/v4/update/registryClient.js +121 -0
- package/dist/core/v4/update/skipState.js +75 -0
- package/dist/core/v4/verifier.js +448 -0
- package/dist/core/version.js +1 -1
- package/dist/tools/v4/browser/_observer.js +224 -0
- package/dist/tools/v4/browser/browserBlocker.js +396 -0
- package/dist/tools/v4/browser/browserClick.js +18 -1
- package/dist/tools/v4/browser/browserClose.js +18 -1
- package/dist/tools/v4/browser/browserExtract.js +5 -1
- package/dist/tools/v4/browser/browserFill.js +17 -1
- package/dist/tools/v4/browser/browserGetUrl.js +5 -1
- package/dist/tools/v4/browser/browserNavigate.js +16 -1
- package/dist/tools/v4/browser/browserScreenshot.js +5 -1
- package/dist/tools/v4/browser/browserScroll.js +18 -1
- package/dist/tools/v4/browser/browserType.js +17 -1
- package/dist/tools/v4/browser/captchaCheck.js +5 -1
- package/dist/tools/v4/executeCode.js +1 -0
- package/dist/tools/v4/files/fileCopy.js +56 -2
- package/dist/tools/v4/files/fileDelete.js +38 -1
- package/dist/tools/v4/files/fileList.js +12 -1
- package/dist/tools/v4/files/fileMove.js +59 -2
- package/dist/tools/v4/files/filePatch.js +43 -1
- package/dist/tools/v4/files/fileRead.js +12 -1
- package/dist/tools/v4/files/fileWrite.js +41 -1
- package/dist/tools/v4/index.js +71 -58
- package/dist/tools/v4/memory/memoryAdd.js +14 -0
- package/dist/tools/v4/memory/memoryRemove.js +14 -0
- package/dist/tools/v4/memory/memoryReplace.js +15 -0
- package/dist/tools/v4/memory/sessionSummary.js +12 -0
- package/dist/tools/v4/process/processKill.js +19 -0
- package/dist/tools/v4/process/processList.js +1 -0
- package/dist/tools/v4/process/processLogRead.js +1 -0
- package/dist/tools/v4/process/processSpawn.js +13 -0
- package/dist/tools/v4/process/processWait.js +1 -0
- package/dist/tools/v4/sessions/recallSession.js +1 -0
- package/dist/tools/v4/sessions/sessionList.js +1 -0
- package/dist/tools/v4/sessions/sessionSearch.js +1 -0
- package/dist/tools/v4/skills/lookupToolSchema.js +2 -0
- package/dist/tools/v4/skills/skillManage.js +13 -0
- package/dist/tools/v4/skills/skillView.js +1 -0
- package/dist/tools/v4/skills/skillsList.js +1 -0
- package/dist/tools/v4/subagent/subagentFanout.js +1 -0
- package/dist/tools/v4/system/aidenSelfUpdate.js +16 -0
- package/dist/tools/v4/system/appClose.js +13 -0
- package/dist/tools/v4/system/appInput.js +13 -0
- package/dist/tools/v4/system/appLaunch.js +13 -0
- package/dist/tools/v4/system/clipboardRead.js +1 -0
- package/dist/tools/v4/system/clipboardWrite.js +14 -0
- package/dist/tools/v4/system/mediaKey.js +12 -0
- package/dist/tools/v4/system/mediaSessions.js +1 -0
- package/dist/tools/v4/system/mediaTransport.js +13 -0
- package/dist/tools/v4/system/naturalEvents.js +1 -0
- package/dist/tools/v4/system/nowPlaying.js +1 -0
- package/dist/tools/v4/system/osProcessList.js +1 -0
- package/dist/tools/v4/system/screenshot.js +1 -0
- package/dist/tools/v4/system/systemInfo.js +1 -0
- package/dist/tools/v4/system/volumeSet.js +17 -0
- package/dist/tools/v4/terminal/shellExec.js +81 -9
- package/dist/tools/v4/web/deepResearch.js +1 -0
- package/dist/tools/v4/web/openUrl.js +1 -0
- package/dist/tools/v4/web/webFetch.js +1 -0
- package/dist/tools/v4/web/webPage.js +1 -0
- package/dist/tools/v4/web/webSearch.js +1 -0
- package/dist/tools/v4/web/youtubeSearch.js +1 -0
- package/package.json +7 -1
|
@@ -61,12 +61,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
61
61
|
exports.cron = void 0;
|
|
62
62
|
exports.tokenize = tokenize;
|
|
63
63
|
exports.resolveJob = resolveJob;
|
|
64
|
+
exports.runCronSubcommand = runCronSubcommand;
|
|
64
65
|
const node_fs_1 = require("node:fs");
|
|
65
66
|
const fs = __importStar(require("node:fs"));
|
|
66
67
|
const path = __importStar(require("node:path"));
|
|
67
68
|
const os = __importStar(require("node:os"));
|
|
68
69
|
const table_1 = require("../table");
|
|
69
70
|
const cronManager_1 = require("../../../core/cronManager");
|
|
71
|
+
// v4.5 Phase 6 — daemon-mode scheduled_workflows read-through.
|
|
72
|
+
const daemon_1 = require("../../../core/v4/daemon");
|
|
73
|
+
const cronBridge_1 = require("../../../core/v4/daemon/cron/cronBridge");
|
|
74
|
+
const misfirePolicy_1 = require("../../../core/v4/daemon/cron/misfirePolicy");
|
|
75
|
+
const paths_1 = require("../../../core/v4/paths");
|
|
70
76
|
const NAME_RE = /^[A-Za-z0-9_-]+$/;
|
|
71
77
|
const LOGS_DIR = path.join(os.homedir(), '.aiden', 'cron-logs');
|
|
72
78
|
const TAIL_LINES = 100;
|
|
@@ -333,6 +339,264 @@ async function cmdRemove(ctx, args) {
|
|
|
333
339
|
ctx.display.printError('Remove failed.');
|
|
334
340
|
}
|
|
335
341
|
}
|
|
342
|
+
const cronNoopOut = (s) => { process.stdout.write(s); };
|
|
343
|
+
const cronNoopErr = (s) => { process.stderr.write(s); };
|
|
344
|
+
/** Read the scheduled_workflows rows for the daemon-mode view. */
|
|
345
|
+
function readScheduledWorkflows() {
|
|
346
|
+
const out = new Map();
|
|
347
|
+
try {
|
|
348
|
+
const root = (0, paths_1.resolveAidenRoot)();
|
|
349
|
+
const db = (0, daemon_1.openDaemonDb)((0, daemon_1.daemonDbPath)(root));
|
|
350
|
+
const rows = db.prepare(`SELECT id, misfire_policy, last_fired_at, next_fire_at FROM scheduled_workflows`).all();
|
|
351
|
+
for (const r of rows)
|
|
352
|
+
out.set(r.id, r);
|
|
353
|
+
}
|
|
354
|
+
catch { /* daemon DB absent — return empty map */ }
|
|
355
|
+
return out;
|
|
356
|
+
}
|
|
357
|
+
/** Write/refresh a scheduled_workflows row from a CronJobV2. Idempotent. */
|
|
358
|
+
function upsertScheduledWorkflow(job, misfirePolicy, promptTemplate, deliverOnly) {
|
|
359
|
+
try {
|
|
360
|
+
const root = (0, paths_1.resolveAidenRoot)();
|
|
361
|
+
const db = (0, daemon_1.openDaemonDb)((0, daemon_1.daemonDbPath)(root));
|
|
362
|
+
const row = (0, cronBridge_1.jobToRow)(job);
|
|
363
|
+
const policy = misfirePolicy && (0, misfirePolicy_1.isMisfirePolicy)(misfirePolicy) ? misfirePolicy : row.misfire_policy;
|
|
364
|
+
db.prepare(`INSERT INTO scheduled_workflows
|
|
365
|
+
(id, name, schedule_expression, timezone, enabled, payload_json,
|
|
366
|
+
prompt_template, deliver_only, misfire_policy, fire_rate_limit,
|
|
367
|
+
catch_up_limit, grace_ms, last_fired_at, next_fire_at,
|
|
368
|
+
created_at, updated_at)
|
|
369
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
370
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
371
|
+
name = excluded.name,
|
|
372
|
+
schedule_expression = excluded.schedule_expression,
|
|
373
|
+
enabled = excluded.enabled,
|
|
374
|
+
payload_json = excluded.payload_json,
|
|
375
|
+
prompt_template = excluded.prompt_template,
|
|
376
|
+
deliver_only = excluded.deliver_only,
|
|
377
|
+
misfire_policy = excluded.misfire_policy,
|
|
378
|
+
updated_at = excluded.updated_at`).run(row.id, row.name, row.schedule_expression, row.timezone, row.enabled, row.payload_json, promptTemplate ?? row.prompt_template, deliverOnly === true ? 1 : 0, policy, row.fire_rate_limit, row.catch_up_limit, row.grace_ms, row.last_fired_at, row.next_fire_at, row.created_at, row.updated_at);
|
|
379
|
+
}
|
|
380
|
+
catch { /* daemon DB absent — JSON path still wrote the job */ }
|
|
381
|
+
}
|
|
382
|
+
/** Delete a scheduled_workflows row. Best-effort. */
|
|
383
|
+
function deleteScheduledWorkflow(id) {
|
|
384
|
+
try {
|
|
385
|
+
const root = (0, paths_1.resolveAidenRoot)();
|
|
386
|
+
const db = (0, daemon_1.openDaemonDb)((0, daemon_1.daemonDbPath)(root));
|
|
387
|
+
db.prepare(`DELETE FROM scheduled_workflows WHERE id = ?`).run(id);
|
|
388
|
+
}
|
|
389
|
+
catch { /* noop */ }
|
|
390
|
+
}
|
|
391
|
+
/** Set enabled = 0/1 on scheduled_workflows. Best-effort. */
|
|
392
|
+
function setWorkflowEnabled(id, enabled) {
|
|
393
|
+
try {
|
|
394
|
+
const root = (0, paths_1.resolveAidenRoot)();
|
|
395
|
+
const db = (0, daemon_1.openDaemonDb)((0, daemon_1.daemonDbPath)(root));
|
|
396
|
+
db.prepare(`UPDATE scheduled_workflows SET enabled = ?, updated_at = ? WHERE id = ?`).run(enabled, Date.now(), id);
|
|
397
|
+
}
|
|
398
|
+
catch { /* noop */ }
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Top-level `aiden cron` dispatcher. Mirrors runTriggerSubcommand shape.
|
|
402
|
+
*/
|
|
403
|
+
async function runCronSubcommand(action, args, argv, opts = {}) {
|
|
404
|
+
const out = opts.writeOut ?? cronNoopOut;
|
|
405
|
+
const err = opts.writeErr ?? cronNoopErr;
|
|
406
|
+
switch (action) {
|
|
407
|
+
case 'add': return cmdCliAdd(argv, out, err);
|
|
408
|
+
case 'list': return cmdCliList(out);
|
|
409
|
+
case 'show': return cmdCliShow(args[0], out, err);
|
|
410
|
+
case 'remove':
|
|
411
|
+
case 'rm': return cmdCliRemove(args[0], out, err);
|
|
412
|
+
case 'enable': return cmdCliEnable(args[0], out, err);
|
|
413
|
+
case 'disable': return cmdCliDisable(args[0], out, err);
|
|
414
|
+
case 'run': return cmdCliRun(args[0], out, err);
|
|
415
|
+
case 'logs': return cmdCliLogs(args[0], out, err);
|
|
416
|
+
default:
|
|
417
|
+
err(`Unknown cron action: ${action}\n`);
|
|
418
|
+
err('Actions: add, list, show <id>, remove <id>, enable <id>, disable <id>, run <id>, logs <id>\n');
|
|
419
|
+
return 2;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
async function cmdCliAdd(a, out, err) {
|
|
423
|
+
const name = a.name ?? a.label;
|
|
424
|
+
if (!name || !NAME_RE.test(name)) {
|
|
425
|
+
err('cron add: --label is required (alphanumeric, dash, underscore only)\n');
|
|
426
|
+
return 2;
|
|
427
|
+
}
|
|
428
|
+
if (!a.schedule || a.schedule.length === 0) {
|
|
429
|
+
err('cron add: --schedule is required (cron expr, "every Nm/h/d", or ISO timestamp)\n');
|
|
430
|
+
return 2;
|
|
431
|
+
}
|
|
432
|
+
if (!a.command || a.command.length === 0) {
|
|
433
|
+
err('cron add: --command is required\n');
|
|
434
|
+
return 2;
|
|
435
|
+
}
|
|
436
|
+
if (a.misfirePolicy && !(0, misfirePolicy_1.isMisfirePolicy)(a.misfirePolicy)) {
|
|
437
|
+
err(`cron add: invalid --misfire-policy "${a.misfirePolicy}" (skip_stale|run_once_if_late|catch_up_with_limit|manual_review)\n`);
|
|
438
|
+
return 2;
|
|
439
|
+
}
|
|
440
|
+
if (resolveJob(name)) {
|
|
441
|
+
err(`cron add: a job named "${name}" already exists\n`);
|
|
442
|
+
return 2;
|
|
443
|
+
}
|
|
444
|
+
let job;
|
|
445
|
+
try {
|
|
446
|
+
job = await (0, cronManager_1.createJobAsync)(name, a.schedule, a.command);
|
|
447
|
+
}
|
|
448
|
+
catch (e) {
|
|
449
|
+
err(`cron add: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
450
|
+
return 2;
|
|
451
|
+
}
|
|
452
|
+
// Mirror to SQLite for daemon-mode visibility.
|
|
453
|
+
upsertScheduledWorkflow(job, a.misfirePolicy, a.promptTemplate, a.deliverOnly === true);
|
|
454
|
+
await (0, cronManager_1.awaitPendingSaves)();
|
|
455
|
+
out(`cron added: ${job.id} (${job.description})\n`);
|
|
456
|
+
out(` schedule: ${job.schedule}\n`);
|
|
457
|
+
out(` command: ${job.action}\n`);
|
|
458
|
+
if (a.misfirePolicy)
|
|
459
|
+
out(` misfire policy: ${a.misfirePolicy}\n`);
|
|
460
|
+
if (a.deliverOnly)
|
|
461
|
+
out(` deliver_only: true (daemon will skip the agent loop)\n`);
|
|
462
|
+
if (job.nextRun)
|
|
463
|
+
out(` next run: ${fmtTime(job.nextRun)}\n`);
|
|
464
|
+
return 0;
|
|
465
|
+
}
|
|
466
|
+
function cmdCliList(out) {
|
|
467
|
+
const jobs = (0, cronManager_1.listJobs)();
|
|
468
|
+
if (jobs.length === 0) {
|
|
469
|
+
out('No cron jobs.\n');
|
|
470
|
+
return 0;
|
|
471
|
+
}
|
|
472
|
+
const sqlView = readScheduledWorkflows();
|
|
473
|
+
out(`${'id'.padEnd(10)} ${'enabled'.padEnd(8)} ${'schedule'.padEnd(20)} ${'misfire'.padEnd(20)} ${'lastRun'.padEnd(20)} name\n`);
|
|
474
|
+
for (const j of jobs) {
|
|
475
|
+
const sql = sqlView.get(j.id);
|
|
476
|
+
const id = j.id.slice(0, 10).padEnd(10);
|
|
477
|
+
const enabled = (j.enabled ? 'on' : 'off').padEnd(8);
|
|
478
|
+
const sched = (j.schedule || '').slice(0, 20).padEnd(20);
|
|
479
|
+
const policy = (sql?.misfire_policy ?? '-').padEnd(20);
|
|
480
|
+
const lastRun = (j.lastRun ? fmtTime(j.lastRun) : '-').padEnd(20);
|
|
481
|
+
out(`${id} ${enabled} ${sched} ${policy} ${lastRun} ${j.description}\n`);
|
|
482
|
+
}
|
|
483
|
+
out(`\n${jobs.length} job${jobs.length === 1 ? '' : 's'}\n`);
|
|
484
|
+
return 0;
|
|
485
|
+
}
|
|
486
|
+
function cmdCliShow(ref, out, err) {
|
|
487
|
+
if (!ref) {
|
|
488
|
+
err('cron show: id or name required\n');
|
|
489
|
+
return 2;
|
|
490
|
+
}
|
|
491
|
+
const job = resolveJob(ref);
|
|
492
|
+
if (!job) {
|
|
493
|
+
err(`cron show: not found: ${ref}\n`);
|
|
494
|
+
return 1;
|
|
495
|
+
}
|
|
496
|
+
const sqlView = readScheduledWorkflows().get(job.id);
|
|
497
|
+
out(JSON.stringify({
|
|
498
|
+
jsonView: job,
|
|
499
|
+
sqlView: sqlView ?? null,
|
|
500
|
+
}, null, 2) + '\n');
|
|
501
|
+
return 0;
|
|
502
|
+
}
|
|
503
|
+
async function cmdCliRemove(ref, out, err) {
|
|
504
|
+
if (!ref) {
|
|
505
|
+
err('cron remove: id or name required\n');
|
|
506
|
+
return 2;
|
|
507
|
+
}
|
|
508
|
+
const job = resolveJob(ref);
|
|
509
|
+
if (!job) {
|
|
510
|
+
err(`cron remove: not found: ${ref}\n`);
|
|
511
|
+
return 1;
|
|
512
|
+
}
|
|
513
|
+
if (!(0, cronManager_1.deleteJob)(job.id)) {
|
|
514
|
+
err('cron remove: delete failed\n');
|
|
515
|
+
return 1;
|
|
516
|
+
}
|
|
517
|
+
deleteScheduledWorkflow(job.id);
|
|
518
|
+
await (0, cronManager_1.awaitPendingSaves)();
|
|
519
|
+
out(`cron removed: ${job.id} (${job.description})\n`);
|
|
520
|
+
return 0;
|
|
521
|
+
}
|
|
522
|
+
function cmdCliEnable(ref, out, err) {
|
|
523
|
+
if (!ref) {
|
|
524
|
+
err('cron enable: id or name required\n');
|
|
525
|
+
return 2;
|
|
526
|
+
}
|
|
527
|
+
const job = resolveJob(ref);
|
|
528
|
+
if (!job) {
|
|
529
|
+
err(`cron enable: not found: ${ref}\n`);
|
|
530
|
+
return 1;
|
|
531
|
+
}
|
|
532
|
+
if (!(0, cronManager_1.resumeJob)(job.id)) {
|
|
533
|
+
err('cron enable: enable failed\n');
|
|
534
|
+
return 1;
|
|
535
|
+
}
|
|
536
|
+
setWorkflowEnabled(job.id, 1);
|
|
537
|
+
out(`cron enabled: ${job.id}\n`);
|
|
538
|
+
return 0;
|
|
539
|
+
}
|
|
540
|
+
function cmdCliDisable(ref, out, err) {
|
|
541
|
+
if (!ref) {
|
|
542
|
+
err('cron disable: id or name required\n');
|
|
543
|
+
return 2;
|
|
544
|
+
}
|
|
545
|
+
const job = resolveJob(ref);
|
|
546
|
+
if (!job) {
|
|
547
|
+
err(`cron disable: not found: ${ref}\n`);
|
|
548
|
+
return 1;
|
|
549
|
+
}
|
|
550
|
+
if (!(0, cronManager_1.pauseJob)(job.id)) {
|
|
551
|
+
err('cron disable: disable failed\n');
|
|
552
|
+
return 1;
|
|
553
|
+
}
|
|
554
|
+
setWorkflowEnabled(job.id, 0);
|
|
555
|
+
out(`cron disabled: ${job.id}\n`);
|
|
556
|
+
return 0;
|
|
557
|
+
}
|
|
558
|
+
async function cmdCliRun(ref, out, err) {
|
|
559
|
+
if (!ref) {
|
|
560
|
+
err('cron run: id or name required\n');
|
|
561
|
+
return 2;
|
|
562
|
+
}
|
|
563
|
+
const job = resolveJob(ref);
|
|
564
|
+
if (!job) {
|
|
565
|
+
err(`cron run: not found: ${ref}\n`);
|
|
566
|
+
return 1;
|
|
567
|
+
}
|
|
568
|
+
out(`cron run: triggering ${job.id} (${job.description})...\n`);
|
|
569
|
+
const ok = await (0, cronManager_1.triggerJob)(job.id);
|
|
570
|
+
if (!ok) {
|
|
571
|
+
err('cron run: trigger failed\n');
|
|
572
|
+
return 1;
|
|
573
|
+
}
|
|
574
|
+
const fresh = (0, cronManager_1.getJob)(job.id);
|
|
575
|
+
out(`cron run: done — lastResult=${fresh?.lastResult ?? 'unknown'}\n`);
|
|
576
|
+
return 0;
|
|
577
|
+
}
|
|
578
|
+
async function cmdCliLogs(ref, out, err) {
|
|
579
|
+
if (!ref) {
|
|
580
|
+
err('cron logs: id or name required\n');
|
|
581
|
+
return 2;
|
|
582
|
+
}
|
|
583
|
+
const job = resolveJob(ref);
|
|
584
|
+
if (!job) {
|
|
585
|
+
err(`cron logs: not found: ${ref}\n`);
|
|
586
|
+
return 1;
|
|
587
|
+
}
|
|
588
|
+
const logPath = path.join(LOGS_DIR, `${job.id}.log`);
|
|
589
|
+
if (!fs.existsSync(logPath)) {
|
|
590
|
+
out(`No log yet for ${job.id} (${job.description}).\n`);
|
|
591
|
+
return 0;
|
|
592
|
+
}
|
|
593
|
+
const text = await node_fs_1.promises.readFile(logPath, 'utf-8');
|
|
594
|
+
const lines = text.split(/\r?\n/);
|
|
595
|
+
const tail = lines.slice(Math.max(0, lines.length - TAIL_LINES - 1));
|
|
596
|
+
out(`--- ${logPath} (last ${tail.length} lines) ---\n`);
|
|
597
|
+
out(tail.join('\n') + '\n');
|
|
598
|
+
return 0;
|
|
599
|
+
}
|
|
336
600
|
// ── SlashCommand definition ────────────────────────────────────────────────
|
|
337
601
|
exports.cron = {
|
|
338
602
|
name: 'cron',
|