Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
c57deff
fix(web): stabilize session history switching
AgentArcLab Jul 21, 2026
7317966
feat(runtime): add AG-UI and A2UI hosted chat transport
AgentArcLab Jul 24, 2026
54f9d22
test(web): cover AG-UI approval and A2UI replay
AgentArcLab Jul 24, 2026
098f66e
fix(deps): update transitive dompurify security patch
AgentArcLab Jul 24, 2026
36ce6b0
chore(release): prepare ksadk-web 0.3.0 review candidate
AgentArcLab Jul 24, 2026
993c7c5
feat(markdown): preserve line breaks in chat message rendering
AgentArcLab Jul 24, 2026
598f09c
feat(web): align chat UI with wework style + streaming reconnect
AgentArcLab Jul 28, 2026
46a729a
feat(web): markdown/history/tool cards align wework + streaming fixes
AgentArcLab Jul 28, 2026
71cdc50
feat(web): support runtime recovery and approvals
AgentArcLab Jul 28, 2026
7044da1
fix(chat): compact reasoning detail typography
AgentArcLab Jul 29, 2026
f77fb50
fix(chat): preserve interleaved text stream blocks
AgentArcLab Jul 29, 2026
860b276
fix(chat): replay persisted processing blocks
AgentArcLab Jul 29, 2026
f41a659
fix(chat): keep streaming thinking collapsed
AgentArcLab Jul 29, 2026
7b33875
fix(feedback): bind ratings by response id
AgentArcLab Jul 30, 2026
a4e3a36
fix(terminal): close stale terminal sessions when sessionId changes
AgentArcLab Aug 6, 2026
442cb7c
fix(stream): reduce output by runtime item identity
AgentArcLab Aug 12, 2026
b4e9f93
chore(release): bump ksadk-web to 0.3.1
AgentArcLab Aug 12, 2026
ba9f9ea
feat: consume agent control receipts and session cursor
AgentArcLab Aug 17, 2026
eee3c88
fix: normalize reconnect cursor to after_seq
AgentArcLab Aug 18, 2026
d2bacee
feat(web): unify durable interactions in 0.3.2
AgentArcLab Aug 19, 2026
e8fddf7
fix(web): treat receipts as accepted not resolved
AgentArcLab Aug 19, 2026
7c523f0
feat(web): queue tray and resolved anchors
AgentArcLab Aug 19, 2026
30ec999
chore(web): prepare interaction beta.2 artifact
AgentArcLab Aug 19, 2026
43582f4
feat(web): attest interaction release provenance
AgentArcLab Aug 19, 2026
cd1bef0
feat(web): consume agent-kernel run receipts and session event stream
AgentArcLab Aug 20, 2026
e31e2ba
fix(web): keep stream binding immutable
AgentArcLab Aug 20, 2026
954a0ad
fix(web): keep kernel subscription open across run.interrupted pauses
AgentArcLab Aug 20, 2026
78c5d8c
fix(web): wrap kernel interaction frames for the interaction adapter
AgentArcLab Aug 20, 2026
f88306c
fix(web): poll kernel session events until a terminal run state
AgentArcLab Aug 20, 2026
7ab6655
chore(web): back off kernel event poll to 3s
AgentArcLab Aug 20, 2026
1f7c064
fix(web): submit decision vocabulary required by interaction request …
AgentArcLab Aug 20, 2026
b2c2e51
release(web): prepare 0.3.2
Aug 21, 2026
b516c15
test(web): expose interaction e2e entrypoint
AgentArcLab Aug 21, 2026
50532a8
fix(web): anchor legacy approvals above composer
Aug 21, 2026
6c0a9c5
release(web): prepare interaction beta.4
Aug 21, 2026
d548ab9
fix(web): keep approval history read-only
Aug 21, 2026
252ad17
release(web): prepare interaction beta.5
Aug 21, 2026
25d2ce1
release(web): prepare interaction 0.3.2 candidate
Aug 21, 2026
b0f6f29
fix(web): preserve session when run stream is empty
AgentArcLab Aug 21, 2026
347bcbd
chore(release): attest empty-stream session fix
AgentArcLab Aug 21, 2026
b0530ce
fix(web): separate session selection and delete controls
AgentArcLab Aug 21, 2026
d0ec2c1
chore(release): attest session control fix
AgentArcLab Aug 21, 2026
792b005
fix(web): explain hosted session authentication
AgentArcLab Aug 22, 2026
1edcad8
chore(release): attest hosted session auth fix
AgentArcLab Aug 22, 2026
bc64088
fix(web): avoid duplicate session on empty run stream
AgentArcLab Aug 22, 2026
eed8d3c
fix(web): preserve sessions pending runtime deletion
AgentArcLab Aug 22, 2026
e6475db
fix(web): refresh 0.3.2 dependency lock
AgentArcLab Aug 22, 2026
190b1b6
fix(web): surface rejected streaming admissions
AgentArcLab Aug 23, 2026
9794556
chore(web): record streaming fix provenance
AgentArcLab Aug 23, 2026
12ada95
fix(web): fail closed for unauthorized hosted links
AgentArcLab Aug 23, 2026
15c9677
Merge remote-tracking branch 'origin/main' into feat/interaction-v1-w…
AgentArcLab Aug 23, 2026
c3f7cf3
merge(web): consolidate 0.3.2 cloud fixes
AgentArcLab Aug 23, 2026
06f876e
chore(release): attest consolidated web 0.3.2 source
AgentArcLab Aug 23, 2026
1f5abe3
test(web): cover unified legacy approval projection
AgentArcLab Aug 23, 2026
fe77c98
feat(web): unify hosted chat composer controls
AgentArcLab Aug 24, 2026
a1bb081
feat(web): gate runtime execution modes by capability
AgentArcLab Aug 24, 2026
6d5152f
fix(web): simplify hosted session activity
AgentArcLab Aug 24, 2026
22da49f
chore(release): attest final web 0.3.2 source
AgentArcLab Aug 24, 2026
39a550d
fix(web): expose goal and plan as execution controls
AgentArcLab Aug 24, 2026
fbc21ed
chore(release): attest execution controls source
AgentArcLab Aug 24, 2026
d85c0bc
chore(web): prepare truthful 0.3.2 candidate
AgentArcLab Aug 24, 2026
2136448
fix(web): keep prebuild capability gate executable
AgentArcLab Aug 24, 2026
d4b6d6b
chore(release): attest prebuild capability gate
AgentArcLab Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,145 @@
# Changelog

## 0.3.2 - 2026-08-21

Release candidate for the durable Interaction/v1 web experience. This is the
reviewed source that replaces the internal beta sequence. Publication remains
blocked on the current-digest cross-repository preproduction gate and uses the
protected release workflow only after that gate is green.

- Unify the Hosted UI composer with Studio's compact attachment, approval,
model, Goal, and Plan controls. The runtime's ordinary agent loop remains
internal rather than appearing as a third user-selectable mode; a future
eval-driven improvement loop must advertise its own honest capability.
- Simplify the session list: completed runs no longer expose raw status text;
active sessions use a small activity ring and subtle background, while failed
sessions use a restrained error dot.
- Keep RuntimeCapabilityMatrix decoding executable before the TypeScript build,
so the same fail-closed contract projection is covered by both browser tests
and the npm publication workflow's Node compatibility gate.

## 0.3.2-beta.5 - 2026-08-21

When the composer Interaction tray owns a pending approval, its tool-history
row is now strictly read-only. This removes the second legacy approve/reject
entry point while preserving the command arguments and terminal audit result.

## 0.3.2-beta.4 - 2026-08-21

Fixes the legacy Responses approval bridge: a pending approval is retained in
the read-only tool history and also normalized into the unified Interaction
tray immediately above the composer. The submit still uses the compatible
Responses approval transport when Interaction/v1 is unavailable.

## 0.3.2-beta.3 - 2026-08-20

Adds package-internal release provenance. Hosted UI and the preproduction gate
can verify the resolved tarball's source basis and Interaction/v1 contract
digest instead of trusting an external evidence label.

## 0.3.2-beta.2 - 2026-08-20

Rebuilt the immutable beta artifact from the complete Interaction/v1 source.
This supersedes `0.3.2-beta.1`, whose vendored Hosted UI tarball predated the
two fixes below.

- Treat a successful `SubmitInteraction` receipt as durable acceptance, not as
proof that the framework execution has already completed its resolution.
- Add the queue tray and read-only historical interaction anchors to the
published artifact, rather than leaving them only on the Web source branch.

## 0.3.2-beta.1 - 2026-08-19

> Unifies durable human-in-the-loop decisions behind one `Interaction/v1`
> client. Counterpart of the agent-kernel Interaction/v1 contract: pending
> approvals, structured inputs, and AG-UI interrupts normalize to a single
> Interaction shape with one submit path (`SubmitInteraction`) with
> revision CAS, idempotency keys, and first-wins terminal semantics.

### Interaction/v1 (headless core)

- New `src/core/interaction/` module: `InteractionClientImpl` + shared
`InteractionStore` with strict first-wins semantics (a terminal record
never regresses to pending), revision-based optimistic concurrency, and
an idempotency-key double-submit guard.
- Transport adapters normalize three sources into the same Interaction:
Interaction/v1 SessionEvents (`interaction.requested` / `.resolved`,
rejection is `resolved.outcome="rejected"`, not a fifth event type),
Responses `mcp_approval_request`, and AG-UI interrupts. Components never
branch on the approval protocol.
- New public API: `POST /agentengine/api/v1/SubmitInteraction`
(`submitInteraction` on `ApiFacade`), receipt decoded with the canonical
agent-kernel/v1 strict decoder. Pure `/v1/responses` clients keep the
official `mcp_approval_response` path.
- Refresh/replay: session load replays recent durable SessionEvents into
the store so a pending Interaction is restored without creating a second
request; a double click, a stale tab, or a replayed history can never
duplicate a decision.

### UI

- `InteractionTray` renders above the composer with the current pending
item, pending count, and queue navigation; the composer input is
visually subordinated while a decision is pending.
- `InteractionHistoryAnchor` replaces interactive historical approval
buttons with a read-only status retaining actor, decision time,
outcome, and a redacted response summary.
- A2UI production wire locked to `0.9.1` with catalog digest validation
(`validateA2uiPresentation`). Unknown wire versions or catalog
mismatches fall back to the canonical JSON schema form, then to plain
approve/reject controls. A validation failure is never mapped to an
approval.
- Expiry: interactions with a past `expires_at` disable submission
client-side and surface an expired notice.

### Compatibility

- Old servers without the `interaction_v1` capability keep the 0.3.1
Responses (`mcp_approval_response`) and AG-UI (`resumeAguiInterrupt`)
callbacks; the fallback is isolated in the adapters and the shared UI is
unchanged.
- Public runtime bundle exports `InteractionClientImpl`, `Interaction`,
adapters, and `interactionIdempotencyKey`.

### Supply chain

- Refresh the lockfile's production transitive dependencies for the `0.3.2`
candidate: Mermaid/DOMPurify and PostCSS/nanoid now resolve to the patched
releases verified by `npm audit --omit=dev`.

## 0.3.1 - 2026-08-12

> Identity-aware runtime item reducer. Counterpart of the KsADK `0.8.1`
> canonical RuntimeEvent(schema_version=2) release. Hosted UI and Studio must
> ship this version (or later) to keep stream/replay output consistent with the
> Python canonical pipeline.

### Stream / session reducer

- Introduce `RuntimeItemReducer` (`src/core/stream/runtime-items.ts`) as the
single canonical store for streaming output. It reduces identity-addressed
item operations into a per-run projection keyed by
`runId / scopeId / itemId / partId`, replacing the legacy v1 heuristic dedup
(`lastText` / per-agent accumulator / `startswith` / suffix overlap /
text hash).
- Ingress adapters normalize three sources into the same item operations:
Responses SSE output item ids, session events `Metadata.RuntimeItem`, and
legacy server events (no identity) via synthesized
`${invocationId}:legacy-assistant`. `assistant_stream_snapshot` maps to
replace, `assistant_message` maps to complete. Nothing inspects body text
to decide identity.

### Compatibility

- Consumers tracking the KsADK `0.8.1` canonical RuntimeEvent must use this
identity-aware version. `0.3.0` used the v1 heuristic reducer and will
duplicate or drop output when paired with canonical v2 producers.

## 0.3.0 - 2026-07-29

> Published baseline for Hosted runtime transport and the KsADK `0.8.0`
> web integration.

### Hosted runtime transport

- Add the official `@ag-ui/client` transport and capability-driven runtime
Expand Down
7 changes: 7 additions & 0 deletions RELEASE_PROVENANCE.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"schema_version": 1,
"package": "@kingsoftcloud/ksadk-web",
"version": "0.3.2",
"source_commit": "2136448e038b4d8c475fa20e4722252b1ddb2ebc",
"interaction_contract_digest": "47e1003e03d97abeba232cc3e03a14b9cbcf78b1109870ccd2ce371f073b6211"
}
21 changes: 17 additions & 4 deletions e2e/agui.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@ function bootstrap() {
Approval: true,
Thinking: true,
StopRun: true,
ResumeRun: true,
ResumeRun: false,
// The direct AG-UI HTTP stream is browser-attached: it is only
// selected when the agent does not require resumable runs.
RunLifecycle: { Enabled: false },
},
HostedChat: {
PreferredTransport: 'ag-ui',
Expand Down Expand Up @@ -182,12 +185,19 @@ test('projects AG-UI activity, resumes approval, and replays terminal state', as
await page.goto('/');

await expect(page.getByText('AG-UI Fixture')).toBeVisible();
const composer = page.getByPlaceholder('发送消息...');
const composer = page.locator('textarea[placeholder^="发送消息"]');
await composer.fill('请写入 demo.txt');
await composer.press('Enter');

await expect(page.getByText('E2E 状态卡')).toBeVisible();
await expect(page.locator('summary').filter({ hasText: '等待审批' })).toBeVisible();
// 0.3.2: the AG-UI interrupt is normalized into one durable
// Interaction — the tray carries the decision UI, the history anchor
// is read-only.
await expect(page.getByTestId('interaction-tray')).toBeVisible();
await expect(page.getByTestId('interaction-history-anchor')).toHaveAttribute(
'data-interaction-status',
'pending',
);
await expect(page.getByRole('button', { name: '批准并继续' })).toBeVisible();
await page.getByRole('button', { name: '批准并继续' }).click();

Expand All @@ -200,7 +210,10 @@ test('projects AG-UI activity, resumes approval, and replays terminal state', as
},
]);
await expect(page.getByText('审批已完成。')).toBeVisible();
await expect(page.locator('summary').filter({ hasText: '已批准' })).toBeVisible();
await expect(page.getByTestId('interaction-history-anchor')).toHaveAttribute(
'data-interaction-status',
'resolved',
);

fixture.approved = true;
await page.reload();
Expand Down
Loading
Loading