Skip to content
Merged
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
93e2467
docs(channels): design DingTalk interactive cards
BenGuanRan Jul 15, 2026
c9e16a3
docs(channels): refine DingTalk card boundaries
BenGuanRan Jul 15, 2026
952bbf8
docs(channels): map other IM impact
BenGuanRan Jul 15, 2026
0eec1f5
docs(channels): add other IM extension blueprint
BenGuanRan Jul 15, 2026
6ac9b12
docs(channels): refine DingTalk card architecture
BenGuanRan Jul 15, 2026
905242b
docs(channels): tighten DingTalk card contracts
BenGuanRan Jul 15, 2026
647ef61
docs(channels): align card settlement contract
BenGuanRan Jul 15, 2026
c774866
docs(channels): clarify card settlement behavior
BenGuanRan Jul 15, 2026
5929c4e
docs(channels): finalize DingTalk card design
BenGuanRan Jul 17, 2026
7fbe727
docs(channels): harden DingTalk card design
BenGuanRan Jul 17, 2026
26cfd3c
docs(channels): finalize DingTalk card implementation contract
BenGuanRan Jul 24, 2026
0cc9708
feat(channels): add exact prompt run identity
BenGuanRan Jul 24, 2026
8e4df3d
feat(channels): add structured user input presentation
BenGuanRan Jul 24, 2026
5482a7a
feat(dingtalk): add interactive card transport
BenGuanRan Jul 24, 2026
7689e75
feat(dingtalk): stream exact-run status cards
BenGuanRan Jul 24, 2026
51a6562
feat(dingtalk): answer structured questions with cards
BenGuanRan Jul 24, 2026
440b931
fix(channels): close interactive card race boundaries
BenGuanRan Jul 24, 2026
ee19f3e
fix(dingtalk): preserve completed card content
BenGuanRan Jul 24, 2026
3a6fbaa
feat(dingtalk): coordinate interactive card segments
BenGuanRan Jul 24, 2026
f77fa85
docs(dingtalk): define status card runtime metadata
BenGuanRan Jul 27, 2026
9d325b5
docs(dingtalk): align status updates with stream flushes
BenGuanRan Jul 27, 2026
03689f1
docs(dingtalk): plan runtime card metadata
BenGuanRan Jul 27, 2026
6761bc9
feat(dingtalk): finalize interactive card lifecycle
BenGuanRan Jul 27, 2026
084ec0c
fix(dingtalk): keep question cards responsive
BenGuanRan Jul 27, 2026
8ecdab8
docs(dingtalk): define interaction isolation verification
BenGuanRan Jul 27, 2026
e06e4a6
test(dingtalk): cover interaction isolation
BenGuanRan Jul 27, 2026
2d7ea06
docs(dingtalk): define latest main alignment
BenGuanRan Jul 27, 2026
cb2c67d
docs(dingtalk): plan latest main alignment
BenGuanRan Jul 27, 2026
d6279fb
fix(dingtalk): preserve images in status cards
BenGuanRan Jul 27, 2026
213820a
docs(dingtalk): refresh main alignment baseline
BenGuanRan Jul 27, 2026
228d4b2
docs(channels): define interaction compatibility hardening
BenGuanRan Jul 28, 2026
29d772d
docs(channels): plan interaction compatibility hardening
BenGuanRan Jul 28, 2026
2ebea94
fix(channels): separate output segment ends
BenGuanRan Jul 28, 2026
5709262
fix(dingtalk): require interactive card opt-in
BenGuanRan Jul 28, 2026
c7185b1
fix(dingtalk): classify card callbacks
BenGuanRan Jul 28, 2026
a6e0c4c
fix(dingtalk): notify rejected card clickers
BenGuanRan Jul 28, 2026
2d7d830
fix(channels): settle user input on steer
BenGuanRan Jul 28, 2026
2a51f64
refactor(dingtalk): remove unused settlement state
BenGuanRan Jul 28, 2026
8dc7a3d
docs(dingtalk): clarify forbidden card feedback
BenGuanRan Jul 28, 2026
1c0076d
fix(dingtalk): harden interactive card callbacks
BenGuanRan Jul 28, 2026
7312133
fix(sdk): coalesce concurrent session cancellation
BenGuanRan Jul 28, 2026
ecfa193
fix(channels): harden DingTalk interactive cards
BenGuanRan Jul 28, 2026
334e748
docs(channels): refresh interactive card architecture diagrams
BenGuanRan Jul 28, 2026
ae81e85
fix(channels): sanitize terminal DingTalk card content
BenGuanRan Jul 28, 2026
4c8458e
docs(channels): correct output segment hook contract
BenGuanRan Jul 28, 2026
403b3ad
fix(channels): expire superseded DingTalk question cards
BenGuanRan Jul 29, 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
464 changes: 464 additions & 0 deletions docs/design/2026-07-15-dingtalk-interactive-cards.md

