Skip to content

fix(gateway): use configured probe auth during restart health checks#57374

Closed
zssggle-rgb wants to merge 1 commit into
openclaw:mainfrom
zssggle-rgb:fix/restart-probe-auth-health-checks
Closed

fix(gateway): use configured probe auth during restart health checks#57374
zssggle-rgb wants to merge 1 commit into
openclaw:mainfrom
zssggle-rgb:fix/restart-probe-auth-health-checks

Conversation

@zssggle-rgb

Copy link
Copy Markdown
Contributor

Summary

  • pass resolved probe auth into gateway restart health checks instead of relying only on process env vars
  • reuse the same configured auth resolution path for daemon restart and update-triggered restart verification
  • cover the restart-health probe path with a regression test and align status health inspection with the same auth

Problem

When local gateway auth is configured in openclaw.json but OPENCLAW_GATEWAY_TOKEN is not exported in the current shell, openclaw gateway restart can report a timeout even though the launchd or service-managed gateway eventually comes up and starts listening.

Gateway status already resolves probe auth from config, but restart health checks were probing reachability with env-only auth. That mismatch caused false negatives during warm-up and token-authenticated restarts.

Fix

  • add optional probe auth plumbing to restart health inspection helpers
  • resolve probe auth from config before restart health polling in daemon lifecycle and update restart flows
  • pass resolved probe auth into status restart inspection as well

Verification

  • pnpm vitest run src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/status.gather.test.ts
  • pnpm lint
  • pnpm build

@openclaw-barnacle openclaw-barnacle Bot added cli CLI command changes size: S labels Mar 30, 2026
@greptile-apps

greptile-apps Bot commented Mar 30, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes a real auth mismatch in gateway restart health checks: status already used config-resolved probe auth, but restart and update-triggered restart flows were probing with env-only credentials. The core plumbing in restart-health.ts is well-structured, the status.gather.ts wiring is correct, and the regression test covers the managed restart path.

One incomplete fix:

  • The waitForGatewayHealthyListener call in lifecycle.ts used for unmanaged (SIGUSR1-triggered) restarts — the restartedWithoutServiceManager branch — does not receive probeAuth. resolveGatewayRestartProbeAuth() is only called after that branch's early return, so SIGUSR1-triggered gateway restarts still probe with env-only auth, exactly the bug the PR describes.

Minor:

  • resolveGatewayRestartProbeAuth (lifecycle.ts) and resolveUpdateRestartProbeAuth (update-command.ts) are identical; extracting them to a shared helper would prevent drift.

Confidence Score: 4/5

Mostly safe to merge, but one restart code path (unmanaged SIGUSR1 restarts) still uses env-only auth due to probeAuth resolution being hoisted too late.

The fix is correct and complete for service-managed restarts and the status path. However, the waitForGatewayHealthyListener call in the restartedWithoutServiceManager branch of lifecycle.ts never receives probeAuth because resolveGatewayRestartProbeAuth() is invoked after that branch returns, leaving the SIGUSR1 unmanaged restart path with the original bug. A one-liner hoist resolves it, so this P1 should be addressed before merging.

src/cli/daemon-cli/lifecycle.ts — the waitForGatewayHealthyListener call inside the restartedWithoutServiceManager branch needs probeAuth.

Important Files Changed

Filename Overview
src/cli/daemon-cli/lifecycle.ts Adds resolveGatewayRestartProbeAuth and threads probeAuth into service-managed restart health checks, but the unmanaged (SIGUSR1) restart path still calls waitForGatewayHealthyListener without probeAuth.
src/cli/daemon-cli/restart-health.ts Exports GatewayProbeAuth type and correctly plumbs the optional probeAuth parameter through all four exported health-check helpers and their internal helpers.
src/cli/daemon-cli/restart-health.test.ts Adds a focused regression test confirming probeGateway is called with the configured token; covers the managed restart path only.
src/cli/daemon-cli/status.gather.ts One-line change passes the already-resolved daemonProbeAuth into inspectGatewayRestart; straightforward and correct.
src/cli/update-cli/update-command.ts Adds resolveUpdateRestartProbeAuth (duplicate of the helper in lifecycle.ts) and threads probeAuth into both waitForGatewayHealthyRestart call sites in the update restart flow; logic is correct but the helper is a duplication.

