@steerable/agent-ui 0.2.3 → 0.2.5
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/hooks/useChatStream.d.ts +15 -0
- package/dist/hooks/useChatStream.d.ts.map +1 -1
- package/dist/hooks/useChatStream.js +13 -1
- package/dist/hooks/useChatStream.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 +73 -0
- package/dist/state/useChatList.d.ts.map +1 -0
- package/dist/state/useChatList.js +161 -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 +11 -3
- 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/hooks/useChatStream.test.ts +78 -0
- package/src/hooks/useChatStream.ts +32 -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 +220 -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,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `useToolCallStream` — turn the assistant message's `toolCalls` / `toolResult`
|
|
3
|
+
* (as maintained by `useChatStream`) into a derived `{ id -> {call, result,
|
|
4
|
+
* status, mode} }` map, so renderers can show per-call cards without
|
|
5
|
+
* threading status through the tree manually.
|
|
6
|
+
*
|
|
7
|
+
* Aggregates `useToolCallStatus` across all tool calls on a single message.
|
|
8
|
+
* Pure derivation, no I/O.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { useMemo } from 'react';
|
|
12
|
+
import type { ChatMessage, ToolCall, ToolResult } from '@steerable/agent-protocol';
|
|
13
|
+
import {
|
|
14
|
+
useToolCallStatus,
|
|
15
|
+
type ToolCallMode,
|
|
16
|
+
type ToolCallStatus,
|
|
17
|
+
} from '../hooks/useToolCallStatus.js';
|
|
18
|
+
|
|
19
|
+
export interface ToolCallEntry {
|
|
20
|
+
call: ToolCall;
|
|
21
|
+
result?: ToolResult;
|
|
22
|
+
status: ToolCallStatus;
|
|
23
|
+
mode: ToolCallMode;
|
|
24
|
+
isDestructive: boolean;
|
|
25
|
+
requiresApproval: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface UseToolCallStreamOptions {
|
|
29
|
+
message: ChatMessage | null | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Optional per-call result lookup — when the runtime emits `tool_result`
|
|
32
|
+
* with a `callId`, we can pair it to the originating call rather than
|
|
33
|
+
* relying on `message.toolResult` (which always holds the last result).
|
|
34
|
+
*/
|
|
35
|
+
resultByCallId?: Record<string, ToolResult>;
|
|
36
|
+
/** Optional mode override per tool name. */
|
|
37
|
+
modeByName?: Record<string, ToolCallMode>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface UseToolCallStreamReturn {
|
|
41
|
+
entries: ToolCallEntry[];
|
|
42
|
+
pendingCount: number;
|
|
43
|
+
errorCount: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function useToolCallStream(
|
|
47
|
+
options: UseToolCallStreamOptions,
|
|
48
|
+
): UseToolCallStreamReturn {
|
|
49
|
+
const message = options.message ?? null;
|
|
50
|
+
return useMemo(() => {
|
|
51
|
+
if (!message || !Array.isArray(message.toolCalls)) {
|
|
52
|
+
return { entries: [], pendingCount: 0, errorCount: 0 };
|
|
53
|
+
}
|
|
54
|
+
const entries: ToolCallEntry[] = message.toolCalls.map((call) => {
|
|
55
|
+
const lookup = options.resultByCallId?.[call.id];
|
|
56
|
+
const fallback =
|
|
57
|
+
message.toolResult && (message.toolResult as { callId?: string }).callId === call.id
|
|
58
|
+
? message.toolResult
|
|
59
|
+
: undefined;
|
|
60
|
+
const result = lookup ?? fallback ?? message.toolResult;
|
|
61
|
+
const status = deriveStatus(result);
|
|
62
|
+
const mode = options.modeByName?.[call.name] ?? inferMode(call.name);
|
|
63
|
+
return {
|
|
64
|
+
call,
|
|
65
|
+
result,
|
|
66
|
+
status,
|
|
67
|
+
mode,
|
|
68
|
+
isDestructive: mode === 'destructive',
|
|
69
|
+
requiresApproval: mode === 'local',
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
entries,
|
|
74
|
+
pendingCount: entries.filter((e) => e.status === 'pending').length,
|
|
75
|
+
errorCount: entries.filter((e) => e.status === 'error').length,
|
|
76
|
+
};
|
|
77
|
+
}, [message, options.resultByCallId, options.modeByName]);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// `useToolCallStatus` is per-call; this hook is the bulk variant. We keep the
|
|
81
|
+
// inference rules in sync by re-using the same heuristics here.
|
|
82
|
+
|
|
83
|
+
const READ_PATTERNS = [/^get[_-]/, /^list[_-]/, /^read[_-]/, /^search[_-]/];
|
|
84
|
+
const DESTRUCTIVE_PATTERNS = [
|
|
85
|
+
/^delete[_-]/,
|
|
86
|
+
/^remove[_-]/,
|
|
87
|
+
/^archive[_-]/,
|
|
88
|
+
/^purge[_-]/,
|
|
89
|
+
/^drop[_-]/,
|
|
90
|
+
];
|
|
91
|
+
const SAFE_WRITE_PATTERNS = [/^create[_-]/, /^update[_-]/, /^add[_-]/, /^set[_-]/];
|
|
92
|
+
const LOCAL_PATTERNS = [/^local[_-]/, /^shell[_-]/, /^exec[_-]/];
|
|
93
|
+
|
|
94
|
+
function inferMode(name: string): ToolCallMode {
|
|
95
|
+
const lower = name.toLowerCase();
|
|
96
|
+
if (READ_PATTERNS.some((re) => re.test(lower))) return 'read';
|
|
97
|
+
if (LOCAL_PATTERNS.some((re) => re.test(lower))) return 'local';
|
|
98
|
+
if (DESTRUCTIVE_PATTERNS.some((re) => re.test(lower))) return 'destructive';
|
|
99
|
+
if (SAFE_WRITE_PATTERNS.some((re) => re.test(lower))) return 'safe_write';
|
|
100
|
+
return 'unknown';
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function deriveStatus(result: ToolResult | undefined): ToolCallStatus {
|
|
104
|
+
if (!result) return 'pending';
|
|
105
|
+
if (result.success === false) return 'error';
|
|
106
|
+
return 'done';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Re-export the per-call hook for convenience.
|
|
110
|
+
export { useToolCallStatus } from '../hooks/useToolCallStatus.js';
|