@steerable/agent-ui 0.2.0
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 +91 -0
- package/README.md +118 -0
- package/dist/components/ChatPanel.d.ts +42 -0
- package/dist/components/ChatPanel.d.ts.map +1 -0
- package/dist/components/ChatPanel.js +46 -0
- package/dist/components/ChatPanel.js.map +1 -0
- package/dist/components/ChatPanel.stories.d.ts +17 -0
- package/dist/components/ChatPanel.stories.d.ts.map +1 -0
- package/dist/components/ChatPanel.stories.js +143 -0
- package/dist/components/ChatPanel.stories.js.map +1 -0
- package/dist/components/MessageList.d.ts +44 -0
- package/dist/components/MessageList.d.ts.map +1 -0
- package/dist/components/MessageList.js +43 -0
- package/dist/components/MessageList.js.map +1 -0
- package/dist/components/MessageList.stories.d.ts +12 -0
- package/dist/components/MessageList.stories.d.ts.map +1 -0
- package/dist/components/MessageList.stories.js +88 -0
- package/dist/components/MessageList.stories.js.map +1 -0
- package/dist/components/OrchestrationPlanCard.d.ts +32 -0
- package/dist/components/OrchestrationPlanCard.d.ts.map +1 -0
- package/dist/components/OrchestrationPlanCard.js +48 -0
- package/dist/components/OrchestrationPlanCard.js.map +1 -0
- package/dist/components/OrchestrationPlanCard.stories.d.ts +12 -0
- package/dist/components/OrchestrationPlanCard.stories.d.ts.map +1 -0
- package/dist/components/OrchestrationPlanCard.stories.js +84 -0
- package/dist/components/OrchestrationPlanCard.stories.js.map +1 -0
- package/dist/components/SSEStreamView.d.ts +29 -0
- package/dist/components/SSEStreamView.d.ts.map +1 -0
- package/dist/components/SSEStreamView.js +78 -0
- package/dist/components/SSEStreamView.js.map +1 -0
- package/dist/components/SSEStreamView.stories.d.ts +12 -0
- package/dist/components/SSEStreamView.stories.d.ts.map +1 -0
- package/dist/components/SSEStreamView.stories.js +86 -0
- package/dist/components/SSEStreamView.stories.js.map +1 -0
- package/dist/components/ToolCallRenderer.d.ts +42 -0
- package/dist/components/ToolCallRenderer.d.ts.map +1 -0
- package/dist/components/ToolCallRenderer.js +70 -0
- package/dist/components/ToolCallRenderer.js.map +1 -0
- package/dist/components/ToolCallRenderer.stories.d.ts +13 -0
- package/dist/components/ToolCallRenderer.stories.d.ts.map +1 -0
- package/dist/components/ToolCallRenderer.stories.js +112 -0
- package/dist/components/ToolCallRenderer.stories.js.map +1 -0
- package/dist/components/cn.d.ts +7 -0
- package/dist/components/cn.d.ts.map +1 -0
- package/dist/components/cn.js +9 -0
- package/dist/components/cn.js.map +1 -0
- package/dist/components/index.d.ts +11 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +6 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useAgentSession.d.ts +56 -0
- package/dist/hooks/useAgentSession.d.ts.map +1 -0
- package/dist/hooks/useAgentSession.js +128 -0
- package/dist/hooks/useAgentSession.js.map +1 -0
- package/dist/hooks/useChatStream.d.ts +59 -0
- package/dist/hooks/useChatStream.d.ts.map +1 -0
- package/dist/hooks/useChatStream.js +251 -0
- package/dist/hooks/useChatStream.js.map +1 -0
- package/dist/hooks/useToolCallStatus.d.ts +47 -0
- package/dist/hooks/useToolCallStatus.d.ts.map +1 -0
- package/dist/hooks/useToolCallStatus.js +57 -0
- package/dist/hooks/useToolCallStatus.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/tailwind-preset.d.ts +76 -0
- package/dist/tailwind-preset.d.ts.map +1 -0
- package/dist/tailwind-preset.js +104 -0
- package/dist/tailwind-preset.js.map +1 -0
- package/package.json +97 -0
- package/src/Introduction.mdx +71 -0
- package/src/components/ChatPanel.stories.tsx +173 -0
- package/src/components/ChatPanel.tsx +188 -0
- package/src/components/MessageList.stories.tsx +112 -0
- package/src/components/MessageList.test.tsx +57 -0
- package/src/components/MessageList.tsx +144 -0
- package/src/components/OrchestrationPlanCard.stories.tsx +98 -0
- package/src/components/OrchestrationPlanCard.test.tsx +34 -0
- package/src/components/OrchestrationPlanCard.tsx +159 -0
- package/src/components/SSEStreamView.stories.tsx +99 -0
- package/src/components/SSEStreamView.test.tsx +42 -0
- package/src/components/SSEStreamView.tsx +155 -0
- package/src/components/ToolCallRenderer.stories.tsx +152 -0
- package/src/components/ToolCallRenderer.test.tsx +93 -0
- package/src/components/ToolCallRenderer.tsx +213 -0
- package/src/components/cn.ts +10 -0
- package/src/components/index.ts +18 -0
- package/src/hooks/index.ts +21 -0
- package/src/hooks/useAgentSession.mdx +115 -0
- package/src/hooks/useAgentSession.test.ts +127 -0
- package/src/hooks/useAgentSession.ts +181 -0
- package/src/hooks/useChatStream.mdx +129 -0
- package/src/hooks/useChatStream.test.ts +233 -0
- package/src/hooks/useChatStream.ts +341 -0
- package/src/hooks/useToolCallStatus.mdx +102 -0
- package/src/hooks/useToolCallStatus.test.ts +99 -0
- package/src/hooks/useToolCallStatus.ts +99 -0
- package/src/index.ts +12 -0
- package/src/tailwind-preset.ts +109 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `useChatStream` — own the in-flight chat lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* Caller plugs in a transport (fetch+SSE, IPC bridge, sidecar, …) that yields
|
|
5
|
+
* `SSEEvent` instances; the hook turns those into the local `ChatMessage[]`
|
|
6
|
+
* that `<MessageList>` and `<ChatPanel>` render. The hook is intentionally
|
|
7
|
+
* unaware of HTTP, of which provider serves the events, and of any specific
|
|
8
|
+
* sequencing rules — those live in the framework spec and the caller's
|
|
9
|
+
* transport.
|
|
10
|
+
*/
|
|
11
|
+
import { useCallback, useEffect, useMemo, useReducer, useRef } from 'react';
|
|
12
|
+
function reducer(state, action) {
|
|
13
|
+
switch (action.type) {
|
|
14
|
+
case 'reset':
|
|
15
|
+
return { messages: action.messages };
|
|
16
|
+
case 'append':
|
|
17
|
+
return { messages: [...state.messages, action.message] };
|
|
18
|
+
case 'patch-last-assistant': {
|
|
19
|
+
const idx = findLastAssistantIndex(state.messages);
|
|
20
|
+
if (idx === -1)
|
|
21
|
+
return state;
|
|
22
|
+
const patched = {
|
|
23
|
+
...state.messages[idx],
|
|
24
|
+
...action.patch,
|
|
25
|
+
};
|
|
26
|
+
const next = state.messages.slice();
|
|
27
|
+
next[idx] = patched;
|
|
28
|
+
return { messages: next };
|
|
29
|
+
}
|
|
30
|
+
case 'append-content': {
|
|
31
|
+
const idx = findLastAssistantIndex(state.messages);
|
|
32
|
+
if (idx === -1)
|
|
33
|
+
return state;
|
|
34
|
+
const target = state.messages[idx];
|
|
35
|
+
const patched = {
|
|
36
|
+
...target,
|
|
37
|
+
content: (target.content ?? '') + action.delta,
|
|
38
|
+
};
|
|
39
|
+
const next = state.messages.slice();
|
|
40
|
+
next[idx] = patched;
|
|
41
|
+
return { messages: next };
|
|
42
|
+
}
|
|
43
|
+
case 'append-tool-call': {
|
|
44
|
+
const idx = findLastAssistantIndex(state.messages);
|
|
45
|
+
if (idx === -1)
|
|
46
|
+
return state;
|
|
47
|
+
const target = state.messages[idx];
|
|
48
|
+
const calls = Array.isArray(target.toolCalls) ? [...target.toolCalls] : [];
|
|
49
|
+
calls.push(action.call);
|
|
50
|
+
const patched = { ...target, toolCalls: calls };
|
|
51
|
+
const next = state.messages.slice();
|
|
52
|
+
next[idx] = patched;
|
|
53
|
+
return { messages: next };
|
|
54
|
+
}
|
|
55
|
+
case 'attach-tool-result': {
|
|
56
|
+
// The protocol allows `ChatMessage.toolResult`, but most renderers want
|
|
57
|
+
// to see results inline on the assistant message that owns the call.
|
|
58
|
+
const idx = findLastAssistantIndex(state.messages);
|
|
59
|
+
if (idx === -1)
|
|
60
|
+
return state;
|
|
61
|
+
const target = state.messages[idx];
|
|
62
|
+
const patched = {
|
|
63
|
+
...target,
|
|
64
|
+
toolResult: action.result,
|
|
65
|
+
};
|
|
66
|
+
const next = state.messages.slice();
|
|
67
|
+
next[idx] = patched;
|
|
68
|
+
return { messages: next };
|
|
69
|
+
}
|
|
70
|
+
case 'finalize-assistant':
|
|
71
|
+
return state;
|
|
72
|
+
default:
|
|
73
|
+
return state;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function findLastAssistantIndex(messages) {
|
|
77
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
78
|
+
if (messages[i].role === 'assistant')
|
|
79
|
+
return i;
|
|
80
|
+
}
|
|
81
|
+
return -1;
|
|
82
|
+
}
|
|
83
|
+
function newAssistantPlaceholder() {
|
|
84
|
+
return {
|
|
85
|
+
id: `placeholder_${Date.now()}_${Math.floor(Math.random() * 1e6)}`,
|
|
86
|
+
role: 'assistant',
|
|
87
|
+
content: '',
|
|
88
|
+
createdAt: new Date().toISOString(),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function newUserMessage(content) {
|
|
92
|
+
return {
|
|
93
|
+
id: `user_${Date.now()}_${Math.floor(Math.random() * 1e6)}`,
|
|
94
|
+
role: 'user',
|
|
95
|
+
content,
|
|
96
|
+
createdAt: new Date().toISOString(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function pickContentDelta(event) {
|
|
100
|
+
if (typeof event.content === 'string' && event.content.length > 0) {
|
|
101
|
+
return event.content;
|
|
102
|
+
}
|
|
103
|
+
// Some transports stash the delta in `payload.delta` or `payload.content`.
|
|
104
|
+
const payload = (event.payload ?? {});
|
|
105
|
+
if (typeof payload.delta === 'string')
|
|
106
|
+
return payload.delta;
|
|
107
|
+
if (typeof payload.content === 'string')
|
|
108
|
+
return payload.content;
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
function pickToolCall(event) {
|
|
112
|
+
const payload = event.payload;
|
|
113
|
+
if (payload &&
|
|
114
|
+
typeof payload === 'object' &&
|
|
115
|
+
'id' in payload &&
|
|
116
|
+
'name' in payload &&
|
|
117
|
+
'arguments' in payload) {
|
|
118
|
+
return payload;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function pickToolResult(event) {
|
|
123
|
+
const payload = event.payload;
|
|
124
|
+
if (payload && typeof payload === 'object' && 'success' in payload) {
|
|
125
|
+
return payload;
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
export function useChatStream(options) {
|
|
130
|
+
const [state, dispatch] = useReducer(reducer, {
|
|
131
|
+
messages: options.initialMessages ?? [],
|
|
132
|
+
});
|
|
133
|
+
const isStreamingRef = useRef(false);
|
|
134
|
+
const cancelRef = useRef(null);
|
|
135
|
+
const [, forceRerender] = useReducer((x) => x + 1, 0);
|
|
136
|
+
const setStreaming = useCallback((next) => {
|
|
137
|
+
isStreamingRef.current = next;
|
|
138
|
+
forceRerender();
|
|
139
|
+
}, []);
|
|
140
|
+
const handleEvent = useCallback((event) => {
|
|
141
|
+
switch (event.type) {
|
|
142
|
+
case 'content': {
|
|
143
|
+
const delta = pickContentDelta(event);
|
|
144
|
+
if (delta)
|
|
145
|
+
dispatch({ type: 'append-content', delta });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
case 'tool_call': {
|
|
149
|
+
const call = pickToolCall(event);
|
|
150
|
+
if (call)
|
|
151
|
+
dispatch({ type: 'append-tool-call', call });
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
case 'tool_result': {
|
|
155
|
+
const result = pickToolResult(event);
|
|
156
|
+
if (!result)
|
|
157
|
+
return;
|
|
158
|
+
const newMsg = options.toolResultToMessage?.(result);
|
|
159
|
+
if (newMsg) {
|
|
160
|
+
dispatch({ type: 'append', message: newMsg });
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
dispatch({ type: 'attach-tool-result', result });
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
case 'done':
|
|
168
|
+
dispatch({ type: 'finalize-assistant' });
|
|
169
|
+
return;
|
|
170
|
+
case 'error': {
|
|
171
|
+
const msg = event.message ?? 'stream error';
|
|
172
|
+
dispatch({
|
|
173
|
+
type: 'patch-last-assistant',
|
|
174
|
+
patch: { content: `[stream error] ${msg}` },
|
|
175
|
+
});
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
case 'budget_exhausted': {
|
|
179
|
+
dispatch({
|
|
180
|
+
type: 'patch-last-assistant',
|
|
181
|
+
patch: {
|
|
182
|
+
content: event.message ??
|
|
183
|
+
'[budget exhausted] the harness stopped this run.',
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
case 'agent':
|
|
189
|
+
case 'orchestration':
|
|
190
|
+
case 'loader-hint':
|
|
191
|
+
case 'keepalive':
|
|
192
|
+
default:
|
|
193
|
+
options.onUnknownEvent?.(event);
|
|
194
|
+
}
|
|
195
|
+
}, [options]);
|
|
196
|
+
const sendUserMessage = useCallback(async (input) => {
|
|
197
|
+
if (isStreamingRef.current) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
dispatch({ type: 'append', message: newUserMessage(input.content) });
|
|
201
|
+
dispatch({ type: 'append', message: newAssistantPlaceholder() });
|
|
202
|
+
setStreaming(true);
|
|
203
|
+
try {
|
|
204
|
+
const cancel = await options.transport.stream(input, handleEvent);
|
|
205
|
+
cancelRef.current = typeof cancel === 'function' ? cancel : null;
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
dispatch({
|
|
209
|
+
type: 'patch-last-assistant',
|
|
210
|
+
patch: {
|
|
211
|
+
content: '[stream error] ' +
|
|
212
|
+
(err instanceof Error ? err.message : String(err)),
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
cancelRef.current = null;
|
|
218
|
+
setStreaming(false);
|
|
219
|
+
}
|
|
220
|
+
}, [handleEvent, options.transport, setStreaming]);
|
|
221
|
+
const cancel = useCallback(() => {
|
|
222
|
+
if (cancelRef.current) {
|
|
223
|
+
cancelRef.current();
|
|
224
|
+
cancelRef.current = null;
|
|
225
|
+
}
|
|
226
|
+
setStreaming(false);
|
|
227
|
+
}, [setStreaming]);
|
|
228
|
+
const setMessages = useCallback((messages) => {
|
|
229
|
+
dispatch({ type: 'reset', messages });
|
|
230
|
+
}, []);
|
|
231
|
+
const appendMessage = useCallback((message) => {
|
|
232
|
+
dispatch({ type: 'append', message });
|
|
233
|
+
}, []);
|
|
234
|
+
useEffect(() => {
|
|
235
|
+
return () => {
|
|
236
|
+
if (cancelRef.current) {
|
|
237
|
+
cancelRef.current();
|
|
238
|
+
cancelRef.current = null;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}, []);
|
|
242
|
+
return useMemo(() => ({
|
|
243
|
+
messages: state.messages,
|
|
244
|
+
isStreaming: isStreamingRef.current,
|
|
245
|
+
sendUserMessage,
|
|
246
|
+
cancel,
|
|
247
|
+
setMessages,
|
|
248
|
+
appendMessage,
|
|
249
|
+
}), [state.messages, sendUserMessage, cancel, setMessages, appendMessage]);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=useChatStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChatStream.js","sourceRoot":"","sources":["../../src/hooks/useChatStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `useToolCallStatus` — derive the rendering state for a single tool call.
|
|
3
|
+
*
|
|
4
|
+
* Tool calls in the framework go through four UI states:
|
|
5
|
+
* `pending` The model has emitted the call but no result has arrived.
|
|
6
|
+
* `running` Optional intermediate state when the runtime emits a
|
|
7
|
+
* `tool.running` notification (sidecar / harness can do this).
|
|
8
|
+
* `done` A successful result has been attached.
|
|
9
|
+
* `error` The result reports `success: false` or an error envelope.
|
|
10
|
+
*
|
|
11
|
+
* Plus an additional axis — the `mode` (read / safe_write / destructive / local)
|
|
12
|
+
* — which decides whether the UI should render an approval prompt or an
|
|
13
|
+
* informational badge.
|
|
14
|
+
*/
|
|
15
|
+
import type { ToolCall, ToolResult } from '@steerable/agent-protocol';
|
|
16
|
+
export type ToolCallStatus = 'pending' | 'running' | 'done' | 'error';
|
|
17
|
+
export type ToolCallMode = 'read' | 'safe_write' | 'destructive' | 'local' | 'external' | 'ui' | 'synthetic' | 'unknown';
|
|
18
|
+
export interface UseToolCallStatusOptions {
|
|
19
|
+
call: ToolCall;
|
|
20
|
+
result?: ToolResult;
|
|
21
|
+
/**
|
|
22
|
+
* Optional override; when omitted the hook infers the mode from the tool
|
|
23
|
+
* name pattern (`get_*` / `list_*` → read, `delete_*` / `archive_*` →
|
|
24
|
+
* destructive, `local_*` → local, etc.). Mirrors the framework's harness
|
|
25
|
+
* `decide_tool_mode`.
|
|
26
|
+
*/
|
|
27
|
+
mode?: ToolCallMode;
|
|
28
|
+
/**
|
|
29
|
+
* If the runtime can emit `tool.running` notifications, set this true to
|
|
30
|
+
* keep `status` in `running` until a result arrives. Defaults to false
|
|
31
|
+
* (status flips straight from `pending` → `done`/`error`).
|
|
32
|
+
*/
|
|
33
|
+
runningHint?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface UseToolCallStatusReturn {
|
|
36
|
+
status: ToolCallStatus;
|
|
37
|
+
mode: ToolCallMode;
|
|
38
|
+
/** True when the UI should ask for explicit user approval before running. */
|
|
39
|
+
requiresApproval: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* True when the runtime should mark the call as destructive in the UI
|
|
42
|
+
* (red tone, undo affordance).
|
|
43
|
+
*/
|
|
44
|
+
isDestructive: boolean;
|
|
45
|
+
}
|
|
46
|
+
export declare function useToolCallStatus(options: UseToolCallStatusOptions): UseToolCallStatusReturn;
|
|
47
|
+
//# sourceMappingURL=useToolCallStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToolCallStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useToolCallStatus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,YAAY,GACZ,aAAa,GACb,OAAO,GACP,UAAU,GACV,IAAI,GACJ,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,6EAA6E;IAC7E,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAsBD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,uBAAuB,CAgBzB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `useToolCallStatus` — derive the rendering state for a single tool call.
|
|
3
|
+
*
|
|
4
|
+
* Tool calls in the framework go through four UI states:
|
|
5
|
+
* `pending` The model has emitted the call but no result has arrived.
|
|
6
|
+
* `running` Optional intermediate state when the runtime emits a
|
|
7
|
+
* `tool.running` notification (sidecar / harness can do this).
|
|
8
|
+
* `done` A successful result has been attached.
|
|
9
|
+
* `error` The result reports `success: false` or an error envelope.
|
|
10
|
+
*
|
|
11
|
+
* Plus an additional axis — the `mode` (read / safe_write / destructive / local)
|
|
12
|
+
* — which decides whether the UI should render an approval prompt or an
|
|
13
|
+
* informational badge.
|
|
14
|
+
*/
|
|
15
|
+
import { useMemo } from 'react';
|
|
16
|
+
const READ_PATTERNS = [/^get[_-]/, /^list[_-]/, /^read[_-]/, /^search[_-]/];
|
|
17
|
+
const DESTRUCTIVE_PATTERNS = [
|
|
18
|
+
/^delete[_-]/,
|
|
19
|
+
/^remove[_-]/,
|
|
20
|
+
/^archive[_-]/,
|
|
21
|
+
/^purge[_-]/,
|
|
22
|
+
/^drop[_-]/,
|
|
23
|
+
];
|
|
24
|
+
const SAFE_WRITE_PATTERNS = [/^create[_-]/, /^update[_-]/, /^add[_-]/, /^set[_-]/];
|
|
25
|
+
const LOCAL_PATTERNS = [/^local[_-]/, /^shell[_-]/, /^exec[_-]/];
|
|
26
|
+
function inferMode(name) {
|
|
27
|
+
const lower = name.toLowerCase();
|
|
28
|
+
if (READ_PATTERNS.some((re) => re.test(lower)))
|
|
29
|
+
return 'read';
|
|
30
|
+
if (LOCAL_PATTERNS.some((re) => re.test(lower)))
|
|
31
|
+
return 'local';
|
|
32
|
+
if (DESTRUCTIVE_PATTERNS.some((re) => re.test(lower)))
|
|
33
|
+
return 'destructive';
|
|
34
|
+
if (SAFE_WRITE_PATTERNS.some((re) => re.test(lower)))
|
|
35
|
+
return 'safe_write';
|
|
36
|
+
return 'unknown';
|
|
37
|
+
}
|
|
38
|
+
export function useToolCallStatus(options) {
|
|
39
|
+
return useMemo(() => {
|
|
40
|
+
const mode = options.mode ?? inferMode(options.call.name);
|
|
41
|
+
const isDestructive = mode === 'destructive';
|
|
42
|
+
// `local` tools touch the user's machine and need explicit consent.
|
|
43
|
+
const requiresApproval = mode === 'local';
|
|
44
|
+
let status;
|
|
45
|
+
if (!options.result) {
|
|
46
|
+
status = options.runningHint ? 'running' : 'pending';
|
|
47
|
+
}
|
|
48
|
+
else if (options.result.success === false) {
|
|
49
|
+
status = 'error';
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
status = 'done';
|
|
53
|
+
}
|
|
54
|
+
return { status, mode, requiresApproval, isDestructive };
|
|
55
|
+
}, [options.call.name, options.mode, options.result, options.runningHint]);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=useToolCallStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToolCallStatus.js","sourceRoot":"","sources":["../../src/hooks/useToolCallStatus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AA6ChC,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAC5E,MAAM,oBAAoB,GAAG;IAC3B,aAAa;IACb,aAAa;IACb,cAAc;IACd,YAAY;IACZ,WAAW;CACZ,CAAC;AACF,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACnF,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAEjE,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9D,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAChE,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,aAAa,CAAC;IAC5E,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAiC;IAEjC,OAAO,OAAO,CAA0B,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,IAAI,KAAK,aAAa,CAAC;QAC7C,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,IAAI,KAAK,OAAO,CAAC;QAC1C,IAAI,MAAsB,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC5C,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAC3D,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7E,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @steerable/agent-ui
|
|
3
|
+
*
|
|
4
|
+
* Entry point. Re-exports the public hooks + components surface.
|
|
5
|
+
*
|
|
6
|
+
* The Tailwind preset is exposed via the `./tailwind-preset` subpath, not from
|
|
7
|
+
* the root, so consumers don't pull a build-time dependency into their app
|
|
8
|
+
* runtime bundle. See `tsconfig.json` `exports` map.
|
|
9
|
+
*/
|
|
10
|
+
export * from './hooks/index.js';
|
|
11
|
+
export * from './components/index.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @steerable/agent-ui
|
|
3
|
+
*
|
|
4
|
+
* Entry point. Re-exports the public hooks + components surface.
|
|
5
|
+
*
|
|
6
|
+
* The Tailwind preset is exposed via the `./tailwind-preset` subpath, not from
|
|
7
|
+
* the root, so consumers don't pull a build-time dependency into their app
|
|
8
|
+
* runtime bundle. See `tsconfig.json` `exports` map.
|
|
9
|
+
*/
|
|
10
|
+
export * from './hooks/index.js';
|
|
11
|
+
export * from './components/index.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Steerable Tailwind preset.
|
|
3
|
+
*
|
|
4
|
+
* Exposes design tokens (CSS variables) and a small theme extension covering
|
|
5
|
+
* the colors, spacing, and animations used by `@steerable/agent-ui` components.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
*
|
|
9
|
+
* // tailwind.config.ts
|
|
10
|
+
* import preset from '@steerable/agent-ui/tailwind-preset';
|
|
11
|
+
* export default { presets: [preset], content: ['./src/**\/*.{ts,tsx}'] };
|
|
12
|
+
*
|
|
13
|
+
* Override any token in your project's `globals.css`:
|
|
14
|
+
*
|
|
15
|
+
* :root {
|
|
16
|
+
* --agent-canvas: 0 0% 100%;
|
|
17
|
+
* --agent-foreground: 240 10% 3.9%;
|
|
18
|
+
* --agent-accent: 217 91% 60%;
|
|
19
|
+
* }
|
|
20
|
+
* .dark {
|
|
21
|
+
* --agent-canvas: 240 10% 3.9%;
|
|
22
|
+
* --agent-foreground: 0 0% 98%;
|
|
23
|
+
* }
|
|
24
|
+
*/
|
|
25
|
+
declare const preset: {
|
|
26
|
+
darkMode: "class";
|
|
27
|
+
theme: {
|
|
28
|
+
extend: {
|
|
29
|
+
colors: {
|
|
30
|
+
'agent-canvas': string;
|
|
31
|
+
'agent-foreground': string;
|
|
32
|
+
'agent-muted': string;
|
|
33
|
+
'agent-muted-foreground': string;
|
|
34
|
+
'agent-border': string;
|
|
35
|
+
'agent-accent': string;
|
|
36
|
+
'agent-accent-foreground': string;
|
|
37
|
+
'agent-destructive': string;
|
|
38
|
+
'agent-tool-read': string;
|
|
39
|
+
'agent-tool-write': string;
|
|
40
|
+
'agent-tool-destructive': string;
|
|
41
|
+
};
|
|
42
|
+
borderRadius: {
|
|
43
|
+
'agent-sm': string;
|
|
44
|
+
'agent-md': string;
|
|
45
|
+
'agent-lg': string;
|
|
46
|
+
};
|
|
47
|
+
animation: {
|
|
48
|
+
'agent-cursor-blink': string;
|
|
49
|
+
'agent-shimmer': string;
|
|
50
|
+
};
|
|
51
|
+
keyframes: {
|
|
52
|
+
'agent-cursor-blink': {
|
|
53
|
+
'0%, 100%': {
|
|
54
|
+
opacity: string;
|
|
55
|
+
};
|
|
56
|
+
'50%': {
|
|
57
|
+
opacity: string;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
'agent-shimmer': {
|
|
61
|
+
'0%': {
|
|
62
|
+
backgroundPosition: string;
|
|
63
|
+
};
|
|
64
|
+
'100%': {
|
|
65
|
+
backgroundPosition: string;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
plugins: ((api: {
|
|
72
|
+
addBase: (rules: Record<string, unknown>) => void;
|
|
73
|
+
}) => void)[];
|
|
74
|
+
};
|
|
75
|
+
export default preset;
|
|
76
|
+
//# sourceMappingURL=tailwind-preset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-preset.d.ts","sourceRoot":"","sources":["../src/tailwind-preset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAiD0B;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE;CAgC1F,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Steerable Tailwind preset.
|
|
3
|
+
*
|
|
4
|
+
* Exposes design tokens (CSS variables) and a small theme extension covering
|
|
5
|
+
* the colors, spacing, and animations used by `@steerable/agent-ui` components.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
*
|
|
9
|
+
* // tailwind.config.ts
|
|
10
|
+
* import preset from '@steerable/agent-ui/tailwind-preset';
|
|
11
|
+
* export default { presets: [preset], content: ['./src/**\/*.{ts,tsx}'] };
|
|
12
|
+
*
|
|
13
|
+
* Override any token in your project's `globals.css`:
|
|
14
|
+
*
|
|
15
|
+
* :root {
|
|
16
|
+
* --agent-canvas: 0 0% 100%;
|
|
17
|
+
* --agent-foreground: 240 10% 3.9%;
|
|
18
|
+
* --agent-accent: 217 91% 60%;
|
|
19
|
+
* }
|
|
20
|
+
* .dark {
|
|
21
|
+
* --agent-canvas: 240 10% 3.9%;
|
|
22
|
+
* --agent-foreground: 0 0% 98%;
|
|
23
|
+
* }
|
|
24
|
+
*/
|
|
25
|
+
const preset = {
|
|
26
|
+
// Tell Tailwind we use the `class` darkmode toggle so consumers can opt-in.
|
|
27
|
+
darkMode: 'class',
|
|
28
|
+
theme: {
|
|
29
|
+
extend: {
|
|
30
|
+
colors: {
|
|
31
|
+
'agent-canvas': 'hsl(var(--agent-canvas) / <alpha-value>)',
|
|
32
|
+
'agent-foreground': 'hsl(var(--agent-foreground) / <alpha-value>)',
|
|
33
|
+
'agent-muted': 'hsl(var(--agent-muted) / <alpha-value>)',
|
|
34
|
+
'agent-muted-foreground': 'hsl(var(--agent-muted-foreground) / <alpha-value>)',
|
|
35
|
+
'agent-border': 'hsl(var(--agent-border) / <alpha-value>)',
|
|
36
|
+
'agent-accent': 'hsl(var(--agent-accent) / <alpha-value>)',
|
|
37
|
+
'agent-accent-foreground': 'hsl(var(--agent-accent-foreground) / <alpha-value>)',
|
|
38
|
+
'agent-destructive': 'hsl(var(--agent-destructive) / <alpha-value>)',
|
|
39
|
+
'agent-tool-read': 'hsl(var(--agent-tool-read) / <alpha-value>)',
|
|
40
|
+
'agent-tool-write': 'hsl(var(--agent-tool-write) / <alpha-value>)',
|
|
41
|
+
'agent-tool-destructive': 'hsl(var(--agent-tool-destructive) / <alpha-value>)',
|
|
42
|
+
},
|
|
43
|
+
borderRadius: {
|
|
44
|
+
'agent-sm': 'calc(var(--agent-radius) - 4px)',
|
|
45
|
+
'agent-md': 'calc(var(--agent-radius) - 2px)',
|
|
46
|
+
'agent-lg': 'var(--agent-radius)',
|
|
47
|
+
},
|
|
48
|
+
animation: {
|
|
49
|
+
'agent-cursor-blink': 'agent-cursor-blink 1s steps(1) infinite',
|
|
50
|
+
'agent-shimmer': 'agent-shimmer 2s linear infinite',
|
|
51
|
+
},
|
|
52
|
+
keyframes: {
|
|
53
|
+
'agent-cursor-blink': {
|
|
54
|
+
'0%, 100%': { opacity: '1' },
|
|
55
|
+
'50%': { opacity: '0' },
|
|
56
|
+
},
|
|
57
|
+
'agent-shimmer': {
|
|
58
|
+
'0%': { backgroundPosition: '-1000px 0' },
|
|
59
|
+
'100%': { backgroundPosition: '1000px 0' },
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
// Default token values; consumers can override in their own CSS.
|
|
65
|
+
// The defaults below satisfy WCAG 2 AA color-contrast (≥ 4.5:1 for normal
|
|
66
|
+
// text) against `--agent-canvas` (light) and `--agent-muted`. Override at
|
|
67
|
+
// your own risk — the framework's Storybook a11y suite will start failing
|
|
68
|
+
// if a regression is introduced.
|
|
69
|
+
plugins: [
|
|
70
|
+
function injectDefaultTokens(api) {
|
|
71
|
+
api.addBase({
|
|
72
|
+
':root': {
|
|
73
|
+
'--agent-canvas': '0 0% 100%',
|
|
74
|
+
'--agent-foreground': '240 10% 3.9%',
|
|
75
|
+
'--agent-muted': '240 4.8% 95.9%',
|
|
76
|
+
'--agent-muted-foreground': '240 5% 32%',
|
|
77
|
+
'--agent-border': '240 5.9% 90%',
|
|
78
|
+
'--agent-accent': '217 91% 42%',
|
|
79
|
+
'--agent-accent-foreground': '0 0% 100%',
|
|
80
|
+
'--agent-destructive': '0 75% 42%',
|
|
81
|
+
'--agent-tool-read': '142 71% 22%',
|
|
82
|
+
'--agent-tool-write': '28 90% 28%',
|
|
83
|
+
'--agent-tool-destructive': '0 75% 42%',
|
|
84
|
+
'--agent-radius': '0.75rem',
|
|
85
|
+
},
|
|
86
|
+
'.dark': {
|
|
87
|
+
'--agent-canvas': '240 10% 3.9%',
|
|
88
|
+
'--agent-foreground': '0 0% 98%',
|
|
89
|
+
'--agent-muted': '240 3.7% 15.9%',
|
|
90
|
+
'--agent-muted-foreground': '240 5% 75%',
|
|
91
|
+
'--agent-border': '240 3.7% 15.9%',
|
|
92
|
+
'--agent-accent': '217 91% 65%',
|
|
93
|
+
'--agent-accent-foreground': '240 10% 3.9%',
|
|
94
|
+
'--agent-destructive': '0 75% 60%',
|
|
95
|
+
'--agent-tool-read': '142 71% 60%',
|
|
96
|
+
'--agent-tool-write': '38 92% 60%',
|
|
97
|
+
'--agent-tool-destructive': '0 75% 60%',
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
export default preset;
|
|
104
|
+
//# sourceMappingURL=tailwind-preset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-preset.js","sourceRoot":"","sources":["../src/tailwind-preset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,MAAM,GAAG;IACb,4EAA4E;IAC5E,QAAQ,EAAE,OAAgB;IAC1B,KAAK,EAAE;QACL,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,cAAc,EAAE,0CAA0C;gBAC1D,kBAAkB,EAAE,8CAA8C;gBAClE,aAAa,EAAE,yCAAyC;gBACxD,wBAAwB,EACtB,oDAAoD;gBACtD,cAAc,EAAE,0CAA0C;gBAC1D,cAAc,EAAE,0CAA0C;gBAC1D,yBAAyB,EACvB,qDAAqD;gBACvD,mBAAmB,EACjB,+CAA+C;gBACjD,iBAAiB,EAAE,6CAA6C;gBAChE,kBAAkB,EAAE,8CAA8C;gBAClE,wBAAwB,EACtB,oDAAoD;aACvD;YACD,YAAY,EAAE;gBACZ,UAAU,EAAE,iCAAiC;gBAC7C,UAAU,EAAE,iCAAiC;gBAC7C,UAAU,EAAE,qBAAqB;aAClC;YACD,SAAS,EAAE;gBACT,oBAAoB,EAAE,yCAAyC;gBAC/D,eAAe,EAAE,kCAAkC;aACpD;YACD,SAAS,EAAE;gBACT,oBAAoB,EAAE;oBACpB,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;oBAC5B,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;iBACxB;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE;oBACzC,MAAM,EAAE,EAAE,kBAAkB,EAAE,UAAU,EAAE;iBAC3C;aACF;SACF;KACF;IACD,iEAAiE;IACjE,0EAA0E;IAC1E,0EAA0E;IAC1E,0EAA0E;IAC1E,iCAAiC;IACjC,OAAO,EAAE;QACP,SAAS,mBAAmB,CAAC,GAA0D;YACrF,GAAG,CAAC,OAAO,CAAC;gBACV,OAAO,EAAE;oBACP,gBAAgB,EAAE,WAAW;oBAC7B,oBAAoB,EAAE,cAAc;oBACpC,eAAe,EAAE,gBAAgB;oBACjC,0BAA0B,EAAE,YAAY;oBACxC,gBAAgB,EAAE,cAAc;oBAChC,gBAAgB,EAAE,aAAa;oBAC/B,2BAA2B,EAAE,WAAW;oBACxC,qBAAqB,EAAE,WAAW;oBAClC,mBAAmB,EAAE,aAAa;oBAClC,oBAAoB,EAAE,YAAY;oBAClC,0BAA0B,EAAE,WAAW;oBACvC,gBAAgB,EAAE,SAAS;iBAC5B;gBACD,OAAO,EAAE;oBACP,gBAAgB,EAAE,cAAc;oBAChC,oBAAoB,EAAE,UAAU;oBAChC,eAAe,EAAE,gBAAgB;oBACjC,0BAA0B,EAAE,YAAY;oBACxC,gBAAgB,EAAE,gBAAgB;oBAClC,gBAAgB,EAAE,aAAa;oBAC/B,2BAA2B,EAAE,cAAc;oBAC3C,qBAAqB,EAAE,WAAW;oBAClC,mBAAmB,EAAE,aAAa;oBAClC,oBAAoB,EAAE,YAAY;oBAClC,0BAA0B,EAAE,WAAW;iBACxC;aACF,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
|