ework-aio 0.5.30 → 0.5.32
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/package.json +3 -3
- package/scripts/e2e-install.sh +28 -21
- package/src/config.ts +2 -2
- package/src/types.ts +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ework-aio",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.32",
|
|
4
4
|
"description": "All-in-one installer for ework (issue tracker) + ework-daemon (AI bridge) + opencode-ework (plugin). One command: npm i -g ework-aio && ework-aio install.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"ework-daemon": "^0.4.1",
|
|
50
|
-
"ework-router": "^0.1.
|
|
51
|
-
"ework-web": "^0.10.
|
|
50
|
+
"ework-router": "^0.1.5",
|
|
51
|
+
"ework-web": "^0.10.14",
|
|
52
52
|
"opencode-ework": "^0.1.0",
|
|
53
53
|
"zod": "^3.23.0"
|
|
54
54
|
},
|
package/scripts/e2e-install.sh
CHANGED
|
@@ -310,6 +310,23 @@ if grep -q "invalid signature" "$DATA_DIR/run/daemon.log" 2>/dev/null; then
|
|
|
310
310
|
fi
|
|
311
311
|
pass "no invalid signature yet"
|
|
312
312
|
|
|
313
|
+
info "multi-machine regression: web reachable on LAN IP (not just 127.0.0.1)"
|
|
314
|
+
LAN_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
|
|
315
|
+
if [[ -n "$LAN_IP" ]]; then
|
|
316
|
+
curl -sf --max-time 3 "http://$LAN_IP:$WORK_PORT/login" >/dev/null 2>&1 \
|
|
317
|
+
|| fail "web NOT reachable on LAN IP $LAN_IP — WORK_HOST likely 127.0.0.1 (breaks multi-machine)"
|
|
318
|
+
pass "web reachable on LAN IP $LAN_IP (WORK_HOST not loopback-only)"
|
|
319
|
+
else
|
|
320
|
+
fail "hostname -I returned no IP — cannot verify LAN reachability"
|
|
321
|
+
fi
|
|
322
|
+
|
|
323
|
+
info "multi-machine regression: daemon reachable on LAN IP"
|
|
324
|
+
if [[ -n "$LAN_IP" ]]; then
|
|
325
|
+
curl -sf --max-time 3 "http://$LAN_IP:$DAEMON_PORT/api/status" >/dev/null 2>&1 \
|
|
326
|
+
|| fail "daemon NOT reachable on LAN IP $LAN_IP — DAEMON_HOST likely 127.0.0.1 (breaks multi-machine)"
|
|
327
|
+
pass "daemon reachable on LAN IP $LAN_IP"
|
|
328
|
+
fi
|
|
329
|
+
|
|
313
330
|
# -----------------------------------------------------------------------------
|
|
314
331
|
# Phase 3: subcommand smoke tests
|
|
315
332
|
# -----------------------------------------------------------------------------
|
|
@@ -656,11 +673,8 @@ case "$SESSIONS_CODE" in
|
|
|
656
673
|
info "daemon session API responds (200), no sessions yet — OpenCode may not have run"
|
|
657
674
|
fi
|
|
658
675
|
;;
|
|
659
|
-
000)
|
|
660
|
-
info "daemon session API not reachable — skipping (older daemon?)"
|
|
661
|
-
;;
|
|
662
676
|
*)
|
|
663
|
-
|
|
677
|
+
fail "daemon session API returned HTTP $SESSIONS_CODE — endpoint should exist in current version"
|
|
664
678
|
;;
|
|
665
679
|
esac
|
|
666
680
|
|
|
@@ -676,7 +690,7 @@ case "$WEB_SESSIONS_CODE" in
|
|
|
676
690
|
pass "web session page redirect (302) — post-migration re-auth likely"
|
|
677
691
|
;;
|
|
678
692
|
*)
|
|
679
|
-
|
|
693
|
+
fail "web session page returned HTTP $WEB_SESSIONS_CODE — should render or redirect"
|
|
680
694
|
;;
|
|
681
695
|
esac
|
|
682
696
|
|
|
@@ -701,11 +715,8 @@ case "$DELIVERIES_CODE" in
|
|
|
701
715
|
info "webhook delivery history page renders (200), no deliveries yet"
|
|
702
716
|
fi
|
|
703
717
|
;;
|
|
704
|
-
000)
|
|
705
|
-
info "webhook delivery history page not reachable — skipping"
|
|
706
|
-
;;
|
|
707
718
|
*)
|
|
708
|
-
|
|
719
|
+
fail "webhook delivery history page returned HTTP $DELIVERIES_CODE — should render"
|
|
709
720
|
;;
|
|
710
721
|
esac
|
|
711
722
|
|
|
@@ -723,11 +734,8 @@ case "$ROUTIER_HEALTH_CODE" in
|
|
|
723
734
|
200)
|
|
724
735
|
pass "router /api/health responds (200)"
|
|
725
736
|
;;
|
|
726
|
-
000)
|
|
727
|
-
info "router not running (binary not installed in this env) — skipping router tests"
|
|
728
|
-
;;
|
|
729
737
|
*)
|
|
730
|
-
|
|
738
|
+
fail "router /api/health returned HTTP $ROUTIER_HEALTH_CODE — router should be running after install"
|
|
731
739
|
;;
|
|
732
740
|
esac
|
|
733
741
|
|
|
@@ -752,7 +760,7 @@ if [[ "$ROUTIER_HEALTH_CODE" == "200" ]]; then
|
|
|
752
760
|
pass "router accepted webhook (HTTP $ROUTER_FORWARD_CODE)"
|
|
753
761
|
;;
|
|
754
762
|
*)
|
|
755
|
-
|
|
763
|
+
fail "router forward returned HTTP $ROUTER_FORWARD_CODE — daemon should be reachable from router"
|
|
756
764
|
;;
|
|
757
765
|
esac
|
|
758
766
|
fi
|
|
@@ -834,11 +842,10 @@ info "daemon A spawned=$A_SPAWNED daemon B spawned=$B_SPAWNED total=$TOTAL"
|
|
|
834
842
|
if [[ "$TOTAL" -eq 2 ]]; then
|
|
835
843
|
pass "no-double-spawn: exactly 1 daemon spawned for issue 888"
|
|
836
844
|
elif [[ "$TOTAL" -eq 0 ]]; then
|
|
837
|
-
|
|
845
|
+
fail "no-double-spawn: no daemon spawned for issue 888 — webhooks not delivered or coordination broken"
|
|
838
846
|
else
|
|
839
|
-
|
|
847
|
+
fail "no-double-spawn: expected 2 spawn lines (1 daemon), got $TOTAL — possible double-spawn"
|
|
840
848
|
fi
|
|
841
|
-
pass "no-double-spawn: exactly 1 daemon spawned for issue 888"
|
|
842
849
|
|
|
843
850
|
info "test 2: failover — kill owner, verify survivor takes over"
|
|
844
851
|
if [[ "$A_SPAWNED" -eq 1 ]]; then
|
|
@@ -872,7 +879,7 @@ info "survivor log shows $SURVIVOR_CLAIMED_AFTER session creation(s) for 888"
|
|
|
872
879
|
if [[ "$SURVIVOR_CLAIMED_AFTER" -ge 1 ]]; then
|
|
873
880
|
pass "failover: survivor claimed issue 888"
|
|
874
881
|
else
|
|
875
|
-
|
|
882
|
+
fail "failover: survivor did not claim issue 888 — coordination lease/failover broken"
|
|
876
883
|
fi
|
|
877
884
|
|
|
878
885
|
info "cleanup: stop daemon B + restart main daemon"
|
|
@@ -892,7 +899,7 @@ info "current daemon count: $DAEMONS_COUNT"
|
|
|
892
899
|
if [[ "$DAEMONS_COUNT" -ge 1 ]]; then
|
|
893
900
|
pass "daemon management API returns $DAEMONS_COUNT daemon(s)"
|
|
894
901
|
else
|
|
895
|
-
|
|
902
|
+
fail "daemon management API returned 0 daemons — endpoint broken or no daemons registered"
|
|
896
903
|
fi
|
|
897
904
|
|
|
898
905
|
DAEMON3_PORT=$((DAEMON_PORT + 2))
|
|
@@ -921,10 +928,10 @@ if [[ "$ADD_OK" == "true" ]]; then
|
|
|
921
928
|
info "daemon $FIRST_ID status: $DRAINED_STATUS"
|
|
922
929
|
[[ "$DRAINED_STATUS" == "drained" ]] \
|
|
923
930
|
&& pass "daemon drain API works" \
|
|
924
|
-
||
|
|
931
|
+
|| fail "daemon drain did not take effect (status=$DRAINED_STATUS)"
|
|
925
932
|
fi
|
|
926
933
|
else
|
|
927
|
-
|
|
934
|
+
fail "daemon add API failed (ok=$ADD_OK) — add endpoint broken"
|
|
928
935
|
fi
|
|
929
936
|
|
|
930
937
|
info "cleanup: stop extra daemon instances"
|
package/src/config.ts
CHANGED
|
@@ -61,7 +61,7 @@ function sharedWebhookSecret(): string {
|
|
|
61
61
|
|
|
62
62
|
export const WEB_ENV_KEYS: readonly EnvKeySpec[] = [
|
|
63
63
|
{ envVar: "WORK_PORT", file: "web", generate: (c) => String(c.workPort) },
|
|
64
|
-
{ envVar: "WORK_HOST", file: "web", generate: () => "
|
|
64
|
+
{ envVar: "WORK_HOST", file: "web", generate: () => "0.0.0.0" },
|
|
65
65
|
{ envVar: "WORK_TOKEN", file: "web", secret: true, generate: () => hex(20) },
|
|
66
66
|
{ envVar: "WORK_COOKIE_SECRET", file: "web", secret: true, generate: () => hex(24) },
|
|
67
67
|
{ envVar: "WORK_OPERATOR_LOGIN", file: "web", generate: (c) => c.operatorLogin },
|
|
@@ -81,7 +81,7 @@ export const WEB_ENV_KEYS: readonly EnvKeySpec[] = [
|
|
|
81
81
|
export const DAEMON_ENV_KEYS: readonly EnvKeySpec[] = [
|
|
82
82
|
{ envVar: "DAEMON_ENV", file: "daemon", generate: () => "production" },
|
|
83
83
|
{ envVar: "DAEMON_PORT", file: "daemon", generate: (c) => String(c.daemonPort) },
|
|
84
|
-
{ envVar: "DAEMON_HOST", file: "daemon", generate: () => "
|
|
84
|
+
{ envVar: "DAEMON_HOST", file: "daemon", generate: () => "0.0.0.0" },
|
|
85
85
|
{ envVar: "DAEMON_ENDPOINT", file: "daemon", generate: (c) => `127.0.0.1:${c.daemonPort}` },
|
|
86
86
|
{ envVar: "DAEMON_DB_PATH", file: "daemon", generate: (c) => c.paths.daemonDbPath },
|
|
87
87
|
{ envVar: "GITEA_URL", file: "daemon", generate: (c) => `http://127.0.0.1:${c.workPort}` },
|
package/src/types.ts
CHANGED
|
@@ -60,7 +60,7 @@ export interface SettableKeySpec {
|
|
|
60
60
|
export const SETTABLE_KEYS: readonly SettableKeySpec[] = [
|
|
61
61
|
{ key: "WORK_PORT", service: "web", description: "ework-web listen port (default 3002)",
|
|
62
62
|
propagate: { targetService: "daemon", targetKey: "GITEA_URL", template: (v) => `http://127.0.0.1:${v}` } },
|
|
63
|
-
{ key: "WORK_HOST", service: "web", description: "ework-web bind address (default
|
|
63
|
+
{ key: "WORK_HOST", service: "web", description: "ework-web bind address (default 0.0.0.0 for multi-machine; 127.0.0.1 for single-machine)" },
|
|
64
64
|
{ key: "WORK_OPERATOR_LOGIN", service: "web", description: "login auto-promoted to admin" },
|
|
65
65
|
{ key: "WORK_TRANSLATE_URL", service: "web", description: "OpenAI-compat /v1/chat/completions endpoint for translate" },
|
|
66
66
|
{ key: "WORK_TRANSLATE_MODEL", service: "web", description: "translate model name" },
|
|
@@ -69,7 +69,7 @@ export const SETTABLE_KEYS: readonly SettableKeySpec[] = [
|
|
|
69
69
|
{ key: "WORK_COMMENT_SORT", service: "web", description: "comment sort order: desc|asc" },
|
|
70
70
|
{ key: "DAEMON_PORT", service: "daemon", description: "ework-daemon listen port (default 3101)",
|
|
71
71
|
propagate: { targetService: "web", targetKey: "WORK_DAEMON_WEBHOOK_URL", template: (v) => `http://127.0.0.1:${v}` } },
|
|
72
|
-
{ key: "DAEMON_HOST", service: "daemon", description: "ework-daemon bind address (default
|
|
72
|
+
{ key: "DAEMON_HOST", service: "daemon", description: "ework-daemon bind address (default 0.0.0.0 for multi-machine)" },
|
|
73
73
|
{ key: "OPENCODE_BINARY", service: "daemon", description: "opencode binary path" },
|
|
74
74
|
{ key: "OPENCODE_BASE_WORKDIR", service: "daemon", description: "opencode working directory base" },
|
|
75
75
|
{ key: "COMPLETION_CHECK_API_KEY", service: "daemon", description: "completion-check API key" },
|