Commit Graph
9197 Commits
Author SHA1 Message Date
Yichen Jiang 17c86bbb25 Merge remote-tracking branch 'origin/master' into claude/web-llm-pi-ai-config-385e24
# Conflicts:
#	packages/llm/llm-pi-ai/tests/adapter.spec.ts
#	packages/llm/llm/README.i18n.yaml
2026-08-06 10:47:36 +08:00
imccyu e88bace07e Merge pull request #1716 from deepseek-harness/worktree-infdev02
ci: print exact uncovered locations when the coverage gate fails
2026-08-06 04:09:42 +08:00
imccyu e5181e94ff doc: record the coverage uncovered-location reporter decision 2026-08-06 03:56:01 +08:00
imccyu 4f7b9ac5ee ci: print exact uncovered locations when the coverage gate fails
The per-file 100% thresholds name only the failing file. A custom istanbul
reporter now prints one clickable path:line:col record per uncovered
statement, branch path, and function, right above the threshold errors, in
both the CI coverage lane and local test:coverage runs (they share this
config). CJS because istanbul-reports loads custom reporters with a bare
require() outside the tsx/ESM pipeline.
2026-08-06 03:18:17 +08:00
Huanqi Cao 17ff1e0d4a Merge pull request #1624 from deepseek-harness/feat/pwsh-ui-parity
feat(pwsh): render pwsh calls as bash-shaped terminal cards in the Web UI
2026-08-05 22:20:11 +08:00
_Kerman a25d0b5b66 Merge pull request #978 from deepseek-harness/xtr/react-loop-simplification
refactor(agent-loop): simplify message delivery and durable inbox
2026-08-05 22:13:54 +08:00
Huanqi Cao 22b2e78bb7 fix(knip): drop unnecessary pwsh ignoreBinaries entry 2026-08-05 22:06:50 +08:00
_Kerman bb6e473dd5 test(acp): refresh cordis-inspect snapshot for the claimed Inbox signature
The claimed-message refactor changed Inbox.claim(target, turn) and added
InboxNotifications.claimed, so the cordis_inspect tool output embedded in
the cordis-inspect-jsdoc replay fixture now carries the new declarations.
2026-08-05 21:58:09 +08:00
Huanqi Cao ca65cf1e14 Merge remote-tracking branch 'origin/master' into feat/pwsh-ui-parity
# Conflicts:
#	apps/web/tsconfig.json
2026-08-05 21:51:31 +08:00
Huanqi Cao 85a52dbe78 Merge branch 'feat/pwsh-ui-parity' of github.com:deepseek-harness/deepseek-harness into feat/pwsh-ui-parity 2026-08-05 21:50:13 +08:00
Huanqi Cao 28d0eef22c chore(pwsh): regen doc catalogs, ignore pwsh binary in knip 2026-08-05 21:49:51 +08:00
_Kerman dc2e2821b9 Merge follow-up: re-record translation hashes and fix e2e fixture shape 2026-08-05 21:42:59 +08:00
_Kerman 207e32493c Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
Resolve translation-pairing hashes after the merge and adapt the
math-rendering e2e fixture to the simplified turn/start event shape.
2026-08-05 21:42:33 +08:00
_Kerman d3249f096b refactor(agent): publish agent/inbox/claimed from Inbox.claim
Move the claimed-message notification loop out of the loop's pre-step
into Inbox.claim(target, turn), so the step-boundary operation publishes
its own claimed notifications like insertions and discards do.
2026-08-05 21:36:51 +08:00
imccyu d0cb6770a9 Merge pull request #1668 from deepseek-harness/codex/fix-math-rendering
fix(ui): render common TeX math delimiters
2026-08-05 21:00:24 +08:00
fz 7604e82bf0 Merge remote-tracking branch 'origin/master' into codex/fix-math-rendering 2026-08-05 20:51:06 +08:00
fz e0328fc44d Merge remote-tracking branch 'origin/master' into codex/fix-math-rendering
# Conflicts:
#	packages/client/ui-primitives/README.i18n.yaml
2026-08-05 20:50:50 +08:00
imccyu 0664c27c76 Merge pull request #1385 from deepseek-harness/xtr/trajectory-virtual-scroll
fix(trajectory): keep long sessions responsive
2026-08-05 20:44:30 +08:00
_Kerman 488b8df547 Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-25-web-client-session-scope-and-provide-channel.i18n.yaml
#	docs/architecture.i18n.yaml
#	docs/architecture.md
#	docs/architecture.zh.md
#	docs/cookbook/extension-cookbook.i18n.yaml
#	docs/cookbook/extension-cookbook.md
#	docs/cookbook/extension-cookbook.zh.md
#	docs/core-data-structures/llm-streaming.i18n.yaml
#	docs/core-data-structures/session.i18n.yaml
#	docs/defensive-patterns.i18n.yaml
#	packages/acp/acp/README.i18n.yaml
#	packages/client/runtime/README.i18n.yaml
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-goal/README.i18n.yaml
#	packages/compact/compact-basic/README.i18n.yaml
#	packages/context/README.i18n.yaml
#	packages/context/README.md
#	packages/context/README.zh.md
#	packages/context/session-reference/README.i18n.yaml
#	packages/context/session-reference/README.md
#	packages/context/session-reference/README.zh.md
#	packages/context/tmux-context/README.i18n.yaml
#	packages/core/session/README.i18n.yaml
#	packages/core/session/README.md
#	packages/core/session/README.zh.md
#	packages/goal/command-goal/README.i18n.yaml
#	packages/goal/goal-session/README.i18n.yaml
#	packages/goal/goal-session/README.zh.md
#	packages/guard/README.i18n.yaml
#	packages/guard/README.md
#	packages/guard/README.zh.md
#	packages/guard/repeat-tool-guard/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/README.md
#	packages/host/apiproxy/README.zh.md
#	packages/plan/plan-mode/README.i18n.yaml
#	packages/sdk/sdk-client/README.i18n.yaml
#	packages/sdk/sdk-client/README.md
#	packages/sdk/sdk-client/README.zh.md
#	packages/session-persistence/session-persistence/README.i18n.yaml
#	packages/subagent/subagent-dsh-sdk/README.i18n.yaml
#	python/sdk/README.i18n.yaml
2026-08-05 20:43:30 +08:00
_Kerman 208ec20dd9 docs(agent): mark claim as the loop-internal step-boundary operation 2026-08-05 20:26:46 +08:00
imccyu 749108c2b0 Merge branch 'master' into xtr/trajectory-virtual-scroll 2026-08-05 20:02:53 +08:00
Yichen Jiang 9948a37cbc docs(llm): follow master's README hierarchy for the pi-ai adapter
A documentation rescan on master moved this README's Testing section out
of the package. This branch was still editing that section, so the
rebase asked which structure wins; master's does, and the branch keeps
only the Catalog resolution section its own change adds.

