diff --git a/AGENTS.md b/AGENTS.md index fcd39535ab4..50c6d662423 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -180,6 +180,10 @@ - When tests need example Anthropic/OpenAI model constants, prefer `sonnet-4.6` and `gpt-5.4`; update older Anthropic/GPT examples when you touch those tests. - Run `pnpm test` (or `pnpm test:coverage`) before pushing when you touch logic. - Write tests to clean up timers, env, globals, mocks, sockets, temp dirs, and module state so `--isolate=false` stays green. +- Test performance guardrail: do not put `vi.resetModules()` plus `await import(...)` in `beforeEach`/per-test loops for heavy modules unless module state truly requires it. Prefer static imports or one-time `beforeAll` imports, then reset mocks/runtime state directly. +- Test performance guardrail: do not import broad local `./runtime-api.ts` barrels from hot extension runtime code or high-fanout tests when you only need a narrow helper/type. Prefer the smallest `openclaw/plugin-sdk/*` subpath or a thin local seam so one helper import does not rebuild a large plugin graph. +- Test performance guardrail: keep expensive runtime fallback work such as snapshotting, migration, installs, or bootstrap behind dedicated `*.runtime.ts` boundaries so tests can mock the seam instead of accidentally invoking real work. +- Test performance guardrail: for import-only/runtime-wrapper tests, keep the wrapper lazy. Do not eagerly load heavy verification/bootstrap/runtime modules at module top level if the exported function can import them on demand. - Agents MUST NOT modify baseline, inventory, ignore, snapshot, or expected-failure files to silence failing checks without explicit approval in this chat. - For targeted/local debugging, keep using the wrapper: `pnpm test -- [vitest args...]` (for example `pnpm test -- src/commands/onboard-search.test.ts -t "shows registered plugin providers"`); do not default to raw `pnpm vitest run ...` because it bypasses wrapper config/profile/pool routing. - Do not set test workers above 16; tried already. diff --git a/CHANGELOG.md b/CHANGELOG.md index 88a2b934684..9144c513fed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ Docs: https://docs.openclaw.ai - Memory/QMD: point `QMD_CONFIG_DIR` at the nested `xdg-config/qmd` directory so per-agent collection config resolves correctly. (#39078) Thanks @smart-tinker and @vincentkoc. - Memory/QMD: include deduplicated default plus per-agent `memorySearch.extraPaths` when building QMD custom collections, so shared and agent-specific extra roots both get indexed consistently. (#57315) Thanks @Vitalcheffe and @vincentkoc. - Memory/session indexer: include `.jsonl.reset.*` and `.jsonl.deleted.*` transcripts in the memory host session scan while still excluding `.jsonl.bak.*` compaction backups and lock files, so memory search sees archived session history without duplicating stale snapshots. Thanks @hclsys and @vincentkoc. +- Memory/doctor: suppress the orphan transcript cleanup warning when QMD session indexing is enabled, so doctor no longer suggests deleting transcript history that QMD still uses for recall. (#40584) Thanks @Gyarados4157 and @vincentkoc. - CI/dev checks: default local `pnpm check` to a lower-memory typecheck/lint path while keeping CI on the normal parallel path, and harden Telegram test typing/literals around native TypeScript-Go tooling crashes. - Agents/sandbox: honor `tools.sandbox.tools.alsoAllow`, let explicit sandbox re-allows remove matching built-in default-deny tools, and keep sandbox explain/error guidance aligned with the effective sandbox tool policy. (#54492) Thanks @ngutman. - LINE/ACP: add current-conversation binding and inbound binding-routing parity so `/acp spawn ... --thread here`, configured ACP bindings, and active conversation-bound ACP sessions work on LINE like the other conversation channels. diff --git a/extensions/matrix/src/cli.test.ts b/extensions/matrix/src/cli.test.ts index 9512a44fb5a..251d56a7f93 100644 --- a/extensions/matrix/src/cli.test.ts +++ b/extensions/matrix/src/cli.test.ts @@ -1,6 +1,6 @@ import { Command } from "commander"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { formatZonedTimestamp } from "openclaw/plugin-sdk/matrix-runtime-shared"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { registerMatrixCli, resetMatrixCliStateForTests } from "./cli.js"; const bootstrapMatrixVerificationMock = vi.fn(); diff --git a/extensions/matrix/src/matrix/accounts.ts b/extensions/matrix/src/matrix/accounts.ts index 482978f0c5f..d6d7325a1b7 100644 --- a/extensions/matrix/src/matrix/accounts.ts +++ b/extensions/matrix/src/matrix/accounts.ts @@ -1,5 +1,5 @@ -import { resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-resolution"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; +import { resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-resolution"; import { hasConfiguredSecretInput } from "openclaw/plugin-sdk/secret-input"; import { resolveConfiguredMatrixAccountIds, diff --git a/extensions/matrix/src/matrix/client/storage.ts b/extensions/matrix/src/matrix/client/storage.ts index 6a8e21f0db3..ab5675ef6cf 100644 --- a/extensions/matrix/src/matrix/client/storage.ts +++ b/extensions/matrix/src/matrix/client/storage.ts @@ -337,9 +337,7 @@ export async function maybeMigrateLegacyStorage(params: { }); const logger = getMatrixRuntime().logging.getChildLogger({ module: "matrix-storage" }); - const { maybeCreateMatrixMigrationSnapshot } = await import( - "./migration-snapshot.runtime.js" - ); + const { maybeCreateMatrixMigrationSnapshot } = await import("./migration-snapshot.runtime.js"); await maybeCreateMatrixMigrationSnapshot({ trigger: "matrix-client-fallback", env: params.env,