vortex-cli 8.1.0__tar.gz → 8.2.0__tar.gz

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.
Files changed (58) hide show
  1. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/PKG-INFO +84 -15
  2. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/README.md +83 -14
  3. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/pyproject.toml +1 -1
  4. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/cli.py +4 -1
  5. vortex_cli-8.2.0/vortex/commands/agenda.py +403 -0
  6. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/app.py +6 -4
  7. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/execute.py +27 -6
  8. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/object_.py +58 -26
  9. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/main.py +25 -2
  10. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/registry.py +5 -0
  11. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/webdesign.py +20 -5
  12. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex_cli.egg-info/PKG-INFO +84 -15
  13. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex_cli.egg-info/SOURCES.txt +1 -0
  14. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/LICENSE +0 -0
  15. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/setup.cfg +0 -0
  16. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/__init__.py +0 -0
  17. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/__main__.py +0 -0
  18. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/colour.py +0 -0
  19. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/__init__.py +0 -0
  20. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/clean.py +0 -0
  21. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/clone.py +0 -0
  22. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/code.py +0 -0
  23. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/compile.py +0 -0
  24. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/db.py +0 -0
  25. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/diff.py +0 -0
  26. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/docs.py +0 -0
  27. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/fetch.py +0 -0
  28. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/info.py +0 -0
  29. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/keyword.py +0 -0
  30. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/libs.py +0 -0
  31. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/log.py +0 -0
  32. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/pull.py +0 -0
  33. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/search.py +0 -0
  34. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/servers.py +0 -0
  35. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/use.py +0 -0
  36. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/commands/watch.py +0 -0
  37. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/constants.py +0 -0
  38. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/docs/Blackbook v2.md +0 -0
  39. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/docs/Blackbook.pdf +0 -0
  40. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/docs/index.html +0 -0
  41. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/docs/marked.min.js +0 -0
  42. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/git.py +0 -0
  43. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/lib/puakma-6.0.40.jar +0 -0
  44. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/libs.py +0 -0
  45. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/logging.py +0 -0
  46. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/models.py +0 -0
  47. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/output.py +0 -0
  48. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/schedule.py +0 -0
  49. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/server_options.py +0 -0
  50. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/soap.py +0 -0
  51. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/spinner.py +0 -0
  52. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/sync.py +0 -0
  53. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/util.py +0 -0
  54. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex/workspace.py +0 -0
  55. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex_cli.egg-info/dependency_links.txt +0 -0
  56. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex_cli.egg-info/entry_points.txt +0 -0
  57. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex_cli.egg-info/requires.txt +0 -0
  58. {vortex_cli-8.1.0 → vortex_cli-8.2.0}/vortex_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vortex_cli
3
- Version: 8.1.0
3
+ Version: 8.2.0
4
4
  Summary: Vortex CLI
5
5
  Author-email: Jordan Amos <jordan.amos@gmail.com>
6
6
  License: MIT License
@@ -106,6 +106,18 @@ While it is possible to use without it, this software has been purposefully desi
106
106
  java_environment_name = JavaSE-17 ; Java Execution Environment name https://docs.osgi.org/reference/eenames.html
