nterminal 1.2.23 → 1.2.24

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 (37) hide show
  1. package/bin/nterminal.js +1 -0
  2. package/dist/client/assets/{MarkdownPreview-Dqb1LX21.js → MarkdownPreview-DCfGMtwX.js} +1 -1
  3. package/dist/client/assets/{index-Bzw1v9JR.css → index-f-1XNznv.css} +1 -1
  4. package/dist/client/assets/{index-7jUpdsER.js → index-ljxLHcWv.js} +22 -26
  5. package/dist/client/index.html +2 -2
  6. package/dist/scripts/onboarding.js +78 -17
  7. package/dist/scripts/onboarding.js.map +1 -1
  8. package/dist/server/agent/agentRoutes.js +11 -0
  9. package/dist/server/agent/agentRoutes.js.map +1 -1
  10. package/dist/server/config.d.ts +1 -0
  11. package/dist/server/config.js +12 -0
  12. package/dist/server/config.js.map +1 -1
  13. package/dist/server/index.js +44 -35
  14. package/dist/server/index.js.map +1 -1
  15. package/dist/server/routes/updateRoutes.js +11 -1
  16. package/dist/server/routes/updateRoutes.js.map +1 -1
  17. package/dist/server/runtimeState.d.ts +4 -0
  18. package/dist/server/runtimeState.js +13 -0
  19. package/dist/server/runtimeState.js.map +1 -0
  20. package/dist/server/storage/fileStore.d.ts +11 -1
  21. package/dist/server/storage/fileStore.js +20 -1
  22. package/dist/server/storage/fileStore.js.map +1 -1
  23. package/dist/server/terminal/transcriptHistory.js +6 -6
  24. package/dist/server/terminal/transcriptHistory.js.map +1 -1
  25. package/dist/server/update/packageUpdate.js +1 -1
  26. package/dist/server/update/packageUpdate.js.map +1 -1
  27. package/dist/server/update/stateCheckpoint.d.ts +3 -0
  28. package/dist/server/update/stateCheckpoint.js +34 -0
  29. package/dist/server/update/stateCheckpoint.js.map +1 -0
  30. package/dist/shared/manualUpdate.js +1 -1
  31. package/dist/shared/manualUpdate.js.map +1 -1
  32. package/docs/configuration.md +1 -0
  33. package/docs/features.md +2 -2
  34. package/docs/onboarding.md +1 -1
  35. package/docs/operations.md +4 -2
  36. package/package.json +1 -1
  37. package/scripts/nterminalctl +53 -0
