@qilin-agent/client-ui-chat 0.0.0-stage → 3.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.i18n.yaml +55 -0
- package/README.md +122 -2
- package/README.zh.md +124 -0
- package/lib/client.js +13227 -0
- package/lib/index.js +54 -0
- package/lib/types/chat-settings.d.ts +47 -0
- package/lib/types/client/apply.d.ts +10 -0
- package/lib/types/client/chat/ApprovalCommand.d.ts +20 -0
- package/lib/types/client/chat/AssistantMarkdown.d.ts +47 -0
- package/lib/types/client/chat/AssistantNodeView.d.ts +7 -0
- package/lib/types/client/chat/ChatGroupSeat.d.ts +14 -0
- package/lib/types/client/chat/ChatNodeSeat.d.ts +22 -0
- package/lib/types/client/chat/ChatView.d.ts +7 -0
- package/lib/types/client/chat/CommandNodeView.d.ts +9 -0
- package/lib/types/client/chat/CompactionCommandCard.d.ts +8 -0
- package/lib/types/client/chat/CompactionItem.d.ts +19 -0
- package/lib/types/client/chat/ContextBody.d.ts +131 -0
- package/lib/types/client/chat/ContextInjectionRow.d.ts +26 -0
- package/lib/types/client/chat/GenericCommandCard.d.ts +9 -0
- package/lib/types/client/chat/MessageIconActions.d.ts +37 -0
- package/lib/types/client/chat/MessageItem.d.ts +42 -0
- package/lib/types/client/chat/ReasoningRow.d.ts +20 -0
- package/lib/types/client/chat/RunningSeal.d.ts +6 -0
- package/lib/types/client/chat/RunningStatus.d.ts +13 -0
- package/lib/types/client/chat/StatsPills.d.ts +71 -0
- package/lib/types/client/chat/SystemPromptRow.d.ts +22 -0
- package/lib/types/client/chat/TurnNavigator.d.ts +28 -0
- package/lib/types/client/chat/TurnProcessNodeView.d.ts +4 -0
- package/lib/types/client/chat/TurnTailNodeView.d.ts +7 -0
- package/lib/types/client/chat/TurnTriggerNodeView.d.ts +4 -0
- package/lib/types/client/chat/TurnUsagePanel.d.ts +15 -0
- package/lib/types/client/chat/message-chrome.d.ts +50 -0
- package/lib/types/client/chat/register-node-renderers.d.ts +14 -0
- package/lib/types/client/chat/render-entry.d.ts +9 -0
- package/lib/types/client/chat/searchable-hidden.d.ts +9 -0
- package/lib/types/client/chat/stat-dialog.d.ts +20 -0
- package/lib/types/client/chat/step-process.d.ts +11 -0
- package/lib/types/client/chat/token-format.d.ts +25 -0
- package/lib/types/client/chat/turn-assistant.d.ts +8 -0
- package/lib/types/client/chat/turn-rail-items.d.ts +37 -0
- package/lib/types/client/chat/turn-trigger.d.ts +15 -0
- package/lib/types/client/chat/use-calendar-day.d.ts +6 -0
- package/lib/types/client/chat/use-chat-navigation.d.ts +69 -0
- package/lib/types/client/chat/use-chat-reading.d.ts +102 -0
- package/lib/types/client/chat/use-chat-scroll.d.ts +35 -0
- package/lib/types/client/chat/use-chat-viewport.d.ts +169 -0
- package/lib/types/client/chat/use-disclosure.d.ts +15 -0
- package/lib/types/client/chat/use-process-scroll.d.ts +23 -0
- package/lib/types/client/chat/use-scroll-follow.d.ts +105 -0
- package/lib/types/client/chat/use-turn-data.d.ts +9 -0
- package/lib/types/client/contract/assistant-content.d.ts +9 -0
- package/lib/types/client/contract/chat-nodes.d.ts +108 -0
- package/lib/types/client/contract/chat-visibility.d.ts +10 -0
- package/lib/types/client/contract/process-groups.d.ts +25 -0
- package/lib/types/client/contract/slots.d.ts +258 -0
- package/lib/types/client/contract/snapshot.d.ts +105 -0
- package/lib/types/client/contract/store.d.ts +13 -0
- package/lib/types/client/contract/turn-metrics.d.ts +19 -0
- package/lib/types/client/contract/turn-process.d.ts +40 -0
- package/lib/types/client/conversation-nodes/assistant.d.ts +36 -0
- package/lib/types/client/conversation-nodes/chat-snapshot-builder.d.ts +103 -0
- package/lib/types/client/conversation-nodes/command.d.ts +53 -0
- package/lib/types/client/conversation-nodes/common.d.ts +41 -0
- package/lib/types/client/conversation-nodes/compaction.d.ts +21 -0
- package/lib/types/client/conversation-nodes/event-projection.d.ts +63 -0
- package/lib/types/client/conversation-nodes/fallback.d.ts +16 -0
- package/lib/types/client/conversation-nodes/inbox.d.ts +40 -0
- package/lib/types/client/conversation-nodes/message.d.ts +42 -0
- package/lib/types/client/conversation-nodes/process-activity.d.ts +9 -0
- package/lib/types/client/conversation-nodes/process-groups.d.ts +27 -0
- package/lib/types/client/conversation-nodes/register.d.ts +7 -0
- package/lib/types/client/conversation-nodes/request-prompt.d.ts +44 -0
- package/lib/types/client/conversation-nodes/retry.d.ts +22 -0
- package/lib/types/client/conversation-nodes/tool.d.ts +23 -0
- package/lib/types/client/conversation-nodes/turn-error.d.ts +30 -0
- package/lib/types/client/conversation-nodes/turn-max-tokens.d.ts +22 -0
- package/lib/types/client/conversation-nodes/turn-navigation.d.ts +17 -0
- package/lib/types/client/conversation-nodes/turn-process-presentation.d.ts +30 -0
- package/lib/types/client/conversation-nodes/turn-process.d.ts +34 -0
- package/lib/types/client/conversation-nodes/turn-tail.d.ts +28 -0
- package/lib/types/client/index.d.ts +38 -0
- package/lib/types/client/locale.d.ts +378 -0
- package/lib/types/client/markdown-labels.d.ts +10 -0
- package/lib/types/client/model/conversation-context.d.ts +21 -0
- package/lib/types/client/model/tool-call-tree.d.ts +45 -0
- package/lib/types/client/performance-usage.d.ts +20 -0
- package/lib/types/client/presentation-policy.d.ts +35 -0
- package/lib/types/client/settings/LinkOpeningRow.d.ts +24 -0
- package/lib/types/client/settings/PerformanceUsageRow.d.ts +22 -0
- package/lib/types/client/settings/PreferenceRow.d.ts +18 -0
- package/lib/types/client/settings/TranscriptViewRow.d.ts +22 -0
- package/lib/types/client/stores.d.ts +20 -0
- package/lib/types/client/transcript-view.d.ts +25 -0
- package/lib/types/index.d.ts +6 -0
- package/package.json +106 -3
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/** Chat-owned Slot declarations and composed component props. */
|
|
2
|
+
import type { MessageId } from '@qilin-agent/llm/brand';
|
|
3
|
+
import type { SessionId, SessionSeq } from '@qilin-agent/session/types';
|
|
4
|
+
import type { CommandNode, CompactionSummaryNode, ConversationGroupData, ConversationLocationDataStore, ConversationTurnDataMap, GroupSnapshot, MessageImageLoader, MessageImagesOwnerProps, RenderMessageImages, TurnLocation } from '@qilin-agent/client-ui-conversation/client';
|
|
5
|
+
import type { InjectFace, KeyedSnapshotSelectorHook, PropsLocale, PropsRenderSlots, PropsRuntime, PropsStore, SlotHookFactory, SnapshotSelectorHook } from '@qilin-agent/client-ui-slots';
|
|
6
|
+
import type { MarkdownFileMentions } from '@qilin-agent/client-ui-primitives';
|
|
7
|
+
import type { createChatStore } from '../stores.ts';
|
|
8
|
+
import type { ToolCallId } from './store.ts';
|
|
9
|
+
import type { ChatConversationViewNode, ChatNode, ChatNodeKind } from './chat-nodes.ts';
|
|
10
|
+
import type { ChatNodeProcessSource, ChatNodeSource, ChatSnapshot, ChatTurnProcessPresentation } from './snapshot.ts';
|
|
11
|
+
import type { TurnProcessSpec } from './turn-process.ts';
|
|
12
|
+
import type { ObservableSnapshot } from '@qilin-agent/client-store';
|
|
13
|
+
import type { ChatPresentationPolicy } from '../presentation-policy.ts';
|
|
14
|
+
import type { PerformanceUsageMode } from '../../chat-settings.ts';
|
|
15
|
+
/** Selector hook over the current Conversation binding's Chat target. */
|
|
16
|
+
export type UseChat = SnapshotSelectorHook<ChatSnapshot>;
|
|
17
|
+
/** Per-key selector hook over one Chat Node. */
|
|
18
|
+
export type UseChatNode = KeyedSnapshotSelectorHook<ChatConversationViewNode | undefined>;
|
|
19
|
+
/** Per-key selector hook over one Chat Node's Turn-process presentation. */
|
|
20
|
+
export type UseChatNodeProcess = KeyedSnapshotSelectorHook<ChatTurnProcessPresentation | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* Selector hook over the live presentation policy. Callers select one field or
|
|
23
|
+
* a derived conclusion, never the whole policy, so a mode change re-renders
|
|
24
|
+
* only components whose selected value changed.
|
|
25
|
+
*/
|
|
26
|
+
export type UsePresentation = SnapshotSelectorHook<ChatPresentationPolicy>;
|
|
27
|
+
/** Where in a file an open should land. */
|
|
28
|
+
export interface OpenFileOptions {
|
|
29
|
+
/** 1-based line to reveal; absent = the file's beginning. */
|
|
30
|
+
readonly line?: number;
|
|
31
|
+
}
|
|
32
|
+
/** Owner currency of the completed-Turn extension chain. */
|
|
33
|
+
export interface TurnTailOwnerProps {
|
|
34
|
+
turn: TurnLocation;
|
|
35
|
+
seq: number;
|
|
36
|
+
openFile: (path: string) => void;
|
|
37
|
+
}
|
|
38
|
+
/** Owner currency of finalized-assistant actions. */
|
|
39
|
+
export interface AssistantActionOwnerProps {
|
|
40
|
+
messageId: MessageId;
|
|
41
|
+
}
|
|
42
|
+
/** Optional prose file-mention provider consumed by Chat. */
|
|
43
|
+
export interface ChatFileMentions {
|
|
44
|
+
/**
|
|
45
|
+
* Resolve prose links for one closing Turn.
|
|
46
|
+
* @param owner - closing-Turn identity and file opener.
|
|
47
|
+
* @param sessionId - viewed Session, including when history is inherited from a fork.
|
|
48
|
+
* @returns link resolver when available.
|
|
49
|
+
*/
|
|
50
|
+
forClosing(owner: TurnTailOwnerProps, sessionId: SessionId): MarkdownFileMentions | undefined;
|
|
51
|
+
}
|
|
52
|
+
declare module '@qilin-agent/kylin' {
|
|
53
|
+
interface Context {
|
|
54
|
+
/** Optional prose file-mention provider. */
|
|
55
|
+
chatFileMentions: ChatFileMentions;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Hook constrained to business data published on the current Chat Node's Turn. */
|
|
59
|
+
export type UseChatNodeTurnData = <Key extends Extract<keyof ConversationTurnDataMap, string>>(key: Key) => Readonly<ConversationTurnDataMap[Key]> | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Subscribe to enclosing-Turn resets and own one initially collapsed disclosure.
|
|
62
|
+
* Each invocation has independent open state; display-mode changes do not reset it.
|
|
63
|
+
* @returns the current open state, explicit setter, and toggle action.
|
|
64
|
+
*/
|
|
65
|
+
export type UseDisclosure = () => {
|
|
66
|
+
readonly expanded: boolean;
|
|
67
|
+
/** @param open - whether this disclosure is expanded. */
|
|
68
|
+
readonly setExpanded: (open: boolean) => void;
|
|
69
|
+
readonly toggle: () => void;
|
|
70
|
+
};
|
|
71
|
+
/** Stable sources bound to one rendered Chat Node. */
|
|
72
|
+
export interface ChatNodeHookContext {
|
|
73
|
+
readonly turnData: ConversationLocationDataStore<ConversationTurnDataMap> | undefined;
|
|
74
|
+
readonly disclosureReset: ObservableSnapshot<number>;
|
|
75
|
+
}
|
|
76
|
+
/** Slot-level Hook factories for keyed Chat renderers. */
|
|
77
|
+
export interface ChatNodeInjected {
|
|
78
|
+
hooks: {
|
|
79
|
+
turnData: SlotHookFactory<'conversation.chat.node', UseChatNodeTurnData>;
|
|
80
|
+
disclosure: SlotHookFactory<'conversation.chat.node', UseDisclosure>;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** Stable owner currency delivered to a keyed Chat renderer. */
|
|
84
|
+
export interface ChatNodeOwnerProps {
|
|
85
|
+
/** Renderer-owned Node portion selected by the grouping Definition. */
|
|
86
|
+
groupPart?: string;
|
|
87
|
+
cwd?: string | undefined;
|
|
88
|
+
/** Open the current source file of a skill referenced by a sent message. */
|
|
89
|
+
openSkill: (name: string) => void;
|
|
90
|
+
openFile: (path: string, options?: OpenFileOptions) => void;
|
|
91
|
+
inspectCall: ((callId: ToolCallId) => void) | undefined;
|
|
92
|
+
forkAt: (seq: number) => void;
|
|
93
|
+
/**
|
|
94
|
+
* Revise one sent user message: replace the composer draft with its text
|
|
95
|
+
* (the user edits the bubble and resends a new turn). User bubbles only;
|
|
96
|
+
* absent for owners that do not provide the wiring.
|
|
97
|
+
* @param text - the user message's plain text.
|
|
98
|
+
*/
|
|
99
|
+
editUserMessage?: ((text: string) => void) | undefined;
|
|
100
|
+
/** Session-authorized image loader for the attachment presentation slot. */
|
|
101
|
+
loadImage: MessageImageLoader;
|
|
102
|
+
renderMessageImages: RenderMessageImages;
|
|
103
|
+
fileMentions: (owner: TurnTailOwnerProps) => MarkdownFileMentions | undefined;
|
|
104
|
+
/** Turn-process state when this Node belongs to a projected Turn. */
|
|
105
|
+
turnProcess?: TurnProcessOwnerProps | undefined;
|
|
106
|
+
}
|
|
107
|
+
/** Shared presentation state for one Turn-process answer generation. */
|
|
108
|
+
export interface TurnProcessOwnerProps {
|
|
109
|
+
/** Process content eligible to share one Turn-level disclosure. */
|
|
110
|
+
readonly hasContent: boolean;
|
|
111
|
+
readonly spec: TurnProcessSpec;
|
|
112
|
+
readonly foldable: boolean;
|
|
113
|
+
readonly open: boolean;
|
|
114
|
+
setOpen(open: boolean): void;
|
|
115
|
+
}
|
|
116
|
+
/** Shared presentation-policy source for renderers that depend on the work-details mode. */
|
|
117
|
+
export interface PresentationInjected {
|
|
118
|
+
hooks: {
|
|
119
|
+
/** Live presentation policy derived from the accepted work-details mode. */
|
|
120
|
+
presentation: ObservableSnapshot<ChatPresentationPolicy>;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Shared settings source for the performance row, composer statistics, and turn tail. */
|
|
124
|
+
export interface PerformanceUsageInjected {
|
|
125
|
+
hooks: {
|
|
126
|
+
/** Accepted performance and usage detail preference. */
|
|
127
|
+
performanceUsage: ObservableSnapshot<PerformanceUsageMode>;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** Full props of one keyed Chat renderer. */
|
|
131
|
+
export type ChatNodeViewProps<Kind extends ChatNodeKind = ChatNodeKind> = PropsRuntime<'conversation.chat.node', Kind> & PropsLocale<'chat'>;
|
|
132
|
+
/** Command-row owner share. */
|
|
133
|
+
export interface CommandRowOwnerProps {
|
|
134
|
+
node: CommandNode;
|
|
135
|
+
compaction?: CompactionSummaryNode;
|
|
136
|
+
}
|
|
137
|
+
/** Full props of a registered command row. */
|
|
138
|
+
export type CommandRowProps = PropsRuntime<'conversation.chat.commandview'>;
|
|
139
|
+
/** Shared Chat store handle. */
|
|
140
|
+
export type ChatStore = ReturnType<typeof createChatStore>;
|
|
141
|
+
/** In-memory reader position resilient to transcript reflow. */
|
|
142
|
+
export interface ChatScrollPosition {
|
|
143
|
+
readonly anchorKey: string;
|
|
144
|
+
readonly anchorTop: number;
|
|
145
|
+
readonly scrollTop: number;
|
|
146
|
+
}
|
|
147
|
+
/** Business callbacks injected into the Chat view. */
|
|
148
|
+
export interface ChatViewInjected {
|
|
149
|
+
hooks: {
|
|
150
|
+
/** Live presentation policy derived from the accepted work-details mode. */
|
|
151
|
+
presentation: ObservableSnapshot<ChatPresentationPolicy>;
|
|
152
|
+
};
|
|
153
|
+
keyedHooks: {
|
|
154
|
+
/** Resolve the stable source for one Chat Node key. */
|
|
155
|
+
chatNode: (key: string) => ChatNodeSource;
|
|
156
|
+
/** Resolve the stable Turn-process source for one Chat Node key. */
|
|
157
|
+
chatNodeProcess: (key: string) => ChatNodeProcessSource;
|
|
158
|
+
/** Resolve one optional group without subscribing the root View to its data. */
|
|
159
|
+
chatGroup: (key: string) => ObservableSnapshot<GroupSnapshot<ConversationGroupData<'chat'>> | undefined> | undefined;
|
|
160
|
+
};
|
|
161
|
+
/** Open the current source file of a skill referenced by a sent message. */
|
|
162
|
+
openSkill: (name: string) => void;
|
|
163
|
+
/** Open one HTTP(S) message link at the selected destination, using an external tab if Sidebar Browser is unavailable. */
|
|
164
|
+
openExternalLink: (url: string) => void;
|
|
165
|
+
openFile: (path: string, options?: OpenFileOptions) => Promise<void>;
|
|
166
|
+
/** Open the right Sidebar's Trajectory tab focused on one tool call. */
|
|
167
|
+
openTrajectory: (callId: string) => void;
|
|
168
|
+
loadOlder: () => void;
|
|
169
|
+
/** Jump loader: page history back through seq; resolves when the window covers it. */
|
|
170
|
+
loadThrough: (seq: SessionSeq) => Promise<void>;
|
|
171
|
+
loadImage: MessageImageLoader;
|
|
172
|
+
chatScroll: {
|
|
173
|
+
save: (position: ChatScrollPosition | null) => void;
|
|
174
|
+
read: () => ChatScrollPosition | null;
|
|
175
|
+
};
|
|
176
|
+
forkAt: (seq: number) => void;
|
|
177
|
+
/**
|
|
178
|
+
* Revise one sent user message: replace the composer draft with its text.
|
|
179
|
+
* Implemented by the composition wiring over the conversation service.
|
|
180
|
+
* @param text - the user message's plain text.
|
|
181
|
+
*/
|
|
182
|
+
editUserMessage?: ((text: string) => void) | undefined;
|
|
183
|
+
fileMentions: (owner: TurnTailOwnerProps) => MarkdownFileMentions | undefined;
|
|
184
|
+
}
|
|
185
|
+
/** Full Chat view props. */
|
|
186
|
+
export type ChatViewSlotProps = PropsRuntime<'conversation.view'> & PropsRenderSlots<'conversation.chat.node' | 'conversation.message.images'> & PropsStore<ChatStore> & InjectFace<ChatViewInjected> & PropsLocale<'chat'>;
|
|
187
|
+
/** Full props of the durable-message image renderer. */
|
|
188
|
+
export type MessageImagesProps = PropsRuntime<'conversation.message.images'> & PropsLocale<'conversation'>;
|
|
189
|
+
declare module '@qilin-agent/client-ui-slots' {
|
|
190
|
+
interface SessionStandardProps {
|
|
191
|
+
/** Selector hook over the current Conversation binding's Chat target. */
|
|
192
|
+
useChat: UseChat;
|
|
193
|
+
}
|
|
194
|
+
interface LocaleNamespaceMap {
|
|
195
|
+
/** Chat target, transcript node, statistics, and details copy. */
|
|
196
|
+
chat: import('../locale.ts').ChatKey;
|
|
197
|
+
}
|
|
198
|
+
interface SlotMap {
|
|
199
|
+
/**
|
|
200
|
+
* Final Chat node renderer, keyed by `ChatNodeKind`. The component receives
|
|
201
|
+
* the typed node, shared Chat actions, and Turn-data hook. Reusing a key
|
|
202
|
+
* replaces that node renderer; a kind with no occupant renders no row.
|
|
203
|
+
*/
|
|
204
|
+
'conversation.chat.node': {
|
|
205
|
+
kind: 'keyed';
|
|
206
|
+
scope: 'session';
|
|
207
|
+
owner: ChatNodeOwnerProps;
|
|
208
|
+
keyProps: {
|
|
209
|
+
[Kind in ChatNodeKind]: {
|
|
210
|
+
node: ChatNode<Kind>;
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
hookContext: ChatNodeHookContext;
|
|
214
|
+
inject: ChatNodeInjected;
|
|
215
|
+
};
|
|
216
|
+
/**
|
|
217
|
+
* Renderer for one consecutive group of durable message images. The owner
|
|
218
|
+
* supplies image references, an authorized loader, and alignment. A
|
|
219
|
+
* registration replaces the shipped gallery; without one, images are omitted.
|
|
220
|
+
*/
|
|
221
|
+
'conversation.message.images': {
|
|
222
|
+
kind: 'single';
|
|
223
|
+
scope: 'session';
|
|
224
|
+
owner: MessageImagesOwnerProps;
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* Command row keyed by the command name. The component receives the folded
|
|
228
|
+
* command lifecycle and linked compaction when present. Reusing a key
|
|
229
|
+
* replaces that command renderer; an unoccupied key uses the generic card.
|
|
230
|
+
*/
|
|
231
|
+
'conversation.chat.commandview': {
|
|
232
|
+
kind: 'keyed';
|
|
233
|
+
scope: 'session';
|
|
234
|
+
owner: CommandRowOwnerProps;
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Ordered feature contributions before a completed Turn's action row. Each
|
|
238
|
+
* entry receives the Turn, closing sequence, and file opener. A fresh `id`
|
|
239
|
+
* adds an entry; entries without content return null.
|
|
240
|
+
*/
|
|
241
|
+
'conversation.chat.turnTail': {
|
|
242
|
+
kind: 'list';
|
|
243
|
+
scope: 'session';
|
|
244
|
+
owner: TurnTailOwnerProps;
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* Ordered actions for one finalized assistant message. Each entry receives
|
|
248
|
+
* the durable message id; a fresh `id` adds an action and reusing one replaces
|
|
249
|
+
* that entry. With no entries, the standard action row remains unchanged.
|
|
250
|
+
*/
|
|
251
|
+
'conversation.chat.assistant-actions': {
|
|
252
|
+
kind: 'list';
|
|
253
|
+
scope: 'session';
|
|
254
|
+
owner: AssistantActionOwnerProps;
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=slots.d.ts.map
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { ConversationNode, ConversationTimelineSnapshot, PartialAssistant, RunningToolCall } from '@qilin-agent/client-ui-conversation/client';
|
|
2
|
+
import type { ChatConversationViewNode, ChatNodeDataMap, ChatNodeKind } from './chat-nodes.ts';
|
|
3
|
+
import type { ObservableSnapshot } from '@qilin-agent/client-store';
|
|
4
|
+
import type { TurnProcessSpec } from './turn-process.ts';
|
|
5
|
+
export type { AssistantBlock, AssistantMessageNode, AssistantProviderMetadataView, AssistantRequestConfig, AssistantTiming, CommandNode, CompactionSummaryNode, ContextMessageNode, ConversationNode, ModelRetryNode, PartialAssistant, PreparingToolCall, RunningToolCall, StartedToolCall, SteeringMessageNode, TodoItem, ToolArgs, ToolCallBlock, ToolResultNode, TurnErrorNode, TurnMaxTokensNode, UnknownSurfaceNode, UserMessageNode, } from '@qilin-agent/client-ui-conversation/client';
|
|
6
|
+
/** Per-key observable used by one mounted Chat Node Seat. */
|
|
7
|
+
export interface ChatNodeSource {
|
|
8
|
+
/** @returns the current Node for this source's stable key. */
|
|
9
|
+
readonly getSnapshot: () => ChatConversationViewNode | undefined;
|
|
10
|
+
/** @param listener - callback for changes to this key. @returns the unsubscribe function. */
|
|
11
|
+
readonly subscribe: (listener: () => void) => () => void;
|
|
12
|
+
}
|
|
13
|
+
/** Per-key observable for the Turn-process presentation surrounding one Chat Node. */
|
|
14
|
+
export interface ChatNodeProcessSource {
|
|
15
|
+
/** @returns the current presentation, or absence outside a projected Turn process. */
|
|
16
|
+
readonly getSnapshot: () => ChatTurnProcessPresentation | undefined;
|
|
17
|
+
/** @param listener - callback for presentation changes. @returns the unsubscribe function. */
|
|
18
|
+
readonly subscribe: (listener: () => void) => () => void;
|
|
19
|
+
}
|
|
20
|
+
/** Stable live per-key reader for Chat nodes. */
|
|
21
|
+
export interface ChatNodeStore {
|
|
22
|
+
/** @param key - stable Conversation Context key. @returns current Node, when visible or hidden. */
|
|
23
|
+
get(key: string): ChatConversationViewNode | undefined;
|
|
24
|
+
/** @param key - stable Conversation Context key. @returns its identity-stable observable source. */
|
|
25
|
+
source(key: string): ChatNodeSource;
|
|
26
|
+
/**
|
|
27
|
+
* Observe one Turn's data for a single Node kind, including hidden Nodes, in anchor order.
|
|
28
|
+
* Other Turns and kinds do not notify this source.
|
|
29
|
+
* @param turn - resolved owning Turn.
|
|
30
|
+
* @param kind - business Node kind.
|
|
31
|
+
* @returns an identity-stable source whose array changes only with its members.
|
|
32
|
+
*/
|
|
33
|
+
turnDataSource<Kind extends ChatNodeKind>(turn: number, kind: Kind): ObservableSnapshot<readonly ChatNodeDataMap[Kind][]>;
|
|
34
|
+
/** @param key - stable Conversation Context key. @returns its Turn-process presentation source. */
|
|
35
|
+
processSource(key: string): ChatNodeProcessSource;
|
|
36
|
+
/** @returns all currently materialized Nodes without imposing render order. */
|
|
37
|
+
values(): readonly ChatConversationViewNode[];
|
|
38
|
+
}
|
|
39
|
+
/** One loaded Turn projected into the compact Chat navigation rail. */
|
|
40
|
+
export interface TurnNavigationItem {
|
|
41
|
+
readonly turn: number;
|
|
42
|
+
/** Stable Conversation Context key the rail scrolls to. */
|
|
43
|
+
readonly anchorKey: string;
|
|
44
|
+
/** Bounded prompt preview; empty when the loaded window starts mid-Turn. */
|
|
45
|
+
readonly prompt: string;
|
|
46
|
+
/** Bounded assistant-response preview; empty until the Turn answers. */
|
|
47
|
+
readonly response: string;
|
|
48
|
+
}
|
|
49
|
+
/** Stable live navigation projection of the loaded Turns. */
|
|
50
|
+
export interface ChatTurnNavigationIndex {
|
|
51
|
+
/**
|
|
52
|
+
* Loaded Turns that have a visible anchor, in timeline order. The array
|
|
53
|
+
* identity changes exactly when a Turn enters, leaves, or changes preview,
|
|
54
|
+
* so a renderer can select it directly as its change signal.
|
|
55
|
+
* @returns current navigation items.
|
|
56
|
+
*/
|
|
57
|
+
items(): readonly TurnNavigationItem[];
|
|
58
|
+
}
|
|
59
|
+
/** Stable live Location index for Chat nodes. */
|
|
60
|
+
export interface ChatLocationNodeIndex {
|
|
61
|
+
/** @param turn - owning turn. @returns ordered Chat Node keys in the turn. */
|
|
62
|
+
getTurn(turn: number): readonly string[];
|
|
63
|
+
/** @param turn - owning turn. @param step - owning step. @returns ordered Chat Node keys in the step. */
|
|
64
|
+
getStep(turn: number, step: number): readonly string[];
|
|
65
|
+
}
|
|
66
|
+
/** Cross-Node presentation facts derived for one Turn process. */
|
|
67
|
+
export interface ChatTurnProcessPresentation {
|
|
68
|
+
readonly turn: number;
|
|
69
|
+
readonly spec: TurnProcessSpec;
|
|
70
|
+
/** Whether the loaded window contains this Turn's `turn/start`; folding is decided per Turn on this fact. */
|
|
71
|
+
readonly turnStarted: boolean;
|
|
72
|
+
readonly turnClosed: boolean;
|
|
73
|
+
readonly hasExternalProcess: boolean;
|
|
74
|
+
/** A visible input after process output prevents one disclosure from hiding its surrounding groups. */
|
|
75
|
+
readonly hasInterleavedInput: boolean;
|
|
76
|
+
readonly compactAnswer: boolean;
|
|
77
|
+
}
|
|
78
|
+
/** Compatibility projection backing the composer stats pills (StatsPills.tsx) and the legacy top-level snapshot fields. */
|
|
79
|
+
export interface LegacyConversationSlice {
|
|
80
|
+
readonly nodes: readonly ConversationNode[];
|
|
81
|
+
readonly turnTimings: ReadonlyMap<number, {
|
|
82
|
+
readonly startTime: number;
|
|
83
|
+
readonly endTime?: number;
|
|
84
|
+
}>;
|
|
85
|
+
readonly turnEnds: ReadonlyMap<number, number>;
|
|
86
|
+
readonly partial: PartialAssistant | null;
|
|
87
|
+
readonly runningCalls: readonly RunningToolCall[];
|
|
88
|
+
}
|
|
89
|
+
/** Incremental Chat publication with immutable order and stable live keyed readers. */
|
|
90
|
+
export interface ChatSnapshot {
|
|
91
|
+
readonly order: readonly string[];
|
|
92
|
+
readonly nodes: ChatNodeStore;
|
|
93
|
+
readonly locations: ChatLocationNodeIndex;
|
|
94
|
+
readonly navigation: ChatTurnNavigationIndex;
|
|
95
|
+
readonly timeline: ConversationTimelineSnapshot;
|
|
96
|
+
readonly legacy: LegacyConversationSlice;
|
|
97
|
+
}
|
|
98
|
+
declare module '@qilin-agent/client-ui-conversation/client' {
|
|
99
|
+
interface ConversationViewSnapshotMap {
|
|
100
|
+
chat: ChatSnapshot;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Empty Chat target used before a view builder is registered. */
|
|
104
|
+
export declare const EMPTY_CHAT_SNAPSHOT: ChatSnapshot;
|
|
105
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Chat-owned per-Session view state. */
|
|
2
|
+
/** Tool call identity as carried by Chat nodes. */
|
|
3
|
+
export type ToolCallId = string;
|
|
4
|
+
/** One manually expanded Turn answer generation. */
|
|
5
|
+
export interface TurnProcessViewEntry {
|
|
6
|
+
readonly turn: number;
|
|
7
|
+
readonly answerStep: number;
|
|
8
|
+
}
|
|
9
|
+
/** Per-Session state shared only by the Chat view and details surface. */
|
|
10
|
+
export interface ChatStoreState {
|
|
11
|
+
turnProcesses: TurnProcessViewEntry[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AssistantMessageNode } from '@qilin-agent/client-ui-conversation/client';
|
|
2
|
+
/** One assistant step's derivable latency facts; null marks an unrecorded part. */
|
|
3
|
+
export interface StepReading {
|
|
4
|
+
/** step/start → first token delta, in ms. */
|
|
5
|
+
ttftMs: number | null;
|
|
6
|
+
/** First token delta → final message, in ms. */
|
|
7
|
+
decodeMs: number | null;
|
|
8
|
+
/** Provider-reported completion tokens. */
|
|
9
|
+
outputTokens: number | null;
|
|
10
|
+
}
|
|
11
|
+
type AssistantNode = AssistantMessageNode;
|
|
12
|
+
/**
|
|
13
|
+
* Read one assistant node's TTFT, decode wall time, and output tokens.
|
|
14
|
+
* @param node - A settled assistant node.
|
|
15
|
+
* @returns Per-part readings with `null` for unrecorded values.
|
|
16
|
+
*/
|
|
17
|
+
export declare function assistantStepReading(node: AssistantNode): StepReading;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=turn-metrics.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ChatNode } from './chat-nodes.ts';
|
|
2
|
+
/** Current process range and finalized answer boundary derived from one Turn. */
|
|
3
|
+
export interface TurnProcessSpec {
|
|
4
|
+
readonly turn: number;
|
|
5
|
+
/** Stable control-node anchor source, including currently ineligible evidence. */
|
|
6
|
+
readonly controlAnchorSeq: number;
|
|
7
|
+
readonly processStartSeq: number;
|
|
8
|
+
readonly answerAnchorSeq: number | null;
|
|
9
|
+
readonly answerStep: number | null;
|
|
10
|
+
readonly inlineReasoning: boolean;
|
|
11
|
+
/** Reply-bearing durable Assistant messages before the final answer. */
|
|
12
|
+
readonly messageCount: number;
|
|
13
|
+
/** Durable non-subagent Tool calls recorded by this Turn. */
|
|
14
|
+
readonly toolCallCount: number;
|
|
15
|
+
/** Tool calls whose configured name identifies a subagent delegation. */
|
|
16
|
+
readonly subagentCount: number;
|
|
17
|
+
}
|
|
18
|
+
/** Chat Node kinds that remain independent of a Turn's process disclosure. */
|
|
19
|
+
export declare const TURN_PROCESS_INDEPENDENT_KINDS: ReadonlySet<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Compare immutable Turn-process specifications by their published fields.
|
|
22
|
+
* @param left - previous specification.
|
|
23
|
+
* @param right - next specification.
|
|
24
|
+
* @returns whether both values describe the same process presentation.
|
|
25
|
+
*/
|
|
26
|
+
export declare function sameTurnProcessSpec(left: TurnProcessSpec, right: TurnProcessSpec): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Recognize the shipped subagent delegation name and its configured variants.
|
|
29
|
+
* Control tools use distinct names such as `send_message` and `list_agents`.
|
|
30
|
+
* @param name - durable Tool-call name.
|
|
31
|
+
* @returns whether the call creates or forks a subagent.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isSubagentDelegationTool(name: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Keep live, stopped, and failed Turns open.
|
|
36
|
+
* @param node - Node carrying the owning Turn.
|
|
37
|
+
* @returns whether whole-Turn collapse is unavailable.
|
|
38
|
+
*/
|
|
39
|
+
export declare function turnProcessAlwaysOpen(node: ChatNode | undefined): boolean;
|
|
40
|
+
//# sourceMappingURL=turn-process.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Context } from '@qilin-agent/kylin';
|
|
2
|
+
import type { AssistantBlock, ConversationMatch, ConversationNodeDefinition } from '@qilin-agent/client-ui-conversation/client';
|
|
3
|
+
import type { AssistantChatData } from '../contract/chat-nodes.ts';
|
|
4
|
+
declare module '../contract/chat-nodes.ts' {
|
|
5
|
+
interface ChatNodeDataMap {
|
|
6
|
+
/** Streaming, settled, or interrupted Assistant step. */
|
|
7
|
+
'assistant-step': AssistantChatData;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
declare module '@qilin-agent/client-ui-conversation/client' {
|
|
11
|
+
interface ConversationStepDataMap {
|
|
12
|
+
/** Streaming, settled, or interrupted Assistant material for this Step. */
|
|
13
|
+
'assistant-step': AssistantChatData;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
interface AssistantState {
|
|
17
|
+
readonly turn: number;
|
|
18
|
+
readonly step: number;
|
|
19
|
+
readonly blocks: readonly (AssistantBlock | undefined)[];
|
|
20
|
+
readonly visibleBlocks: number;
|
|
21
|
+
readonly firstVisibleSeq: number | undefined;
|
|
22
|
+
readonly firstVisibleTime: number | undefined;
|
|
23
|
+
readonly firstTokenTime: number | undefined;
|
|
24
|
+
readonly hidden: boolean;
|
|
25
|
+
readonly final: ConversationMatch | undefined;
|
|
26
|
+
readonly usage: unknown;
|
|
27
|
+
}
|
|
28
|
+
/** Per-step Assistant streaming/final/interruption Definition. */
|
|
29
|
+
export declare const assistantDefinition: ConversationNodeDefinition<AssistantState>;
|
|
30
|
+
/**
|
|
31
|
+
* Register the Assistant lifecycle business contribution.
|
|
32
|
+
* @param ctx - owning UI Conversation context.
|
|
33
|
+
*/
|
|
34
|
+
export declare function registerAssistantConversationNode(ctx: Context): void;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=assistant.d.ts.map
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Context } from '@qilin-agent/kylin';
|
|
2
|
+
import type { ConversationGroupInput, ConversationTimelineSnapshot, ConversationViewBuilder, ConversationViewDefinition } from '@qilin-agent/client-ui-conversation/client';
|
|
3
|
+
import type { ChatConversationViewNode } from '../contract/chat-nodes.ts';
|
|
4
|
+
import type { ChatNodeStore, ChatSnapshot } from '../contract/snapshot.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Order visible Chat Nodes without changing existing relative order as process
|
|
7
|
+
* eligibility changes. Opening input precedes process candidates, while
|
|
8
|
+
* each synthetic process control sits between them.
|
|
9
|
+
* @param nodes - currently materialized Chat Nodes.
|
|
10
|
+
* @returns visible Nodes in presentation order.
|
|
11
|
+
*/
|
|
12
|
+
export declare function orderedVisibleChatNodes(nodes: readonly ChatConversationViewNode[]): ChatConversationViewNode[];
|
|
13
|
+
/**
|
|
14
|
+
* Attaches each direct message's step-loaded skill names to its Node.
|
|
15
|
+
*
|
|
16
|
+
* A step's `skill-invocation` injections follow the direct messages the host
|
|
17
|
+
* scanned for `/name` gestures and precede the step's first Node of any other
|
|
18
|
+
* kind, so every non-message, non-context Node closes a batch. Every ended
|
|
19
|
+
* Turn publishes its `turn-tail` Node on `turn/end` whatever the reason, so a
|
|
20
|
+
* batch never spans Turns, and `step/start` precedes the direct message in
|
|
21
|
+
* the log, so no boundary separates a message from its injections. Names
|
|
22
|
+
* attach to every direct message of the batch: the bubble decorates only the
|
|
23
|
+
* tokens its own text carries.
|
|
24
|
+
*
|
|
25
|
+
* The index holds only messages, skill injections, and boundaries, ordered by
|
|
26
|
+
* `anchorSeq`. An apply re-reads just the batches around the Nodes whose
|
|
27
|
+
* classification changed and never scans the store, so an assistant
|
|
28
|
+
* streaming frame costs nothing here (the append hot path never scans the
|
|
29
|
+
* Chat Nodes).
|
|
30
|
+
*/
|
|
31
|
+
export declare class SkillNameProjector {
|
|
32
|
+
private readonly entries;
|
|
33
|
+
/** Every indexed entry in `anchorSeq` order. */
|
|
34
|
+
private sorted;
|
|
35
|
+
/**
|
|
36
|
+
* Rebuild the index from a whole Node set and attach names to its messages.
|
|
37
|
+
* @param nodes - every materialized Chat Node, in any order.
|
|
38
|
+
* @returns the same Nodes, direct messages carrying their batch's names.
|
|
39
|
+
*/
|
|
40
|
+
replace(nodes: readonly ChatConversationViewNode[]): readonly ChatConversationViewNode[];
|
|
41
|
+
/**
|
|
42
|
+
* Fold one incremental upsert set: re-read only the batches around the
|
|
43
|
+
* Nodes whose classification changed.
|
|
44
|
+
* @param upserts - the changed Nodes.
|
|
45
|
+
* @param store - the resident Nodes, read by key for the messages of an affected batch.
|
|
46
|
+
* @returns the upserts plus any resident message whose names changed.
|
|
47
|
+
*/
|
|
48
|
+
apply(upserts: readonly ChatConversationViewNode[], store: ChatNodeStore): readonly ChatConversationViewNode[];
|
|
49
|
+
private insert;
|
|
50
|
+
private remove;
|
|
51
|
+
/** First index whose seq is at least `seq`. */
|
|
52
|
+
private lowerBound;
|
|
53
|
+
/** Last index of the boundary-free run containing `index`. */
|
|
54
|
+
private runEnd;
|
|
55
|
+
/** First index of the boundary-free run containing `index`. */
|
|
56
|
+
private runStart;
|
|
57
|
+
/** Record the names every message of the run `[start, end]` carries. */
|
|
58
|
+
private assignRun;
|
|
59
|
+
/**
|
|
60
|
+
* Re-read the run(s) around one changed seq: the run holding a message or
|
|
61
|
+
* skill entry, or — for a boundary, or a seq that left the index — the runs
|
|
62
|
+
* on both sides of that position.
|
|
63
|
+
*/
|
|
64
|
+
private collectAround;
|
|
65
|
+
}
|
|
66
|
+
/** Incremental keyed Chat builder registered under the `chat` target. */
|
|
67
|
+
export declare class ChatSnapshotBuilder implements ConversationViewBuilder<ChatConversationViewNode, ChatSnapshot> {
|
|
68
|
+
private readonly store;
|
|
69
|
+
private readonly locations;
|
|
70
|
+
private readonly navigation;
|
|
71
|
+
private readonly legacy;
|
|
72
|
+
private readonly referenceLabels;
|
|
73
|
+
private readonly skillNames;
|
|
74
|
+
private order;
|
|
75
|
+
private latestGroupInput;
|
|
76
|
+
private readonly readGroupNode;
|
|
77
|
+
private readonly readGroupTurn;
|
|
78
|
+
private readonly readGroupPosition;
|
|
79
|
+
/** Last published timeline: a Turn boundary can land without a new node. */
|
|
80
|
+
private timeline;
|
|
81
|
+
readonly empty: ChatSnapshot;
|
|
82
|
+
constructor();
|
|
83
|
+
replace(input: {
|
|
84
|
+
readonly nodes: readonly ChatConversationViewNode[];
|
|
85
|
+
readonly timeline: ConversationTimelineSnapshot;
|
|
86
|
+
}): ChatSnapshot;
|
|
87
|
+
apply(input: {
|
|
88
|
+
readonly upserts: readonly ChatConversationViewNode[];
|
|
89
|
+
readonly timeline: ConversationTimelineSnapshot;
|
|
90
|
+
readonly changedTurns?: readonly number[];
|
|
91
|
+
}): ChatSnapshot;
|
|
92
|
+
groupInput(): ConversationGroupInput<ChatConversationViewNode>;
|
|
93
|
+
publish(): void;
|
|
94
|
+
private snapshot;
|
|
95
|
+
}
|
|
96
|
+
/** Chat target factory contributed to the Conversation view registry. */
|
|
97
|
+
export declare const chatViewDefinition: ConversationViewDefinition<ChatConversationViewNode, ChatSnapshot>;
|
|
98
|
+
/**
|
|
99
|
+
* Register the incremental Chat target builder.
|
|
100
|
+
* @param ctx - owning UI Conversation context.
|
|
101
|
+
*/
|
|
102
|
+
export declare function registerChatConversationView(ctx: Context): void;
|
|
103
|
+
//# sourceMappingURL=chat-snapshot-builder.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Context } from '@qilin-agent/kylin';
|
|
2
|
+
import type { CommandNode, CompactionSummaryNode, ConversationMatch, ConversationNodeDefinition } from '@qilin-agent/client-ui-conversation/client';
|
|
3
|
+
declare module '../contract/chat-nodes.ts' {
|
|
4
|
+
interface ChatNodeDataMap {
|
|
5
|
+
/** Ordinary slash-command lifecycle. */
|
|
6
|
+
command: CommandNode;
|
|
7
|
+
/** Manual compact command combined with its compaction transaction. */
|
|
8
|
+
'manual-compaction': ManualCompactionChatData;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
type CommandId = CommandNode['commandId'];
|
|
12
|
+
interface CommandState {
|
|
13
|
+
readonly command: CommandNode;
|
|
14
|
+
readonly summary?: ConversationMatch;
|
|
15
|
+
readonly checkpoint?: ConversationMatch;
|
|
16
|
+
}
|
|
17
|
+
interface CompactionEvidence {
|
|
18
|
+
readonly summary?: ConversationMatch;
|
|
19
|
+
readonly checkpoint?: ConversationMatch;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Read correlation identity from a compaction replacement checkpoint.
|
|
23
|
+
* @param event - candidate Session event.
|
|
24
|
+
* @returns correlated compaction and optional command identity.
|
|
25
|
+
*/
|
|
26
|
+
declare function compactSource(event: Parameters<ConversationNodeDefinition['match']>[0]): {
|
|
27
|
+
compactionId: string;
|
|
28
|
+
sourceCommandId?: CommandId;
|
|
29
|
+
} | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Build the visible summary marker from optional lifecycle evidence.
|
|
32
|
+
* @param match - compaction/summary Match, when loaded.
|
|
33
|
+
* @param checkpoint - replacement checkpoint Match.
|
|
34
|
+
* @returns final compaction summary Node data.
|
|
35
|
+
*/
|
|
36
|
+
declare function compactSummary(match: ConversationMatch | undefined, checkpoint: ConversationMatch): CompactionSummaryNode;
|
|
37
|
+
/**
|
|
38
|
+
* Fold shared compaction evidence into a Definition-owned State.
|
|
39
|
+
* @param state - current business State carrying optional compaction evidence.
|
|
40
|
+
* @param match - next compaction lifecycle Match.
|
|
41
|
+
* @returns adopted State, preserving reference identity when the Match adds no evidence.
|
|
42
|
+
*/
|
|
43
|
+
export declare function updateCompactionState<State extends CompactionEvidence>(state: State, match: ConversationMatch): State;
|
|
44
|
+
/** Slash-command lifecycle, including integrated manual compaction, Definition. */
|
|
45
|
+
export declare const commandDefinition: ConversationNodeDefinition<CommandState>;
|
|
46
|
+
/**
|
|
47
|
+
* Register the command lifecycle business contribution.
|
|
48
|
+
* @param ctx - owning UI Conversation context.
|
|
49
|
+
*/
|
|
50
|
+
export declare function registerCommandConversationNode(ctx: Context): void;
|
|
51
|
+
/** Shared structural checkpoint recognizer for automatic compaction. */
|
|
52
|
+
export { compactSource, compactSummary };
|
|
53
|
+
//# sourceMappingURL=command.d.ts.map
|