Comments Outside Diff (1)

  1. src/cli/daemon-cli/lifecycle.ts, line 196-200 (link)

    P1 Unmanaged restart path misses probeAuth

    The fix resolves auth from config and threads it through waitForGatewayHealthyRestart for service-managed restarts, but the waitForGatewayHealthyListener call used when restartedWithoutServiceManager is true (SIGUSR1-triggered restarts) is still missing probeAuth. The resolveGatewayRestartProbeAuth() call on line 223 is only reached after this early-return branch exits, so unmanaged restarts still probe with env-only auth — the exact bug this PR set out to fix.

    To cover both paths, hoist the probeAuth resolution above the if (restartedWithoutServiceManager) guard and pass it into waitForGatewayHealthyListener:

    const probeAuth = await resolveGatewayRestartProbeAuth();
    if (restartedWithoutServiceManager) {
      const health = await waitForGatewayHealthyListener({
        port: restartPort,
        attempts: POST_RESTART_HEALTH_ATTEMPTS,
        delayMs: POST_RESTART_HEALTH_DELAY_MS,
        probeAuth,
      });
      ...
    }
    
    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: src/cli/daemon-cli/lifecycle.ts
    Line: 196-200
    
    Comment:
    **Unmanaged restart path misses `probeAuth`**
    
    The fix resolves auth from config and threads it through `waitForGatewayHealthyRestart` for service-managed restarts, but the `waitForGatewayHealthyListener` call used when `restartedWithoutServiceManager` is true (SIGUSR1-triggered restarts) is still missing `probeAuth`. The `resolveGatewayRestartProbeAuth()` call on line 223 is only reached after this early-return branch exits, so unmanaged restarts still probe with env-only auth — the exact bug this PR set out to fix.
    
    To cover both paths, hoist the `probeAuth` resolution above the `if (restartedWithoutServiceManager)` guard and pass it into `waitForGatewayHealthyListener`:
    
    ```
    const probeAuth = await resolveGatewayRestartProbeAuth();
    if (restartedWithoutServiceManager) {
      const health = await waitForGatewayHealthyListener({
        port: restartPort,
        attempts: POST_RESTART_HEALTH_ATTEMPTS,
        delayMs: POST_RESTART_HEALTH_DELAY_MS,
        probeAuth,
      });
      ...
    }
    ```
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/cli/daemon-cli/lifecycle.ts
Line: 196-200

Comment:
**Unmanaged restart path misses `probeAuth`**

The fix resolves auth from config and threads it through `waitForGatewayHealthyRestart` for service-managed restarts, but the `waitForGatewayHealthyListener` call used when `restartedWithoutServiceManager` is true (SIGUSR1-triggered restarts) is still missing `probeAuth`. The `resolveGatewayRestartProbeAuth()` call on line 223 is only reached after this early-return branch exits, so unmanaged restarts still probe with env-only auth — the exact bug this PR set out to fix.

To cover both paths, hoist the `probeAuth` resolution above the `if (restartedWithoutServiceManager)` guard and pass it into `waitForGatewayHealthyListener`:

```
const probeAuth = await resolveGatewayRestartProbeAuth();
if (restartedWithoutServiceManager) {
  const health = await waitForGatewayHealthyListener({
    port: restartPort,
    attempts: POST_RESTART_HEALTH_ATTEMPTS,
    delayMs: POST_RESTART_HEALTH_DELAY_MS,
    probeAuth,
  });
  ...
}
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/cli/daemon-cli/lifecycle.ts
Line: 47-65

Comment:
**Duplicated auth resolution helper**

`resolveGatewayRestartProbeAuth` in `lifecycle.ts` is byte-for-byte identical to `resolveUpdateRestartProbeAuth` added in `update-command.ts`. Both functions read the best-effort config, call `resolveGatewayProbeAuthSafeWithSecretInputs`, and merge with env-var fallbacks. Extracting this into a shared utility (e.g. in `probe-auth.ts` or a new `restart-probe-auth.ts`) would avoid the two implementations drifting apart over time.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix: use configured gateway auth during ..." | Re-trigger Greptile

Comment on lines +47 to +65
async function resolveGatewayRestartProbeAuth() {
const fallbackAuth = {
token: process.env.OPENCLAW_GATEWAY_TOKEN?.trim() || undefined,
password: process.env.OPENCLAW_GATEWAY_PASSWORD?.trim() || undefined,
};
const cfg = await readBestEffortConfig().catch(() => undefined);
if (!cfg) {
return fallbackAuth;
}
const { auth } = await resolveGatewayProbeAuthSafeWithSecretInputs({
cfg,
mode: cfg.gateway?.mode === "remote" ? "remote" : "local",
env: process.env,
});
return {
token: auth.token ?? fallbackAuth.token,
password: auth.password ?? fallbackAuth.password,
};
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Duplicated auth resolution helper

resolveGatewayRestartProbeAuth in lifecycle.ts is byte-for-byte identical to resolveUpdateRestartProbeAuth added in update-command.ts. Both functions read the best-effort config, call resolveGatewayProbeAuthSafeWithSecretInputs, and merge with env-var fallbacks. Extracting this into a shared utility (e.g. in probe-auth.ts or a new restart-probe-auth.ts) would avoid the two implementations drifting apart over time.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/cli/daemon-cli/lifecycle.ts
Line: 47-65

Comment:
**Duplicated auth resolution helper**

`resolveGatewayRestartProbeAuth` in `lifecycle.ts` is byte-for-byte identical to `resolveUpdateRestartProbeAuth` added in `update-command.ts`. Both functions read the best-effort config, call `resolveGatewayProbeAuthSafeWithSecretInputs`, and merge with env-var fallbacks. Extracting this into a shared utility (e.g. in `probe-auth.ts` or a new `restart-probe-auth.ts`) would avoid the two implementations drifting apart over time.

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 310fc4da88. I extracted the shared local restart-probe auth resolution into src/gateway/probe-auth.ts and switched both lifecycle.ts and update-command.ts to use it, so the restart-health paths no longer duplicate the helper logic.

Also verified with targeted tests, lint, and tsgo.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c0001b0289

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/cli/daemon-cli/lifecycle.ts Outdated
}
const { auth } = await resolveGatewayProbeAuthSafeWithSecretInputs({
cfg,
mode: cfg.gateway?.mode === "remote" ? "remote" : "local",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Force local auth mode when resolving restart probe credentials

openclaw gateway restart always probes the local daemon (ws://127.0.0.1 in restart-health.ts), but this resolver switches to remote credential selection whenever gateway.mode=remote. In that config, resolveGatewayProbeAuthSafeWithSecretInputs can return gateway.remote.* credentials, which then override OPENCLAW_GATEWAY_TOKEN/PASSWORD and cause false timeout failures even when the local daemon restarted correctly. Restart health checks should resolve credentials in local mode regardless of client routing mode.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 310fc4da88. Restart health checks now resolve probe credentials in local mode regardless of gateway.mode, since the probe always targets the local daemon on 127.0.0.1.

I also kept the env fallback behavior and added coverage for the local-mode resolution path.

Comment thread src/cli/update-cli/update-command.ts Outdated
}
const { auth } = await resolveGatewayProbeAuthSafeWithSecretInputs({
cfg,
mode: cfg.gateway?.mode === "remote" ? "remote" : "local",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use local probe credential mode in update restart verification

The update restart health path reuses the same mode switch and can select gateway.remote.* auth when gateway.mode=remote, even though it verifies a local gateway service restart. This can regress successful restarts into spurious “did not become healthy” warnings for users whose remote credentials differ from local daemon auth. The resolver for post-update local restart checks should be pinned to local credential mode.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 310fc4da88. The post-update restart verification now uses the same shared local restart-probe auth resolver, so it no longer picks gateway.remote.* credentials when validating a local daemon restart.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4dcf855e89

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/cli/daemon-cli/status.gather.ts Outdated
@@ -383,6 +383,7 @@ export async function gatherDaemonStatus(
service,
port: daemonPort,
env: serviceEnv,
probeAuth: daemonProbeAuth,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep status restart probes on local credential mode

gatherDaemonStatus now forwards daemonProbeAuth into inspectGatewayRestart, but that auth is derived from gateway.mode and can resolve gateway.remote.* credentials in remote mode. inspectGatewayRestart performs a local reachability check against ws://127.0.0.1:<port>, so this can inject remote credentials into a local health probe and produce false “unhealthy” results when local and remote auth differ. Split the auth paths so remote-mode credentials are used for the remote RPC probe only, while local restart-health inspection always resolves local probe credentials.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 310fc4da88. I split the auth handling in status.gather.ts so the remote RPC probe keeps using the normal daemon probe auth path, while inspectGatewayRestart(...) now receives a separately resolved local restart-probe auth.

Added a test covering remote mode to verify the local restart-health path no longer reuses remote credentials.

@zssggle-rgb zssggle-rgb requested a review from a team as a code owner March 31, 2026 00:46
@openclaw-barnacle openclaw-barnacle Bot added the gateway Gateway runtime label Mar 31, 2026
@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Addressed the review feedback in 310fc4da88.

  • fixed unmanaged restart probe-auth propagation
  • extracted the duplicated restart probe-auth resolver into a shared utility
  • pinned local restart-health checks to local auth mode
  • split status auth paths so remote RPC auth is not reused for local restart-health probes

Validation run locally:

  • pnpm exec vitest run --config vitest.unit.config.ts src/cli/daemon-cli/lifecycle.test.ts src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/status.gather.test.ts
  • pnpm exec vitest run --config vitest.gateway.config.ts src/gateway/probe-auth.test.ts
  • pnpm lint
  • pnpm tsgo

@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Latest feedback has been addressed in 310fc4da88, checks are green, and the PR is ready to merge. Please merge when convenient. Thanks!

@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Following up here: the latest review feedback has been addressed and the restart-health auth path is now aligned across the affected restart flows.

The current remaining failures appear to be CI noise outside the narrow auth-path change itself, so this should be ready for another maintainer pass when convenient. Thanks.

@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Following up here: the latest review feedback has been addressed and the restart-health auth path is now aligned across the affected restart flows.

Local validation passed after the fix, and the branch should be ready for another maintainer pass when convenient. Thanks.

@zssggle-rgb zssggle-rgb force-pushed the fix/restart-probe-auth-health-checks branch from 310fc4d to 538e108 Compare April 4, 2026 03:59
@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Refreshed this branch on top of the latest upstream/main and force-pushed the update.

This keeps restart-health probe auth pinned to the local gateway auth path across daemon restart, update restart, and status inspection, and includes the focused test coverage for that auth split.

Re-ran:

  • pnpm exec vitest run --config vitest.unit.config.ts src/cli/daemon-cli/lifecycle.test.ts src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/status.gather.test.ts
  • pnpm exec vitest run --config vitest.gateway.config.ts src/gateway/probe-auth.test.ts
  • pnpm lint src/cli/daemon-cli/lifecycle.ts src/cli/daemon-cli/lifecycle.test.ts src/cli/daemon-cli/status.gather.ts src/cli/update-cli/update-command.ts src/gateway/probe-auth.ts src/gateway/probe-auth.test.ts
  • pnpm tsgo

Current tsgo/check is blocked on upstream main by existing conflict markers in src/config/io.write-config.test.ts.

@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Rebased onto the latest main, resolved the remaining test conflict, and force-pushed the refreshed branch.

Re-ran:

  • pnpm exec vitest run src/gateway/probe-auth.test.ts src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/lifecycle.test.ts
  • pnpm check

This should clear the old dirty/rebase state and put the branch back in a mergeable shape.

@zssggle-rgb zssggle-rgb force-pushed the fix/restart-probe-auth-health-checks branch from 538e108 to 1f624f1 Compare April 4, 2026 13:25
@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Rebased onto the latest main, resolved the remaining test conflict, and force-pushed the refreshed branch.

Re-ran:

  • pnpm exec vitest run src/gateway/probe-auth.test.ts src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/lifecycle.test.ts
  • pnpm check

This should clear the old dirty/rebase state and put the branch back in a mergeable shape.

@zssggle-rgb zssggle-rgb force-pushed the fix/restart-probe-auth-health-checks branch from 1f624f1 to ed84af0 Compare April 6, 2026 04:31
@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Refreshed this PR onto the latest main and force-pushed the branch.

Validation:

  • pnpm exec vitest run src/gateway/probe-auth.test.ts src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/lifecycle.test.ts
  • pnpm check still fails on the current upstream baseline in unrelated files under src/config/*, extensions/*, and src/plugin-sdk/test-helpers.ts after rebasing onto latest main; there are no new failures in the files touched by this PR.

This is back in a mergeable state and ready for another review pass.

@zssggle-rgb zssggle-rgb force-pushed the fix/restart-probe-auth-health-checks branch from ed84af0 to c4c17ed Compare April 6, 2026 04:36
@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

Follow-up: main advanced again during the refresh, so I rebased once more onto the current head and force-pushed the branch again.

Re-validated after the second rebase:

  • pnpm exec vitest run src/gateway/probe-auth.test.ts src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/lifecycle.test.ts
  • pnpm check still shows the same unrelated upstream-baseline failures outside this PR's diff.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c4c17ed10a

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/gateway/probe-auth.ts
Comment on lines +96 to +99
const { auth } = await resolveGatewayProbeAuthSafeWithSecretInputs({
cfg: params.cfg,
mode: "local",
env: params.env,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Prevent remote token fallback in local restart probe auth

This helper is used to authenticate local restart-health probes, but calling resolveGatewayProbeAuthSafeWithSecretInputs({ mode: "local" }) here can still return gateway.remote.* credentials when local auth is unset, because local-mode credential resolution falls back to the remote token/password. That means users in remote mode who only configured gateway.remote.token can still send remote credentials to the local 127.0.0.1 probe and get false unhealthy/timeouts after restart. Fresh evidence: resolveLocalGatewayCredentials in src/gateway/credentials.ts still falls back to plan.remoteToken.value/plan.remotePassword.value when local values are not configured, so mode: "local" alone does not enforce local-only auth.

Useful? React with 👍 / 👎.

@zssggle-rgb

Copy link
Copy Markdown
Contributor Author

CI note: the current red jobs still match the upstream baseline, not this PR diff.

Examples from this run:

  • build-artifacts / build-smoke / checks-fast-contracts-protocol all fail on src/plugin-sdk/test-helpers.ts(2,28): TS2459 about RmOptions from node:fs/promises
  • check-additional reports gateway-watch-regression outcome: failure, but its log shows pnpm build dies first on the same src/plugin-sdk/test-helpers.ts error before the harness completes
  • check is red on unrelated upstream errors in src/config/*, extensions/telegram/*, extensions/discord/*, etc.
  • extension shards are failing in unrelated packages like extensions/memory-core/* and extensions/zalo/*

Focused validation for this PR is still green:

  • pnpm exec vitest run src/gateway/probe-auth.test.ts src/cli/daemon-cli/restart-health.test.ts src/cli/daemon-cli/lifecycle.test.ts

@vincentkoc

Copy link
Copy Markdown
Member

ProjectClownfish could not safely update this branch, so it opened a narrow replacement PR instead.

Replacement PR: #72405
Source PR: #57374
Contributor credit is preserved in the replacement PR body and changelog plan.

@vincentkoc

Copy link
Copy Markdown
Member

ProjectClownfish could not safely update this branch, so it opened a narrow replacement PR instead.

Replacement PR: #72405
Source PR: #57374
Contributor credit is preserved in the replacement PR body and changelog plan.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cli CLI command changes gateway Gateway runtime size: S

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants