Browser acceptance of the activity panel surfaced the product problem: a background bash registers in both planes, so the header grew two near- identical popovers — "background jobs" with lifecycle and duration, "activities" with live output — listing the same work twice. The service planes stay orthogonal (jobs: model-visible control with a consuming read cursor; activities: transient non-consuming observation). The join happens per row in the UI projection instead: - dsh-client-ui-activity renders the single merged "tasks" list. Each jobsBySession row joins the activity carrying its correlation.jobId — the job supplies identity, lifecycle (stopping exists only there), duration, and the model-visible detail; the activity supplies the expandable live-output panel. Standalone activities (workflow runs) keep their own rows; without the activity registry, job rows still render and the control degrades to the old job list exactly. - dsh-client-ui-jobs is deleted (pre-release, no shim); the merged entry takes its slot order. The job locale namespace folds into activity. - User-facing copy says "task" (任务): N tasks running / N 个任务进行中. - Hierarchy: live rows first as two lines (label over kind badge and status, ticking duration), a Finished divider when both sections exist, settled rows compacted to one de-emphasized line, and the output panel hangs behind a spine under its row. Deliberately not joined: subagent rows stay bare (the subagent panel is their surface) and foreground commands stay in tool cards. Both web e2e scenarios now assert one Tasks list; the background-job scenario's row gained a live-output panel, proving the join end to end. Agent Note: 2026-08-25-unified-task-list.
105 lines
5.1 KiB
JSON
105 lines
5.1 KiB
JSON
{
|
|
// Client-side typecheck aggregate: packages/client tests (.ts and .tsx).
|
|
// Split from the host aggregate because both sides merge cordis Context
|
|
// under the same keys (sessions, loader) with different services; shared
|
|
// leaves (session/llm/tools/apiproxy/...) build once and are referenced by
|
|
// both programs through each client package's own references.
|
|
"extends": "./tsconfig.base.client.json",
|
|
"compilerOptions": {
|
|
"noEmit": true,
|
|
"rewriteRelativeImportExtensions": false,
|
|
// Tests execute under vitest on node (e2e files spawn processes); browser
|
|
// purity of package src is each package's own tsconfig plus
|
|
// scripts/client-bundle-purity.spec.ts.
|
|
"types": ["node"]
|
|
},
|
|
"include": [
|
|
// Source-subpath test imports can arrive through workspace links whose
|
|
// realpath semantics vary by host. Load package CSS declarations directly.
|
|
"packages/client/*/src/css-modules.d.ts",
|
|
"packages/client/*/tests/**/*.ts",
|
|
"packages/client/*/tests/**/*.tsx",
|
|
"packages/*/*/tests/**/*.client.spec.ts",
|
|
"packages/*/*/tests/**/*.client.spec.tsx",
|
|
"packages/*/*/tests/**/*.client.tsx",
|
|
"packages/*/*/tests/**/*.client.ts",
|
|
// Client package outside packages/client with a local CSS module face.
|
|
"packages/extensions/ui-cordis/src/css-modules.d.ts",
|
|
"packages/client/tsdown.client.ts",
|
|
"scripts/client-build-environment.ts",
|
|
"scripts/*.client.spec.ts",
|
|
"scripts/client-bundle-css.spec.ts",
|
|
"scripts/client-bundle-purity.spec.ts"
|
|
],
|
|
// A `*.host.spec.ts` covers the Host half of a split client package and
|
|
// belongs to the host aggregate, which excludes this program's `*.client.*`
|
|
// in turn. `exclude` wins over `include`, so the test glob above stays broad.
|
|
"exclude": [
|
|
"packages/client/*/tests/**/*.host.spec.ts"
|
|
],
|
|
"references": [
|
|
// Shared leaf: web e2e boots the real host webserver (fixture + real-host
|
|
// smoke policy). webserver has zero workspace deps and no cordis merge,
|
|
// so it cannot drag host-side Context augmentation into this program.
|
|
{ "path": "./packages/host/webserver" },
|
|
// Compaction seam: ui-chat type-imports the canonical checkpoint contract
|
|
// from the cordis-free dsh-compaction/checkpoint leaf. Composite rootDir
|
|
// rules make that path depend on this project reference.
|
|
{ "path": "./packages/compaction/compaction" },
|
|
{ "path": "./packages/client/store" },
|
|
{ "path": "./packages/client/ui-slots" },
|
|
{ "path": "./packages/client/ui-attachment" },
|
|
{ "path": "./packages/client/ui-primitives" },
|
|
{ "path": "./packages/client/modules" },
|
|
{ "path": "./packages/client/hmr" },
|
|
{ "path": "./packages/client/connection/tsconfig.client.json" },
|
|
{ "path": "./packages/typert/registry" },
|
|
{ "path": "./packages/api/gateway/tsconfig.client.json" },
|
|
{ "path": "./packages/api/session-controller/tsconfig.client.json" },
|
|
{ "path": "./packages/api/activity-controller/tsconfig.client.json" },
|
|
{ "path": "./packages/api/workspace-controller/tsconfig.client.json" },
|
|
{ "path": "./packages/api/remotes/tsconfig.client.json" },
|
|
{ "path": "./packages/extensions/cordis-client-runner" },
|
|
{ "path": "./packages/extensions/ui-cordis" },
|
|
{ "path": "./packages/test-support/client-runtime" },
|
|
{ "path": "./packages/client/ui-layout" },
|
|
{ "path": "./packages/client/ui-sidebar" },
|
|
{ "path": "./packages/client/ui-brand-official" },
|
|
{ "path": "./packages/client/ui-approval" },
|
|
{ "path": "./packages/client/ui-chat" },
|
|
{ "path": "./packages/client/ui-conversation" },
|
|
{ "path": "./packages/client/ui-tool" },
|
|
{ "path": "./packages/client/ui-deliverables" },
|
|
{ "path": "./packages/client/ui-workflow-run" },
|
|
{ "path": "./packages/client/ui-workspace" },
|
|
{ "path": "./packages/client/ui-input-trigger" },
|
|
{ "path": "./packages/client/ui-commands" },
|
|
{ "path": "./packages/client/ui-skill" },
|
|
{ "path": "./packages/client/ui-reference" },
|
|
{ "path": "./packages/client/ui-subagent" },
|
|
{ "path": "./packages/client/ui-activity" },
|
|
{ "path": "./packages/client/ui-directory-picker-browse" },
|
|
{ "path": "./packages/client/ui-directory-picker-native" },
|
|
{ "path": "./packages/client/ui-goal" },
|
|
{ "path": "./packages/client/ui-message-feedback" },
|
|
{ "path": "./packages/client/ui-model-selection" },
|
|
{ "path": "./packages/client/ui-agent-preset" },
|
|
{ "path": "./packages/client/ui-permission-presets" },
|
|
{ "path": "./packages/client/ui-plan" },
|
|
{ "path": "./packages/client/ui-settings-plugins" },
|
|
{ "path": "./packages/client/ui-user-questions" },
|
|
{ "path": "./packages/client/ui-trajectory" },
|
|
{ "path": "./packages/session-query/session-log-export" },
|
|
{ "path": "./packages/client/ui-theme" },
|
|
{ "path": "./packages/client/ui-settings" },
|
|
{ "path": "./packages/client/ui-settings-general" },
|
|
{ "path": "./packages/client/ui-settings-models" },
|
|
{ "path": "./packages/client/ui-settings-plugin-inventory" },
|
|
{ "path": "./packages/client/locale" },
|
|
{ "path": "./packages/client/ui-renderer" },
|
|
{ "path": "./packages/client/ui-session" },
|
|
{ "path": "./packages/client/web" },
|
|
{ "path": "./apps/web" }
|
|
]
|
|
}
|