Files
deepseek-harness/tsconfig.client.json
T
Yichen Jiang 61aadb3abf feat(activity): one session-header task list joining jobs with their activities
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.
2026-08-25 11:58:43 +08:00

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" }
]
}