8171 Commits

Author SHA1 Message Date
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
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
Turtle
4e8067e8d5 refactor(telemetry): replay feedback sessions without buffering 2026-08-06 14:57:30 +08:00
Turtle
2711764e0e Merge remote-tracking branch 'origin/master' into codex/web-slash-fuzzy-search
# Conflicts:
#	packages/client/ui-command/README.i18n.yaml
2026-08-06 14:48:35 +08:00
Hypatia May
22c7087074 fix(landlock-run): publish under deepseek scope 2026-08-06 14:41:17 +08:00
Yichen Jiang
e0e84d265a refactor(web): deduplicate skill disclosure leading 2026-08-06 14:40:08 +08:00
07akioni
d1e4fb91d2 Merge remote-tracking branch 'origin/master' into feat/md-incre-2
Port the two master-side markdown fixes onto the mdast renderer:
cjkFriendlyStrong joins both parse.ts grammars as a micromark extension
(ex remark plugin), and inline-code HTTP(S) URLs gain the safe anchor in
render.tsx without normalizeUri. Re-record the two new web-e2e goldens
whose footer clock spacing diverged from the nine established goldens,
and drop the timing-flaky LLM duration segment one of them captured.
2026-08-06 14:37:56 +08:00
Ziya
71e8132e76 Merge branch 'master' into feat/web-preview-badge 2026-08-05 23:29:04 -07:00
Yichen Jiang
2d71c928e6 Merge branch 'claude/web-llm-pi-ai-config-385e24' into claude/pi-ai-model-discovery 2026-08-06 14:26:48 +08:00
ZiyaZhang
7c1ae32e55 fix(web): address preview badge review 2026-08-05 23:26:39 -07:00
Yichen Jiang
c7dbe4c6d9 Merge remote-tracking branch 'origin/master' into claude/web-llm-pi-ai-config-385e24 2026-08-06 14:24:58 +08:00
Chinesezjc
90a1c87276 docs(notes): drop the TUI clauses the package removal made stale
ed30088adb deleted packages/ui/tui, so the two present-tense clauses naming
it in notes this branch already rewrites no longer describe HEAD. The
operative claim — the surfaces beyond the web row needed no change — stands
without naming the package. Pair hashes re-recorded.

Also anchor tool-row-styles.spec.ts's rule lookup at a rule boundary, so a
compound selector landing above a base rule fails loud instead of reading
the wrong declaration block.
2026-08-06 14:12:46 +08:00
Yichen Jiang
bb920b32e0 feat(web): add dedicated skill tool row 2026-08-06 14:07:15 +08:00
07akioni
8d6824a84b feat: markdown 增量解析 2026-08-06 13:56:43 +08:00
Chinesezjc
9b01da195a fix(ui-conversation): keep the summary suffix on one line
`flex: none` stops the `+n` box shrinking but not its text wrapping, so a
row too narrow for title + separator + suffix broke the one-line summary in
the exact case the slot exists for. Add `white-space: nowrap` and pin the
declaration as CSS text, since jsdom has no layout.

Also align the README's row illustration with the English rendering (the
same sentence's plan-strip clause already used it), and record the two
deferred review findings in the Agent Note so they survive merge.
2026-08-06 13:56:39 +08:00
Hypatia May
10c1d77a4f fix(landlock-run): address release review feedback 2026-08-06 13:50:48 +08:00
_Kerman
262d044642 fix(agent): route loop dispatches through prebuilt fused dispatcher
Address review feedback on PR #1738:
- ReactLoopAgent builds its AgentEventDispatch once in the constructor and
  routes every emit/serial/waterfall through it, so hot-path dispatches no
  longer allocate a carrier and dispatcher per call; the public carrier
  field is gone (fused dispatcher is private).
- agentEvents accepts an optional prebuilt carrier.
- The fused payload builder spreads the payload before the injected agent
  so a structurally acceptable payload carrying an agent field can never
  override the subject.
- Regenerate doc graphs; re-record core + architecture + affected Agent
  Note translation pairs; add payload-object event contract Agent Note.
2026-08-06 13:44:23 +08:00
Chinesezjc
3915412070 docs(web): say which active item activeContent names
The field JSDoc read as if it searched the active items for a usable one,
which is the skip-forward behavior planSummary deliberately does not do.
2026-08-06 13:43:12 +08:00
Chinesezjc
60153324ce fix(web): align the plan summary's usable-content rule with the tool
planSummary treated whitespace-only content as nameable, so a rejected call
whose args survive verbatim rendered a blank active clause beside a live +N.
The tool's own rule is trimmed non-empty; the row now uses it.

