fix(ci): expose package deps to Telegram QA harness#72680
Conversation
Greptile SummaryThis PR fixes the Package Acceptance CI harness by linking installed package dependencies into
Confidence Score: 3/5Mostly safe; one symlink-creation inconsistency in the Docker E2E script may silently fail if target directories already exist. All TypeScript changes are well-guarded and consistent. The P1 finding is in the shell script helper —
Prompt To Fix All With AIThis is a comment left during a code review.
Path: scripts/e2e/npm-telegram-live-docker.sh
Line: 289-291
Comment:
**`ln` flag inconsistency vs. existing symlink pattern**
The new `link_installed_package_dependency` helper uses `ln -sfn "$source" "$target"` without the `-T` flag or a preceding `rm -rf`, but the immediately-preceding loop (line 276) always does `rm -rf "/app/node_modules/$dependency_name"` then `ln -sfnT`. If any of the three target paths already exist as a real directory (e.g. `yaml` or `zod` bundled in the base image), `ln -sfn` without `-T` will silently create the symlink _inside_ that directory rather than replacing it, leaving the module unresolvable.
```suggestion
mkdir -p "$(dirname "$target")"
rm -rf "$target"
ln -sfnT "$source" "$target"
```
How can I resolve this? If you propose a fix, please make it concise.Reviews (1): Last reviewed commit: "fix(ci): keep plugin update smoke migrat..." | Re-trigger Greptile |
| fi | ||
| mkdir -p "$(dirname "$target")" | ||
| ln -sfn "$source" "$target" |
There was a problem hiding this comment.
ln flag inconsistency vs. existing symlink pattern
The new link_installed_package_dependency helper uses ln -sfn "$source" "$target" without the -T flag or a preceding rm -rf, but the immediately-preceding loop (line 276) always does rm -rf "/app/node_modules/$dependency_name" then ln -sfnT. If any of the three target paths already exist as a real directory (e.g. yaml or zod bundled in the base image), ln -sfn without -T will silently create the symlink inside that directory rather than replacing it, leaving the module unresolvable.
| fi | |
| mkdir -p "$(dirname "$target")" | |
| ln -sfn "$source" "$target" | |
| mkdir -p "$(dirname "$target")" | |
| rm -rf "$target" | |
| ln -sfnT "$source" "$target" |
Prompt To Fix With AI
This is a comment left during a code review.
Path: scripts/e2e/npm-telegram-live-docker.sh
Line: 289-291
Comment:
**`ln` flag inconsistency vs. existing symlink pattern**
The new `link_installed_package_dependency` helper uses `ln -sfn "$source" "$target"` without the `-T` flag or a preceding `rm -rf`, but the immediately-preceding loop (line 276) always does `rm -rf "/app/node_modules/$dependency_name"` then `ln -sfnT`. If any of the three target paths already exist as a real directory (e.g. `yaml` or `zod` bundled in the base image), `ln -sfn` without `-T` will silently create the symlink _inside_ that directory rather than replacing it, leaving the module unresolvable.
```suggestion
mkdir -p "$(dirname "$target")"
rm -rf "$target"
ln -sfnT "$source" "$target"
```
How can I resolve this? If you propose a fix, please make it concise.* 'main' of https://github.com/openclaw/openclaw: docs: point maintainer triage at gitcrawl fix: clean runtime deps backup owner marker test(browser): close hanging attach-only sockets fix(plugins): normalize windows override imports fix: preserve live runtime deps temp dirs fix(lmstudio): promote bracketed tool calls Add Google Meet realtime consult agentId (#72381) fix: normalize lazy service override imports test: split ui unit tests from generic lane feat(migrations): add plugin-owned Hermes import fix(ci): expose package deps to Telegram QA harness (#72680) fix: hide bundled runtime npm windows
* fix(ci): expose package deps to telegram QA harness * fix(ci): link QA package runtime deps * fix(agents): guard replay metadata in empty retries * fix(ci): keep plugin update smoke migration-stable
* 'main' of https://github.com/openclaw/openclaw: docs: point maintainer triage at gitcrawl fix: clean runtime deps backup owner marker test(browser): close hanging attach-only sockets fix(plugins): normalize windows override imports fix: preserve live runtime deps temp dirs fix(lmstudio): promote bracketed tool calls Add Google Meet realtime consult agentId (openclaw#72381) fix: normalize lazy service override imports test: split ui unit tests from generic lane feat(migrations): add plugin-owned Hermes import fix(ci): expose package deps to Telegram QA harness (openclaw#72680) fix: hide bundled runtime npm windows
* fix(ci): expose package deps to telegram QA harness * fix(ci): link QA package runtime deps * fix(agents): guard replay metadata in empty retries * fix(ci): keep plugin update smoke migration-stable
* 'main' of https://github.com/openclaw/openclaw: docs: point maintainer triage at gitcrawl fix: clean runtime deps backup owner marker test(browser): close hanging attach-only sockets fix(plugins): normalize windows override imports fix: preserve live runtime deps temp dirs fix(lmstudio): promote bracketed tool calls Add Google Meet realtime consult agentId (openclaw#72381) fix: normalize lazy service override imports test: split ui unit tests from generic lane feat(migrations): add plugin-owned Hermes import fix(ci): expose package deps to Telegram QA harness (openclaw#72680) fix: hide bundled runtime npm windows
* fix(ci): expose package deps to telegram QA harness * fix(ci): link QA package runtime deps * fix(agents): guard replay metadata in empty retries * fix(ci): keep plugin update smoke migration-stable
* 'main' of https://github.com/openclaw/openclaw: docs: point maintainer triage at gitcrawl fix: clean runtime deps backup owner marker test(browser): close hanging attach-only sockets fix(plugins): normalize windows override imports fix: preserve live runtime deps temp dirs fix(lmstudio): promote bracketed tool calls Add Google Meet realtime consult agentId (openclaw#72381) fix: normalize lazy service override imports test: split ui unit tests from generic lane feat(migrations): add plugin-owned Hermes import fix(ci): expose package deps to Telegram QA harness (openclaw#72680) fix: hide bundled runtime npm windows
* fix(ci): expose package deps to telegram QA harness * fix(ci): link QA package runtime deps * fix(agents): guard replay metadata in empty retries * fix(ci): keep plugin update smoke migration-stable
* 'main' of https://github.com/openclaw/openclaw: docs: point maintainer triage at gitcrawl fix: clean runtime deps backup owner marker test(browser): close hanging attach-only sockets fix(plugins): normalize windows override imports fix: preserve live runtime deps temp dirs fix(lmstudio): promote bracketed tool calls Add Google Meet realtime consult agentId (openclaw#72381) fix: normalize lazy service override imports test: split ui unit tests from generic lane feat(migrations): add plugin-owned Hermes import fix(ci): expose package deps to Telegram QA harness (openclaw#72680) fix: hide bundled runtime npm windows
* fix(ci): expose package deps to telegram QA harness * fix(ci): link QA package runtime deps * fix(agents): guard replay metadata in empty retries * fix(ci): keep plugin update smoke migration-stable
* 'main' of https://github.com/openclaw/openclaw: docs: point maintainer triage at gitcrawl fix: clean runtime deps backup owner marker test(browser): close hanging attach-only sockets fix(plugins): normalize windows override imports fix: preserve live runtime deps temp dirs fix(lmstudio): promote bracketed tool calls Add Google Meet realtime consult agentId (openclaw#72381) fix: normalize lazy service override imports test: split ui unit tests from generic lane feat(migrations): add plugin-owned Hermes import fix(ci): expose package deps to Telegram QA harness (openclaw#72680) fix: hide bundled runtime npm windows
* fix(ci): expose package deps to telegram QA harness * fix(ci): link QA package runtime deps * fix(agents): guard replay metadata in empty retries * fix(ci): keep plugin update smoke migration-stable
* 'main' of https://github.com/openclaw/openclaw: docs: point maintainer triage at gitcrawl fix: clean runtime deps backup owner marker test(browser): close hanging attach-only sockets fix(plugins): normalize windows override imports fix: preserve live runtime deps temp dirs fix(lmstudio): promote bracketed tool calls Add Google Meet realtime consult agentId (openclaw#72381) fix: normalize lazy service override imports test: split ui unit tests from generic lane feat(migrations): add plugin-owned Hermes import fix(ci): expose package deps to Telegram QA harness (openclaw#72680) fix: hide bundled runtime npm windows
Summary
/app/node_modulesbefore running the mounted package Telegram QA harness.Root Cause
Package Acceptancewithtelegram_mode=live-frontiermountsextensions/qa-labas QA harness source while the SUT is the installed package candidate. The container only linked/app/node_modules/openclaw, so package-local QA harness imports such aszodcould not resolve from/app/extensions/qa-lab/**.The mounted harness also pulled a QA-only SDK shim through the gateway RPC client. Package E2E should use the published browser-node runtime entrypoint directly.
A later CI shard exposed a separate retry-path assumption: empty assistant turns could arrive without replay metadata, and the retry guard tried to read fields from
undefined. Missing metadata is now explicitly replay-unsafe.The package
plugin-updatesmoke was also seeding deprecatedplugins.installsconfig, then hashing the config before the CLI's legitimate state-ledger migration stripped it. The fixture now starts from the currentplugins/installs.jsonledger shape.Validation
OPENCLAW_LOCAL_CHECK_MODE=throttled pnpm test:serial test/scripts/npm-telegram-live.test.ts extensions/qa-lab/src/gateway-rpc-client.test.ts src/agents/pi-embedded-runner/run.empty-error-retry.test.ts src/agents/pi-embedded-runner/run.incomplete-turn.test.ts test/scripts/plugin-update-unchanged-docker.test.tstbx_01kq6w98jnnqr9nrstawan22a7:OPENCLAW_LOCAL_CHECK_MODE=throttled pnpm check:changedtbx_01kq6ssfvkhewwvtx487pc60vw:pnpm test:docker:plugin-updateTelegram package acceptance / Run package Telegram E2EandDocker product acceptance / Docker E2E targeted lanes.git diff --check origin/main...HEAD