@assistant-ui/react 0.15.16 → 0.15.18
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/README.md +4 -4
- package/dist/index.d.ts +8 -4
- package/dist/index.js +4 -2
- package/dist/mcp-apps/McpAppRenderer.d.ts +36 -9
- package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppRenderer.js +108 -57
- package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppsRemoteHost.js +20 -17
- package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
- package/dist/mcp-apps/app-frame.d.ts.map +1 -1
- package/dist/mcp-apps/app-frame.js +229 -115
- package/dist/mcp-apps/app-frame.js.map +1 -1
- package/dist/mcp-apps/bridge.js +2 -3
- package/dist/mcp-apps/bridge.js.map +1 -1
- package/dist/mcp-apps/index.d.ts +3 -3
- package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -1
- package/dist/model-context/frame/useAssistantFrameHost.js +10 -11
- package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
- package/dist/model-context/makeAssistantVisible.js +1 -1
- package/dist/model-context/makeAssistantVisible.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarCopy.js +3 -3
- package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarExportMarkdown.js +3 -3
- package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +3 -3
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +3 -3
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarStopSpeaking.js +3 -3
- package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
- package/dist/primitives/actionBarMore/scope.d.ts +2 -2
- package/dist/primitives/actionBarMore/scope.d.ts.map +1 -1
- package/dist/primitives/actionBarMore/scope.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalContent.js +1 -1
- package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
- package/dist/primitives/assistantModal/scope.d.ts +2 -2
- package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
- package/dist/primitives/assistantModal/scope.js.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
- package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
- package/dist/primitives/composer/ComposerInput.js +1 -3
- package/dist/primitives/composer/ComposerInput.js.map +1 -1
- package/dist/primitives/composer/ComposerInputPluginContext.d.ts +1 -2
- package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerInputPluginContext.js +1 -6
- package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
- package/dist/primitives/composer/ComposerQuote.js +5 -5
- package/dist/primitives/composer/ComposerQuote.js.map +1 -1
- package/dist/primitives/composer/ComposerRoot.js +3 -3
- package/dist/primitives/composer/ComposerRoot.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopover.d.ts +5 -0
- package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopover.js +157 -130
- package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js +46 -15
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js +3 -3
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +4 -4
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +40 -10
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js +4 -4
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +2 -0
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js +63 -61
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +2 -0
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
- package/dist/primitives/composer/trigger/detectTrigger.d.ts +21 -1
- package/dist/primitives/composer/trigger/detectTrigger.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/detectTrigger.js +17 -3
- package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
- package/dist/primitives/composer/trigger/index.d.ts +3 -1
- package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/index.js.map +1 -1
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.d.ts +6 -0
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js +9 -0
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js.map +1 -0
- package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +3 -4
- package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerDetectionResource.js +15 -14
- package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerNavigationResource.js +3 -5
- package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.js +18 -19
- package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
- package/dist/primitives/composer.d.ts +3 -2
- package/dist/primitives/composer.js.map +1 -1
- package/dist/primitives/error/ErrorMessage.js.map +1 -1
- package/dist/primitives/message/MessageIf.js.map +1 -1
- package/dist/primitives/message/MessageParts.js.map +1 -1
- package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
- package/dist/primitives/message/MessageRoot.js +4 -4
- package/dist/primitives/message/MessageRoot.js.map +1 -1
- package/dist/primitives/messagePart/MessagePartText.d.ts +1 -1
- package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
- package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +3 -3
- package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
- package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +3 -3
- package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
- package/dist/primitives/thread/ThreadIf.js.map +1 -1
- package/dist/primitives/thread/ThreadViewport.js +3 -3
- package/dist/primitives/thread/ThreadViewport.js.map +1 -1
- package/dist/primitives/thread/ThreadViewportFooter.js +3 -3
- package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.js +4 -4
- package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
- package/dist/primitives/threadList/ThreadListNew.js +3 -3
- package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
- package/dist/primitives/threadListFocusGroup.d.ts +2 -1
- package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
- package/dist/primitives/threadListFocusGroup.js +2 -2
- package/dist/primitives/threadListFocusGroup.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.js +3 -3
- package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.js +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
- package/dist/primitives/threadListItemMore/scope.d.ts +2 -2
- package/dist/primitives/threadListItemMore/scope.d.ts.map +1 -1
- package/dist/primitives/threadListItemMore/scope.js.map +1 -1
- package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
- package/dist/sandbox-host/SandboxHost.js +148 -72
- package/dist/sandbox-host/SandboxHost.js.map +1 -1
- package/dist/unstable/useLiveCompletionAdapter.js +3 -1
- package/dist/unstable/useLiveCompletionAdapter.js.map +1 -1
- package/dist/unstable/useMentionAdapter.d.ts +9 -3
- package/dist/unstable/useMentionAdapter.d.ts.map +1 -1
- package/dist/unstable/useMentionAdapter.js +50 -43
- package/dist/unstable/useMentionAdapter.js.map +1 -1
- package/dist/unstable/useModelContextSnapshot.d.ts +34 -0
- package/dist/unstable/useModelContextSnapshot.d.ts.map +1 -0
- package/dist/unstable/useModelContextSnapshot.js +61 -0
- package/dist/unstable/useModelContextSnapshot.js.map +1 -0
- package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
- package/dist/unstable/useSlashCommandAdapter.js +37 -29
- package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
- package/dist/unstable/webmcp/WebMcpRegistrationResource.d.ts +14 -0
- package/dist/unstable/webmcp/WebMcpRegistrationResource.d.ts.map +1 -0
- package/dist/unstable/webmcp/WebMcpRegistrationResource.js +85 -0
- package/dist/unstable/webmcp/WebMcpRegistrationResource.js.map +1 -0
- package/dist/unstable/webmcp/convertTools.d.ts +21 -0
- package/dist/unstable/webmcp/convertTools.d.ts.map +1 -0
- package/dist/unstable/webmcp/convertTools.js +110 -0
- package/dist/unstable/webmcp/convertTools.js.map +1 -0
- package/dist/unstable/webmcp/useWebMcpProvider.d.ts +21 -0
- package/dist/unstable/webmcp/useWebMcpProvider.d.ts.map +1 -0
- package/dist/unstable/webmcp/useWebMcpProvider.js +105 -0
- package/dist/unstable/webmcp/useWebMcpProvider.js.map +1 -0
- package/dist/unstable/webmcp/webmcp-host.d.ts +39 -0
- package/dist/unstable/webmcp/webmcp-host.d.ts.map +1 -0
- package/dist/unstable/webmcp/webmcp-host.js +29 -0
- package/dist/unstable/webmcp/webmcp-host.js.map +1 -0
- package/dist/utils/Primitive.d.ts +6 -6
- package/dist/utils/Primitive.js +2 -2
- package/dist/utils/Primitive.js.map +1 -1
- package/dist/utils/createActionButton.js +3 -3
- package/dist/utils/createActionButton.js.map +1 -1
- package/dist/utils/hooks/useOnResizeContent.js +1 -1
- package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
- package/dist/utils/hooks/useOnScrollToBottom.js +1 -1
- package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
- package/dist/utils/smooth/SmoothContext.d.ts +24 -0
- package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
- package/dist/utils/smooth/useSmooth.js +1 -1
- package/dist/utils/smooth/useSmooth.js.map +1 -1
- package/package.json +14 -22
- package/src/index.ts +22 -1
- package/src/mcp-apps/McpAppRenderer.test.tsx +386 -9
- package/src/mcp-apps/McpAppRenderer.tsx +171 -69
- package/src/mcp-apps/McpAppsRemoteHost.concurrent.test.tsx +215 -0
- package/src/mcp-apps/McpAppsRemoteHost.ts +28 -12
- package/src/mcp-apps/app-frame.test.tsx +349 -0
- package/src/mcp-apps/app-frame.tsx +68 -9
- package/src/mcp-apps/bridge.ts +7 -2
- package/src/mcp-apps/index.ts +6 -1
- package/src/model-context/frame/AssistantFrame.test.ts +3 -3
- package/src/model-context/frame/SPEC_AssistantFrame.md +1 -1
- package/src/model-context/frame/useAssistantFrameHost.ts +2 -2
- package/src/model-context/makeAssistantVisible.tsx +1 -1
- package/src/primitives/actionBar/ActionBarCopy.tsx +1 -1
- package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +1 -1
- package/src/primitives/actionBar/ActionBarFeedbackNegative.tsx +1 -1
- package/src/primitives/actionBar/ActionBarFeedbackPositive.tsx +1 -1
- package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +1 -1
- package/src/primitives/actionBarMore/scope.ts +2 -2
- package/src/primitives/assistantModal/AssistantModalContent.tsx +1 -1
- package/src/primitives/assistantModal/scope.ts +2 -2
- package/src/primitives/composer/ComposerAttachmentDropzone.tsx +1 -1
- package/src/primitives/composer/ComposerInput.test.tsx +2 -1
- package/src/primitives/composer/ComposerInput.tsx +3 -3
- package/src/primitives/composer/ComposerInputPluginContext.tsx +0 -10
- package/src/primitives/composer/ComposerQuote.tsx +1 -1
- package/src/primitives/composer/ComposerRoot.tsx +1 -1
- package/src/primitives/composer/trigger/TriggerPopover.tsx +16 -1
- package/src/primitives/composer/trigger/TriggerPopoverAction.tsx +4 -2
- package/src/primitives/composer/trigger/TriggerPopoverBack.tsx +1 -1
- package/src/primitives/composer/trigger/TriggerPopoverBehavior.test.tsx +109 -0
- package/src/primitives/composer/trigger/TriggerPopoverCategories.tsx +1 -1
- package/src/primitives/composer/trigger/TriggerPopoverDirective.tsx +4 -2
- package/src/primitives/composer/trigger/TriggerPopoverItems.tsx +1 -1
- package/src/primitives/composer/trigger/TriggerPopoverResource.ts +4 -1
- package/src/primitives/composer/trigger/TriggerPopoverRootContext.tsx +2 -0
- package/src/primitives/composer/trigger/detectTrigger.test.ts +88 -5
- package/src/primitives/composer/trigger/detectTrigger.ts +50 -9
- package/src/primitives/composer/trigger/index.ts +1 -0
- package/src/primitives/composer/trigger/matchesTriggerItemQuery.test.ts +52 -0
- package/src/primitives/composer/trigger/matchesTriggerItemQuery.ts +13 -0
- package/src/primitives/composer/trigger/triggerDetectionResource.ts +10 -7
- package/src/primitives/composer/trigger/triggerNavigationResource.ts +3 -10
- package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +15 -3
- package/src/primitives/composer/trigger/triggerSelectionResource.ts +1 -4
- package/src/primitives/composer.ts +1 -0
- package/src/primitives/message/MessageRoot.tsx +1 -1
- package/src/primitives/selectionToolbar/SelectionToolbarQuote.tsx +1 -1
- package/src/primitives/selectionToolbar/SelectionToolbarRoot.tsx +1 -1
- package/src/primitives/thread/ThreadViewport.tsx +1 -1
- package/src/primitives/thread/ThreadViewportFooter.tsx +1 -1
- package/src/primitives/thread/useThreadViewportAutoScroll.ts +8 -7
- package/src/primitives/threadList/ThreadListNew.tsx +1 -1
- package/src/primitives/threadListFocusGroup.ts +2 -2
- package/src/primitives/threadListItem/ThreadListItemRoot.tsx +1 -1
- package/src/primitives/threadListItem/ThreadListItemTrigger.tsx +1 -1
- package/src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx +1 -1
- package/src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx +1 -1
- package/src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx +2 -2
- package/src/primitives/threadListItemMore/scope.ts +2 -2
- package/src/sandbox-host/SandboxHost.test.tsx +165 -3
- package/src/sandbox-host/SandboxHost.tsx +42 -9
- package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +31 -1
- package/src/unstable/useComposerInputHistory.test.tsx +2 -1
- package/src/unstable/useLiveCompletionAdapter.test.tsx +60 -1
- package/src/unstable/useLiveCompletionAdapter.ts +4 -1
- package/src/unstable/useMentionAdapter.test.tsx +337 -0
- package/src/unstable/useMentionAdapter.ts +94 -57
- package/src/unstable/useModelContextSnapshot.test.tsx +132 -0
- package/src/unstable/useModelContextSnapshot.ts +67 -0
- package/src/unstable/useSlashCommandAdapter.test.tsx +141 -0
- package/src/unstable/useSlashCommandAdapter.ts +47 -19
- package/src/unstable/webmcp/WebMcpRegistrationResource.ts +92 -0
- package/src/unstable/webmcp/__tests__/webmcp.fake.tsx +168 -0
- package/src/unstable/webmcp/convertTools.test.ts +393 -0
- package/src/unstable/webmcp/convertTools.ts +180 -0
- package/src/unstable/webmcp/useWebMcpProvider.test.tsx +466 -0
- package/src/unstable/webmcp/useWebMcpProvider.ts +150 -0
- package/src/unstable/webmcp/webmcp-host.test.ts +142 -0
- package/src/unstable/webmcp/webmcp-host.ts +83 -0
- package/src/utils/Primitive.tsx +2 -2
- package/src/utils/createActionButton.tsx +1 -1
- package/src/utils/hooks/useOnResizeContent.ts +1 -1
- package/src/utils/hooks/useOnScrollToBottom.ts +1 -1
- package/src/utils/smooth/useSmooth.ts +1 -1
- package/dist/legacy-runtime/runtime/MessagePartRuntime.d.ts +0 -3
- package/dist/legacy-runtime/runtime/MessagePartRuntime.js +0 -2
- package/dist/legacy-runtime/runtime/MessageRuntime.d.ts +0 -3
- package/dist/legacy-runtime/runtime/MessageRuntime.js +0 -2
- package/dist/legacy-runtime/runtime/ThreadListRuntime.d.ts +0 -3
- package/dist/legacy-runtime/runtime/ThreadListRuntime.js +0 -2
- package/dist/utils/invokeCallbackSafely.d.ts +0 -5
- package/dist/utils/invokeCallbackSafely.d.ts.map +0 -1
- package/dist/utils/invokeCallbackSafely.js +0 -15
- package/dist/utils/invokeCallbackSafely.js.map +0 -1
- package/dist/utils/useToolArgsFieldStatus.d.ts +0 -15
- package/dist/utils/useToolArgsFieldStatus.d.ts.map +0 -1
- package/dist/utils/useToolArgsFieldStatus.js +0 -23
- package/dist/utils/useToolArgsFieldStatus.js.map +0 -1
- package/src/legacy-runtime/runtime/MessagePartRuntime.ts +0 -2
- package/src/legacy-runtime/runtime/MessageRuntime.ts +0 -3
- package/src/legacy-runtime/runtime/ThreadListRuntime.ts +0 -4
- package/src/utils/invokeCallbackSafely.ts +0 -11
- package/src/utils/useToolArgsFieldStatus.ts +0 -18
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState, useSyncExternalStore } from "react";
|
|
4
|
+
import { useResources, useTapRoot, withKey } from "@assistant-ui/tap";
|
|
5
|
+
import { useAui, type AssistantClient } from "@assistant-ui/store";
|
|
6
|
+
import type { Tool } from "assistant-stream";
|
|
7
|
+
import { getDefaultWebMcpHost, type WebMcpHost } from "./webmcp-host";
|
|
8
|
+
import { defaultWebMcpFilter, toWebMcpInputSchema } from "./convertTools";
|
|
9
|
+
import { WebMcpRegistrationResource } from "./WebMcpRegistrationResource";
|
|
10
|
+
import {
|
|
11
|
+
useModelContextSnapshot,
|
|
12
|
+
type ModelContextSnapshotSource,
|
|
13
|
+
} from "../useModelContextSnapshot";
|
|
14
|
+
|
|
15
|
+
export type Unstable_WebMcpProviderOptions = {
|
|
16
|
+
filter?: (name: string, tool: Tool<any, any>) => boolean;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type Unstable_WebMcpProviderResult = {
|
|
20
|
+
status: "unsupported" | "active";
|
|
21
|
+
registeredToolNames: readonly string[];
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const EMPTY_NAMES: readonly string[] = Object.freeze([]);
|
|
25
|
+
const EMPTY_TOOLS: Record<string, Tool<any, any>> = Object.freeze({});
|
|
26
|
+
|
|
27
|
+
// The description is re-read on every sync so mutating it in place is
|
|
28
|
+
// observed; the schema is converted only when the tool object itself changes.
|
|
29
|
+
// Keyed on the tool so a schema or filter that throws warns once instead of
|
|
30
|
+
// on every model-context notify.
|
|
31
|
+
const warned = new WeakSet<Tool<any, any>>();
|
|
32
|
+
|
|
33
|
+
const signatures = new WeakMap<
|
|
34
|
+
Tool<any, any>,
|
|
35
|
+
{ description: string | undefined; signature: string }
|
|
36
|
+
>();
|
|
37
|
+
|
|
38
|
+
const signatureOf = (tool: Tool<any, any>) => {
|
|
39
|
+
const cached = signatures.get(tool);
|
|
40
|
+
if (cached && cached.description === tool.description)
|
|
41
|
+
return cached.signature;
|
|
42
|
+
const signature = `${tool.description ?? ""}\u0000${JSON.stringify(
|
|
43
|
+
toWebMcpInputSchema(tool),
|
|
44
|
+
)}`;
|
|
45
|
+
signatures.set(tool, { description: tool.description, signature });
|
|
46
|
+
return signature;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const NO_SUBSCRIPTION = () => {};
|
|
50
|
+
|
|
51
|
+
// No `isEqual`: a caller republishing an unchanged tool set is how it asks for
|
|
52
|
+
// a re-sync, which is what re-attempts a tool whose filter has stopped throwing
|
|
53
|
+
// and what picks up a description edited in place on a stable tool object.
|
|
54
|
+
const modelContextToolSource: ModelContextSnapshotSource<
|
|
55
|
+
Record<string, Tool<any, any>>
|
|
56
|
+
> = {
|
|
57
|
+
empty: EMPTY_TOOLS,
|
|
58
|
+
read: (aui) => aui.modelContext.getModelContext().tools ?? EMPTY_TOOLS,
|
|
59
|
+
subscribe: (aui, onChange) =>
|
|
60
|
+
aui.modelContext.subscribe?.(onChange) ?? NO_SUBSCRIPTION,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const useStableNames = (names: readonly (string | null)[]) => {
|
|
64
|
+
const [cell] = useState(() => ({ names: EMPTY_NAMES }));
|
|
65
|
+
const next = names.filter((name): name is string => name !== null).sort();
|
|
66
|
+
const previous = cell.names;
|
|
67
|
+
if (
|
|
68
|
+
previous.length === next.length &&
|
|
69
|
+
previous.every((name, index) => name === next[index])
|
|
70
|
+
) {
|
|
71
|
+
return previous;
|
|
72
|
+
}
|
|
73
|
+
cell.names = next;
|
|
74
|
+
return next;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const useWebMcpRegistry = ({
|
|
78
|
+
aui,
|
|
79
|
+
host,
|
|
80
|
+
filter,
|
|
81
|
+
}: {
|
|
82
|
+
aui: AssistantClient;
|
|
83
|
+
host: WebMcpHost;
|
|
84
|
+
filter: (name: string, tool: Tool<any, any>) => boolean;
|
|
85
|
+
}) => {
|
|
86
|
+
const tools = useModelContextSnapshot(
|
|
87
|
+
aui,
|
|
88
|
+
host.available,
|
|
89
|
+
modelContextToolSource,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const elements = [];
|
|
93
|
+
for (const [name, tool] of Object.entries(tools)) {
|
|
94
|
+
try {
|
|
95
|
+
if (!filter(name, tool)) continue;
|
|
96
|
+
const signature = signatureOf(tool);
|
|
97
|
+
elements.push(
|
|
98
|
+
withKey(
|
|
99
|
+
name,
|
|
100
|
+
WebMcpRegistrationResource({ host, name, signature, tool }),
|
|
101
|
+
[host, name, signature, tool],
|
|
102
|
+
),
|
|
103
|
+
);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
if (warned.has(tool)) continue;
|
|
106
|
+
warned.add(tool);
|
|
107
|
+
console.warn(
|
|
108
|
+
`[assistant-ui] Skipping WebMCP registration for tool "${name}": filter or schema conversion failed.`,
|
|
109
|
+
error,
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return useStableNames(useResources(elements));
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Publishes the frontend tools in the model context to a WebMCP-capable
|
|
119
|
+
* browser, so the user's own browser agent can call them.
|
|
120
|
+
*
|
|
121
|
+
* Returns `status: "unsupported"` when the page exposes no
|
|
122
|
+
* `document.modelContext` (or `navigator.modelContext`), and the sorted names
|
|
123
|
+
* of the tools currently registered with the host.
|
|
124
|
+
*/
|
|
125
|
+
export const unstable_useWebMcpProvider = (
|
|
126
|
+
options: Unstable_WebMcpProviderOptions = {},
|
|
127
|
+
): Unstable_WebMcpProviderResult => {
|
|
128
|
+
const aui = useAui();
|
|
129
|
+
const [host] = useState(getDefaultWebMcpHost);
|
|
130
|
+
const filter = options.filter ?? defaultWebMcpFilter;
|
|
131
|
+
|
|
132
|
+
const root = useTapRoot(function WebMcpProviderRoot() {
|
|
133
|
+
return useWebMcpRegistry({ aui, host, filter });
|
|
134
|
+
});
|
|
135
|
+
const registeredToolNames = useSyncExternalStore(
|
|
136
|
+
root.subscribe,
|
|
137
|
+
root.getValue,
|
|
138
|
+
() => EMPTY_NAMES,
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const [published, setPublished] = useState(false);
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
if (host.available) setPublished(true);
|
|
144
|
+
}, [host]);
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
status: published ? "active" : "unsupported",
|
|
148
|
+
registeredToolNames,
|
|
149
|
+
};
|
|
150
|
+
};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import {
|
|
4
|
+
getDefaultWebMcpHost,
|
|
5
|
+
type WebMcpModelContext,
|
|
6
|
+
type WebMcpToolDescriptor,
|
|
7
|
+
} from "./webmcp-host";
|
|
8
|
+
|
|
9
|
+
type Host = { modelContext?: WebMcpModelContext };
|
|
10
|
+
|
|
11
|
+
const descriptor: WebMcpToolDescriptor = {
|
|
12
|
+
name: "get_weather",
|
|
13
|
+
description: "",
|
|
14
|
+
inputSchema: {},
|
|
15
|
+
execute: async () => ({ content: [] }),
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const install = (
|
|
19
|
+
context: Partial<WebMcpModelContext>,
|
|
20
|
+
on: "document" | "navigator" = "document",
|
|
21
|
+
) => {
|
|
22
|
+
const host = (on === "document" ? document : navigator) as Host;
|
|
23
|
+
host.modelContext = context as WebMcpModelContext;
|
|
24
|
+
return context;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
delete (document as Host).modelContext;
|
|
29
|
+
delete (navigator as Host).modelContext;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("getDefaultWebMcpHost", () => {
|
|
33
|
+
it("reports unavailable when the page exposes no model context", () => {
|
|
34
|
+
const host = getDefaultWebMcpHost();
|
|
35
|
+
expect(host.available).toBe(false);
|
|
36
|
+
expect(() => host.registerTool(descriptor)()).not.toThrow();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("reports unavailable and warns when the platform property has no registerTool", () => {
|
|
40
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
41
|
+
try {
|
|
42
|
+
install({} as Partial<WebMcpModelContext>);
|
|
43
|
+
const host = getDefaultWebMcpHost();
|
|
44
|
+
expect(host.available).toBe(false);
|
|
45
|
+
expect(() => host.registerTool(descriptor)()).not.toThrow();
|
|
46
|
+
expect(warn).toHaveBeenCalledWith(
|
|
47
|
+
expect.stringContaining("no callable registerTool"),
|
|
48
|
+
);
|
|
49
|
+
} finally {
|
|
50
|
+
warn.mockRestore();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("falls back to navigator.modelContext, preferring document when both exist", () => {
|
|
55
|
+
const fromNavigator = vi.fn();
|
|
56
|
+
install({ registerTool: fromNavigator }, "navigator");
|
|
57
|
+
expect(getDefaultWebMcpHost().available).toBe(true);
|
|
58
|
+
getDefaultWebMcpHost().registerTool(descriptor);
|
|
59
|
+
expect(fromNavigator).toHaveBeenCalledOnce();
|
|
60
|
+
|
|
61
|
+
const fromDocument = vi.fn();
|
|
62
|
+
install({ registerTool: fromDocument });
|
|
63
|
+
getDefaultWebMcpHost().registerTool(descriptor);
|
|
64
|
+
expect(fromDocument).toHaveBeenCalledOnce();
|
|
65
|
+
expect(fromNavigator).toHaveBeenCalledOnce();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("registers with an abort signal and aborts it on dispose", () => {
|
|
69
|
+
const registerTool = vi.fn();
|
|
70
|
+
install({ registerTool });
|
|
71
|
+
|
|
72
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor);
|
|
73
|
+
const options = registerTool.mock.calls[0]![1];
|
|
74
|
+
expect(registerTool).toHaveBeenCalledWith(descriptor, expect.anything());
|
|
75
|
+
expect(options.signal.aborted).toBe(false);
|
|
76
|
+
|
|
77
|
+
dispose();
|
|
78
|
+
expect(options.signal.aborted).toBe(true);
|
|
79
|
+
expect(() => dispose()).not.toThrow();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("reports a rejected registration to the caller", async () => {
|
|
83
|
+
install({
|
|
84
|
+
registerTool: () => Promise.reject(new Error("already registered")),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const onError = vi.fn();
|
|
88
|
+
getDefaultWebMcpHost().registerTool(descriptor, onError);
|
|
89
|
+
await vi.waitFor(() => expect(onError).toHaveBeenCalledOnce());
|
|
90
|
+
expect(onError.mock.calls[0]![0]).toBeInstanceOf(Error);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("aborts the signal even when the registration was rejected", async () => {
|
|
94
|
+
let options: { signal?: AbortSignal } | undefined;
|
|
95
|
+
install({
|
|
96
|
+
registerTool: (_def, registerOptions) => {
|
|
97
|
+
options = registerOptions;
|
|
98
|
+
return Promise.reject(new Error("already registered"));
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const onError = vi.fn();
|
|
103
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor, onError);
|
|
104
|
+
await vi.waitFor(() => expect(onError).toHaveBeenCalledOnce());
|
|
105
|
+
|
|
106
|
+
dispose();
|
|
107
|
+
expect(options?.signal?.aborted).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("lets a synchronous registration failure propagate", () => {
|
|
111
|
+
install({
|
|
112
|
+
registerTool: () => {
|
|
113
|
+
throw new Error("already registered");
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
expect(() => getDefaultWebMcpHost().registerTool(descriptor)).toThrow(
|
|
118
|
+
"already registered",
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("survives a registration that returns a bare thenable", () => {
|
|
123
|
+
install({
|
|
124
|
+
registerTool: () =>
|
|
125
|
+
({
|
|
126
|
+
then: (resolve: () => void) => resolve(),
|
|
127
|
+
}) as unknown as Promise<void>,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor);
|
|
131
|
+
expect(() => dispose()).not.toThrow();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("survives a registration that returns nothing", () => {
|
|
135
|
+
const registerTool = vi.fn();
|
|
136
|
+
install({ registerTool });
|
|
137
|
+
|
|
138
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor);
|
|
139
|
+
dispose();
|
|
140
|
+
expect(registerTool.mock.calls[0]![1].signal.aborted).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export type WebMcpContent =
|
|
2
|
+
| { type: "text"; text: string }
|
|
3
|
+
| { type: "image"; data: string; mimeType: string };
|
|
4
|
+
|
|
5
|
+
export type WebMcpCallToolResult = {
|
|
6
|
+
content: WebMcpContent[];
|
|
7
|
+
isError?: boolean;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type WebMcpToolDescriptor = {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
inputSchema: unknown;
|
|
14
|
+
execute: (
|
|
15
|
+
args: unknown,
|
|
16
|
+
context?: { signal?: AbortSignal },
|
|
17
|
+
) => Promise<WebMcpCallToolResult>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type WebMcpModelContext = {
|
|
21
|
+
/**
|
|
22
|
+
* Aborting `options.signal` is what unregisters the tool. The explainer
|
|
23
|
+
* defines no other removal method, and a name-keyed one could not be used
|
|
24
|
+
* safely: a later registration may already hold the name.
|
|
25
|
+
*/
|
|
26
|
+
registerTool(
|
|
27
|
+
tool: WebMcpToolDescriptor,
|
|
28
|
+
options?: { signal?: AbortSignal },
|
|
29
|
+
): Promise<void> | void;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type WebMcpHost = {
|
|
33
|
+
available: boolean;
|
|
34
|
+
registerTool(
|
|
35
|
+
def: WebMcpToolDescriptor,
|
|
36
|
+
onError?: (error: unknown) => void,
|
|
37
|
+
): () => void;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
type ModelContextHost = { modelContext?: WebMcpModelContext } | undefined;
|
|
41
|
+
|
|
42
|
+
const isThenable = (value: unknown): value is Promise<unknown> =>
|
|
43
|
+
typeof (value as { then?: unknown } | null | undefined)?.then === "function";
|
|
44
|
+
|
|
45
|
+
// The explainer puts modelContext on document; navigator is tolerated for
|
|
46
|
+
// older drafts and extensions that still inject it there.
|
|
47
|
+
const resolveModelContext = (): WebMcpModelContext | undefined => {
|
|
48
|
+
const context =
|
|
49
|
+
(globalThis.document as ModelContextHost)?.modelContext ??
|
|
50
|
+
(globalThis.navigator as ModelContextHost)?.modelContext;
|
|
51
|
+
if (!context) return undefined;
|
|
52
|
+
if (typeof context.registerTool === "function") return context;
|
|
53
|
+
console.warn(
|
|
54
|
+
"[assistant-ui] Ignoring a modelContext with no callable registerTool; WebMCP reports unsupported.",
|
|
55
|
+
);
|
|
56
|
+
return undefined;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const createHost = (context: WebMcpModelContext): WebMcpHost => ({
|
|
60
|
+
available: true,
|
|
61
|
+
registerTool: (def, onError) => {
|
|
62
|
+
const controller = new AbortController();
|
|
63
|
+
const handle = context.registerTool(def, { signal: controller.signal });
|
|
64
|
+
if (isThenable(handle)) {
|
|
65
|
+
handle.then(
|
|
66
|
+
() => {},
|
|
67
|
+
(error) => onError?.(error),
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return () => controller.abort();
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export const getDefaultWebMcpHost = (): WebMcpHost => {
|
|
75
|
+
const context = resolveModelContext();
|
|
76
|
+
if (!context) {
|
|
77
|
+
return {
|
|
78
|
+
available: false,
|
|
79
|
+
registerTool: () => () => {},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return createHost(context);
|
|
83
|
+
};
|
package/src/utils/Primitive.tsx
CHANGED
|
@@ -11,10 +11,10 @@ import {
|
|
|
11
11
|
forwardRef,
|
|
12
12
|
isValidElement,
|
|
13
13
|
} from "react";
|
|
14
|
-
import { Primitive as RadixPrimitive } from "
|
|
14
|
+
import { Primitive as RadixPrimitive } from "radix-ui/internal";
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
* Thin wrapper around
|
|
17
|
+
* Thin wrapper around Radix `Primitive` that adds `render` prop support.
|
|
18
18
|
*
|
|
19
19
|
* When `render` is provided, it is converted to the equivalent `asChild` pattern:
|
|
20
20
|
* render={<Comp props />} + children → asChild + <Comp props>{children}</Comp>
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
type MouseEventHandler,
|
|
6
6
|
} from "react";
|
|
7
7
|
import { Primitive } from "./Primitive";
|
|
8
|
-
import { composeEventHandlers } from "
|
|
8
|
+
import { composeEventHandlers } from "radix-ui/internal";
|
|
9
9
|
|
|
10
10
|
type ActionButtonCallback<TProps> = (
|
|
11
11
|
props: TProps,
|
|
@@ -8,7 +8,7 @@ import type {
|
|
|
8
8
|
TextMessagePart,
|
|
9
9
|
MessagePartState,
|
|
10
10
|
} from "@assistant-ui/core";
|
|
11
|
-
import { useCallbackRef } from "
|
|
11
|
+
import { useCallbackRef } from "radix-ui/internal";
|
|
12
12
|
import { useMediaQuery } from "../hooks/useMediaQuery";
|
|
13
13
|
import { useSmoothStatusStore } from "./SmoothContext";
|
|
14
14
|
import { writableStore } from "../../context/ReadonlyStore";
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { ThreadListRuntime, ThreadListState } from "@assistant-ui/core";
|
|
2
|
-
import { ThreadListRuntimeCoreBinding, ThreadListRuntimeImpl } from "@assistant-ui/core/internal";
|
|
3
|
-
export { type ThreadListRuntime, type ThreadListRuntimeCoreBinding, ThreadListRuntimeImpl, type ThreadListState };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invokeCallbackSafely.d.ts","names":[],"sources":["../../src/utils/invokeCallbackSafely.ts"],"mappings":";cAAa,uBAAwB,uBAAuB"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/utils/invokeCallbackSafely.ts
|
|
2
|
-
const invokeCallbackSafely = (invoke, name) => {
|
|
3
|
-
const reportFailure = (error) => {
|
|
4
|
-
console.error(`[assistant-ui] ${name} callback threw an error`, error);
|
|
5
|
-
};
|
|
6
|
-
try {
|
|
7
|
-
Promise.resolve(invoke()).catch(reportFailure);
|
|
8
|
-
} catch (error) {
|
|
9
|
-
reportFailure(error);
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
//#endregion
|
|
13
|
-
export { invokeCallbackSafely };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=invokeCallbackSafely.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invokeCallbackSafely.js","names":["invokeCallbackSafely","invoke","name","reportFailure","error","console","Promise","resolve","catch"],"sources":["../../src/utils/invokeCallbackSafely.ts"],"sourcesContent":["export const invokeCallbackSafely = (invoke: () => unknown, name: string) => {\n const reportFailure = (error: unknown) => {\n console.error(`[assistant-ui] ${name} callback threw an error`, error);\n };\n\n try {\n void Promise.resolve(invoke()).catch(reportFailure);\n } catch (error) {\n reportFailure(error);\n }\n};\n"],"mappings":";AAAA,MAAaA,wBAAwBC,QAAuBC,SAAiB;CAC3E,MAAMC,iBAAiBC,UAAmB;EACxCC,QAAQD,MAAM,kBAAkBF,KAAI,2BAA4BE,KAAK;CACvE;CAEA,IAAI;EACF,QAAaG,QAAQN,OAAO,CAAC,CAAC,CAACO,MAAML,aAAa;CACpD,SAASC,OAAO;EACdD,cAAcC,KAAK;CACrB;AACF"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/utils/useToolArgsFieldStatus.d.ts
|
|
2
|
-
declare const useToolArgsFieldStatus: (fieldPath: (string | number)[]) => {
|
|
3
|
-
readonly type: "running";
|
|
4
|
-
} | {
|
|
5
|
-
readonly type: "complete";
|
|
6
|
-
} | {
|
|
7
|
-
readonly type: "incomplete";
|
|
8
|
-
readonly reason: "cancelled" | "length" | "content-filter" | "other" | "error";
|
|
9
|
-
readonly error?: unknown;
|
|
10
|
-
} | {
|
|
11
|
-
type: string;
|
|
12
|
-
};
|
|
13
|
-
//#endregion
|
|
14
|
-
export { useToolArgsFieldStatus };
|
|
15
|
-
//# sourceMappingURL=useToolArgsFieldStatus.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useToolArgsFieldStatus.d.ts","names":[],"sources":["../../src/utils/useToolArgsFieldStatus.ts"],"mappings":";cAKa,yBAA0B"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
2
|
-
import { useAuiState } from "@assistant-ui/store";
|
|
3
|
-
import { getPartialJsonObjectFieldState } from "assistant-stream/utils";
|
|
4
|
-
//#region src/utils/useToolArgsFieldStatus.ts
|
|
5
|
-
const COMPLETE_STATUS = { type: "complete" };
|
|
6
|
-
const useToolArgsFieldStatus = (fieldPath) => {
|
|
7
|
-
const $ = c(2);
|
|
8
|
-
let t0;
|
|
9
|
-
if ($[0] !== fieldPath) {
|
|
10
|
-
t0 = (s) => {
|
|
11
|
-
if (s.part.type !== "tool-call") throw new Error("useToolArgsFieldStatus can only be used inside tool-call message parts");
|
|
12
|
-
if (getPartialJsonObjectFieldState(s.part.args, fieldPath) === "complete" || s.part.status?.type === "requires-action") return COMPLETE_STATUS;
|
|
13
|
-
return s.part.status;
|
|
14
|
-
};
|
|
15
|
-
$[0] = fieldPath;
|
|
16
|
-
$[1] = t0;
|
|
17
|
-
} else t0 = $[1];
|
|
18
|
-
return useAuiState(t0);
|
|
19
|
-
};
|
|
20
|
-
//#endregion
|
|
21
|
-
export { useToolArgsFieldStatus };
|
|
22
|
-
|
|
23
|
-
//# sourceMappingURL=useToolArgsFieldStatus.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useToolArgsFieldStatus.js","names":["getPartialJsonObjectFieldState","useAuiState","COMPLETE_STATUS","type","useToolArgsFieldStatus","fieldPath","$","_c","t0","s","part","Error","state","args","status"],"sources":["../../src/utils/useToolArgsFieldStatus.ts"],"sourcesContent":["import { getPartialJsonObjectFieldState } from \"assistant-stream/utils\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst COMPLETE_STATUS = { type: \"complete\" };\n\nexport const useToolArgsFieldStatus = (fieldPath: (string | number)[]) => {\n return useAuiState((s) => {\n if (s.part.type !== \"tool-call\")\n throw new Error(\n \"useToolArgsFieldStatus can only be used inside tool-call message parts\",\n );\n\n const state = getPartialJsonObjectFieldState(s.part.args, fieldPath);\n if (state === \"complete\" || s.part.status?.type === \"requires-action\")\n return COMPLETE_STATUS;\n return s.part.status;\n });\n};\n"],"mappings":";;;;AAGA,MAAME,kBAAkB,EAAEC,MAAM,WAAW;AAE3C,MAAaC,0BAAyBC,cAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,WAAA;EACjBG,MAAAC,MAAA;GACjB,IAAIA,EAACC,KAAKP,SAAU,aAClB,MAAM,IAAIQ,MACR,wEACF;GAGF,IADcX,+BAA+BS,EAACC,KAAKG,MAAOR,SACtDO,MAAU,cAAcH,EAACC,KAAKI,QAAaX,SAAK,mBAAiB,OAC5DD;GAAgB,OAClBO,EAACC,KAAKI;EAAO;EACrBR,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OAVML,YAAYO,EAUlB;AAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export const invokeCallbackSafely = (invoke: () => unknown, name: string) => {
|
|
2
|
-
const reportFailure = (error: unknown) => {
|
|
3
|
-
console.error(`[assistant-ui] ${name} callback threw an error`, error);
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
try {
|
|
7
|
-
void Promise.resolve(invoke()).catch(reportFailure);
|
|
8
|
-
} catch (error) {
|
|
9
|
-
reportFailure(error);
|
|
10
|
-
}
|
|
11
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { getPartialJsonObjectFieldState } from "assistant-stream/utils";
|
|
2
|
-
import { useAuiState } from "@assistant-ui/store";
|
|
3
|
-
|
|
4
|
-
const COMPLETE_STATUS = { type: "complete" };
|
|
5
|
-
|
|
6
|
-
export const useToolArgsFieldStatus = (fieldPath: (string | number)[]) => {
|
|
7
|
-
return useAuiState((s) => {
|
|
8
|
-
if (s.part.type !== "tool-call")
|
|
9
|
-
throw new Error(
|
|
10
|
-
"useToolArgsFieldStatus can only be used inside tool-call message parts",
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
const state = getPartialJsonObjectFieldState(s.part.args, fieldPath);
|
|
14
|
-
if (state === "complete" || s.part.status?.type === "requires-action")
|
|
15
|
-
return COMPLETE_STATUS;
|
|
16
|
-
return s.part.status;
|
|
17
|
-
});
|
|
18
|
-
};
|