Also hoists the duplicated DSH_SNAPSHOT refresh flag out of the two assembled
snapshot files into their shared assembled-boot scaffolding.
2026-08-06 13:31:40 +08:00
_Kerman
23671848c3 Merge remote-tracking branch 'github/master' into feat/agent-event-payload 2026-08-06 13:26:04 +08:00
Tianyi Cui
aa1546ac0c Merge branch 'master' into feat/session-completed-dot 2026-08-06 13:18:50 +08:00
Chinesezjc
b6a6e820f6 Merge remote-tracking branch 'origin/master' into feat/todo-multi-in-progress 2026-08-06 13:18:20 +08:00
Yichen Jiang
16ad5f3f86 Merge pull request #1732 from deepseek-harness/worktree/fix-1680-cjk-markdown
fix(web): render CJK emphasis and link code URLs
2026-08-06 13:15:50 +08:00
Yichen Jiang
099b903ac6 fix(web): preserve provider credential retry checkpoint 2026-08-06 13:15:09 +08:00
Yichen Jiang
42b9ee7a53 Merge branch 'claude/web-llm-pi-ai-config-385e24' into claude/pi-ai-model-discovery
# Conflicts:
#	docs/core-data-structures/core.i18n.yaml
#	docs/event-producer-consumer.md
2026-08-06 13:05:15 +08:00
Chinesezjc
ecb17ac3ae Merge remote-tracking branch 'origin/master' into feat/todo-multi-in-progress
# Conflicts:
#	examples/acp-agent/tests/snapshots/todo-write/session.jsonl
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-06 13:04:33 +08:00
Yichen Jiang
98b894f8eb Merge remote-tracking branch 'origin/master' into claude/web-llm-pi-ai-config-385e24
# Conflicts:
#	docs/event-producer-consumer.md
2026-08-06 13:03:40 +08:00
Chinesezjc
bb18a13fb3 docs(todo): drop stale plan-strip format claims and fix the note's counts
The plan strip header has not emitted `<done>/<total> tasks · <n> in progress`
since #740 replaced it with `·`-joined per-status counts. Four sites still
quoted the old string: plan-summary.ts's module JSDoc, ui-conversation's
README pair, and the web-todo-display note pair.

The parallel-in-progress note's regression example mixed a four-item plan with
an eight-item row reading, and built-boot.snapshot.ts still called itself the
only test loading the built bundles.
2026-08-06 13:00:14 +08:00
creatixchu
a90cf1da84 Merge master into fix/conversation-column-one-axis-scroll 2026-08-06 12:59:16 +08:00
Chinesezjc
0cf7420e52 test(web): pin the parallel todo plan in the assembled application
The `+N` active count rides ToolRow's non-shrinking `summarySuffix` slot,
but only jsdom package suites covered it: the ACP snapshots render no web
surface and the built-boot smoke asserts no todo row. Add
`apps/web/tests/todo-row.snapshot.ts`, which boots the built client bundles
against the keyless fixture transport and records `summary`, `suffix`, and
the plan strip's header as separate fields, so folding the count back into
the summary string changes the expected output.

The three assembled-jsdom files now share `apps/web/tests/assembled-boot.ts`
instead of each carrying its own copy of the boot entry list, bundle map,
jsdom stubs, and mount call.

Also: name the policy branch in each `allowParallelInProgress` test title so
no case asserting `true` sits under a `false` describe, reword the stale cap
comment in todo-panel.spec.tsx, and record the plan strip's real header
format in the Agent Note (per-status counts, not `<done>/<total> tasks`).
2026-08-06 12:26:27 +08:00
Chinesezjc
2b9354aab5 docs(todo): state the catalog's policy branch and drop the sidecar census
The tool catalog boots every tool with its default config, but
allowParallelInProgress has no default, so the generator has to choose;
the page now says which branch it shows. The Agent Note's sidecar count
went stale twice inside this PR, so it records the refresh rule instead
of a point-in-time census. The SDK builtin entry pins its config literal
with satisfies like every sibling.
2026-08-06 12:17:10 +08:00
GeeeekExplorer
f11b1c60d4 Merge branch 'master' into feat/session-completed-dot 2026-08-06 12:15:44 +08:00
_Kerman
ccebba2349 refactor(agent): unify agent-scoped event signatures as payload objects
All agent/* and agent-loop/config-start-failed events take one payload
object carrying the agent subject; waterfall/serial payloads require a
signal and keep next as the final argument. PreStepContext and
RequestFailureContext are unfolded into payloads and retired.
goal/changed follows the same shape so agentEvents keeps its listener
error containment. ReactLoopAgent builds its scope carrier once in the
constructor. Regenerates scope resolvers, tool-cordis api catalog, and
docs catalogs; updates all affected listeners, tests, and the
core-data-structures docs (en + zh).
2026-08-06 12:13:14 +08:00
Yichen Jiang
af652c949f fix(web): recover provider credential lifecycle 2026-08-06 12:09:14 +08:00
creatixchu
e90e419273 Merge remote-tracking branch 'origin/worktree/context-source-cards' into worktree/context-forms-remaining 2026-08-06 12:03:50 +08:00
creatixchu
851fe793c4 Merge remote-tracking branch 'origin/master' into worktree/context-source-cards
# Conflicts:
#	packages/client/runtime/src/client/sessions/transcript-adapter.ts
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-06 12:03:15 +08:00
Hypatia May
d1a8a79ed0 Merge remote-tracking branch 'origin/master' into codex/unify-landlock-release 2026-08-06 12:01:52 +08:00
Chinesezjc
8985284f85 Merge remote-tracking branch 'origin/master' into feat/todo-multi-in-progress
# Conflicts:
#	docs/core-data-structures/session.i18n.yaml
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-06 12:00:33 +08:00
Chinesezjc
a01d974c60 Merge remote-tracking branch 'origin/master' into feat/todo-multi-in-progress
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-23-web-todo-display.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-23-web-todo-display.md
#	.agents/notes/implemented/feature/2026-07-23-web-todo-display.zh.md
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
2026-08-06 11:58:06 +08:00
creatixchu
0996611cc2 Merge remote-tracking branch 'origin/worktree/context-source-cards' into worktree/context-forms-remaining 2026-08-06 11:57:49 +08:00