Re-records the pair fingerprint against the merged text.
2026-08-05 18:56:41 +08:00
Yichen Jiang 5d3ccdc528 test(llm): cover both names providerInfo can report for a route 2026-08-05 18:54:47 +08:00
Yichen Jiang 73fce861e5 fix(llm): let a catalog route keep the auth its provider actually declares
pi-ai resolves a request's apiKey override only through a provider that
declares an api-key method: resolveProviderAuth short-circuits to that
method when the override is present, and otherwise falls through to the
credential store and then to ambient discovery. A provider with no
api-key method at all therefore resolves to nothing, and the request
fails with "Provider is not configured" before any network I/O.

Two routes hit that. openai-codex ships OAuth alone, so moving off the
/compat dispatch broke a profile that names a key for it — the old path
handed the token straight to the provider. And a catalog route naming an
api was being rebuilt with the harness's own auth, so `openai: {api:
openai-completions}` stopped reading OPENAI_API_KEY, contradicting the
documented promise that omitting a credential keeps provider-native
discovery.

Auth is now one decision for both constructions. A catalog route keeps
its installed provider's auth, through an api override too: which
environment a provider reads belongs to the provider, not to the wire
format its models speak. A catalog provider with no api-key method gets
the harness method beside its own, but only when the profile names a
credential — a keyless codex profile keeps the honest refusal, since
this adapter holds no OAuth store to resolve through.

Materialization now spreads the installed entry instead of enumerating
the result, so a Model field this package does not model survives a
pi-ai upgrade; headers went missing from an nvidia route exactly that
way once already. providerInfo reports the configured displayName, which
also joins the registration facts so a rename re-registers rather than
leaving the old label in every selector. A refused registration swap
gets its own diagnostic naming the route, matching the directory swap
beside it.

The README documented endpoint interrogation this layer does not
implement, and still described unknown providers as kept-last-good after
they became legal declarations refused at the write point. The Agent
Note claimed per-model reasoning configurability the schema never had,
required capacities the route now defaults, and stated an apiKey
override that short-circuits unconditionally.
2026-08-05 18:54:47 +08:00
Yichen Jiang 236b1f6d97 docs(llm): record that non-reasoning catalog models lose the lone off level
The adapter omits the seam's reasoning field whenever a model carries no
reasoning metadata, which is the model's own property and says nothing
about where the model came from. Both the JSDoc and the Agent Note read
as though only hand-declared models were meant, so a reader would infer
that the 251 installed-catalog models pi-ai marks as non-reasoning still
offer their single off level. They do not, and that is the point: a
picker holding only off misrepresents a provider that thinks by default,
because off dispatches the same bytes as naming no effort at all.

Behavior is unchanged; only the prose that describes it was narrower
than the contract. adapter.spec.ts already pins the catalog case through
openai/gpt-4.1 and catalog.spec.ts pins the hand-declared one.
2026-08-05 18:54:23 +08:00
Yichen Jiang f376ee23d1 fix(llm): size unknown models and refuse a section that cannot be served
Three defects surfaced while driving the Models page.

A hand-declared model needed an explicit contextWindow and maxTokens,
but a provider listing usually returns ids and nothing else — so the
page happily wrote a profile the adapter then rejected, which took the
whole namespace down silently. Capacities now fall back to the route's
`defaultContextWindow` (262,144) and `defaultMaxTokens` (32,768). Both
are guesses by construction, which is why they are route fields a
deployment corrects once rather than constants buried in the adapter;
the fallback sizes the model and never becomes a per-request cap.

That silent failure was the second defect. A schema-valid profile the
adapter could not serve was stored and only rejected later, disabling
every route in the namespace with nothing said. `dsh-settings` gains an
optional `validate` on registration — a check for what a schema cannot
express — and `llm-pi-ai` refuses an unserviceable section at the write
that produced it. A stored section that fails keeps the namespace's last
good value, as a schema failure already did, so an externally edited
document still cannot strand the owner. The plugin's own last-good
fallback goes with it: nothing reaching it can fail any more.

Third, a model with no reasoning metadata advertised the single level
`off`, which pi-ai translates to *omitting* the reasoning option — the
same request naming no effort produces. Selecting it disabled nothing,
so a provider whose default is to think kept thinking with `off` shown
as selected. Such a model now reports no reasoning capability at all,
which is the seam's way of saying the control is unavailable, and the
per-model `reasoning` flag is gone: without a thinkingLevelMap to spell
levels it could only invent them.

The protocol table narrows to the three a hand-declared route reaches
today, most-reached first so a surface offering a choice defaults to the
one gateways actually speak.
2026-08-05 18:54:23 +08:00
Yichen Jiang 4c80cab108 fix(llm): capture an immutable snapshot per pi-ai operation
Review found four defects in the declared-provider work.

`PiAiAdapter` reused one `Models` collection and mutated it whenever the
configuration changed. `Models.streamSimple()` resolves its provider
lazily — when the stream is first consumed, which is after the adapter
awaits the route's credential — so a configuration change landing in
that window let an in-flight request finish under a configuration it
never resolved against, or fail on a provider that no longer existed.
Each resolution now produces an immutable snapshot and every operation
captures one before its first await, which is what makes the seam's
per-step freeze (`llm.prepareCall()`) hold end to end: switching models
mid-reply takes effect on the next step, never inside the one in flight.

`defaultMaxTokens` was materialized from the catalog's `Model.maxTokens`.
The two answer different questions: pi-ai requires that field as the
model's output capability, while the seam's is a cap the deployment
chose to send on requests naming none, so every request had started
carrying a number nobody picked. Only an explicitly configured cap
reaches the seam now.

The configurable-provider directory was refreshed by disposing its
registration and making a new one. A candidate set the registry refuses
— a profile keyed `deepseek-official`, which llm-deepseek declares —
left the whole directory withdrawn and the Models page empty, silently,
because the settings callback contains the failure. The seam's
registration handle now carries `replace()` with the same
validate-first atomicity `registerAdapter` has.

The protocol table offered every pi-ai streaming API, including four
whose authentication a profile cannot express: Bedrock signs with SigV4
over AWS credentials and a region, Vertex needs a project, a location,
and ADC, Azure needs provider environment plus an api-version, and Codex
uses OAuth. Offering them handed back routes that cannot authenticate.
Catalog routes still reach them through their own provider.
2026-08-05 18:54:23 +08:00
Yichen Jiang d6126c25f2 feat(llm): declare pi-ai providers instead of looking them up
A pi-ai route had to name an installed catalog provider, served that
catalog's models verbatim, and could override only the endpoint. An
OpenAI-compatible gateway, a self-hosted server, or a model newer than
the pinned pi-ai release was therefore unreachable, and a stale context
window could not be corrected without upgrading the package.

A route is now a declaration whose defaults come from the installed
catalog. `catalog.ts` merges that catalog under the profile's own model
entries, `provider.ts` builds the pi-ai Provider (reusing the catalog
provider when the route keeps its protocol, so implementations this
package cannot reconstruct keep working), and the adapter serves every
operation from one `createModels()` collection. That also retires the
`@earendil-works/pi-ai/compat` import, which pi-ai documents as a
temporary entry point it deletes with its ModelManager migration.

Credentials stay on the harness seam: the resolved key rides the request
as pi-ai's highest-priority auth override, so `Models` holds no
credential store and a named-but-missing reference still fails loud
instead of falling back to an unrelated ambient key.

A model's configured maxTokens now reaches the seam as defaultMaxTokens.
2026-08-05 18:54:23 +08:00
CreatixChu edabb3c2dc Merge pull request #1526 from deepseek-harness/worktree/composer-scrollbar-gutter
fix(web): keep the input card in place across view tabs
2026-08-05 18:29:44 +08:00
creatixchu 452462a504 Merge remote-tracking branch 'origin/master' into worktree/composer-scrollbar-gutter 2026-08-05 18:20:36 +08:00
_Kerman 2d2b542372 Merge remote-tracking branch 'origin/master' into xtr/trajectory-virtual-scroll
# Conflicts:
#	packages/client/runtime/README.i18n.yaml
2026-08-05 18:11:51 +08:00
_Kerman 174d3bc04e Merge pull request #1648 from deepseek-harness/fix/workspace-blank-session-reuse-membership
fix(client): only reuse workspace-member blank sessions for New Session
2026-08-05 18:09:37 +08:00
Huanqi Cao 8fcb392fe1 Merge origin/master into feat/pwsh-ui-parity 2026-08-05 17:41:03 +08:00
_Kerman a006d19bde Merge remote-tracking branch 'origin/master' into fix/workspace-blank-session-reuse-membership
# Conflicts:
#	packages/client/runtime/README.i18n.yaml
2026-08-05 16:58:36 +08:00
_Kerman 829539a11b Merge remote-tracking branch 'origin/master' into xtr/trajectory-virtual-scroll 2026-08-05 16:57:08 +08:00
creatixchu e627c156f6 Merge remote-tracking branch 'origin/master' into worktree/composer-scrollbar-gutter
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-05 16:55:12 +08:00
_Kerman c8b36a91b7 chore: retrigger CI after dropped force-push event 2026-08-05 16:53:27 +08:00
_Kerman c634fc2917 fix(trajectory): show exact millisecond durations consistently
Drop the details-panel Duration toggle: Duration rows always show
integer milliseconds, matching the cell time column. Timeline labels
(Total/TTFT/Decoding) and step-group descriptions previously fell back
to second labels at or above one second; they now also show exact
milliseconds via the shared formatDurationMillis formatter.
2026-08-05 16:46:23 +08:00
Turtle 7b14efb2b2 Merge pull request #1358 from deepseek-harness/codex/document-structure-standard
docs: define and apply documentation hierarchy
2026-08-05 16:43:57 +08:00
_Kerman 857bf8c5f8 Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
# Conflicts:
#	packages/host/apiproxy/README.i18n.yaml
2026-08-05 16:22:54 +08:00
creatixchu ecaf3095fc Merge remote-tracking branch 'origin/master' into worktree/composer-scrollbar-gutter 2026-08-05 16:19:52 +08:00
Turtle c991a7cc79 docs: finish hierarchy rescan after rebase 2026-08-05 16:18:58 +08:00
_Kerman b54d1c5c99 test(web): pin the single-request workspace projection in the dev smoke
The react-loop simplification folds the workspace baseline into the first
entering request, so the --dev CLI smoke no longer sees a workspace-free
probe request before the projected one. Resolve on the first provider request
and drop the obsolete no-workspace initial assertions.
2026-08-05 16:18:48 +08:00
Turtle 82218e0c36 test: refresh translation prompt snapshot 2026-08-05 16:16:58 +08:00
Turtle 8af3babaea docs: rescan rebased documentation hierarchy 2026-08-05 16:16:57 +08:00
Turtle 012bb0a549 docs: address review feedback 2026-08-05 16:13:28 +08:00
Turtle 5634c08088 docs: restore architecture turn flow 2026-08-05 16:13:28 +08:00
Turtle dd8d446286 docs: apply hierarchy across the corpus 2026-08-05 16:13:28 +08:00
Turtle f07f8f15ed docs: define hierarchy and document forms 2026-08-05 16:13:27 +08:00
Yichen Jiang 88a57f12b0 Merge pull request #1530 from deepseek-harness/worktree/open-settings-config-file
feat(web): open the local settings file
2026-08-05 16:10:56 +08:00