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 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 alpha.** The operational commands (`start`, `stop`,
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-alpha invitees)
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-alpha channel: persist the download URL, then start
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-alpha channel (download URL configured), the
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-alpha binary download URL (enables ProcessOS)
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 alpha distributed out-of-band: the binary lives in an
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
- console.log(` data: ${getDataDir()}`);
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-alpha download URL: env var (PROCESSOS_DOWNLOAD_URL) wins, then the
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 alpha, so the
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-alpha gate.
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 printProcessosClosedAlpha() {
1765
+ function printProcessosClosedBeta() {
1720
1766
  const logger = getLogger();
1721
1767
  logger.error(
1722
- 'ProcessOS is in closed alpha and is not available yet.\n' +
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-alpha channel).
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-alpha binary download URL (enables ProcessOS)');
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-alpha channel:');
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 alpha; "c8ctl processos set download-url <url>" to enable)'}`);
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 alpha. Enable it with the download URL you were given:');
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 alpha + auto-download the matching binary' },
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 alpha: gate the operational commands until the
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
- printProcessosClosedAlpha();
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.3",
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.3.3",
53
- "@nanobpm/c8ctl-plugin-nano-darwin-x64": "1.3.3",
54
- "@nanobpm/c8ctl-plugin-nano-linux-x64": "1.3.3",
55
- "@nanobpm/c8ctl-plugin-nano-linux-arm64": "1.3.3",
56
- "@nanobpm/c8ctl-plugin-nano-win32-x64": "1.3.3"
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
  }