12410 Commits

Author SHA1 Message Date
ZiyaZhang
a362b41dc9 Merge remote-tracking branch 'origin/master' into fix/workspace-context-rendered-change-proof
# Conflicts:
#	.agents/notes/implemented/feature/2026-06-24-workspace-context.i18n.yaml
#	packages/context/workspace-context/README.i18n.yaml
#	packages/context/workspace-context/tests/workspace-context.spec.ts
2026-08-06 02:06:16 -07:00
imccyu
05f092870b Merge pull request #1776 from deepseek-harness/web-dist-chunk-layout
build(web): split the shell dist into index and vendor chunks with langs/ and fonts/ dirs
2026-08-06 17:05:11 +08:00
Yichen Jiang
66b136e6e3 Merge remote-tracking branch 'origin/master' into worktree/provider-credential-lifecycle
# Conflicts:
#	packages/client/ui-models/README.i18n.yaml
#	packages/client/ui-models/README.md
#	packages/client/ui-models/README.zh.md
#	packages/client/ui-models/src/client/ModelsSection.tsx
#	packages/client/ui-models/src/client/ProviderEditor.tsx
2026-08-06 16:54:33 +08:00
GeeeekExplorer
ed3450b337 chore: refresh PR merge ref after branch rewrites 2026-08-06 16:53:34 +08:00
Yichen Jiang
bce4a038c9 Merge remote-tracking branch 'origin/master' into claude/unified-environment-credentials-c8841a
# Conflicts:
#	docs/config-catalog.md
#	packages/llm/llm-pi-ai/src/config.ts
#	packages/llm/llm-pi-ai/src/index.ts
#	packages/llm/llm-pi-ai/tests/sdk-options.spec.ts
2026-08-06 16:52:19 +08:00
GeeeekExplorer
907f892094 Merge branch 'master' into feat/session-completed-dot 2026-08-06 16:52:04 +08:00
Yichen Jiang
f2050bfd1e fix(web): surface provider credential status 2026-08-06 16:44:04 +08:00
creatixchu
6902b51fea fix(web): address review on the turn-tail actions gate
Correct the Agent Note's consequence: a running turn withholds the footer
below its own trigger bubble, while every earlier completed turn keeps its
seat — which the package test already asserts.

Give the running-phase barrier an explicit budget: it is armed before the
park and awaited after the stop click, so the 30s replay default left no
headroom for the marker poll, the UI polls, and two aria captures.

Number the running-turn test's boundary seqs like the log does, with each
turn/end strictly after its own nodes.
2026-08-06 16:42:41 +08:00
creatixchu
53e210348d fix(web): grant turn-tail IconActions only after the turn ends
`assistantActionsSeqs` picked the last content-text assistant of each turn
from the finalized transcript alone. That quantity is stable only once the
turn closes: while a turn is still producing steps, the narration written
before a tool call is the last content assistant so far, so copy, branch,
and the clock appeared under an intermediate sentence for as long as the
tool ran and then moved down to the next step's text.

Pass `ConversationSnapshot.turnEnds` into the derivation and grant the row
only inside a turn that has a durable `turn/end`. This is the same
completion fact the branch control and the `Ran for` label already read, so
the three parts of one row now agree; mid-turn narration owns nothing, and
the seat appears once under the settled answer.

`hasContentText` moves to chat-flow.ts so the ownership gate and
AssistantMarkdown's mount gate cannot drift apart.

apps/web/tests/turn-tail-actions.e2e.ts pins both states through the
assembled application: a hang sidecar on the second model call parks a turn
whose first step narrated before calling bash, and the two goldens hold the
parked flow and the flow after stopping.
2026-08-06 16:42:41 +08:00
Yichen Jiang
690f7ae035 Merge remote-tracking branch 'origin/master' into worktree/web-skill-tool-row 2026-08-06 16:41:57 +08:00
creatixchu
12e5fe0330 Merge master into fix/conversation-column-one-axis-scroll 2026-08-06 16:39:59 +08:00
imccyu
90f738a4c7 build(web): react-free vendor list for the incremental markdown pipeline, npmPackageOf scoped guard, chunk audit script 2026-08-06 16:38:25 +08:00
imccyu
193473dab2 doc(web): update the chunk-layout note for the react-free vendor invariant and the audit tool 2026-08-06 16:38:25 +08:00
imccyu
021074c0ee build(web): split the shell dist into index and vendor chunks with langs/ and fonts/ dirs 2026-08-06 16:38:25 +08:00
imccyu
c1364a2f25 doc(web): agent note for the shell dist chunk split and directory layout 2026-08-06 16:38:25 +08:00
Yichen Jiang
b13b0e2983 Merge pull request #1368 from deepseek-harness/claude/web-pi-ai-provider-form
feat(web): declare a provider and its models from the Models page
2026-08-06 16:37:14 +08:00
Hypatia May
03e509be8d Merge remote-tracking branch 'origin/master' into codex/unify-landlock-release 2026-08-06 16:36:01 +08:00
Turtle
4f595311f7 test: include feedback in Web command catalog snapshot 2026-08-06 16:32:46 +08:00
Turtle
ccb0842cfc fix(telemetry): fail closed outside full mode 2026-08-06 16:27:27 +08:00
Jiaying Ding
c6b581b4e8 test(ui): update hero headline expectations 2026-08-06 16:26:53 +08:00
Yichen Jiang
8eebf7dd40 test(web): pin the remaining markdown fixture's event times
Master stabilized two of the three hand-built markdown fixtures by spacing
their event times, so the stats line's LLM segment stops depending on how fast
the replay ran. `markdown-images` was left on the old shape and kept failing
for exactly that reason — a different test each run, always the same one-line
difference.

