nx_wflow.nx source
↩ module page · 104 lines · 5477 B
1// nx_wflow.nx -- the PRODUCTION CLI over the pure-core workflow engine (nx_wflow_engine.nx). This is how
2// the ecosystem drives workflows: definitions live as DATA FILES (flows: `flowid|event-kind|cond`, steps:
3// `flowid|idx|action|channel|arg|max-attempts`), the run ledger is append-only event-sourced, connectors
4// come from the GREEN fail-closed catalog. The tickless scheduler / dispatcher / vizsla can fork this elf.
5// Commands:
6// fire <flows> <steps> <ledger> <catalog|-> <event> event = kind~k=v~...~id=EN
7// resume <flows> <steps> <ledger> <catalog|-> complete every in-flight run
8// decide <ledger> <rid> <step> <APPROVED|DENIED> <who> unblock or fail a parked approval
9// board <ledger> console run board (ledger replay)
10// html <ledger> <out.html> 0-JS run board page
11// Argless = usage (exit 0 so the build lane passes). license_tier: ORIGINAL expect_exit: 0
12import "nx_wflow_engine.nx"
13
14func wu() -> i64 {
15 p("nx_wflow -- sovereign workflow automation CLI (durable runs, retries, approvals, connectors)\n" as *u8)
16 p(" fire <flows> <steps> <ledger> <catalog|-> <event>\n" as *u8)
17 p(" resume <flows> <steps> <ledger> <catalog|->\n" as *u8)
18 p(" decide <ledger> <rid> <step> <APPROVED|DENIED> <who>\n" as *u8)
19 p(" board <ledger>\n" as *u8)
20 p(" html <ledger> <out.html>\n" as *u8)
21 p(" verify <flows> <steps> validate a draft definition set without firing\n" as *u8)
22 p(" templates [dir] list the template gallery (default knowledge/wflow/templates)\n" as *u8)
23 p(" instantiate <name> <destflows> <deststeps> [dir] adopt a gallery template (validated whole)\n" as *u8)
24 return 0
25}
26
27func main(argc: i64, argv: *i64) -> i64 {
28 if argc < 2 { return wu() }
29 let cmd: *u8 = argv[1] as *u8
30 if seq(cmd, "fire" as *u8) == 1 {
31 if argc < 7 { p("WFLOW fire needs flows steps ledger catalog event -- fail loud\n" as *u8); return 2 }
32 let rc: i64 = wf_fire_files(argv[2] as *u8, argv[3] as *u8, argv[4] as *u8, argv[5] as *u8, argv[6] as *u8)
33 if rc == (0 - 100) { p("WFLOW-FIRE dedup: already started\n" as *u8); return 0 }
34 if rc < 0 { return 1 }
35 p("WFLOW-FIRE started=" as *u8); pn(rc); p("\n" as *u8)
36 return 0
37 }
38 if seq(cmd, "resume" as *u8) == 1 {
39 if argc < 6 { p("WFLOW resume needs flows steps ledger catalog -- fail loud\n" as *u8); return 2 }
40 let rc: i64 = wf_resume_files(argv[2] as *u8, argv[3] as *u8, argv[4] as *u8, argv[5] as *u8)
41 if rc < 0 { return 1 }
42 p("WFLOW-RESUME resumed=" as *u8); pn(rc); p("\n" as *u8)
43 return 0
44 }
45 if seq(cmd, "decide" as *u8) == 1 {
46 if argc < 7 { p("WFLOW decide needs ledger rid step decision who -- fail loud\n" as *u8); return 2 }
47 let cx: *i64 = sys_mmap(32) as *i64
48 cx[2] = argv[2] as i64
49 let idx: i64 = wf_atoi(argv[4] as *u8)
50 if idx < 1 { p("WFLOW decide ERROR bad step -- fail loud\n" as *u8); return 2 }
51 let rc: i64 = wf_decide(cx, argv[3] as *u8, idx, argv[5] as *u8, argv[6] as *u8)
52 if rc != 0 { return 1 }
53 p("WFLOW-DECIDE recorded\n" as *u8)
54 return 0
55 }
56 if seq(cmd, "board" as *u8) == 1 {
57 if argc < 3 { p("WFLOW board needs ledger -- fail loud\n" as *u8); return 2 }
58 let rc: i64 = wf_obs_board(argv[2] as *u8)
59 if rc < 0 { return 1 }
60 return 0
61 }
62 if seq(cmd, "html" as *u8) == 1 {
63 if argc < 4 { p("WFLOW html needs ledger out -- fail loud\n" as *u8); return 2 }
64 let rc: i64 = wf_obs_html(argv[2] as *u8, argv[3] as *u8)
65 if rc < 0 { return 1 }
66 p("WFLOW-HTML runs=" as *u8); pn(rc); p("\n" as *u8)
67 return 0
68 }
69 if seq(cmd, "verify" as *u8) == 1 {
70 if argc < 4 { p("WFLOW verify needs flows steps -- fail loud\n" as *u8); return 2 }
71 let fl: *i64 = sys_mmap(8 * 64) as *i64
72 let st2: *i64 = sys_mmap(8 * 128) as *i64
73 let nf: i64 = wf_lines_load(argv[2] as *u8, fl, 64)
74 if nf < 1 { return 1 }
75 let nst: i64 = wf_lines_load(argv[3] as *u8, st2, 128)
76 if nst < 1 { return 1 }
77 if wf_load_flows(fl, nf) < 0 { return 1 }
78 if wf_load(st2, nst) < 0 { return 1 }
79 let v: i64 = wf_defs_version(argv[2] as *u8)
80 p("WFLOW-VERIFY version=" as *u8); pn(v); p(" flows=" as *u8); pn(nf); p(" steps=" as *u8); pn(nst); p(" verdict=VALID\n" as *u8)
81 return 0
82 }
83 if seq(cmd, "templates" as *u8) == 1 {
84 let dirp: *u8 = sys_mmap(512)
85 var dd: i64 = 0
86 if argc >= 3 { dd = wf_cat(dirp, dd, argv[2] as *u8) } else { dd = wf_cat(dirp, dd, "knowledge/wflow/templates" as *u8) }
87 dirp[dd] = 0 as u8
88 let rc: i64 = wf_tpl_list(dirp)
89 if rc < 0 { return 1 }
90 return 0
91 }
92 if seq(cmd, "instantiate" as *u8) == 1 {
93 if argc < 5 { p("WFLOW instantiate needs name destflows deststeps -- fail loud\n" as *u8); return 2 }
94 let dirp: *u8 = sys_mmap(512)
95 var dd: i64 = 0
96 if argc >= 6 { dd = wf_cat(dirp, dd, argv[5] as *u8) } else { dd = wf_cat(dirp, dd, "knowledge/wflow/templates" as *u8) }
97 dirp[dd] = 0 as u8
98 let rc: i64 = wf_tpl_instantiate(dirp, argv[2] as *u8, argv[3] as *u8, argv[4] as *u8)
99 if rc < 0 { return 1 }
100 return 0
101 }
102 p("WFLOW unknown command -- fail loud\n" as *u8)
103 return 2
104}