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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ework-aio",
3
- "version": "0.5.30",
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.4",
51
- "ework-web": "^0.10.1",
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
  },
@@ -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
- info "daemon session API returned HTTP $SESSIONS_CODE — older daemon without session endpoints?"
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
- info "web session page returned HTTP $WEB_SESSIONS_CODE"
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
- info "webhook delivery history page returned HTTP $DELIVERIES_CODE"
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
- info "router health returned HTTP $ROUTIER_HEALTH_CODE"
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
- info "router forward returned HTTP $ROUTER_FORWARD_CODE (daemon may not be reachable from router)"
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
- info "no-double-spawn: webhooks may not have been delivered (timing) skipping"
845
+ fail "no-double-spawn: no daemon spawned for issue 888 — webhooks not delivered or coordination broken"
838
846
  else
839
- info "no-double-spawn: got $TOTAL spawn lines (expected 2=1 spawn) — checking logs"
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
- info "failover: no session creation in survivor logmay need longer wait"
882
+ fail "failover: survivor did not claim issue 888coordination 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
- info "daemon API returned 0 — endpoint may not exist in this version"
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
- || info "drain may not have taken effect (status=$DRAINED_STATUS)"
931
+ || fail "daemon drain did not take effect (status=$DRAINED_STATUS)"
925
932
  fi
926
933
  else
927
- info "daemon add API failed — may need newer ework-web version"
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: () => "127.0.0.1" },
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: () => "127.0.0.1" },
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 127.0.0.1; 0.0.0.0 for LAN)" },
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 127.0.0.1)" },
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" },