@steerable/agent-ui 0.2.3 → 0.2.4
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/dist/cards/ActionSegmentCard.d.ts +18 -0
- package/dist/cards/ActionSegmentCard.d.ts.map +1 -0
- package/dist/cards/ActionSegmentCard.js +26 -0
- package/dist/cards/ActionSegmentCard.js.map +1 -0
- package/dist/cards/AnalysisDocumentCard.d.ts +33 -0
- package/dist/cards/AnalysisDocumentCard.d.ts.map +1 -0
- package/dist/cards/AnalysisDocumentCard.js +11 -0
- package/dist/cards/AnalysisDocumentCard.js.map +1 -0
- package/dist/cards/AskUserQuestionsCard.d.ts +43 -0
- package/dist/cards/AskUserQuestionsCard.d.ts.map +1 -0
- package/dist/cards/AskUserQuestionsCard.js +171 -0
- package/dist/cards/AskUserQuestionsCard.js.map +1 -0
- package/dist/cards/CoverageReportCard.d.ts +41 -0
- package/dist/cards/CoverageReportCard.d.ts.map +1 -0
- package/dist/cards/CoverageReportCard.js +55 -0
- package/dist/cards/CoverageReportCard.js.map +1 -0
- package/dist/cards/OrchestrationPlanCard.d.ts +60 -0
- package/dist/cards/OrchestrationPlanCard.d.ts.map +1 -0
- package/dist/cards/OrchestrationPlanCard.js +103 -0
- package/dist/cards/OrchestrationPlanCard.js.map +1 -0
- package/dist/cards/PlanSelectorCard.d.ts +40 -0
- package/dist/cards/PlanSelectorCard.d.ts.map +1 -0
- package/dist/cards/PlanSelectorCard.js +106 -0
- package/dist/cards/PlanSelectorCard.js.map +1 -0
- package/dist/cards/PlanStepsCard.d.ts +18 -0
- package/dist/cards/PlanStepsCard.d.ts.map +1 -0
- package/dist/cards/PlanStepsCard.js +25 -0
- package/dist/cards/PlanStepsCard.js.map +1 -0
- package/dist/cards/QuizCard.d.ts +44 -0
- package/dist/cards/QuizCard.d.ts.map +1 -0
- package/dist/cards/QuizCard.js +113 -0
- package/dist/cards/QuizCard.js.map +1 -0
- package/dist/cards/ResearchPlanCard.d.ts +23 -0
- package/dist/cards/ResearchPlanCard.d.ts.map +1 -0
- package/dist/cards/ResearchPlanCard.js +50 -0
- package/dist/cards/ResearchPlanCard.js.map +1 -0
- package/dist/cards/SearchSourcesCard.d.ts +29 -0
- package/dist/cards/SearchSourcesCard.d.ts.map +1 -0
- package/dist/cards/SearchSourcesCard.js +83 -0
- package/dist/cards/SearchSourcesCard.js.map +1 -0
- package/dist/cards/SuggestedRepliesCard.d.ts +18 -0
- package/dist/cards/SuggestedRepliesCard.d.ts.map +1 -0
- package/dist/cards/SuggestedRepliesCard.js +14 -0
- package/dist/cards/SuggestedRepliesCard.js.map +1 -0
- package/dist/cards/SummaryMessageCard.d.ts +40 -0
- package/dist/cards/SummaryMessageCard.d.ts.map +1 -0
- package/dist/cards/SummaryMessageCard.js +56 -0
- package/dist/cards/SummaryMessageCard.js.map +1 -0
- package/dist/cards/ThinkingProcessCard.d.ts +46 -0
- package/dist/cards/ThinkingProcessCard.d.ts.map +1 -0
- package/dist/cards/ThinkingProcessCard.js +79 -0
- package/dist/cards/ThinkingProcessCard.js.map +1 -0
- package/dist/cards/ToolExecutionCard.d.ts +21 -0
- package/dist/cards/ToolExecutionCard.d.ts.map +1 -0
- package/dist/cards/ToolExecutionCard.js +65 -0
- package/dist/cards/ToolExecutionCard.js.map +1 -0
- package/dist/cards/icons.d.ts +38 -0
- package/dist/cards/icons.d.ts.map +1 -0
- package/dist/cards/icons.js +87 -0
- package/dist/cards/icons.js.map +1 -0
- package/dist/cards/index.d.ts +38 -0
- package/dist/cards/index.d.ts.map +1 -0
- package/dist/cards/index.js +24 -0
- package/dist/cards/index.js.map +1 -0
- package/dist/cards/types.d.ts +24 -0
- package/dist/cards/types.d.ts.map +1 -0
- package/dist/cards/types.js +7 -0
- package/dist/cards/types.js.map +1 -0
- package/dist/components/AgentSelector.d.ts +23 -0
- package/dist/components/AgentSelector.d.ts.map +1 -0
- package/dist/components/AgentSelector.js +63 -0
- package/dist/components/AgentSelector.js.map +1 -0
- package/dist/components/AgentSelector.stories.d.ts +12 -0
- package/dist/components/AgentSelector.stories.d.ts.map +1 -0
- package/dist/components/AgentSelector.stories.js +95 -0
- package/dist/components/AgentSelector.stories.js.map +1 -0
- package/dist/components/ChatPanel.d.ts +138 -21
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +181 -26
- package/dist/components/ChatPanel.js.map +1 -1
- package/dist/components/index.d.ts +3 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/state/ChatSessionProvider.d.ts +59 -0
- package/dist/state/ChatSessionProvider.d.ts.map +1 -0
- package/dist/state/ChatSessionProvider.js +71 -0
- package/dist/state/ChatSessionProvider.js.map +1 -0
- package/dist/state/MockChatStreamTransport.d.ts +54 -0
- package/dist/state/MockChatStreamTransport.d.ts.map +1 -0
- package/dist/state/MockChatStreamTransport.js +86 -0
- package/dist/state/MockChatStreamTransport.js.map +1 -0
- package/dist/state/MockChatStreamTransport.stories.d.ts +13 -0
- package/dist/state/MockChatStreamTransport.stories.d.ts.map +1 -0
- package/dist/state/MockChatStreamTransport.stories.js +60 -0
- package/dist/state/MockChatStreamTransport.stories.js.map +1 -0
- package/dist/state/bridgeLegacySSE.d.ts +42 -0
- package/dist/state/bridgeLegacySSE.d.ts.map +1 -0
- package/dist/state/bridgeLegacySSE.js +102 -0
- package/dist/state/bridgeLegacySSE.js.map +1 -0
- package/dist/state/index.d.ts +32 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +24 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/parseSSE.d.ts +50 -0
- package/dist/state/parseSSE.d.ts.map +1 -0
- package/dist/state/parseSSE.js +112 -0
- package/dist/state/parseSSE.js.map +1 -0
- package/dist/state/useChatComposer.d.ts +51 -0
- package/dist/state/useChatComposer.d.ts.map +1 -0
- package/dist/state/useChatComposer.js +82 -0
- package/dist/state/useChatComposer.js.map +1 -0
- package/dist/state/useChatList.d.ts +71 -0
- package/dist/state/useChatList.d.ts.map +1 -0
- package/dist/state/useChatList.js +158 -0
- package/dist/state/useChatList.js.map +1 -0
- package/dist/state/useChatSession.d.ts +29 -0
- package/dist/state/useChatSession.d.ts.map +1 -0
- package/dist/state/useChatSession.js +37 -0
- package/dist/state/useChatSession.js.map +1 -0
- package/dist/state/useScrollLock.d.ts +35 -0
- package/dist/state/useScrollLock.d.ts.map +1 -0
- package/dist/state/useScrollLock.js +74 -0
- package/dist/state/useScrollLock.js.map +1 -0
- package/dist/state/useToolCallStream.d.ts +38 -0
- package/dist/state/useToolCallStream.d.ts.map +1 -0
- package/dist/state/useToolCallStream.js +74 -0
- package/dist/state/useToolCallStream.js.map +1 -0
- package/package.json +10 -2
- package/src/cards/ActionSegmentCard.tsx +60 -0
- package/src/cards/AnalysisDocumentCard.tsx +81 -0
- package/src/cards/AskUserQuestionsCard.tsx +354 -0
- package/src/cards/CoverageReportCard.tsx +215 -0
- package/src/cards/OrchestrationPlanCard.tsx +328 -0
- package/src/cards/PlanSelectorCard.tsx +312 -0
- package/src/cards/PlanStepsCard.tsx +52 -0
- package/src/cards/QuizCard.tsx +309 -0
- package/src/cards/ResearchPlanCard.tsx +169 -0
- package/src/cards/SearchSourcesCard.tsx +244 -0
- package/src/cards/SuggestedRepliesCard.tsx +48 -0
- package/src/cards/SummaryMessageCard.tsx +145 -0
- package/src/cards/ThinkingProcessCard.tsx +155 -0
- package/src/cards/ToolExecutionCard.tsx +152 -0
- package/src/cards/cards.test.tsx +492 -0
- package/src/cards/icons.tsx +249 -0
- package/src/cards/index.ts +53 -0
- package/src/cards/types.ts +27 -0
- package/src/components/AgentSelector.stories.tsx +113 -0
- package/src/components/AgentSelector.test.tsx +70 -0
- package/src/components/AgentSelector.tsx +147 -0
- package/src/components/ChatPanel.test.tsx +130 -0
- package/src/components/ChatPanel.tsx +612 -138
- package/src/components/index.ts +13 -1
- package/src/index.ts +43 -0
- package/src/state/ChatSessionProvider.test.tsx +85 -0
- package/src/state/ChatSessionProvider.tsx +98 -0
- package/src/state/MockChatStreamTransport.stories.tsx +95 -0
- package/src/state/MockChatStreamTransport.test.ts +163 -0
- package/src/state/MockChatStreamTransport.ts +123 -0
- package/src/state/bridgeLegacySSE.test.ts +134 -0
- package/src/state/bridgeLegacySSE.ts +134 -0
- package/src/state/index.ts +82 -0
- package/src/state/parseSSE.test.ts +123 -0
- package/src/state/parseSSE.ts +123 -0
- package/src/state/useChatComposer.test.ts +145 -0
- package/src/state/useChatComposer.ts +117 -0
- package/src/state/useChatList.test.ts +135 -0
- package/src/state/useChatList.ts +217 -0
- package/src/state/useChatSession.test.ts +61 -0
- package/src/state/useChatSession.ts +64 -0
- package/src/state/useScrollLock.test.ts +99 -0
- package/src/state/useScrollLock.ts +105 -0
- package/src/state/useToolCallStream.test.ts +86 -0
- package/src/state/useToolCallStream.ts +110 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { GitBranchIcon, ListChecksIcon } from './icons.js';
|
|
3
|
+
const KIND_LABELS = {
|
|
4
|
+
fact: '事实',
|
|
5
|
+
compare: '对比',
|
|
6
|
+
conclusion: '结论',
|
|
7
|
+
risk: '风险',
|
|
8
|
+
};
|
|
9
|
+
const STATUS_LABELS = {
|
|
10
|
+
pending: '待开始',
|
|
11
|
+
searching: '检索中',
|
|
12
|
+
evidenced_strong: '强证据',
|
|
13
|
+
evidenced_medium: '中证据',
|
|
14
|
+
evidenced_weak: '弱证据',
|
|
15
|
+
conflicted: '证据冲突',
|
|
16
|
+
exhausted: '已穷尽',
|
|
17
|
+
};
|
|
18
|
+
const STATUS_COLOR = {
|
|
19
|
+
pending: 'bg-[var(--agent-muted,#f3f4f6)] text-[var(--agent-muted-foreground,#6b7280)]',
|
|
20
|
+
searching: 'bg-[var(--agent-muted,#f3f4f6)] text-[var(--agent-muted-foreground,#6b7280)]',
|
|
21
|
+
evidenced_strong: 'bg-green-500/15 text-green-700 dark:text-green-400',
|
|
22
|
+
evidenced_medium: 'bg-blue-500/15 text-blue-700 dark:text-blue-400',
|
|
23
|
+
evidenced_weak: 'bg-amber-500/15 text-amber-700 dark:text-amber-400',
|
|
24
|
+
conflicted: 'bg-red-500/15 text-red-700 dark:text-red-400',
|
|
25
|
+
exhausted: 'bg-zinc-500/15 text-zinc-700 dark:text-zinc-400',
|
|
26
|
+
};
|
|
27
|
+
const DECISION_LABEL = {
|
|
28
|
+
continue: '继续深挖',
|
|
29
|
+
expand: '横向扩展',
|
|
30
|
+
converge: '进入收敛',
|
|
31
|
+
};
|
|
32
|
+
export const ResearchPlanCard = ({ payload, totalRounds = 3, className, }) => {
|
|
33
|
+
const subQuestions = payload.subQuestions ?? [];
|
|
34
|
+
const round = Math.max(0, Math.min(totalRounds, payload.round ?? 0));
|
|
35
|
+
const progressPercent = totalRounds > 0
|
|
36
|
+
? Math.max(0, Math.min(100, (round / totalRounds) * 100))
|
|
37
|
+
: 0;
|
|
38
|
+
const decisionLabel = payload.decision &&
|
|
39
|
+
DECISION_LABEL[payload.decision.next];
|
|
40
|
+
return (_jsx("div", { className: [
|
|
41
|
+
'steerable-research-plan rounded-lg border border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-card-bg,#fff)] text-sm text-[var(--agent-foreground,#111827)]',
|
|
42
|
+
className,
|
|
43
|
+
].filter(Boolean).join(' '), children: _jsxs("div", { className: "space-y-3 p-3", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx(GitBranchIcon, { size: 14, className: "shrink-0 text-blue-500" }), _jsx("span", { className: "truncate text-sm font-medium", children: payload.topic })] }), _jsxs("div", { className: "inline-flex shrink-0 items-center gap-1", children: [_jsxs("span", { className: "rounded-full bg-[var(--agent-muted,#f3f4f6)] px-2 py-0.5 text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: ["\u7B2C ", round, "/", totalRounds, " \u8F6E"] }), payload.final && (_jsx("span", { className: "rounded-full bg-green-500/15 px-2 py-0.5 text-xs text-green-700 dark:text-green-400", children: "\u5DF2\u6536\u655B" }))] })] }), _jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-[var(--agent-muted,#f3f4f6)]", children: _jsx("div", { className: "h-full bg-blue-500 transition-all duration-200", style: { width: `${progressPercent}%` } }) })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium", children: [_jsx(ListChecksIcon, { size: 14, className: "text-blue-500" }), "\u5B50\u95EE\u9898\u72B6\u6001"] }), _jsx("div", { className: "space-y-2", children: subQuestions.map((q) => {
|
|
44
|
+
const kind = (q.kind ?? 'fact');
|
|
45
|
+
const status = (q.status ?? 'pending');
|
|
46
|
+
return (_jsxs("div", { className: "rounded-md border border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-card-bg,#fff)] p-2.5", children: [_jsxs("div", { className: "mb-1.5 flex flex-wrap items-center gap-1.5", children: [_jsx("span", { className: "rounded-full bg-[var(--agent-muted,#f3f4f6)] px-1.5 py-0.5 text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: KIND_LABELS[kind] ?? kind }), _jsx("span", { className: `rounded-full px-1.5 py-0.5 text-xs ${STATUS_COLOR[status]}`, children: STATUS_LABELS[status] ?? status }), _jsxs("span", { className: "text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: ["\u8BC1\u636E ", q.evidenceCount ?? 0] })] }), _jsx("div", { className: "text-sm", children: q.question }), q.note && (_jsx("div", { className: "mt-1 whitespace-pre-wrap text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: q.note }))] }, q.id));
|
|
47
|
+
}) })] }), payload.decision && (_jsxs("div", { className: "rounded-md border border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-muted,#f3f4f6)]/40 px-2.5 py-2", children: [_jsx("div", { className: "text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: "\u4E0B\u4E00\u6B65\u51B3\u7B56" }), _jsx("div", { className: "text-sm font-medium", children: decisionLabel ?? payload.decision.next }), payload.decision.reason && (_jsx("div", { className: "mt-0.5 whitespace-pre-wrap text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: payload.decision.reason }))] }))] }) }));
|
|
48
|
+
};
|
|
49
|
+
export default ResearchPlanCard;
|
|
50
|
+
//# sourceMappingURL=ResearchPlanCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResearchPlanCard.js","sourceRoot":"","sources":["../../src/cards/ResearchPlanCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<SearchSourcesCard />`
|
|
3
|
+
*
|
|
4
|
+
* Renders a row of stacked favicons summarising the web sources an agent
|
|
5
|
+
* consulted, plus an expandable detail panel listing each `(title, domain,
|
|
6
|
+
* snippet)` triple.
|
|
7
|
+
*
|
|
8
|
+
* Appearance variants:
|
|
9
|
+
* - `card` (default): bordered card chrome with a divided expanded list.
|
|
10
|
+
* - `inline`: no chrome around the trigger; expanded items use a borderless
|
|
11
|
+
* `:hover` background. Matches the deeppath "above the input" aesthetic.
|
|
12
|
+
*
|
|
13
|
+
* Slots:
|
|
14
|
+
* - `renderSummary(count, more)` -- replace the default "{count} 个来源" label.
|
|
15
|
+
* - `faviconUrlFor(url)` -- replace the default favicon resolver.
|
|
16
|
+
*/
|
|
17
|
+
import * as React from 'react';
|
|
18
|
+
import type { SearchSourcesPayload } from '@steerable/agent-protocol';
|
|
19
|
+
export type SearchSourcesCardAppearance = 'card' | 'inline';
|
|
20
|
+
export interface SearchSourcesCardProps {
|
|
21
|
+
payload: SearchSourcesPayload;
|
|
22
|
+
className?: string;
|
|
23
|
+
appearance?: SearchSourcesCardAppearance;
|
|
24
|
+
faviconUrlFor?: (url: string) => string | null;
|
|
25
|
+
renderSummary?: (uniqueCount: number, overflowCount: number) => React.ReactNode;
|
|
26
|
+
}
|
|
27
|
+
export declare const SearchSourcesCard: React.FC<SearchSourcesCardProps>;
|
|
28
|
+
export default SearchSourcesCard;
|
|
29
|
+
//# sourceMappingURL=SearchSourcesCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchSourcesCard.d.ts","sourceRoot":"","sources":["../../src/cards/SearchSourcesCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,2BAA2B,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CACjF;AAqDD,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAgK9D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<SearchSourcesCard />`
|
|
4
|
+
*
|
|
5
|
+
* Renders a row of stacked favicons summarising the web sources an agent
|
|
6
|
+
* consulted, plus an expandable detail panel listing each `(title, domain,
|
|
7
|
+
* snippet)` triple.
|
|
8
|
+
*
|
|
9
|
+
* Appearance variants:
|
|
10
|
+
* - `card` (default): bordered card chrome with a divided expanded list.
|
|
11
|
+
* - `inline`: no chrome around the trigger; expanded items use a borderless
|
|
12
|
+
* `:hover` background. Matches the deeppath "above the input" aesthetic.
|
|
13
|
+
*
|
|
14
|
+
* Slots:
|
|
15
|
+
* - `renderSummary(count, more)` -- replace the default "{count} 个来源" label.
|
|
16
|
+
* - `faviconUrlFor(url)` -- replace the default favicon resolver.
|
|
17
|
+
*/
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import { GlobeIcon, ChevronDownIcon, ExternalLinkIcon } from './icons.js';
|
|
20
|
+
const MAX_STACKED = 5;
|
|
21
|
+
function extractDomain(url) {
|
|
22
|
+
try {
|
|
23
|
+
return new URL(url).hostname.replace(/^www\./, '');
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return url;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function defaultFaviconUrl(url) {
|
|
30
|
+
try {
|
|
31
|
+
const host = new URL(url).hostname;
|
|
32
|
+
return `https://www.google.com/s2/favicons?sz=64&domain=${host}`;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function FaviconCircle({ src, size = 18 }) {
|
|
39
|
+
const [failed, setFailed] = React.useState(false);
|
|
40
|
+
const showFallback = !src || failed;
|
|
41
|
+
if (showFallback) {
|
|
42
|
+
return (_jsx("span", { className: "inline-flex items-center justify-center rounded-full border-2 border-[var(--agent-background,#fff)] bg-[var(--agent-muted,#f3f4f6)]", style: { width: size, height: size }, children: _jsx(GlobeIcon, { size: Math.round(size * 0.55), className: "text-[var(--agent-muted-foreground,#6b7280)]" }) }));
|
|
43
|
+
}
|
|
44
|
+
return (_jsx("img", { src: src, alt: "", width: size, height: size, className: "rounded-full border-2 border-[var(--agent-background,#fff)] bg-[var(--agent-background,#fff)] object-cover", style: { width: size, height: size }, loading: "lazy", onError: () => setFailed(true) }));
|
|
45
|
+
}
|
|
46
|
+
export const SearchSourcesCard = ({ payload, className, appearance = 'card', faviconUrlFor = defaultFaviconUrl, renderSummary, }) => {
|
|
47
|
+
const [expanded, setExpanded] = React.useState(false);
|
|
48
|
+
const sources = payload.sources ?? [];
|
|
49
|
+
const unique = React.useMemo(() => {
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
return sources.filter((s) => {
|
|
52
|
+
if (!s?.url || seen.has(s.url))
|
|
53
|
+
return false;
|
|
54
|
+
seen.add(s.url);
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
}, [sources]);
|
|
58
|
+
if (unique.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
const stacked = unique.slice(0, MAX_STACKED);
|
|
61
|
+
const more = unique.length - stacked.length;
|
|
62
|
+
const isCard = appearance === 'card';
|
|
63
|
+
const summaryLabel = renderSummary
|
|
64
|
+
? renderSummary(unique.length, more)
|
|
65
|
+
: isCard
|
|
66
|
+
? _jsxs(_Fragment, { children: [unique.length, " \u4E2A\u6765\u6E90", more > 0 ? `(+${more})` : ''] })
|
|
67
|
+
: _jsxs(_Fragment, { children: ["\u641C\u7D22\u4E86 ", unique.length, " \u4E2A\u7F51\u7AD9"] });
|
|
68
|
+
return (_jsxs("div", { className: [
|
|
69
|
+
'steerable-search-sources',
|
|
70
|
+
isCard
|
|
71
|
+
? 'rounded-lg border border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-card-bg,#fff)]'
|
|
72
|
+
: '',
|
|
73
|
+
className,
|
|
74
|
+
].filter(Boolean).join(' '), children: [_jsxs("button", { type: "button", onClick: () => setExpanded((v) => !v), className: isCard
|
|
75
|
+
? 'flex w-full items-center justify-between gap-2 px-3 py-2 text-left'
|
|
76
|
+
: 'group flex items-center gap-2 rounded-md py-1 text-sm text-[var(--agent-muted-foreground,#6b7280)] transition-colors duration-150 hover:text-[var(--agent-foreground,#111827)]', children: [_jsx("span", { className: isCard ? 'flex items-center gap-2' : 'flex items-center', children: isCard ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "flex -space-x-2", children: stacked.map((s, idx) => (_jsx(FaviconCircle, { src: s.favicon ?? faviconUrlFor(s.url) }, `${idx}-${s.url}`))) }), _jsx("span", { className: "text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: summaryLabel })] })) : (_jsx(_Fragment, { children: _jsxs("span", { className: "flex", style: { paddingLeft: 0 }, children: [stacked.map((s, i) => (_jsx("span", { className: "inline-block", style: { marginLeft: i === 0 ? 0 : -6, zIndex: MAX_STACKED - i }, children: _jsx(FaviconCircle, { src: s.favicon ?? faviconUrlFor(s.url) }) }, `${i}-${s.url}`))), more > 0 && (_jsxs("span", { className: "inline-flex items-center justify-center rounded-full border-2 border-[var(--agent-background,#fff)] bg-[var(--agent-muted,#f3f4f6)] text-[10px] font-medium text-[var(--agent-muted-foreground,#6b7280)]", style: { width: 18, height: 18, marginLeft: -6, zIndex: 0 }, children: ["+", more] }))] }) })) }), !isCard && _jsx("span", { className: "ml-2", children: summaryLabel }), _jsx(ChevronDownIcon, { size: isCard ? 14 : 14, className: [
|
|
77
|
+
isCard ? 'text-[var(--agent-muted-foreground,#6b7280)]' : 'h-3.5 w-3.5',
|
|
78
|
+
'transition-transform duration-200',
|
|
79
|
+
expanded ? 'rotate-180' : '',
|
|
80
|
+
].filter(Boolean).join(' ') })] }), expanded && (isCard ? (_jsx("ul", { className: "divide-y divide-[var(--agent-border,#e5e7eb)] border-t border-[var(--agent-border,#e5e7eb)]", children: unique.map((s, idx) => (_jsx("li", { className: "px-3 py-2 text-sm", children: _jsxs("a", { href: s.url, target: "_blank", rel: "noopener noreferrer", className: "flex items-start gap-2 text-[var(--agent-foreground,#111827)] hover:underline", children: [_jsx(FaviconCircle, { src: s.favicon ?? faviconUrlFor(s.url), size: 16 }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium", children: s.title || extractDomain(s.url) }), _jsx("span", { className: "block truncate text-xs text-[var(--agent-muted-foreground,#6b7280)]", children: extractDomain(s.url) }), s.snippet && (_jsx("span", { className: "mt-1 block text-xs text-[var(--agent-muted-foreground,#6b7280)] line-clamp-2", children: s.snippet }))] }), _jsx(ExternalLinkIcon, { size: 12, className: "mt-1 flex-shrink-0 text-[var(--agent-muted-foreground,#6b7280)]" })] }) }, `${idx}-${s.url}`))) })) : (_jsx("div", { className: "mt-1.5 flex flex-col gap-0.5", children: unique.map((s, idx) => (_jsxs("a", { href: s.url, target: "_blank", rel: "noopener noreferrer", className: "group/item flex items-center gap-2.5 rounded-md px-2 py-1.5 transition-colors duration-150 hover:bg-[var(--agent-muted,#f3f4f6)]", children: [_jsx(FaviconCircle, { src: s.favicon ?? faviconUrlFor(s.url), size: 16 }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-xs text-[var(--agent-foreground,#111827)]", children: s.title || extractDomain(s.url) }), _jsx("div", { className: "truncate text-[11px] text-[var(--agent-muted-foreground,#6b7280)]", children: extractDomain(s.url) })] }), _jsx(ExternalLinkIcon, { size: 12, className: "shrink-0 text-[var(--agent-muted-foreground,#6b7280)] opacity-0 transition-opacity group-hover/item:opacity-100" })] }, `${idx}-${s.url}`))) })))] }));
|
|
81
|
+
};
|
|
82
|
+
export default SearchSourcesCard;
|
|
83
|
+
//# sourceMappingURL=SearchSourcesCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchSourcesCard.js","sourceRoot":"","sources":["../../src/cards/SearchSourcesCard.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAY1E,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACnC,OAAO,mDAAmD,IAAI,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAyC;IAC9E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC;IAEpC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CACL,eACE,SAAS,EAAC,qIAAqI,EAC/I,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAEpC,KAAC,SAAS,IACR,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,EAC7B,SAAS,EAAC,8CAA8C,GACxD,GACG,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,GAAG,EAAC,EAAE,EACN,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,SAAS,EAAC,4GAA4G,EACtH,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EACpC,OAAO,EAAC,MAAM,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAC9B,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAClE,OAAO,EACP,SAAS,EACT,UAAU,GAAG,MAAM,EACnB,aAAa,GAAG,iBAAiB,EACjC,aAAa,GACd,EAAE,EAAE;IACH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE5C,MAAM,MAAM,GAAG,UAAU,KAAK,MAAM,CAAC;IAErC,MAAM,YAAY,GAAG,aAAa;QAChC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QACpC,CAAC,CAAC,MAAM;YACN,CAAC,CAAC,8BACG,MAAM,CAAC,MAAM,yBAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,IAC/C;YACL,CAAC,CAAC,qDAAO,MAAM,CAAC,MAAM,2BAAQ,CAAC;IAEnC,OAAO,CACL,eACE,SAAS,EAAE;YACT,0BAA0B;YAC1B,MAAM;gBACJ,CAAC,CAAC,uFAAuF;gBACzF,CAAC,CAAC,EAAE;YACN,SAAS;SACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAE3B,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACrC,SAAS,EACP,MAAM;oBACJ,CAAC,CAAC,oEAAoE;oBACtE,CAAC,CAAC,gLAAgL,aAGtL,eAAM,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,mBAAmB,YACtE,MAAM,CAAC,CAAC,CAAC,CACR,8BACE,eAAM,SAAS,EAAC,iBAAiB,YAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CACvB,KAAC,aAAa,IAAyB,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAzD,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAA4C,CAClF,CAAC,GACG,EACP,eAAM,SAAS,EAAC,sDAAsD,YACnE,YAAY,GACR,IACN,CACJ,CAAC,CAAC,CAAC,CACF,4BACE,gBAAM,SAAS,EAAC,MAAM,EAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,aAC7C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,eAEE,SAAS,EAAC,cAAc,EACxB,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,YAEhE,KAAC,aAAa,IAAC,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAI,IAJpD,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAKf,CACR,CAAC,EACD,IAAI,GAAG,CAAC,IAAI,CACX,gBACE,SAAS,EAAC,0MAA0M,EACpN,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,kBAEzD,IAAI,IACD,CACR,IACI,GACN,CACJ,GACI,EACN,CAAC,MAAM,IAAI,eAAM,SAAS,EAAC,MAAM,YAAE,YAAY,GAAQ,EACxD,KAAC,eAAe,IACd,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EACtB,SAAS,EAAE;4BACT,MAAM,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,aAAa;4BACvE,mCAAmC;4BACnC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;yBAC7B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAC3B,IACK,EACR,QAAQ,IAAI,CACX,MAAM,CAAC,CAAC,CAAC,CACP,aAAI,SAAS,EAAC,6FAA6F,YACxG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CACtB,aAA4B,SAAS,EAAC,mBAAmB,YACvD,aACE,IAAI,EAAE,CAAC,CAAC,GAAG,EACX,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,+EAA+E,aAEzF,KAAC,aAAa,IAAC,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAI,EACnE,gBAAM,SAAS,EAAC,gBAAgB,aAC9B,eAAM,SAAS,EAAC,4BAA4B,YAAE,CAAC,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAQ,EACrF,eAAM,SAAS,EAAC,qEAAqE,YAClF,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAChB,EACN,CAAC,CAAC,OAAO,IAAI,CACZ,eAAM,SAAS,EAAC,8EAA8E,YAC3F,CAAC,CAAC,OAAO,GACL,CACR,IACI,EACP,KAAC,gBAAgB,IACf,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,iEAAiE,GAC3E,IACA,IAvBG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAwBrB,CACN,CAAC,GACC,CACN,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,8BAA8B,YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CACtB,aAEE,IAAI,EAAE,CAAC,CAAC,GAAG,EACX,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,kIAAkI,aAE5I,KAAC,aAAa,IAAC,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAI,EACnE,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,yDAAyD,YACrE,CAAC,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAC5B,EACN,cAAK,SAAS,EAAC,mEAAmE,YAC/E,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GACjB,IACF,EACN,KAAC,gBAAgB,IACf,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,iHAAiH,GAC3H,KAlBG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAmBpB,CACL,CAAC,GACE,CACP,CACF,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<SuggestedRepliesCard />`
|
|
3
|
+
*
|
|
4
|
+
* Quick-reply chips rendered below the composer. The card is pure presentation:
|
|
5
|
+
* the parent decides where to mount it and what `onSelect` does (typically:
|
|
6
|
+
* push the chosen text into the composer and submit).
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import type { SuggestedRepliesPayload } from '@steerable/agent-protocol';
|
|
10
|
+
export interface SuggestedRepliesCardProps {
|
|
11
|
+
payload: SuggestedRepliesPayload;
|
|
12
|
+
onSelect: (text: string) => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
buttonClassName?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const SuggestedRepliesCard: React.FC<SuggestedRepliesCardProps>;
|
|
17
|
+
export default SuggestedRepliesCard;
|
|
18
|
+
//# sourceMappingURL=SuggestedRepliesCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SuggestedRepliesCard.d.ts","sourceRoot":"","sources":["../../src/cards/SuggestedRepliesCard.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEzE,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,uBAAuB,CAAC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CA4BpE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export const SuggestedRepliesCard = ({ payload, onSelect, className, buttonClassName, }) => {
|
|
3
|
+
const suggestions = payload.suggestions ?? [];
|
|
4
|
+
if (suggestions.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
return (_jsx("div", { className: ['steerable-suggested-replies flex flex-wrap gap-2 py-2', className].filter(Boolean).join(' '), children: suggestions.map((text, idx) => (_jsx("button", { type: "button", onClick: () => onSelect(text), className: [
|
|
7
|
+
'rounded-full border px-3 py-1.5 text-sm transition-colors duration-150',
|
|
8
|
+
'border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-card-bg,#f9fafb)]',
|
|
9
|
+
'text-[var(--agent-foreground,#111827)] hover:bg-[var(--agent-accent,#e5e7eb)]',
|
|
10
|
+
buttonClassName,
|
|
11
|
+
].filter(Boolean).join(' '), children: text }, `${idx}-${text}`))) }));
|
|
12
|
+
};
|
|
13
|
+
export default SuggestedRepliesCard;
|
|
14
|
+
//# sourceMappingURL=SuggestedRepliesCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SuggestedRepliesCard.js","sourceRoot":"","sources":["../../src/cards/SuggestedRepliesCard.tsx"],"names":[],"mappings":";AAiBA,MAAM,CAAC,MAAM,oBAAoB,GAAwC,CAAC,EACxE,OAAO,EACP,QAAQ,EACR,SAAS,EACT,eAAe,GAChB,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,OAAO,CACL,cAAK,SAAS,EAAE,CAAC,uDAAuD,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAC3G,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAC9B,iBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC7B,SAAS,EAAE;gBACT,wEAAwE;gBACxE,wEAAwE;gBACxE,+EAA+E;gBAC/E,eAAe;aAChB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAE1B,IAAI,IAVA,GAAG,GAAG,IAAI,IAAI,EAAE,CAWd,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<SummaryMessageCard />`
|
|
3
|
+
*
|
|
4
|
+
* Compact summary of N previous messages (e.g. history compaction). Collapsed
|
|
5
|
+
* by default so it doesn't dominate the chat scrollback.
|
|
6
|
+
*
|
|
7
|
+
* Appearance variants:
|
|
8
|
+
* - `card` (default): bordered chrome.
|
|
9
|
+
* - `inline`: a small pill button + indented body block below. Matches the
|
|
10
|
+
* deeppath "above the input" aesthetic.
|
|
11
|
+
*
|
|
12
|
+
* Slots:
|
|
13
|
+
* - `renderMarkdown(body)` -- supply your own markdown renderer.
|
|
14
|
+
* - `renderLabel({ isPending, count })` -- replace the trigger label.
|
|
15
|
+
* - `renderToggle({ expanded, canToggle })` -- replace the toggle chevron + text.
|
|
16
|
+
*/
|
|
17
|
+
import * as React from 'react';
|
|
18
|
+
import type { SummaryMessagePayload } from '@steerable/agent-protocol';
|
|
19
|
+
import { type RenderSlotResult } from './types.js';
|
|
20
|
+
export type SummaryMessageCardAppearance = 'card' | 'inline';
|
|
21
|
+
export interface SummaryMessageLabelArgs {
|
|
22
|
+
isPending: boolean;
|
|
23
|
+
count: number | null;
|
|
24
|
+
}
|
|
25
|
+
export interface SummaryMessageToggleArgs {
|
|
26
|
+
expanded: boolean;
|
|
27
|
+
canToggle: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface SummaryMessageCardProps {
|
|
30
|
+
payload: SummaryMessagePayload;
|
|
31
|
+
renderMarkdown?: (body: string) => RenderSlotResult;
|
|
32
|
+
renderLabel?: (args: SummaryMessageLabelArgs) => RenderSlotResult;
|
|
33
|
+
renderToggle?: (args: SummaryMessageToggleArgs) => RenderSlotResult;
|
|
34
|
+
appearance?: SummaryMessageCardAppearance;
|
|
35
|
+
className?: string;
|
|
36
|
+
defaultExpanded?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare const SummaryMessageCard: React.FC<SummaryMessageCardProps>;
|
|
39
|
+
export default SummaryMessageCard;
|
|
40
|
+
//# sourceMappingURL=SummaryMessageCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryMessageCard.d.ts","sourceRoot":"","sources":["../../src/cards/SummaryMessageCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,gBAAgB,CAAC;IAClE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,gBAAgB,CAAC;IACpE,UAAU,CAAC,EAAE,4BAA4B,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAmGhE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<SummaryMessageCard />`
|
|
4
|
+
*
|
|
5
|
+
* Compact summary of N previous messages (e.g. history compaction). Collapsed
|
|
6
|
+
* by default so it doesn't dominate the chat scrollback.
|
|
7
|
+
*
|
|
8
|
+
* Appearance variants:
|
|
9
|
+
* - `card` (default): bordered chrome.
|
|
10
|
+
* - `inline`: a small pill button + indented body block below. Matches the
|
|
11
|
+
* deeppath "above the input" aesthetic.
|
|
12
|
+
*
|
|
13
|
+
* Slots:
|
|
14
|
+
* - `renderMarkdown(body)` -- supply your own markdown renderer.
|
|
15
|
+
* - `renderLabel({ isPending, count })` -- replace the trigger label.
|
|
16
|
+
* - `renderToggle({ expanded, canToggle })` -- replace the toggle chevron + text.
|
|
17
|
+
*/
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import { ArchiveIcon, ChevronDownIcon, ChevronRightIcon, LoaderIcon } from './icons.js';
|
|
20
|
+
import { asReactNode } from './types.js';
|
|
21
|
+
export const SummaryMessageCard = ({ payload, renderMarkdown, renderLabel, renderToggle, appearance = 'card', className, defaultExpanded = false, }) => {
|
|
22
|
+
const [expanded, setExpanded] = React.useState(defaultExpanded);
|
|
23
|
+
const isPending = payload.status === 'pending';
|
|
24
|
+
const count = typeof payload.summarizedCount === 'number' && payload.summarizedCount > 0
|
|
25
|
+
? payload.summarizedCount
|
|
26
|
+
: null;
|
|
27
|
+
const hasBody = Boolean(payload.body && payload.body.trim());
|
|
28
|
+
const canToggle = !isPending && hasBody;
|
|
29
|
+
const defaultLabel = isPending
|
|
30
|
+
? '总结中…'
|
|
31
|
+
: `历史摘要${count ? `(${count} 条消息)` : ''}`;
|
|
32
|
+
const labelNode = renderLabel
|
|
33
|
+
? asReactNode(renderLabel({ isPending, count }))
|
|
34
|
+
: defaultLabel;
|
|
35
|
+
const defaultToggle = expanded
|
|
36
|
+
? _jsx(ChevronDownIcon, { size: 12 })
|
|
37
|
+
: _jsx(ChevronRightIcon, { size: 12 });
|
|
38
|
+
const toggleNode = renderToggle
|
|
39
|
+
? asReactNode(renderToggle({ expanded, canToggle }))
|
|
40
|
+
: defaultToggle;
|
|
41
|
+
const body = expanded && canToggle ? (renderMarkdown ? (asReactNode(renderMarkdown(payload.body))) : (_jsx("pre", { className: "whitespace-pre-wrap break-words font-sans", children: payload.body }))) : null;
|
|
42
|
+
if (appearance === 'inline') {
|
|
43
|
+
return (_jsxs("div", { className: ['steerable-summary-message', className].filter(Boolean).join(' '), children: [_jsxs("button", { type: "button", onClick: () => canToggle && setExpanded((v) => !v), disabled: !canToggle, className: [
|
|
44
|
+
'group inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-[11px] leading-none text-[var(--agent-muted-foreground,#6b7280)] transition-colors',
|
|
45
|
+
canToggle
|
|
46
|
+
? 'cursor-pointer hover:bg-[var(--agent-muted,#f3f4f6)] hover:text-[var(--agent-foreground,#111827)]'
|
|
47
|
+
: 'cursor-default',
|
|
48
|
+
].join(' '), children: [isPending ? (_jsx(LoaderIcon, { size: 12, className: "animate-spin" })) : (_jsx(ArchiveIcon, { size: 12 })), _jsx("span", { children: labelNode }), canToggle && (_jsx("span", { className: "inline-flex items-center gap-0.5 opacity-60 group-hover:opacity-100", children: toggleNode }))] }), body && (_jsx("div", { className: "ml-3 mt-1.5 rounded-md border border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-muted,#f3f4f6)]/30 px-3 py-2 text-[12px] leading-relaxed text-[var(--agent-muted-foreground,#6b7280)]", children: body }))] }));
|
|
49
|
+
}
|
|
50
|
+
return (_jsxs("div", { className: [
|
|
51
|
+
'steerable-summary-message rounded-lg border border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-muted,#f3f4f6)]/40 text-xs',
|
|
52
|
+
className,
|
|
53
|
+
].filter(Boolean).join(' '), children: [_jsxs("button", { type: "button", onClick: () => canToggle && setExpanded((v) => !v), disabled: !canToggle, className: "flex w-full items-center gap-2 px-3 py-2 text-left text-[var(--agent-muted-foreground,#6b7280)]", children: [isPending ? _jsx(LoaderIcon, { size: 12 }) : _jsx(ArchiveIcon, { size: 12 }), _jsx("span", { children: labelNode }), canToggle && _jsx("span", { className: "ml-auto", children: toggleNode })] }), body && (_jsx("div", { className: "border-t border-[var(--agent-border,#e5e7eb)] px-3 py-2 text-[var(--agent-foreground,#111827)]", children: body }))] }));
|
|
54
|
+
};
|
|
55
|
+
export default SummaryMessageCard;
|
|
56
|
+
//# sourceMappingURL=SummaryMessageCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryMessageCard.js","sourceRoot":"","sources":["../../src/cards/SummaryMessageCard.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,WAAW,EAAyB,MAAM,YAAY,CAAC;AAwBhE,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EACpE,OAAO,EACP,cAAc,EACd,WAAW,EACX,YAAY,EACZ,UAAU,GAAG,MAAM,EACnB,SAAS,EACT,eAAe,GAAG,KAAK,GACxB,EAAE,EAAE;IACH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;IAC/C,MAAM,KAAK,GACT,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,IAAI,OAAO,CAAC,eAAe,GAAG,CAAC;QACxE,CAAC,CAAC,OAAO,CAAC,eAAe;QACzB,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC;IAExC,MAAM,YAAY,GAAG,SAAS;QAC5B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAoB,WAAW;QAC5C,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,YAAY,CAAC;IAEjB,MAAM,aAAa,GAAG,QAAQ;QAC5B,CAAC,CAAC,KAAC,eAAe,IAAC,IAAI,EAAE,EAAE,GAAI;QAC/B,CAAC,CAAC,KAAC,gBAAgB,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC;IACnC,MAAM,UAAU,GAAoB,YAAY;QAC9C,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,aAAa,CAAC;IAElB,MAAM,IAAI,GAAoB,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,CACpD,cAAc,CAAC,CAAC,CAAC,CACf,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAC1C,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,2CAA2C,YAAE,OAAO,CAAC,IAAI,GAAO,CAChF,CACF,CAAC,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAChF,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAClD,QAAQ,EAAE,CAAC,SAAS,EACpB,SAAS,EAAE;wBACT,qJAAqJ;wBACrJ,SAAS;4BACP,CAAC,CAAC,mGAAmG;4BACrG,CAAC,CAAC,gBAAgB;qBACrB,CAAC,IAAI,CAAC,GAAG,CAAC,aAEV,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,GAAG,CAClD,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,CAC1B,EACD,yBAAO,SAAS,GAAQ,EACvB,SAAS,IAAI,CACZ,eAAM,SAAS,EAAC,qEAAqE,YAClF,UAAU,GACN,CACR,IACM,EACR,IAAI,IAAI,CACP,cAAK,SAAS,EAAC,0LAA0L,YACtM,IAAI,GACD,CACP,IACG,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eACE,SAAS,EAAE;YACT,6HAA6H;YAC7H,SAAS;SACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAE3B,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAClD,QAAQ,EAAE,CAAC,SAAS,EACpB,SAAS,EAAC,iGAAiG,aAE1G,SAAS,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,EACjE,yBAAO,SAAS,GAAQ,EACvB,SAAS,IAAI,eAAM,SAAS,EAAC,SAAS,YAAE,UAAU,GAAQ,IACpD,EACR,IAAI,IAAI,CACP,cAAK,SAAS,EAAC,gGAAgG,YAC5G,IAAI,GACD,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ThinkingProcessCard />`
|
|
3
|
+
*
|
|
4
|
+
* Collapsible chain-of-thought panel.
|
|
5
|
+
*
|
|
6
|
+
* Behaviour switches:
|
|
7
|
+
* - `isStreaming` paints the card with a soft pulsing border to convey
|
|
8
|
+
* "thoughts still arriving".
|
|
9
|
+
* - `autoExpandWhileStreaming` opens the panel automatically when streaming
|
|
10
|
+
* starts; `autoCollapseOnComplete` closes it once streaming finishes.
|
|
11
|
+
* - Controlled mode: pass `expanded` + `onExpandedChange` to delegate the
|
|
12
|
+
* open/close state (used by host apps that persist expansion in a
|
|
13
|
+
* context like deeppath's `MessageListContext`).
|
|
14
|
+
*
|
|
15
|
+
* Slots:
|
|
16
|
+
* - `renderMarkdown(body)`: replace the default `<pre>` body renderer.
|
|
17
|
+
* - `renderLabel({ isStreaming, isExpanded })`: replace the trigger label
|
|
18
|
+
* (deeppath uses "正在思考:...", "思考过程", "下一步推理"... variants).
|
|
19
|
+
* - `renderStreamingFooter`: extra content rendered below the body while
|
|
20
|
+
* streaming (deeppath shows a pulsing "思考中..." line).
|
|
21
|
+
* - `bodyClassName` overrides default compact body typography.
|
|
22
|
+
*/
|
|
23
|
+
import * as React from 'react';
|
|
24
|
+
import type { ThinkingProcessPayload } from '@steerable/agent-protocol';
|
|
25
|
+
import { type RenderSlotResult } from './types.js';
|
|
26
|
+
export interface ThinkingProcessLabelArgs {
|
|
27
|
+
isStreaming: boolean;
|
|
28
|
+
isExpanded: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ThinkingProcessCardProps {
|
|
31
|
+
payload: ThinkingProcessPayload;
|
|
32
|
+
renderMarkdown?: (body: string) => RenderSlotResult;
|
|
33
|
+
renderLabel?: (args: ThinkingProcessLabelArgs) => RenderSlotResult;
|
|
34
|
+
renderStreamingFooter?: () => RenderSlotResult;
|
|
35
|
+
className?: string;
|
|
36
|
+
bodyClassName?: string;
|
|
37
|
+
isStreaming?: boolean;
|
|
38
|
+
expanded?: boolean;
|
|
39
|
+
onExpandedChange?: (next: boolean) => void;
|
|
40
|
+
autoExpandWhileStreaming?: boolean;
|
|
41
|
+
autoCollapseOnComplete?: boolean;
|
|
42
|
+
durationMs?: number | null;
|
|
43
|
+
}
|
|
44
|
+
export declare const ThinkingProcessCard: React.FC<ThinkingProcessCardProps>;
|
|
45
|
+
export default ThinkingProcessCard;
|
|
46
|
+
//# sourceMappingURL=ThinkingProcessCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThinkingProcessCard.d.ts","sourceRoot":"","sources":["../../src/cards/ThinkingProcessCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,sBAAsB,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,gBAAgB,CAAC;IACnE,qBAAqB,CAAC,EAAE,MAAM,gBAAgB,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAOD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAoGlE,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<ThinkingProcessCard />`
|
|
4
|
+
*
|
|
5
|
+
* Collapsible chain-of-thought panel.
|
|
6
|
+
*
|
|
7
|
+
* Behaviour switches:
|
|
8
|
+
* - `isStreaming` paints the card with a soft pulsing border to convey
|
|
9
|
+
* "thoughts still arriving".
|
|
10
|
+
* - `autoExpandWhileStreaming` opens the panel automatically when streaming
|
|
11
|
+
* starts; `autoCollapseOnComplete` closes it once streaming finishes.
|
|
12
|
+
* - Controlled mode: pass `expanded` + `onExpandedChange` to delegate the
|
|
13
|
+
* open/close state (used by host apps that persist expansion in a
|
|
14
|
+
* context like deeppath's `MessageListContext`).
|
|
15
|
+
*
|
|
16
|
+
* Slots:
|
|
17
|
+
* - `renderMarkdown(body)`: replace the default `<pre>` body renderer.
|
|
18
|
+
* - `renderLabel({ isStreaming, isExpanded })`: replace the trigger label
|
|
19
|
+
* (deeppath uses "正在思考:...", "思考过程", "下一步推理"... variants).
|
|
20
|
+
* - `renderStreamingFooter`: extra content rendered below the body while
|
|
21
|
+
* streaming (deeppath shows a pulsing "思考中..." line).
|
|
22
|
+
* - `bodyClassName` overrides default compact body typography.
|
|
23
|
+
*/
|
|
24
|
+
import * as React from 'react';
|
|
25
|
+
import { ChevronDownIcon, ChevronRightIcon } from './icons.js';
|
|
26
|
+
import { asReactNode } from './types.js';
|
|
27
|
+
function formatDuration(ms) {
|
|
28
|
+
if (!ms || ms <= 0)
|
|
29
|
+
return null;
|
|
30
|
+
return `${(ms / 1000).toFixed(1)}秒`;
|
|
31
|
+
}
|
|
32
|
+
export const ThinkingProcessCard = ({ payload, renderMarkdown, renderLabel, renderStreamingFooter, className, bodyClassName, isStreaming = false, expanded: expandedProp, onExpandedChange, autoExpandWhileStreaming = false, autoCollapseOnComplete = false, durationMs = null, }) => {
|
|
33
|
+
const isControlled = expandedProp !== undefined;
|
|
34
|
+
const [internalExpanded, setInternalExpanded] = React.useState(Boolean(payload.defaultExpanded));
|
|
35
|
+
const expanded = isControlled ? Boolean(expandedProp) : internalExpanded;
|
|
36
|
+
const setExpanded = React.useCallback((next) => {
|
|
37
|
+
if (!isControlled)
|
|
38
|
+
setInternalExpanded(next);
|
|
39
|
+
onExpandedChange?.(next);
|
|
40
|
+
}, [isControlled, onExpandedChange]);
|
|
41
|
+
const prevStreamingRef = React.useRef(isStreaming);
|
|
42
|
+
React.useEffect(() => {
|
|
43
|
+
const wasStreaming = prevStreamingRef.current;
|
|
44
|
+
if (autoExpandWhileStreaming && isStreaming && !expanded && payload.body?.trim()) {
|
|
45
|
+
setExpanded(true);
|
|
46
|
+
}
|
|
47
|
+
if (autoCollapseOnComplete && wasStreaming && !isStreaming && expanded) {
|
|
48
|
+
setExpanded(false);
|
|
49
|
+
}
|
|
50
|
+
prevStreamingRef.current = isStreaming;
|
|
51
|
+
}, [
|
|
52
|
+
isStreaming,
|
|
53
|
+
expanded,
|
|
54
|
+
autoExpandWhileStreaming,
|
|
55
|
+
autoCollapseOnComplete,
|
|
56
|
+
payload.body,
|
|
57
|
+
setExpanded,
|
|
58
|
+
]);
|
|
59
|
+
const showBody = expanded || (isStreaming && Boolean(payload.body));
|
|
60
|
+
const duration = formatDuration(durationMs);
|
|
61
|
+
const defaultLabel = isStreaming ? '正在思考...' : '思考过程';
|
|
62
|
+
const labelNode = renderLabel
|
|
63
|
+
? asReactNode(renderLabel({ isStreaming, isExpanded: expanded }))
|
|
64
|
+
: defaultLabel;
|
|
65
|
+
const defaultBodyClasses = 'whitespace-pre-wrap break-words font-sans text-xs leading-relaxed text-[var(--agent-muted-foreground,#6b7280)]';
|
|
66
|
+
return (_jsxs("div", { className: ['steerable-thinking-process', className].filter(Boolean).join(' '), children: [_jsxs("button", { type: "button", onClick: () => setExpanded(!expanded), className: [
|
|
67
|
+
'flex items-center gap-1 text-xs transition-colors duration-200',
|
|
68
|
+
isStreaming
|
|
69
|
+
? 'font-medium text-[var(--agent-foreground,#111827)]'
|
|
70
|
+
: 'text-[var(--agent-muted-foreground,#6b7280)] hover:text-[var(--agent-foreground,#111827)]',
|
|
71
|
+
].join(' '), children: [expanded ? _jsx(ChevronDownIcon, { size: 14 }) : _jsx(ChevronRightIcon, { size: 14 }), _jsx("span", { children: labelNode }), duration && !isStreaming && (_jsxs("span", { className: "ml-1 text-[var(--agent-muted-foreground,#6b7280)]", children: ["(", duration, ")"] })), isStreaming && !expanded && (_jsx("span", { "aria-hidden": true, className: "ml-1 inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-[var(--agent-muted-foreground,#6b7280)]" }))] }), showBody && (_jsxs("div", { className: [
|
|
72
|
+
'mt-1 overflow-hidden rounded-lg border p-3',
|
|
73
|
+
isStreaming
|
|
74
|
+
? 'border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-muted,#f3f4f6)]/30 shadow-sm animate-pulse'
|
|
75
|
+
: 'border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-muted,#f3f4f6)]/30',
|
|
76
|
+
].join(' '), children: [_jsx("div", { className: bodyClassName ?? defaultBodyClasses, children: renderMarkdown ? asReactNode(renderMarkdown(payload.body)) : payload.body }), isStreaming && renderStreamingFooter && (_jsx("div", { className: "mt-2", children: asReactNode(renderStreamingFooter()) }))] }))] }));
|
|
77
|
+
};
|
|
78
|
+
export default ThinkingProcessCard;
|
|
79
|
+
//# sourceMappingURL=ThinkingProcessCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThinkingProcessCard.js","sourceRoot":"","sources":["../../src/cards/ThinkingProcessCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ToolExecutionCard />`
|
|
3
|
+
*
|
|
4
|
+
* Unified renderer for a single tool / action invocation. Replaces both
|
|
5
|
+
* deeppath's ActionSegment inline strip and deeppath-agent's
|
|
6
|
+
* ExecutedActionsCard: one row per call with status / duration / expandable
|
|
7
|
+
* args + output JSON. The optional `renderArgs` / `renderOutput` slots let an
|
|
8
|
+
* app substitute a custom JSON viewer or rich payload renderer.
|
|
9
|
+
*/
|
|
10
|
+
import * as React from 'react';
|
|
11
|
+
import type { ToolExecutionPayload } from '@steerable/agent-protocol';
|
|
12
|
+
export interface ToolExecutionCardProps {
|
|
13
|
+
payload: ToolExecutionPayload;
|
|
14
|
+
className?: string;
|
|
15
|
+
defaultExpanded?: boolean;
|
|
16
|
+
renderArgs?: (args: unknown) => React.ReactNode;
|
|
17
|
+
renderOutput?: (output: unknown) => React.ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export declare const ToolExecutionCard: React.FC<ToolExecutionCardProps>;
|
|
20
|
+
export default ToolExecutionCard;
|
|
21
|
+
//# sourceMappingURL=ToolExecutionCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolExecutionCard.d.ts","sourceRoot":"","sources":["../../src/cards/ToolExecutionCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AA8BtE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IAChD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD;AAiCD,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAsE9D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<ToolExecutionCard />`
|
|
4
|
+
*
|
|
5
|
+
* Unified renderer for a single tool / action invocation. Replaces both
|
|
6
|
+
* deeppath's ActionSegment inline strip and deeppath-agent's
|
|
7
|
+
* ExecutedActionsCard: one row per call with status / duration / expandable
|
|
8
|
+
* args + output JSON. The optional `renderArgs` / `renderOutput` slots let an
|
|
9
|
+
* app substitute a custom JSON viewer or rich payload renderer.
|
|
10
|
+
*/
|
|
11
|
+
import * as React from 'react';
|
|
12
|
+
import { CheckIcon, LoaderIcon, AlertIcon, ZapIcon, ChevronDownIcon, ChevronRightIcon, PlayIcon, StopIcon, } from './icons.js';
|
|
13
|
+
const STATUS_LABEL = {
|
|
14
|
+
pending: '待执行',
|
|
15
|
+
running: '执行中',
|
|
16
|
+
succeeded: '已完成',
|
|
17
|
+
failed: '失败',
|
|
18
|
+
cancelled: '已取消',
|
|
19
|
+
};
|
|
20
|
+
const STATUS_TONE = {
|
|
21
|
+
pending: 'text-[var(--agent-muted-foreground,#6b7280)]',
|
|
22
|
+
running: 'text-amber-600',
|
|
23
|
+
succeeded: 'text-emerald-600',
|
|
24
|
+
failed: 'text-rose-600',
|
|
25
|
+
cancelled: 'text-[var(--agent-muted-foreground,#9ca3af)]',
|
|
26
|
+
};
|
|
27
|
+
function StatusIcon({ status }) {
|
|
28
|
+
const cls = STATUS_TONE[status];
|
|
29
|
+
switch (status) {
|
|
30
|
+
case 'running':
|
|
31
|
+
return _jsx(LoaderIcon, { size: 12, className: cls });
|
|
32
|
+
case 'succeeded':
|
|
33
|
+
return _jsx(CheckIcon, { size: 12, className: cls });
|
|
34
|
+
case 'failed':
|
|
35
|
+
return _jsx(AlertIcon, { size: 12, className: cls });
|
|
36
|
+
case 'cancelled':
|
|
37
|
+
return _jsx(StopIcon, { size: 12, className: cls });
|
|
38
|
+
default:
|
|
39
|
+
return _jsx(PlayIcon, { size: 12, className: cls });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function defaultRender(value) {
|
|
43
|
+
if (value === undefined || value === null)
|
|
44
|
+
return null;
|
|
45
|
+
let text;
|
|
46
|
+
try {
|
|
47
|
+
text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
text = String(value);
|
|
51
|
+
}
|
|
52
|
+
return (_jsx("pre", { className: "whitespace-pre-wrap break-words rounded bg-[var(--agent-muted,#f3f4f6)] px-2 py-1.5 text-[11px] text-[var(--agent-foreground,#111827)]", children: text }));
|
|
53
|
+
}
|
|
54
|
+
export const ToolExecutionCard = ({ payload, className, defaultExpanded = false, renderArgs, renderOutput, }) => {
|
|
55
|
+
const expandable = payload.expandable !== false;
|
|
56
|
+
const [expanded, setExpanded] = React.useState(defaultExpanded);
|
|
57
|
+
const status = (payload.status ?? 'pending');
|
|
58
|
+
return (_jsxs("div", { className: [
|
|
59
|
+
'steerable-tool-execution rounded-lg border border-[var(--agent-border,#e5e7eb)] bg-[var(--agent-card-bg,#fff)] text-xs',
|
|
60
|
+
className,
|
|
61
|
+
].filter(Boolean).join(' '), children: [_jsxs("button", { type: "button", onClick: () => expandable && setExpanded((v) => !v), className: "flex w-full items-center gap-2 px-3 py-2 text-left", "aria-expanded": expanded, "aria-disabled": !expandable, children: [expandable &&
|
|
62
|
+
(expanded ? _jsx(ChevronDownIcon, { size: 12 }) : _jsx(ChevronRightIcon, { size: 12 })), _jsx(ZapIcon, { size: 12, className: "text-[var(--agent-muted-foreground,#6b7280)]" }), _jsx("span", { className: "font-medium text-[var(--agent-foreground,#111827)]", children: payload.name }), payload.summary && (_jsx("span", { className: "truncate text-[var(--agent-muted-foreground,#6b7280)]", children: payload.summary })), _jsxs("span", { className: "ml-auto inline-flex items-center gap-1", children: [_jsx(StatusIcon, { status: status }), _jsx("span", { className: STATUS_TONE[status], children: STATUS_LABEL[status] }), typeof payload.durationMs === 'number' && (_jsxs("span", { className: "text-[var(--agent-muted-foreground,#9ca3af)]", children: ["\u00B7 ", payload.durationMs, "ms"] }))] })] }), expandable && expanded && (_jsxs("div", { className: "space-y-2 border-t border-[var(--agent-border,#e5e7eb)] px-3 py-2", children: [payload.args !== undefined && (_jsxs("section", { children: [_jsx("div", { className: "mb-1 text-[10px] uppercase tracking-wider text-[var(--agent-muted-foreground,#6b7280)]", children: "\u8F93\u5165" }), renderArgs ? renderArgs(payload.args) : defaultRender(payload.args)] })), payload.output !== undefined && (_jsxs("section", { children: [_jsx("div", { className: "mb-1 text-[10px] uppercase tracking-wider text-[var(--agent-muted-foreground,#6b7280)]", children: "\u8F93\u51FA" }), renderOutput ? renderOutput(payload.output) : defaultRender(payload.output)] })), payload.error && (_jsxs("section", { children: [_jsx("div", { className: "mb-1 text-[10px] uppercase tracking-wider text-rose-600", children: "\u9519\u8BEF" }), _jsx("pre", { className: "whitespace-pre-wrap break-words rounded bg-rose-50/60 px-2 py-1.5 text-[11px] text-rose-700", children: payload.error })] }))] }))] }));
|
|
63
|
+
};
|
|
64
|
+
export default ToolExecutionCard;
|
|
65
|
+
//# sourceMappingURL=ToolExecutionCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolExecutionCard.js","sourceRoot":"","sources":["../../src/cards/ToolExecutionCard.tsx"],"names":[],"mappings":"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"}
|