Commit graph

381 commits

Author SHA1 Message Date
Yichen Jiang
57c5f017ac feat(llm-pi-ai): sign in to a provider instead of withholding it
pi-ai's auth model reaches this adapter through three translations, all
of which live here: a CredentialStore over the harness credential
records, an AuthContext over the credential plane and the host
filesystem, and one authorization flow per installed provider that
ships a login. The seams they consume name nothing from pi-ai, so a
second adapter family can arrive with a different auth model and share
them.

Every collection is now built with the store and the context rather
than with nothing, which is what makes a signed-in provider stay signed
in across the collection rebuild a configuration change causes. With a
posture that works, the configurable-provider directory no longer
withholds OAuth-only routes and `openai-codex` is offered again; the
predicate that withheld it is gone.

The credential plane stays optional. Reads answer "nothing stored"
without a credentials service because such a composition genuinely
holds no credential, while writes refuse by name — a login whose grant
evaporated would report success and then fail every request. Flow
registration is scoped to the authorization seam, so a headless or ACP
composition mounts with no sign-in and everything else unchanged.

Two fixes found while wiring this up: pre-release credential fixtures
in the llm suites still used the flat document the record work
replaced, and a flow that ignores its cancellation signal would have
held its key for the life of the process — withdrawal now settles the
attempt either way.
2026-08-20 17:58:38 +08:00
Yichen Jiang
732a7361f5 feat(authorization): obtain a credential by asking the human
Some credentials cannot be configured, only obtained: getting one means
a conversation — open this page, paste that code, pick an account. The
new seam owns that conversation and the one-attempt-per-key lifecycle,
and never the protocol, so a second authorization protocol arrives as
another flow rather than as another seam.

A flow is registered under the CredentialKey it writes, which is also
how the seam knows which plugin answers for the format inside that
record. The flow owns the write: run() resolving means the record is
already committed through ctx.credentials, and the seam confirms it.
That keeps a library persisting through its own store adapter the
single writer instead of being copied back out and written twice.

The interaction travels with the request rather than a registry,
because whoever starts an authorization is the one who can talk to the
human about it. A request already withdrawn never claims the key and
never starts the flow — relying on each flow to check its signal before
the first await would let one that does not hang holding the key.
2026-08-20 17:58:38 +08:00
Yichen Jiang
86a9f8c862 feat(credentials): store durable credential records beside references
The seam answered one question — what is behind this environment-variable
name — and that shape cannot hold what an authorization grant is: a
multi-field, rotating value keyed by a provider id rather than by a POSIX
identifier. The Models page already works around the gap by inventing a
synthetic environment name (`MINIMAX_CN_API_KEY`) for a route the user added
by hand, because the store's key must look like one.

`CredentialKey` is `<scope>/<id>`, where the scope is the owning plugin's
registered name. The owner is in the key because a `grant` payload is written
in its owner's format: two plugins serving the same provider name would
otherwise read each other's payload, and a record left by an uninstalled
plugin could not be told from a live one. The `/` also keeps the grammar
disjoint from `CredentialRef`, so the key spaces cannot collide.

`CredentialRecord` is `api-key` (key and/or provider environment values) or
`grant` (an opaque, owner-owned payload). The asymmetry is deliberate: an api
key is the harness's own data, a grant is a package it carries for someone
else. `modifyRecord` is the only write path because a correct write depends
on the current value — a token refresh is read-decide-replace under one
cross-process lock, without which two processes rotating one refresh token
lose whichever wrote first.

`.credentials.yaml` becomes a versioned two-section document. The pre-release
flat layout is refused by name, with the entry count and the one edit needed,
rather than read as an empty store — which would surface as an authentication
failure on the first request instead of at load. A grant payload is admitted
in both directions, so a value the document could not read back exactly as
written is refused rather than stored lossily.
2026-08-20 17:58:38 +08:00
imccyu
be3a630da8 docs(web): retire tap-era prose across READMEs, subsystems, and notes 2026-08-20 16:13:05 +08:00
imccyu
d582939783 docs(web): align injection-surface JSDoc, notes, and bilingual READMEs 2026-08-20 16:13:05 +08:00
imccyu
d4fd03ae53 chore(docs): classify IndexInjection and regenerate the catalog surfaces 2026-08-20 16:13:04 +08:00
_Kerman
f9cd580a33 Merge remote-tracking branch 'origin/master' into xtr/projection-state-schema 2026-08-20 13:21:03 +08:00
_Kerman
bb79203f53 fix(docs): drop stale persist field from projection type-equiv block
ProjectionDefinition lost its persist?: boolean opt-in when every
projection unit became uniformly checkpointed, but the subsystem doc's
type-equiv paste still carried the field, so verify-type-equiv drifted
from packages/session/session-projection/src/index.ts. Remove the field
and its JSDoc from both language sides and re-record the bilingual
pairing record.
2026-08-20 10:29:56 +08:00
_Kerman
83a3457b4a Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2730 2026-08-20 10:04:04 +08:00
Kaige-Gao
027b1d579f Merge remote-tracking branch 'origin/master' into fix/permission-copy-and-default 2026-08-19 23:23:54 +08:00
Kaige-Gao
8304a25d8a Merge remote-tracking branch 'origin/master' into fix/permission-copy-and-default
# Conflicts:
#	packages/subagent/subagent-codex/tests/subagent-codex.spec.ts
2026-08-19 22:50:35 +08:00
Kaige-Gao
35778ec2ff fix(web): address permission preset review feedback 2026-08-19 22:45:54 +08:00
imccyu
70a3bf4554 docs: refresh Agent Teams catalogs 2026-08-19 22:44:23 +08:00
Magolor
93b4b98ef3 feat(session): optimize SQLite persistence layout 2026-08-19 18:36:27 +08:00
_Kerman
327b86d2ea refactor(session-projection): checkpoint every projection unit uniformly
Drop the persist?: boolean opt-in: every unit's state — client-visible and
host-only alike — is now written to the projection cache. A unit can no
longer silently skip the durable cache, host-only units no longer need an
explicit flag to participate in cold restore, and the persist-sharing
conflict check disappears with the field.

- ProjectionDefinition/ErasedDefinition lose persist; register overloads
  simplify; checkpoint/restoreFloor/restore fold every registered unit.
- Registry and cache tests drop the persist:true fixtures and the
  persistence-policy sharing test.
- READMEs and the state-and-client-views note record the uniform rule;
  cordis API catalog and subsystem signatures regenerated.
2026-08-19 16:55:10 +08:00
CreatixChu
24ef32c7b8 Merge pull request #2134 from deepseek-harness/worktree/abort-partial-finalize
feat(agent-loop): finalize a cancelled stream's delivered prefix
2026-08-19 15:39:14 +08:00
creatixchu
ff88d3dd00 Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 14:55:32 +08:00
creatixchu
e7a668906a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	packages/client/connection/src/client/fixture.ts
#	packages/client/ui-conversation/src/client/input/facade.ts
#	packages/client/ui-conversation/src/client/input/hub.ts
#	packages/client/ui-conversation/tests/input-matrix.client.spec.tsx
#	packages/client/ui-conversation/tests/input-scenarios.client.spec.tsx
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
2026-08-19 14:49:57 +08:00
_Kerman
9127d7e8b7 fix(session-projection): keep host state off wire 2026-08-19 14:32:48 +08:00
_Kerman
4c421ec882 refactor(session-projection): separate state from client views 2026-08-19 13:11:05 +08:00
creatixchu
fcaa0efec5 Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-19 11:11:15 +08:00
Yichen Jiang
67a7c79004 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/context/agent-instructions/tests/agent-instructions.spec.ts
2026-08-19 11:01:27 +08:00
creatixchu
5766480e5b Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 10:51:25 +08:00
Dudu-0223
d57c2d19db fix(web): require queries array for web search 2026-08-19 10:33:43 +08:00
Dudu-0223
6b4df99c44 fix multi-query web search review feedback 2026-08-19 10:33:43 +08:00
Kaige-Gao
b03b1f2e7b fix(web): improve permission labels and blank defaults 2026-08-18 21:30:28 +08:00
pku-xht
ad6516933b fix(i18n): close automated review findings 2026-08-18 21:02:50 +08:00
pku-xht
8729f38015 Merge master at 43f08ef into localized Chinese links 2026-08-18 19:13:47 +08:00
pku-xht
8d3674695b docs(i18n): localize Chinese internal links 2026-08-18 19:00:37 +08:00
Yichen Jiang
455cd2630a Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 17:38:19 +08:00
pku-xht
7f6b517018 Merge origin/master into Claude permission modes
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/subsystems/subagent.i18n.yaml
#	packages/subagent/subagent/README.i18n.yaml
2026-08-18 17:04:42 +08:00
Yichen Jiang
5372fc384e chore(llm): trim retry default refactor 2026-08-18 16:36:41 +08:00
Yichen Jiang
dc4ffabb53 Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 16:33:33 +08:00
Yichen Jiang
0ca0f3d0b8 refactor(llm): use one five-retry default 2026-08-18 16:33:22 +08:00
creatixchu
d007f437cc Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-18 16:25:11 +08:00
creatixchu
51fa8da8a3 fix(plan): accept image-only plan requests 2026-08-18 15:43:59 +08:00
creatixchu
35a10ec41a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
#	packages/client/ui-subagent/package.json
#	pnpm-lock.yaml
2026-08-18 15:22:32 +08:00
Yichen Jiang
f4551895bc Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 15:14:15 +08:00
Yichen Jiang
1dbafe2973 refactor(llm): centralize deployment retry defaults 2026-08-18 15:14:09 +08:00
creatixchu
1492b0cfee Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope
# Conflicts:
#	apps/web/tests/assembled-boot.ts
2026-08-18 12:00:46 +08:00
Dudu-0223
570aff0e27 refactor(team): incubate Agent Teams packages 2026-08-18 11:58:11 +08:00
Dudu-0223
3546f595b9 feat(team): add durable Agent Teams runtime 2026-08-18 11:58:11 +08:00
creatixchu
abfd537588 Merge remote-tracking branch 'origin/master' into worktree/image-dimension-limit 2026-08-18 11:45:08 +08:00
Dudu-0223
d91df8cbd5 Deliver subagent reports at next step 2026-08-18 11:14:10 +08:00
creatixchu
609ee2facf Merge remote-tracking branch 'origin/master' into worktree/image-dimension-limit 2026-08-18 11:12:56 +08:00
imccyu
e0e529547b docs(client): refresh module catalog source link 2026-08-18 01:34:56 +08:00
imccyu
cf603b847f fix(client): complete dynamic module bootstrap 2026-08-18 01:34:53 +08:00
creatixchu
29de639e99 fix(web): 按评审意见调整引用职责 2026-08-17 21:13:33 +08:00
creatixchu
0e39055121 fix(attachment): refuse oversized image sides at admission
An image with a side above the deployed routes' 2000px many-image bound
could be durably committed by read_image, ride every later request, and
permanently fail the session with provider 400s. Admission now enforces a
configurable maxImageDimension (default 2000) during the full decode, so
read_image surfaces a recoverable tool error naming the limit instead of
poisoning durable history; the Web composer gets dedicated copy for the
new IMAGE_DIMENSION_TOO_LARGE reason.

Fixes #2626
2026-08-17 20:49:08 +08:00
creatixchu
741b89963d Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-17 20:38:52 +08:00