@@ -81,6 +81,7 @@ LOG_PATH="$(resolve_path "${NTERMINAL_LOG_PATH:-${NTERMINAL_RUNTIME_LOG_PATH:-$D
81
81
  STATE_PATH="$(resolve_path "${NTERMINAL_STATE_PATH:-${NTERMINAL_RUNTIME_STATE_PATH:-$DEFAULT_STATE_PATH}}")"
82
82
  HEALTH_TIMEOUT_SECONDS="${NTERMINAL_HEALTH_TIMEOUT_SECONDS:-15}"
83
83
  STOP_TIMEOUT_SECONDS="${NTERMINAL_STOP_TIMEOUT_SECONDS:-20}"
84
+ FATAL_STARTUP_EXIT_CODE="${NTERMINAL_FATAL_STARTUP_EXIT_CODE:-78}"
84
85
  RUNTIME_ENTRY="$APP_DIR/dist/server/index.js"
85
86
  LAUNCHD_LABEL="${NTERMINAL_LAUNCHD_LABEL:-com.nterminal.local}"
86
87
  UPDATE_LOCK_PATH="${NTERMINAL_UPDATE_LOCK_PATH:-}"
@@ -147,9 +148,41 @@ validate_required_env() {
147
148
  missing=1
148
149
  fi
149
150
  done
151
+ if [[ "${NTERMINAL_ROLE:-}" != "main" && "${NTERMINAL_ROLE:-}" != "secondary" ]]; then
152
+ echo "missing or invalid env: NTERMINAL_ROLE (expected main or secondary)"
153
+ missing=1
154
+ fi
155
+ if [[ "${NTERMINAL_ROLE:-}" == "secondary" ]]; then
156
+ local agent_token="${NTERMINAL_AGENT_TOKEN:-}"
157
+ if (( ${#agent_token} < 32 )); then
158
+ echo "missing or too-short env: NTERMINAL_AGENT_TOKEN"
159
+ missing=1
160
+ fi
161
+ fi
150
162
  return "$missing"
151
163
  }
152
164
 
165
+ doctor_runtime_state() {
166
+ local role="${NTERMINAL_ROLE:-}"
167
+ if [[ "$role" != "main" && "$role" != "secondary" ]]; then
168
+ return 1
169
+ fi
170
+ if [[ ! -f "$STATE_PATH" ]]; then
171
+ echo "fail state: state file not found at $STATE_PATH"
172
+ return 1
173
+ fi
174
+ if [[ "$role" == "secondary" ]]; then
175
+ echo "ok state: $STATE_PATH"
176
+ return 0
177
+ fi
178
+ if "$NODE_BIN" -e 'const fs = require("node:fs"); const state = JSON.parse(fs.readFileSync(process.argv[1], "utf8")); process.exit(state && typeof state.passwordCredential === "object" && state.passwordCredential ? 0 : 2);' "$STATE_PATH" >/dev/null 2>&1; then
179
+ echo "ok state: main password credential present"
180
+ return 0
181
+ fi
182
+ echo "fail state: main state has no passwordCredential at $STATE_PATH"
183
+ return 1
184
+ }
185
+
153
186
  prepare_start() {
154
187
  ensure_app_dir
155
188
  ensure_env_file
@@ -438,6 +471,11 @@ cmd_supervise() {
438
471
  rm -f "$MONITOR_PID_PATH"
439
472
  exit 0
440
473
  fi
474
+ if (( status == FATAL_STARTUP_EXIT_CODE )); then
475
+ printf '[%s] NTerminal process exited with fatal startup status=%s; supervisor will not restart it\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$status" >> "$LOG_PATH"
476
+ rm -f "$MONITOR_PID_PATH"
477
+ exit "$status"
478
+ fi
441
479
 
442
480
  printf '[%s] NTerminal process exited status=%s; restarting in 2s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$status" >> "$LOG_PATH"
443
481
  sleep 2
@@ -689,6 +727,17 @@ cmd_restart() {
689
727
  info "NTerminal restarted"
690
728
  }
691
729
 
730
+ cmd_restart_after_update() {
731
+ prepare_start
732
+ if launchd_controls_app; then
733
+ start_launchd
734
+ info "NTerminal restarted after update"
735
+ return 0
736
+ fi
737
+ cmd_stop >/dev/null || true
738
+ cmd_start
739
+ }
740
+
692
741
  cmd_build() {
693
742
  ensure_app_dir
694
743
  ensure_runtime
@@ -842,6 +891,7 @@ cmd_doctor() {
842
891
  echo "fail env: .env not found at $ENV_FILE"
843
892
  failed=1
844
893
  fi
894
+ doctor_runtime_state || failed=1
845
895
 
846
896
  if [[ -f "$RUNTIME_ENTRY" ]]; then
847
897
  echo "ok runtime: dist/server/index.js"
@@ -880,6 +930,8 @@ Commands:
880
930
  start Start the built server in the background.
881
931
  stop Stop the managed server and supervisor with SIGTERM, then SIGKILL after timeout.
882
932
  restart Stop and start the server.
933
+ restart-after-update
934
+ Stop the supervisor and start again after an npm package update.
883
935
  build No-op for package installs; verifies the bundled runtime exists.
884
936
  deploy Restart the installed package using the bundled runtime.
885
937
  clean --force Stop server, kill NTerminal tmux sessions, and remove local state/log/pid files.
@@ -913,6 +965,7 @@ case "$COMMAND" in
913
965
  supervise) cmd_supervise "$@" ;;
914
966
  stop) cmd_stop "$@" ;;
915
967
  restart|reload) cmd_restart "$@" ;;
968
+ restart-after-update) cmd_restart_after_update "$@" ;;
916
969
  build) cmd_build "$@" ;;
917
970
  deploy) cmd_deploy "$@" ;;
918
971
  clean|purge) cmd_clean "$@" ;;