107
107
  ```
108
108
 
109
+ ## Upgrading to 8.2
110
+
111
+ - **`object run` runs ACTIONs, and waits.** It calls the gateway's new `POST run` (gateway
112
+ `AppVersion` 0.1.4 or later) instead of sending `tell agenda run` to the console, and
113
+ reports how long the action took, its reply and any exception (see
114
+ [Running an action](#running-an-action)). An older gateway refuses it with `NOT_EXPOSED`.
115
+ It no longer accepts a SCHEDULED_ACTION.
116
+ - **`vortex agenda`** lists the scheduled actions AGENDA has loaded and queues one with
117
+ `agenda run`, refusing the cases where AGENDA would silently do nothing (see
118
+ [The agenda](#the-agenda)). It replaces both `object run` on a scheduled action and
119
+ `vortex execute tell agenda run ...`.
120
+
109
121
  ## Upgrading to 8.1
110
122
 
111
123
  8.1 does two things. It replaces `vortex config` with plain top-level commands that read
@@ -127,7 +139,7 @@ errors (exit 2).
127
139
  | `config --set-password` | `keyring set vortex-cli:<server> <username>` |
128
140
  | `config --sample` | `server get` (every option it reads) |
129
141
  | `execute --show-schedule` / `--refresh-agenda` / `--flush-cache` | `execute schedule` / `refresh-agenda` / `flush-cache` |
130
- | `execute --refresh-design N` | `app refresh-design N` |
142
+ | `execute --refresh-design N` | `execute refresh-design N` or `app refresh N` |
131
143
  | `execute --run PATH` | `object run ID --app-id N` |
132
144
  | `status [--show-permissions] [--json]` | `vortex [-s NAME] [--show-permissions] [--json]` (no command) - plus the CLI version and the workspace |
133
145
  | `vortex` with no command (the workspace path) | the live status of the default server: `vortex-cli` and `workspace` first, then the server (`vortex --path` prints just the path) |
@@ -271,7 +283,7 @@ vortex app update APP_ID [--name --group --description --inherit-from --templa
271
283
  [--param NAME=VALUE ...] [--remove-param NAME ...]
272
284
  vortex app export APP_ID... [--out-dir --exclude-source --timeout]
273
285
  vortex app import FILE.pmx --name N --group G
274
- vortex app refresh-design APP_ID
286
+ vortex app refresh APP_ID (alias: refresh-design)
275
287
 
276
288
  ── object ───────────────────────────────────────────────────────────────────
277
289
  vortex object get ID --app-id ID [--show-source --show-data] [--json]
@@ -289,7 +301,7 @@ vortex object list [QUERY] [--app-id ID [--local]] [--strict --inherits-from|-
289
301
  --ids-only --show-params --type T...] [--json]
290
302
  vortex object grep PATTERN [--app-id ID] [--output-paths|--output-apps]
291
303
  [--include-resources|--type T...] [--json]
292
- vortex object run ID --app-id ID
304
+ vortex object run ID --app-id ID [--output] [--json]
293
305
  vortex object delete ID... --app-id ID [--yes]
294
306
 
295
307
  ── keyword ──────────────────────────────────────────────────────────────────
@@ -315,6 +327,10 @@ vortex db update-column DB TABLE COLUMN --app-id ID [--name --type --size --desc
315
327
  --cascade-delete|--no-cascade-delete]
316
328
  vortex db delete-column DB TABLE COLUMN --app-id ID [--yes]
317
329
 
330
+ ── agenda ───────────────────────────────────────────────────────────────────
331
+ vortex agenda [list] [--app-id ID] [--json]
332
+ vortex agenda run ID --app-id ID [--param KEY=VALUE ...] [--refresh --force] [--json]
333
+
318
334
  ── Workspace ────────────────────────────────────────────────────────────────
319
335
  vortex ls [app list filters] [--json] = app list --local
320
336
  vortex clone APP... [--group --reclone --all --get-resources --open-urls --timeout]
@@ -329,7 +345,8 @@ vortex code [--refresh [--reset]] [-s]
329
345
  vortex [-s NAME] [--show-permissions] [--json] (the server's live status)
330
346
  vortex --path (the workspace path)
331
347
  vortex log [-n --source -m --errors-only|--debug-only|--info-only -k -d] [--json]
332
- vortex execute CMD... | flush-cache | refresh-agenda | schedule [--json] (alias: ex)
348
+ vortex execute CMD... | flush-cache | refresh-agenda | refresh-design APP_ID | schedule
349
+ [--json] (alias: ex)
333
350
  vortex server list [--json]
334
351
  vortex server get [NAME] [--json]
335
352
  vortex server use NAME (or: vortex use NAME)
@@ -406,27 +423,45 @@ and application write, so a manual cache flush is never required after one.
406
423
 
407
424
  `vortex execute CMD...` (or `ex`) sends any console command - the gateway's `POST console`,
408
425
  which needs `GatewaySystem`, or the SOAP console without the gateway. The words are joined,
409
- so no quoting is needed. Three names are shortcuts that send the exact strings the server's
426
+ so no quoting is needed. These names are shortcuts that send the exact strings the server's
410
427
  addins match:
411
428
 
412
429
  | Shortcut | Sends | Effect |
413
430
  |---|---|---|
414
- | `schedule` | `tell agenda schedule` | lists every scheduled action and its next run |
431
+ | `schedule` | `tell agenda schedule` | lists every scheduled action and its next run (raw text; `vortex agenda` parses it) |
415
432
  | `refresh-agenda` | `tell agenda refresh` | AGENDA rereads every schedule now |
433
+ | `refresh-design APP_ID` | `tell agenda run /<webdesign_path>/RefreshDesign?&AppID=N` | rebuilds the application's design from its template, as `app refresh` does (a clone is then out of date) |
416
434
  | `flush-cache` | `tell http cache flush` | clears the design cache and all action class loaders |
417
435
 
418
436
  `tell http flush cache` is **not** a valid command: the HTTP addin only matches
419
437
  `cache flush`, and anything else does nothing, silently. Use `flush-cache`.
420
438
 
421
- Two console operations act on one application or object, so they live with those nouns:
422
-
423
- | Command | Sends |
424
- |---|---|
425
- | `vortex app refresh-design APP_ID` | `tell agenda run /<webdesign_path>/RefreshDesign?&AppID=N` - rebuilds the design from its template (a clone is then out of date) |
426
- | `vortex object run ID --app-id N` | `tell agenda run /group/app.pma/name` - runs an ACTION or SCHEDULED_ACTION now |
439
+ `vortex app refresh APP_ID` also lives with its noun: it sends
440
+ `tell agenda run /<webdesign_path>/RefreshDesign?&AppID=N`, which rebuilds the design from its
441
+ template (a clone is then out of date).
442
+
443
+ ### Running an action
444
+
445
+ `vortex object run ID --app-id N` runs an ACTION now, as your identity, and waits for it:
446
+ the gateway's `POST run` (`GatewaySystem`) loads the action's class, executes it and replies
447
+ with how long it took, its redirect, content type and reply size. `--output` also prints the
448
+ action's reply (its buffer, as text). An action that throws exits 1 with `ACTION_FAILED` and
449
+ the exception; a path with no compiled ACTION is `NOT_FOUND`.
450
+
451
+ - **ACTIONs only.** A SCHEDULED_ACTION (or any other type) is `WRONG_TYPE`. Scheduled
452
+ actions are queued with AGENDA: `vortex agenda run ID --app-id N` ([The agenda](#the-agenda)).
453
+ - **No client connection.** The action's `getOutputStream()` is null, as under AGENDA, so it
454
+ must buffer its reply (`write`/`setBuffer`); one that streams unconditionally fails with
455
+ the NullPointerException as its result.
456
+ - **Synchronous.** The CLI waits up to 300 s. Behind Cloudflare (prod) the request is cut
457
+ at about 100 s; the action still finishes on the server - check `vortex log`.
458
+ - **Gateway required.** It needs a gateway with the `run` route; an older gateway refuses with
459
+ `NOT_EXPOSED`. Earlier versions of `object run` sent `tell agenda run`, which only reached
460
+ scheduled actions on AGENDA's list and did nothing, silently, for an ACTION.
427
461
 
428
462
  The 8.0 flags (`--show-schedule`, `--refresh-agenda`, `--flush-cache`, `--refresh-design`,
429
- `--run`) were removed in 8.1.
463
+ `--run`) were removed in 8.1. `app refresh` was `app refresh-design` in 8.1.0; the old
464
+ name still works.
430
465
 
431
466
  ### Local clones stay in sync
432
467
 
@@ -449,7 +484,7 @@ prints the command to re-sync (`vortex clone APP_ID -s SERVER`).
449
484
  | `object copy` | the target application's clone |
450
485
  | `keyword set` / `delete` | the clone's stored keywords |
451
486
  | `compile` | writes `zbin/`; `--upload` stores the uploaded blobs |
452
- | `execute --refresh-design` | none - prints that the clone is out of date |
487
+ | `app refresh` / `execute refresh-design` | none - prints that the clone is out of date |
453
488
  | `app create` / `import` / `export`, all `db` commands | none |
454
489
 
455
490
  A clone stores the design objects, the application's details (with its description), its
@@ -570,6 +605,40 @@ vortex object get 7901 --app-id 62 # the parsed schedule
570
605
  starts; if that lands between the command's read and write, the old `LastRun` is written
571
606
  back and the action may run one interval early.
572
607
 
608
+ ### The agenda
609
+
610
+ AGENDA has no API beyond its console commands, so `vortex agenda` sends them through the same
611
+ console route as `vortex execute` (the gateway's `POST console`, `GatewaySystem`, or the SOAP
612
+ console without the gateway) and parses the text they answer.
613
+
614
+ ```
615
+ vortex agenda -s dev # = agenda list
616
+ vortex agenda list --app-id 9 -s dev
617
+ vortex agenda run 7825 --app-id 60 -s dev [--param AppID=12] [--refresh] [--force]
618
+ ```
619
+
620
+ - **`list`** - `tell agenda schedule`: every scheduled action AGENDA has **loaded**, by next
621
+ run (server time), with the waitlist and AGENDA's counts (running, waitlisted, scheduled,
622
+ max at once). An action with empty `Options` is loaded as *on demand only*. Not listed: an
623
+ action with `Schedule=N`, one in a disabled application or an application with scheduled
624
+ actions disabled, and one created or renamed since AGENDA's last refresh (every 15
625
+ minutes). AGENDA says how many actions are running, never which.
626
+ - **`run`** - queues a SCHEDULED_ACTION: `tell agenda run /group/app.pma/Name[?&KEY=VALUE...]`.
627
+ It runs as the system session when one of AGENDA's slots is free; its result is only in
628
+ `vortex log`. AGENDA answers that command with nothing, whatever it did, so `run` checks
629
+ first and sends nothing when AGENDA would not run it:
630
+ - `NOT_ON_AGENDA` - the action has `Schedule=N` (give it a schedule first), or it is not on
631
+ the loaded list. `--refresh` sends `tell agenda refresh` and checks again (for an action
632
+ created or renamed in the last 15 minutes).
633
+ - `ALREADY_QUEUED` - it is already waitlisted; AGENDA would skip it.
634
+ - `PREFIX_COLLISION` - AGENDA matches the path by prefix and queues it once per matching
635
+ item, so `.../SyncAll` would also match an item `.../Sync` and run twice. `--force` sends
636
+ it anyway.
637
+ - `WRONG_TYPE` - not a SCHEDULED_ACTION (an ACTION is run with `vortex object run`).
638
+ - A queued run moves the action's next scheduled run (AGENDA resets it), and it can't be
639
+ stopped from here (`vortex execute tell agenda stop /group/app.pma/Name` asks the action to
640
+ quit; it has to check for that itself).
641
+
573
642
  ### Keyword values and secrets
574
643
 
575
644
  Keywords are an application's live configuration, and in practice they hold credentials in
@@ -62,6 +62,18 @@ While it is possible to use without it, this software has been purposefully desi
62
62
  java_environment_name = JavaSE-17 ; Java Execution Environment name https://docs.osgi.org/reference/eenames.html
63
63
  ```
