c8ctl-plugin-nano 1.3.3 → 1.4.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 +61 -6
- package/c8ctl-plugin.js +73 -21
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -30,6 +30,30 @@ c8ctl nano start|status|stop|restart|logs|clean|set|config
|
|
|
30
30
|
on `localhost` (round-robin partition ownership), tracks them in a state file,
|
|
31
31
|
and waits until every node is reachable.
|
|
32
32
|
|
|
33
|
+
## Installation
|
|
34
|
+
|
|
35
|
+
This is a plugin for the [Camunda 8 CLI](https://www.npmjs.com/package/@camunda8/cli)
|
|
36
|
+
(`c8ctl`). Install the CLI, then load the plugin from npm:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 1. Install the Camunda 8 CLI (once); requires Node.js 18+
|
|
40
|
+
npm install -g @camunda8/cli
|
|
41
|
+
|
|
42
|
+
# 2. Load this plugin from the npm registry
|
|
43
|
+
c8ctl load plugin c8ctl-plugin-nano
|
|
44
|
+
|
|
45
|
+
# 3. Verify it's available
|
|
46
|
+
c8ctl nano --help
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The prebuilt Nano BPM server binary for your platform is pulled in automatically
|
|
50
|
+
as an npm `optionalDependency`, so there is nothing to compile. To pull a newer
|
|
51
|
+
release later, run `c8ctl nano update` (see
|
|
52
|
+
[Updating to a new release](#updating-to-a-new-release-update)).
|
|
53
|
+
|
|
54
|
+
> Loading from a local checkout instead? Use
|
|
55
|
+
> `c8ctl load plugin --from file:///path/to/c8ctl-nano`.
|
|
56
|
+
|
|
33
57
|
## Usage
|
|
34
58
|
|
|
35
59
|
```bash
|
|
@@ -113,6 +137,35 @@ c8ctl nano stop --purge # stop and remove engine data in one step
|
|
|
113
137
|
|
|
114
138
|
`clean` refuses to run while any node is alive.
|
|
115
139
|
|
|
140
|
+
### Stress / throughput runs: bounding disk and RAM
|
|
141
|
+
|
|
142
|
+
The engine journal (`journal.jsonl`) is **append-only** — there is currently no
|
|
143
|
+
compaction or rotation — and the read-model retains every terminal instance by
|
|
144
|
+
default. Under sustained high load (tens of thousands of PI/s) this fills the
|
|
145
|
+
disk quickly. Two `start` flags keep a long run bounded:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Pure throughput: no journal / read-model on disk at all (in-memory engine).
|
|
149
|
+
# State is lost on stop/restart, and instances live in RAM — so cap them.
|
|
150
|
+
c8ctl nano start --in-memory --history-max 50000
|
|
151
|
+
|
|
152
|
+
# Exercise the disk path but cap the read model's terminal-instance history.
|
|
153
|
+
# (The journal still grows append-only; watch free space.)
|
|
154
|
+
c8ctl nano start --history-max 50000
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- `--in-memory` (alias `--no-journal`) routes the engine to an in-memory journal
|
|
158
|
+
and a `:memory:` read store — nothing is written under `NANOBPMN_DATA_DIR`.
|
|
159
|
+
- `--history-max <n>` sets `NANOBPMN_HISTORY_MAX_INSTANCES`, continuously pruning
|
|
160
|
+
all but the most recent *n* terminal instances from the read model (`0`/unset =
|
|
161
|
+
unbounded). Works in both storage modes.
|
|
162
|
+
|
|
163
|
+
`c8ctl nano status` reports the active storage mode (`in-memory` vs `on-disk`)
|
|
164
|
+
and the history cap.
|
|
165
|
+
|
|
166
|
+
> ⚠️ With `--in-memory`, restart recovers nothing, and Raft/replicated logs are
|
|
167
|
+
> not persisted. Use it for stress/throughput testing, not durability testing.
|
|
168
|
+
|
|
116
169
|
## Configuration (`set` / `config`)
|
|
117
170
|
|
|
118
171
|
Persistent settings are stored in `<state home>/config.json`:
|
|
@@ -370,13 +423,13 @@ ProcessOS is the optimization-plane server that analyses a running Nano BPM
|
|
|
370
423
|
engine. The plugin can manage a single local ProcessOS instance with the same
|
|
371
424
|
start/stop/status/logs lifecycle as `nano`.
|
|
372
425
|
|
|
373
|
-
> **ProcessOS is a closed
|
|
426
|
+
> **ProcessOS is a closed beta.** The operational commands (`start`, `stop`,
|
|
374
427
|
> `status`, `logs`, `restart`) stay locked with a *"not available yet"* notice
|
|
375
428
|
> until you opt in. Only `set` and `config` work before then. Opt in either by
|
|
376
429
|
> setting the download URL you were given by the Nano BPM team, or by pointing
|
|
377
430
|
> the plugin at a binary you already have.
|
|
378
431
|
|
|
379
|
-
### Quick install (closed-
|
|
432
|
+
### Quick install (closed-beta invitees)
|
|
380
433
|
|
|
381
434
|
If you were given a ProcessOS download URL, this one-liner installs the Camunda 8
|
|
382
435
|
CLI (`@camunda8/cli`) and this plugin, then configures the download URL:
|
|
@@ -391,7 +444,7 @@ curl -fsSL https://gist.githubusercontent.com/jwulf/9015a7c660b274c568d80e85c391
|
|
|
391
444
|
|
|
392
445
|
|
|
393
446
|
```bash
|
|
394
|
-
# Closed-
|
|
447
|
+
# Closed-beta channel: persist the download URL, then start
|
|
395
448
|
c8ctl processos set download-url <url you were given>
|
|
396
449
|
c8ctl processos start # fetches processos-<os>-<arch> on first run
|
|
397
450
|
|
|
@@ -423,7 +476,7 @@ c8ctl processos stop
|
|
|
423
476
|
|
|
424
477
|
### Automatic update notice
|
|
425
478
|
|
|
426
|
-
When you're on the closed-
|
|
479
|
+
When you're on the closed-beta channel (download URL configured), the
|
|
427
480
|
plugin checks for newer ProcessOS builds in the background and prints a short
|
|
428
481
|
one-line notice (at most **once per day**) when the published version is newer
|
|
429
482
|
than the one you're running. It compares your installed binary's version against
|
|
@@ -473,7 +526,7 @@ Settings persist under a `processos` key in the same `config.json` as `nano`.
|
|
|
473
526
|
|
|
474
527
|
```bash
|
|
475
528
|
c8ctl processos set bin <path> # path to the downloaded ProcessOS binary
|
|
476
|
-
c8ctl processos set download-url <url> # closed-
|
|
529
|
+
c8ctl processos set download-url <url> # closed-beta binary download URL (enables ProcessOS)
|
|
477
530
|
c8ctl processos set port <n> # listen port (default 8090)
|
|
478
531
|
c8ctl processos set nano-url <url> # target Nano BPM engine (default http://localhost:8080)
|
|
479
532
|
c8ctl processos set data-dir <path> # PROCESSOS_DATA_DIR (default <stateHome>/processos-data)
|
|
@@ -489,7 +542,7 @@ configured download URL (`set download-url` / `$PROCESSOS_DOWNLOAD_URL`). Typed
|
|
|
489
542
|
settings (`port`, `nano-url`, `data-dir`) always
|
|
490
543
|
win over generic `env` passthrough values when launching.
|
|
491
544
|
|
|
492
|
-
## Installing
|
|
545
|
+
## Installing from a local checkout (development)
|
|
493
546
|
|
|
494
547
|
```bash
|
|
495
548
|
c8ctl load plugin --from file:///path/to/c8ctl-nano
|
|
@@ -501,6 +554,8 @@ Then verify it shows up:
|
|
|
501
554
|
c8ctl help | grep nano
|
|
502
555
|
```
|
|
503
556
|
|
|
557
|
+
For the normal npm install, see [Installation](#installation) above.
|
|
558
|
+
|
|
504
559
|
## Distribution & releasing
|
|
505
560
|
|
|
506
561
|
Releases are automated with **semantic-release** (`.github/workflows/release.yml`,
|
package/c8ctl-plugin.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*
|
|
20
20
|
* Usage:
|
|
21
21
|
* c8ctl nano start [<nodes>] [--port <basePort>] [--partitions <n>] [--rf <n>]
|
|
22
|
+
* [--in-memory] [--history-max <n>]
|
|
22
23
|
* c8ctl nano status
|
|
23
24
|
* c8ctl nano stop [--purge]
|
|
24
25
|
* c8ctl nano logs [<nodeId>] [--follow]
|
|
@@ -119,7 +120,7 @@ const UPDATE_CACHE_FILE = 'update-check.json';
|
|
|
119
120
|
const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1000;
|
|
120
121
|
const UPDATE_NOTIFY_TTL_MS = 24 * 60 * 60 * 1000;
|
|
121
122
|
|
|
122
|
-
// ProcessOS is a closed
|
|
123
|
+
// ProcessOS is a closed beta distributed out-of-band: the binary lives in an
|
|
123
124
|
// S3 bucket whose base URL is handed to enabled users via PROCESSOS_DOWNLOAD_URL.
|
|
124
125
|
// `<base>/processos-<os>-<arch>[.exe]` is the per-platform binary and
|
|
125
126
|
// `<base>/version.json` is the {version,commit,updated} metadata the CI writes
|
|
@@ -322,6 +323,8 @@ function parseRequest(args, flags) {
|
|
|
322
323
|
purge: Boolean(flags?.purge),
|
|
323
324
|
force: Boolean(flags?.force),
|
|
324
325
|
capture: Boolean(flags?.capture),
|
|
326
|
+
inMemory: Boolean(flags?.['in-memory'] || flags?.['no-journal']),
|
|
327
|
+
historyMax: intFlag('history-max'),
|
|
325
328
|
workspace: Boolean(flags?.workspace),
|
|
326
329
|
check: Boolean(flags?.check),
|
|
327
330
|
binary: flags?.binary,
|
|
@@ -496,6 +499,8 @@ async function startCluster(req) {
|
|
|
496
499
|
// Raft is required for replication; auto-enable when RF > 1, allow override.
|
|
497
500
|
const raft = req.raft === undefined ? rf > 1 : Boolean(req.raft);
|
|
498
501
|
const capture = Boolean(req.capture);
|
|
502
|
+
const inMemory = Boolean(req.inMemory);
|
|
503
|
+
const historyMax = req.historyMax;
|
|
499
504
|
|
|
500
505
|
if (partitions < nodeCount) {
|
|
501
506
|
logger.warn(
|
|
@@ -506,6 +511,21 @@ async function startCluster(req) {
|
|
|
506
511
|
if (req.rf && req.rf > nodeCount) {
|
|
507
512
|
logger.warn(`--rf ${req.rf} clamped to node count (${nodeCount}).`);
|
|
508
513
|
}
|
|
514
|
+
if (inMemory) {
|
|
515
|
+
logger.warn(
|
|
516
|
+
'In-memory mode: no journal or read-model is written to disk. Engine state is ' +
|
|
517
|
+
'lost on stop/restart, and every retained instance lives in RAM' +
|
|
518
|
+
(historyMax === undefined
|
|
519
|
+
? ' — pair with --history-max <N> to bound RAM under sustained load.'
|
|
520
|
+
: '.'),
|
|
521
|
+
);
|
|
522
|
+
if (raft || rf > 1) {
|
|
523
|
+
logger.warn(
|
|
524
|
+
'In-memory mode with Raft/replication: replicated logs are not persisted; ' +
|
|
525
|
+
'a restarted node recovers nothing.',
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
509
529
|
|
|
510
530
|
const binary = findBinary(req);
|
|
511
531
|
|
|
@@ -548,7 +568,9 @@ async function startCluster(req) {
|
|
|
548
568
|
|
|
549
569
|
logger.info(
|
|
550
570
|
`Starting Nano BPM cluster: ${nodeCount} node(s), ${partitions} partition(s), ` +
|
|
551
|
-
`RF=${rf}${raft ? ', Raft on' : ''}${capture ? ', trace capture on' : ''}
|
|
571
|
+
`RF=${rf}${raft ? ', Raft on' : ''}${capture ? ', trace capture on' : ''}` +
|
|
572
|
+
`${inMemory ? ', in-memory (no disk)' : ''}` +
|
|
573
|
+
`${historyMax !== undefined ? `, history-max=${historyMax}` : ''}`,
|
|
552
574
|
);
|
|
553
575
|
logger.info(`Binary: ${binary}`);
|
|
554
576
|
logger.info(`Workspace: ${workspaceDir} (models/, workers/)`);
|
|
@@ -558,7 +580,7 @@ async function startCluster(req) {
|
|
|
558
580
|
const port = ports[id];
|
|
559
581
|
const dataDir = join(getDataDir(), `node-${id}`);
|
|
560
582
|
const logFile = join(getLogDir(), `node-${id}.log`);
|
|
561
|
-
mkdirSync(dataDir, { recursive: true });
|
|
583
|
+
if (!inMemory) mkdirSync(dataDir, { recursive: true });
|
|
562
584
|
|
|
563
585
|
const env = {
|
|
564
586
|
...process.env,
|
|
@@ -567,7 +589,6 @@ async function startCluster(req) {
|
|
|
567
589
|
NANOBPMN_NODES: nodesEnv,
|
|
568
590
|
NANOBPMN_PARTITIONS: String(partitions),
|
|
569
591
|
NANOBPMN_RF: String(rf),
|
|
570
|
-
NANOBPMN_DATA_DIR: dataDir,
|
|
571
592
|
// Default to async durability (group-commit) for throughput; the user can
|
|
572
593
|
// override per the spread of process.env above by exporting
|
|
573
594
|
// NANOBPMN_DURABILITY (e.g. "sync") before running.
|
|
@@ -584,6 +605,22 @@ async function startCluster(req) {
|
|
|
584
605
|
// outside the per-node data dir so "nano clean" never wipes it.
|
|
585
606
|
NANOBPMN_WORKSPACE_DIR: workspaceDir,
|
|
586
607
|
};
|
|
608
|
+
// Storage axis: an on-disk journal + read-model under the per-node data dir
|
|
609
|
+
// (default), or a fully in-memory engine (in-memory journal + :memory: read
|
|
610
|
+
// store) when --in-memory is set. In in-memory mode, scrub any inherited
|
|
611
|
+
// path vars so nothing leaks back to disk.
|
|
612
|
+
if (inMemory) {
|
|
613
|
+
delete env.NANOBPMN_DATA_DIR;
|
|
614
|
+
delete env.NANOBPMN_JOURNAL;
|
|
615
|
+
delete env.NANOBPMN_READ_DB;
|
|
616
|
+
} else {
|
|
617
|
+
env.NANOBPMN_DATA_DIR = dataDir;
|
|
618
|
+
}
|
|
619
|
+
// Bound retained terminal instances in the read model when requested. Works
|
|
620
|
+
// in both storage modes (caps disk growth on-disk; caps RAM in-memory).
|
|
621
|
+
if (historyMax !== undefined) {
|
|
622
|
+
env.NANOBPMN_HISTORY_MAX_INSTANCES = String(historyMax);
|
|
623
|
+
}
|
|
587
624
|
if (raft) env.NANOBPMN_RAFT = '1';
|
|
588
625
|
// Trace capture: a single flag enables the Tier 2 recorded-input (stimuli)
|
|
589
626
|
// log AND auto-enables Tier 1 variable capture, so historical replay /
|
|
@@ -614,7 +651,7 @@ async function startCluster(req) {
|
|
|
614
651
|
process.exit(1);
|
|
615
652
|
}
|
|
616
653
|
|
|
617
|
-
nodes.push({ id, port, pid: child.pid, url: peers[id], dataDir, logFile });
|
|
654
|
+
nodes.push({ id, port, pid: child.pid, url: peers[id], dataDir: inMemory ? null : dataDir, logFile });
|
|
618
655
|
logger.info(` node ${id}: pid ${child.pid} → ${peers[id]} (log: ${logFile})`);
|
|
619
656
|
}
|
|
620
657
|
|
|
@@ -627,6 +664,8 @@ async function startCluster(req) {
|
|
|
627
664
|
rf,
|
|
628
665
|
raft,
|
|
629
666
|
capture,
|
|
667
|
+
inMemory,
|
|
668
|
+
historyMax: historyMax ?? null,
|
|
630
669
|
basePort,
|
|
631
670
|
nodes,
|
|
632
671
|
};
|
|
@@ -663,7 +702,7 @@ async function printSummary(state) {
|
|
|
663
702
|
console.log('');
|
|
664
703
|
console.log(
|
|
665
704
|
`Nano BPM cluster is up: ${state.nodes.length} node(s), ${state.partitions} partition(s), ` +
|
|
666
|
-
`RF=${state.rf}${state.raft ? ', Raft on' : ''}`,
|
|
705
|
+
`RF=${state.rf}${state.raft ? ', Raft on' : ''}${state.inMemory ? ', in-memory (no disk)' : ''}`,
|
|
667
706
|
);
|
|
668
707
|
console.log('');
|
|
669
708
|
for (const n of state.nodes) {
|
|
@@ -872,7 +911,14 @@ async function statusCluster(req) {
|
|
|
872
911
|
console.log(` binary: ${state.binary}`);
|
|
873
912
|
console.log(` version: ${binaryVersion(state.binary) ?? 'unknown'}`);
|
|
874
913
|
console.log(` workspace: ${state.workspaceDir || getWorkspaceDir()}`);
|
|
875
|
-
|
|
914
|
+
const historyNote =
|
|
915
|
+
state.historyMax != null ? `, history-max ${state.historyMax}` : '';
|
|
916
|
+
if (state.inMemory) {
|
|
917
|
+
console.log(` storage: in-memory (no journal/read-model on disk${historyNote})`);
|
|
918
|
+
} else {
|
|
919
|
+
console.log(` storage: on-disk${historyNote}`);
|
|
920
|
+
console.log(` data: ${getDataDir()}`);
|
|
921
|
+
}
|
|
876
922
|
console.log('');
|
|
877
923
|
console.log(' NODE PORT PID PROCESS HEALTH URL');
|
|
878
924
|
for (const c of checks) {
|
|
@@ -1438,7 +1484,7 @@ function getProcessosNanoUrl() {
|
|
|
1438
1484
|
}
|
|
1439
1485
|
|
|
1440
1486
|
/**
|
|
1441
|
-
* The closed-
|
|
1487
|
+
* The closed-beta download URL: env var (PROCESSOS_DOWNLOAD_URL) wins, then the
|
|
1442
1488
|
* persisted `processos set download-url` config value. Null when neither is set.
|
|
1443
1489
|
*/
|
|
1444
1490
|
function getProcessosDownloadUrl() {
|
|
@@ -1699,7 +1745,7 @@ async function resolveProcessosBinary(req) {
|
|
|
1699
1745
|
}
|
|
1700
1746
|
|
|
1701
1747
|
/**
|
|
1702
|
-
* Whether ProcessOS is enabled for this user. It is a closed
|
|
1748
|
+
* Whether ProcessOS is enabled for this user. It is a closed beta, so the
|
|
1703
1749
|
* operational commands stay locked until the user either has the binary on
|
|
1704
1750
|
* their system (configured path / cached download / local build) or has been
|
|
1705
1751
|
* given a PROCESSOS_DOWNLOAD_URL to fetch it from.
|
|
@@ -1710,16 +1756,16 @@ function processosEnabled(req) {
|
|
|
1710
1756
|
if (findConfiguredProcessosBinary(req)) return true;
|
|
1711
1757
|
} catch {
|
|
1712
1758
|
// A configured-but-missing path still means the user opted in; let the real
|
|
1713
|
-
// not-found error surface from the command rather than the closed-
|
|
1759
|
+
// not-found error surface from the command rather than the closed-beta gate.
|
|
1714
1760
|
return true;
|
|
1715
1761
|
}
|
|
1716
1762
|
return false;
|
|
1717
1763
|
}
|
|
1718
1764
|
|
|
1719
|
-
function
|
|
1765
|
+
function printProcessosClosedBeta() {
|
|
1720
1766
|
const logger = getLogger();
|
|
1721
1767
|
logger.error(
|
|
1722
|
-
'ProcessOS is in closed
|
|
1768
|
+
'ProcessOS is in closed beta and is not available yet.\n' +
|
|
1723
1769
|
'\n' +
|
|
1724
1770
|
'To enable it, set the download URL you were given by the Nano BPM team:\n' +
|
|
1725
1771
|
' c8ctl processos set download-url <url> # persists it for this machine\n' +
|
|
@@ -1815,7 +1861,7 @@ function printProcessosUpdateNotice(current, latest) {
|
|
|
1815
1861
|
* Best-effort, non-blocking ProcessOS update check. Triggers a background
|
|
1816
1862
|
* version.json fetch when the cache is stale and prints a notice (at most once
|
|
1817
1863
|
* per day) when the published version is newer than the installed one. Only
|
|
1818
|
-
* meaningful when a download URL is configured (the closed-
|
|
1864
|
+
* meaningful when a download URL is configured (the closed-beta channel).
|
|
1819
1865
|
*/
|
|
1820
1866
|
function maybeNotifyProcessosUpdate(req) {
|
|
1821
1867
|
try {
|
|
@@ -2114,7 +2160,7 @@ function printProcessosSetUsage() {
|
|
|
2114
2160
|
const logger = getLogger();
|
|
2115
2161
|
logger.info('Usage: c8ctl processos set <field> <value>');
|
|
2116
2162
|
logger.info(' bin <path> Path to the downloaded ProcessOS binary');
|
|
2117
|
-
logger.info(' download-url <url> Closed-
|
|
2163
|
+
logger.info(' download-url <url> Closed-beta binary download URL (enables ProcessOS)');
|
|
2118
2164
|
logger.info(' port <n> Listen port (default 8090)');
|
|
2119
2165
|
logger.info(' nano-url <url> Target Nano BPM engine URL (default http://localhost:8080)');
|
|
2120
2166
|
logger.info(' data-dir <path> ProcessOS data directory');
|
|
@@ -2229,14 +2275,14 @@ function showProcessosConfig() {
|
|
|
2229
2275
|
}
|
|
2230
2276
|
}
|
|
2231
2277
|
console.log('');
|
|
2232
|
-
console.log(' closed-
|
|
2278
|
+
console.log(' closed-beta channel:');
|
|
2233
2279
|
const dlUrl = getProcessosDownloadUrl();
|
|
2234
2280
|
const dlSource = process.env.PROCESSOS_DOWNLOAD_URL && String(process.env.PROCESSOS_DOWNLOAD_URL).trim()
|
|
2235
2281
|
? ' (from $PROCESSOS_DOWNLOAD_URL)'
|
|
2236
2282
|
: cfg.downloadUrl
|
|
2237
2283
|
? ' (from "processos set download-url")'
|
|
2238
2284
|
: '';
|
|
2239
|
-
console.log(` download url ${dlUrl ? dlUrl + dlSource : '(not set — ProcessOS is a closed
|
|
2285
|
+
console.log(` download url ${dlUrl ? dlUrl + dlSource : '(not set — ProcessOS is a closed beta; "c8ctl processos set download-url <url>" to enable)'}`);
|
|
2240
2286
|
const cached = getProcessosCachedBinaryPath();
|
|
2241
2287
|
const meta = readProcessosBinaryMeta();
|
|
2242
2288
|
console.log(` cached binary ${existsSync(cached) ? cached : '(none — downloaded on first "processos start")'}`);
|
|
@@ -2262,7 +2308,7 @@ function printProcessosUsage() {
|
|
|
2262
2308
|
console.log(' c8ctl processos set bin <path> | download-url <url> | port <n> | nano-url <url> | data-dir <path> | env KEY=VALUE');
|
|
2263
2309
|
console.log(' c8ctl processos config');
|
|
2264
2310
|
console.log('');
|
|
2265
|
-
console.log('ProcessOS is a closed
|
|
2311
|
+
console.log('ProcessOS is a closed beta. Enable it with the download URL you were given:');
|
|
2266
2312
|
console.log(' c8ctl processos set download-url <url> # plugin downloads + runs the matching binary');
|
|
2267
2313
|
console.log('or point the plugin at a binary you already have: "c8ctl processos set bin <path>".');
|
|
2268
2314
|
console.log('By default ProcessOS spawns its own internal pilot Nano engine (the plugin auto-wires the nano');
|
|
@@ -2311,6 +2357,7 @@ export const metadata = {
|
|
|
2311
2357
|
},
|
|
2312
2358
|
{ command: 'c8ctl nano start 3 --port 9000', description: 'Start 3 nodes on ports 9000..9002' },
|
|
2313
2359
|
{ command: 'c8ctl nano start --capture', description: 'Start with trace capture for historical replay/analysis' },
|
|
2360
|
+
{ command: 'c8ctl nano start --in-memory --history-max 50000', description: 'Stress mode: no disk journal, cap retained instances in RAM' },
|
|
2314
2361
|
{ command: 'c8ctl nano status', description: 'Show cluster status and per-node health' },
|
|
2315
2362
|
{ command: 'c8ctl nano pause 1', description: 'Freeze node 1 (SIGSTOP) to simulate a node failure' },
|
|
2316
2363
|
{ command: 'c8ctl nano resume 1', description: 'Resume node 1 (SIGCONT) to bring it back online' },
|
|
@@ -2328,7 +2375,7 @@ export const metadata = {
|
|
|
2328
2375
|
processos: {
|
|
2329
2376
|
description: 'Manage a local ProcessOS instance — start, status, stop, logs, config',
|
|
2330
2377
|
examples: [
|
|
2331
|
-
{ command: 'c8ctl processos set download-url <url>', description: 'Enable the closed
|
|
2378
|
+
{ command: 'c8ctl processos set download-url <url>', description: 'Enable the closed beta + auto-download the matching binary' },
|
|
2332
2379
|
{ command: 'c8ctl processos set bin <path>', description: 'Point the plugin at a ProcessOS binary you already have' },
|
|
2333
2380
|
{ command: 'c8ctl processos start', description: 'Start ProcessOS against the local Nano BPM engine' },
|
|
2334
2381
|
{ command: 'c8ctl processos start --nano-url http://localhost:8080', description: 'Start against a specific engine' },
|
|
@@ -2353,6 +2400,9 @@ export const commands = {
|
|
|
2353
2400
|
rf: { type: 'string', description: 'Replication factor; >1 enables Raft (default 1)' },
|
|
2354
2401
|
raft: { type: 'boolean', description: 'Force per-partition Raft on/off (default: on when rf>1)' },
|
|
2355
2402
|
capture: { type: 'boolean', description: 'start: enable trace capture (recorded-input replay) on every node' },
|
|
2403
|
+
'in-memory': { type: 'boolean', description: 'start: run with NO on-disk journal/read-model (in-memory engine; state lost on restart). Alias: --no-journal' },
|
|
2404
|
+
'no-journal': { type: 'boolean', description: 'start: alias for --in-memory' },
|
|
2405
|
+
'history-max': { type: 'string', description: 'start: cap retained terminal instances in the read model (NANOBPMN_HISTORY_MAX_INSTANCES; 0/unset = unbounded)' },
|
|
2356
2406
|
follow: { type: 'boolean', description: 'logs: stream output (tail -F)', short: 'f' },
|
|
2357
2407
|
purge: { type: 'boolean', description: 'stop: also delete per-node engine data' },
|
|
2358
2408
|
force: { type: 'boolean', description: 'start: stop any existing cluster first' },
|
|
@@ -2435,12 +2485,12 @@ export const commands = {
|
|
|
2435
2485
|
return;
|
|
2436
2486
|
}
|
|
2437
2487
|
|
|
2438
|
-
// ProcessOS is a closed
|
|
2488
|
+
// ProcessOS is a closed beta: gate the operational commands until the
|
|
2439
2489
|
// user has opted in (download URL set or a binary on their system).
|
|
2440
2490
|
// `set`/`config` stay open so users can configure/inspect at any time.
|
|
2441
2491
|
const ungated = req.subcommand === 'set' || req.subcommand === 'config';
|
|
2442
2492
|
if (!ungated && !processosEnabled(req)) {
|
|
2443
|
-
|
|
2493
|
+
printProcessosClosedBeta();
|
|
2444
2494
|
process.exit(1);
|
|
2445
2495
|
}
|
|
2446
2496
|
|
|
@@ -2484,7 +2534,7 @@ export const commands = {
|
|
|
2484
2534
|
|
|
2485
2535
|
function printUsage() {
|
|
2486
2536
|
console.log('Usage:');
|
|
2487
|
-
console.log(' c8ctl nano start [<nodes>] [--port <basePort>] [--partitions <n>] [--rf <n>] [--raft] [--capture] [--binary <path>]');
|
|
2537
|
+
console.log(' c8ctl nano start [<nodes>] [--port <basePort>] [--partitions <n>] [--rf <n>] [--raft] [--capture] [--in-memory] [--history-max <n>] [--binary <path>]');
|
|
2488
2538
|
console.log(' c8ctl nano status [--port <port>]');
|
|
2489
2539
|
console.log(' c8ctl nano stop [--purge]');
|
|
2490
2540
|
console.log(' c8ctl nano logs [<nodeId>] [--follow]');
|
|
@@ -2516,6 +2566,8 @@ function printUsage() {
|
|
|
2516
2566
|
console.log(' --rf <n> Replication factor; >1 enables Raft (default 1)');
|
|
2517
2567
|
console.log(' --raft Force Raft on (default: on iff rf>1)');
|
|
2518
2568
|
console.log(' --capture start: enable trace capture (recorded-input replay) on every node');
|
|
2569
|
+
console.log(' --in-memory start: run with NO on-disk journal/read-model (alias --no-journal; state lost on restart)');
|
|
2570
|
+
console.log(' --history-max <n> start: cap retained terminal instances in the read model (0/unset = unbounded)');
|
|
2519
2571
|
console.log(' --binary <path> Path to the nanobpmn server binary (overrides "set bin")');
|
|
2520
2572
|
console.log(' --purge stop: also delete per-node engine data');
|
|
2521
2573
|
console.log(' --force start: stop any existing cluster first');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "c8ctl-plugin-nano",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "c8ctl plugin to start, inspect, and stop a local Nano BPM (nanobpmn) cluster",
|
|
6
6
|
"main": "c8ctl-plugin.js",
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
"semantic-release": "^25.0.3"
|
|
50
50
|
},
|
|
51
51
|
"optionalDependencies": {
|
|
52
|
-
"@nanobpm/c8ctl-plugin-nano-darwin-arm64": "1.
|
|
53
|
-
"@nanobpm/c8ctl-plugin-nano-darwin-x64": "1.
|
|
54
|
-
"@nanobpm/c8ctl-plugin-nano-linux-x64": "1.
|
|
55
|
-
"@nanobpm/c8ctl-plugin-nano-linux-arm64": "1.
|
|
56
|
-
"@nanobpm/c8ctl-plugin-nano-win32-x64": "1.
|
|
52
|
+
"@nanobpm/c8ctl-plugin-nano-darwin-arm64": "1.4.0",
|
|
53
|
+
"@nanobpm/c8ctl-plugin-nano-darwin-x64": "1.4.0",
|
|
54
|
+
"@nanobpm/c8ctl-plugin-nano-linux-x64": "1.4.0",
|
|
55
|
+
"@nanobpm/c8ctl-plugin-nano-linux-arm64": "1.4.0",
|
|
56
|
+
"@nanobpm/c8ctl-plugin-nano-win32-x64": "1.4.0"
|
|
57
57
|
}
|
|
58
58
|
}
|