Pin it the same way and record the segment its golden now always shows. This
supersedes the normalizer that dropped those segments outright, reverted here:
pinning the fixture keeps a real part of the page in the goldens instead of
hiding it from every one of them, and master's two goldens already record it.
2026-08-06 16:24:20 +08:00
GeeeekExplorer
3b335ecc7c Merge branch 'master' into feat/session-completed-dot 2026-08-06 16:23:36 +08:00
Yichen Jiang
5e5fd977c5 Merge branch 'claude/pi-ai-model-discovery' into claude/web-pi-ai-provider-form 2026-08-06 16:18:57 +08:00
Yichen Jiang
2a790e6120 Merge branch 'claude/web-llm-pi-ai-config-385e24' into claude/pi-ai-model-discovery 2026-08-06 16:18:15 +08:00
Yichen Jiang
be4c996d97 Merge remote-tracking branch 'origin/master' into claude/web-llm-pi-ai-config-385e24 2026-08-06 16:17:33 +08:00
Turtle
9db4372af8 fix: align feedback package publication files 2026-08-06 16:15:58 +08:00
Jiaying Ding
c92a1da813 fix(ui): update hero headline copy 2026-08-06 16:10:18 +08:00
Turtle
928c99876e feat: add optional dsh badge skill provider 2026-08-06 16:03:29 +08:00
Turtle
7c021e705e Merge remote-tracking branch 'origin/master' into task/command-feedback-master 2026-08-06 16:02:56 +08:00
Turtle
96ac51f0c8 Merge origin/master into task/command-feedback-master 2026-08-06 16:02:25 +08:00
Turtle
c21d3cfed8 Merge pull request #1772 from deepseek-harness/codex/stabilize-markdown-web-snapshots
test: stabilize markdown web snapshots
2026-08-06 15:59:31 +08:00
GeeeekExplorer
ff2341a549 Merge branch 'master' into feat/session-completed-dot 2026-08-06 15:53:29 +08:00
Yichen Jiang
3e1c63b2ea test(web): stop the stats line's wall-clock segments from deciding a golden
`StatsLine` renders its LLM, tool-call, and throughput segments only while the
matching measurement exceeds zero, and all three are wall clock taken during
the replay. A machine that finishes a step inside one millisecond drops the
segment a slower one keeps, so a golden recorded what the recording machine's
speed was rather than what the page shows. Goldens across this suite already
disagreed about the LLM segment for that reason, and CI failed on whichever
test landed on a slow enough runner — a different test each run, always the
same one-line difference.

Tokenizing the values was never enough, because presence is what moves. The
normalizer now drops those segments outright, each taking one adjacent
separator so nothing is left holding a dangling separator or a doubled space,
and the recorded goldens are normalized the same way. `TTFT avg` stays: it
gates on a step count the fixture determines.
2026-08-06 15:47:42 +08:00
imccyu
bc7f240cb3 Merge pull request #1753 from deepseek-harness/feat/md-incre-2
feat: markdown 增量解析
2026-08-06 15:42:54 +08:00
Turtle
e24ed27f5f test: stabilize markdown web snapshots 2026-08-06 15:37:40 +08:00
Turtle
b10368a8d5 refactor(telemetry): strongly type sharing mode 2026-08-06 15:34:36 +08:00
Yichen Jiang
a6a0788108 Merge remote-tracking branch 'origin/master' into claude/unified-environment-credentials-c8841a 2026-08-06 15:28:40 +08:00
Yichen Jiang
dd36db5434 test(ui-models): cover reading a stored capacity back out of a row
Every capacity assertion typed into the field first, so the path that reads a
stored count — the one an already-configured route takes every time it is
opened — was never exercised, and the coverage gate said so. A row now opens
on stored counts and is expected to spell them `1M` and `256K`, the same
vocabulary the field accepts.

`capacityText` takes the row it is rendering rather than looking it up again
by index, which retires the impossible empty-row branch that lookup needed.
The list editor's pre-flight model check is unreachable from the card that
disables submit on the same failure, and says so where it stands.
2026-08-06 15:18:18 +08:00
Yichen Jiang
3a3abc2bc4 fix(ui-models): restore the add-provider row and hint an empty capacity
The two ways to gain a provider had picked up the shared button base's pill
shape and shrunk to their labels, so they read as two stray buttons of
different lengths under the list instead of its last slot. They split the row
evenly again, on the row cards' own corner and the dashed outline this page
already uses for "nothing here yet"; the rule that overrides the base now
says so in one place rather than layering a second `.addButton` block.