Large diffs are not rendered by default.

502 changes: 502 additions & 0 deletions docs/design/2026-07-25-channel-interaction-presentation-contract.md

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1,356 changes: 1,263 additions & 93 deletions packages/channels/base/src/ChannelBase.test.ts

Large diffs are not rendered by default.

476 changes: 460 additions & 16 deletions packages/channels/base/src/ChannelBase.ts

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions packages/channels/base/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,20 @@ export type {
ChannelMemoryIntentClassifierResult,
ChannelMemoryScopeConfig,
ChannelMemoryScopeMode,
ChannelOutputSegmentContext,
ChannelOutputSegmentEndReason,
ChannelPlugin,
ChannelPromptOwner,
ChannelProactiveTarget,
ChannelRuntimeIdentity,
ChannelRuntimeMemoryScope,
ChannelTaskCancellationReason,
ChannelTaskLifecycleBase,
ChannelTaskLifecycleEvent,
ChannelType,
ChannelUserInputRequestContext,
ChannelUserInputResponse,
ChannelUserQuestion,
DispatchMode,
DmPolicy,
Envelope,
Expand All @@ -117,4 +123,6 @@ export type {
SenderPolicy,
SessionScope,
SessionTarget,
UserInputPresentationResult,
UserInputSettlementReason,
} from './types.js';
63 changes: 63 additions & 0 deletions packages/channels/base/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { RequestPermissionResponse } from '@agentclientprotocol/sdk';
import type { ChannelAgentBridge } from './ChannelAgentBridge.js';
import type { ChannelBase, ChannelBaseOptions } from './ChannelBase.js';
import type { ChannelWebhookConfig } from './ChannelWebhookTask.js';
Expand Down Expand Up @@ -179,6 +180,66 @@ export interface ObservedChannelContactGraph {
groups: ObservedChannelGroup[];
}

export interface ChannelPromptOwner {
kind: 'channel_user';
id: string;
}

export type UserInputPresentationResult =
| { kind: 'presented' }
| { kind: 'handled' }
| { kind: 'unsupported' };

export type UserInputSettlementReason =
| 'resolved_outside_presenter'
| 'cancelled'
| 'run_cancelled';

export type ChannelUserInputResponse = RequestPermissionResponse & {
answers?: Record<string, string>;
};

export interface ChannelUserQuestion {
answerKey: string;
header: string;
question: string;
options: Array<{
label: string;
description: string;
}>;
multiSelect: boolean;
}

export interface ChannelUserInputRequestContext {
requestId: string;
sessionId: string;
runId: string;
owner: ChannelPromptOwner;
target: SessionTarget;
precedingSegmentId?: string;
questions: ChannelUserQuestion[];
submitOptionId: string;
onSettled(listener: (reason: UserInputSettlementReason) => void): () => void;
respond(response: ChannelUserInputResponse): Promise<boolean>;
}

export interface ChannelOutputSegmentContext {
channelName: string;
sessionId: string;
runId: string;
segmentId: string;
owner: ChannelPromptOwner;
target: SessionTarget;
messageId?: string;
}

export type ChannelOutputSegmentEndReason =
| 'response_boundary'
| 'input_requested'
| 'completed'
| 'failed'
| 'cancelled';

export interface ChannelProactiveTarget {
channelName: string;
type: 'user' | 'chat';
Expand All @@ -190,6 +251,8 @@ export interface ChannelTaskLifecycleBase {
chatId: string;
sessionId: string;
messageId?: string;
runId?: string;
owner?: ChannelPromptOwner;
identity: ChannelRuntimeIdentity;
memoryScope: ChannelRuntimeMemoryScope;
}
Expand Down
Loading
Loading