64
64
 
65
+ ## Upgrading to 8.2
66
+
67
+ - **`object run` runs ACTIONs, and waits.** It calls the gateway's new `POST run` (gateway
68
+ `AppVersion` 0.1.4 or later) instead of sending `tell agenda run` to the console, and
69
+ reports how long the action took, its reply and any exception (see
70
+ [Running an action](#running-an-action)). An older gateway refuses it with `NOT_EXPOSED`.
71
+ It no longer accepts a SCHEDULED_ACTION.
72
+ - **`vortex agenda`** lists the scheduled actions AGENDA has loaded and queues one with
73
+ `agenda run`, refusing the cases where AGENDA would silently do nothing (see
74
+ [The agenda](#the-agenda)). It replaces both `object run` on a scheduled action and
75
+ `vortex execute tell agenda run ...`.
76
+
65
77
  ## Upgrading to 8.1
66
78
 
67
79
  8.1 does two things. It replaces `vortex config` with plain top-level commands that read
@@ -83,7 +95,7 @@ errors (exit 2).
83
95
  | `config --set-password` | `keyring set vortex-cli:<server> <username>` |
84
96
  | `config --sample` | `server get` (every option it reads) |
85
97
  | `execute --show-schedule` / `--refresh-agenda` / `--flush-cache` | `execute schedule` / `refresh-agenda` / `flush-cache` |
86
- | `execute --refresh-design N` | `app refresh-design N` |
98
+ | `execute --refresh-design N` | `execute refresh-design N` or `app refresh N` |
87
99
  | `execute --run PATH` | `object run ID --app-id N` |
88
100
  | `status [--show-permissions] [--json]` | `vortex [-s NAME] [--show-permissions] [--json]` (no command) - plus the CLI version and the workspace |
89
101
  | `vortex` with no command (the workspace path) | the live status of the default server: `vortex-cli` and `workspace` first, then the server (`vortex --path` prints just the path) |
@@ -227,7 +239,7 @@ vortex app update APP_ID [--name --group --description --inherit-from --templa
227
239
  [--param NAME=VALUE ...] [--remove-param NAME ...]
228
240
  vortex app export APP_ID... [--out-dir --exclude-source --timeout]
229
241
  vortex app import FILE.pmx --name N --group G
230
- vortex app refresh-design APP_ID
242
+ vortex app refresh APP_ID (alias: refresh-design)
231
243
 
232
244
  ── object ───────────────────────────────────────────────────────────────────
233
245
  vortex object get ID --app-id ID [--show-source --show-data] [--json]
@@ -245,7 +257,7 @@ vortex object list [QUERY] [--app-id ID [--local]] [--strict --inherits-from|-
245
257
  --ids-only --show-params --type T...] [--json]
246
258
  vortex object grep PATTERN [--app-id ID] [--output-paths|--output-apps]
247
259
  [--include-resources|--type T...] [--json]
248
- vortex object run ID --app-id ID
260
+ vortex object run ID --app-id ID [--output] [--json]
249
261
  vortex object delete ID... --app-id ID [--yes]
250
262
 
251
263
  ── keyword ──────────────────────────────────────────────────────────────────
@@ -271,6 +283,10 @@ vortex db update-column DB TABLE COLUMN --app-id ID [--name --type --size --desc
271
283
  --cascade-delete|--no-cascade-delete]
272
284
  vortex db delete-column DB TABLE COLUMN --app-id ID [--yes]
273
285
 
286
+ ── agenda ───────────────────────────────────────────────────────────────────
287
+ vortex agenda [list] [--app-id ID] [--json]
288
+ vortex agenda run ID --app-id ID [--param KEY=VALUE ...] [--refresh --force] [--json]
289
+
274
290
  ── Workspace ────────────────────────────────────────────────────────────────
275
291
  vortex ls [app list filters] [--json] = app list --local
276
292
  vortex clone APP... [--group --reclone --all --get-resources --open-urls --timeout]
@@ -285,7 +301,8 @@ vortex code [--refresh [--reset]] [-s]
285
301
  vortex [-s NAME] [--show-permissions] [--json] (the server's live status)
286
302
  vortex --path (the workspace path)
287
303
  vortex log [-n --source -m --errors-only|--debug-only|--info-only -k -d] [--json]
288
- vortex execute CMD... | flush-cache | refresh-agenda | schedule [--json] (alias: ex)
304
+ vortex execute CMD... | flush-cache | refresh-agenda | refresh-design APP_ID | schedule
305
+ [--json] (alias: ex)
289
306
  vortex server list [--json]
290
307
  vortex server get [NAME] [--json]
291
308
  vortex server use NAME (or: vortex use NAME)
@@ -362,27 +379,45 @@ and application write, so a manual cache flush is never required after one.
362
379
 
363
380
  `vortex execute CMD...` (or `ex`) sends any console command - the gateway's `POST console`,
364
381
  which needs `GatewaySystem`, or the SOAP console without the gateway. The words are joined,
365
- so no quoting is needed. Three names are shortcuts that send the exact strings the server's
382
+ so no quoting is needed. These names are shortcuts that send the exact strings the server's
366
383
  addins match:
367
384
 
368
385
  | Shortcut | Sends | Effect |
369
386
  |---|---|---|
370
- | `schedule` | `tell agenda schedule` | lists every scheduled action and its next run |
387
+ | `schedule` | `tell agenda schedule` | lists every scheduled action and its next run (raw text; `vortex agenda` parses it) |
371
388
  | `refresh-agenda` | `tell agenda refresh` | AGENDA rereads every schedule now |
389
+ | `refresh-design APP_ID` | `tell agenda run /<webdesign_path>/RefreshDesign?&AppID=N` | rebuilds the application's design from its template, as `app refresh` does (a clone is then out of date) |
372
390
  | `flush-cache` | `tell http cache flush` | clears the design cache and all action class loaders |
373
391
 
374
392
  `tell http flush cache` is **not** a valid command: the HTTP addin only matches
375
393
  `cache flush`, and anything else does nothing, silently. Use `flush-cache`.
376
394
 
377
- Two console operations act on one application or object, so they live with those nouns:
378
-
379
- | Command | Sends |
380
- |---|---|
381
- | `vortex app refresh-design APP_ID` | `tell agenda run /<webdesign_path>/RefreshDesign?&AppID=N` - rebuilds the design from its template (a clone is then out of date) |
382
- | `vortex object run ID --app-id N` | `tell agenda run /group/app.pma/name` - runs an ACTION or SCHEDULED_ACTION now |
395
+ `vortex app refresh APP_ID` also lives with its noun: it sends
396
+ `tell agenda run /<webdesign_path>/RefreshDesign?&AppID=N`, which rebuilds the design from its
397
+ template (a clone is then out of date).
398
+
399
+ ### Running an action
400
+
401
+ `vortex object run ID --app-id N` runs an ACTION now, as your identity, and waits for it:
402
+ the gateway's `POST run` (`GatewaySystem`) loads the action's class, executes it and replies
403
+ with how long it took, its redirect, content type and reply size. `--output` also prints the
404
+ action's reply (its buffer, as text). An action that throws exits 1 with `ACTION_FAILED` and
405
+ the exception; a path with no compiled ACTION is `NOT_FOUND`.
406
+
407
+ - **ACTIONs only.** A SCHEDULED_ACTION (or any other type) is `WRONG_TYPE`. Scheduled
408
+ actions are queued with AGENDA: `vortex agenda run ID --app-id N` ([The agenda](#the-agenda)).
409
+ - **No client connection.** The action's `getOutputStream()` is null, as under AGENDA, so it
410
+ must buffer its reply (`write`/`setBuffer`); one that streams unconditionally fails with
411
+ the NullPointerException as its result.
412
+ - **Synchronous.** The CLI waits up to 300 s. Behind Cloudflare (prod) the request is cut
413
+ at about 100 s; the action still finishes on the server - check `vortex log`.
414
+ - **Gateway required.** It needs a gateway with the `run` route; an older gateway refuses with
415
+ `NOT_EXPOSED`. Earlier versions of `object run` sent `tell agenda run`, which only reached
416
+ scheduled actions on AGENDA's list and did nothing, silently, for an ACTION.
383
417
 
384
418
  The 8.0 flags (`--show-schedule`, `--refresh-agenda`, `--flush-cache`, `--refresh-design`,
385
- `--run`) were removed in 8.1.
419
+ `--run`) were removed in 8.1. `app refresh` was `app refresh-design` in 8.1.0; the old
420
+ name still works.
386
421
 
387
422
  ### Local clones stay in sync
388
423
 
@@ -405,7 +440,7 @@ prints the command to re-sync (`vortex clone APP_ID -s SERVER`).
405
440
  | `object copy` | the target application's clone |
406
441
  | `keyword set` / `delete` | the clone's stored keywords |
407
442
  | `compile` | writes `zbin/`; `--upload` stores the uploaded blobs |
408
- | `execute --refresh-design` | none - prints that the clone is out of date |
443
+ | `app refresh` / `execute refresh-design` | none - prints that the clone is out of date |
409
444
  | `app create` / `import` / `export`, all `db` commands | none |
410
445
 
411
446
  A clone stores the design objects, the application's details (with its description), its
@@ -526,6 +561,40 @@ vortex object get 7901 --app-id 62 # the parsed schedule
526
561
  starts; if that lands between the command's read and write, the old `LastRun` is written
527
562
  back and the action may run one interval early.
528
563
 
564
+ ### The agenda
565
+
566
+ AGENDA has no API beyond its console commands, so `vortex agenda` sends them through the same
567
+ console route as `vortex execute` (the gateway's `POST console`, `GatewaySystem`, or the SOAP
568
+ console without the gateway) and parses the text they answer.
569
+
570
+ ```
571
+ vortex agenda -s dev # = agenda list
572
+ vortex agenda list --app-id 9 -s dev
573
+ vortex agenda run 7825 --app-id 60 -s dev [--param AppID=12] [--refresh] [--force]
574
+ ```
575
+
576
+ - **`list`** - `tell agenda schedule`: every scheduled action AGENDA has **loaded**, by next
577
+ run (server time), with the waitlist and AGENDA's counts (running, waitlisted, scheduled,
578
+ max at once). An action with empty `Options` is loaded as *on demand only*. Not listed: an
579
+ action with `Schedule=N`, one in a disabled application or an application with scheduled
580
+ actions disabled, and one created or renamed since AGENDA's last refresh (every 15
581
+ minutes). AGENDA says how many actions are running, never which.
582
+ - **`run`** - queues a SCHEDULED_ACTION: `tell agenda run /group/app.pma/Name[?&KEY=VALUE...]`.
583
+ It runs as the system session when one of AGENDA's slots is free; its result is only in
584
+ `vortex log`. AGENDA answers that command with nothing, whatever it did, so `run` checks
585
+ first and sends nothing when AGENDA would not run it:
586
+ - `NOT_ON_AGENDA` - the action has `Schedule=N` (give it a schedule first), or it is not on
587
+ the loaded list. `--refresh` sends `tell agenda refresh` and checks again (for an action
588
+ created or renamed in the last 15 minutes).
589
+ - `ALREADY_QUEUED` - it is already waitlisted; AGENDA would skip it.
590
+ - `PREFIX_COLLISION` - AGENDA matches the path by prefix and queues it once per matching
591
+ item, so `.../SyncAll` would also match an item `.../Sync` and run twice. `--force` sends
592
+ it anyway.
593
+ - `WRONG_TYPE` - not a SCHEDULED_ACTION (an ACTION is run with `vortex object run`).
594
+ - A queued run moves the action's next scheduled run (AGENDA resets it), and it can't be
595
+ stopped from here (`vortex execute tell agenda stop /group/app.pma/Name` asks the action to
596
+ quit; it has to check for that itself).
597
+
529
598
  ### Keyword values and secrets
530
599
 
531
600
  Keywords are an application's live configuration, and in practice they hold credentials in
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "vortex_cli"
8
- version = "8.1.0"
8
+ version = "8.2.0"
9
9
  description = "Vortex CLI"
10
10
  requires-python = ">=3.10"
11
11
  readme = { file = "README.md", content-type = "text/markdown" }
@@ -562,6 +562,9 @@ _EXECUTE_SHORTCUTS_HELP = """\
562
562
  Shortcuts (each sends the exact string the server's addins match):
563
563
  flush-cache | tell http cache flush ('tell http flush cache' does nothing)
564
564
  refresh-agenda | tell agenda refresh: AGENDA rereads every schedule now
565
+ refresh-design APP_ID | tell agenda run /<webdesign_path>/RefreshDesign?&AppID=N:
566
+ | rebuild the application's design from its template
567
+ | (same as 'vortex app refresh APP_ID')
565
568
  schedule | tell agenda schedule: every scheduled action and its next run
566
569
 
567
570
  Console commands:
@@ -576,7 +579,7 @@ def add_execute_parser(
576
579
  aliases=("ex",),
577
580
  help=(
578
581
  "Send a console command to the server (or a shortcut: flush-cache, "
579
- "refresh-agenda, schedule)"
582
+ "refresh-agenda, refresh-design APP_ID, schedule)"
580
583
  ),
581
584
  description=_EXECUTE_SHORTCUTS_HELP + _EXECUTE_PARSER_DESCRIPTION,
582
585
  formatter_class=RawDescriptionHelpFormatter,