An empty capacity shows the adapter's route-level fallback as its placeholder,
so a blank field reads as "sized by the route" rather than as a model with no
capacity. It is a hint, not a mirror: the field counts K as 1000 while the
fallback is 262144, and a deployment may override it.

The picker's description says what the list is without promising an edit the
rows themselves already offer.
2026-08-06 15:18:18 +08:00
Yichen Jiang
dc7510a902 fix(ui-models): close the media block that swallowed the fetch dialog's styles
The `@media (prefers-reduced-motion: reduce)` block never closed, so every
rule after it — the whole fetch dialog, its candidate list, and the rows
inside — applied only to viewers whose system asks for reduced motion. The
sheet still parsed and the classes still attached, so the list painted with
the browser's own bullets, indentation, and inline label, and the reported
model id ran straight into the capacity beside it.

Report the id alone: it is the string adoption writes, and the capacities the
endpoint disclosed are adopted with it and editable in the row that appears.
The candidate row's remaining font name is the one the theme declares.

The styles gate now checks that the sheet's braces balance, and reads every
theme sheet rather than the platform tokens alone, so a name declared in a
sibling is not called undeclared and a `--dsh-` typo cannot pass as a token.
2026-08-06 15:18:17 +08:00
Yichen Jiang
44484ec5f6 feat(web): declare a provider and its models from the Models page
The Models page could name a provider's key and little else. Adding an
OpenAI-compatible gateway meant opening $DSH_HOME/settings.yaml and
knowing the profile shape; correcting a stale context window meant the
same. This layer puts both on the page: a card that declares a route
pi-ai does not ship — id, endpoint, protocol, key, models — and a model
list on the pi-ai editor that can ask the provider what it serves and
adopt the answer.

It follows the DeepSeek catalog editor that landed in #1050 rather than
inventing a second look for the same job. Both editors now share the
section shell and heading, the danger-tinted delete, the add-model
button, the empty state, the per-row validator that names a bad row by
its position, and one K/M capacity vocabulary — 256K and 1M are read and
spelled back, while settings.yaml still stores plain token counts. The
row type is structurally open like that editor's, so a profile field
this card does not edit survives an edit here.

Three of that editor's decisions replaced weaker ones this branch had
made. Inheritance now reads the composition base rather than the
effective value, which would echo an override back the moment a reset
dropped it. Validation names the offending row instead of stating a
blanket problem. And emptying the list is no longer conflated with
handing the catalog back to the adapter — those are separate acts, with
separate affordances.

The create write carries the revision the card opened at, so a route
another tab declared meanwhile is a conflict rather than a silent
overwrite of its profile.
2026-08-06 15:18:17 +08:00
07akioni
5b9d3f2b0d Merge branch 'master' into feat/md-incre-2 2026-08-06 15:12:53 +08:00
Yichen Jiang
3fe5b52c6d Merge remote-tracking branch 'origin/master' into worktree/web-skill-tool-row 2026-08-06 15:07:36 +08:00
Yichen Jiang
d97e150845 Merge branch 'claude/web-llm-pi-ai-config-385e24' into claude/pi-ai-model-discovery 2026-08-06 15:07:02 +08:00
Turtle
5f84e6dbc6 Merge remote-tracking branch 'origin/master' into codex/web-slash-fuzzy-search 2026-08-06 15:05:58 +08:00
Turtle
c6f8055388 docs(telemetry): update capture vocabulary 2026-08-06 15:03:52 +08:00
GeeeekExplorer
bcbe5bfd0e Merge remote-tracking branch 'github/master' into feat/session-completed-dot 2026-08-06 15:01:49 +08:00
Yichen Jiang
2abd06f21f Merge remote-tracking branch 'origin/master' into claude/web-llm-pi-ai-config-385e24 2026-08-06 15:01:19 +08:00
Ziya
cb6fa78c8a Merge pull request #1533 from deepseek-harness/feat/web-preview-badge
feat(web): add preview badge to empty hero
2026-08-05 23:59:28 -07:00
07akioni
31b99930d9 fix: address markdown renderer review findings
Restore the replaced pipeline's synthetic fence newline so a real trailing
blank line inside a fence survives CodeBlock's display trim, and pin it
plus header-only tables in the DOM-parity corpus. Route
extractMarkdownPlainText through parseGfm so the grammar has one source.
Document the fixture provenance check (all 46 fixtures reproduce
byte-identically from react-markdown at 9e8101b800), the deliberate
O(prefix) divergence memcmp, the per-arm scope of grammar consistency,
the React 18 MathML namespace limitation, and the prefix-equivalence
corpus constraint.
2026-08-06 14:58:33 +08:00