@nexus-cortex/cli 4.137.9 → 4.137.11
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/.env.defaults +7 -0
- package/dist/commands/schedule.d.ts.map +1 -1
- package/dist/commands/schedule.js +14 -2
- package/dist/commands/schedule.js.map +1 -1
- package/dist/lifecycle/schedule.d.ts +5 -30
- package/dist/lifecycle/schedule.d.ts.map +1 -1
- package/dist/lifecycle/schedule.js +3 -87
- package/dist/lifecycle/schedule.js.map +1 -1
- package/package.json +2 -2
package/.env.defaults
CHANGED
|
@@ -2073,6 +2073,13 @@ CORTEX_ENDTURN_GATE=true
|
|
|
2073
2073
|
# Unset (default) = the old hop behaviour for servers started by hand. [LEDGER 2026-11-14 @4.137.4] STATUS: on for CLI-started servers;
|
|
2074
2074
|
# e2e on the repl (busy port 4519 → server exits, CLI reports it, no hop).
|
|
2075
2075
|
#CORTEX_SERVER_STRICT_PORT=
|
|
2076
|
+
# CORTEX_TUI_SCHEDULER — the in-session scheduler (operator 11-14: a first-class team member works through its TUI). While a fuzzycortex /
|
|
2077
|
+
# neoncortex window is open it OWNS ~/.cortex/schedules.json (heartbeat ~/.cortex/schedule-owner.json, stale after 150 s): a due job runs
|
|
2078
|
+
# as a turn in THAT session when the input box is empty and nobody typed for 60 s, marked "[scheduled <tag>]"; `cortex schedule run-due`
|
|
2079
|
+
# (the launchd/cron ticker) stands down meanwhile and takes over again when the window closes. off = the window never runs jobs (the ticker
|
|
2080
|
+
# runs them headlessly as before). Default on. [LEDGER 2026-11-14 @4.137.11] STATUS: pending — core unit tests (8) pass; first real run =
|
|
2081
|
+
# the m2/macbook cortex agents' [mail poll] job in their open TUI.
|
|
2082
|
+
#CORTEX_TUI_SCHEDULER=
|
|
2076
2083
|
#CORTEX_HERDR_BIN=
|
|
2077
2084
|
# CORTEX_TERMINAL_BACKEND — R146 HB-HERDR-TERMINAL-BACKEND (4.108.17): the seam under Bash `persistentSession`, TmuxSessionTool and CreateArtifactTool
|
|
2078
2085
|
# persistent/dev artifacts. auto (default) = herdr pane backend when HERDR_ENV=1 + `herdr` resolvable + `pane list` answers > tmux (TmuxManager)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AA4BA;;4GAE4G;AAC5G,wBAAgB,UAAU,CAAC,OAAO,SAAyB,GAAG,MAAM,CAKnE;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AA4BA;;4GAE4G;AAC5G,wBAAgB,UAAU,CAAC,OAAO,SAAyB,GAAG,MAAM,CAKnE;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D5G"}
|
|
@@ -9,7 +9,7 @@ import fs from 'fs';
|
|
|
9
9
|
import os from 'os';
|
|
10
10
|
import path from 'path';
|
|
11
11
|
import { fileURLToPath } from 'url';
|
|
12
|
-
import { acquireTickLock, dueJobs, jobInvocation, loadJobs, mailGate, removeJob, saveJobs, schedulesFile, upsertJob } from '../lifecycle/schedule.js';
|
|
12
|
+
import { acquireTickLock, dueJobs, jobInvocation, liveScheduleOwner, loadJobs, mailGate, removeJob, saveJobs, schedulesFile, upsertJob } from '../lifecycle/schedule.js';
|
|
13
13
|
const CORTEX_JS = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'bin', 'cortex.js');
|
|
14
14
|
const LOG = path.join(os.homedir(), '.cortex', 'schedule.log');
|
|
15
15
|
const LOCK = path.join(os.homedir(), '.cortex', 'schedule-tick.lock');
|
|
@@ -65,10 +65,22 @@ export async function scheduleCli(op, tag, o) {
|
|
|
65
65
|
}
|
|
66
66
|
for (const j of jobs)
|
|
67
67
|
console.log(`${j.enabled === false ? 'off' : 'on '} ${j.tag} every ${j.everyMin} min${j.mailOnly ? ` · mail-only (${j.mailName})` : ''}${j.yolo ? ' · yolo' : ''} · last ${j.lastRunMs ? new Date(j.lastRunMs).toISOString() : 'never'}${j.lastRc !== undefined ? ` rc ${j.lastRc}` : ''}`);
|
|
68
|
+
{
|
|
69
|
+
const ow = liveScheduleOwner();
|
|
70
|
+
if (ow)
|
|
71
|
+
console.log(`runner: ${ow.ui} window (pid ${ow.pid}) runs due jobs in its session while open; the ticker stands down`);
|
|
72
|
+
}
|
|
68
73
|
console.log(`ticker: ${process.platform === 'darwin' ? (fs.existsSync(PLIST) ? 'launchd installed' : 'NOT installed (cortex schedule install)') : 'crontab (cortex schedule install)'} · log ${LOG}`);
|
|
69
74
|
return;
|
|
70
75
|
}
|
|
71
76
|
case 'run-due': {
|
|
77
|
+
// an open TUI owns the schedule and runs due jobs inside its own session while idle — stand down so nothing runs twice
|
|
78
|
+
const owner = liveScheduleOwner();
|
|
79
|
+
if (owner) {
|
|
80
|
+
if (o.dryRun)
|
|
81
|
+
console.log(`[schedule] owned by ${owner.ui} pid ${owner.pid} on ${owner.host} — the ticker stands down`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
72
84
|
const release = acquireTickLock(LOCK);
|
|
73
85
|
if (!release)
|
|
74
86
|
return; // a previous tick's turn is still running
|
|
@@ -80,7 +92,7 @@ export async function scheduleCli(op, tag, o) {
|
|
|
80
92
|
console.log(`[schedule] would run ${j.tag}`);
|
|
81
93
|
continue;
|
|
82
94
|
}
|
|
83
|
-
jobs = loadJobs(file).map((x) => x.tag === j.tag ? { ...x, lastRunMs: Date.now() } : x);
|
|
95
|
+
jobs = loadJobs(file).map((x) => x.tag === j.tag ? { ...x, lastRunMs: Date.now(), lastRunner: 'ticker' } : x);
|
|
84
96
|
saveJobs(file, jobs); // stamp BEFORE: a crash never re-fires in a loop
|
|
85
97
|
const inv = jobInvocation(j, CORTEX_JS);
|
|
86
98
|
const t0 = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAoB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
model?: string;
|
|
7
|
-
cwd?: string;
|
|
8
|
-
mailName?: string;
|
|
9
|
-
mailOnly?: boolean;
|
|
10
|
-
yolo?: boolean;
|
|
11
|
-
enabled?: boolean;
|
|
12
|
-
lastRunMs?: number;
|
|
13
|
-
lastRc?: number;
|
|
14
|
-
}
|
|
15
|
-
export declare function schedulesFile(): string;
|
|
16
|
-
export declare function loadJobs(file?: string): ScheduleJob[];
|
|
17
|
-
export declare function saveJobs(file: string, jobs: ScheduleJob[]): void;
|
|
18
|
-
export declare function upsertJob(jobs: ScheduleJob[], j: ScheduleJob): ScheduleJob[];
|
|
19
|
-
export declare function removeJob(jobs: ScheduleJob[], tag: string): ScheduleJob[];
|
|
20
|
-
/** Due when never run or a full period passed (20 s slack so a 60 s ticker does not slip a period). */
|
|
21
|
-
export declare function dueJobs(jobs: ScheduleJob[], nowMs: number): ScheduleJob[];
|
|
22
|
-
/** argv + env for one headless turn. `cortexJs` = this install's bin/cortex.js (absolute: launchd has a minimal PATH). */
|
|
23
|
-
export declare function jobInvocation(j: ScheduleJob, cortexJs: string): {
|
|
24
|
-
args: string[];
|
|
25
|
-
env: Record<string, string>;
|
|
26
|
-
};
|
|
27
|
-
/** mailOnly jobs pass only when `peek` (mail.py read --peek as the job's address) shows mail. Other jobs always pass. */
|
|
28
|
-
export declare function mailGate(j: ScheduleJob, peek: (mailName: string) => string): boolean;
|
|
29
|
-
/** One tick at a time (a turn can outlast the 60 s period). Returns a release fn, or null when another live tick holds it. */
|
|
30
|
-
export declare function acquireTickLock(lockFile: string, staleMs?: number): (() => void) | null;
|
|
1
|
+
/**
|
|
2
|
+
* `cortex schedule` core — moved to @nexus-cortex/core (config/schedule.ts, 2026-11-14) so the TUIs' in-session scheduler and the OS
|
|
3
|
+
* ticker share one implementation (library-first). Re-exported here for the CLI command and its tests.
|
|
4
|
+
*/
|
|
5
|
+
export { schedulesFile, scheduleOwnerFile, loadJobs, saveJobs, upsertJob, removeJob, dueJobs, stampJob, jobInvocation, mailGate, hasUnreadMail, peekMailAsync, acquireTickLock, readScheduleOwner, liveScheduleOwner, claimScheduleOwner, releaseScheduleOwner, OWNER_STALE_MS, InSessionScheduler, scheduledTurnPrompt, type ScheduleJob, type ScheduleOwner, } from '@nexus-cortex/core';
|
|
31
6
|
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/lifecycle/schedule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/lifecycle/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EACrI,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAC9H,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,GAC9E,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,90 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `cortex schedule` core (2026-11-14)
|
|
3
|
-
*
|
|
4
|
-
* (~/.cortex/schedules.json) and the OS scheduler (launchd on macOS, cron on Linux) runs `cortex schedule run-due` every minute. Each
|
|
5
|
-
* due job sends its prompt to the agent's session headlessly. Unlike session-only crons they survive crashes, restarts and compactions.
|
|
6
|
-
*
|
|
7
|
-
* Safety: a scheduled turn is unattended. By default it runs WITHOUT auto-approve, so a tool that needs approval fails fast instead of
|
|
8
|
-
* waiting for a human (CLIApprovalHandler headless rule); `yolo: true` on a job opts in to auto-approve (the blacklist tier — Bash screen
|
|
9
|
-
* capture / input / app scripting — still asks, i.e. is refused headless). `mailOnly` jobs fire only when the agent has unread mail.
|
|
2
|
+
* `cortex schedule` core — moved to @nexus-cortex/core (config/schedule.ts, 2026-11-14) so the TUIs' in-session scheduler and the OS
|
|
3
|
+
* ticker share one implementation (library-first). Re-exported here for the CLI command and its tests.
|
|
10
4
|
*/
|
|
11
|
-
|
|
12
|
-
import os from 'os';
|
|
13
|
-
import path from 'path';
|
|
14
|
-
export function schedulesFile() { return path.join(os.homedir(), '.cortex', 'schedules.json'); }
|
|
15
|
-
export function loadJobs(file = schedulesFile()) {
|
|
16
|
-
try {
|
|
17
|
-
const d = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
18
|
-
return Array.isArray(d?.jobs) ? d.jobs : [];
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return [];
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export function saveJobs(file, jobs) {
|
|
25
|
-
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
26
|
-
const tmp = `${file}.tmp-${process.pid}`;
|
|
27
|
-
fs.writeFileSync(tmp, JSON.stringify({ jobs }, null, 1) + '\n');
|
|
28
|
-
fs.renameSync(tmp, file); // atomic: a tick never reads half a file
|
|
29
|
-
}
|
|
30
|
-
export function upsertJob(jobs, j) {
|
|
31
|
-
const i = jobs.findIndex((x) => x.tag === j.tag);
|
|
32
|
-
if (i < 0)
|
|
33
|
-
return [...jobs, j];
|
|
34
|
-
const out = [...jobs];
|
|
35
|
-
out[i] = { ...jobs[i], ...j };
|
|
36
|
-
return out;
|
|
37
|
-
}
|
|
38
|
-
export function removeJob(jobs, tag) { return jobs.filter((j) => j.tag !== tag); }
|
|
39
|
-
/** Due when never run or a full period passed (20 s slack so a 60 s ticker does not slip a period). */
|
|
40
|
-
export function dueJobs(jobs, nowMs) {
|
|
41
|
-
return jobs.filter((j) => j.enabled !== false && (!j.lastRunMs || nowMs - j.lastRunMs >= Math.max(1, j.everyMin) * 60_000 - 20_000));
|
|
42
|
-
}
|
|
43
|
-
/** argv + env for one headless turn. `cortexJs` = this install's bin/cortex.js (absolute: launchd has a minimal PATH). */
|
|
44
|
-
export function jobInvocation(j, cortexJs) {
|
|
45
|
-
const args = [cortexJs, '--quiet'];
|
|
46
|
-
// a pinned session resumes it; otherwise EVERY run starts its own fresh session (m2 11-14): continuing "the server's current session"
|
|
47
|
-
// mixed mail turns into whatever a human last ran (battery state), and sessions not started with --new missed the USER.md slot.
|
|
48
|
-
if (j.session)
|
|
49
|
-
args.push('--resume', j.session);
|
|
50
|
-
else
|
|
51
|
-
args.push('--new');
|
|
52
|
-
if (j.model)
|
|
53
|
-
args.push('-m', j.model);
|
|
54
|
-
args.push(j.prompt);
|
|
55
|
-
// warn, never block: an update-required refusal at every release darkened the m2's mail loop until someone ran cortex update (11-14)
|
|
56
|
-
const env = { CORTEX_UPDATE_POLICY: process.env.CORTEX_UPDATE_POLICY || 'warn' };
|
|
57
|
-
if (j.yolo)
|
|
58
|
-
env.YOLO = 'true';
|
|
59
|
-
return { args, env };
|
|
60
|
-
}
|
|
61
|
-
/** mailOnly jobs pass only when `peek` (mail.py read --peek as the job's address) shows mail. Other jobs always pass. */
|
|
62
|
-
export function mailGate(j, peek) {
|
|
63
|
-
if (!j.mailOnly)
|
|
64
|
-
return true;
|
|
65
|
-
const out = (peek(j.mailName || '') || '').trim();
|
|
66
|
-
return !!out && !/^no new mail/i.test(out);
|
|
67
|
-
}
|
|
68
|
-
/** One tick at a time (a turn can outlast the 60 s period). Returns a release fn, or null when another live tick holds it. */
|
|
69
|
-
export function acquireTickLock(lockFile, staleMs = 3 * 60 * 60_000) {
|
|
70
|
-
fs.mkdirSync(path.dirname(lockFile), { recursive: true });
|
|
71
|
-
const take = () => { const fd = fs.openSync(lockFile, 'wx'); fs.writeSync(fd, String(process.pid)); fs.closeSync(fd); return () => { try {
|
|
72
|
-
fs.rmSync(lockFile);
|
|
73
|
-
}
|
|
74
|
-
catch { /* gone */ } }; };
|
|
75
|
-
try {
|
|
76
|
-
return take();
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
try {
|
|
80
|
-
const st = fs.statSync(lockFile);
|
|
81
|
-
if (Date.now() - st.mtimeMs > staleMs) {
|
|
82
|
-
fs.rmSync(lockFile, { force: true });
|
|
83
|
-
return take();
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch { /* raced */ }
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
5
|
+
export { schedulesFile, scheduleOwnerFile, loadJobs, saveJobs, upsertJob, removeJob, dueJobs, stampJob, jobInvocation, mailGate, hasUnreadMail, peekMailAsync, acquireTickLock, readScheduleOwner, liveScheduleOwner, claimScheduleOwner, releaseScheduleOwner, OWNER_STALE_MS, InSessionScheduler, scheduledTurnPrompt, } from '@nexus-cortex/core';
|
|
90
6
|
//# sourceMappingURL=schedule.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/lifecycle/schedule.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/lifecycle/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EACrI,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAC9H,kBAAkB,EAAE,mBAAmB,GACxC,MAAM,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexus-cortex/cli",
|
|
3
|
-
"version": "4.137.
|
|
3
|
+
"version": "4.137.11",
|
|
4
4
|
"description": "Nexus Cortex CLI - Terminal interface for multi-provider LLM orchestration",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"prepack": "node ../../scripts/copy-pkg-cortex-scaffold.mjs"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@nexus-cortex/core": "4.137.
|
|
22
|
+
"@nexus-cortex/core": "4.137.11",
|
|
23
23
|
"chalk": "^4.1.2",
|
|
24
24
|
"cli-spinners": "^2.9.0",
|
|
25
25
|
"commander": "^11.0.0",
|