Review flagged that "equal by construction" rested on an engine behaviour I had not measured: `scrollbar-gutter: stable` only equalizes the layers if the engine applies it to `overflow: hidden` the way it does to `overflow-y: auto`. Measured it on the running app across the three engines Playwright ships, and the property does not hold up. engine .input / .backdrop / .mirror wrap width chromium 776 / 776 / 776 (768 / 768 / 768 with the declaration) firefox 776 / 776 / 776 (unchanged by it — overlay scrollbar) WebKit 768 / 776 / 776 (unchanged by it) WebKit reserves for `overflow-y: auto` and not for `overflow: hidden`, so the declaration left .input at 768 against 776 — exactly the gap it was meant to close — on the one engine where that gap is observable at all, while costing every chromium user 8px of text column unconditionally. Reverted: the composer's metrics are now the same as before this PR. The WebKit gap predates this change and is not closed here. It is recorded in the Agent Note with the numbers, and the browser scenario asserts the equality on the lane's engine so a regression into that state fails loudly. The mirror is unaffected on WebKit for the drafts measured — the extents still agree — but a draft whose wrapping turns on those 8px would clamp it. The review's monotonicity concern resolves the same way: the declaration was never worse than master, because WebKit already measured 768 against 776 without it. It simply was not better. Also from this round: the wrap-width assertion now covers .mirror as well as the two glyph layers — it is the height authority, so a mirror alone wrapping wider would measure the box short and clip content below the 14-line cap with every other assertion green. Plus `renderGeometry`'s missing `@param trailingNewline`, and both e2e tsconfig lists restored to alphabetical order.
216 lines
9.8 KiB
JSON
216 lines
9.8 KiB
JSON
{
|
|
// Host aggregate (one of the two check units; see tsconfig.json). packages/client
|
|
// type-checks in tsconfig.client.json: the two sides merge cordis Context under
|
|
// the same keys, one program cannot see both.
|
|
"extends": "./tsconfig.base.json",
|
|
"compilerOptions": {
|
|
"noEmit": true,
|
|
"rewriteRelativeImportExtensions": false
|
|
},
|
|
"include": [
|
|
"apps/web/tests/scaffold.ts",
|
|
"apps/web/tests/support.ts",
|
|
"apps/web/tests/scaffold-hermetic.e2e.ts",
|
|
"apps/web/tests/live-interactions.e2e.ts",
|
|
"apps/web/tests/question-composer.e2e.ts",
|
|
"apps/web/tests/approval-composer.e2e.ts",
|
|
"apps/web/tests/plan-review.e2e.ts",
|
|
"apps/web/tests/steering.e2e.ts",
|
|
"apps/web/tests/navigation-panes.e2e.ts",
|
|
"apps/web/tests/lifecycle-chrome.e2e.ts",
|
|
"apps/web/tests/details-session-lifecycle.e2e.ts",
|
|
"apps/web/tests/settings-chrome.e2e.ts",
|
|
"apps/web/tests/models-settings.e2e.ts",
|
|
"apps/web/tests/onboarding-deepseek-config.e2e.ts",
|
|
"apps/web/tests/workspace-management.e2e.ts",
|
|
"apps/web/tests/replay-round-trip.e2e.ts",
|
|
"apps/web/tests/seeded-history.e2e.ts",
|
|
"apps/web/tests/sidebar-scrollbar.e2e.ts",
|
|
"apps/web/tests/code-mode-round.e2e.ts",
|
|
"apps/web/tests/composer-draft-scroll.e2e.ts",
|
|
"apps/web/tests/cordis-tool-round.e2e.ts",
|
|
"apps/web/tests/message-actions.e2e.ts",
|
|
"apps/web/tests/queue-actions.e2e.ts",
|
|
"apps/web/tests/skill-invocation-policy.e2e.ts",
|
|
"apps/cli/tests/**/*.ts",
|
|
"examples/*/src/**/*.ts",
|
|
"examples/*/start.ts",
|
|
"examples/*/tests/**/*.ts",
|
|
"packages/*/*/tests/**/*.ts",
|
|
"scripts/**/*.ts",
|
|
"website/**/*.ts",
|
|
"website/.vitepress/**/*.ts"
|
|
],
|
|
"exclude": [
|
|
"packages/client/**",
|
|
"packages/host/directory-picker-browse/**",
|
|
"packages/host/directory-picker-native/**",
|
|
"scripts/client-bundle-css.spec.ts",
|
|
"packages/typert/generator/tests/fixtures/**",
|
|
"scripts/client-bundle-purity.spec.ts"
|
|
],
|
|
"references": [
|
|
{ "path": "./vendor/cosmokit" },
|
|
{ "path": "./vendor/schemastery" },
|
|
{ "path": "./vendor/cordis" },
|
|
{ "path": "./vendor/loader" },
|
|
{ "path": "./vendor/include" },
|
|
{ "path": "./vendor/group" },
|
|
{ "path": "./vendor/timer" },
|
|
{ "path": "./vendor/hmr" },
|
|
{ "path": "./vendor/logger-console" },
|
|
{ "path": "./packages/util/brand" },
|
|
{ "path": "./packages/util/native-command" },
|
|
{ "path": "./packages/util/paths" },
|
|
{ "path": "./packages/util/timeout" },
|
|
{ "path": "./packages/util/retention" },
|
|
{ "path": "./packages/util/atomic-write" },
|
|
{ "path": "./packages/llm/llm" },
|
|
{ "path": "./packages/llm/token-meter" },
|
|
{ "path": "./packages/core/session" },
|
|
{ "path": "./packages/core/scope" },
|
|
{ "path": "./packages/typert/registry" },
|
|
{ "path": "./packages/typert/loader" },
|
|
{ "path": "./packages/session-persistence/session-persistence" },
|
|
{ "path": "./packages/session-persistence/session-checkpoint-policy" },
|
|
{ "path": "./packages/session-persistence/session-persistence-jsonl" },
|
|
{ "path": "./packages/session-persistence/session-persistence-sqlite" },
|
|
{ "path": "./packages/session-projection/session-projection" },
|
|
{ "path": "./packages/session-projection/session-projection-cache" },
|
|
{ "path": "./packages/session-query/session-query" },
|
|
{ "path": "./packages/session-query/session-query-sqlite" },
|
|
{ "path": "./packages/settings/settings" },
|
|
{ "path": "./packages/settings/settings-local" },
|
|
{ "path": "./packages/credentials/credentials" },
|
|
{ "path": "./packages/credentials/credentials-local" },
|
|
{ "path": "./packages/session-query/tool-session-query" },
|
|
{ "path": "./packages/storage/storage" },
|
|
{ "path": "./packages/storage/storage-json" },
|
|
{ "path": "./packages/storage/storage-sqlite" },
|
|
{ "path": "./packages/storage/storage-domain" },
|
|
{ "path": "./packages/workspace/workspace" },
|
|
{ "path": "./packages/session-title/session-title" },
|
|
{ "path": "./packages/session-title/session-title-llm" },
|
|
{ "path": "./packages/session-title/session-title-first-message-llm" },
|
|
{ "path": "./packages/session-title/session-title-all-messages-llm" },
|
|
{ "path": "./packages/telemetry/session-telemetry" },
|
|
{ "path": "./packages/telemetry/session-telemetry-otel" },
|
|
{ "path": "./packages/core/system-prompt" },
|
|
{ "path": "./packages/core/agent" },
|
|
{ "path": "./packages/ui/commands" },
|
|
{ "path": "./packages/goal/goal" },
|
|
{ "path": "./packages/goal/tool-goal" },
|
|
{ "path": "./packages/goal/goal-session" },
|
|
{ "path": "./packages/goal/command-goal" },
|
|
{ "path": "./packages/context/time-context" },
|
|
{ "path": "./packages/context/tmux-context" },
|
|
{ "path": "./packages/context/session-reference" },
|
|
{ "path": "./packages/ui/user-interaction" },
|
|
{ "path": "./packages/ui/user-approval" },
|
|
{ "path": "./packages/ui/permission" },
|
|
{ "path": "./packages/core/tools" },
|
|
{ "path": "./packages/skill/skill" },
|
|
{ "path": "./packages/skill/skill-local" },
|
|
{ "path": "./packages/skill/tool-skill" },
|
|
{ "path": "./packages/ui/tool-ask-user" },
|
|
{ "path": "./packages/context/workspace-context" },
|
|
{ "path": "./packages/core/agent-loop" },
|
|
{ "path": "./packages/llm/llm-retry" },
|
|
{ "path": "./packages/examples/agent-spine-demo" },
|
|
{ "path": "./packages/examples/cli-demo" },
|
|
{ "path": "./packages/subprocess/subprocess" },
|
|
{ "path": "./packages/subprocess/subprocess-local" },
|
|
{ "path": "./packages/bash/bash" },
|
|
{ "path": "./packages/pty/pty" },
|
|
{ "path": "./packages/pty/pty-local" },
|
|
{ "path": "./packages/pty/tool-bash-persistent" },
|
|
{ "path": "./packages/pty/tool-pty" },
|
|
{ "path": "./packages/code-runtime/code-runtime" },
|
|
{ "path": "./packages/code-runtime/code-runtime-worker" },
|
|
{ "path": "./packages/llm/llm-deepseek" },
|
|
{ "path": "./packages/llm/llm-pi-ai" },
|
|
{ "path": "./packages/bash/bash-local" },
|
|
{ "path": "./packages/sandbox/sandbox" },
|
|
{ "path": "./packages/sandbox/sandbox-local" },
|
|
{ "path": "./packages/sandbox/sandbox-policy" },
|
|
{ "path": "./packages/bash/bash-sandbox" },
|
|
{ "path": "./packages/bash/tool-bash" },
|
|
{ "path": "./packages/fs/fs" },
|
|
{ "path": "./packages/fs/fs-local" },
|
|
{ "path": "./packages/fs/fs-policy" },
|
|
{ "path": "./packages/fs/fs-sandbox" },
|
|
{ "path": "./packages/fs/tool-fs" },
|
|
{ "path": "./packages/fs/tool-fs-search" },
|
|
{ "path": "./packages/fs/tool-str-replace-editor" },
|
|
{ "path": "./packages/compact/compact" },
|
|
{ "path": "./packages/compact/compact-basic" },
|
|
{ "path": "./packages/compact/compact-tool-result-prune" },
|
|
{ "path": "./packages/web/web" },
|
|
{ "path": "./packages/web/web-search-exa" },
|
|
{ "path": "./packages/web/web-search-perplexity" },
|
|
{ "path": "./packages/web/web-search-deepseek" },
|
|
{ "path": "./packages/web/web-fetch-local" },
|
|
{ "path": "./packages/web/tool-web" },
|
|
{ "path": "./packages/spill/spill" },
|
|
{ "path": "./packages/spill/spill-local" },
|
|
{ "path": "./packages/spill/spill-policy" },
|
|
{ "path": "./packages/timeout/timeout-policy" },
|
|
{ "path": "./packages/support/invariants" },
|
|
{ "path": "./packages/support/agent-loop-testkit" },
|
|
{ "path": "./packages/acp/acp" },
|
|
{ "path": "./packages/examples/acp-demo" },
|
|
{ "path": "./packages/ui/app-boot" },
|
|
{ "path": "./packages/ui/jsonrpc" },
|
|
{ "path": "./packages/examples/jsonrpc-demo" },
|
|
{ "path": "./packages/ui/tui" },
|
|
{ "path": "./packages/support/llm-replay" },
|
|
{ "path": "./packages/typert/generator" },
|
|
{ "path": "./packages/support/acp-snapshot" },
|
|
{ "path": "./packages/support/loader-smoke" },
|
|
{ "path": "./packages/support/llm-mock-server" },
|
|
{ "path": "./packages/subagent/subagent" },
|
|
{ "path": "./packages/subagent/tool-subagent" },
|
|
{ "path": "./packages/subagent/subagent-inprocess" },
|
|
{ "path": "./packages/subagent/subagent-spawn" },
|
|
{ "path": "./packages/subagent/subagent-fork" },
|
|
{ "path": "./packages/subagent/subagent-acp" },
|
|
{ "path": "./packages/subagent/subagent-dsh-sdk" },
|
|
{ "path": "./packages/tasks/tasks" },
|
|
{ "path": "./packages/tasks/tasks-local" },
|
|
{ "path": "./packages/tasks/tool-tasks" },
|
|
{ "path": "./packages/workflow/workflow" },
|
|
{ "path": "./packages/workflow/workflow-workerthread" },
|
|
{ "path": "./packages/workflow/tool-workflow" },
|
|
{ "path": "./packages/workflow/tool-ralph" },
|
|
{ "path": "./packages/todo/tool-todo" },
|
|
{ "path": "./packages/plan/plan-mode" },
|
|
{ "path": "./packages/guard/repeat-tool-guard" },
|
|
{ "path": "./packages/cordis/tool-cordis" },
|
|
{ "path": "./packages/hooks/hook-protocol" },
|
|
{ "path": "./packages/hooks/hooks-claude" },
|
|
{ "path": "./packages/hooks/hooks-codex" },
|
|
{ "path": "./packages/mcp/mcp-client" },
|
|
{ "path": "./packages/host/apiproxy" },
|
|
{ "path": "./packages/host/directory-picker" },
|
|
{ "path": "./packages/host/directory-picker-auto" },
|
|
// Dual-face backend leaves stay client-registered (their tests and client
|
|
// halves are excluded above); these references only let the adaptive
|
|
// chooser's composition test import each backend's NODE entry, whose
|
|
// declarations carry no client-side Context merge — the mirror of the
|
|
// client aggregate's webserver reference.
|
|
{ "path": "./packages/host/directory-picker-browse" },
|
|
{ "path": "./packages/host/directory-picker-native" },
|
|
{ "path": "./packages/host/webserver" },
|
|
{ "path": "./packages/sdk/sdk-client" },
|
|
{ "path": "./packages/sdk/helper" },
|
|
{ "path": "./packages/sdk/sdk-protocol" },
|
|
{ "path": "./packages/sdk/scripts" },
|
|
{ "path": "./packages/sdk/create-sdk" },
|
|
{ "path": "./packages/sdk/telemetry" },
|
|
{ "path": "./packages/lsp/lsp" },
|
|
{ "path": "./packages/lsp/lsp-local" },
|
|
{ "path": "./packages/lsp/tool-lsp" },
|
|
{ "path": "./apps/cli" }
|
|
]
|
|
}
|