code wiki / (root) / nx_wflow.nx

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}