veryfront 0.1.1074 → 0.1.1076
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/esm/cli/templates/manifest.js +1 -1
- package/esm/deno.js +1 -1
- package/esm/src/agent/react/index.d.ts +3 -3
- package/esm/src/agent/react/index.d.ts.map +1 -1
- package/esm/src/agent/react/index.js +1 -1
- package/esm/src/agent/react/use-agent-metadata.d.ts +18 -1
- package/esm/src/agent/react/use-agent-metadata.d.ts.map +1 -1
- package/esm/src/agent/react/use-agent-metadata.js +19 -0
- package/esm/src/agent/react/use-chat/index.d.ts +1 -1
- package/esm/src/agent/react/use-chat/index.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/types.d.ts +16 -0
- package/esm/src/agent/react/use-chat/types.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.js +36 -3
- package/esm/src/react/components/chat/agent-picker.d.ts +4 -4
- package/esm/src/react/components/chat/agent-picker.d.ts.map +1 -1
- package/esm/src/react/components/chat/agent-picker.js +3 -5
- package/esm/src/react/components/chat/chat/app-mode-chat.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/app-mode-chat.js +16 -31
- package/esm/src/react/components/chat/chat/chat-props.d.ts +11 -4
- package/esm/src/react/components/chat/chat/chat-props.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/sidebar.d.ts +10 -16
- package/esm/src/react/components/chat/chat/components/sidebar.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/sidebar.js +16 -10
- package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts +20 -19
- package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-composer.js +16 -46
- package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts +12 -3
- package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-empty.js +12 -2
- package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-message-list.js +5 -1
- package/esm/src/react/components/chat/chat/composition/chat-root.d.ts +7 -3
- package/esm/src/react/components/chat/chat/composition/chat-root.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-root.js +5 -1
- package/esm/src/react/components/chat/chat/composition/message-sources.d.ts +35 -0
- package/esm/src/react/components/chat/chat/composition/message-sources.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/composition/message-sources.js +31 -0
- package/esm/src/react/components/chat/chat/composition/message.d.ts +8 -10
- package/esm/src/react/components/chat/chat/composition/message.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/message.js +10 -17
- package/esm/src/react/components/chat/chat/composition/use-composer-value.d.ts +53 -0
- package/esm/src/react/components/chat/chat/composition/use-composer-value.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/composition/use-composer-value.js +78 -0
- package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts +10 -2
- package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/controlled-chat.d.ts +1 -1
- package/esm/src/react/components/chat/chat/controlled-chat.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/controlled-chat.js +5 -7
- package/esm/src/react/components/chat/chat/hooks/use-conversation-chat.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/hooks/use-conversation-chat.js +8 -5
- package/esm/src/react/components/chat/chat/hooks/use-conversation.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/hooks/use-conversation.js +3 -1
- package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts +5 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/hooks/use-conversations.js +2 -0
- package/esm/src/react/components/chat/chat-agent-picker.d.ts +6 -1
- package/esm/src/react/components/chat/chat-agent-picker.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat-agent-picker.js +7 -2
- package/esm/src/react/components/chat/model-selector.d.ts +2 -0
- package/esm/src/react/components/chat/model-selector.d.ts.map +1 -1
- package/esm/src/react/components/chat/model-selector.js +7 -6
- package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/framework-candidates.generated.js +198 -74
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +5 -5
|
@@ -51,7 +51,7 @@ export default {
|
|
|
51
51
|
"app/api/ag-ui/route.ts": "import { createAgUiHandler } from \"veryfront/agent\";\nimport { store } from \"../../../store.ts\";\n\nexport const POST = createAgUiHandler(\"rag\", {\n beforeStream: async ({ lastUserText }) => {\n const query = lastUserText.trim();\n if (!query) return;\n\n try {\n const results = await store.search(query, { topK: 5 });\n if (results.length === 0) return;\n\n const contextBlock = results\n .map(\n (result) =>\n `[${result.title}] (score: ${\n result.score.toFixed(2)\n })\\n${result.text}`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n prepend: [\n {\n role: \"system\",\n parts: [\n {\n type: \"text\",\n text:\n `Here are relevant documents retrieved for your question:\\n\\n${contextBlock}\\n\\n` +\n \"Use these documents to answer. Cite the document title when referencing information.\",\n },\n ],\n },\n ],\n };\n } catch (e) {\n console.error(\"[RAG] Retrieval failed:\", e);\n return;\n }\n },\n});\n",
|
|
52
52
|
"app/api/ingest/route.ts": "import { store } from \"../../../store.ts\";\n\nexport async function POST() {\n await store.indexContentDir();\n return Response.json({ ok: true });\n}\n",
|
|
53
53
|
"app/api/uploads/route.ts": "import { createUploadHandler } from \"veryfront/embedding\";\nimport { store } from \"../../../store.ts\";\n\nexport const { POST, GET, DELETE } = createUploadHandler(store, {\n auth: { type: \"none\", allowUnauthenticated: true },\n});\n",
|
|
54
|
-
"app/layout.tsx": "'use client'\n\nimport \"../globals.css\";\nimport {\n AppShell,\n ChatSidebar,\n ChatThemeScope,\n ConversationsProvider,\n Tabs,\n TabsItem,\n} from \"veryfront/chat\";\nimport { Head } from \"veryfront/head\";\nimport { useRouter } from \"veryfront/router\";\n\nexport default function RootLayout({ children }: { children: React.ReactNode }): React.ReactNode {\n const router = useRouter();\n const activeTab = router.pathname.startsWith(\"/uploads\") ? \"uploads\" : \"chat\";\n\n return (\n <>\n <Head><title>Docs Agent</title></Head>\n <ChatThemeScope className=\"flex flex-col h-screen\">\n <ConversationsProvider storageKey=\"rag-conversations\">\n <AppShell className=\"flex-1 min-h-0\">\n <AppShell.Sidebar side=\"left\" className=\"border-r border-[var(--outline-border)]\">\n <AppShell.SidebarContent className=\"p-0\">\n <ChatSidebar
|
|
54
|
+
"app/layout.tsx": "'use client'\n\nimport \"../globals.css\";\nimport {\n AppShell,\n ChatSidebar,\n ChatThemeScope,\n ConversationsProvider,\n Tabs,\n TabsItem,\n} from \"veryfront/chat\";\nimport { Head } from \"veryfront/head\";\nimport { useRouter } from \"veryfront/router\";\n\nexport default function RootLayout({ children }: { children: React.ReactNode }): React.ReactNode {\n const router = useRouter();\n const activeTab = router.pathname.startsWith(\"/uploads\") ? \"uploads\" : \"chat\";\n\n return (\n <>\n <Head><title>Docs Agent</title></Head>\n <ChatThemeScope className=\"flex flex-col h-screen\">\n <ConversationsProvider storageKey=\"rag-conversations\">\n <AppShell className=\"flex-1 min-h-0\">\n <AppShell.Sidebar side=\"left\" className=\"border-r border-[var(--outline-border)]\">\n <AppShell.SidebarContent className=\"p-0\">\n <ChatSidebar.Root>\n <ChatSidebar.NewButton />\n <ChatSidebar.List />\n </ChatSidebar.Root>\n </AppShell.SidebarContent>\n </AppShell.Sidebar>\n <AppShell.Main>\n <AppShell.Header border className=\"h-16 gap-3 px-3\">\n <AppShell.Trigger side=\"left\" />\n <div className=\"flex flex-1 justify-center\">\n <Tabs\n value={activeTab}\n onValueChange={(value) => router.push(value === \"uploads\" ? \"/uploads\" : \"/\")}\n >\n <TabsItem value=\"chat\">Chat</TabsItem>\n <TabsItem value=\"uploads\">Uploads</TabsItem>\n </Tabs>\n </div>\n </AppShell.Header>\n <AppShell.Content className=\"flex flex-col min-h-0 pt-3\">\n {children}\n </AppShell.Content>\n </AppShell.Main>\n </AppShell>\n </ConversationsProvider>\n </ChatThemeScope>\n </>\n );\n}\n",
|
|
55
55
|
"app/page.tsx": "'use client'\n\nimport { Chat } from 'veryfront/chat'\n\nconst ACCEPT = '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.md,.mdx,.html,.rtf,.epub,.json,.xml'\n\nexport default function DocsChat() {\n return (\n <Chat\n agentId=\"rag\"\n api=\"/api/ag-ui\"\n uploadApi=\"/api/uploads\"\n attachAccept={ACCEPT}\n className=\"flex-1 min-h-0\"\n placeholder=\"Ask anything about your documents...\"\n />\n )\n}\n",
|
|
56
56
|
"app/uploads/page.tsx": "'use client'\n\nimport { AttachmentsPanel, useUploadsRegistry } from 'veryfront/chat'\n\nconst UPLOAD_API = '/api/uploads'\nconst ACCEPT = '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.md,.mdx,.html,.rtf,.epub,.json,.xml'\n\nexport default function UploadsPage(): React.JSX.Element {\n const uploads = useUploadsRegistry({ url: UPLOAD_API, storageKey: 'rag-uploads' })\n\n return (\n <AttachmentsPanel\n uploads={uploads.items}\n loading={uploads.isLoading}\n onAttach={uploads.upload}\n onRemoveUpload={uploads.remove}\n attachAccept={ACCEPT}\n className=\"flex-1 min-h-0\"\n />\n )\n}\n",
|
|
57
57
|
"content/architecture.md": "# Architecture\n\nAcme Platform uses a modular, event-driven architecture.\n\n## Core Components\n\n### API Gateway\nRoutes incoming requests to the appropriate microservice. Handles authentication, rate limiting, and request validation.\n\n### Event Bus\nAsynchronous message broker connecting all services. Supports pub/sub and point-to-point messaging patterns.\n\n### Data Layer\nMulti-tenant data storage with automatic sharding. Supports PostgreSQL for relational data and Redis for caching.\n\n## Request Flow\n\n1. Client sends request to API Gateway\n2. Gateway validates authentication token\n3. Request is routed to the target service\n4. Service processes request and publishes events\n5. Response is returned through the gateway\n\n## Scaling\n\nEach component scales independently. The API Gateway uses horizontal scaling with load balancing. Services auto-scale based on queue depth and CPU utilization.\n\n## Security\n\n- All inter-service communication uses mTLS\n- API tokens are rotated every 24 hours\n- Data at rest is encrypted with AES-256\n- Audit logs are retained for 90 days\n",
|
package/esm/deno.js
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* @module agent/react
|
|
5
5
|
*/
|
|
6
6
|
export { useChat } from "./use-chat/index.js";
|
|
7
|
-
export type { BranchInfo, ChatDynamicToolPart, ChatFilePart, ChatFinishReason, ChatMessage, ChatMessagePart, ChatReasoningPart, ChatStepPart, ChatStreamEvent, ChatTextPart, ChatToolPart, ChatToolResultPart, ChatToolState, InferenceMode, OnToolCallArg, ToolOutput, UseChatOptions, UseChatResult, } from "./use-chat/index.js";
|
|
7
|
+
export type { BranchInfo, ChatDynamicToolPart, ChatFilePart, ChatFinishReason, ChatMessage, ChatMessagePart, ChatReasoningPart, ChatStatus, ChatStepPart, ChatStreamEvent, ChatTextPart, ChatToolPart, ChatToolResultPart, ChatToolState, InferenceMode, OnToolCallArg, ToolOutput, UseChatOptions, UseChatResult, } from "./use-chat/index.js";
|
|
8
8
|
export { useAgent } from "./use-agent.js";
|
|
9
9
|
export type { UseAgentOptions, UseAgentResult } from "./use-agent.js";
|
|
10
|
-
export { getAgentPromptSuggestions, normalizeAgentMetadata, normalizeAgentMetadataResponse, useAgentMetadata, } from "./use-agent-metadata.js";
|
|
11
|
-
export type { AgentMetadata, AgentMetadataPromptSuggestion, AgentMetadataSuggestion, AgentMetadataSuggestions, AgentMetadataTaskSuggestion, UseAgentMetadataResult, } from "./use-agent-metadata.js";
|
|
10
|
+
export { getAgentPromptSuggestionItems, getAgentPromptSuggestions, normalizeAgentMetadata, normalizeAgentMetadataResponse, useAgentMetadata, } from "./use-agent-metadata.js";
|
|
11
|
+
export type { AgentMetadata, AgentMetadataPromptSuggestion, AgentMetadataSuggestion, AgentMetadataSuggestions, AgentMetadataTaskSuggestion, PromptSuggestion, UseAgentMetadataResult, } from "./use-agent-metadata.js";
|
|
12
12
|
export { normalizeAgentsListResponse, useAgents } from "./use-agents.js";
|
|
13
13
|
export type { UseAgentsOptions, UseAgentsResult } from "./use-agents.js";
|
|
14
14
|
export { useCompletion } from "./use-completion.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/react/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,aAAa,EACb,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,2BAA2B,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/react/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,sBAAsB,EACtB,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,aAAa,EACb,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,2BAA2B,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { useChat } from "./use-chat/index.js";
|
|
7
7
|
export { useAgent } from "./use-agent.js";
|
|
8
|
-
export { getAgentPromptSuggestions, normalizeAgentMetadata, normalizeAgentMetadataResponse, useAgentMetadata, } from "./use-agent-metadata.js";
|
|
8
|
+
export { getAgentPromptSuggestionItems, getAgentPromptSuggestions, normalizeAgentMetadata, normalizeAgentMetadataResponse, useAgentMetadata, } from "./use-agent-metadata.js";
|
|
9
9
|
export { normalizeAgentsListResponse, useAgents } from "./use-agents.js";
|
|
10
10
|
export { useCompletion } from "./use-completion.js";
|
|
11
11
|
export { useStreaming } from "./use-streaming.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Source-defined prompt suggestion shown by chat surfaces. */
|
|
2
2
|
export type AgentMetadataPromptSuggestion = {
|
|
3
3
|
type: "prompt";
|
|
4
|
-
title
|
|
4
|
+
title?: string;
|
|
5
5
|
prompt: string;
|
|
6
6
|
} | {
|
|
7
7
|
id: string;
|
|
@@ -42,6 +42,23 @@ export declare function normalizeAgentMetadata(value: unknown): AgentMetadata;
|
|
|
42
42
|
export declare function normalizeAgentMetadataResponse(value: unknown): AgentMetadata;
|
|
43
43
|
/** Return prompt text suggestions that the current Chat component can render. */
|
|
44
44
|
export declare function getAgentPromptSuggestions(agent: AgentMetadata | null): string[];
|
|
45
|
+
/**
|
|
46
|
+
* A prompt suggestion normalized for rendering: the short `label` shown on the
|
|
47
|
+
* chip and the full `prompt` sent when it is clicked.
|
|
48
|
+
*/
|
|
49
|
+
export interface PromptSuggestion {
|
|
50
|
+
/** Short chip label — the agent's `title`, falling back to the prompt. */
|
|
51
|
+
label: string;
|
|
52
|
+
/** Full text sent to the agent when the chip is clicked. */
|
|
53
|
+
prompt: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Normalize an agent's prompt suggestions to `{ label, prompt }[]`, ready to
|
|
57
|
+
* render — the chip shows the short `title` while the click sends the full
|
|
58
|
+
* `prompt`. Saves consumers from flat-mapping `agent.suggestions.suggestions`
|
|
59
|
+
* and reconciling the `title`/`prompt` fields themselves.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getAgentPromptSuggestionItems(agent: AgentMetadata | null): PromptSuggestion[];
|
|
45
62
|
/** React hook for browser-safe source-defined agent metadata. */
|
|
46
63
|
export declare function useAgentMetadata(agentId: string | null | undefined): UseAgentMetadataResult;
|
|
47
64
|
//# sourceMappingURL=use-agent-metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-metadata.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/react/use-agent-metadata.ts"],"names":[],"mappings":"AAGA,+DAA+D;AAC/D,MAAM,MAAM,6BAA6B,GACrC;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"use-agent-metadata.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/react/use-agent-metadata.ts"],"names":[],"mappings":"AAGA,+DAA+D;AAC/D,MAAM,MAAM,6BAA6B,GACrC;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GACC;IACA,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEJ,6DAA6D;AAC7D,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,uBAAuB,GAAG,6BAA6B,GAAG,2BAA2B,CAAC;AAElG,oDAAoD;AACpD,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,uBAAuB,EAAE,CAAC;CACxC;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,wBAAwB,CAAC;CACxC;AAED,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AA2ED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAYpE;AAED,wDAAwD;AACxD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAK5E;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,EAAE,CAK/E;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,aAAa,GAAG,IAAI,GAC1B,gBAAgB,EAAE,CAWpB;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,sBAAsB,CAkD3F"}
|
|
@@ -93,6 +93,25 @@ export function getAgentPromptSuggestions(agent) {
|
|
|
93
93
|
return [suggestion.prompt];
|
|
94
94
|
}) ?? [];
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Normalize an agent's prompt suggestions to `{ label, prompt }[]`, ready to
|
|
98
|
+
* render — the chip shows the short `title` while the click sends the full
|
|
99
|
+
* `prompt`. Saves consumers from flat-mapping `agent.suggestions.suggestions`
|
|
100
|
+
* and reconciling the `title`/`prompt` fields themselves.
|
|
101
|
+
*/
|
|
102
|
+
export function getAgentPromptSuggestionItems(agent) {
|
|
103
|
+
const list = agent?.suggestions?.suggestions;
|
|
104
|
+
if (!Array.isArray(list))
|
|
105
|
+
return [];
|
|
106
|
+
return list.flatMap((suggestion) => {
|
|
107
|
+
if (suggestion.type !== "prompt" || !("prompt" in suggestion) || !suggestion.prompt) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
const title = suggestion.title;
|
|
111
|
+
const label = typeof title === "string" && title.length > 0 ? title : suggestion.prompt;
|
|
112
|
+
return [{ label, prompt: suggestion.prompt }];
|
|
113
|
+
});
|
|
114
|
+
}
|
|
96
115
|
/** React hook for browser-safe source-defined agent metadata. */
|
|
97
116
|
export function useAgentMetadata(agentId) {
|
|
98
117
|
const [agent, setAgent] = useState(null);
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* Build any interface you want.
|
|
6
6
|
*/
|
|
7
7
|
export { useChat } from "./use-chat.js";
|
|
8
|
-
export type { BranchInfo, ChatDynamicToolPart, ChatFilePart, ChatMessage, ChatMessagePart, ChatReasoningPart, ChatStepPart, ChatTextPart, ChatToolPart, ChatToolResultPart, ChatToolState, InferenceMode, OnToolCallArg, ToolOutput, UseChatOptions, UseChatResult, } from "./types.js";
|
|
8
|
+
export type { BranchInfo, ChatDynamicToolPart, ChatFilePart, ChatMessage, ChatMessagePart, ChatReasoningPart, ChatStatus, ChatStepPart, ChatTextPart, ChatToolPart, ChatToolResultPart, ChatToolState, InferenceMode, OnToolCallArg, ToolOutput, UseChatOptions, UseChatResult, } from "./types.js";
|
|
9
9
|
export type { ChatFinishReason, ChatStreamEvent, } from "./stream-protocol.js";
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/react/use-chat/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/react/use-chat/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
|
|
@@ -43,10 +43,26 @@ export interface BranchInfo {
|
|
|
43
43
|
total: number;
|
|
44
44
|
}
|
|
45
45
|
/** Result returned from use chat. */
|
|
46
|
+
/**
|
|
47
|
+
* Streaming lifecycle of a chat turn.
|
|
48
|
+
* - `submitted`: request sent, awaiting the first streamed token
|
|
49
|
+
* - `streaming`: assistant tokens are arriving
|
|
50
|
+
* - `ready`: idle — no turn in flight
|
|
51
|
+
* - `error`: the last turn failed
|
|
52
|
+
*
|
|
53
|
+
* Parity with the Vercel AI SDK `status` field. Prefer this over `isLoading`
|
|
54
|
+
* (which stays as a convenience alias for `submitted | streaming`).
|
|
55
|
+
*/
|
|
56
|
+
export type ChatStatus = "submitted" | "streaming" | "ready" | "error";
|
|
46
57
|
export interface UseChatResult {
|
|
47
58
|
messages: ChatMessage[];
|
|
48
59
|
input: string;
|
|
60
|
+
/** @deprecated Use `status`. Equivalent to `status === "submitted" || status === "streaming"`. */
|
|
49
61
|
isLoading: boolean;
|
|
62
|
+
/** Streaming lifecycle of the current turn (AI-SDK parity). */
|
|
63
|
+
status: ChatStatus;
|
|
64
|
+
/** Id of the assistant message currently streaming, or `null` when idle. */
|
|
65
|
+
streamingMessageId: string | null;
|
|
50
66
|
error: Error | null;
|
|
51
67
|
/** Current model override (undefined = use agent default) */
|
|
52
68
|
model: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/react/use-chat/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/react/use-chat/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/react/use-chat/use-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAEV,YAAY,EACZ,WAAW,EACX,eAAe,
|
|
1
|
+
{"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/react/use-chat/use-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAEV,YAAY,EACZ,WAAW,EACX,eAAe,EAIf,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAGpB,KAAK,oBAAoB,GAAG,OAAO,2BAA2B,CAAC;AAE/D,wDAAwD;AACxD,UAAU,MAAM;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,sEAAsE;AACtE,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,MAAM,CAIR;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,YAAY,EAAE,GACrB,eAAe,EAAE,CAEnB;AAMD,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;CAAE,GAAG,IAAI,CAQjD;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,GACrC,oBAAoB,CAGtB;AAOD,UAAU,uBAAwB,SAAQ,aAAa;IACrD,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAInE;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,cAAmB,GAC3B,uBAAuB,CAEzB"}
|
|
@@ -68,6 +68,8 @@ function useChatState(options) {
|
|
|
68
68
|
messagesRef.current = messages;
|
|
69
69
|
const [input, setInput] = useState("");
|
|
70
70
|
const [isLoading, setIsLoading] = useState(false);
|
|
71
|
+
const [status, setStatus] = useState("ready");
|
|
72
|
+
const [streamingMessageId, setStreamingMessageId] = useState(null);
|
|
71
73
|
const [error, setError] = useState(null);
|
|
72
74
|
const [data, setData] = useState(null);
|
|
73
75
|
const [model, setModel] = useState(options.model);
|
|
@@ -128,7 +130,10 @@ function useChatState(options) {
|
|
|
128
130
|
const base = message.baseMessages ?? messagesRef.current;
|
|
129
131
|
setMessages([...base, userMessage]);
|
|
130
132
|
setIsLoading(true);
|
|
133
|
+
setStatus("submitted");
|
|
134
|
+
setStreamingMessageId(null);
|
|
131
135
|
setError(null);
|
|
136
|
+
let didError = false;
|
|
132
137
|
try {
|
|
133
138
|
const allMessages = [...base, userMessage];
|
|
134
139
|
const abortController = new AbortController();
|
|
@@ -171,9 +176,18 @@ function useChatState(options) {
|
|
|
171
176
|
options.onResponse?.(response);
|
|
172
177
|
if (!response.body)
|
|
173
178
|
return;
|
|
174
|
-
const
|
|
179
|
+
const fallbackStreamingId = generateClientId("msg");
|
|
175
180
|
let hasAddedStreamingMessage = false;
|
|
176
|
-
const currentMessageIdRef = { current:
|
|
181
|
+
const currentMessageIdRef = { current: fallbackStreamingId };
|
|
182
|
+
// Promote the turn to `streaming` and publish the id of the message
|
|
183
|
+
// currently receiving tokens. Idempotent — repeated identical values
|
|
184
|
+
// bail out of re-render, so calling per chunk is cheap.
|
|
185
|
+
const markStreaming = () => {
|
|
186
|
+
if (!isLatestRequest(requestIdRef.current, requestId))
|
|
187
|
+
return;
|
|
188
|
+
setStatus("streaming");
|
|
189
|
+
setStreamingMessageId(currentMessageIdRef.current);
|
|
190
|
+
};
|
|
177
191
|
// Mutable local — updated by onData before onMessage/onUpdate use it.
|
|
178
192
|
let serverModel = model;
|
|
179
193
|
setActiveModel((current) => isLatestRequest(requestIdRef.current, requestId) ? undefined : current);
|
|
@@ -186,6 +200,13 @@ function useChatState(options) {
|
|
|
186
200
|
...assistantMessage,
|
|
187
201
|
metadata: { ...assistantMessage.metadata, model: serverModel },
|
|
188
202
|
};
|
|
203
|
+
// A response delivered as a single complete message (no incremental
|
|
204
|
+
// `onUpdate`) still passes through `streaming` for one commit so
|
|
205
|
+
// consumers see a consistent lifecycle.
|
|
206
|
+
if (!hasAddedStreamingMessage) {
|
|
207
|
+
currentMessageIdRef.current = withMeta.id;
|
|
208
|
+
markStreaming();
|
|
209
|
+
}
|
|
189
210
|
setMessages((prev) => {
|
|
190
211
|
if (!isLatestRequest(requestIdRef.current, requestId))
|
|
191
212
|
return prev;
|
|
@@ -224,7 +245,7 @@ function useChatState(options) {
|
|
|
224
245
|
onUpdate: (parts, messageId, messageMetadata) => {
|
|
225
246
|
if (!isLatestRequest(requestIdRef.current, requestId))
|
|
226
247
|
return;
|
|
227
|
-
const id = messageId ??
|
|
248
|
+
const id = messageId ?? fallbackStreamingId;
|
|
228
249
|
const metadata = { ...messageMetadata, model: serverModel };
|
|
229
250
|
if (messageId && messageId !== currentMessageIdRef.current) {
|
|
230
251
|
const oldId = currentMessageIdRef.current;
|
|
@@ -235,6 +256,7 @@ function useChatState(options) {
|
|
|
235
256
|
? { ...m, id, parts, metadata: { ...m.metadata, ...metadata } }
|
|
236
257
|
: m)
|
|
237
258
|
: prev);
|
|
259
|
+
markStreaming();
|
|
238
260
|
return;
|
|
239
261
|
}
|
|
240
262
|
}
|
|
@@ -253,6 +275,7 @@ function useChatState(options) {
|
|
|
253
275
|
},
|
|
254
276
|
]
|
|
255
277
|
: prev);
|
|
278
|
+
markStreaming();
|
|
256
279
|
return;
|
|
257
280
|
}
|
|
258
281
|
setMessages((prev) => isLatestRequest(requestIdRef.current, requestId)
|
|
@@ -260,6 +283,7 @@ function useChatState(options) {
|
|
|
260
283
|
? { ...m, parts, metadata: { ...m.metadata, ...metadata } }
|
|
261
284
|
: m)
|
|
262
285
|
: prev);
|
|
286
|
+
markStreaming();
|
|
263
287
|
},
|
|
264
288
|
onToolCall: options.onToolCall
|
|
265
289
|
? (arg) => isLatestRequest(requestIdRef.current, requestId)
|
|
@@ -274,6 +298,7 @@ function useChatState(options) {
|
|
|
274
298
|
if (!isLatestRequest(requestIdRef.current, requestId))
|
|
275
299
|
return;
|
|
276
300
|
const nextError = ensureError(error);
|
|
301
|
+
didError = true;
|
|
277
302
|
setError(nextError);
|
|
278
303
|
options.onError?.(nextError);
|
|
279
304
|
}
|
|
@@ -281,6 +306,8 @@ function useChatState(options) {
|
|
|
281
306
|
// Only the latest request can clear loading/abort state.
|
|
282
307
|
if (isLatestRequest(requestIdRef.current, requestId)) {
|
|
283
308
|
setIsLoading(false);
|
|
309
|
+
setStatus(didError ? "error" : "ready");
|
|
310
|
+
setStreamingMessageId(null);
|
|
284
311
|
abortControllerRef.current = null;
|
|
285
312
|
}
|
|
286
313
|
}
|
|
@@ -312,6 +339,8 @@ function useChatState(options) {
|
|
|
312
339
|
// request id also fences callbacks and state updaters queued by that chunk.
|
|
313
340
|
invalidateActiveRequest();
|
|
314
341
|
setIsLoading(false);
|
|
342
|
+
setStatus("ready");
|
|
343
|
+
setStreamingMessageId(null);
|
|
315
344
|
}, [invalidateActiveRequest]);
|
|
316
345
|
/**
|
|
317
346
|
* Reset state that belongs to one conversation while preserving the hook
|
|
@@ -327,6 +356,8 @@ function useChatState(options) {
|
|
|
327
356
|
setMessages(nextMessages);
|
|
328
357
|
setInput("");
|
|
329
358
|
setIsLoading(false);
|
|
359
|
+
setStatus("ready");
|
|
360
|
+
setStreamingMessageId(null);
|
|
330
361
|
setError(null);
|
|
331
362
|
setData(null);
|
|
332
363
|
setModel(options.model);
|
|
@@ -447,6 +478,8 @@ function useChatState(options) {
|
|
|
447
478
|
messages,
|
|
448
479
|
input,
|
|
449
480
|
isLoading,
|
|
481
|
+
status,
|
|
482
|
+
streamingMessageId,
|
|
450
483
|
error,
|
|
451
484
|
model,
|
|
452
485
|
activeModel,
|
|
@@ -7,9 +7,7 @@
|
|
|
7
7
|
* branch is dropped (Studio-only deps) — the overlay always portals via our
|
|
8
8
|
* `Floating` (through `PopoverContent`) so it never clips in the iframe.
|
|
9
9
|
*
|
|
10
|
-
* Semantic Studio classes
|
|
11
|
-
* icons inherit the Command row's sizing. Composes the private ui
|
|
12
|
-
* primitives (Popover, Command, Avatar) — no radix / cva / `@/` imports.
|
|
10
|
+
* Semantic Studio classes use Veryfront tokens and private UI primitives.
|
|
13
11
|
*
|
|
14
12
|
* @module react/components/chat/agent-picker
|
|
15
13
|
*/
|
|
@@ -24,7 +22,9 @@ export interface AgentOption {
|
|
|
24
22
|
id: string;
|
|
25
23
|
/** Display name (also the search keyword). */
|
|
26
24
|
name: string;
|
|
27
|
-
/** Avatar image URL; initials
|
|
25
|
+
/** Avatar image URL (matches `AgentMetadata.avatarUrl`); initials shown when absent/null. */
|
|
26
|
+
avatarUrl?: string | null;
|
|
27
|
+
/** @deprecated Use `avatarUrl`. */
|
|
28
28
|
avatarSrc?: string;
|
|
29
29
|
/** Dims the row and blocks selection. */
|
|
30
30
|
disabled?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-picker.d.ts","sourceRoot":"","sources":["../../../../../src/src/react/components/chat/agent-picker.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-picker.d.ts","sourceRoot":"","sources":["../../../../../src/src/react/components/chat/agent-picker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,7 @@
|
|
|
7
7
|
* branch is dropped (Studio-only deps) — the overlay always portals via our
|
|
8
8
|
* `Floating` (through `PopoverContent`) so it never clips in the iframe.
|
|
9
9
|
*
|
|
10
|
-
* Semantic Studio classes
|
|
11
|
-
* icons inherit the Command row's sizing. Composes the private ui
|
|
12
|
-
* primitives (Popover, Command, Avatar) — no radix / cva / `@/` imports.
|
|
10
|
+
* Semantic Studio classes use Veryfront tokens and private UI primitives.
|
|
13
11
|
*
|
|
14
12
|
* @module react/components/chat/agent-picker
|
|
15
13
|
*/
|
|
@@ -57,7 +55,7 @@ function AgentPickerTrigger({ inputStyle = false, invalid = false, icon, childre
|
|
|
57
55
|
const selected = sections ? findAgent(value, sections.agents, sections.sections) : undefined;
|
|
58
56
|
const triggerLabel = selected?.name ?? "Select agent";
|
|
59
57
|
const content = children ?? (React.createElement(React.Fragment, null,
|
|
60
|
-
selected && (React.createElement(Avatar, { name: selected.name, avatarSrc: selected.avatarSrc, tone: "muted", "aria-hidden": "true", className: "size-5! bg-[var(--background)]" })),
|
|
58
|
+
selected && (React.createElement(Avatar, { name: selected.name, avatarSrc: selected.avatarUrl ?? selected.avatarSrc, tone: "muted", "aria-hidden": "true", className: "size-5! bg-[var(--background)]" })),
|
|
61
59
|
React.createElement("span", { className: "min-w-0 truncate" }, triggerLabel),
|
|
62
60
|
inputStyle
|
|
63
61
|
? (icon ?? React.createElement(ChevronDownIcon, { className: "ml-auto size-3.5 opacity-50" }))
|
|
@@ -95,7 +93,7 @@ function AgentPickerItem({ agent, selected, icon, className }) {
|
|
|
95
93
|
const { value, onSelect } = useAgentPicker();
|
|
96
94
|
const isSelected = selected ?? agent.id === value;
|
|
97
95
|
return (React.createElement(CommandItem, { value: agent.name, disabled: agent.disabled, onSelect: () => onSelect(agent.id), className: className },
|
|
98
|
-
React.createElement(Avatar, { name: agent.name, avatarSrc: agent.avatarSrc, tone: "muted", "aria-hidden": "true", className: "size-5! bg-[var(--background)]" }),
|
|
96
|
+
React.createElement(Avatar, { name: agent.name, avatarSrc: agent.avatarUrl ?? agent.avatarSrc, tone: "muted", "aria-hidden": "true", className: "size-5! bg-[var(--background)]" }),
|
|
99
97
|
React.createElement("span", { className: "min-w-0 flex-1 truncate" }, agent.name),
|
|
100
98
|
isSelected &&
|
|
101
99
|
(icon ?? React.createElement(CheckIcon, { className: "ml-auto opacity-70" }))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-mode-chat.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/chat/app-mode-chat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"app-mode-chat.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/chat/app-mode-chat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAiJjD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC,YAAY,CAY1E;yBAZe,qBAAqB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { useAgentMetadata } from "../../../../agent/react/use-agent-metadata.js";
|
|
2
|
+
import { getAgentPromptSuggestionItems, useAgentMetadata, } from "../../../../agent/react/use-agent-metadata.js";
|
|
3
3
|
import { AgentAvatar } from "./composition/agent-avatar.js";
|
|
4
4
|
import { ChatMessagesSkeleton } from "./components/chat-messages-skeleton.js";
|
|
5
5
|
import { useUpload } from "./hooks/use-upload.js";
|
|
@@ -7,25 +7,11 @@ import { useConversationsContextOptional } from "./contexts/conversations-contex
|
|
|
7
7
|
import { useConversationChat } from "./hooks/use-conversation-chat.js";
|
|
8
8
|
import { ControlledChat } from "./controlled-chat.js";
|
|
9
9
|
import { attachmentsToFileParts, hasPendingAttachments } from "./chat-attachments.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*/
|
|
16
|
-
function agentSuggestionItems(suggestions) {
|
|
17
|
-
const list = suggestions?.suggestions;
|
|
18
|
-
if (!Array.isArray(list))
|
|
19
|
-
return [];
|
|
20
|
-
return list.flatMap((s) => {
|
|
21
|
-
if (s.type !== "prompt" || !("prompt" in s) || !s.prompt)
|
|
22
|
-
return [];
|
|
23
|
-
const title = s.title;
|
|
24
|
-
const label = typeof title === "string" && title.length > 0 ? title : s.prompt;
|
|
25
|
-
return [{ label, prompt: s.prompt }];
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
function UncontrolledChat({ agentId, api = "/api/ag-ui", initialMessages, onError, onUpdate, agent: userAgent, suggestions: suggestionsProp, onSuggestionClick, emptyState,
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// UncontrolledChat — "app mode": self-drives useChat + useAgentMetadata so the
|
|
12
|
+
// consumer writes only `<Chat agentId="…" api="…" />`.
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
function UncontrolledChat({ agentId, api = "/api/ag-ui", initialMessages, onError, onUpdate, agent: userAgent, suggestions: suggestionsProp, onSuggestionClick, onSuggestionSelect, emptyState,
|
|
29
15
|
// Attachments: default-wired through `useUpload` unless the caller
|
|
30
16
|
// controls them. With no `uploadApi`, files inline as base64 `data:` URLs
|
|
31
17
|
// (guest mode — zero backend). Set `uploadApi` to POST to a durable
|
|
@@ -64,9 +50,9 @@ uploadApi, onAttach: userOnAttach, onDrop: userOnDrop, attachments: userAttachme
|
|
|
64
50
|
};
|
|
65
51
|
}, [emptyState, agent]);
|
|
66
52
|
// Chips show the short `title`; the click sends the full `prompt`.
|
|
67
|
-
const suggestionItems = React.useMemo(() =>
|
|
53
|
+
const suggestionItems = React.useMemo(() => getAgentPromptSuggestionItems(agent), [agent]);
|
|
68
54
|
const derivedSuggestions = suggestionsProp ??
|
|
69
|
-
(suggestionItems.length > 0 ? suggestionItems
|
|
55
|
+
(suggestionItems.length > 0 ? suggestionItems : undefined);
|
|
70
56
|
const resolvedAgent = agent || userAgent
|
|
71
57
|
? {
|
|
72
58
|
...(agent
|
|
@@ -79,10 +65,9 @@ uploadApi, onAttach: userOnAttach, onDrop: userOnDrop, attachments: userAttachme
|
|
|
79
65
|
...userAgent,
|
|
80
66
|
}
|
|
81
67
|
: undefined;
|
|
82
|
-
const
|
|
83
|
-
((
|
|
84
|
-
|
|
85
|
-
void chat.sendMessage({ text: item?.prompt ?? label });
|
|
68
|
+
const handleSuggestionSelect = onSuggestionSelect ??
|
|
69
|
+
(onSuggestionClick ? undefined : (suggestion) => {
|
|
70
|
+
void chat.sendMessage({ text: suggestion.prompt });
|
|
86
71
|
});
|
|
87
72
|
// Batteries-included attachments: unless the caller controls them, files
|
|
88
73
|
// uploaded via the `+` menu / drag land here, ride along on submit as
|
|
@@ -110,7 +95,7 @@ uploadApi, onAttach: userOnAttach, onDrop: userOnDrop, attachments: userAttachme
|
|
|
110
95
|
upload.clear();
|
|
111
96
|
void chat.sendMessage({ text, files });
|
|
112
97
|
}, [chat, upload]);
|
|
113
|
-
return (React.createElement(ControlledChat, { ...rest, ref: ref, chat: chat, submit: manageAttachments ? submitWithAttachments : chat.handleSubmit, emptyState: derivedEmptyState, agent: resolvedAgent, initializing: agentInitializing, suggestions: derivedSuggestions, onSuggestionClick:
|
|
98
|
+
return (React.createElement(ControlledChat, { ...rest, ref: ref, chat: chat, submit: manageAttachments ? submitWithAttachments : chat.handleSubmit, emptyState: derivedEmptyState, agent: resolvedAgent, initializing: agentInitializing, suggestions: derivedSuggestions, onSuggestionClick: onSuggestionClick, onSuggestionSelect: handleSuggestionSelect, onAttach: manageAttachments ? upload.upload : userOnAttach, onDrop: manageAttachments ? upload.upload : userOnDrop, attachments: manageAttachments ? upload.attachments : userAttachments, onRemoveAttachment: manageAttachments ? upload.remove : userOnRemoveAttachment }));
|
|
114
99
|
}
|
|
115
100
|
UncontrolledChat.displayName = "UncontrolledChat";
|
|
116
101
|
/**
|
|
@@ -122,15 +107,15 @@ UncontrolledChat.displayName = "UncontrolledChat";
|
|
|
122
107
|
*/
|
|
123
108
|
export function ConversationBoundChat(props) {
|
|
124
109
|
const conversations = useConversationsContextOptional();
|
|
125
|
-
if (!conversations || conversations.
|
|
110
|
+
if (!conversations || conversations.activeConversationId == null) {
|
|
126
111
|
return React.createElement(UncontrolledChat, { ref: props.ref, ...props });
|
|
127
112
|
}
|
|
128
|
-
const {
|
|
113
|
+
const { activeConversation, activeConversationId } = conversations;
|
|
129
114
|
// Wait for the active thread's messages before mounting, so `useChat` seeds
|
|
130
115
|
// from the right thread rather than a still-loading one.
|
|
131
|
-
if (
|
|
116
|
+
if (activeConversation?.id !== activeConversationId) {
|
|
132
117
|
return React.createElement(React.Fragment, null, props.skeleton ?? React.createElement(ChatMessagesSkeleton, null));
|
|
133
118
|
}
|
|
134
|
-
return React.createElement(UncontrolledChat, { key:
|
|
119
|
+
return React.createElement(UncontrolledChat, { key: activeConversationId, ref: props.ref, ...props });
|
|
135
120
|
}
|
|
136
121
|
ConversationBoundChat.displayName = "ConversationBoundChat";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type * as React from "react";
|
|
2
|
-
import type { ChatMessage, UseChatResult } from "../../../../agent/react/index.js";
|
|
2
|
+
import type { ChatMessage, PromptSuggestion, UseChatResult } from "../../../../agent/react/index.js";
|
|
3
3
|
import type { ChatTheme } from "../theme.js";
|
|
4
4
|
import type { ModelOption } from "../model-selector.js";
|
|
5
5
|
import type { Source } from "./components/sources.js";
|
|
@@ -56,9 +56,16 @@ export interface ChatProps {
|
|
|
56
56
|
className?: string;
|
|
57
57
|
theme?: Partial<ChatTheme>;
|
|
58
58
|
renderMessage?: (message: ChatMessage) => React.ReactNode;
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Prompt suggestions for an empty thread. Also fillable via
|
|
61
|
+
* `agent.suggestions`. Strings become `{ label, prompt }`; pass
|
|
62
|
+
* `PromptSuggestion` objects for a short label + longer prompt.
|
|
63
|
+
*/
|
|
64
|
+
suggestions?: Array<string | PromptSuggestion>;
|
|
65
|
+
/** @deprecated Use `onSuggestionSelect` for the full suggestion object. */
|
|
66
|
+
onSuggestionClick?: (prompt: string) => void;
|
|
67
|
+
/** Receives the selected `{ label, prompt }` object. */
|
|
68
|
+
onSuggestionSelect?: (suggestion: PromptSuggestion) => void;
|
|
62
69
|
/**
|
|
63
70
|
* Opt-in idle hero for an empty thread (icon + title + optional blurb, plus
|
|
64
71
|
* `suggestions`). When omitted, an empty thread renders as a blank canvas +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-props.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/chat/chat-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-props.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/chat/chat-props.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
* ChatSidebar — a conversation rail, available as a one-shot preset or as a
|
|
3
3
|
* composable compound (mirroring `Chat` / `Message`).
|
|
4
4
|
*
|
|
5
|
-
* Conversation-native:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* to override any of them (controlled), or drop to the compound parts for a
|
|
9
|
-
* custom layout.
|
|
5
|
+
* Conversation-native: inside a {@link ConversationsProvider} it needs **no
|
|
6
|
+
* props** — the list, active id, and select/new/delete/rename come from context.
|
|
7
|
+
* Pass props to override (controlled), or use the compound parts for a custom layout.
|
|
10
8
|
*
|
|
11
9
|
* @example Zero-config inside a provider
|
|
12
10
|
* ```tsx
|
|
@@ -67,20 +65,11 @@ interface ChatSidebarControlProps {
|
|
|
67
65
|
}
|
|
68
66
|
/** Props accepted by {@link ChatSidebarRoot}. */
|
|
69
67
|
export interface ChatSidebarRootProps extends ChatSidebarControlProps {
|
|
70
|
-
/**
|
|
71
|
-
/**
|
|
72
|
-
* Show the loading skeleton instead of the list — e.g. while conversations
|
|
73
|
-
* are being fetched. When omitted, the auto {@link ChatSidebarList} shows a
|
|
74
|
-
* skeleton on its own until the client mounts.
|
|
75
|
-
*/
|
|
68
|
+
/** Show the loading skeleton while conversations are being fetched. */
|
|
76
69
|
loading?: boolean;
|
|
77
70
|
/** When `false`, the rail renders nothing. Default `true`. */
|
|
78
71
|
isOpen?: boolean;
|
|
79
|
-
/**
|
|
80
|
-
* Fill the parent instead of owning a fixed width + mobile overlay chrome.
|
|
81
|
-
* Set when embedding inside a layout container (e.g. `AppShell.Sidebar`) that
|
|
82
|
-
* already provides width and the off-canvas overlay. Default `false`.
|
|
83
|
-
*/
|
|
72
|
+
/** @deprecated The root fills its parent by default. */
|
|
84
73
|
fill?: boolean;
|
|
85
74
|
className?: string;
|
|
86
75
|
children: React.ReactNode;
|
|
@@ -211,6 +200,11 @@ export declare namespace ChatSidebarList {
|
|
|
211
200
|
export interface ChatSidebarProps extends Omit<ChatSidebarRootProps, "children"> {
|
|
212
201
|
}
|
|
213
202
|
/** The one-shot preset — composes Root + NewButton + auto List. */
|
|
203
|
+
/**
|
|
204
|
+
* Fixed-width rail chrome (240px `w-60`, off-canvas overlay on small screens)
|
|
205
|
+
* for the standalone `<ChatSidebar>` preset. `ChatSidebar.Root` is width-agnostic.
|
|
206
|
+
*/
|
|
207
|
+
export declare const STANDALONE_SIDEBAR_CHROME = "w-60 shrink-0 max-sm:absolute max-sm:z-20 max-sm:shadow-xl max-sm:bg-[var(--background)]";
|
|
214
208
|
declare function ChatSidebarBase(props: ChatSidebarProps): React.ReactElement | null;
|
|
215
209
|
declare namespace ChatSidebarBase {
|
|
216
210
|
var displayName: string;
|